Pārlūkot izejas kodu

commit inicial Versio 0.0.1.0

Adrielso 8 gadi atpakaļ
revīzija
a8e75a46eb

+ 3 - 0
__init__.py

@@ -0,0 +1,3 @@
+# -*- coding : utf-8 -*-
+
+import model

BIN
__init__.pyc


+ 12 - 0
__openerp__.py

@@ -0,0 +1,12 @@
+# -*- encoding: utf-8 -*-
+{
+    'name': 'Analisis de Utilidad de ventas',
+    'version': '0.1',
+    'category': 'Product',
+    'author': 'Adrielso Kunert',
+    'depends': ['account', 'sale'],
+    'data': ['view/report_invoice_utility.xml',
+             'view/templates.xml'],
+    'qweb': ['static/src/xml/*.xml'],
+    'installable': True,
+}

+ 2 - 0
model/__init__.py

@@ -0,0 +1,2 @@
+# -*- coding : utf-8 -*-
+from . import report_invoice_utility

BIN
model/__init__.pyc


+ 134 - 0
model/report_invoice_utility.py

@@ -0,0 +1,134 @@
+# -*- coding: utf-8 -*-
+
+from openerp import tools, models, fields, api
+from openerp.osv import fields, osv
+
+class report_invoice_utility(models.Model):
+
+    _name = "report.invoice.utility"
+    _description = "report.invoice.utility"
+    _auto = False
+
+    # _columns = {
+    #     'id': fields.integer('id',required=True),
+	# 	'product_id': fields.many2one('product.product', 'Product', required=True, select=True, readonly=True),
+	# 	'quantity': fields.float('Cantidad', readonly=True),
+    #     'brand_id': fields.many2one('product.brand', 'Marca', readonly=True),
+    #     'genre_id': fields.many2one('product.genre', 'Genero', readonly=True),
+    #     'categ_id': fields.many2one('product.category', 'Categoria', readonly=True),
+	# 	'factory_reference': fields.char('Referencia', readonly=True),
+	# 	'location_id': fields.many2one('stock.location', 'Ubicacion',  readonly=True),
+	# 	'id_parent' : fields.many2one('product.category', 'Categoria Padre', readonly=True),
+    # }
+    _columns ={
+                'id': fields.integer('id',required=True),
+                'id_invoice' : fields.many2one('account.invoice', 'invoice',readonly=True),
+                'type' : fields.char('type'),
+                'number' : fields.char('number'),
+                'origin' : fields.char('origin'),
+                'state' : fields.char('state'),
+                'journal_id' : fields.many2one('account.journal', 'journal', readonly=True),
+                'currency_id' : fields.many2one('res.currency', 'currency', readonly=True),
+                'rate' : fields.float('rate', readonly=True),
+                'id_line' : fields.many2one('account.invoice.line', 'Line invoice', readonly=True),
+                'quantity' : fields.float('quantity', readonly=True),
+                'price_unit_original' : fields.float('price_unit_original', readonly=True),
+                'price_unit' : fields.float('price_unit', readonly=True),
+                'discount' : fields.float('discount', readonly=True),
+                'name' : fields.char('name', readonly=True),
+                'id_product' : fields.many2one('product.product', 'Product', readonly=True),
+                'default_code' : fields.char('default_code', readonly=True),
+                'name_template' : fields.char('name_template', readonly=True),
+                'factory_code' : fields.char('factory_code', readonly=True),
+                'factory_reference' : fields.char('factory_reference', readonly=True),
+                'factory_barcode' : fields.char('factory_barcode', readonly=True),
+                'standard_price' : fields.float('standard_price', readonly=True),
+                'price_subtotal' : fields.float('price_subtotal', readonly=True),
+                'cost_subtotal' : fields.float('cost_subtotal', readonly=True),
+                'utilidad' : fields.float('utilidad', readonly=True),
+    }
+
+    _order = 'id asc'
+
+    def init(self, cr):
+		tools.sql.drop_view_if_exists(cr, 'report_invoice_utility')
+		cr.execute("""
+            CREATE OR REPLACE VIEW report_invoice_utility as (
+            SELECT row_number() over (ORDER BY il.id)as id,
+	               i.id as id_invoice,
+                   i.type as type,
+                   i.number as number,
+                   i.origin as origin,
+                   i.state as state,
+                   i.journal_id as journal_id,
+                   i.currency_id as currency_id,
+                   rcr.rate as rate,
+                   il.id as id_line,
+                   il.quantity as quantity,
+                   il.price_unit as price_unit_original,
+                   trunc(il.price_unit / rcr.rate,2) as price_unit,
+                   il.discount as discount,
+                   il.name as name,
+                   pp.id as id_product,
+                   pp.default_code as default_code,
+                   pp.name_template as name_template,
+                   pp.factory_code as factory_code,
+                   pp.factory_reference as factory_reference,
+                   pp.factory_barcode as factory_barcode,
+                   (pph.cost)::numeric as standard_price,
+                   trunc(il.quantity * (trunc(il.price_unit / rcr.rate,2)),2) as price_subtotal,
+                   trunc((il.quantity) * (pph.cost)::numeric ,2) as cost_subtotal,
+                   (trunc(il.quantity * (trunc(il.price_unit / rcr.rate,2)),2)-trunc((il.quantity) * (pph.cost)::numeric ,2))as utilidad
+            FROM account_invoice i
+                  left join res_currency_rate rcr on(rcr.currency_id= i.currency_id)
+ 	              left join account_invoice_line il on (il.invoice_id =i.id)
+ 	              left join product_product pp on (pp.id =il.product_id)
+ 	              left join (SELECT cost, product_template_id FROM product_price_history ppa
+ 		               where create_date=(select max(create_date) FROM product_price_history pps where ppa.product_template_id = pps.product_template_id))
+ 		                pph on(pph.product_template_id = pp.product_tmpl_id)
+            where trim(upper(i.type))=trim(upper('out_invoice')) AND (i.state='open' OR i.state='paid'))
+		""")
+
+# Select i.id as id_invoice, i.type as type,  i.number as number, i.origin as origin, i.state as state,
+# 	il.id as id_line,  il.quantity as quantity, il.price_unit as price_unit, il.discount as discount, il.name as name,
+# 	pp.id as id_product, pp.default_code as default_code, pp.name_template as name_template, pp.factory_code as factory_code,
+# 	pp.factory_reference as factory_reference, pp.factory_barcode as factory_barcode, pp.product_tmpl_id,
+# 	pph.cost as standard_price, pph.product_template_id as product_template_id
+# FROM account_invoice i
+# 	left join account_invoice_line il on (il.invoice_id =i.id)
+# 	left join product_product pp on (pp.id =il.product_id)
+# 	left join (SELECT cost, product_template_id FROM product_price_history ppa
+# 		    where create_date=(select max(create_date) FROM product_price_history pps where ppa.product_template_id = pps.product_template_id))
+# 		    pph on(pph.product_template_id = pp.product_tmpl_id)
+# where i.type='out_invoice' and i.state='open' or i.state='paid'
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+
+#
+# def init(self, cr):
+#     tools.sql.drop_view_if_exists(cr, 'report_invoice_utility')
+#     cr.execute("""
+#         CREATE OR REPLACE VIEW report_invoice_utility as (
+#         SELECT	row_number() over (ORDER BY product_id)as id,
+#                s.product_id as product_id,
+#                SUM(s.qty) as quantity,
+#                pt.product_brand_id as brand_id,
+#                pt.product_genre_id as genre_id,
+#                pt.categ_id as categ_id,
+#                pt.factory_reference as factory_reference,
+#                s.location_id as location_id,
+#                pcc.id_parent as id_parent
+#         FROM stock_quant s
+#            left join stock_location r on (r.id=s.location_id)
+#            left join product_product p on (p.id=s.product_id)
+#            left join product_template pt on (pt.id=p.product_tmpl_id)
+#            left join product_brand z on (pt.product_brand_id=z.id)
+#            left join product_genre t on (pt.product_genre_id=t.id)
+#            left join product_category g on (g.id=pt.categ_id)
+#            left join (SELECT pp.id, pp.parent_id,
+#                 case when (select ppp.parent_id from product_category ppp where ppp.id= pp.parent_id and ppp.parent_id !=1) is NULL
+#                 then pp.parent_id  ELSE
+#                 (select ppp.parent_id from product_category ppp where ppp.id= pp.parent_id and ppp.parent_id !=1) END as id_parent
+#                 from product_category pp) as pcc on pcc.id = pt.categ_id
+#             WHERE r.usage='internal' and  s.qty>0 and  pt.active=True
+#             GROUP BY s.location_id, s.product_id, pt.product_brand_id, pt.product_genre_id, pt.factory_reference, pt.categ_id, pcc.id_parent)
+#     """)

