60 lines
2.1 KiB
Python
60 lines
2.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright 2026 Nexa Systems Inc.
|
|
# License OPL-1 (Odoo Proprietary License v1.0)
|
|
|
|
import logging
|
|
from odoo import models, fields, api
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class AccountMove(models.Model):
|
|
_inherit = 'account.move'
|
|
|
|
def _post(self, soft=True):
|
|
posted = super()._post(soft=soft)
|
|
posted._fi_update_product_costs()
|
|
return posted
|
|
|
|
def _fi_update_product_costs(self):
|
|
"""Update product costs from vendor bill lines when bills are posted."""
|
|
auto_update = self.env['ir.config_parameter'].sudo().get_param(
|
|
'fusion_inventory.auto_update_cost', 'True'
|
|
)
|
|
if auto_update != 'True':
|
|
return
|
|
|
|
for move in self.filtered(lambda m: m.move_type == 'in_invoice'):
|
|
for line in move.invoice_line_ids:
|
|
if not line.product_id or line.price_unit <= 0:
|
|
continue
|
|
variant = line.product_id
|
|
old_cost = variant.standard_price
|
|
if abs(old_cost - line.price_unit) > 0.001:
|
|
variant.standard_price = line.price_unit
|
|
_logger.info(
|
|
'Cost updated for %s: %.2f -> %.2f (from bill %s)',
|
|
variant.display_name, old_cost, line.price_unit,
|
|
move.name)
|
|
|
|
|
|
class AccountMoveLine(models.Model):
|
|
_inherit = 'account.move.line'
|
|
|
|
x_fi_suggested_price = fields.Float(
|
|
string='Suggested Price',
|
|
compute='_compute_suggested_price',
|
|
help='Selling price based on cost and the product margin percentage')
|
|
|
|
@api.depends('price_unit', 'product_id')
|
|
def _compute_suggested_price(self):
|
|
for line in self:
|
|
margin = 0
|
|
if line.product_id and line.product_id.product_tmpl_id:
|
|
margin = line.product_id.product_tmpl_id.x_fi_margin_pct or 0
|
|
if 0 < margin < 100 and line.price_unit > 0:
|
|
line.x_fi_suggested_price = round(
|
|
line.price_unit / (1 - margin / 100), 2)
|
|
else:
|
|
line.x_fi_suggested_price = line.price_unit
|