|
@@ -0,0 +1,137 @@
|
|
|
+# -*- encoding: utf-8 -*-
|
|
|
+from openerp import models, fields
|
|
|
+from openerp import tools
|
|
|
+
|
|
|
+
|
|
|
+class pos_sale_report(models.Model):
|
|
|
+ _name = 'pos.sale.report'
|
|
|
+ _description = 'POS orders and Sale orders aggregated report'
|
|
|
+ _auto = False
|
|
|
+ _rec_name = 'date'
|
|
|
+ _order = 'date desc'
|
|
|
+
|
|
|
+ date = fields.Date(string='Order Date', readonly=True)
|
|
|
+ product_id = fields.Many2one(
|
|
|
+ 'product.product', string='Variantes', readonly=True)
|
|
|
+ product_tmpl_id = fields.Many2one(
|
|
|
+ 'product.template', string='Producto', readonly=True)
|
|
|
+ user_id = fields.Many2one(
|
|
|
+ 'res.users', string='User', readonly=True) # Add this line for user_id
|
|
|
+ # company_id = fields.Many2one(
|
|
|
+ # 'res.company', string='Company', readonly=True)
|
|
|
+ origin = fields.Char(string='Origin', readonly=True)
|
|
|
+ qty = fields.Float(string='Cantidad', readonly=True)
|
|
|
+
|
|
|
+ number = fields.Char(string='Venta', readonly=True)
|
|
|
+ store_id = fields.Many2one(
|
|
|
+ 'res.store', string='Sucursal', readonly=True)
|
|
|
+ subtotal_taxed = fields.Float(string='total', readonly=True)
|
|
|
+ standard_price = fields.Float(string='Costo', readonly=True)
|
|
|
+ utility = fields.Float(string='Utilidad', readonly=True)
|
|
|
+ categ_id = fields.Many2one(
|
|
|
+ 'product.category', string='Categoría', readonly=True)
|
|
|
+
|
|
|
+ # WARNING : this code doesn't handle uom conversion for the moment
|
|
|
+ def _sale_order_select(self):
|
|
|
+ select = """
|
|
|
+ SELECT
|
|
|
+ --min(invoice_line.id)*-1 AS id,
|
|
|
+ invoice_line.id*-1 AS id,
|
|
|
+ invoice.number AS number,
|
|
|
+ invoice.date_invoice AS date,
|
|
|
+ invoice_line.product_id AS product_id,
|
|
|
+ product.product_tmpl_id AS product_tmpl_id,
|
|
|
+ invoice.user_id AS user_id,
|
|
|
+ invoice.company_id AS company_id,
|
|
|
+ 'Pedido de Venta' AS origin,
|
|
|
+ --sum(invoice_line.quantity) AS qty,
|
|
|
+ invoice_line.quantity AS qty,
|
|
|
+ journal.store_id AS store_id,
|
|
|
+ invoice_line.price_subtotal AS subtotal_untaxed,
|
|
|
+ --invoice_line.discount,
|
|
|
+ --((invoice_line.quantity * invoice_line.price_unit) * invoice_line.discount) / 100 AS amount_discount,
|
|
|
+ (invoice_line.quantity * invoice_line.price_unit) - (((invoice_line.quantity * invoice_line.price_unit) * invoice_line.discount) / 100) AS subtotal_taxed,
|
|
|
+ (array_agg(history.cost ORDER BY history.id DESC))[1] * invoice_line.quantity AS standard_price,
|
|
|
+ ((invoice_line.quantity * invoice_line.price_unit) - (((invoice_line.quantity * invoice_line.price_unit) * invoice_line.discount) / 100) - ((array_agg(history.cost ORDER BY history.id DESC))[1] * invoice_line.quantity)) AS utility,
|
|
|
+ template.categ_id
|
|
|
+ FROM account_invoice_line AS invoice_line
|
|
|
+ LEFT JOIN account_invoice AS invoice
|
|
|
+ ON invoice.id = invoice_line.invoice_id
|
|
|
+ LEFT JOIN res_users AS users
|
|
|
+ ON users.id = invoice.user_id
|
|
|
+ LEFT JOIN product_product AS product
|
|
|
+ ON product.id = invoice_line.product_id
|
|
|
+ LEFT JOIN product_template AS template
|
|
|
+ ON template.id = product.product_tmpl_id
|
|
|
+ LEFT JOIN res_store_journal_rel as journal
|
|
|
+ ON journal.journal_id = invoice.journal_id
|
|
|
+ LEFT JOIN product_price_history AS history
|
|
|
+ ON history.product_template_id = product.product_tmpl_id
|
|
|
+ WHERE invoice.state IN ('open','paid')
|
|
|
+ AND invoice.type = 'out_invoice'
|
|
|
+ GROUP BY
|
|
|
+ invoice_line.id,
|
|
|
+ invoice.date_invoice,
|
|
|
+ invoice.number,
|
|
|
+ invoice_line.product_id,
|
|
|
+ product.product_tmpl_id,
|
|
|
+ invoice.user_id,
|
|
|
+ invoice.company_id,
|
|
|
+ journal.store_id,
|
|
|
+ invoice_line.price_subtotal,
|
|
|
+ template.categ_id
|
|
|
+ """
|
|
|
+ return select
|
|
|
+
|
|
|
+ def _pos_order_select(self):
|
|
|
+ select = """
|
|
|
+ SELECT
|
|
|
+ --min(pol.id) AS id,
|
|
|
+ pol.id AS id,
|
|
|
+ po.name AS number,
|
|
|
+ po.date_order::date AS date,
|
|
|
+ pol.product_id AS product_id,
|
|
|
+ product.product_tmpl_id AS product_tmpl_id,
|
|
|
+ po.user_id AS user_id,
|
|
|
+ po.company_id AS company_id,
|
|
|
+ 'TPV' AS origin,
|
|
|
+ --sum(pol.qty) AS qty,
|
|
|
+ pol.qty AS qty,
|
|
|
+ journal.store_id AS store_id,
|
|
|
+ pol.price_subtotal_incl AS subtotal_untaxed,
|
|
|
+ pol.price_subtotal_incl AS subtotal_taxed,
|
|
|
+ (array_agg(history.cost ORDER BY history.id DESC))[1] * pol.qty AS standard_price,
|
|
|
+ (pol.price_subtotal_incl - ((array_agg(history.cost ORDER BY history.id DESC))[1] * pol.qty)) AS utility,
|
|
|
+ template.categ_id
|
|
|
+ FROM pos_order_line AS pol
|
|
|
+ LEFT JOIN pos_order AS po
|
|
|
+ ON po.id = pol.order_id
|
|
|
+ LEFT JOIN res_users AS users
|
|
|
+ ON users.id = po.user_id
|
|
|
+ LEFT JOIN product_product AS product
|
|
|
+ ON product.id = pol.product_id
|
|
|
+ LEFT JOIN product_template AS template
|
|
|
+ ON template.id = product.product_tmpl_id
|
|
|
+ LEFT JOIN res_store_journal_rel as journal
|
|
|
+ ON journal.journal_id = po.sale_journal
|
|
|
+ LEFT JOIN product_price_history AS history
|
|
|
+ ON history.product_template_id = product.product_tmpl_id
|
|
|
+ WHERE po.state IN ('paid', 'done', 'invoiced')
|
|
|
+ GROUP BY
|
|
|
+ pol.id,
|
|
|
+ po.name,
|
|
|
+ po.date_order,
|
|
|
+ pol.product_id,
|
|
|
+ product.product_tmpl_id,
|
|
|
+ po.user_id,
|
|
|
+ po.company_id,
|
|
|
+ journal.store_id,
|
|
|
+ pol.price_subtotal_incl,
|
|
|
+ template.categ_id
|
|
|
+ """
|
|
|
+ return select
|
|
|
+
|
|
|
+ def init(self, cr):
|
|
|
+ tools.drop_view_if_exists(cr, self._table)
|
|
|
+ cr.execute("CREATE OR REPLACE VIEW %s AS (%s UNION %s)" % (
|
|
|
+ self._table, self._sale_order_select(), self._pos_order_select()))
|