BIN
model/report_invoice_utility.pyc


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 9 - 0
static/src/js/jquery.serializejson.min.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
static/src/js/jspdf.min.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 8 - 0
static/src/js/jspdf.plugin.autotable.min.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 5 - 0
static/src/js/moment.min.js


+ 234 - 0
static/src/js/report_invoice_utility.js

@@ -0,0 +1,234 @@
+openerp.report_invoice_utility = function (instance, local) {
+
+    local.ReportWidget = instance.Widget.extend({
+        template: 'ReportContainerTemplate1',
+        invoices: [],
+        invoiceLines: [],
+        productProduct:[],
+        Currency:[],
+
+        start: function () {
+          this.fetchJournal();
+          // this.fetchCurency();
+          this.$el.find('#report_form').submit(_.bind(this.submitForm, this));
+        },
+        // Buscar Diario
+        fetchJournal: function () {
+          var self = this;
+            var Journal = new instance.web.Model('account.journal');
+            Journal.query(['id', 'type', 'code', 'currency', 'name', 'company_id', 'active']).filter([['type', '=', 'sale'], ['active', '=', true]]).all().then(function (results) {
+                self.journal = results;
+                _.each(results, function (item) {
+                    self.$el.find('#current-journal').append('<option value="' + item.id + '">' + item.name + '</option>');
+                });
+                self.$el.find('#current-journal').append('<option value="9999999">TODAS LAS SUC.</option>');
+            });
+        },
+
+        fetchCurency: function () {
+            var defer = $.Deferred();
+            var currency_Rate = new instance.web.Model('res.currency.rate');
+            fields = ['id', 'name', 'currency_id', 'rate', 'create_date'];
+            domain = [['currency_id', '=', [166 , 20, 7, 3]]];
+            currency_Rate.query(fields).filter(domain).all().then(function (results) {
+              defer.resolve(results);
+            });
+            return defer;
+          },
+
+        // Invoice (FACTURAS)
+        fetchInvoiceV2: function (journalId) {
+            var domain = null;
+            if( journalId == 9999999){
+              domain = [['state', '=',['open','paid']],['type', '=', 'out_invoice']];
+            }else{
+              domain = [['state', '=',['open','paid']],['type', '=', 'out_invoice'],['journal_id.id', '=', journalId]];
+            }
+
+            var defer = $.Deferred();
+
+            var Invoice = new instance.web.Model('account.invoice');
+            Invoice.query(['id', 'type', 'number', 'origin', 'state', 'journal_id', 'currency_id', 'invoice_line']).filter(domain).all().then(function (results) {
+                defer.resolve(results);
+            });
+
+            return defer;
+        },
+        // Invoice line (Linea de Factura)
+        fetchInvoiceLine: function (invoices) {
+          var defer = $.Deferred();
+          var linesIds = _.flatten(_.map(invoices, function (item) {
+            return item.invoice_line;
+          }));
+
+          var InvoiceLine = new instance.web.Model('account.invoice.line');
+          InvoiceLine.query(['id', 'quantity', 'price_unit', 'discount', 'name', 'product_id', 'origin','invoice_id']).filter([['id', 'in', linesIds]]).all().then(function (results) {
+            defer.resolve(results)
+          });
+
+          return defer;
+        },
+        // Product Product
+        fecthProduct: function(invoiceLines){
+          var defer = $.Deferred();
+          var porductIDS = _.flatten(_.map(invoiceLines, function (item) {
+            return item.product_id[0];
+          }));
+          // console.log(porductIDS.length);
+          // console.log((_.uniq(porductIDS)).length);
+
+          var ProductProdcut =  new instance.web.Model('product.product');
+          var fields = ['id', 'default_code', 'name_template', 'factory_code', 'factory_reference', 'factory_barcode', 'standard_price'];
+          ProductProdcut.query(fields).filter([['id', 'in', porductIDS]]).all().then(function (results) {
+            defer.resolve(results)
+          });
+
+          return defer;
+        },
+
+        // Cansultar
+        submitForm: function (e) {
+            e.preventDefault();
+            var formData = this.$(e.currentTarget).serializeJSON();
+            // alert(formData.journal);
+            if (formData.journal == 0) {
+                $("#dialog" ).dialog({
+                    autoOpen: true,
+                    resizable: false,
+                    modal: true,
+                    title: 'Atención',
+                    open: function() {
+                        $(this).html('Complete el formulario para generar el reporte');
+                    },
+                    show: {
+                        effect: "shake",
+                        duration: 300
+                    },
+                    hide: {
+                        effect: "fade",
+                        duration: 300
+                    },
+                    buttons: {
+                        Aceptar: function() {
+                            $(this).dialog('close');
+                        }
+                    }
+                });
+                return;
+            }
+            this.fetchCurency().then(function(currency) {
+                self.Currency = currency;
+            });
+            var self = this;
+            this.fetchInvoiceV2(formData.journal).then(function (invoices) {
+              self.invoices = invoices;
+              // console.log(this.invoices);
+              // console.log(invoices.length);
+              return invoices;
+            }).then(function (invoices) {
+                return self.fetchInvoiceLine(invoices);
+            }).then(function (invoiceLines) {
+                self.invoiceLines = invoiceLines;
+                // console.log(invoiceLines.length);
+                return self.fecthProduct(invoiceLines);
+            }).then(function(productProduct){
+              self.productProduct = productProduct;
+              // console.log(productProduct);
+              // console.log(productProduct.length);
+              return self.invoice_Currency();
+              // return self.fectUtility();
+            });
+
+            return false;
+        },
+
+        invoice_Currency: function(){
+          var currency_new = null;
+          for (var i = 0; i < this.invoices.length; i++) {
+              item = this.invoices[i];
+              currency_new = _.find(this.Currency, function(curr){
+                  return _.contains(curr.currency_id, item.currency_id[0]);
+                });
+                if (!currency_new){
+                  currency_new={};
+                  currency_new.rate=1;
+                }
+
+                this.invoices[i].rate=(currency_new.rate);
+          }
+            return this.fectUtility();
+        },
+
+        fectUtility: function(){
+          var data = [];
+          var item = null;
+          var invoice = null;
+          var producto =null;
+
+          for (var i = 0; i < this.invoiceLines.length; i++) {
+            item = this.invoiceLines[i];
+
+            invoice = _.find(this.invoices, function (inv) {
+              return _.contains(inv.invoice_line, item.id);
+            });
+            producto =_.find(this.productProduct, function(prod){
+              return _.contains(item.product_id, prod.id);
+            });
+            if (!producto){
+              producto={};
+              producto.standard_price=0;
+            }
+            // console.log(producto);
+            // console.log(data);
+            data.push([(invoice.number),
+                       (item.name),
+                       (item.quantity),
+                       (item.price_unit.toFixed(2) / invoice.rate.toFixed(2)),
+                       (producto.standard_price.toFixed(2)),
+                       (item.quantity * (item.price_unit.toFixed(2) / invoice.rate.toFixed(2))),
+                       (item.quantity * producto.standard_price.toFixed(2)),
+                       ((item.quantity * (item.price_unit.toFixed(2) / invoice.rate.toFixed(2))) - (item.quantity * producto.standard_price)).toFixed(2)]);
+          }
+          // console.log(data);
+          // console.log(data.length);
+          this.drawPDF(data);
+        },
+
+
+        drawPDF: function (rows) {
+            var columns = ['Factura', 'Producto', 'Cantidad', 'Precio Unitario', 'Precio Costo', 'Totla Venta', 'Total Costo', 'Utilidad'];
+            var pdfDoc = new window.jsPDF();
+            // alert(columns);
+            pdfDoc.autoTable(columns, rows, {
+                theme: 'plain', // 'striped', 'grid' or 'plain',
+                styles: {
+                    fontSize: 8,
+                    overflow: 'linebreak' // visible, hidden, ellipsize or linebreak
+                },
+                // showHeader: 'firstPage', // 'everyPage', 'firstPage', 'never',
+                // headerStyles: {
+                //     fontStyle: 'bold',
+                //     fillColor: '#000000'
+                // },
+                margin: {
+                    top: 15
+                },
+                addPageContent: function (data) {
+                  pdfDoc.text('Facturas de SUC.', 10, 10);
+                  // pdfDoc.addpage();
+                }
+
+
+
+            });
+            // pdfDoc.text('Informe loco.', 10, 10);
+            // pdfDoc.internal.getNumberOfPages();
+
+            pdfDoc.save('Analisis de utilidad.pdf')
+
+            // pdfDoc.output('dataurlnewwindow');
+        }
+
+    });
+    instance.web.client_actions.add('report_invoice_utility.action_report', 'instance.report_invoice_utility.ReportWidget');
+}

