Selaa lähdekoodia

FIX ADD se hizo historico de ventas por doctor para odonto-imagen

Sebas 6 vuotta sitten
vanhempi
commit
6920ea7a8d

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

@@ -78,6 +78,11 @@ function configuration_reporting (instance, widget) {
                 description: 'Permite visualizar de forma global los ingresos obtenidos por la empresa.',
                 action: 'ReportPosOrders'
             },
+            {
+                title: 'Histórico de Ventas Odonto',
+                description: 'Permite realizar un listado de la cabecera de ventas.',
+                action: 'ReportMedical'
+            },
             {
                 title: 'Histórico de Ventas generales',
                 description: 'Permite realizar un listado de las cabeceras de facturas de venta.',

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

@@ -32,6 +32,7 @@ openerp.eiru_reporting = function (instance) {
         report_refund_invoice_supplier(reporting);
         report_works(reporting);
         report_pos(reporting);
+        report_medical(reporting);
         report_rrhh(reporting);
         report_mrp(reporting);
 	    report_ranking_pos_orders_customer(reporting);
@@ -112,6 +113,9 @@ openerp.eiru_reporting = function (instance) {
     // Analisis de ventas
     instance.web.client_actions.add('eiru_reporting.point_of_sale_detail_action_report', 'instance.eiru_reporting.ReportPosOrdersWidget');
 
+    // Analisis de Medical
+    instance.web.client_actions.add('eiru_reporting.medical_action_report', 'instance.eiru_reporting.ReportMedicalWidget');
+
     // Historico de ventas y pos
     instance.web.client_actions.add('eiru_reporting.sale_pos_order_action_report', 'instance.eiru_reporting.ReportSalePosCabWidget');
 

+ 591 - 0
static/src/js/reports/report_medical.js

@@ -0,0 +1,591 @@
+function report_medical(reporting){
+    "use strict";
+
+    var instance = openerp;
+
+    reporting.ReportMedicalWidget = reporting.Base.extend({
+        template: 'ReportMedical',
+        content: [],
+        rowsData :[],
+        PosOrder :[],
+        StatementLine :[],
+        modules:[],
+        events:{
+            'click #toolbar > button' : 'clickOnAction',
+            'click #X' : 'factSearch',
+            'click #A' : 'factSearch',
+            'click #B' : 'factSearch',
+            'click #C' : 'factSearch',
+            'click #D' : 'factSearch',
+            'click #Z' : 'factSearch',
+            'change #partner': 'factSearch',
+            'change #medic': 'factSearch',
+            'change #from' : 'factSearch',
+            'change #current-store' : 'factSearch',
+            'change #current-journal' : 'factSearch',
+            'change #to' : 'factSearch',
+            'click-row.bs.table #table ' : 'ckickAnalysisDetail',
+        },
+        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();
+        },
+
+        // 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
+        },
+
+        ckickAnalysisDetail: function(e, row, $element, field){
+            if (field == 'number'){
+                this.do_action({
+                    name:"Factura de cliente",
+                    type: 'ir.actions.act_window',
+                    res_model: "pos.order",
+                    views: [[false,'form']],
+                    target: 'new',
+                    domain: [['id','=', row.id]],
+                    context: {},
+                    flags: {'form': {'action_buttons': false, 'options': {'mode': 'view'}}},
+                    res_id: row.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.fecthIrModuleModule().then(function(modules){
+                self.modules = modules;
+                return modules;
+            }).then(function(modules){
+                return self.fetchPosOrder()
+            }).then(function (PosOrder){
+                self.PosOrder = PosOrder;
+                return self.fetchStatementLine(PosOrder);
+            }).then(function(StatementLine){
+                self.StatementLine=StatementLine;
+                return self.fecthResStore();
+            }).then(function(ResStore){
+                self.ResStore = ResStore;
+                self.$el.find('#current-store').append('<option value="9999999">Todas las SUC.</option>');
+                _.each(ResStore,function(item){
+                    self.$el.find('#current-store').append('<option value="' + item.id + '">' + item.name + '</option>');
+                });
+                 return self.fecthAccountJournal();
+            }).then(function(AccountJournal){
+                self.AccountJournal = AccountJournal;
+                self.$el.find('#current-journal').append('<option value="9999999">Todas los metodos de pago.</option>');
+                _.each(AccountJournal,function(item){
+                    if(item.type == 'cash' || item.type == 'bank'){
+                        self.$el.find('#current-journal').append('<option value="' + item.id + '">' + item.name + '</option>');
+                    }
+                });
+                return self.fetchResPartner();
+            }).then(function(ResPartner){
+                self.ResPartner = ResPartner;
+                return self.fetchResMedical();
+            }).then(function(ResMedical){
+                self.ResMedical = ResMedical;
+                self.search();
+                return self.BuildTable();
+            });
+        },
+
+        // 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;
+        },
+
+        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;
+            }
+        },
+
+        fecthResStore: function(){
+            var self = this;
+            var defer = $.Deferred();
+            var field=['id', 'name'];
+            var ResStore = new instance.web.Model('res.store');
+            ResStore.query(field).all().then(function(results){
+                defer.resolve(results);
+            });
+            return defer;
+        },
+
+        fecthAccountJournal: function(){
+            var self = this;
+            var defer = $.Deferred();
+            var field = ['id', 'name','store_ids','type'];
+            var domain = [['active','=',true],['type','in',['sale','bank','cash']]];
+            var AccountJournal = new instance.web.Model('account.journal');
+            AccountJournal.query(field).filter(domain).all().then(function(results){
+                defer.resolve(results);
+            });
+            return defer;
+        },
+
+        fetchPosOrder: function () {
+            var self = this;
+            var filter =[['state', 'in',['done','paid','invoiced']]];
+            var field =['id', 'partner_id', 'name', 'session_id', 'state', 'table_id', 'statement_ids','date_order','amount_total','user_id','amount_tax','sale_journal'];
+            var defer = $.Deferred();
+            var modules = self.checkModel('point_of_sale');
+
+            if (modules.length <= 0){
+                self.showMensaje('point_of_sale');
+                return defer;
+            }
+            var PosOrder = new instance.web.Model('pos.order');
+            PosOrder.query(field).filter(filter).all().then(function (results) {
+                defer.resolve(results);
+            });
+            return defer;
+        },
+
+        fetchStatementLine: function(PosOrder) {
+            var self = this;
+            var defer = $.Deferred();
+
+            var fields = ['id', 'name', 'amount', 'journal_id', 'pos_statement_id'];
+            var domain = [['amount','>', 0]];
+            var StatementLine = new instance.web.Model('account.bank.statement.line');
+            StatementLine.query(fields).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', 'medic']).filter([['active', '=', true], ['customer', '=', true]]).all().then(function (results) {
+                defer.resolve(results);
+            });
+            return defer;
+        },
+
+        valorNull:function(dato){
+            var valor ="";
+            if (dato){
+                valor=dato;
+            }
+            return valor;
+        },
+
+        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();
+                }
+            });
+        },
+
+        fetchResMedical: function() {
+            var self = this;
+            var defer = $.Deferred();
+            var modules = self.checkModel('eiru_study_features');
+
+            if (modules.length <= 0){
+                self.showMensaje('eiru_study_features');
+                return defer;
+            }
+            var ResMedical = new instance.web.Model('res.partner');
+            ResMedical.query(['id', 'name', 'ruc', 'is_medic']).filter([['active', '=', true], ['is_medic', '=', true]]).all().then(function (results) {
+                defer.resolve(results);
+            });
+            return defer;
+        },
+
+        search: function () {
+            var self = this;
+            var results = self.ResMedical;
+            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.$('#medic').autocomplete({
+                source: results,
+                minLength:0,
+                search: function(event, ui) {
+                    if (!(self.$('#medic').val())){
+                        self.factSearch();
+                    }
+                },
+                close: function( event, ui ) {
+                        self.factSearch();
+                },
+                select: function(event, ui) {
+                    self.factSearch();
+                }
+            });
+        },
+
+        getStatementLine: function(id){
+            var self = this;
+            return _.filter(self.StatementLine, function(item){
+                return item.pos_statement_id[0] === id;
+            });
+        },
+
+        getAccountJournal: function (id) {
+            var self = this;
+            return _.filter(self.AccountJournal,function (item) {
+                return item.id === id;
+            });
+        },
+
+        getResMedical: function (id) {
+            var self = this;
+            return _.filter(self.ResPartner,function (item) {
+                return item.id === id;
+            });
+        },
+
+        BuildTable: function(){
+            var self = this;
+            var PosOrder = self.PosOrder;
+            var data = [];
+            var order = [];
+            var store = [];
+            var medical = [];
+            var amount_total_total = 0;
+            _.each(PosOrder, function(item){
+                order = self.getStatementLine(item.id);
+                store = self.getAccountJournal(item.sale_journal[0]);
+                medical = self.getResMedical(item.partner_id[0]);
+                if(order.length > 0 & store.length > 0){
+                    var utc = moment.utc(item.date_order,'YYYY-MM-DD h:mm:ss A');
+                    var date = moment(utc._d).format('DD/MM/YYYY hh:mm A');
+                    var date_aux=moment(utc._d).format('YYYY-MM-DD');
+                    data.push({
+                        id : item.id,
+                        number: item.name,
+                        origin: item.session_id[1],
+                        partner: item.partner_id[1],
+                        date_invoice: date,
+                        amount_total: accounting.formatNumber(item.amount_total,0,".",","),
+                        date: date_aux,
+                        partner_id : item.partner_id[0],
+                        amount : item.amount_total,
+                        journal_id: order[0].journal_id[0],
+                        journal_name: order[0].journal_id[1],
+                        medic_id: medical[0].medic[0],
+                        medic_name: medical[0].medic[1],
+                        user: item.user_id[1],
+                        store_id : store[0].store_ids[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 store = this.$el.find('#current-store').val();
+            var journal = this.$el.find('#current-journal').val();
+            var desde =this.$el.find('#from').val();
+            var hasta =this.$el.find('#to').val();
+            var partner= this.$el.find('#partner').val().split('-');
+            var medic= this.$el.find('#medic').val().split('-');
+            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 (store != 9999999){
+                content = _.filter(content,function(inv){
+                    return inv.store_id == store;
+                });
+            }
+            if (partner != ""){
+                content = _.filter(content, function(inv){
+                    return inv.partner_id == partner[0];
+                });
+            }
+            if (medic != ""){
+                content = _.filter(content, function(inv){
+                    return inv.medic_id == medic[0];
+                });
+            }
+            if (journal != 9999999){
+                content = _.filter(content,function(inv){
+                    return inv.journal_id == journal;
+                });
+            }
+
+            var amount_total_total = _.reduce(_.map(content,function(map){
+                return(map.amount);
+            }),function(memo, num){
+                return memo + num;
+            },0);
+
+            content.push({
+                number: "Total",
+                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;
+                });
+                _.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: {
+                    number : {columnWidth: '8px'},
+                    origin : {columnWidth: '8px'},
+                    partner : {columnWidth: '8px'},
+                    date_invoice : {columnWidth: '8px'},
+                    amount_total : {halign:'right',columnWidth: '8px'},
+                    namejournal : {columnWidth: '6px'},
+                    medic_name: {halign:'left',columnWidth: '8px'},
+                    user : {halign:'left',columnWidth: '8px'},
+                },
+                margin: { top: 16, horizontal: 7},
+                addPageContent: function (data) {
+                    pdfDoc.setFontSize(12);
+                    pdfDoc.setFontStyle('bold');
+                    pdfDoc.setTextColor(40);
+                    pdfDoc.text('Histórico de Venta por Doctor', 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('Histórico de Venta por Doctor.pdf')
+        },
+    });
+}

+ 106 - 0
static/src/reports/report_medical.xml

@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template xml:space="preserve">
+    <t t-name="ReportMedical">
+        <div class="report_view">
+            <div class="reporting_page_header">
+                <h1>Histórico de Ventas por Doctor</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">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">Metodo de pago: </label>
+                                    <select id="current-journal" class="form-control ui-autocomplete-input"  name="journal"></select>
+                                </div>
+                                <div class="form-group">
+                                    <label for="medic">Buscar Doctor:</label>
+                                    <input id="medic" type="text" class="form-control ui-autocomplete-input" autocomplete="off" placeholder="Nombre/ CI/ Ruc"/>
+
+                                    <label for="partner">Buscar Cliente:</label>
+                                    <input id="partner" type="text" class="form-control ui-autocomplete-input" autocomplete="off" placeholder="Nombre/ CI/ Ruc"/>
+
+                                    <label for="current-store">Sucursal: </label>
+                                    <select id="current-store" class="form-control ui-autocomplete-input" name="store"></select>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div id="toolbar">
+                <button class="oe_button oe_form_button oe_highlight btn-block" value="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="number" data-sortable="true">Orden</th>
+                        <th data-field="origin" data-sortable="true">Ref. Venta</th>
+                        <th data-field="partner">Cliente</th>
+                        <th data-field="date_invoice" data-sortable="true">Fecha</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="medic_name">Médico</th>
+                        <th data-field="user" data-sortable="true">Vendedor</th>
+                    </tr>
+                </thead>
+            </table>
+            <!-- <canvas></canvas> -->
+            <div id="dialog"></div>
+        </div>
+    </t>
+</template>

+ 3 - 0
templates.xml

@@ -33,6 +33,9 @@
                 <!-- Analisis de ventas -->
                 <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_sales_invoice_analysis.js" />
 
+                <!-- Historico de medical -->
+                <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_medical.js" />
+
                 <!-- Historico de utilidad sobre precio de venta -->
                 <script type="text/javascript" src="/eiru_reporting/static/src/js/reports/report_invoice_difventa.js" />
 

+ 6 - 0
views/actions.xml

@@ -121,6 +121,12 @@
             <field name="tag">eiru_reporting.point_of_sale_detail_action_report</field>
         </record>
 
+		<!-- Historico medical -->
+		<record id="medical_report_action" model="ir.actions.client">
+			<field name="name">Historico de Ventas Odonto</field>
+			<field name="tag">eiru_reporting.medical_action_report</field>
+		</record>
+
 
 		<!-- Historico de ventas y pos -->
 		<record id="sale_pos_order_report_action" model="ir.actions.client">

+ 3 - 0
views/menus.xml

@@ -72,6 +72,9 @@
 	        <!-- Ranking de clientes -->
 	        <menuitem id="point_of_sale_customer_ranking_report_menu_submenu" parent="point_of_sale_report_parent_menu" name="Ranking de Clientes" action="point_sale_customer_ranking_report_action"/>
 
+            <!-- Historico de ventas Odonto -->
+            <menuitem id="medical_report_menu_submenu" parent="point_of_sale_report_parent_menu" name="Historico de Ventas por Doctor" action="medical_report_action" />
+
         <!-- Pos/Venta Submenu -->
         <menuitem id="posventa_report_parent_menu" name="Ventas/Terminal de Venta" parent="eiru_report_main_menu" sequence="4"/>