ソースを参照

FIX ADD Informes Dental

Sebas 6 年 前
コミット
c9fc019f8f

+ 10 - 5
static/src/js/configuration_reporting.js

@@ -93,6 +93,11 @@ function configuration_reporting (instance, widget) {
                 description: 'Permite visualizar de forma global los ingresos obtenidos por la empresa. Tanto ventas normales y punto de ventas',
                 action: 'ReportVentasPosOrders'
             },
+            {
+                title: 'Listado de Ventas por vendedor y monto',
+                description: 'Permite realizar un listado de ventas por vendedor y monto.',
+                action: 'ReportSaleVendor'
+            },
             {
                 title: 'Analisis de ventas por porcentaje',
                 description: 'Permite visualizar los porcentajes de utilidad de acuerdo a la diferencia de precio de venta y precio vendido',
@@ -143,11 +148,11 @@ function configuration_reporting (instance, widget) {
                 description: 'Permite realizar un analisis de los productos disponibles en el stock.',
                 action: 'ReportStockOriginal'
             },
-            // {
-            //     title: 'Análisis de Stock por Ubicación',
-            //     description: 'Permite realizar un analisis de los productos disponibles en el stock por Ubicación.',
-            //     action: 'ReportStockLocation'
-            // },
+            {
+                title: 'Listado de Cuentas a Cobrar Dental',
+                description: 'Permite visualizar un listado de cuentas a cobrar tanto vencidos como no vencidos.',
+                action: 'ReportingAccountPendingDental'
+            },
             {
                 title: 'Análisis de Movimientos de Stock',
                 description: 'Permite realizar un analisis de los productos disponibles en el stock.',

+ 11 - 0
static/src/js/main.js

@@ -36,6 +36,8 @@ openerp.eiru_reporting = function (instance) {
         report_rrhh(reporting);
         report_mrp(reporting);
 	    report_ranking_pos_orders_customer(reporting);
+        reporting_accountpending_dental(reporting);
+        report_libro_ventapos_dental(reporting);
         report_ranking_sales_orders_customer(reporting);
         report_ranking_purchases_orders_supplier(reporting);
         ranking_pos_orders_product_cy(reporting);
@@ -44,6 +46,7 @@ openerp.eiru_reporting = function (instance) {
         report_product_pack_utilidad(reporting);
         report_product_pack(reporting);
         ranking_purchases_orders_product_cy(reporting);
+        report_sale_vendor(reporting);
         report_bank_movements(reporting);
         report_ventas_pos_orders(reporting);
         report_sale_cab(reporting);
@@ -95,12 +98,20 @@ openerp.eiru_reporting = function (instance) {
     // Libro de venta
     instance.web.client_actions.add('eiru_reporting.libro_venta_action_report', 'instance.eiru_reporting.ReportLibroVentaWidget');
 
+    // Listado de ventas por vendedores
+    instance.web.client_actions.add('eiru_reporting.sale_vendor_action_report', 'instance.eiru_reporting.ReportSaleVendorWidget');
+
     // Libro de venta
     instance.web.client_actions.add('eiru_reporting.libro_venta_pos_action_report', 'instance.eiru_reporting.ReportLibroVentaPosWidget');
 
     // Devolucion Cliente
     instance.web.client_actions.add('eiru_reporting.devolucioncliente_action_report', 'instance.eiru_reporting.ReportRefundInvoiceCustomerWidget');
 
+    // Libro de venta pos dental
+    instance.web.client_actions.add('eiru_reporting.libro_venta_dental_action_report', 'instance.eiru_reporting.ReportLibroVentaPosDentalWidget');
+
+    // Listado de cuentas a cobrar
+    instance.web.client_actions.add('eiru_reporting.account_pendingdental_action_report', 'instance.eiru_reporting.ReportingAccountPendingDentalWidget');
     // Contrato Cliente
     instance.web.client_actions.add('eiru_reporting.contratocliente_action_report', 'instance.eiru_reporting.ReportContratoClienteWidget');
 

+ 103 - 79
static/src/js/reports/report_libro_ventapos_dental.js

@@ -5,7 +5,7 @@ function report_libro_ventapos_dental(reporting){
 
     reporting.ReportLibroVentaPosDentalWidget = reporting.Base.extend({
         template: 'ReportLibroVentaPosDental',
-        modules: ['point_of_sale'],
+        model: [],
         content: [],
         rowsData :[],
         invoices: [],
@@ -279,8 +279,8 @@ function report_libro_ventapos_dental(reporting){
             filter=filter.concat("]");
             var field =['id', 'type', 'number', 'origin', 'reference', 'state', 'journal_id', 'currency_id', 'user_id','date_invoice','amount_total','amount_tax','amount_untaxed','partner_id'];
             var defer = $.Deferred();
-            var Invoice = new instance.web.Model('account.invoice');
-            Invoice.query(field).filter(filter).all().then(function (results) {
+            var invoices = new instance.web.Model('account.invoice');
+            invoices.query(field).filter(filter).all().then(function (results) {
                 defer.resolve(results);
             });
             return defer;
@@ -462,6 +462,61 @@ function report_libro_ventapos_dental(reporting){
             }));
         },
 
+        // BuildTable: function(){
+        //     var self = this;
+        //     var invoices = self.invoices;
+        //     var CurrencyBase = self.getResCurrency(self.resCompany[0].currency_id[0]).shift();
+        //     var order = [];
+        //     var data = [];
+        //     var store = [];
+        //     var partner = [];
+        //     var amount_total_total = 0;
+        //     _.each(invoices, function(item){
+        //         order = self.getSaleOrder(item.user_id[0]);
+        //         store= self.getAccountJournal(item.journal_id[0]);
+        //         partner= self.getResPartner(item.partner_id[0]);
+        //         var currency = self.getResCurrency(item.currency_id[0]).shift();
+        //         var voucher = self.getAccountVoucher(item.number).shift();
+        //
+        //         var pago = '';
+        //         var pago_name = '';
+        //
+        //         if (voucher != undefined){
+        //             pago = voucher.journal_id[0];
+        //             pago_name=voucher.journal_id[1];
+        //         }else{
+        //             pago = '';
+        //             pago_name= '';
+        //         }
+        //         if(order.length > 0 & store.length > 0){
+        //             data.push({
+        //                 id : item.id,
+        //                 number: item.number,
+        //                 partner: item.partner_id[1],
+        //                 date_invoice: moment(item.date_invoice).format("DD/MM/YYYY"),
+        //                 amount_total: accounting.formatMoney((item.amount_total * (CurrencyBase.rate_silent/currency.rate_silent)), '', CurrencyBase.decimal_places, CurrencyBase.thousands_separator, CurrencyBase.decimal_separator),
+        //                 date: item.date_invoice,
+        //                 partner_id : item.partner_id[0],
+        //                 ruc: partner[0].ruc,
+        //                 amount : (item.amount_total * (CurrencyBase.rate_silent/currency.rate_silent)),
+        //                 // journal_id: pago,
+        //                 // journal_name: pago_name,
+        //                 user_id : item.user_id[0],
+        //                 user: item.user_id[1],
+        //                 store_id : store[0].store_ids[0],
+        //                 /*==============================
+        //                    TOTAL FOOTER CONFIGURATION
+        //                 ==============================*/
+        //                 decimal_places : CurrencyBase.decimal_places,
+        //                 thousands_separator: CurrencyBase.thousands_separator,
+        //                 decimal_separator: CurrencyBase.decimal_separator,
+        //             });
+        //         }
+        //     });
+        //     self.content = data;
+        //     this.loadTable(data);
+        // },
+
         BuildTable: function(){
             var self = this;
             var invoices = self.invoices;
@@ -481,26 +536,8 @@ function report_libro_ventapos_dental(reporting){
                 var voucher = self.getAccountVoucher(item.number).shift();
                 sale = self.getSaleOrder(item.origin);
 
-                // warehouse = self.getWarehouse(sale.warehouse_id[0]);
-                var pago = '';
-                var pago_name = '';
-                var untaxed = 0;
-                var exentas = 0;
-                var iva_10 = 0;
-                // Determinar si fue aplicado algun impuesto a la factura.
-                if(item.amount_total == item.amount_untaxed){
-                       exentas = accounting.formatNumber(item.amount_untaxed,"","");
-                }else{
-                    // // Si fue aplicado impuesto, determina si fue de 10% o 5%.
-                    // if(IVA == TAX){
-                       untaxed = accounting.formatNumber(item.amount_untaxed,"","");
-                       iva_10 = accounting.formatNumber(item.amount_tax,"","");
-                    //    tasa_10 = accounting.formatNumber(invoice.amount_untaxed,"","");
-                    // }else{
-                    //    iva_5 = accounting.formatNumber(invoice.amount_tax,"","");;
-                    //    tasa_5 = accounting.formatNumber(invoice.amount_untaxed,"","");
-                    // }
-                }
+                var pago = "";
+                var pago_name = "";
 
                 if (voucher != undefined){
                     pago = voucher.journal_id[0];
@@ -512,19 +549,13 @@ function report_libro_ventapos_dental(reporting){
                 if(order.length > 0 & store.length > 0 & partner.length > 0 & sale.length > 0){
                     data.push({
                         id : item.id,
-                        number: item.number.trim(),
+                        number: item.number,
                         partner: item.partner_id[1],
                         date_invoice: moment(item.date_invoice).format("DD/MM/YYYY"),
-                        amount_tax: accounting.formatNumber((iva_10 * (CurrencyBase.rate_silent/currency.rate_silent)),0,".",","),
-                        amount_untaxed: accounting.formatNumber((untaxed * (CurrencyBase.rate_silent/currency.rate_silent)),0,".",","),
-                        amount_exentas: accounting.formatNumber((exentas * (CurrencyBase.rate_silent/currency.rate_silent)),0,".",","),
-                        amount_total: accounting.formatNumber((item.amount_total * (CurrencyBase.rate_silent/currency.rate_silent)),0,".",","),
+                        amount_total: accounting.formatMoney((item.amount_total * (CurrencyBase.rate_silent/currency.rate_silent)), '', CurrencyBase.decimal_places, CurrencyBase.thousands_separator, CurrencyBase.decimal_separator),
                         date: item.date_invoice,
                         partner_id : item.partner_id[0],
                         ruc: partner[0].ruc,
-                        tax : (iva_10 * (CurrencyBase.rate_silent/currency.rate_silent)),
-                        untaxed : (untaxed * (CurrencyBase.rate_silent/currency.rate_silent)),
-                        exentas: (exentas * (CurrencyBase.rate_silent/currency.rate_silent)),
                         amount : (item.amount_total * (CurrencyBase.rate_silent/currency.rate_silent)),
                         journal_id: pago,
                         journal_name: pago_name,
@@ -532,7 +563,7 @@ function report_libro_ventapos_dental(reporting){
                         user: sale[0].warehouse_id[1],
                         store_id : store[0].store_ids[0],
                         /*==============================
-                            TOTAL FOOTER CONFIGURATION
+                           TOTAL FOOTER CONFIGURATION
                         ==============================*/
                         decimal_places : CurrencyBase.decimal_places,
                         thousands_separator: CurrencyBase.thousands_separator,
@@ -619,59 +650,31 @@ function report_libro_ventapos_dental(reporting){
                 });
             }
 
-            self.loadTable(content)
-        },
-
-        loadTable:function(rowsTable){
-            var self = this;
-            self.rowsData = rowsTable;
-            var table = this.$el.find('#table');
-            table.bootstrapTable('load',rowsTable);
-        },
-
-        getObjetPdf: function(rowsTable){
-            var self = this;
-            var rows=self.rowsData;
-
-            return rows;
-        },
-
-        clickOnAction: function (e) {
-            var self = this;
-            var rowsNew;
-            var action = self.$el.find(e.target).val();
-            var table = self.$el.find("#table");
-            var data2 = table.bootstrapTable('getVisibleColumns');
-            var getColumns=[];
-            var rows=[];
-            rowsNew = self.getObjetPdf();
-            var row = table.bootstrapTable('getData');
-
-            var amount_total_tax = _.reduce(_.map(row,function(map){
+            var amount_total_tax = _.reduce(_.map(content,function(map){
                 return(map.tax);
             }),function(memo, num){
                 return memo + num;
             },0);
 
-            var amount_total_untaxed = _.reduce(_.map(row,function(map){
+            var amount_total_untaxed = _.reduce(_.map(content,function(map){
                 return(map.untaxed);
             }),function(memo, num){
                 return memo + num;
             },0);
 
-            var amount_total_exentas = _.reduce(_.map(row,function(map){
+            var amount_total_exentas = _.reduce(_.map(content,function(map){
                 return(map.exentas);
             }),function(memo, num){
                 return memo + num;
             },0);
 
-            var amount_total_total = _.reduce(_.map(row,function(map){
+            var amount_total_total = _.reduce(_.map(content,function(map){
                 return(map.amount);
             }),function(memo, num){
                 return memo + num;
             },0);
 
-            row.push({
+            content.push({
                 number: "Totales:",
                 amount_tax : accounting.formatNumber((amount_total_tax),0,".",","),
                 amount_untaxed : accounting.formatNumber((amount_total_untaxed),0,".",","),
@@ -679,6 +682,32 @@ function report_libro_ventapos_dental(reporting){
                 amount_total: accounting.formatNumber((amount_total_total),0,".",","),
             });
 
+            self.loadTable(content)
+        },
+
+        loadTable:function(rowsTable){
+            var self = this;
+            self.rowsData = rowsTable;
+            var table = this.$el.find('#table');
+            table.bootstrapTable('load',rowsTable);
+        },
+
+        getObjetPdf: function(rowsTable){
+            var self = this;
+            var rows=self.rowsData;
+
+            return rows;
+        },
+
+        clickOnAction: function (e) {
+            var self = this;
+            var rowsNew;
+            var action = self.$el.find(e.target).val();
+            var table = self.$el.find("#table");
+            var data2 = table.bootstrapTable('getVisibleColumns');
+            var getColumns=[];
+            var rows=[];
+            rowsNew = self.getObjetPdf();
             if (action === 'pdf') {
                 var dataNEW = _.map(data2, function (val){
                     return val.field;
@@ -708,30 +737,25 @@ function report_libro_ventapos_dental(reporting){
             var desde =(this.$el.find('#from').val());
             var hasta =(this.$el.find('#to').val());
             var totalPagesExp = "{total_pages_count_string}";
-            var pdfDoc = new jsPDF("l");
+            var pdfDoc = new jsPDF();
 
             pdfDoc.autoTable(getColumns, rows, {
                 styles: { overflow: 'linebreak', fontSize: 7, columnWidth: 'wrap'},
                 columnStyles: {
-                    number : {columnWidth: 60},
-                    partner : {columnWidth: 65},
-                    ruc : {columnWidth: 18},
+                    number : {columnWidth: 35},
+                    ruc : {columnWidth: 23},
+                    partner : {columnWidth: 55},
                     date_invoice : {columnWidth: 17},
-                    amount_tax : {halign:'right',columnWidth: 18},
-                    amount_untaxed : {halign:'right',columnWidth: 19},
-                    amount_exentas : {halign:'right',columnWidth: 19},
-                    ref_iva : {columnWidth: 16},
-                    ref_renta : {columnWidth: 16},
-                    amount_total : {halign:'right',columnWidth: 19},
-                    journal_name : {columnWidth: 15},
-                    user : {halign:'left',columnWidth: 13},
+                    amount_total : {halign:'right',columnWidth: 23},
+                    journal_name : {columnWidth: 35},
+                    user : {halign:'left',columnWidth: 19},
                 },
                 margin: { top: 16, horizontal: 7},
                 addPageContent: function (data) {
                     pdfDoc.setFontSize(12);
                     pdfDoc.setFontStyle('bold');
                     pdfDoc.setTextColor(40);
-                    pdfDoc.text('Libro de Ventas ', data.settings.margin.left, 10);
+                    pdfDoc.text('Histórico de Ventas ', data.settings.margin.left, 10);
 
                     var fecha = '';
 
@@ -769,7 +793,7 @@ function report_libro_ventapos_dental(reporting){
             if (typeof pdfDoc.putTotalPages === 'function') {
                 pdfDoc.putTotalPages(totalPagesExp);
             }
-            pdfDoc.save('Libro de Ventas.pdf')
+            pdfDoc.save('Histórico de Ventas.pdf')
         },
     });
 }

+ 631 - 0
static/src/js/reports/report_sale_vendor.js

@@ -0,0 +1,631 @@
+function report_sale_vendor (reporting){
+
+    var instance = openerp;
+
+    reporting.ReportSaleVendorWidget = reporting.Base.extend({
+        template :'ReportSaleVendor',
+        accountVoucher:[],
+        resCurrency:[],
+        accountJournal:[],
+        dataVoucher:[],
+        currencyRate:[],
+        resCompany:[],
+        modules:[],
+
+        events:{
+            'click #toolbar > button' : 'clickOnAction',
+            'click #X' : 'fectSearch',
+            'click #A' : 'fectSearch',
+            'click #B' : 'fectSearch',
+            'click #C' : 'fectSearch',
+            'click #D' : 'fectSearch',
+            'click #Z' : 'fectSearch',
+
+            'click #Y' : 'fectSearch',
+            'change #current-journal': 'fectSearch',
+            'change #current-warehouse': 'fectSearch',
+            'change #current-currency': 'fectSearch',
+            'change #from' : 'fectSearch',
+            'change #to': 'fectSearch',
+            'click #volver_btn': 'volver',
+        },
+
+        init:function(parent){
+            this._super(parent);
+        },
+        start: function(){
+            var self = this;
+            var table = this.$el.find('#table');
+            table.bootstrapTable({data : self.dataVoucher});
+            self.fecthFecha();
+            self.fecthInitial();
+        },
+        // Redirecionar
+        renderReport: function () {
+            var self = this;
+
+            var container = this.$el.closest('.oe_form_sheet.oe_form_sheet_width');
+            this.$el.closest('.report_view').remove();
+            container.find('.report_view').show({
+                effect: 'fade',
+                duration: 200,
+            });
+        },
+        // Verificar el modelo
+        checkModel : function(model){
+            var self = this;
+            return _.filter(self.modules,function(item){return item.name === model});
+        },
+        // Lanzar el mensaje
+        showMensaje : function(modelos){
+            var self = this;
+            $("#dialog" ).dialog({
+                autoOpen: true,
+                resizable: false,
+                modal: true,
+                title: 'Atención',
+                width: 500,
+                open: function() {
+                    $(this).html('Reporte in-disponible, contacte con el administrador del sistema ref : '+modelos);
+                },
+                show: {
+                    effect: "fade",
+                    duration: 200
+                },
+                hide: {
+                    effect: "fade",
+                    duration: 200
+                },
+                buttons: {
+                    Aceptar: function() {
+                        $(this).dialog('close');
+                        self.renderReport()
+                    }
+                }
+            });
+            return
+        },
+
+        //  Metodo inicial
+        fecthInitial: function(){
+            var self = this;
+            self.fecthIrModuleModule().then(function(modules){
+                self.modules = modules;
+                return modules;
+            }).then(function(modules){
+                return self.fecthJournalStore();
+            }).then(function(accountJournal){
+                self.accountJournal=accountJournal;
+                self.$el.find('#current-journal').append('<option value="9999999">Todas las SUC.</option>');
+                _.each(accountJournal,function(item){
+                    self.$el.find('#current-journal').append('<option value="' + item.id + '">' + item.name + '</option>');
+                });
+                return self.fetchResCurrency();
+             }).then(function(ResCurrency){
+                self.ResCurrency = ResCurrency;
+                return self.fecthCompanyCurrency();
+            }).then(function(ResCompany){
+                self.ResCompany = ResCompany;
+                return self.fecthCurrencyRate();
+            }).then(function(currencyRate){
+                self.currencyRate =currencyRate;
+                return self.fecthVoucher();
+            }).then(function(accountVoucher){
+                self.accountVoucher=accountVoucher;
+                return self.fetchInvoiceV2();
+            }).then(function (invoices){
+               self.invoices = invoices;
+                return self.fetchWarehouse();
+            }).then(function(WareHouse){
+                self.WareHouse=WareHouse;
+                self.$el.find('#current-warehouse').append('<option value="9999999">Todos los vendedores</option>');
+                _.each(WareHouse,function(item){
+                    self.$el.find('#current-warehouse').append('<option value="' + item.id + '">' + item.name + '</option>');
+                });
+                return self.fecthDataVoucher(self.accountVoucher,self.accountJournal);
+            });
+        },
+
+        // Fecha
+        fecthFecha: function() {
+            var to;
+            var dateFormat1 = "mm/dd/yy",
+            from = $( "#from" )
+            .datepicker({
+                dateFormat: "dd/mm/yy",
+                changeMonth: true,
+                numberOfMonths: 1,
+            })
+            .on( "change", function() {
+                to.datepicker( "option", "minDate", getDate(this), "dd/mm/yyyy");
+            });
+            to = $( "#to" ).datepicker({
+                dateFormat: "dd/mm/yy",
+                defaultDate: "+7d",
+                changeMonth: true,
+                numberOfMonths: 1,
+            })
+            .on( "change", function() {
+                from.datepicker( "option", "maxDate", getDate(this));
+            });
+
+            function getDate( element ) {
+                var fechaSel =element.value.split('/');
+                var date;
+                try {
+                    date = $.datepicker.parseDate( dateFormat1, (fechaSel[1]+"/"+fechaSel[0]+"/"+fechaSel[2]));
+                } catch( error ) {
+                    date = null;
+                }
+                return date;
+            }
+        },
+
+        // Modelos instalados
+        fecthIrModuleModule: function(){
+            var self = this;
+            var defer = $.Deferred();
+            var fields = ['name','id'];
+            var domain=[['state','=','installed']];
+            var irModule = new instance.web.Model('ir.module.module');
+
+            irModule.query(fields).filter(domain).all().then(function(results){
+                defer.resolve(results);
+            });
+            return defer;
+        },
+        // Journal
+        fecthJournalStore: function(){
+            var self = this;
+            var defer = $.Deferred();
+            var modules = _.flatten(self.checkModel('multi_store'));
+
+            if (modules.length <= 0){
+                self.showMensaje('multi_store');
+                return defer;
+            }
+
+            var journal = new instance.web.Model('res.store');
+            var field=['id', 'name','journal_ids'];
+
+            journal.query(field).order_by('id').all().then(function(results){
+                defer.resolve(results);
+            });
+            return defer;
+        },
+        // company_curency
+        fecthCompanyCurrency: function(){
+            var self = this;
+            var defer = $.Deferred();
+            var field=['id','name', 'currency_id', 'vat'];
+            var domain = [['id', '=', self.session.company_id]];
+            var ResCompany = new instance.web.Model('res.company');
+            ResCompany.query(field).filter(domain).all().then(function(results){
+                defer.resolve(results);
+            });
+            return defer;
+        },
+        // Moneda
+        fetchResCurrency:function(){
+            var self = this;
+            var defer = $.Deferred();
+            var ResCurrency = new instance.web.Model('res.currency');
+            var fields = ['id','name', 'symbol', 'rate_silent', 'base', 'decimal_separator', 'decimal_places', 'thousands_separator', 'symbol_position'];
+            var domain = [['active','=', true]];
+            ResCurrency.query(fields).filter(domain).order_by('id').all().then(function(results){
+                defer.resolve(results);
+            });
+            return defer;
+        },
+        // Cambio de la moneda
+        fecthCurrencyRate:function(){
+            var defer = $.Deferred();
+            var currency_Rate = new instance.web.Model('res.currency.rate');
+            var fields = ['id', 'name', 'currency_id', 'rate', 'create_date'];
+            var domain = [['currency_id', 'in', [166 , 20, 7, 3]]];
+            currency_Rate.query(fields).filter(domain).all().then(function (results) {
+              defer.resolve(results);
+            });
+            return defer;
+        },
+        // Invoice (FACTURAS)
+        fetchInvoiceV2: function () {
+            var self = this;
+            var filter ="[['state', 'in',['open','paid']],['type', '=', 'out_invoice']";
+            var journal_ids = _.flatten(_.map(self.AccountJournal, function (item) {
+                return item.id;
+            }));
+            if (journal_ids){
+                filter=filter.concat(",['journal_id', 'in',["+journal_ids+"]]");
+            }
+            filter=filter.concat("]");
+            var field =['id', 'type', 'number', 'origin', 'reference', 'state', 'journal_id', 'currency_id', 'user_id','date_invoice','amount_total','amount_tax','amount_untaxed','partner_id'];
+            var defer = $.Deferred();
+            var invoices = new instance.web.Model('account.invoice');
+            invoices.query(field).filter(filter).all().then(function (results) {
+                defer.resolve(results);
+            });
+            return defer;
+        },
+
+        // Voucher -
+        fecthVoucher: function () {
+             var self = this;
+             var defer = $.Deferred();
+             var voucher = new instance.web.Model('sale.order');
+             var filter = [['state', 'in', ['progress','done']],['shipped', '=', true]];
+             // var warehouse_ids = _.flatten(_.map(self.WareHouse, function (item) {
+             //     return item.id;
+             // }));
+             // if (warehouse_ids){
+             //     filter=filter.concat(",['warehouse_id', 'in',["+ warehouse_ids+"]]");
+             // }
+             // filter=filter.concat("]");
+             var field =['id', 'number', 'name','origin', 'state', 'type_id', 'warehouse_id', 'currency_id', 'amount_total', 'date_order', 'shipped'];
+             voucher.query(field).filter(filter).all().then(function (results) {
+                 defer.resolve(results);
+             });
+             return defer;
+         },
+
+        fetchWarehouse: function(){
+            var self = this;
+            var defer = $.Deferred();
+            var field=['id', 'name'];
+            var WareHouse = new instance.web.Model('stock.warehouse');
+            WareHouse.query(field).all().then(function(results){
+                defer.resolve(results);
+            });
+            return defer;
+         },
+
+         getResCurrency: function (id) {
+             var self = this;
+             return _.filter(self.ResCurrency,function (item) {
+                 return item.id === id;
+             })
+         },
+
+         getSaleOrder: function (id) {
+             var self = this;
+             return _.filter(self.accountVoucher,function (item) {
+                 return item.number === id;
+             });
+         },
+
+        // Verificar Valor null
+        valorNull:function(dato){
+            var valor ="";
+            if (dato){
+                valor=dato;
+            }
+            return valor;
+        },
+
+        // Join object
+        fecthDataVoucher:function(objVoucher,objJournal){
+            var self=this;
+            var CurrencyBase = self.getResCurrency(self.ResCompany[0].currency_id[0]).shift();
+            var item;
+            var journal;
+            var voucherLine;
+            var voucherItem;//Contenido del voucher
+            var sumaAmount; //Guardar la suma de los pagos
+            var voucherObject=[];
+            var voucherObjectItem=[];
+            var sale = [];
+            var cutrrencyRate; //Valor del cambio
+            var total=0;
+            var sumaAmountTot=0;
+            var  itemVoucher;
+
+            for (var i = 0; i < objJournal.length; i++) {
+                voucherObjectItem=[];
+                journal=objJournal[i];
+
+                for (var f = 0; f < journal.journal_ids.length; f++) {
+                    voucherLine = journal.journal_ids[f];
+                    voucherItem = self.getVoucherjournal(objVoucher,voucherLine)
+
+                    // sale = self.getSaleOrder(voucherItem.name);
+                    // console.log(sale);
+
+                    if (voucherItem.length > 0){
+                         sumaAmount=_.reduce(_.map(voucherItem,function(item){return item.amount_total}), function(memo, num){ return memo + num; },0);
+                         itemVoucher = voucherItem.shift();
+                         var currency = self.getResCurrency(itemVoucher.currency_id[0]).shift();
+
+                         // Guardar item
+                         voucherObjectItem.push({journal : " ",
+                                 method  :self.valorNull(itemVoucher.warehouse_id[1]),
+                                 amount  : accounting.formatNumber(self.valorNull(sumaAmount * (CurrencyBase.rate_silent/currency.rate_silent)),0, ".", ","),
+                                 currency_name : self.valorNull(itemVoucher.currency_id[0]),
+                                 currency_id : self.valorNull(itemVoucher.currency_id[1]),
+                                 amountBase : self.valorNull(sumaAmount * (CurrencyBase.rate_silent/currency.rate_silent)),
+                                 journal_id: journal.id,
+                                 journal_name: journal.name,
+                                 warehouse_id: itemVoucher.warehouse_id[0],
+                                 graficar: false
+                         })
+                     }
+                 }
+                 if (voucherObjectItem.length > 0){
+                     var company = _.map(self.ResCompany, function (map) {
+                         return map.currency_id[1];
+                     });
+
+                     sumaAmountTot=_.reduce(_.map(voucherObjectItem,function(item){return (item.amountBase)}), function(memo, num){ return memo + num; },0);
+                     total=total+sumaAmountTot;
+                     voucherObjectItem.push({journal : " ",
+                         method  :"Total " + company,
+                         amount  : accounting.formatNumber(self.valorNull(sumaAmountTot),0, ".", ","),
+                         currency_name : "",
+                         currency_id : "",
+                         rate : "cutrrencyRate.rate",
+                         amountBase:"",
+                         journal_id: journal.id,
+                         journal_name: journal.name,
+                         graficar: true
+                     });
+
+                    // General la Cabezera
+                    voucherObjectItem.unshift({ journal : journal.name, method  :"", amount  :"", voucherLine_name :"", voucherLine_id :"",rate :"",amountBase :"", warehouse_id:"",journal_id:journal.id, journal_name:journal.name, graficar:false});
+                    // Generar Objeto Principal
+                    voucherObject=voucherObject.concat(voucherObjectItem);
+                }
+            }
+            if (voucherObject.length >0){
+                voucherObject.push({journal : " Total de Egreso",
+                    method  :"",
+                    amount  : accounting.formatNumber(self.valorNull(total),0, ".", ","),
+                    currency_name : "",
+                    currency_id : "",
+                    rate : "",
+                    amountBase:"",
+                    journal_id: journal.id,
+                    journal_name: journal.name,
+                    warehouse_id:"",
+                    graficar: false
+                });
+            }
+            self.loadTable(voucherObject);
+            self.content = voucherObject;
+        },
+        // Obtener Voucher
+        getVoucherjournal:function(objVoucher,journal_id){
+            return _.map(_.filter(objVoucher, function (inv){return inv.warehouse_id[0] === journal_id}),function(item){return item});
+        },
+        // Obtener Cambio
+        // getCutrrencyRate: function(currency_id){
+        //     return _.filter(this.currencyRate, function(rate){return rate.currency_id[0] === currency_id}).shift();
+        // },
+        // Generar la tabla
+        loadTable:function(rowsTable){
+            this.dataVoucher=rowsTable;
+            var table = this.$el.find('#table');
+            table.bootstrapTable('load' ,rowsTable);
+        },
+        // Buscar
+        fectSearch: function(){
+            var self = this;
+            var today = moment().format('YYYY-MM-DD');
+            var yesterday = moment().add(-1, 'days').format('YYYY-MM-DD');
+            var month = moment().format('YYYY-MM');
+            var last_month = moment().add(-1, 'months').format('YYYY-MM');
+            var desde =this.$el.find('#from').val();
+            var hasta =this.$el.find('#to').val();
+            var journal =this.$el.find('#current-journal').val();
+            var currency =this.$el.find('#current-currency').val();
+            var newJournal= self.accountJournal; //copia del Diario
+            var newVoucher= self.accountVoucher; //copia del Vouacher
+
+            if ($('#A').is(":checked")){
+                newVoucher = _.filter(newVoucher, function (inv){
+                    return inv.date_order == today;
+                });
+            }
+            if ($('#B').is(":checked")){
+                newVoucher = _.filter(newVoucher, function (inv){
+                    return moment(inv.date_order).format('YYYY-MM-DD') == yesterday;
+                });
+            }
+            if ($('#C').is(":checked")){
+                newVoucher = _.filter(newVoucher, function (inv){
+                    return moment(inv.date_order).format('YYYY-MM') == month;
+                });
+            }
+            if ($('#D').is(":checked")){
+                newVoucher = _.filter(newVoucher, function (inv){
+                    return moment(inv.date_order).format('YYYY-MM') == last_month;
+                });
+            }
+
+            if ($('#Z').is(":checked")){
+                $('#datepicker').css('display','block');
+                if (desde.length > 0){
+                    var date= desde.split('/');
+                    newVoucher = _.filter(newVoucher, function (inv){
+                        return inv.date_order >= (date[2]+"-"+date[1]+"-"+date[0]);
+                    });
+                }
+                if (hasta.length > 0){
+                    var date= hasta.split('/');
+                    newVoucher = _.filter(newVoucher, function (inv){
+                        return inv.date_order <= (date[2]+"-"+date[1]+"-"+date[0]);
+                    });
+                }
+            }else{
+                $('#datepicker').css('display','none');
+            }
+
+            if (journal != 9999999){
+                var botonChart =this.$el.find('#chart').attr("disabled", true);
+                 newJournal=_.filter(newJournal, function (inv){ return inv.id == journal});
+            }else {
+                var botonChart =this.$el.find('#chart').attr("disabled", false);
+            }
+            self.fecthDataVoucher(newVoucher,newJournal);
+        },
+        // volver
+        volver: function(){
+            this.$el.find('#volver').empty();
+            this.$el.find('#grafico').empty();
+            this.$el.find('.bootstrap-table').show({
+                effect: 'drop',
+                direction: 'down',
+                duration: 200,
+            });
+            this.$el.find('#toolbar').show({
+                effect: 'drop',
+                direction: 'down',
+                duration: 200,
+            });
+        },
+        // Click pdf -Grafic
+        clickOnAction: function (e) {
+            var action = this.$el.find(e.target).val();
+            var self = this;
+            var getColumns=[];
+            var rows=[];
+            var table = this.$el.find("#table");
+            var data2 = table.bootstrapTable('getVisibleColumns');
+            if (action === 'pdf') {
+              var dataNEW = _.map(data2, function (val){ return val.field});
+              _.each(this.dataVoucher,function (item){
+                        rows.push(_.pick(item, dataNEW));
+              });
+              // Obtener los nombre de la Cabezera
+              _.each(_.map(data2,function(val){return val}), function(item){
+                 getColumns.push([{title: item.title, dataKey: item.field}]);
+              });
+              // Llamar al pdf
+              this.drawPDF(_.flatten(getColumns),rows)
+            }
+            // if (action === 'chart'){
+            //     var self = this;
+            //     var objetChar;
+            //     objetChar = _.filter(self.dataVoucher,function(item){return item.graficar === true});
+            //     self.fectCharFilter(objetChar);
+            // }
+        },
+        // pdfDoc
+        drawPDF:function(getColumns,rows){
+            var self = this;
+            var fechaActu= new Date();
+            var sucusal = this.sucDescrip = this.$el.find('#current-journal option:selected').text();
+            var desde =(this.$el.find('#from').val());
+            var hasta =(this.$el.find('#to').val());
+            var totalPagesExp = "{total_pages_count_string}";
+            var pdfDoc = new window.jsPDF();
+
+            pdfDoc.autoTable(getColumns, rows, {
+                    styles: { overflow: 'linebreak', fontSize:10 , columnWidth: 'wrap'},
+                    columnStyles:{journal: {fontStyle: 'bold'},
+                                  method :{columnWidth: '10px'},
+                                  amount : {halign:'right'},
+                                },
+                    margin: { top: 16, horizontal: 7},
+                    addPageContent: function (data) {
+                        pdfDoc.setFontSize(12);
+                        pdfDoc.setFontStyle('bold');
+                        pdfDoc.setTextColor(40);
+                        pdfDoc.text('Resumen de Egreso de '+ sucusal, data.settings.margin.left, 10);
+                        if(desde.length > 0 || hasta.length > 0){
+                            var fecha='';
+                            if(desde){
+                                fecha=fecha.concat(' Desde '+desde);
+                            }
+                            if (hasta){
+                                fecha=fecha.concat(' Hasta '+hasta);
+                            }
+                            pdfDoc.setFontSize(10);
+                            pdfDoc.setFontStyle('bold');
+                            pdfDoc.setTextColor(40)
+                            pdfDoc.text(fecha, data.settings.margin.left,14);
+                        }
+                        // FOOTER
+                        var str = "Pagina  " + data.pageCount;
+                        // Total page number plugin only available in jspdf v1.0+
+                        if (typeof pdfDoc.putTotalPages === 'function') {
+                            str = str + " de " + totalPagesExp +"\n  Día de Expedición  "+fechaActu.getDate()+"/"+fechaActu.getMonth()+"/"+fechaActu.getFullYear();
+                        }
+                        pdfDoc.setFontSize(9);
+                        pdfDoc.setFontStyle('bold');
+                        pdfDoc.setTextColor(40);
+                        pdfDoc.text(str, data.settings.margin.left, pdfDoc.internal.pageSize.height - 5);
+                    }
+                });
+                if (typeof pdfDoc.putTotalPages === 'function') {
+                    pdfDoc.putTotalPages(totalPagesExp);
+                }
+                pdfDoc.save('Resumen de Egreso.pdf');
+            },
+        // // Char filter
+        // fectCharFilter: function(objetChar){
+        //     var self = this;
+        //     var dataBody=[];
+        //     var dataHeader=[];
+        //     // objetChar
+        //     var canvas="<canvas id='graf_resume'></canvas>";
+        //       this.$el.find('#grafico').append(canvas);
+        //     _.each(objetChar,function(voucher){
+        //         dataHeader.push(voucher.journal_name);
+        //         dataBody.push(parseFloat(((voucher.amount.replace(".","")).replace(",","."))));
+        //     });
+        //   var selector ="<button type='button' class='oe_button oe_form_button oe_highlight' id='volver_btn' name='volver_btn'><span>Atras</span></button>";
+        //   this.$el.find('#volver').append(selector);
+        //   this.$el.find('.bootstrap-table').hide({
+        //       effect: 'drop',
+        //       direction: 'up',
+        //       duration: 200,
+        //       complete: function () {
+        //         self.drawChart(dataHeader,dataBody);
+        //       }
+        //   });
+        //   this.$el.find('#toolbar').hide({
+        //       effect: 'drop',
+        //       direction: 'up',
+        //       duration: 200,
+        //       complete: function () {
+        //         self.drawChart(dataHeader,dataBody);
+        //       }
+        //   });
+        // },
+        // //Chart
+        // drawChart: function (dataHeader,dataBody) {
+        //     var barChart = new Chart(this.$el.find('#graf_resume'), {
+        //         type: 'doughnut',//bar, doughnut
+        //         data: {
+        //             labels: dataHeader,
+        //             datasets: [
+        //                 {
+        //                     labels: dataHeader,
+        //                     backgroundColor: [
+        //                         'rgba(255, 99, 132, 0.2)',
+        //                         'rgba(54, 162, 235, 0.2)',
+        //                         'rgba(255, 206, 86, 0.2)',
+        //                         'rgba(75, 192, 192, 0.2)',
+        //                         'rgba(153, 102, 255, 0.2)',
+        //                     ],
+        //                     borderColor: [
+        //                         'rgba(255,99,132,1)',
+        //                         'rgba(54, 162, 235, 1)',
+        //                         'rgba(255, 206, 86, 1)',
+        //                         'rgba(75, 192, 192, 1)',
+        //                         'rgba(153, 102, 255, 1)',
+        //                     ],
+        //                     borderWidth: 1,
+        //                     data: dataBody,
+        //                 }
+        //             ]
+        //         },
+        //         options: {
+        //             maintainAspectRatio: false,
+        //             layout: {
+        //                 padding: 30
+        //             }
+        //         },
+        //     });
+        // },
+    });
+}

+ 517 - 0
static/src/js/reports/reporting_accountpending_dental.js

@@ -0,0 +1,517 @@
+function reporting_accountpending_dental(reporting){
+    "use strict";
+
+    var instance = openerp;
+
+    reporting.ReportingAccountPendingDentalWidget = reporting.Base.extend({
+        template: 'ReportingAccountPendingDental',
+        AccountVoucher: [],
+        content:[],
+        rowsData :[],
+        ResUser:[],
+        moveLine: [],
+        resCompany: [],
+        resCurrecy: [],
+        AccountJournal: [],
+        content: [],
+        modelId: [],
+        accountInvoice: [],
+
+        events:{
+            'click #toolbar > button' : 'clickOnAction',
+
+            'click #X' : 'factSearch',
+            'click #A' : 'factSearch',
+            'click #B' : 'factSearch',
+            'click #C' : 'factSearch',
+            'click #D' : 'factSearch',
+            'click #Z' : 'factSearch',
+
+            'click #Y' : 'factSearch',
+
+            'click #W' : 'factSearch',
+            'click #vencidos' : 'factSearch',
+            'click #novencidos' : 'factSearch',
+
+            'change #current-journal' : 'factSearch',
+            'change #current-warehouse' : 'factSearch',
+            'change #partner': 'factSearch',
+            'change #from' : 'factSearch',
+            'change #to' : 'factSearch',
+            'click #volver_btn': 'volver',
+            'click-row.bs.table #table ' : 'clickAnalysisDetail',
+        },
+        init : function(parent){
+            this._super(parent);
+        },
+        start: function () {
+            var self = this;
+            var table = this.$el.find('#table');
+            table.bootstrapTable({data : self.rowsData});
+            this.fecthFecha();
+            this.submitForm();
+        },
+        valorNull:function(dato){
+            var valor ="";
+            if (dato){
+                valor=dato;
+            }
+            return valor;
+        },
+        clickAnalysisDetail: function(e, row, $element, field){
+            if (field == 'reference'){
+                this.do_action({
+                    name:"Factura",
+                    type: 'ir.actions.act_window',
+                    res_model: "account.invoice",
+                    views: [[false,'form']],
+                    target: 'new',
+                    domain: [['id','=', row.invoice_id]],
+                    context: {},
+                    flags: {'form': {'action_buttons': false, 'options': {'mode': 'view'}}},
+                    res_id: row.invoice_id,
+                });
+            }
+            if (field === 'partner'){
+                this.do_action({
+                    name:"Registro",
+                    type: 'ir.actions.act_window',
+                    res_model: "res.partner",
+                    views: [[false,'form']],
+                    target: 'new',
+                    domain: [['id','=', row.partner_id]],
+                    context: {},
+                    flags: {'form': {'action_buttons': false, 'options': {'mode': 'view'}}},
+                    res_id: row.partner_id,
+                });
+            }
+            e.stopImmediatePropagation();
+        },
+        submitForm: function () {
+            var self = this;
+            self.fetchAccountJournal().then(function(AccountJournal) {
+                return AccountJournal;
+            }).then(function(AccountJournal) {
+                self.AccountJournal = AccountJournal;
+                return self.fetchMoveLine();
+            }).then(function (moveLine) {
+                self.moveLine = _.filter(moveLine, function(item) {
+                    return item.amount_residual > 0;
+                });
+                return self.fetchInvoice(moveLine);
+            }).then(function(accountInvoice) {
+                self.accountInvoice = accountInvoice;
+                return self.fetchSaleOrder();
+            }).then(function (SaleOrder){
+               self.SaleOrder = SaleOrder;
+               return self.fetchWarehouse();
+            }).then(function (Warehouse){
+               self.Warehouse = Warehouse;
+               self.$el.find('#current-warehouse').append('<option value="9999999">Todos los Vendedores</option>');
+               _.each(Warehouse,function(item){
+                   self.$el.find('#current-warehouse').append('<option value="' + item.id + '">' + item.name + '</option>');
+               });
+                return self.fetchResPartner();
+            }).then(function(ResPartner){
+                self.ResPartner=ResPartner;
+                return self.fetchGetModelId();
+            }).then(function(modelId) {
+                self.modelId= modelId;
+                self.search();
+                return self.fetchReduceMoveLine();
+            });
+        },
+
+        // getModelId
+        fetchGetModelId: function() {
+            var self = this;
+            var defer = $.Deferred();
+            var irModelData = new instance.web.Model('ir.model.data');
+            var getObtjectReference = irModelData.get_func('get_object_reference');
+
+            this.alive(getObtjectReference('account', 'invoice_form')).then(function(results) {
+                defer.resolve(results);
+            });
+
+            return defer;
+        },
+
+        volver: function(){
+            this.$el.find('#volver').empty();
+            this.$el.find('.bootstrap-table').show({
+                effect: 'drop',
+                direction: 'down',
+                duration: 200,
+            });
+        },
+
+        fecthFecha: function() {
+            var to;
+            var dateFormat1 = "mm/dd/yy",
+            from = $( "#from" )
+            .datepicker({
+                dateFormat: "dd/mm/yy",
+                changeMonth: true,
+                numberOfMonths: 1,
+            })
+            .on( "change", function() {
+                to.datepicker( "option", "minDate", getDate(this), "dd/mm/yyyy");
+            });
+            to = $( "#to" ).datepicker({
+                dateFormat: "dd/mm/yy",
+                defaultDate: "+7d",
+                changeMonth: true,
+                numberOfMonths: 1,
+            })
+            .on( "change", function() {
+                from.datepicker( "option", "maxDate", getDate(this));
+            });
+
+            function getDate( element ) {
+                var fechaSel =element.value.split('/');
+                var date;
+                try {
+                    date = $.datepicker.parseDate( dateFormat1, (fechaSel[1]+"/"+fechaSel[0]+"/"+fechaSel[2]));
+                } catch( error ) {
+                    date = null;
+                }
+                return date;
+            }
+        },
+        fetchSaleOrder: function () {
+            var self = this;
+            var filter ="[['state', 'in',['progress','done']]]";
+            var warehouse_ids = _.flatten(_.map(self.Warehouse, function (item) {
+                return item.id;
+            }));
+            if (warehouse_ids){
+                filter=filter.concat(",['warehouse_id', 'in',["+ warehouse_ids+"]]");
+            }
+            filter=filter.concat("]");
+            var field =['id', 'number', 'name','origin', 'state', 'warehouse_id'];
+            var defer = $.Deferred();
+            var SaleOrder = new instance.web.Model('sale.order');
+            SaleOrder.query(field).filter(filter).all().then(function (results) {
+                defer.resolve(results);
+            });
+            return defer;
+        },
+
+        fetchWarehouse: function(){
+            var self = this;
+            var defer = $.Deferred();
+            var field=['id', 'name'];
+            var Warehouse = new instance.web.Model('stock.warehouse');
+            Warehouse.query(field).all().then(function(results){
+                defer.resolve(results);
+            });
+            return defer;
+        },
+
+
+        fetchAccountJournal: function() {
+            var self = this;
+            var defer = $.Deferred();
+            var fields = ['id', 'name'];
+            var AccountJournal = new instance.web.Model('account.journal');
+            AccountJournal.query(fields).filter().all().then(function(results) {
+                defer.resolve(results);
+            });
+
+            return defer;
+        },
+
+        // Move line , ['date_maturity', '>=', hoy]
+        fetchMoveLine: function () {
+            var self = this;
+            var hoy = moment().format('YYYY-MM-DD');
+            var defer = $.Deferred();
+            var journal_ids = _.flatten(_.map(this.AccountJournal, function (item) {
+                return item.id;
+            }));
+            var field = ['id', 'partner_id', 'amount_residual', 'credit', 'debit', 'date_maturity', 'ref', 'invoice', 'amount_residual_currency','state'];
+            var domain = [['credit', '<=', 0],['date_maturity', '!=', false],['journal_id','in',journal_ids]];
+            var moveLine = new instance.web.Model('account.move.line');
+
+            moveLine.query(field).filter(domain).all().then(function(results) {
+                defer.resolve(results);
+            });
+
+            return defer;
+        },
+        fetchResPartner: function () {
+            var self = this;
+            var defer = $.Deferred();
+            var ResPartner = new instance.web.Model('res.partner');
+            ResPartner.query(['id','name','ruc']).filter([['active', '=', true],['customer', '=', true]]).all().then(function(results){
+                defer.resolve(results);
+            });
+            return defer;
+        },
+        // invoice
+        fetchInvoice: function(moveline) {
+            var self = this ;
+            var defer = $.Deferred()
+            var ref = _.map(moveline, function(map) {
+                return map.invoice[0];
+            });
+            var fields = ['id', 'currency_id', 'number'];
+            var domain = [['id', 'in', ref]];
+            var accountInvoice = new instance.web.Model('account.invoice');
+            accountInvoice.query(fields).filter(domain).all().then(function(results) {
+                defer.resolve(results);
+            });
+
+            return defer;
+        },
+
+        getAccountInvoice: function (id) {
+            var self = this;
+            return _.filter(self.AccountInvoice,function (item) {
+                return item.invoice[0] === id;
+            });
+        },
+
+        getSaleOrder: function (id) {
+            var self = this;
+            return _.filter(self.SaleOrder,function (item) {
+                return item.name === id;
+            });
+        },
+
+        search: function () {
+            var self = this;
+            var results = self.ResPartner;
+            results = _.map(results, function (item) {
+                return {
+                        label: item.id + '-'+ item.name + ' ' + self.valorNull(item.ruc),
+                        value: item.id + '-'+ item.name + ' ' + self.valorNull(item.ruc)
+                }
+            });
+            self.$('#partner').autocomplete({
+                source: results,
+                minLength:0,
+                search: function(event, ui) {
+                    if (!(self.$('#partner').val())){
+                        self.factSearch();
+                    }
+                },
+                close: function( event, ui ) {
+                        self.factSearch();
+                },
+                select: function(event, ui) {
+                    self.factSearch();
+                }
+            });
+        },
+
+        fetchReduceMoveLine: function(){
+            var self = this;
+            var MoveLine = self.moveLine;
+            var invoice;
+            var data = [];
+            var sale = [];
+            _.each(MoveLine, function(item){
+
+                invoice = self.getAccountInvoice(item.invoice[0]);
+                sale = self.getSaleOrder(item.ref);
+                if(sale.length > 0){
+                    data.push({
+                        id : item.id,
+                        reference: item.ref,
+                        number: item.number,
+                        date_maturity: moment(item.date_maturity).format("DD/MM/YYYY"),
+                        partner: item.partner_id[1],
+                        date: item.date_maturity,
+                        amount_residual: accounting.formatNumber(item.amount_residual,0,".",","),
+                        partner_id: item.partner_id[0],
+                        total_residual: item.amount_residual,
+                        user_id : sale[0].warehouse_id[0],
+                        user: sale[0].warehouse_id[1],
+                        invoice_id: item.invoice[0],
+                    });
+                }
+            });
+            self.content = data;
+            this.loadTable(data);
+        },
+        factSearch: function(){
+            var self = this;
+            var today = moment().format('YYYY-MM-DD');
+            var yesterday = moment().add(-1, 'days').format('YYYY-MM-DD');
+            var month = moment().format('YYYY-MM');
+            var last_month = moment().add(-1, 'months').format('YYYY-MM');
+            var desde = this.$el.find('#from').val();
+            var hasta = this.$el.find('#to').val();
+            var partner= this.$el.find('#partner').val().split('-');
+            var warehouse = this.$el.find('#current-warehouse').val();
+            var content = self.content;
+            if ($('#A').is(":checked")){
+                content = _.filter(content, function (inv){
+                    return moment(inv.date).format('YYYY-MM-DD') == today;
+                });
+            }
+            if ($('#B').is(":checked")){
+                content = _.filter(content, function (inv){
+                    return moment(inv.date).format('YYYY-MM-DD') == yesterday;
+                });
+            }
+            if ($('#C').is(":checked")){
+                content = _.filter(content, function (inv){
+                    return moment(inv.date).format('YYYY-MM') == month;
+                });
+            }
+            if ($('#D').is(":checked")){
+                content = _.filter(content, function (inv){
+                    return moment(inv.date).format('YYYY-MM') == last_month;
+                });
+            }
+            if ($('#Z').is(":checked")){
+                $('#datepicker').css('display','block');
+                if (desde.length > 0){
+                    var date= desde.split('/');
+                    content = _.filter(content, function (inv){
+                        return inv.date >= (date[2]+"-"+date[1]+"-"+date[0]);
+                    });
+                }
+                if (hasta.length > 0){
+                    var date= hasta.split('/');
+                    content = _.filter(content, function (inv){
+                        return inv.date <= (date[2]+"-"+date[1]+"-"+date[0]);
+                    });
+                }
+            }else{
+                $('#datepicker').css('display','none');
+            }
+            if (partner != ""){
+                content = _.filter(content, function(inv){
+                    return inv.partner_id == partner[0];
+                });
+            }
+            if (warehouse != 9999999){
+                content = _.filter(content, function(inv){
+                    return inv.user_id == warehouse[0];
+                });
+            }
+            if ($('#vencidos').is(":checked")){
+                content = _.filter(content, function (inv){
+                    return inv.date_maturity < today;
+                });
+            }
+            if ($('#novencidos').is(":checked")){
+                content = _.filter(content, function (inv){
+                    return inv.date_maturity >= today;
+                });
+            }
+
+            var amount_total_amount = _.reduce(_.map(content,function(map){
+                return(map.total_residual);
+            }),function(memo, num){
+                return memo + num;
+            },0);
+
+            content.push({
+                reference: "Total",
+                amount_residual: accounting.formatNumber((amount_total_amount),0,".",","),
+            });
+
+            self.loadTable(content)
+        },
+        loadTable:function(rowsTable){
+            var self = this;
+            self.rowsData = rowsTable;
+            var table = this.$el.find('#table');
+            table.bootstrapTable('load',rowsTable);
+        },
+        getObjetPdf: function(rowsTable){
+            var self = this;
+            var rowsPdf=[];
+            var rows=[];
+            var rows = self.rowsData;
+
+            return rows;
+        },
+        clickOnAction: function (e) {
+            var self = this;
+            var rowsNew;
+            var action = self.$el.find(e.target).val();
+            var table = self.$el.find("#table");
+            var data2 = table.bootstrapTable('getVisibleColumns');
+            var getColumns=[];
+            var rows=[];
+            rowsNew = self.getObjetPdf();
+            if (action === 'pdf') {
+                var dataNEW = _.map(data2, function (val){
+                    return val.field;
+                });
+                _.each(rowsNew,function (item){
+                    rows.push(_.pick(item, dataNEW));
+                });
+                // Obtener los nombre de la Cabezera
+                _.each(_.map(data2,function(val){
+                        return val;
+                    }), function(item){
+                            getColumns.push([{
+                                        title: item.title,
+                                        dataKey: item.field
+                                    }]);
+                });
+                this.drawPDF(_.flatten(getColumns),rows);
+            }
+        },
+        drawPDF: function (getColumns,rows) {
+            var self = this;
+            var desde =(this.$el.find('#from').val());
+            var hasta =(this.$el.find('#to').val());
+            var totalPagesExp = "{total_pages_count_string}";
+            var pdfDoc = new jsPDF();
+
+            pdfDoc.autoTable(getColumns, rows, {
+                styles: { overflow: 'linebreak', fontSize: 8, columnWidth: 'wrap'},
+                columnStyles: {
+                    reference : {columnWidth: '10px'},
+                    partner : {columnWidth: '10px'},
+                    date_maturity : {columnWidth: '6px'},
+                    amount_residual : {halign:'right', columnWidth: '8px'}
+                },
+                margin: { top: 16, horizontal: 7},
+
+                addPageContent: function (data) {
+                    pdfDoc.setFontSize(12);
+                    pdfDoc.setFontStyle('bold');
+                    pdfDoc.setTextColor(40);
+                    pdfDoc.text('Listado de cuentas a cobrar', data.settings.margin.left, 10);
+
+                    if(desde.length > 0 || hasta.length > 0){
+                        var fecha='';
+                        if(desde){
+                            fecha=fecha.concat(' Desde '+desde);
+                        }
+                        if (hasta){
+                            fecha=fecha.concat(' Hasta '+hasta);
+                        }
+                        pdfDoc.setFontSize(10);
+                        pdfDoc.setFontStyle('bold');
+                        pdfDoc.setTextColor(40)
+                        pdfDoc.text(fecha, data.settings.margin.left,14);
+                    }
+                    // FOOTER
+                    var str = "Pagina  " + data.pageCount;
+                    // Total page number plugin only available in jspdf v1.0+
+                    if (typeof pdfDoc.putTotalPages === 'function') {
+                        str = str + " de " + totalPagesExp;
+                    }
+                    pdfDoc.setFontSize(9);
+                    pdfDoc.setFontStyle('bold');
+                    pdfDoc.setTextColor(40);
+                    pdfDoc.text(str, data.settings.margin.left, pdfDoc.internal.pageSize.height - 5);
+                    }
+            });
+
+            if (typeof pdfDoc.putTotalPages === 'function') {
+                pdfDoc.putTotalPages(totalPagesExp);
+            }
+            pdfDoc.save('Listado de cuentas a cobrar.pdf')
+        },
+    });
+}

+ 12 - 78
static/src/reports/report_libro_ventapos_dental.xml

@@ -3,7 +3,7 @@
     <t t-name="ReportLibroVentaPosDental">
         <div class="report_view">
             <div class="reporting_page_header">
-                <h1>Libro de Ventas</h1>
+                <h1>Histórico de Ventas</h1>
             </div>
             <button type="button" class="oe_button oe_form_button oe_highlight" aria-label="Left Align" data-toggle="collapse" href="#collapseExample" aria-expanded="false" aria-controls="collapseExample">FILTRAR
             </button>
@@ -79,95 +79,29 @@
                 <button class="oe_button oe_form_button oe_highlight btn-block" value="pdf">PDF</button>
             </div>
 
-            <table id="table"
+            <table id="table" class="table_paint_first_row"
                 data-pagination="true"
                 data-toggle="table"
+                data-reorderable-columns="true"
                 data-toolbar="#toolbar"
                 data-show-columns="true"
+                data-buttons-class="oe_button oe_form_button oe_highlight"
                 data-height="auto"
-                data-classes="table table-hover table-condensed  table-no-bordered"
+                data-classes="table table-hover table-condensed"
                 data-row-style="rowStyle"
-                data-search="true"
-                data-show-export="true"
-                data-show-toggle="true"
-                data-pagination-detail-h-align="left"
-                data-show-footer="true"
-                data-footer-style="footerStyle"
-                data-buttons-class="oe_button oe_form_button oe_highlight"
-                data-show-pagination-switch="true"
-                data-page-size="10"
-                data-search-on-enter-key="true"
-                data-undefined-text=" "
-                >
+                data-search="true">
+
                 <thead style="background:none;">
                     <tr>
-                        <th data-field="number" data-align="center" data-footer-formatter="Totales" data-sortable="true">N°Factura</th>
-                        <th data-field="ref" data-sortable="true">Ref.</th>
+                        <th data-field="number" data-align="center" data-sortable="true">N°Factura</th>
+                        <th data-field="partner">Cliente</th>
                         <th data-field="date_invoice" data-sortable="true">Fecha</th>
-                        <th data-field="partner" data-sortable="true">Cliente</th>
-                        <th data-field="ruc" data-sortable="true">CIN/RUC</th>
-                        <th data-field="amount_untaxed" data-sortable="true" data-footer-formatter="totalGravadasFormatter" data-align="right">Gravadas</th>
-                        <th data-field="amount_tax" data-sortable="true" data-footer-formatter="totalTaxFormatter" data-align="right">Impuesto</th>
-                        <th data-field="amount_exentas" data-sortable="true" data-footer-formatter="totalExentasFormatter" data-align="right">Exentas</th>
-                        <th data-field="amount_total" data-sortable="true" data-footer-formatter="totalFormatter" data-align="right">Total</th>
-                        <th data-field="ref_iva" data-sortable="true" data-align="right">Ret. Iva</th>
-                        <th data-field="ref_renta" data-sortable="true" data-align="right">Ret. Renta</th>
+                        <th data-field="amount_total" data-sortable="true" data-align="right">Total</th>
+                        <th data-field="journal_name">Metodo de pago</th>
+                        <th data-field="user" data-sortable="true">Vendedor</th>
                     </tr>
                 </thead>
             </table>
-            <script>
-
-                <!--
-                    UNTAXED TOTAL
-                -->
-                function totalGravadasFormatter(rowsTable) {
-                    var total =  _.reduce(_.map(rowsTable,function(item){
-                        return (item.untaxed);
-                    }), function(memo, num){
-                    return memo + num; },0)
-                    return accounting.formatNumber(total,0,'.',',');
-                }
-                <!--
-                    TAXED TOTAL
-                -->
-                function totalTaxFormatter(rowsTable) {
-                    var total =  _.reduce(_.map(rowsTable,function(item){
-                        return (item.tax);
-                    }), function(memo, num){
-                    return memo + num; },0)
-                    return accounting.formatNumber(total,0,'.',',');
-                }
-                <!--
-                    EXENTAS TOTAL
-                -->
-                function totalExentasFormatter(rowsTable) {
-                    var total =  _.reduce(_.map(rowsTable,function(item){
-                        return (item.exentas);
-                    }), function(memo, num){
-                    return memo + num; },0)
-                    return accounting.formatNumber(total,0,'.',',');
-                }
-                <!--
-                    TOTAL
-                -->
-                function totalFormatter(rowsTable) {
-                    var total =  _.reduce(_.map(rowsTable,function(item){
-                        return (item.amount);
-                    }), function(memo, num){
-                    return memo + num; },0)
-                    return accounting.formatNumber(total,0,'.',',');
-                }
-                <!--
-                    FOOTER STYLE
-                -->
-                function footerStyle(row, index) {
-                    return {
-                        css: {
-                          "font-weight": "bold"
-                        }
-                    };
-                };
-            </script>
         </div>
     </t>
 </template>

+ 92 - 0
static/src/reports/report_sale_vendor.xml

@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="ReportSaleVendor">
+        <div class="report_view">
+            <div class="reporting_page_header">
+                <h1>Resumen de Ventas por Vendedores</h1>
+                <div id="volver"></div>
+            </div>
+            <button type="button" class="oe_button oe_form_button oe_highlight" aria-label="Left Align" data-toggle="collapse" href="#collapseExample" aria-expanded="false" aria-controls="collapseExample">FILTRAR
+            </button>
+            <div class="collapse" id="collapseExample">
+                <br/>
+                <div class="row">
+                    <div class="col-xs-6">
+                        <div class="panel panel-default">
+                            <div class="panel-heading">Fechas</div>
+                            <div class="panel-body">
+                                <ul class="list-unstyled">
+                                     <li>
+                                        <input type="radio" name="valores" id="X" value="X" checked="checked"/>
+                                        <label for="X">Sin Filtro</label>
+                                    </li>
+                                    <li>
+                                        <input type="radio" name="valores" id="A" value="A"/>
+                                        <label for="A">Hoy</label>
+                                    </li>
+                                    <li>
+                                        <input type="radio" name="valores" id="B" value="B"/>
+                                        <label for="B">Ayer</label>
+                                    </li>
+                                    <li>
+                                        <input type="radio" name="valores" id="C" value="C"/>
+                                        <label for="C">Mes Actual</label>
+                                    </li>
+                                    <li>
+                                        <input type="radio" name="valores" id="D" value="D"/>
+                                        <label for="D">Mes Pasado</label>
+                                    </li>
+                                    <li>
+                                        <input type="radio" name="valores" id="Z" value="Z"/>
+                                        <label for="Z">Busqueda Avanzada</label>
+                                    </li>
+                                </ul>
+                                <div id="datepicker" style="display:none;" class="container">
+                                    <label for="from">Desde: </label>
+                                    <input type="text"  id="from" name="from"/>
+                                    <label for="to" >Hasta: </label>
+                                    <input type="text"  id="to" name="to" />
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="col-xs-6">
+                        <div class="panel panel-default">
+                            <div class="panel-heading">Características</div>
+                            <div class="panel-body">
+                                <div class="form-group">
+                                    <label for="current-journal">Sucursal: </label>
+                                    <select id="current-journal" class="form-control ui-autocomplete-input"  name="journal"></select>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div id="toolbar">
+                <button class="oe_button oe_form_button oe_highlight" value="pdf" id="pdf">PDF</button>
+                <!-- <button class="oe_button oe_form_button oe_highlight" value="chart" id="chart">Graficar</button> -->
+            </div>
+            <table id="table"
+                data-classes="table table-hover table-condensed"
+                data-buttons-class="oe_button oe_form_button oe_highlight"
+                data-reorderable-columns="true"
+                data-height="auto"
+                data-pagination="false"
+                data-show-columns="true"
+                data-toolbar="#toolbar"
+                data-id-field="number"
+                data-row-style="rowStyle">
+                <thead >
+                    <tr>
+                        <th data-field="journal" class="sucursal" >Sucursal</th>
+                        <th data-field="method" >Vendedor</th>
+                        <th data-field="amount" data-align="right" >Monto</th>
+                    </tr>
+                </thead>
+            </table>
+            <!-- <div class="widget-content" id="grafico"></div> -->
+            <div id="dialog"></div>
+        </div>
+    </t>
+</template>

+ 118 - 0
static/src/reports/reporting_accountpending_dental.xml

@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="ReportingAccountPendingDental">
+        <div class="report_view">
+            <div class="reporting_page_header">
+                <h1>Listado de cuentas a cobrar</h1>
+            </div>
+            <button type="button" class="oe_button oe_form_button oe_highlight" aria-label="Left Align" data-toggle="collapse" href="#collapseExample" aria-expanded="false" aria-controls="collapseExample">FILTRAR
+            </button>
+            <div class="collapse" id="collapseExample">
+                <br/>
+                <div class="row">
+                    <div class="col-xs-6">
+                        <div class="panel panel-default">
+                            <div class="panel-heading">Fechas</div>
+                            <div class="panel-body">
+                                <ul class="list-unstyled">
+                                    <li>
+                                        <input type="radio" name="valores" id="X" value="X" checked="checked"/>
+                                        <label for="X">Sin Filtro</label>
+                                    </li>
+                                    <li>
+                                        <input type="radio" name="valores" id="A" value="A"/>
+                                        <label for="A">Hoy</label>
+                                    </li>
+                                    <li>
+                                        <input type="radio" name="valores" id="B" value="B"/>
+                                        <label for="B">Mañana</label>
+                                    </li>
+                                    <li>
+                                        <input type="radio" name="valores" id="C" value="C"/>
+                                        <label for="C">Mes Actual</label>
+                                    </li>
+                                    <li>
+                                        <input type="radio" name="valores" id="D" value="D"/>
+                                        <label for="D">Mes Próximo</label>
+                                    </li>
+                                    <li>
+                                        <input type="radio" name="valores" id="Z" value="Z"/>
+                                        <label for="Z">Busqueda Avanzada</label>
+                                    </li>
+                                </ul>
+                                <div id="datepicker" style="display:none;" class="container">
+                                    <label for="from">Desde: </label>
+                                    <input type="text"  id="from" name="from"/>
+                                    <label for="to" >Hasta: </label>
+                                    <input type="text"  id="to" name="to" />
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+
+                    <div class="col-xs-6">
+                        <div class="panel panel-default">
+                            <div class="panel-heading">Características</div>
+                            <div class="panel-body">
+                                <div class="col-xs-12">
+                                    <div class="form-group">
+                                        <label for="partner">Buscar Cliente:</label>
+                                        <input id="partner" type="text" class="form-control ui-autocomplete-input" autocomplete="off" placeholder="Nombre/ CI/ Ruc"/>
+                                    </div>
+                                    <div class="form-group">
+                                        <label for="current-warehouse">Vendedor: </label>
+                                        <select id="current-warehouse" class="form-control ui-autocomplete-input" name="warehouse"></select>
+                                    </div>
+                                </div>
+                                <div class="col-xs-12">
+                                    <h3>Cuentas a Cobrar</h3>
+                                    <ul class="list-unstyled">
+                                        <li>
+                                            <input type="radio" name="estado" id="W" value="W" checked="checked"/>
+                                            <label for="W">Sin Filtro</label>
+                                        </li>
+                                        <li>
+                                            <input type="radio" name="estado" id="novencidos" value="novencidos"/>
+                                            <label for="novencidos">No Vencidos</label>
+                                        </li>
+                                        <li>
+                                            <input type="radio" name="estado" id="vencidos" value="vencidos"/>
+                                            <label for="vencidos">Vencidos</label>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div id="toolbar">
+                <button class="oe_button oe_form_button oe_highlight" value="pdf" id="pdf">PDF</button>
+            </div>
+            <table id="table" class="table_paint_first_row"
+                data-pagination="true"
+                data-toggle="table"
+                data-reorderable-columns="true"
+                data-toolbar="#toolbar"
+                data-show-columns="true"
+                data-buttons-class="oe_button oe_form_button oe_highlight"
+                data-height="auto"
+                data-classes="table table-hover table-condensed"
+                data-row-style="rowStyle"
+                data-search="true">
+                <thead>
+                    <tr>
+                        <th data-field="reference" data-sortable="true">Nro Factura</th>
+                        <th data-field="partner" data-sortable="true">Cliente</th>
+                        <th data-field="date_maturity" data-sortable="true">Vence</th>
+                        <th data-field="amount_residual" data-sortable="true" data-align="right">Monto</th>
+                        <th data-field="user" data-sortable="true">Vendedor</th>
+                    </tr>
+                </thead>
+            </table>
+            <canvas></canvas>
+            <div id="dialog"></div>
+        </div>
+    </t>
+    </template>

+ 7 - 0
templates.xml

@@ -21,6 +21,9 @@
                 <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_vouchers.js" />
                 <!-- Historico de facturas -->
                 <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_invoice_balance.js" />
+                <!-- Listado de ventas por vendedores por monto -->
+                <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_sale_vendor.js" />
+
                 <!-- Historico de punto de ventas -->
                 <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_pos.js"/>
 
@@ -74,6 +77,10 @@
                 <!-- accountpending -->
                 <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/reporting_accountpending_pagar.js"/>
 
+                <!-- Libro de venta generales dental-->
+                <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_libro_ventapos_dental.js" />
+                <!-- accountpending -->
+                <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/reporting_accountpending_dental.js"/>
                 <!-- crm -->
                 <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_crm.js"/>
                 <!-- crm_task -->

+ 18 - 0
views/actions.xml

@@ -57,6 +57,12 @@
             <field name="tag">eiru_reporting.account_action_report</field>
         </record>
 
+		<!-- Listado de cuentas vencidas a cobrar dental -->
+		<record id="account_pendingdental_report_action" model="ir.actions.client">
+			<field name="name">Cuentas a Cobrar Dental</field>
+			<field name="tag">eiru_reporting.account_pendingdental_action_report</field>
+		</record>
+
         <!-- Listado de cuentas a pagar -->
          <record id="account_pending_report_action" model="ir.actions.client">
             <field name="name">Cuentas a Pagar</field>
@@ -83,6 +89,18 @@
 			<field name="tag">eiru_reporting.libro_venta_action_report</field>
 		</record>
 
+		<!-- Listado de ventas de vendedores por monto -->
+		<record id="sale_vendor_report_action" model="ir.actions.client">
+			<field name="name">Listado de ventas de vendedores por monto</field>
+			<field name="tag">eiru_reporting.sale_vendor_action_report</field>
+		</record>
+
+		<!-- Libro de ventas normales dental-->
+		<record id="libro_venta_dental_report_action" model="ir.actions.client">
+			<field name="name">Libro de Ventas Dental</field>
+			<field name="tag">eiru_reporting.libro_venta_dental_action_report</field>
+		</record>
+
 		<!-- Analisis de Devolucion de Clientes -->
 		<record id="devolucioncliente_report_action" model="ir.actions.client">
 			<field name="name">Analisis de Devolucion de Clientes</field>

+ 14 - 5
views/menus.xml

@@ -42,20 +42,26 @@
             <!-- Libro de ventas -->
             <menuitem id="libro_venta_menu_submenu" parent="sale_report_parent_menu" name="Libro de venta" action="libro_venta_report_action" sequence="2"/>
 
+            <!-- Listado de ventas de vendedores por monto -->
+            <menuitem id="sale_vendor_report_menu_submenu" parent="sale_report_parent_menu" name="Listado de ventas por vendedores por monto" action="sale_vendor_report_action" sequence="3"/>
+
+            <!-- Libro de ventas  dental-->
+            <menuitem id="libro_venta_dental_menu_submenu" parent="sale_report_parent_menu" name="Libro de venta Dental" action="libro_venta_dental_report_action" sequence="4"/>
+
             <!-- Historico de utilidad sobre precio de venta -->
-            <menuitem id="difventa_report_menu_submenu" parent="sale_report_parent_menu" name="Historico de porcentaje utilidad de precio" action="difventa_report_action" sequence="3"/>
+            <menuitem id="difventa_report_menu_submenu" parent="sale_report_parent_menu" name="Historico de porcentaje utilidad de precio" action="difventa_report_action" sequence="5"/>
 
             <!-- Analisis de devolucion de proveedores -->
-            <menuitem id="devolucioncliente_report_menu_submenu" parent="sale_report_parent_menu" name="Analisis de facturas rectificativas de ventas" action="devolucioncliente_report_action" sequence="4"/>
+            <menuitem id="devolucioncliente_report_menu_submenu" parent="sale_report_parent_menu" name="Analisis de facturas rectificativas de ventas" action="devolucioncliente_report_action" sequence="6"/>
 
             <!-- Analisis de contratos de clientes -->
-            <menuitem id="contratocliente_report_menu_submenu" parent="sale_report_parent_menu" name="Analisis contratos de clientes" action="contratocliente_report_action" sequence="5"/>
+            <menuitem id="contratocliente_report_menu_submenu" parent="sale_report_parent_menu" name="Analisis contratos de clientes" action="contratocliente_report_action" sequence="7"/>
 
             <!-- Ranking de clientes con mas compras -->
-            <menuitem id="saleranking_report_menu_submenu" parent="sale_report_parent_menu" name="Ranking de clientes con mas compras" action="sale_customer_ranking_report_action" sequence="6"/>
+            <menuitem id="saleranking_report_menu_submenu" parent="sale_report_parent_menu" name="Ranking de clientes con mas compras" action="sale_customer_ranking_report_action" sequence="8"/>
 
             <!-- Ranking de productos mas vendidos -->
-            <menuitem id="productranking_report_menu_submenu" parent="sale_report_parent_menu" name="Ranking de productos mas vendidos" action="productranking_report_action" sequence="7"/>
+            <menuitem id="productranking_report_menu_submenu" parent="sale_report_parent_menu" name="Ranking de productos mas vendidos" action="productranking_report_action" sequence="9"/>
 
 	    <!-- POS Submenu -->
         <menuitem id="point_of_sale_report_parent_menu" name="TPV" parent="eiru_report_main_menu" sequence="3"/>
@@ -119,6 +125,9 @@
         	<!-- Listado de cuentas a pagar-->
             <menuitem id="account_report_menu_submenu" parent="account_report_parent_menu" name="Cuentas a Cobrar" action="account_report_action" sequence="6"/>
 
+            <!-- Listado de cuentas a cobrar dental-->
+            <menuitem id="account_pending_dental_menu_submenu" parent="account_report_parent_menu" name="Cuentas a Cobrar Dental" action="account_pendingdental_report_action" sequence="8"/>
+
         <!-- Sexto Submenu -->
 
         <menuitem id="stock_report_parent_menu" name="Stock" parent="eiru_report_main_menu" sequence="6"/>