20.01.26
This commit is contained in:
@@ -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
|
||||
# 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]
|
||||
Reference in New Issue
Block a user