templates/parcels/transactions.html.twig line 1

Open in your IDE?
  1. {% extends 'base.html.twig' %}
  2. {% block stylesheets %}
  3. {{ parent() }}
  4. <style>
  5. fieldset {
  6. border: 1px dashed black;
  7. width: 100%;
  8. }
  9. .datagrid-ftable .datagrid-cell {
  10. font-size: 18px;
  11. font-family: "monospace", sans-serif;
  12. }
  13. .datagrid-ftable .datagrid-row {
  14. background: #cccccc;
  15. }
  16. .search-row {
  17. margin-top: 20px;
  18. margin-bottom: 10px;
  19. }
  20. .dates {
  21. border: 1px solid #e4e0bf;
  22. padding: 10px 10px 10px 0px;
  23. margin: 1px 1px 1px 1px;
  24. }
  25. </style>
  26. {% endblock %}
  27. {% block parcelsLink %}
  28. <li class="nav-item dropdown">
  29. <a class="nav-link dropdown-toggle active" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  30. <i class="fas fa-gift"></i> Parcels
  31. </a>
  32. <div class="dropdown-menu" aria-labelledby="navbarDropdown">
  33. <a class="dropdown-item" href="{{ path('bos_all_parcels') }}"><i class="fas fa-plus-circle"></i> All Parcels</a>
  34. <div class="dropdown-divider"></div>
  35. <a class="dropdown-item" href="#"> <i class="fas fa-money-bill"></i> Transactions</a>
  36. <a class="dropdown-item" href="{{ path('daily_accounts') }}"><i class="fas fa-calendar"></i> Daily Accounts</a>
  37. </div>
  38. </li>
  39. {% endblock %}
  40. {% block main %}
  41. <div class="main-sub-nav col-lg-11 col-md-11 col-sm-12 col-xs-12 alert alert-light">
  42. <ul class="nav nav-tabs">
  43. <li class="nav-item">
  44. <a class="nav-link " href="{{ path('bos_all_parcels') }}"><i class="fas fa-gift"></i> <i class="fas fa-list"></i> Parcels</a>
  45. </li>
  46. <li class="nav-item">
  47. <a class="nav-link active" href=""><i class="fas fa-list"></i> <i class="fas fa-money-bill"></i> Transactions</a>
  48. </li>
  49. <li class="nav-item">
  50. <a class="nav-link" href="{{ path('daily_accounts') }}">Daily Accounts</a></li>
  51. <li class="nav-item">
  52. <a class="nav-link" href="{{ path('bos_all_cancelled_transactions') }}">Cancelled</a></li>
  53. </ul>
  54. <div class="main">
  55. <div class="search-row row">
  56. {#<div class="col-lg-1 col-md-1">
  57. <label for="date_search">Vehicle</label><br>
  58. <input type="text" class="" style="width:100px">
  59. </div>#}
  60. <div class="dates col-lg-4 col-md-4">
  61. <div class="row">
  62. <div class="col-lg-6 col-md-6" style="">
  63. <label for="date_search">From Date </label><br>
  64. <input id="from_date" class="easyui-datebox from_date" data-options="formatter:myformatter,parser:myparser" name="from_date" style="width:150px">
  65. </div>
  66. <div class="col-lg-6 col-md-6" style="">
  67. <label for="date_search">To Date </label><br>
  68. <input id="to_date" class="easyui-datebox form-control" data-options="formatter:myformatter,parser:myparser" name="to_date" style="width:150px">
  69. </div>
  70. </div>
  71. </div>
  72. <div class="col-lg-1 col-md-1" style="">
  73. <button onclick="search()" style="margin-top: 30px; font-family: 'Nova Flat', serif, FontAwesome" class="btn btn-success btn-sm"><i class="fa fa-search"></i> search </button>
  74. </div>
  75. <div class="col-lg-2 col-md-2" style="">
  76. <button onclick="getCSV()" style="margin-top: 30px; font-family: 'Nova Flat', serif, FontAwesome" class="btn btn-success btn-sm"><i class="fa fa-search"></i> export to excel </button>
  77. </div>
  78. </div>
  79. <div class="row">
  80. {#<div id="tb" style="padding:2px 5px;">
  81. <fieldset>
  82. Date From: <input class="easyui-datebox" style="width:110px">
  83. To: <input class="easyui-datebox" style="width:110px">
  84. <a href="#" class="easyui-linkbutton" iconCls="icon-search">Search</a>
  85. </fieldset>
  86. </div>#}
  87. <table id="transactions"
  88. class="table table-responsive"
  89. style="width:100%; height:auto; font-weight:normal; text-transform: uppercase;"
  90. toolbar="#tb"
  91. singleSelect=true
  92. rownumbers=true
  93. pageSize=30
  94. fitColumns=true>
  95. <thead>
  96. <tr>
  97. </tr>
  98. </thead>
  99. </table>
  100. </div>
  101. </div>
  102. </div>
  103. {% endblock %}
  104. {% block javascripts %}
  105. {{ parent() }}
  106. <script >
  107. function search(){
  108. $('#transactions').datagrid('load',{
  109. from_date: $('#from_date').val(),
  110. to_date: $('#to_date').val()
  111. });
  112. console.log($('#from_date').val());
  113. console.log($('#to_date').val());
  114. }
  115. function myformatter(date){
  116. var y = date.getFullYear();
  117. var m = date.getMonth()+1;
  118. var d = date.getDate();
  119. return y+'-'+(m<10?('0'+m):m)+'-'+(d<10?('0'+d):d);
  120. }
  121. function myparser(s){
  122. if (!s) return new Date();
  123. var ss = (s.split('-'));
  124. var y = parseInt(ss[0],10);
  125. var m = parseInt(ss[1],10);
  126. var d = parseInt(ss[2],10);
  127. if (!isNaN(y) && !isNaN(m) && !isNaN(d)){
  128. return new Date(y,m-1,d);
  129. } else {
  130. return new Date();
  131. }
  132. }
  133. function getCSV(){
  134. $(".se-pre-con").fadeIn("slow");
  135. /*var fromDate = $('#from_date').val();
  136. var toDate = $('#to_date').val();
  137. var data = JSON.stringify({
  138. "from": $('#from_date').val(),
  139. "to": $('#to_date').val()
  140. });*/
  141. var fromDate = $('#from_date').val();
  142. var toDate = $('#to_date').val();
  143. if(fromDate == null || toDate == null || fromDate === '' || toDate === '' ){
  144. fromDate = 0;
  145. toDate = 0;
  146. }
  147. let filters = $('#transactions').datagrid('options').filterRules;
  148. console.log(JSON.stringify(filters));
  149. $.ajax({
  150. type: 'POST',
  151. // contentType: 'application/json',
  152. contentType: 'application/x-www-form-urlencoded',
  153. data: {
  154. filterRules: JSON.stringify(filters)
  155. },
  156. url: 'transactions/transaction-list/excel/'+fromDate+'/'+toDate ,
  157. dataType: "text",
  158. cache: false,
  159. success: function(data, textStatus, jqXHR){
  160. var min=4;
  161. var max=5;
  162. var random = Math.floor(Math.random() * (+max - +min)) + +min;
  163. $(".se-pre-con").fadeOut("slow");
  164. var s = window.open('reports/'+data,'data:application/vnd.ms-excel; charset=utf-8,');
  165. // var s = window.open(data, 'text')
  166. },
  167. error: function(jqXHR, textStatus, errorThrown){
  168. $(".se-pre-con").fadeOut("slow");
  169. alert('updatePerson error: ' + errorThrown);
  170. },
  171. complete: function () {
  172. $(".se-pre-con").fadeOut("slow");
  173. }
  174. });
  175. }
  176. $('#transactions').datagrid({
  177. url:'transactions/transaction-list',
  178. method: 'post',
  179. pageSize:20,
  180. singleSelect: true,
  181. rownumbers:true,
  182. remoteFilter:true,
  183. pagination:true,
  184. fitColumns:true,
  185. collapsible:true,
  186. showFooter: true,
  187. loadMsg: 'Loading Transaction',
  188. view: detailview,
  189. detailFormatter: function(index, row) {
  190. return '<div class="ddv" style="padding: 5px 0"></div>';
  191. },
  192. onLoadSuccess: function(){
  193. console.log( $(this).datagrid('getData').total);
  194. $(this).datagrid('freezeRow',$(this).datagrid('getData').total);
  195. },
  196. rowStyler: function(index,row){
  197. if (row.is_cancelled === "1"){
  198. console.log(row.is_cancelled);
  199. return 'background-color:#ff7518;color:#fff;font-weight:bold;';
  200. }
  201. },
  202. /*filterStringify: function(data){
  203. $.map(data, function(item){
  204. if (item.field == 'd.accountDate'){
  205. item.value = "'"+item.value+"'";//$.fn.datebox.defaults.parser(item.value).getTime();
  206. }
  207. });
  208. return JSON.stringify(data);
  209. },*/
  210. onExpandRow: function (index, row) {
  211. var ddv = $(this).datagrid('getRowDetail', index).find('div.ddv');
  212. ddv.panel({
  213. height: 300,
  214. border: false,
  215. cache: false,
  216. href: 'transactions/details/' + row.id,
  217. onLoad: function () {
  218. $('#transactions').datagrid('fixDetailRowHeight', index);
  219. }
  220. })
  221. },
  222. columns: [[
  223. {field:'w.id',title:'WAYBILL',width:30,formatter:function(value,row,index){
  224. return row.waybill;
  225. }},
  226. {field:'d.account_date',title:'Date',width:40,formatter:function(value,row,index){
  227. // var date = new Date(row.account_date);
  228. return row.account_date;
  229. }},
  230. {field:'fs.id',title:'From',width:50,formatter:function(value,row,index){
  231. return row.from_station;
  232. }},
  233. {field:'ts.id',title:'To',width:50,formatter:function(value,row,index){
  234. return row.to_station;
  235. }},
  236. {field:'w.parcel_count',title:'Parcels',width:20,formatter:function(value,row,index){
  237. return row.percel_count;
  238. }},
  239. {field:'t.pin_number',title:'Buyer PIN',width:20,formatter:function(value,row,index){
  240. if(row.pin_number){
  241. return row.pin_number;
  242. }
  243. return 'NA';
  244. }},
  245. {field:'t.amount',title:'Amount',width:20,formatter:function(value,row,index){
  246. return row.amount.toLocaleString();
  247. }},
  248. {field:'t.expenses',title:'Expenses',width:20,formatter:function(value,row,index){
  249. return row.expenses.toLocaleString();
  250. }},
  251. {field:'t.tax_amount',title:'Tax',width:20,formatter:function(value,row,index){
  252. return row.tax_amount.toLocaleString();
  253. }},
  254. {field:'t.balance',title:'Balance',width:20,formatter:function(value,row,index){
  255. return row.balance.toLocaleString();
  256. }}
  257. ]]
  258. });
  259. $(function(){
  260. var transactionDataGrid = $('#transactions').datagrid();
  261. var isStationLoaded = 0;
  262. var isToStationLoaded = 0;
  263. transactionDataGrid.datagrid('enableFilter', [
  264. {
  265. field:'fs.id',
  266. type: 'combobox',
  267. options:{
  268. method: 'GET',
  269. mode:'remote',
  270. panelHeight: 'auto',
  271. valueField:'id',
  272. textField:'station_name',
  273. url:'/form/stations',
  274. onSelect:function(value){
  275. console.log(value.id);
  276. // alert(value.station_name);
  277. if (value.id === -1){
  278. transactionDataGrid.datagrid('removeFilterRule', 'w.fromStation');
  279. }else {
  280. transactionDataGrid.datagrid('addFilterRule', {
  281. field: 'w.from_station_id',
  282. op: 'equal',
  283. value: value.id
  284. });
  285. }
  286. transactionDataGrid.datagrid('doFilter');
  287. },
  288. onLoadSuccess: function(items){
  289. // if (items.length && isStationLoaded === 0){
  290. // isStationLoaded = 1;
  291. // var opts = $(this).combobox('options');
  292. // $(this).combobox('select', items[items.length-1][opts.valueField]);
  293. // }
  294. }
  295. }
  296. },
  297. {
  298. field:'ts.id',
  299. type: 'combobox',
  300. options:{
  301. method: 'GET',
  302. mode:'remote',
  303. panelHeight: 'auto',
  304. valueField:'id',
  305. textField:'station_name',
  306. url:'/form/stations',
  307. onSelect:function(value){
  308. console.log(value.id);
  309. if (value.id === -1){
  310. transactionDataGrid.datagrid('removeFilterRule', 'w.toStation');
  311. } else {
  312. transactionDataGrid.datagrid('addFilterRule', {
  313. field: 'w.to_station_id',
  314. op: 'equal',
  315. value: value.id
  316. });
  317. }
  318. transactionDataGrid.datagrid('doFilter');
  319. },
  320. onLoadSuccess: function(items){
  321. // if (items.length && isToStationLoaded === 0){
  322. // isToStationLoaded = 1;
  323. // var opts = $(this).combobox('options');
  324. // $(this).combobox('select', items[items.length-1][opts.valueField]);
  325. // }
  326. }
  327. }
  328. },
  329. {
  330. field:'d.accountDate',
  331. type:'datebox',
  332. options:{
  333. precision:1,
  334. formatter: function(date) {
  335. var y = date.getFullYear();
  336. var m = date.getMonth()+1;
  337. var d = date.getDate();
  338. return y+'-'+(m<10?('0'+m):m)+'-'+(d<10?('0'+d):d);
  339. },
  340. parser: function(s) {
  341. if (!s) return new Date();
  342. var ss = (s.split('-'));
  343. var y = parseInt(ss[0],10);
  344. var m = parseInt(ss[1],10);
  345. var d = parseInt(ss[2],10);
  346. if (!isNaN(y) && !isNaN(m) && !isNaN(d)){
  347. return new Date(y,m-1,d);
  348. } else {
  349. return new Date();
  350. }
  351. }
  352. },
  353. op:['equal','less','greater']
  354. },
  355. {
  356. field:'w.parcel_count',
  357. type:'numberbox',
  358. options:{precision:1},
  359. op:['less','greater','equal']
  360. },
  361. {
  362. field:'t.amount',
  363. type:'numberbox',
  364. options:{precision:1},
  365. op:['less','greater','equal']
  366. }
  367. ]);
  368. });
  369. function formatAmount(val,row){
  370. return val.toLocaleString();
  371. }
  372. </script>
  373. {% endblock %}