From d9ab3cfe4718cc32fcad09d9f863f921041d8ba9 Mon Sep 17 00:00:00 2001 From: laurentbarontini Date: Tue, 20 Jan 2026 19:36:31 +0100 Subject: [PATCH] 20.01.26 --- modules/purchase_trade/weight_report.py | 148 +++++++++++++++++------- 1 file changed, 109 insertions(+), 39 deletions(-) diff --git a/modules/purchase_trade/weight_report.py b/modules/purchase_trade/weight_report.py index e7920ef..95ffeaa 100644 --- a/modules/purchase_trade/weight_report.py +++ b/modules/purchase_trade/weight_report.py @@ -1,6 +1,7 @@ from trytond.model import ModelSQL, ModelView, fields from trytond.pool import Pool -import datetime +from decimal import Decimal +from datetime import datetime as dt class WeightReport(ModelSQL, ModelView): 'Weight Report' @@ -64,47 +65,116 @@ class WeightReport(ModelSQL, ModelView): # def export_json(cls, reports): # pass - # @classmethod - # def create_from_json(cls, json_data): - # """Crée un rapport à partir de données JSON""" - # report = cls() + @classmethod + def create_from_json(cls, json_data): + """Crée un rapport à partir de données JSON""" + pool = Pool() + Party = pool.get('party.party') + Vessel = pool.get('trade.vessel') + Location = pool.get('stock.location') - # # Mapping des données JSON vers les champs du modèle - # report.lab = json_data.get('lab', '') - # report_data = json_data.get('report', {}) - # report.reference = report_data.get('reference', '') - # report.file_no = report_data.get('file_no', '') - # report.report_date = report_data.get('date', '') + # Préparer les données + report = {} - # contract_data = json_data.get('contract', {}) - # report.contract_no = contract_data.get('contract_no', '') - # report.invoice_no = contract_data.get('invoice_no', '') - # report.lc_no = contract_data.get('lc_no', '') - # report.origin = contract_data.get('origin', '') - # report.commodity = contract_data.get('commodity', '') + # 1. Identification (champs simples) + report['lab'] = json_data.get('lab', '') - # parties_data = json_data.get('parties', {}) - # report.seller = parties_data.get('seller', '') - # report.buyer = parties_data.get('buyer', '') - # report.carrier = parties_data.get('carrier', '') + # 2. Report Information + report_data = json_data.get('report', {}) + report['reference'] = report_data.get('reference', '') + report['file_no'] = report_data.get('file_no', '') - # shipment_data = json_data.get('shipment', {}) - # report.vessel = shipment_data.get('vessel', '') - # report.bl_no = shipment_data.get('bl_no', '') - # report.bl_date = shipment_data.get('bl_date', '') - # report.port_loading = shipment_data.get('port_loading', '') - # report.port_destination = shipment_data.get('port_destination', '') - # report.arrival_date = shipment_data.get('arrival_date', '') - # report.weighing_place = shipment_data.get('weighing_place', '') - # report.weighing_method = shipment_data.get('weighing_method', '') - # report.bales = shipment_data.get('bales', 0) + # Conversion de la date (format: "28 October 2025") + date_str = report_data.get('date', '') + if date_str: + try: + report['report_date'] = dt.strptime(date_str, '%d %B %Y').date() + except: + report['report_date'] = None - # weights_data = json_data.get('weights', {}) - # report.gross_landed_kg = weights_data.get('gross_landed_kg', 0) - # report.tare_kg = weights_data.get('tare_kg', 0) - # report.net_landed_kg = weights_data.get('net_landed_kg', 0) - # report.invoice_net_kg = weights_data.get('invoice_net_kg', 0) - # report.gain_loss_kg = weights_data.get('gain_loss_kg', 0) - # report.gain_loss_percent = weights_data.get('gain_loss_percent', 0) + # 3. Contract Information + contract_data = json_data.get('contract', {}) + report['contract_no'] = contract_data.get('contract_no', '') + report['invoice_no'] = contract_data.get('invoice_no', '') + report['lc_no'] = contract_data.get('lc_no', '') + report['origin'] = contract_data.get('origin', '') + report['commodity'] = contract_data.get('commodity', '') - # return report \ No newline at end of file + # 4. Parties Information (Many2One) + parties_data = json_data.get('parties', {}) + + # Recherche ou création des parties + seller_name = parties_data.get('seller', '') + if seller_name: + seller = Party.find_or_create_by_name(seller_name) + report['seller'] = seller.id if seller else None + + buyer_name = parties_data.get('buyer', '') + if buyer_name: + buyer = Party.find_or_create_by_name(buyer_name) + report['buyer'] = buyer.id if buyer else None + + carrier_name = parties_data.get('carrier', '') + if carrier_name: + carrier = Party.find_or_create_by_name(carrier_name) + report['carrier'] = carrier.id if carrier else None + + # 5. Shipment Information + shipment_data = json_data.get('shipment', {}) + + # Recherche du navire par nom + vessel_name = shipment_data.get('vessel', '') + if vessel_name: + vessel = Vessel.search([('vessel_name', '=', vessel_name)], limit=1) + report['vessel'] = vessel[0].id if vessel else None + + report['bl_no'] = shipment_data.get('bl_no', '') + + # Conversion de la date B/L (format: "16-Aug-2025") + bl_date_str = shipment_data.get('bl_date', '') + if bl_date_str: + try: + report['bl_date'] = dt.strptime(bl_date_str, '%d-%b-%Y').date() + except: + report['bl_date'] = None + + # Ports (Many2One - nécessite recherche par nom) + port_loading_name = shipment_data.get('port_loading', '') + if port_loading_name: + port_loading = Location.search([ + ('name', '=', port_loading_name), + ('type', '=', 'storage') + ], limit=1) + report['port_loading'] = port_loading[0].id if port_loading else None + + port_destination_name = shipment_data.get('port_destination', '') + if port_destination_name: + port_destination = Location.search([ + ('name', '=', port_destination_name), + ('type', '=', 'storage') + ], limit=1) + report['port_destination'] = port_destination[0].id if port_destination else None + + # Conversion de la date d'arrivée (format: "20-Oct-2025") + arrival_date_str = shipment_data.get('arrival_date', '') + if arrival_date_str: + try: + report['arrival_date'] = dt.strptime(arrival_date_str, '%d-%b-%Y').date() + except: + report['arrival_date'] = None + + report['weighing_place'] = shipment_data.get('weighing_place', '') + report['weighing_method'] = shipment_data.get('weighing_method', '') + report['bales'] = int(shipment_data.get('bales', 0) or 0) + + # 6. Weights Information + weights_data = json_data.get('weights', {}) + report['gross_landed_kg'] = Decimal(weights_data.get('gross_landed_kg', 0) or 0) + report['tare_kg'] = Decimal(weights_data.get('tare_kg', 0) or 0) + report['net_landed_kg'] = Decimal(weights_data.get('net_landed_kg', 0) or 0) + report['invoice_net_kg'] = Decimal(weights_data.get('invoice_net_kg', 0) or 0) + report['gain_loss_kg'] = Decimal(weights_data.get('gain_loss_kg', 0) or 0) + report['gain_loss_percent'] = Decimal(weights_data.get('gain_loss_percent', 0) or 0) + + # 7. Création du rapport + return cls.create([report])[0] \ No newline at end of file