pos_sale_report.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. # -*- encoding: utf-8 -*-
  2. from openerp import models, fields
  3. from openerp import tools
  4. class pos_sale_report(models.Model):
  5. _name = 'pos.sale.report'
  6. _description = 'POS orders and Sale orders aggregated report'
  7. _auto = False
  8. _rec_name = 'date'
  9. _order = 'date desc'
  10. date = fields.Date(string='Order Date', readonly=True)
  11. product_id = fields.Many2one(
  12. 'product.product', string='Variantes', readonly=True)
  13. product_tmpl_id = fields.Many2one(
  14. 'product.template', string='Producto', readonly=True)
  15. user_id = fields.Many2one(
  16. 'res.users', string='User', readonly=True) # Add this line for user_id
  17. partner_id = fields.Many2one(
  18. 'res.partner', string='Cliente', readonly=True)
  19. # company_id = fields.Many2one(
  20. # 'res.company', string='Company', readonly=True)
  21. origin = fields.Char(string='Origin', readonly=True)
  22. qty = fields.Float(string='Cantidad', readonly=True)
  23. number = fields.Char(string='Venta', readonly=True)
  24. store_id = fields.Many2one(
  25. 'res.store', string='Sucursal', readonly=True)
  26. subtotal_taxed = fields.Float(string='total', readonly=True)
  27. standard_price = fields.Float(string='Costo', readonly=True)
  28. utility = fields.Float(string='Utilidad', readonly=True)
  29. categ_id = fields.Many2one(
  30. 'product.category', string='Categoría', readonly=True)
  31. # WARNING : this code doesn't handle uom conversion for the moment
  32. def _sale_order_select(self):
  33. select = """
  34. SELECT
  35. --min(invoice_line.id)*-1 AS id,
  36. invoice_line.id*-1 AS id,
  37. invoice.number AS number,
  38. invoice.date_invoice AS date,
  39. invoice_line.product_id AS product_id,
  40. product.product_tmpl_id AS product_tmpl_id,
  41. invoice.user_id AS user_id,
  42. invoice.partner_id AS partner_id,
  43. invoice.company_id AS company_id,
  44. 'Pedido de Venta' AS origin,
  45. --sum(invoice_line.quantity) AS qty,
  46. invoice_line.quantity AS qty,
  47. journal.store_id AS store_id,
  48. invoice_line.price_subtotal AS subtotal_untaxed,
  49. --invoice_line.discount,
  50. --((invoice_line.quantity * invoice_line.price_unit) * invoice_line.discount) / 100 AS amount_discount,
  51. (invoice_line.quantity * invoice_line.price_unit) - (((invoice_line.quantity * invoice_line.price_unit) * invoice_line.discount) / 100) AS subtotal_taxed,
  52. (array_agg(history.cost ORDER BY history.id DESC))[1] * invoice_line.quantity AS standard_price,
  53. ((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,
  54. template.categ_id
  55. FROM account_invoice_line AS invoice_line
  56. LEFT JOIN account_invoice AS invoice
  57. ON invoice.id = invoice_line.invoice_id
  58. LEFT JOIN res_users AS users
  59. ON users.id = invoice.user_id
  60. LEFT JOIN res_partner AS partner
  61. ON partner.id = invoice.partner_id
  62. LEFT JOIN product_product AS product
  63. ON product.id = invoice_line.product_id
  64. LEFT JOIN product_template AS template
  65. ON template.id = product.product_tmpl_id
  66. LEFT JOIN res_store_journal_rel as journal
  67. ON journal.journal_id = invoice.journal_id
  68. LEFT JOIN product_price_history AS history
  69. ON history.product_template_id = product.product_tmpl_id
  70. WHERE invoice.state IN ('open','paid')
  71. AND invoice.type = 'out_invoice'
  72. GROUP BY
  73. invoice_line.id,
  74. invoice.date_invoice,
  75. invoice.number,
  76. invoice_line.product_id,
  77. product.product_tmpl_id,
  78. invoice.user_id,
  79. invoice.partner_id,
  80. invoice.company_id,
  81. journal.store_id,
  82. invoice_line.price_subtotal,
  83. template.categ_id
  84. """
  85. return select
  86. def _pos_order_select(self):
  87. select = """
  88. SELECT
  89. --min(pol.id) AS id,
  90. pol.id AS id,
  91. po.name AS number,
  92. po.date_order::date AS date,
  93. pol.product_id AS product_id,
  94. product.product_tmpl_id AS product_tmpl_id,
  95. po.user_id AS user_id,
  96. po.partner_id AS partner_id,
  97. po.company_id AS company_id,
  98. 'TPV' AS origin,
  99. --sum(pol.qty) AS qty,
  100. pol.qty AS qty,
  101. journal.store_id AS store_id,
  102. pol.price_subtotal_incl AS subtotal_untaxed,
  103. pol.price_subtotal_incl AS subtotal_taxed,
  104. (array_agg(history.cost ORDER BY history.id DESC))[1] * pol.qty AS standard_price,
  105. (pol.price_subtotal_incl - ((array_agg(history.cost ORDER BY history.id DESC))[1] * pol.qty)) AS utility,
  106. template.categ_id
  107. FROM pos_order_line AS pol
  108. LEFT JOIN pos_order AS po
  109. ON po.id = pol.order_id
  110. LEFT JOIN res_users AS users
  111. ON users.id = po.user_id
  112. LEFT JOIN res_partner AS partner
  113. ON partner.id = po.partner_id
  114. LEFT JOIN product_product AS product
  115. ON product.id = pol.product_id
  116. LEFT JOIN product_template AS template
  117. ON template.id = product.product_tmpl_id
  118. LEFT JOIN res_store_journal_rel as journal
  119. ON journal.journal_id = po.sale_journal
  120. LEFT JOIN product_price_history AS history
  121. ON history.product_template_id = product.product_tmpl_id
  122. WHERE po.state IN ('paid', 'done', 'invoiced')
  123. GROUP BY
  124. pol.id,
  125. po.name,
  126. po.date_order,
  127. pol.product_id,
  128. product.product_tmpl_id,
  129. po.user_id,
  130. po.partner_id,
  131. po.company_id,
  132. journal.store_id,
  133. pol.price_subtotal_incl,
  134. template.categ_id
  135. """
  136. return select
  137. def init(self, cr):
  138. tools.drop_view_if_exists(cr, self._table)
  139. cr.execute("CREATE OR REPLACE VIEW %s AS (%s UNION %s)" % (
  140. self._table, self._sale_order_select(), self._pos_order_select()))