diff --git a/modules/purchase_trade/stock.py b/modules/purchase_trade/stock.py index 288218d..a64b9c8 100755 --- a/modules/purchase_trade/stock.py +++ b/modules/purchase_trade/stock.py @@ -622,9 +622,18 @@ class ShipmentIn(metaclass=PoolMeta): booking_date =fields.Date("Booking date") ref = fields.Char("Our reference") note = fields.Text("Notes") - dashboard = fields.Many2One('purchase.dashboard',"Dashboard") + dashboard = fields.Many2One('purchase.dashboard',"Dashboard") himself = fields.Function(fields.Many2One('stock.shipment.in',"Shipment"),'get_sh') charter_party = fields.Many2One('stock.charter.party', "Charter Party") + owner_charter_conditions = fields.Function( + fields.One2Many('charter.condition', '', "Owner Conditions"), + 'get_owner_charter_conditions') + purchase_charter_conditions = fields.Function( + fields.One2Many('charter.condition', '', "Supplier Conditions"), + 'get_purchase_charter_conditions') + sale_charter_conditions = fields.Function( + fields.One2Many('charter.condition', '', "Customer Conditions"), + 'get_sale_charter_conditions') sof = fields.One2Many('sof.statement', 'shipment',"Demurrage calculations") del_from = fields.Date("Delivery period from") del_to = fields.Date("to") @@ -1618,9 +1627,65 @@ class ShipmentIn(metaclass=PoolMeta): return sum([(e.quantity if e.quantity else 0) for e in self.incoming_moves]) if self.lotqt: return sum([(e.lot_quantity if e.lot_quantity else 0) for e in self.lotqt]) - - def get_bales(self,name=None): - Lot = Pool().get('lot.lot') + + @staticmethod + def _unique_condition_ids(conditions): + ids = [] + seen = set() + for condition in conditions or []: + condition_id = getattr(condition, 'id', condition) + if not condition_id or condition_id in seen: + continue + seen.add(condition_id) + ids.append(condition_id) + return ids + + def get_owner_charter_conditions(self, name=None): + return self._unique_condition_ids( + getattr(self.charter_party, 'conditions', None) or []) + + def _get_purchase_lines_from_lots(self): + lines = [] + seen = set() + for lot_qt in getattr(self, 'lotqt', []) or []: + line = getattr(getattr(lot_qt, 'lot_p', None), 'line', None) + line_id = getattr(line, 'id', None) + if not line or line_id in seen: + continue + seen.add(line_id) + lines.append(line) + return lines + + def _get_sale_lines_from_lots(self): + lines = [] + seen = set() + for lot_qt in getattr(self, 'lotqt', []) or []: + line = getattr(getattr(lot_qt, 'lot_s', None), 'sale_line', None) + line_id = getattr(line, 'id', None) + if not line or line_id in seen: + continue + seen.add(line_id) + lines.append(line) + return lines + + def get_purchase_charter_conditions(self, name=None): + conditions = [] + for line in self._get_purchase_lines_from_lots(): + getter = getattr(line, 'get_effective_charter_conditions', None) + if getter: + conditions.extend(getter()) + return self._unique_condition_ids(conditions) + + def get_sale_charter_conditions(self, name=None): + conditions = [] + for line in self._get_sale_lines_from_lots(): + getter = getattr(line, 'get_effective_charter_conditions', None) + if getter: + conditions.extend(getter()) + return self._unique_condition_ids(conditions) + + def get_bales(self,name=None): + Lot = Pool().get('lot.lot') lots = Lot.search(['lot_shipment_in','=',self.id]) if lots: return sum([l.lot_qt for l in lots]) @@ -1879,6 +1944,15 @@ class StatementOfFacts(ModelSQL, ModelView): timebar_day = fields.Integer("TimeBar") timebar_warn = fields.Integer("Warning TimeBar") charter_party = fields.Many2One('stock.charter.party', "Charter Party") + owner_charter_conditions = fields.Function( + fields.One2Many('charter.condition', '', "Owner Conditions"), + 'get_owner_charter_conditions') + purchase_charter_conditions = fields.Function( + fields.One2Many('charter.condition', '', "Supplier Conditions"), + 'get_purchase_charter_conditions') + sale_charter_conditions = fields.Function( + fields.One2Many('charter.condition', '', "Customer Conditions"), + 'get_sale_charter_conditions') chart = fields.Many2One('document.incoming',"Charter Party Terms") sof = fields.Many2One('document.incoming',"Statement of facts") @@ -1914,6 +1988,23 @@ class StatementOfFacts(ModelSQL, ModelView): if self.shipment and self.shipment.charter_party and not self.charter_party: self.charter_party = self.shipment.charter_party + def get_owner_charter_conditions(self, name=None): + if self.charter_party: + return ShipmentIn._unique_condition_ids(self.charter_party.conditions) + if self.shipment: + return self.shipment.get_owner_charter_conditions(name) + return [] + + def get_purchase_charter_conditions(self, name=None): + if self.shipment: + return self.shipment.get_purchase_charter_conditions(name) + return [] + + def get_sale_charter_conditions(self, name=None): + if self.shipment: + return self.shipment.get_sale_charter_conditions(name) + return [] + def get_qt(self,name): if self.shipment: return self.shipment.get_quantity() diff --git a/modules/purchase_trade/view/shipment_in_form.xml b/modules/purchase_trade/view/shipment_in_form.xml index bf23839..1b36f2a 100755 --- a/modules/purchase_trade/view/shipment_in_form.xml +++ b/modules/purchase_trade/view/shipment_in_form.xml @@ -111,6 +111,18 @@ this repository contains the full copyright notices and license terms. -->