80 lines
2.5 KiB
Python
80 lines
2.5 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,
|
|
picking.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,
|
|
(SELECT COUNT(sp_return.id) FROM stock_picking sp_return WHERE sp_return.return_id = picking.id) > 0 AS has_return,
|
|
picking.date_done delivery_date
|
|
"""
|
|
|
|
def _from(self):
|
|
return """
|
|
stock_lot lot
|
|
JOIN stock_move_line AS sml
|
|
ON lot.id = sml.lot_id
|
|
JOIN stock_picking AS picking
|
|
ON picking.id = sml.picking_id
|
|
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
|
|
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
|
|
"""
|
|
|
|
def _group_by(self):
|
|
return """
|
|
picking.id,
|
|
picking.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
|
|
"""
|
|
|
|
def _query(self):
|
|
return f"""
|
|
SELECT {self._select()}
|
|
FROM {self._from()}
|
|
GROUP BY {self._group_by()}
|
|
"""
|
|
|
|
@property
|
|
def _table_query(self):
|
|
return self._query()
|