Purpose of this commit is to give description more "business oriented" because those descriptions appears in Odoo Studio which is supposed to be used by end users, not only by developers. Related Task ID : 37311
141 lines
6.8 KiB
Python
141 lines
6.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
#
|
|
# Please note that these reports are not multi-currency !!!
|
|
#
|
|
|
|
from odoo import api, fields, models, tools
|
|
|
|
|
|
class PurchaseReport(models.Model):
|
|
_name = "purchase.report"
|
|
_description = "Purchase Report"
|
|
_auto = False
|
|
_order = 'date_order desc, price_total desc'
|
|
|
|
date_order = fields.Datetime('Order Date', readonly=True, help="Date on which this document has been created", oldname='date')
|
|
state = fields.Selection([
|
|
('draft', 'Draft RFQ'),
|
|
('sent', 'RFQ Sent'),
|
|
('to approve', 'To Approve'),
|
|
('purchase', 'Purchase Order'),
|
|
('done', 'Done'),
|
|
('cancel', 'Cancelled')
|
|
], 'Order Status', readonly=True)
|
|
product_id = fields.Many2one('product.product', 'Product', readonly=True)
|
|
partner_id = fields.Many2one('res.partner', 'Vendor', readonly=True)
|
|
date_approve = fields.Date('Date Approved', readonly=True)
|
|
product_uom = fields.Many2one('uom.uom', 'Reference Unit of Measure', required=True)
|
|
company_id = fields.Many2one('res.company', 'Company', readonly=True)
|
|
currency_id = fields.Many2one('res.currency', 'Currency', readonly=True)
|
|
user_id = fields.Many2one('res.users', 'Purchase Representative', readonly=True)
|
|
delay = fields.Float('Days to Validate', digits=(16, 2), readonly=True)
|
|
delay_pass = fields.Float('Days to Deliver', digits=(16, 2), readonly=True)
|
|
unit_quantity = fields.Float('Product Quantity', readonly=True, oldname='quantity')
|
|
price_total = fields.Float('Total Price', readonly=True)
|
|
price_average = fields.Float('Average Price', readonly=True, group_operator="avg")
|
|
negociation = fields.Float('Purchase-Standard Price', readonly=True, group_operator="avg")
|
|
price_standard = fields.Float('Products Value', readonly=True, group_operator="sum")
|
|
nbr_lines = fields.Integer('# of Lines', readonly=True, oldname='nbr')
|
|
category_id = fields.Many2one('product.category', 'Product Category', readonly=True)
|
|
product_tmpl_id = fields.Many2one('product.template', 'Product Template', readonly=True)
|
|
country_id = fields.Many2one('res.country', 'Partner Country', readonly=True)
|
|
fiscal_position_id = fields.Many2one('account.fiscal.position', string='Fiscal Position', oldname='fiscal_position', readonly=True)
|
|
account_analytic_id = fields.Many2one('account.analytic.account', 'Analytic Account', readonly=True)
|
|
commercial_partner_id = fields.Many2one('res.partner', 'Commercial Entity', readonly=True)
|
|
weight = fields.Float('Gross Weight', readonly=True)
|
|
volume = fields.Float('Volume', readonly=True)
|
|
|
|
@api.model_cr
|
|
def init(self):
|
|
# self._table = sale_report
|
|
tools.drop_view_if_exists(self.env.cr, self._table)
|
|
self.env.cr.execute("""CREATE or REPLACE VIEW %s as (
|
|
%s
|
|
FROM ( %s )
|
|
%s
|
|
)""" % (self._table, self._select(), self._from(), self._group_by()))
|
|
|
|
def _select(self):
|
|
select_str = """
|
|
WITH currency_rate as (%s)
|
|
SELECT
|
|
min(l.id) as id,
|
|
s.date_order as date_order,
|
|
s.state,
|
|
s.date_approve,
|
|
s.dest_address_id,
|
|
s.partner_id as partner_id,
|
|
s.user_id as user_id,
|
|
s.company_id as company_id,
|
|
s.fiscal_position_id as fiscal_position_id,
|
|
l.product_id,
|
|
p.product_tmpl_id,
|
|
t.categ_id as category_id,
|
|
s.currency_id,
|
|
t.uom_id as product_uom,
|
|
sum(l.product_qty/u.factor*u2.factor) as unit_quantity,
|
|
extract(epoch from age(s.date_approve,s.date_order))/(24*60*60)::decimal(16,2) as delay,
|
|
extract(epoch from age(l.date_planned,s.date_order))/(24*60*60)::decimal(16,2) as delay_pass,
|
|
count(*) as nbr_lines,
|
|
sum(l.price_unit / COALESCE(cr.rate, 1.0) * l.product_qty)::decimal(16,2) as price_total,
|
|
avg(100.0 * (l.price_unit / COALESCE(cr.rate,1.0) * l.product_qty) / NULLIF(ip.value_float*l.product_qty/u.factor*u2.factor, 0.0))::decimal(16,2) as negociation,
|
|
sum(ip.value_float*l.product_qty/u.factor*u2.factor)::decimal(16,2) as price_standard,
|
|
(sum(l.product_qty * l.price_unit / COALESCE(cr.rate, 1.0))/NULLIF(sum(l.product_qty/u.factor*u2.factor),0.0))::decimal(16,2) as price_average,
|
|
partner.country_id as country_id,
|
|
partner.commercial_partner_id as commercial_partner_id,
|
|
analytic_account.id as account_analytic_id,
|
|
sum(p.weight * l.product_qty/u.factor*u2.factor) as weight,
|
|
sum(p.volume * l.product_qty/u.factor*u2.factor) as volume
|
|
""" % self.env['res.currency']._select_companies_rates()
|
|
return select_str
|
|
|
|
def _from(self):
|
|
from_str = """
|
|
purchase_order_line l
|
|
join purchase_order s on (l.order_id=s.id)
|
|
join res_partner partner on s.partner_id = partner.id
|
|
left join product_product p on (l.product_id=p.id)
|
|
left join product_template t on (p.product_tmpl_id=t.id)
|
|
LEFT JOIN ir_property ip ON (ip.name='standard_price' AND ip.res_id=CONCAT('product.product,',p.id) AND ip.company_id=s.company_id)
|
|
left join uom_uom u on (u.id=l.product_uom)
|
|
left join uom_uom u2 on (u2.id=t.uom_id)
|
|
left join account_analytic_account analytic_account on (l.account_analytic_id = analytic_account.id)
|
|
left join currency_rate cr on (cr.currency_id = s.currency_id and
|
|
cr.company_id = s.company_id and
|
|
cr.date_start <= coalesce(s.date_order, now()) and
|
|
(cr.date_end is null or cr.date_end > coalesce(s.date_order, now())))
|
|
"""
|
|
return from_str
|
|
|
|
def _group_by(self):
|
|
group_by_str = """
|
|
GROUP BY
|
|
s.company_id,
|
|
s.user_id,
|
|
s.partner_id,
|
|
u.factor,
|
|
s.currency_id,
|
|
l.price_unit,
|
|
s.date_approve,
|
|
l.date_planned,
|
|
l.product_uom,
|
|
s.dest_address_id,
|
|
s.fiscal_position_id,
|
|
l.product_id,
|
|
p.product_tmpl_id,
|
|
t.categ_id,
|
|
s.date_order,
|
|
s.state,
|
|
u.uom_type,
|
|
u.category_id,
|
|
t.uom_id,
|
|
u.id,
|
|
u2.factor,
|
|
partner.country_id,
|
|
partner.commercial_partner_id,
|
|
analytic_account.id
|
|
"""
|
|
return group_by_str
|