This commit is contained in:
2026-01-26 17:32:33 +01:00
parent fbfc943301
commit 757b9f724d
5 changed files with 145 additions and 8 deletions

View File

@@ -4,10 +4,12 @@ from trytond.pyson import Eval
from trytond.wizard import Button from trytond.wizard import Button
from trytond.transaction import Transaction from trytond.transaction import Transaction
from sql import Table from sql import Table
from decimal import getcontext, Decimal, ROUND_HALF_UP
import requests import requests
import io import io
import logging import logging
import json import json
from trytond.modules.purchase_trade.service import ContractFactory
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -218,22 +220,123 @@ class AutomationDocument(ModelSQL, ModelView, Workflow):
t.CUSTOMER, t.CUSTOMER,
t.SELL_PRICE_CURRENCY, t.SELL_PRICE_CURRENCY,
t.SELL_PRICE_UNIT, t.SELL_PRICE_UNIT,
t.SELL_PRICE,
t.SALE_INVOICE, t.SALE_INVOICE,
t.SELL_INV_AMOUNT, t.SELL_INV_AMOUNT,
t.SALE_INVOICE_DATE, t.SALE_INVOICE_DATE,
t.SELL_PREMIUM, t.SELL_PREMIUM,
t.SALE_CONTRACT, t.SALE_CONTRACT,
t.DECLARATION_KEY,
where=(t.BOOKING_NUMBER == sh[0].bl_number) where=(t.BOOKING_NUMBER == sh[0].bl_number)
)) ))
rows = cursor.fetchall() rows = cursor.fetchall()
if rows: if rows:
#Purchase & Sale creation
Purchase = Pool().get('purchase.purchase')
PurchaseLine = Pool().get('purchase.line')
for row in rows: for row in rows:
#Purchase & Sale creation
LotQt = Pool().get('lot.qt')
LotAdd = Pool().get('lot.add.line')
Currency = Pool().get('currency.currency')
Product = Pool().get('product.product')
Party = Pool().get('party.party')
Uom = Pool().get('product.uom')
Sale = Pool().get('sale.sale')
SaleLine = Pool().get('sale.line')
dec_key = str(rows[0][16]).strip()
lot_unit = str(rows[0][5]).strip().lower()
product = str(rows[0][6]).strip().upper()
lot_net_weight = Decimal(rows[0][4])
lot_gross_weight = Decimal(rows[0][3])
lot_bales = int(rows[0][2])
lot_number = rows[0][1]
customer = str(rows[0][7]).strip().upper()
sell_price_currency = str(rows[0][8]).strip().upper()
sell_price_unit = str(rows[0][9]).strip().lower()
sell_price = Decimal(rows[0][10])
premium = Decimal(rows[0][14])
reference = Decimal(rows[0][15])
declaration = SaleLine.search(['note','=',dec_key])
if declaration:
sale_line = declaration[0]
logger.info("WITH_DEC:%s",sale_line)
vlot = sale_line.lots[0]
lqt = LotQt.search([('lot_s','=',vlot.id)])
lqt.lot_p.updateVirtualPart(lot_net_weight,sh,lqt.lot_s)
logger.info("WITH_DEC_LOT_NET:%s",lot_net_weight)
else:
sale = Sale()
sale_line = SaleLine()
sale.party = Party.getPartyByName(customer)
sale.reference = reference
if sale.party.addresses:
sale.invoice_address = sale.party.addresses[0]
sale.shipment_address = sale.party.addresses[0]
if sell_price_currency == 'USC':
sale.currency = Currency.get_by_name('USD')
sale_line.enable_linked_currency = True
sale_line.linked_currency = 1
sale_line.linked_unit = Uom.get_by_name(sell_price_unit)
sale_line.linked_price = sell_price
sale_line.unit_price = sale_line.get_price_linked_currency()
else:
sale.currency = Currency.get_by_name(sell_price_currency)
sale_line.unit_price = sell_price
sale_line.unit = Uom.get_by_name(sell_price_unit)
sale_line.premium = premium
Sale.save([sale])
sale_line.sale = sale.id
sale_line.quantity = lot_net_weight
sale_line.quantity_theorical = lot_net_weight
sale_line.product = Product.get_by_name('BRAZIL COTTON')
sale_line.unit = Uom.get_id_by_name(lot_unit)
sale_line.price_type = 'priced'
sale_line.created_by_code = False
sale_line.note = dec_key
SaleLine.save([sale_line])
ContractStart = Pool().get('contracts.start')
ContractDetail = Pool().get('contract.detail')
ct = ContractStart()
d = ContractDetail()
ct.type = 'Purchase'
ct.matched = True
ct.shipment_in = sh
ct.lot = sale_line.lots[0]
d.party = Party.getPartyByName('FAIRCOT')
if sale_line.enable_linked_currency:
d.currency_unit = str(sale_line.linked_currency.id) + '_' + str(sale_line.linked_unit.id)
else:
d.currency_unit = str(sale.currency.id) + '_' + str(sale_line.unit.id)
d.quantity = sale_line.quantity
d.unit = sale_line.unit
d.price = sale_line.unit_price
d.price_type = 'priced'
ct.contracts = [d]
ContractFactory.create_contracts(
ct.contracts,
type_=ct.type,
ct=ct,
)
#Lots creation #Lots creation
pass vlot = sale_line.lots[0]
lqt = LotQt.search([('lot_s','=',vlot.id)])
if lqt and vlot.lot_quantity > 0:
lqt = lqt[0]
l = LotAdd()
l.lot_qt = lot_bales
l.lot_unit = Uom.get_by_name('bale')
l.lot_unit_line = lot_unit
l.lot_quantity = lot_net_weight
l.lot_gross_quantity = lot_gross_weight
l.lot_premium = premium
LotQt.add_physical_lots(lqt,[l])
# if cls.rule_set.ocr_required:[] # if cls.rule_set.ocr_required:[]
# cls.run_ocr([doc]) # cls.run_ocr([doc])
# if cls.rule_set.structure_required and doc.state != "error": # if cls.rule_set.structure_required and doc.state != "error":

