purchase_stock/report/vendor_delay_report.py

62 lines
2.4 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models, tools
from odoo.tools import SQL
class VendorDelayReport(models.Model):
_name = "vendor.delay.report"
_description = "Vendor Delay Report"
_auto = False
partner_id = fields.Many2one('res.partner', 'Vendor', readonly=True)
product_id = fields.Many2one('product.product', 'Product', readonly=True)
category_id = fields.Many2one('product.category', 'Product Category', readonly=True)
date = fields.Datetime('Effective Date', readonly=True)
qty_total = fields.Float('Total Quantity', readonly=True)
qty_on_time = fields.Float('On-Time Quantity', readonly=True)
on_time_rate = fields.Float('On-Time Delivery Rate', readonly=True)
def init(self):
tools.drop_view_if_exists(self.env.cr, 'vendor_delay_report')
self.env.cr.execute("""
CREATE OR replace VIEW vendor_delay_report AS(
SELECT m.id AS id,
m.date AS date,
m.purchase_line_id AS purchase_line_id,
m.product_id AS product_id,
Min(pc.id) AS category_id,
Min(po.partner_id) AS partner_id,
Min(m.product_qty) AS qty_total,
Sum(CASE
WHEN (m.state = 'done' and pol.date_planned::date >= m.date::date) THEN (ml.quantity / ml_uom.factor * pt_uom.factor)
ELSE 0
END) AS qty_on_time
FROM stock_move m
JOIN purchase_order_line pol
ON pol.id = m.purchase_line_id
JOIN purchase_order po
ON po.id = pol.order_id
JOIN product_product p
ON p.id = m.product_id
JOIN product_template pt
ON pt.id = p.product_tmpl_id
JOIN uom_uom pt_uom
ON pt_uom.id = pt.uom_id
JOIN product_category pc
ON pc.id = pt.categ_id
LEFT JOIN stock_move_line ml
ON ml.move_id = m.id
LEFT JOIN uom_uom ml_uom
ON ml_uom.id = ml.product_uom_id
GROUP BY m.id
)""")
def _read_group_select(self, aggregate_spec, query):
if aggregate_spec == 'on_time_rate:sum':
# Make a weigthed average instead of simple average for these fields
sql_expr = SQL('SUM(qty_on_time) / SUM(qty_total) * 100')
return sql_expr, ['on_time_rate', 'qty_on_time', 'qty_total']
return super()._read_group_select(aggregate_spec, query)