report_vouchers.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. function report_vouchers (reporting){
  2. "use strict";
  3. var instance = openerp;
  4. reporting.ReportVoucherWidget = reporting.Base.extend({
  5. template: 'ReportVoucher',
  6. AccountVoucher: [],
  7. content:[],
  8. rowsData :[],
  9. events:{
  10. 'click #toolbar > button' : 'clickOnAction',
  11. 'click #X' : 'factSearch',
  12. 'click #A' : 'factSearch',
  13. 'click #B' : 'factSearch',
  14. 'click #C' : 'factSearch',
  15. 'click #D' : 'factSearch',
  16. 'click #Z' : 'factSearch',
  17. 'click #Y' : 'factSearch',
  18. 'click #customer' : 'factSearch',
  19. 'click #supplier' : 'factSearch',
  20. 'change #current-journal' : 'factSearch',
  21. 'change #from' : 'factSearch',
  22. 'change #to' : 'factSearch',
  23. 'click-row.bs.table #table ' : 'clickAnalysisDetail',
  24. },
  25. init : function(parent){
  26. this._super(parent);
  27. },
  28. start: function () {
  29. var self = this;
  30. var table = this.$el.find('#table');
  31. table.bootstrapTable({data : self.rowsData});
  32. this.fecthFecha();
  33. this.submitForm();
  34. },
  35. valorNull:function(dato){
  36. var valor ="";
  37. if (dato){
  38. valor=dato;
  39. }
  40. return valor;
  41. },
  42. clickAnalysisDetail: function(e, row, $element, field){
  43. if (field == 'reference'){
  44. this.do_action({
  45. name:"Factura",
  46. type: 'ir.actions.act_window',
  47. res_model: "account.invoice",
  48. views: [[false,'form']],
  49. target: 'new',
  50. domain: [['id','=', row.invoice_id]],
  51. context: {},
  52. flags: {'form': {'action_buttons': false, 'options': {'mode': 'view'}}},
  53. res_id: row.invoice_id,
  54. });
  55. }
  56. if (field === 'partner'){
  57. this.do_action({
  58. name:"Registro",
  59. type: 'ir.actions.act_window',
  60. res_model: "res.partner",
  61. views: [[false,'form']],
  62. target: 'new',
  63. domain: [['id','=', row.partner_id]],
  64. context: {},
  65. flags: {'form': {'action_buttons': false, 'options': {'mode': 'view'}}},
  66. res_id: row.partner_id,
  67. });
  68. }
  69. e.stopImmediatePropagation();
  70. },
  71. submitForm: function () {
  72. var self = this;
  73. self.fetchAccountVoucher().then(function(AccountVoucher) {
  74. return AccountVoucher;
  75. }).then(function (AccountVoucher) {
  76. self.AccountVoucher = AccountVoucher;
  77. return self.fetchResPartner();
  78. }).then(function(ResPartner){
  79. self.ResPartner = ResPartner;
  80. return self.fetchAccountInvoice();
  81. }).then(function(AccountInvoice){
  82. self.AccountInvoice = AccountInvoice;
  83. return self.fetchAccountJournal();
  84. }).then(function (AccountJournal) {
  85. self.AccountJournal =AccountJournal;
  86. self.$el.find('#current-journal').append('<option value="9999999">Todos los pagos</option>');
  87. _.each(AccountJournal, function (item) {
  88. self.$el.find('#current-journal').append('<option value="' + item.id + '">' + item.name + '</option>');
  89. });
  90. self.search();
  91. return self.BuildTable();
  92. });
  93. },
  94. fecthFecha: function() {
  95. var to;
  96. var dateFormat1 = "mm/dd/yy",
  97. from = $( "#from" )
  98. .datepicker({
  99. dateFormat: "dd/mm/yy",
  100. changeMonth: true,
  101. numberOfMonths: 1,
  102. })
  103. .on( "change", function() {
  104. to.datepicker( "option", "minDate", getDate(this), "dd/mm/yyyy");
  105. });
  106. to = $( "#to" ).datepicker({
  107. dateFormat: "dd/mm/yy",
  108. defaultDate: "+7d",
  109. changeMonth: true,
  110. numberOfMonths: 1,
  111. })
  112. .on( "change", function() {
  113. from.datepicker( "option", "maxDate", getDate(this));
  114. });
  115. function getDate( element ) {
  116. var fechaSel =element.value.split('/');
  117. var date;
  118. try {
  119. date = $.datepicker.parseDate( dateFormat1, (fechaSel[1]+"/"+fechaSel[0]+"/"+fechaSel[2]));
  120. } catch( error ) {
  121. date = null;
  122. }
  123. return date;
  124. }
  125. },
  126. fetchAccountVoucher: function () {
  127. var self = this;
  128. var defer = $.Deferred();
  129. var AccountVoucher = new instance.web.Model('account.voucher');
  130. AccountVoucher.query(['id', 'number','reference','partner_id','journal_id','amount','date','number','type']).filter([['state', '=', 'posted']]).all().then(function(results){
  131. defer.resolve(results);
  132. });
  133. return defer;
  134. },
  135. fetchResPartner: function () {
  136. var self = this;
  137. var defer = $.Deferred();
  138. var ResPartner = new instance.web.Model('res.partner');
  139. ResPartner.query(['id','name','ruc']).filter([['active', '=', true]]).all().then(function(results){
  140. defer.resolve(results);
  141. });
  142. return defer;
  143. },
  144. fetchAccountInvoice: function () {
  145. var self = this;
  146. var defer = $.Deferred();
  147. var AccountInvoice = new instance.web.Model('account.invoice');
  148. AccountInvoice.query(['id','number']).filter([['state', 'in', ['open','paid']]]).all().then(function(results){
  149. defer.resolve(results);
  150. });
  151. return defer;
  152. },
  153. fetchAccountJournal: function () {
  154. var self = this;
  155. var defer = $.Deferred();
  156. var AccountJournal = new instance.web.Model('account.journal');
  157. AccountJournal.query(['id','name']).filter([['active','=',true],['type', 'in', ['bank','cash']]]).all().then(function(results){
  158. defer.resolve(results);
  159. });
  160. return defer;
  161. },
  162. getAccountInvoice: function (number) {
  163. var self = this;
  164. return _.filter(self.AccountInvoice,function (item) {
  165. return item.number == number;
  166. });
  167. },
  168. search: function () {
  169. var self = this;
  170. var results = self.ResPartner;
  171. results = _.map(results, function (item) {
  172. return {
  173. label: item.id + '-'+ item.name + ' ' + self.valorNull(item.ruc),
  174. value: item.id + '-'+ item.name + ' ' + self.valorNull(item.ruc)
  175. }
  176. });
  177. self.$('#partner').autocomplete({
  178. source: results,
  179. minLength:0,
  180. search: function(event, ui) {
  181. if (!(self.$('#partner').val())){
  182. self.factSearch();
  183. }
  184. },
  185. close: function( event, ui ) {
  186. self.factSearch();
  187. },
  188. select: function(event, ui) {
  189. self.factSearch();
  190. }
  191. });
  192. },
  193. BuildTable: function(){
  194. var self = this;
  195. var AccountVoucher = self.AccountVoucher;
  196. var invoice;
  197. var amount_in;
  198. var amount_out;
  199. var data = [];
  200. _.each(AccountVoucher, function(item){
  201. invoice = self.getAccountInvoice(item.reference).shift();
  202. if (item.type == 'payment') {
  203. amount_in = 0;
  204. amount_out = item.amount;
  205. }else{
  206. amount_in = item.amount;
  207. amount_out = 0;
  208. }
  209. data.push({
  210. id : item.id,
  211. reference: item.reference,
  212. number: item.number,
  213. journal: item.journal_id[1],
  214. date_voucher: moment(item.date).format("DD/MM/YYYY"),
  215. partner: item.partner_id[1],
  216. amount_in: accounting.formatNumber(amount_in,2,".",","),
  217. amount_out: accounting.formatNumber(amount_out,2,".",","),
  218. type: item.type,
  219. date: item.date,
  220. journal_id: item.journal_id[0],
  221. partner_id: item.partner_id[0],
  222. invoice_id: invoice.id,
  223. in_amount:amount_in,
  224. out_amount:amount_out
  225. });
  226. });
  227. self.content = data;
  228. this.loadTable(data);
  229. },
  230. factSearch: function(){
  231. var self = this;
  232. var hoy = moment().format('YYYY-MM-DD');
  233. var journal = this.$el.find('#current-journal').val();
  234. var desde = this.$el.find('#from').val();
  235. var hasta = this.$el.find('#to').val();
  236. var partner= this.$el.find('#partner').val().split('-');
  237. var content = self.content;
  238. if ($('#A').is(":checked")){
  239. content = _.filter(content, function (inv){
  240. return inv.date == hoy;
  241. });
  242. }
  243. if ($('#B').is(":checked")){
  244. var date = hoy.split('-');
  245. var ayer = date[2] - 1;
  246. date.splice(2,0);
  247. if(date[2] < 10){
  248. date[2] = '0'+ayer;
  249. }else{
  250. date[2] = ayer;
  251. }
  252. content = _.filter(content, function (inv){
  253. return inv.date == date[0]+'-'+date[1]+'-'+date[2];
  254. });
  255. }
  256. if ($('#C').is(":checked")){
  257. var date = hoy.split('-');
  258. content = _.filter(content, function (inv){
  259. var mes = inv.date.split('-');
  260. return mes[0]+'-'+mes[1] == date[0]+'-'+date[1];
  261. });
  262. }
  263. if ($('#D').is(":checked")){
  264. var date = hoy.split('-');
  265. var mes = date[1] - 1;
  266. var year;
  267. date.splice(1,0);
  268. if(date[1] == 1){
  269. date[1] = '12';
  270. year = date[0] - 1;
  271. date[0] = year;
  272. }else{
  273. if(date[1] < 10){
  274. date[1] = '0'+mes;
  275. }else{
  276. date[1] = mes;
  277. }
  278. }
  279. content = _.filter(content, function (inv){
  280. var mes = inv.date.split('-');
  281. return mes[0]+'-'+mes[1] == date[0]+'-'+date[1];
  282. });
  283. }
  284. if ($('#Z').is(":checked")){
  285. $('#datepicker').css('display','block');
  286. if (desde.length > 0){
  287. var date= desde.split('/');
  288. content = _.filter(content, function (inv){
  289. return inv.date >= (date[2]+"-"+date[1]+"-"+date[0]);
  290. });
  291. }
  292. if (hasta.length > 0){
  293. var date= hasta.split('/');
  294. content = _.filter(content, function (inv){
  295. return inv.date <= (date[2]+"-"+date[1]+"-"+date[0]);
  296. });
  297. }
  298. }else{
  299. $('#datepicker').css('display','none');
  300. }
  301. if ($('#customer').is(":checked")){
  302. content = _.filter(content, function (inv){
  303. return inv.type == 'receipt';
  304. });
  305. }
  306. if ($('#supplier').is(":checked")){
  307. content = _.filter(content, function (inv){
  308. return inv.type == 'payment';
  309. });
  310. }
  311. if(journal != 9999999){
  312. content = _.filter(content,function(inv){
  313. return inv.journal_id == journal;
  314. });
  315. }
  316. if (partner != ""){
  317. content = _.filter(content, function(inv){
  318. return inv.partner_id == partner[0];
  319. });
  320. }
  321. var amount_in_amount = _.reduce(_.map(content,function(map){
  322. return(map.in_amount);
  323. }),function(memo, num){
  324. return memo + num;
  325. },0);
  326. var amount_out_amount = _.reduce(_.map(content,function(map){
  327. return(map.out_amount);
  328. }),function(memo, num){
  329. return memo + num;
  330. },0);
  331. content.push({
  332. number: "Total",
  333. amount_in: accounting.formatNumber((amount_in_amount),0,".",","),
  334. amount_out: accounting.formatNumber((amount_out_amount),0,".",","),
  335. });
  336. self.loadTable(content)
  337. },
  338. loadTable:function(rowsTable){
  339. var self = this;
  340. self.rowsData = rowsTable;
  341. var table = this.$el.find('#table');
  342. table.bootstrapTable('load',rowsTable);
  343. },
  344. getObjetPdf: function(rowsTable){
  345. var self = this;
  346. var rowsPdf=[];
  347. var rows=[];
  348. var rows = self.rowsData;
  349. var total_in = _.reduce(_.map(rows,function(map){
  350. return(map.in_amount);
  351. }),function(memo, num){
  352. return memo + num;
  353. },0);
  354. var total_out = _.reduce(_.map(rows,function(map){
  355. return(map.out_amount);
  356. }),function(memo, num){
  357. return memo + num;
  358. },0);
  359. if (rows.length > 0){
  360. rows.push({
  361. reference: "Totales ",
  362. amount_in: accounting.formatNumber(total_in,2,".",","),
  363. amount_out: accounting.formatNumber(total_out,2,".",","),
  364. });
  365. }
  366. return rows;
  367. },
  368. clickOnAction: function (e) {
  369. var self = this;
  370. var rowsNew;
  371. var action = self.$el.find(e.target).val();
  372. var table = self.$el.find("#table");
  373. var data2 = table.bootstrapTable('getVisibleColumns');
  374. var getColumns=[];
  375. var rows=[];
  376. rowsNew = self.getObjetPdf();
  377. if (action === 'pdf') {
  378. var dataNEW = _.map(data2, function (val){
  379. return val.field;
  380. });
  381. _.each(rowsNew,function (item){
  382. rows.push(_.pick(item, dataNEW));
  383. });
  384. // Obtener los nombre de la Cabezera
  385. _.each(_.map(data2,function(val){
  386. return val;
  387. }), function(item){
  388. getColumns.push([{
  389. title: item.title,
  390. dataKey: item.field
  391. }]);
  392. });
  393. this.drawPDF(_.flatten(getColumns),rows);
  394. }
  395. },
  396. drawPDF: function (getColumns,rows) {
  397. var self = this;
  398. var desde =(this.$el.find('#from').val());
  399. var hasta =(this.$el.find('#to').val());
  400. var totalPagesExp = "{total_pages_count_string}";
  401. var pdfDoc = new jsPDF();
  402. pdfDoc.autoTable(getColumns, rows, {
  403. styles: { overflow: 'linebreak', fontSize: 8, columnWidth: 'wrap'},
  404. columnStyles: {
  405. reference : {columnWidth: '10px'},
  406. number : {columnWidth: '7px'},
  407. journal_id : {columnWidth: '6px'},
  408. date_voucher : {columnWidth: '6px'},
  409. partner : {columnWidth: '8px'},
  410. amount_in : {halign:'right',columnWidth: '8px'},
  411. amount_out: {halign:'right',columnWidth: '8px'}
  412. },
  413. margin: { top: 16, horizontal: 7},
  414. addPageContent: function (data) {
  415. pdfDoc.setFontSize(12);
  416. pdfDoc.setFontStyle('bold');
  417. pdfDoc.setTextColor(40);
  418. pdfDoc.text('Histórico de pagos ', data.settings.margin.left, 10);
  419. if(desde.length > 0 || hasta.length > 0){
  420. var fecha='';
  421. if(desde){
  422. fecha=fecha.concat(' Desde '+desde);
  423. }
  424. if (hasta){
  425. fecha=fecha.concat(' Hasta '+hasta);
  426. }
  427. pdfDoc.setFontSize(10);
  428. pdfDoc.setFontStyle('bold');
  429. pdfDoc.setTextColor(40)
  430. pdfDoc.text(fecha, data.settings.margin.left,14);
  431. }
  432. // FOOTER
  433. var str = "Pagina " + data.pageCount;
  434. // Total page number plugin only available in jspdf v1.0+
  435. if (typeof pdfDoc.putTotalPages === 'function') {
  436. str = str + " de " + totalPagesExp;
  437. }
  438. pdfDoc.setFontSize(9);
  439. pdfDoc.setFontStyle('bold');
  440. pdfDoc.setTextColor(40);
  441. pdfDoc.text(str, data.settings.margin.left, pdfDoc.internal.pageSize.height - 5);
  442. }
  443. });
  444. if (typeof pdfDoc.putTotalPages === 'function') {
  445. pdfDoc.putTotalPages(totalPagesExp);
  446. }
  447. pdfDoc.save('Histórico de pagos.pdf')
  448. },
  449. });
  450. }