View File

@@ -137,6 +137,13 @@ class Currency(
closer = date closer = date
return res return res
@classmethod
def get_by_name(cls, name):
currencies = cls.search([('symbol', '=', name)], limit=1)
if not currencies:
return None
return currencies[0]
@staticmethod @staticmethod
def _get_rate(currencies, tdate=None): def _get_rate(currencies, tdate=None):
''' '''

View File

@@ -609,6 +609,26 @@ class Product(
('template.code', operator, code_value, *extra), ('template.code', operator, code_value, *extra),
] ]
@classmethod
def get_by_name(cls, name, type_='goods'):
pool = Pool()
Template = pool.get('product.template')
Uom = pool.get('product.uom')
templates = Template.search([('name', '=', name)], limit=1)
if templates:
return templates[0].products[0]
unit_uom, = Uom.search([('name', '=', 'Mt')], limit=1)
template, = Template.create([{
'name': name,
'type': type_,
'default_uom': unit_uom.id,
'cost_price_method': 'fixed',
}])
return template.products[0]
@staticmethod @staticmethod
def get_price_uom(products, name): def get_price_uom(products, name):
Uom = Pool().get('product.uom') Uom = Pool().get('product.uom')

View File

@@ -92,6 +92,13 @@ class Uom(SymbolMixin, DigitsMixin, DeactivableMixin, ModelSQL, ModelView):
def default_digits(): def default_digits():
return 2 return 2
@classmethod
def get_by_name(cls, name):
uom = cls.search([('symbol', '=', name)], limit=1)
if not uom:
return None
return uom[0]
@fields.depends('factor') @fields.depends('factor')
def on_change_factor(self): def on_change_factor(self):
if (self.factor or 0.0) == 0.0: if (self.factor or 0.0) == 0.0:

View File

@@ -3144,10 +3144,10 @@ class CreateContracts(Wizard):
def transition_creating(self): def transition_creating(self):
ContractFactory.create_contracts( ContractFactory.create_contracts(
self.ct.contracts, self.ct.contracts,
type_=self.ct.type, type_=self.ct.type,
ct=self.ct, ct=self.ct,
) )
# SaleLine = Pool().get('sale.line') # SaleLine = Pool().get('sale.line')
# Sale = Pool().get('sale.sale') # Sale = Pool().get('sale.sale')
# PurchaseLine = Pool().get('purchase.line') # PurchaseLine = Pool().get('purchase.line')