Skip ke Konten
Menu
Pertanyaan ini telah diberikan tanda
2 Replies
4288 Tampilan

Hi,


Is there way to fix stock valuation layer issues, because we want to change costing method to FIFO and now the valuation layer is broken or some how way different then what we have in stock.

Valuation layer is negative - 300 000 units and -300 000€, so you cant fix valuation layer by stock.valuation.layer.revaluation wizard.  

How to set stock valuation layer to zero with stock.

Avatar
Buang

Does anyone have the fix_value method

you are missing the fix_value function

Penulis Jawaban Terbai

Here is to fix stock valuation layer to current stock.
Issues what this will be fixing:

  • Stock Valuation layer doesn't match to qty in stok
  • AVCO and FIFO standard price calculations.

These issues might be because something is went wrong in configuration or stock.move's. Like bug in external module. 

These will happen, and I don't know why theres no fix tool built in odoo. 
Or I haven't found it.


 def action_fix_category_svl(self):        
​self.ensure_one()
if self.property_cost_method != 'standard':
​​raise ValidationError(_('You must change valuation type to standard to run this method'))

products = self.env['product.product'].search([('categ_id', '=', self.id)])
​for product in products:
​#1. Getting Stock Valuation Layer value and quantity
​valuation_quantity = product.quantity_svl
​valuation_value = product.value_svl
​#2. Getting in stock value and quantity
​qty_available = product.qty_available
​qty_value = product.standard_price * qty_available
company_id = self.env.company.id
​#3. Finding all the stock layers that has remaining qty and remaining value and setting it to zero
​#This is for avco and fifo calculations. When setting those 0 they are not effecting in standard price
​#Caluculations
​domain = [
​('product_id', '=', product.id),
​('company_id', '=', company_id),
​('remaining_qty', '!=', 0)
​]
​svls = self.env['stock.valuation.layer'].search(domain)
​for svl in svls:
​svl.write({"remaining_qty": 0})

domain = [
​('product_id', '=', product.id),
('company_id', '=', company_id),
​('remaining_value', '!=', 0)
​]
​svls = self.env['stock.valuation.layer'].search(domain)
​for svl in svls:
​svl.write({"remaining_value": 0})

​#5. Calculating real stock adjustment for stock valuation layer
​#This method makes adjustment for example adjustment to 20 from -20 would be 40
​qty_to_svl = self.fix_value(qty_available, valuation_quantity)
​value_to_svl = self.fix_value(qty_value, valuation_value)
​vals = {
​'product_id': product.id,
​'value': value_to_svl,
​'unit_cost': 0,
​'quantity': qty_to_svl,
​'remaining_qty': 0,
​'remaining_value':0,
​'company_id': self.env.company.id,
​'description': _('Fixing of %s to match stock.quant valuation %s with qty %s', product.name, qty_value, qty_available) ​}
​self.env['stock.valuation.layer'].sudo().create(vals)





Avatar
Buang
Jawaban Terbai

here's the fix_value method:


def fix_value(self, current_value, target_value):

"""

Adjusts the difference between current and target values.

Ensures correct valuation when reversing stock or revaluating.

:param current_value: The current quantity/value in stock

:param target_value: The target quantity/value for revaluation

:return: The adjustment required to reach the target

"""

# Compute the absolute difference between the two values

adjustment = target_value - current_value

# Example logic to handle revaluation from negative to positive or similar cases

if current_value < 0 and target_value > 0:

adjustment = abs(target_value) + abs(current_value)

return adjustment

Avatar
Buang

Hi, where do you put this code?