report_phonecall.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  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 today = moment().format('YYYY-MM-DD');
  284. var yesterday = moment().add(-1, 'days').format('YYYY-MM-DD');
  285. var month = moment().format('YYYY-MM');
  286. var last_month = moment().add(-1, 'months').format('YYYY-MM');
  287. var partner= this.$el.find('#partner').val().split('-');
  288. var content = self.content;
  289. if ($('#A').is(":checked")){
  290. content = _.filter(content, function (inv){
  291. return moment(inv.date).format('YYYY-MM-DD') == today;
  292. });
  293. }
  294. if ($('#B').is(":checked")){
  295. content = _.filter(content, function (inv){
  296. return moment(inv.date).format('YYYY-MM-DD') == yesterday;
  297. });
  298. }
  299. if ($('#C').is(":checked")){
  300. content = _.filter(content, function (inv){
  301. return moment(inv.date).format('YYYY-MM') == month;
  302. });
  303. }
  304. if ($('#D').is(":checked")){
  305. content = _.filter(content, function (inv){
  306. return moment(inv.date).format('YYYY-MM') == last_month;
  307. });
  308. }
  309. if ($('#Z').is(":checked")){
  310. $('#datepicker').css('display','block');
  311. if (desde.length > 0){
  312. var date= desde.split('/');
  313. content = _.filter(content, function (inv){
  314. return inv.date >= (date[2]+"-"+date[1]+"-"+date[0]);
  315. });
  316. }
  317. if (hasta.length > 0){
  318. var date= hasta.split('/');
  319. content = _.filter(content, function (inv){
  320. return inv.date <= (date[2]+"-"+date[1]+"-"+date[0]);
  321. });
  322. }
  323. }else{
  324. $('#datepicker').css('display','none');
  325. }
  326. this.$el.find('#volver_btn').append(selector);
  327. this.$el.find('.bootstrap-table').hide({
  328. effect: 'drop',
  329. direction: 'up',
  330. duration: 200,
  331. complete: function () {
  332. }
  333. });
  334. this.$el.find('#toolbar').hide({
  335. effect: 'drop',
  336. direction: 'up',
  337. duration: 200,
  338. complete: function () {
  339. }
  340. });
  341. if (partner != ""){
  342. content = _.filter(content, function(inv){
  343. return inv.partner_id == partner[0];
  344. });
  345. }
  346. self.loadTable(content)
  347. },
  348. loadTable:function(rowsTable){
  349. var self = this;
  350. self.rowsData = rowsTable;
  351. var table = this.$el.find('#table');
  352. table.bootstrapTable('load',rowsTable);
  353. },
  354. getObjetPdf: function(rowsTable){
  355. var self = this;
  356. var rowsPdf=[];
  357. var rows=[];
  358. var rows = self.rowsData;
  359. return rows;
  360. },
  361. clickOnAction: function (e) {
  362. var self = this;
  363. var rowsNew;
  364. var action = self.$el.find(e.target).val();
  365. var table = self.$el.find("#table");
  366. var data2 = table.bootstrapTable('getVisibleColumns');
  367. var getColumns=[];
  368. var rows=[];
  369. rowsNew = self.getObjetPdf();
  370. if (action === 'pdf') {
  371. var dataNEW = _.map(data2, function (val){
  372. return val.field;
  373. });
  374. _.each(rowsNew,function (item){
  375. rows.push(_.pick(item, dataNEW));
  376. });
  377. // Obtener los nombre de la Cabecera
  378. _.each(_.map(data2,function(val){
  379. return val;
  380. }), function(item){
  381. getColumns.push([{
  382. title: item.title,
  383. dataKey: item.field
  384. }]);
  385. });
  386. this.drawPDF(_.flatten(getColumns),rows);
  387. }
  388. },
  389. drawPDF: function (getColumns,rows) {
  390. var self = this;
  391. var desde =(this.$el.find('#from').val());
  392. var hasta =(this.$el.find('#to').val());
  393. var totalPagesExp = "{total_pages_count_string}";
  394. var pdfDoc = new jsPDF();
  395. pdfDoc.autoTable(getColumns, rows, {
  396. styles: { overflow: 'linebreak', fontSize: 8, columnWidth: 'wrap'},
  397. columnStyles: {
  398. opportunity_id : {columnWidth: '8px'},
  399. partner : {columnWidth: '8px'},
  400. description : {columnWidth: '8px'},
  401. date : {columnWidth: '8px'},
  402. stage : {columnWidth: '8px'},
  403. user : {columnWidth: '8px'}
  404. },
  405. margin: { top: 16, horizontal: 7},
  406. addPageContent: function (data) {
  407. pdfDoc.setFontSize(12);
  408. pdfDoc.setFontStyle('bold');
  409. pdfDoc.setTextColor(40);
  410. pdfDoc.text('Histórico de llamadas de crm ', data.settings.margin.left, 10);
  411. if(desde.length > 0 || hasta.length > 0){
  412. var fecha='';
  413. if(desde){
  414. fecha=fecha.concat(' Desde '+desde);
  415. }
  416. if (hasta){
  417. fecha=fecha.concat(' Hasta '+hasta);
  418. }
  419. pdfDoc.setFontSize(10);
  420. pdfDoc.setFontStyle('bold');
  421. pdfDoc.setTextColor(40)
  422. pdfDoc.text(fecha, data.settings.margin.left,14);
  423. }
  424. // FOOTER
  425. var str = "Pagina " + data.pageCount;
  426. // Total page number plugin only available in jspdf v1.0+
  427. if (typeof pdfDoc.putTotalPages === 'function') {
  428. str = str + " de " + totalPagesExp;
  429. }
  430. pdfDoc.setFontSize(9);
  431. pdfDoc.setFontStyle('bold');
  432. pdfDoc.setTextColor(40);
  433. pdfDoc.text(str, data.settings.margin.left, pdfDoc.internal.pageSize.height - 5);
  434. }
  435. });
  436. if (typeof pdfDoc.putTotalPages === 'function') {
  437. pdfDoc.putTotalPages(totalPagesExp);
  438. }
  439. pdfDoc.save('Histórico de llamadas crm.pdf')
  440. },
  441. });
  442. }