diff --git a/__pycache__/__init__.cpython-312.pyc b/__pycache__/__init__.cpython-312.pyc old mode 100755 new mode 100644 index 047cde5..22795f5 Binary files a/__pycache__/__init__.cpython-312.pyc and b/__pycache__/__init__.cpython-312.pyc differ diff --git a/models/__pycache__/__init__.cpython-312.pyc b/models/__pycache__/__init__.cpython-312.pyc old mode 100755 new mode 100644 index a48fff3..798a8b1 Binary files a/models/__pycache__/__init__.cpython-312.pyc and b/models/__pycache__/__init__.cpython-312.pyc differ diff --git a/models/__pycache__/stock_inventory_revaluation.cpython-312.pyc b/models/__pycache__/stock_inventory_revaluation.cpython-312.pyc old mode 100755 new mode 100644 index 51027a6..5f85518 Binary files a/models/__pycache__/stock_inventory_revaluation.cpython-312.pyc and b/models/__pycache__/stock_inventory_revaluation.cpython-312.pyc differ diff --git a/models/stock_inventory_revaluation.py b/models/stock_inventory_revaluation.py index 6f98f9f..011a9c0 100755 --- a/models/stock_inventory_revaluation.py +++ b/models/stock_inventory_revaluation.py @@ -118,6 +118,41 @@ class StockInventoryRevaluation(models.Model): # Create Stock Valuation Layer self._create_valuation_layer(move) + + # AVCO/FIFO Logic: Update Standard Price and Distribute Value to Layers + # This fixes the issue where revaluation creates a layer but doesn't update the moving average cost + if self.product_id.categ_id.property_cost_method in ['average', 'fifo'] and self.quantity > 0: + # 1. Update Standard Price + # We use disable_auto_svl to prevent Odoo from creating an extra SVL for this price change + new_std_price = self.product_id.standard_price + (self.extra_cost / self.quantity) + self.product_id.with_context(disable_auto_svl=True).sudo().write({'standard_price': new_std_price}) + + # 2. Distribute Value to Remaining Layers (Crucial for correct COGS later) + remaining_svls = self.env['stock.valuation.layer'].search([ + ('product_id', '=', self.product_id.id), + ('remaining_qty', '>', 0), + ('company_id', '=', self.company_id.id), + ]) + + if remaining_svls: + remaining_qty_total = sum(remaining_svls.mapped('remaining_qty')) + if remaining_qty_total > 0: + remaining_value_to_distribute = self.extra_cost + remaining_value_unit_cost = remaining_value_to_distribute / remaining_qty_total + + for layer in remaining_svls: + if float_compare(layer.remaining_qty, remaining_qty_total, precision_rounding=self.product_id.uom_id.rounding) >= 0: + taken_remaining_value = remaining_value_to_distribute + else: + taken_remaining_value = remaining_value_unit_cost * layer.remaining_qty + + # Rounding + taken_remaining_value = self.currency_id.round(taken_remaining_value) + + layer.sudo().write({'remaining_value': layer.remaining_value + taken_remaining_value}) + + remaining_value_to_distribute -= taken_remaining_value + remaining_qty_total -= layer.remaining_qty self.state = 'done'