+ 36 - 0
static/src/xml/report_utility.xml

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+  <template xml:space="preserve">
+      <t t-name="ReportContainerTemplate1">
+        <div class="oe_form_container">
+          <div class="oe_form">
+            <div>
+              <header style="padding: 5px;">
+                <button type="submit" class="oe_button oe_form_button oe_highlight" form="report_form">
+                  <span>Generar Reporte</span>
+                </button>
+              </header>
+              <div class="oe_form_sheetbg">
+                <div class="oe_form_sheet oe_form_sheet_width">
+                  <div class="oe_title">
+                    <h2>Analisis de Utilidad</h2>
+                  </div>
+                  <div class="oe_clear"></div>
+                  <hr/>
+                  <form id="report_form" class="form-horizontal">
+                        <label for="current-journal" class="col-sm-3 control-label">Suc.</label>
+                        <div class="form-group">
+                        <div class="col-sm-5">
+                            <select id="current-journal" class="form-control" name="journal">
+                                <option value="0">Seleccione una Suc.</option>
+                            </select>
+                        </div>
+                    </div>
+                  </form>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div id="dialog"></div>
+      </t>
+  </template>

+ 37 - 0
view/report_invoice_utility.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<openerp>
+  <data>
+
+    <record id="account_invoice_utility"  model="ir.actions.act_window">
+        <field name="name">Analisis de Utilidad</field>
+        <field name="res_model">report.invoice.utility</field>
+        <field name="view_type">form</field>
+        <field name="view_mode">tree</field>
+    </record>
+
+
+    <record id="account_invoice_utility_tree" model="ir.ui.view">
+            <field name="name">account.invoice.utility.tree</field>
+            <field name="model">report.invoice.utility</field>
+            <field name="view_type">tree</field>
+            <field name="arch" type="xml">
+              <tree ditable='bottom' delete='false' create='false'>
+                  <field name="number" string="Factura"/>
+                  <field name="name" string="Pordcuto"/>
+                  <field name="quantity" sum="quantity"/>
+                  <field name='standard_price' string="Precio de Costo" sum="standard_price"/>
+                  <field name='price_unit' string="Precio Venta" sum="price_unit" />
+                  <field name="cost_subtotal" string="Total Costo" sum="cost_subtotal" />
+                  <field name='price_subtotal' string="Total Venta" sum="price_subtotal"/>
+                  <field name='utilidad' string="utilidad" sum="utilidad"/>
+              </tree>
+            </field>
+      </record>
+
+
+
+    <menuitem id="invoice_utility" name="Analisis de Utilidad" parent="account.menu_finance_reports"/>
+    <menuitem id="invoice_utility_menu" name="Analisis de Utilidad de Ventas" action="account_invoice_utility" parent="invoice_utility"/>
+
+  </data>
+</openerp>

