report_balance.js 16 KB

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