From 2ab207ccd9c1e90d15f67945846d5bbf2974549d Mon Sep 17 00:00:00 2001 From: Suherdy Yacob Date: Thu, 8 Jan 2026 13:08:48 +0700 Subject: [PATCH] fix the revaluation bugs --- __manifest__.py | 2 +- .../purchase_bill_sync_wizard.cpython-312.pyc | Bin 11347 -> 13070 bytes wizard/purchase_bill_sync_wizard.py | 37 +++++++++++++++++- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/__manifest__.py b/__manifest__.py index 6489dce..0943e39 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -8,7 +8,7 @@ 1. Find discrepancies between Vendor Bills and linked Purchase Orders within a date range. 2. Sync selected Vendor Bills to update the Purchase Orders. """, - 'author': 'Antigravity', + 'author': 'Suherdy Yacob', 'depends': ['purchase', 'account'], 'data': [ 'security/ir.model.access.csv', diff --git a/wizard/__pycache__/purchase_bill_sync_wizard.cpython-312.pyc b/wizard/__pycache__/purchase_bill_sync_wizard.cpython-312.pyc index 58ff1a63d3ec9dde7f55a1a989bf53b37ee32ad0..fa9b811950bc3c3a59981a4fe057ec2558bf7db3 100644 GIT binary patch delta 2320 zcmZ`)TTC0-8J;t~;b2T08*Br_fD>mD+kY-89=x(w9c6+RQB49c#2wv(id^*#~bzwJ+PtIVLux zYRBXMKmYgt=ld^n#@?HGBWnIrRn;*9T@QLG?ngtvHhPt*j02z1R=5Ej)uZHu89r@mf#0uoY4menz_+Wf8TE5H zg2-w`E$r3Ua^B-V)o8T*AK*t;r%^li8{{&JX85_zmfN>pC$-sHu@;Wib{$(M?f`yM ztc^#Y#bCV%mM;((;Se%|3q5*?794pL!`4#UHn z8sKmBHXCCR?HnjM0U;9c5YBC=bfWk;h1a?hj1?8QV7FC7HH?j^VXW{YTbDPgiD^nZ zvkuY0ezBR+`t&eoP9N;>NlolLPa{+?*b)`@kZ6IYzA7abRfxwp}(L1-`Y zG{hH5>q9L%QD=+r$%!5xqPjs4yhg0cx)Rl5z4$*jZ0QiK3npw`Ephgcr?e7XJEdl@Hu*30M8(6|)s&p)O5JZ~1 zL+AX)-Af@NxZSzS+3ku!rJS~m{;^5Qq4|K^cMAb(eiTk^`aL& z(Hc#o=)v09gq}rnqWQo=XwhqL64pxTMN65r8UDP+4jm}wR9*!GyKr$tZpqA(k8aW(=VrDJaI?6^S+i4t5B!Sx<)X>yPM{uVxHP@E!cufbNK)zb71f*;=mbOa43*-!n=Bth#3~r*)TmWFyGnBj zE)k>FgiRF$d7PAg6^olVs`@ZsonFbXs*z{u6-wY%S=Eqxz5a&)d<(i=zXCjb>hgg# z_>HUax-G>gQ!FoRQa6)nfm&sSr6i-8)-rTL;1G&x;%Uro+TesG6qFFyTY{=hXP6}4 zTh6V|Bv&bpQFVMWlVEuK*1!fg1=^wLerub*h8e07>;{zZ+=;Y~TbiKuRa2|WKPFiA>*@n?a-hh6u(9{7~Ns2muT#wdx7D)hQc zucO#4Fpf)EL<(7BXeX-Z>?HXta8;U3$pLpt3S7+xu1J#+Ws;H69YFV$f)n>!aObSe zpMo}8lLDTB7mS8*cjVpPUnG8<_|)xxep@?7T22*=G-*6l7}n*gTdxDM0_2w4j6nY$ zeuLhJTkTg!D}c*w&G5_iH!9J8KEdC^;sf}-4$gcL=#D)fBU2<&j4t<0$1bS3kKMn+ z;sF*PV)1+U%dWF^5Akvui!c_COTrBxd2$0hhFd3B^hNX`{PLs&JcT-6lP{tL$KH%6 gu0Gk-w@+YeKUGlyE`c}CDD^#Zeb3(sY!!+B4N7^MyZ`_I delta 931 zcmY*VTS!z<6g~Ss=H)z`yz{)?8E3rMSdNbgCFntgJp?0rU|Fe&N6X1H)ClQZBqH)d zB-lSjBPv-*N>ukF3j+TF3nHQieFS~Ks`6?6ucfXYVuG`R17Wh0En2 z#%kZt+NISzbnkS+cWiL>LJ}9862$SX^P{+8AyQ0#Zq&q;Zxl&LuEQFyU=56*a+>|(Qz5KUkLR`HS^$-l{4`9772>CJfEmPA@fsj2wzEIyecPPozZ&IRWQ!8LMl-o1tyu^_)E?Mzfmi* zjdLu-WD4et_*;_l0vWNBr(o+oez5hE;; zZq0s6tK#tTBLRUhmoch1Vqwm7Tds0I90>}zY9#$s#38ki(*VcS1UCr!bM*;8y?(i56X>r>-$F?fR}ax`Ur%x*lK2oQ zn&`RF^Da`p+|Lh!w_?ezfxTjBhoCQRJPzC!qL(D?V3{zi`zEovd_T8Duq0WGcgsif z#!Yt0gj=|yqRYJpM8|RiSI-&Yq@X{p$bfI!EZ;WajtO^7n87nuTf+Cu;}H`MnJ|}w zp9G&(U4%KTPIX7K?ElIiwyo!S>4ol&?R`&iAr&v{=fN@7_+Cl9R#Gd(%vRD?8|;O# Rn)h<$Yq|0pF|+Jje*txk?!y28 diff --git a/wizard/purchase_bill_sync_wizard.py b/wizard/purchase_bill_sync_wizard.py index f500857..1bc3c0a 100644 --- a/wizard/purchase_bill_sync_wizard.py +++ b/wizard/purchase_bill_sync_wizard.py @@ -53,7 +53,6 @@ class PurchaseBillSyncWizard(models.TransientModel): if line.product_uom_id and po_line.product_uom and line.product_uom_id != po_line.product_uom: bill_price_in_po_currency = line.product_uom_id._compute_price(bill_price_in_po_currency, po_line.product_uom) - # Check Price if float_compare(bill_price_in_po_currency, po_line.price_unit, precision_digits=2) != 0: discrepancies.append(f"Product {line.product_id.name}: Price {bill_price_in_po_currency:.2f} != {po_line.price_unit:.2f}") @@ -163,6 +162,42 @@ class PurchaseBillSyncWizard(models.TransientModel): new_date = stock_move.date + timedelta(seconds=1) self._cr.execute("UPDATE stock_valuation_layer SET create_date = %s WHERE id = %s", (new_date, svl.id)) + # AVCO/FIFO Logic: Update Standard Price and Distribute Value to Layers + product = stock_move.product_id + if product.categ_id.property_cost_method in ['average', 'fifo'] and product.quantity_svl > 0: + # 1. Update Standard Price + # We use disable_auto_svl to prevent Odoo from creating an extra SVL for this price change + # because we already created the specific adjustment SVL above. + new_std_price = product.standard_price + (diff / product.quantity_svl) + product.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', '=', product.id), + ('remaining_qty', '>', 0), + ('company_id', '=', stock_move.company_id.id), + ]) + + if remaining_svls: + remaining_qty_total = sum(remaining_svls.mapped('remaining_qty')) + if remaining_qty_total > 0: + remaining_value_to_distribute = diff + 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=product.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 = stock_move.company_id.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 + # Handle Accounting Entry if Automated if stock_move.product_id.categ_id.property_valuation == 'real_time': accounts = stock_move.product_id.product_tmpl_id.get_product_accounts()