report_phonecall.js 18 KB

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