odoo18/addons/stock/report/stock_lot_customer.py

101 lines
3.4 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models
class StockLotReport(models.Model):
_name = "stock.lot.report"
_description = "Customer Lot Report"
_rec_name = 'lot_id'
_auto = False
lot_id = fields.Many2one('stock.lot', 'Lot/Serial', readonly=True)
product_id = fields.Many2one('product.product', readonly=True)
partner_id = fields.Many2one('res.partner', readonly=True)
picking_id = fields.Many2one('stock.picking', readonly=True)
quantity = fields.Float(readonly=True)
uom_id = fields.Many2one('uom.uom', readonly=True)
delivery_date = fields.Datetime(readonly=True)
address = fields.Char(readonly=True)
has_return = fields.Boolean(readonly=True)
def _select(self):
return """
MIN(sml.id) AS id,
lot.id lot_id,
lot.product_id,
partner.id partner_id,
picking.id picking_id,
sml.quantity,
sml.product_uom_id uom_id,
CONCAT_WS(', ', partner.street, partner.street2, partner.city, partner.zip, state.name, country.code) address,
MIN(sml_return.id) IS NOT NULL AS has_return,
picking.date_done delivery_date
"""
def _join_on_picking_type_and_partner(self):
# todo remove master
return """
JOIN stock_picking_type AS type
ON picking.picking_type_id = type.id and type.code = 'outgoing'
JOIN res_partner AS partner
ON partner.id = picking.partner_id
"""
def _outgoing_operation_types(self):
return "'outgoing'"
def _from(self):
return f"""
stock_lot lot
JOIN stock_move_line AS sml
ON lot.id = sml.lot_id
JOIN stock_move AS sm
ON sm.id = sml.move_id
JOIN stock_picking AS picking
ON picking.id = COALESCE(sm.picking_id, sml.picking_id)
JOIN stock_picking_type AS type
ON type.id = COALESCE(sm.picking_type_id, picking.picking_type_id) and type.code in ({self._outgoing_operation_types()})
JOIN res_partner AS partner
ON partner.id = COALESCE(sm.partner_id, picking.partner_id)
LEFT JOIN res_country_state AS state
ON state.id = partner.state_id
LEFT JOIN res_country AS country
ON country.id = partner.country_id
LEFT JOIN stock_picking AS picking_return
ON picking_return.return_id = sml.picking_id
LEFT JOIN stock_move_line AS sml_return
ON sml_return.picking_id = picking_return.id
AND sml_return.lot_id = lot.id
AND sml_return.state = 'done'
"""
def _group_by(self):
return """
picking.id,
partner.id,
lot.id,
lot.product_id,
country.code,
state.name,
partner.zip,
partner.city,
partner.street,
partner.street2,
sml.quantity,
sml.product_uom_id,
picking.date_done,
sml_return.id
"""
def _query(self):
return f"""
SELECT {self._select()}
FROM {self._from()}
GROUP BY {self._group_by()}
"""
@property
def _table_query(self):
return self._query()