From 42652d0fcb4dbbffe056a86c7a09cc343989f9f7 Mon Sep 17 00:00:00 2001 From: laurentbarontini Date: Wed, 28 Jan 2026 15:39:15 +0100 Subject: [PATCH] 28.01.26 --- modules/purchase_trade/fee.py | 113 +++++++++++++++++++++++++++++++--- 1 file changed, 105 insertions(+), 8 deletions(-) diff --git a/modules/purchase_trade/fee.py b/modules/purchase_trade/fee.py index 7e81746..37cfeaa 100755 --- a/modules/purchase_trade/fee.py +++ b/modules/purchase_trade/fee.py @@ -18,6 +18,7 @@ import datetime import logging from collections import defaultdict from trytond.exceptions import UserWarning, UserError +from trytond.modules.account.exceptions import PeriodNotFoundError logger = logging.getLogger(__name__) @@ -374,19 +375,115 @@ class Fee(ModelSQL,ModelView): if not fee.sale_line: feelots = FeeLots.search(['fee','=',fee.id]) for fl in feelots: - move = fl.lot.get_received_move() - if move: - Warning = Pool().get('res.user.warning') - warning_name = Warning.format("Lot ever received", []) - if Warning.check(warning_name): - raise UserWarning(warning_name, - "By clicking yes, an accrual for this fee will be created") + if fee.product.landed_cost: + move = fl.lot.get_received_move() + if move: + Warning = Pool().get('res.user.warning') + warning_name = Warning.format("Lot ever received", []) + if Warning.check(warning_name): + raise UserWarning(warning_name, + "By clicking yes, an accrual for this fee will be created") + AccountMove = Pool().get('account.move') + account_move = move._get_account_stock_move_fee(fee) + AccountMove.save([account_move]) + else: AccountMove = Pool().get('account.move') - account_move = move._get_account_stock_move_fee(fee) + account_move = fee._get_account_move_fee(fl.lot) AccountMove.save([account_move]) return fees + def _get_account_move_fee(self,lot): + pool = Pool() + AccountMove = pool.get('account.move') + Date = pool.get('ir.date') + Period = pool.get('account.period') + AccountConfiguration = pool.get('account.configuration') + + if self.product.type != 'service': + return + + if self.product.landed_cost: + return + + today = Date.today() + company = lot.line.purchase.company if lot.line else lot.sale_line.sale.company + for date in [today]: + try: + period = Period.find(company, date=date, test_state=False) + except PeriodNotFoundError: + if date < today: + return + continue + break + else: + return + + if period.state != 'open': + date = today + period = Period.find(company, date=date) + + AccountMoveLine = pool.get('account.move.line') + Currency = pool.get('currency.currency') + move_line = AccountMoveLine() + move_line.lot = lot + move_line.fee = self + move_line.origin = self + move_line_ = AccountMoveLine() + move_line_.lot = lot + move_line_.fee = self + move_line_.origin = self + amount = self.amount + + if self.currency != company.currency: + with Transaction().set_context(date=today): + amount_converted = amount + amount = Currency.compute(self.currency, + amount, company.currency) + move_line.second_currency = self.currency + + if self.p_r == 'pay': + move_line.debit = amount + move_line.credit = Decimal(0) + move_line.account = self.product.account_stock_used + if hasattr(move_line, 'second_currency') and move_line.second_currency: + move_line.amount_second_currency = amount_converted + move_line_.debit = Decimal(0) + move_line_.credit = amount + move_line_.account = self.product.account_stock_in_used + if hasattr(move_line_, 'second_currency') and move_line_.second_currency: + move_line_.amount_second_currency = -amount_converted + else: + move_line.debit = Decimal(0) + move_line.credit = amount + move_line.account = self.product.account_stock_used + if hasattr(move_line, 'second_currency') and move_line.second_currency: + move_line.amount_second_currency = -amount_converted + move_line_.debit = amount + move_line_.credit = Decimal(0) + move_line_.account = self.product.account_stock_in_used + if hasattr(move_line_, 'second_currency') and move_line_.second_currency: + move_line_.amount_second_currency = amount_converted + + logger.info("FEE_MOVELINES_1:%s",move_line) + logger.info("FEE_MOVELINES_2:%s",move_line_) + + + account_configuration = AccountConfiguration(1) + journal = account_configuration.get_multivalue( + 'expense', company=company.id) + + description = None + description = 'Fee not inventoried' + return AccountMove( + journal=journal, + period=period, + date=date, + origin=self, + description=description, + lines=[move_line,move_line_], + ) + class FeeLots(ModelSQL,ModelView): "Fee lots"