+ 25 - 0
view/templates.xml

@@ -0,0 +1,25 @@
+<openerp>
+    <data>
+        <template id="report_invoice_utility.assets_backend" name="report_invoice_utility" inherit_id="web.assets_backend">
+            <xpath expr="." position="inside">
+                <!-- <link rel="stylesheet" href="/report_invoice_utility/static/src/css/main.css" /> -->
+                <script type="text/javascript" src="/report_invoice_utility/static/src/js/jquery.serializejson.min.js" />
+                <script type="text/javascript" src="/report_invoice_utility/static/src/js/jspdf.min.js" />
+                <script type="text/javascript" src="/report_invoice_utility/static/src/js/jspdf.plugin.autotable.min.js" />
+                <script type="text/javascript" src="/report_invoice_utility/static/src/js/report_invoice_utility.js" />
+                <script type="text/javascript" src="/report_invoice_utility/static/src/js/moment.min.js"/>
+            </xpath>
+        </template>
+
+        <record id="report_invoice_utility_action" model="ir.actions.client">
+            <field name="name">Analisis de utilidad</field>
+            <field name="tag">report_invoice_utility.action_report</field>
+        </record>
+
+        <!-- <menuitem id="others_report_menu" name="Otros Reportes" parent="base.menu_reporting" /> -->
+        <menuitem id="invoice_utility_menu2"
+                  parent="report_invoice_utility.invoice_utility"
+                  name="Analisis de Utilidad Javascript"
+                  action="report_invoice_utility_action"/>
+    </data>
+</openerp>

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels