report_crmtask.js 20 KB

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