From 479513d8806a0cd1395be53ffa57903f79053988 Mon Sep 17 00:00:00 2001 From: Suherdy Yacob Date: Thu, 8 Jan 2026 13:09:24 +0700 Subject: [PATCH] fix revaluation bug --- __pycache__/__init__.cpython-312.pyc | Bin 233 -> 215 bytes models/__pycache__/__init__.cpython-312.pyc | Bin 261 -> 243 bytes ...tock_inventory_revaluation.cpython-312.pyc | Bin 8457 -> 12345 bytes models/stock_inventory_revaluation.py | 35 ++++++++++++++++++ 4 files changed, 35 insertions(+) mode change 100755 => 100644 __pycache__/__init__.cpython-312.pyc mode change 100755 => 100644 models/__pycache__/__init__.cpython-312.pyc mode change 100755 => 100644 models/__pycache__/stock_inventory_revaluation.cpython-312.pyc diff --git a/__pycache__/__init__.cpython-312.pyc b/__pycache__/__init__.cpython-312.pyc old mode 100755 new mode 100644 index 047cde5060c8f7faf29d9e301faefd813510de69..22795f5624472b32480335ca6095b3b043f76086 GIT binary patch delta 37 rcmaFKc%6~^G%qg~0}xES6*!SQh%ZDxBR@A)zqm9bwJ4=>Vr>op)2$3n delta 55 zcmcc4_>z(PG%qg~0}xyhcbv!_q>!eck)NBYUtF4zT9i_$SDBccpX896Sdf^fmz=Mc JnKCgu2LRSd5>x;H diff --git a/models/__pycache__/__init__.cpython-312.pyc b/models/__pycache__/__init__.cpython-312.pyc old mode 100755 new mode 100644 index a48fff378f4f3f98c5bbff333a7bc7bf3f77e02c..798a8b1f5b8c54054c749f5524a298ef1fc3715d GIT binary patch delta 37 rcmZo=`pn3EnwOW00SG4E3Y^HD&KIqpk)NBYUtF4zT9i^baZ)h=%V-Qg delta 55 zcmey&*viCxnwOW00SK;%J5Jt4vJJPjbjjEJ)1LOU~EJ JOqtkF3;@hf5=Q_4 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 51027a638b70d76b76cd7279260d101c5a96eff9..5f85518bd6a6aa089c1d6bd8ea74d1bae4a5638f GIT binary patch delta 4919 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 N=IiFK2n@@j{s$-w{B{5U delta 1516 zcmZ8hT}&KR6rQ`YGyBgLSPEndtc3*zwoCbG8md)ll!m5MY>6oT48zP_7@VKw&g|MH zwP5t2BqfC02aSnQ5)*BF(cpt7KB%ueSW*+rBuW#XOqz&oeKAJ8XSTG7_ujuS-9z%m_s72Y+u}1T zee<@7`<&7|CR!z5QB-?irkl~?V&uF=cEbrhvxVItPR3X;PhnyD%biB+3^Aaoz7 z+rk)Xpbg?6lVjp)q6=E!i67WZ_r&GeL(JnKCNiWBD%Ddv)YX~>Z#@$$+|9zmZo%3q zSi6PtPNBTQk<`|gq4_}L5QMid;l)&f6&K4I6H9b3n#=qDPC&o_1c(k+h&t~Dbd3yy zgLg_M141blu|`hOwP+sI(r=|eDv4kxZ zlQ{E8qQ}o+mxxR!1GG2M&dNNOkg8?Q(W{9pI!-@MI7d?~LWN@&;J6GH26`=Xc@fhtW4Wv_{)3=8&_gD}z^7lOp9-C1mh(18|4C29 z^E=7>rmvi7(vz>=dgWoUrJp9bkZ?lc` z^X!?&{C)gVb&9ImCCil`m6SwMOY1uOTOi644Bf(x1Kh9!vQ-_hNjlRxj7GQK@B9@p zcCU7Cqi%m(9*3kz$yh0gV~i7-IqB)#5qcKKoZ#BUgS ztrRmQANBnLvzGcVxwiWH zm{n%b+JsK@cAzpX_1-`!+Lk+iw4cRD0e{5FMW&Pg->!>vE!Wes&VD&C=_}mrWc~W` z>hf-~XD8WnGu%T`^vB%fvJYVR8Age#o7m$m`;97r;c>;P4A>U-StIkX3Gn0zqlT@x zWCR?59Px>ZT*3xcUEQ|G6gYiIVD!C^hKtzJ9MTR}o&P4u5ALz~V##oIe}>64q)mbV z0K9OK*hNg-ihn*YAq)yi|hKC%kFW5_k-sHsP`lBllW%*PY!gy$bXjQdiDSS 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'