report_balance.js 15 KB

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