report_mrp.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. function report_mrp(reporting){
  2. "use strict";
  3. var instance = openerp;
  4. reporting.ReportMrpWidget = reporting.Base.extend({
  5. template:'ReportMrp',
  6. Mrp: [],
  7. content:[],
  8. productProduct: [],
  9. rowsData :[],
  10. modules:[],
  11. events:{
  12. 'click #toolbar > button' : 'clickOnAction',
  13. 'click #X' : 'factSearch',
  14. 'click #A' : 'factSearch',
  15. 'click #B' : 'factSearch',
  16. 'click #C' : 'factSearch',
  17. 'click #D' : 'factSearch',
  18. 'click #Z' : 'factSearch',
  19. 'click #Y' : 'factSearch',
  20. 'click #product' : '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. // Redirecionar
  36. renderReport: function () {
  37. var self = this;
  38. var container = this.$el.closest('.oe_form_sheet.oe_form_sheet_width');
  39. this.$el.closest('.report_view').remove();
  40. container.find('.report_view').show({
  41. effect: 'fade',
  42. duration: 200,
  43. });
  44. },
  45. // Verificar el modelo
  46. checkModel : function(model){
  47. var self = this;
  48. return _.filter(self.modules,function(item){return item.name === model});
  49. },
  50. // Lanzar el mensaje
  51. showMensaje : function(modelos){
  52. var self = this;
  53. $("#dialog" ).dialog({
  54. autoOpen: true,
  55. resizable: false,
  56. modal: true,
  57. title: 'Atención',
  58. width: 500,
  59. open: function() {
  60. $(this).html('Reporte in-disponible, contacte con el administrador del sistema ref : '+modelos);
  61. },
  62. show: {
  63. effect: "fade",
  64. duration: 200
  65. },
  66. hide: {
  67. effect: "fade",
  68. duration: 200
  69. },
  70. buttons: {
  71. Aceptar: function() {
  72. $(this).dialog('close');
  73. self.renderReport()
  74. }
  75. }
  76. });
  77. return
  78. },
  79. valorNull:function(dato){
  80. var valor ="";
  81. if (dato){
  82. valor=dato;
  83. }
  84. return valor;
  85. },
  86. clickAnalysisDetail: function(e, row, $element, field){
  87. if (field == 'name'){
  88. this.do_action({
  89. name:"Producción",
  90. type: 'ir.actions.act_window',
  91. res_model: "mrp.production",
  92. views: [[false,'form']],
  93. target: 'new',
  94. domain: [['id','=', row.id]],
  95. context: {},
  96. flags: {'form': {'action_buttons': false, 'options': {'mode': 'view'}}},
  97. res_id: row.id,
  98. });
  99. }
  100. if (field === 'product'){
  101. this.do_action({
  102. name:"Registro",
  103. type: 'ir.actions.act_window',
  104. res_model: "product.product",
  105. views: [[false,'form']],
  106. target: 'new',
  107. domain: [['id','=', row.product_id]],
  108. context: {},
  109. flags: {'form': {'action_buttons': false, 'options': {'mode': 'view'}}},
  110. res_id: row.product_id,
  111. });
  112. }
  113. e.stopImmediatePropagation();
  114. },
  115. submitForm: function () {
  116. var self = this;
  117. self.fecthIrModuleModule().then(function(modules){
  118. self.modules = modules;
  119. return modules;
  120. }).then(function(modules){
  121. return self.fetchMrp();
  122. }).then(function(Mrp) {
  123. self.Mrp = Mrp;
  124. return self.fetchProduct();
  125. }).then(function(productProduct){
  126. self.productProduct = productProduct;
  127. self.search();
  128. return self.BuildTable();
  129. });
  130. },
  131. // Modelos instalados
  132. fecthIrModuleModule: function(){
  133. var self = this;
  134. var defer = $.Deferred();
  135. var fields = ['name','id'];
  136. var domain=[['state','=','installed']];
  137. var irModule = new instance.web.Model('ir.module.module');
  138. irModule.query(fields).filter(domain).all().then(function(results){
  139. defer.resolve(results);
  140. });
  141. return defer;
  142. },
  143. fecthFecha: function() {
  144. var to;
  145. var dateFormat1 = "mm/dd/yy",
  146. from = $( "#from" )
  147. .datepicker({
  148. dateFormat: "dd/mm/yy",
  149. changeMonth: true,
  150. numberOfMonths: 1,
  151. })
  152. .on( "change", function() {
  153. to.datepicker( "option", "minDate", getDate(this), "dd/mm/yyyy");
  154. });
  155. to = $( "#to" ).datepicker({
  156. dateFormat: "dd/mm/yy",
  157. defaultDate: "+7d",
  158. changeMonth: true,
  159. numberOfMonths: 1,
  160. })
  161. .on( "change", function() {
  162. from.datepicker( "option", "maxDate", getDate(this));
  163. });
  164. function getDate( element ) {
  165. var fechaSel =element.value.split('/');
  166. var date;
  167. try {
  168. date = $.datepicker.parseDate( dateFormat1, (fechaSel[1]+"/"+fechaSel[0]+"/"+fechaSel[2]));
  169. } catch( error ) {
  170. date = null;
  171. }
  172. return date;
  173. }
  174. },
  175. fetchMrp: function () {
  176. var self = this;
  177. var defer = $.Deferred();
  178. var modules = self.checkModel('mrp');
  179. if (modules.length <= 0){
  180. self.showMensaje('mrp');
  181. return defer;
  182. }
  183. var Mrp = new instance.web.Model('mrp.production');
  184. Mrp.query(['id', 'name', 'product_id', 'date_planned', 'product_qty', 'create_date', 'state']).filter().all().then(function(results){
  185. defer.resolve(results);
  186. });
  187. return defer;
  188. },
  189. // ProductProduct
  190. fetchProduct: function() {
  191. var self = this;
  192. var defer = $.Deferred();
  193. var productProduct = new instance.web.Model('product.product');
  194. productProduct.query(['id','name','name_template']).filter([['active', '=', true]]).all().then(function (results) {
  195. defer.resolve(results);
  196. });
  197. return defer;
  198. },
  199. valorNull:function(dato){
  200. var valor ="";
  201. if (dato){
  202. valor=dato;
  203. }
  204. return valor;
  205. },
  206. search: function () {
  207. var self = this;
  208. var results = self.productProduct;
  209. results = _.map(results, function (item) {
  210. return {
  211. label: item.id + '-'+ item.name,
  212. value: item.id + '-'+ item.name
  213. }
  214. });
  215. self.$('#product').autocomplete({
  216. source: results,
  217. minLength:0,
  218. search: function(event, ui) {
  219. if (!(self.$('#product').val())){
  220. self.factSearch();
  221. }
  222. },
  223. close: function( event, ui ) {
  224. self.factSearch();
  225. },
  226. select: function(event, ui) {
  227. self.factSearch();
  228. }
  229. });
  230. },
  231. BuildTable: function(){
  232. var self = this;
  233. var Mrp = self.Mrp;
  234. var invoice;
  235. var data = [];
  236. _.each(Mrp, function(item){
  237. data.push({
  238. id : item.id,
  239. name : item.name,
  240. product: self.valorNull(item.product_id[1]),
  241. create_date: moment(item.create_date).format("DD/MM/YYYY"),
  242. date: moment(item.create_date).format("YYYY-MM-DD"),
  243. product_qty: accounting.formatNumber(self.valorNull(item.product_qty),2, ".", ","),
  244. qty_produced: accounting.formatNumber(self.valorNull(item.qty_produced),2, ".", ","),
  245. state: item.state,
  246. date_planned: moment(item.date_planned).format("DD/MM/YYYY"),
  247. product_id : item.product_id[0]
  248. });
  249. });
  250. self.content = data;
  251. this.loadTable(data);
  252. },
  253. factSearch: function(){
  254. var self = this;
  255. var hoy = moment().format('YYYY-MM-DD');
  256. var desde = this.$el.find('#from').val();
  257. var hasta = this.$el.find('#to').val();
  258. var partner= this.$el.find('#product').val().split('-');
  259. var content = self.content;
  260. if ($('#A').is(":checked")){
  261. content = _.filter(content, function (inv){
  262. return inv.date == hoy;
  263. });
  264. }
  265. if ($('#B').is(":checked")){
  266. var date = hoy.split('-');
  267. var ayer = date[2] - 1;
  268. date.splice(2,0);
  269. if(date[2] < 10){
  270. date[2] = '0'+ayer;
  271. }else{
  272. date[2] = ayer;
  273. }
  274. content = _.filter(content, function (inv){
  275. return inv.date == date[0]+'-'+date[1]+'-'+date[2];
  276. });
  277. }
  278. if ($('#C').is(":checked")){
  279. var date = hoy.split('-');
  280. content = _.filter(content, function (inv){
  281. var mes = inv.date.split('-');
  282. return mes[0]+'-'+mes[1] == date[0]+'-'+date[1];
  283. });
  284. }
  285. if ($('#D').is(":checked")){
  286. var date = hoy.split('-');
  287. var mes = date[1] - 1;
  288. var year;
  289. date.splice(1,0);
  290. if(date[1] == 1){
  291. date[1] = '12';
  292. year = date[0] - 1;
  293. date[0] = year;
  294. }else{
  295. if(date[1] < 10){
  296. date[1] = '0'+mes;
  297. }else{
  298. date[1] = mes;
  299. }
  300. }
  301. content = _.filter(content, function (inv){
  302. var mes = inv.date.split('-');
  303. return mes[0]+'-'+mes[1] == date[0]+'-'+date[1];
  304. });
  305. }
  306. if ($('#Z').is(":checked")){
  307. $('#datepicker').css('display','block');
  308. if (desde.length > 0){
  309. var date= desde.split('/');
  310. content = _.filter(content, function (inv){
  311. return inv.date >= (date[2]+"-"+date[1]+"-"+date[0]);
  312. });
  313. }
  314. if (hasta.length > 0){
  315. var date= hasta.split('/');
  316. content = _.filter(content, function (inv){
  317. return inv.date <= (date[2]+"-"+date[1]+"-"+date[0]);
  318. });
  319. }
  320. }else{
  321. $('#datepicker').css('display','none');
  322. }
  323. if (product != ""){
  324. content = _.filter(content, function(inv){
  325. return inv.id == product[0];
  326. });
  327. }
  328. self.loadTable(content)
  329. },
  330. loadTable:function(rowsTable){
  331. var self = this;
  332. self.rowsData = rowsTable;
  333. var table = this.$el.find('#table');
  334. table.bootstrapTable('load',rowsTable);
  335. },
  336. getObjetPdf: function(rowsTable){
  337. var self = this;
  338. var rowsPdf=[];
  339. var rows=[];
  340. var rows = self.rowsData;
  341. return rows;
  342. },
  343. clickOnAction: function (e) {
  344. var self = this;
  345. var rowsNew;
  346. var action = self.$el.find(e.target).val();
  347. var table = self.$el.find("#table");
  348. var data2 = table.bootstrapTable('getVisibleColumns');
  349. var getColumns=[];
  350. var rows=[];
  351. rowsNew = self.getObjetPdf();
  352. if (action === 'pdf') {
  353. var dataNEW = _.map(data2, function (val){
  354. return val.field;
  355. });
  356. _.each(rowsNew,function (item){
  357. rows.push(_.pick(item, dataNEW));
  358. });
  359. // Obtener los nombre de la Cabecera
  360. _.each(_.map(data2,function(val){
  361. return val;
  362. }), function(item){
  363. getColumns.push([{
  364. title: item.title,
  365. dataKey: item.field
  366. }]);
  367. });
  368. this.drawPDF(_.flatten(getColumns),rows);
  369. }
  370. },
  371. drawPDF: function (getColumns,rows) {
  372. var self = this;
  373. var desde =(this.$el.find('#from').val());
  374. var hasta =(this.$el.find('#to').val());
  375. var totalPagesExp = "{total_pages_count_string}";
  376. var pdfDoc = new jsPDF();
  377. pdfDoc.autoTable(getColumns, rows, {
  378. styles: { overflow: 'linebreak', fontSize: 8, columnWidth: 'wrap'},
  379. columnStyles: {
  380. name : {columnWidth: '4px'},
  381. product : {columnWidth: '6px'},
  382. date : {columnWidth: '9px'},
  383. product_qty : {columnWidth: '5px'},
  384. qty_produced : {columnWidth: '5px'},
  385. date_planned : {columnWidth: '7px'},
  386. state : {columnWidth: '6px'}
  387. },
  388. margin: { top: 16, horizontal: 7},
  389. addPageContent: function (data) {
  390. pdfDoc.setFontSize(12);
  391. pdfDoc.setFontStyle('bold');
  392. pdfDoc.setTextColor(40);
  393. pdfDoc.text('Histórico de producción', data.settings.margin.left, 10);
  394. if(desde.length > 0 || hasta.length > 0){
  395. var fecha='';
  396. if(desde){
  397. fecha=fecha.concat(' Desde '+desde);
  398. }
  399. if (hasta){
  400. fecha=fecha.concat(' Hasta '+hasta);
  401. }
  402. pdfDoc.setFontSize(10);
  403. pdfDoc.setFontStyle('bold');
  404. pdfDoc.setTextColor(40)
  405. pdfDoc.text(fecha, data.settings.margin.left,14);
  406. }
  407. // FOOTER
  408. var str = "Pagina " + data.pageCount;
  409. // Total page number plugin only available in jspdf v1.0+
  410. if (typeof pdfDoc.putTotalPages === 'function') {
  411. str = str + " de " + totalPagesExp;
  412. }
  413. pdfDoc.setFontSize(9);
  414. pdfDoc.setFontStyle('bold');
  415. pdfDoc.setTextColor(40);
  416. pdfDoc.text(str, data.settings.margin.left, pdfDoc.internal.pageSize.height - 5);
  417. }
  418. });
  419. if (typeof pdfDoc.putTotalPages === 'function') {
  420. pdfDoc.putTotalPages(totalPagesExp);
  421. }
  422. pdfDoc.save('Histórico de producción.pdf')
  423. },
  424. });
  425. }