[FIX] purchase, purchase_stock: add price difference account

Version 16.0 removed the price different account following this pull request #99411

This decision has been made because it was only used anymore by standard cost method and real time valuation.
We thought that standard was not a valid accounting method and we didn't want to maintain code for it.

But:
- Standard could be valid if you manualy complete the accounting entries
by yourself (e.g. employees/machines cost in mrp).
- It's also valid if you record the difference between standard price and
vendo price (price diff)

If you want to have an estimation of your cogs (benefits and loss) during an
accounting period. People just do a manual correction at the end but they have
a real time reporting on the situation.

It's a too big regression to be acceptable. We apologize and reintroduce it for
16.0 and future version.

This PR reintroduce the fields in purchase and the fix module in 16.0 is
not needed anymore.

closes odoo/odoo#109924

Related: odoo/upgrade#4315
Signed-off-by: William Henrotin (whe) <whe@odoo.com>
This commit is contained in:
Arnold Moyaux
2023-02-13 15:15:34 +01:00
parent 1547d66585
commit a022fefbaf
10 changed files with 27 additions and 82 deletions
-4
View File
@@ -1,4 +0,0 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import models
@@ -1,21 +0,0 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
'name': 'WMS Accounting',
'version': '1.1',
'summary': 'Inventory, Logistic, Valuation, Accounting',
'description': """
WMS Accounting module
======================
This module adds the price difference account. Used in standard perpetual valuation.
""",
'depends': ['purchase_stock'],
'data': [
'views/product_views.xml',
],
'category': 'Hidden',
'sequence': 16,
'auto_install': True,
'license': 'LGPL-3',
}
@@ -1,5 +0,0 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import account_move_line
from . import product
@@ -1,15 +0,0 @@
# -*- coding: utf-8 -*-
from odoo import models
class AccountMoveLine(models.Model):
_inherit = 'account.move.line'
def _get_price_diff_account(self):
self.ensure_one()
if self.product_id.cost_method == 'standard':
debit_pdiff_account = self.product_id.property_account_creditor_price_difference \
or self.product_id.categ_id.property_account_creditor_price_difference_categ
debit_pdiff_account = self.move_id.fiscal_position_id.map_account(debit_pdiff_account)
return debit_pdiff_account
return super()._get_price_diff_account()
@@ -1,23 +0,0 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models
class ProductCategory(models.Model):
_inherit = "product.category"
property_account_creditor_price_difference_categ = fields.Many2one(
'account.account', string="Price Difference Account",
company_dependent=True,
help="This account will be used to value price difference between purchase price and accounting cost.")
class ProductTemplate(models.Model):
_name = 'product.template'
_inherit = 'product.template'
property_account_creditor_price_difference = fields.Many2one(
'account.account', string="Price Difference Account", company_dependent=True,
help="This account is used in automated inventory valuation to "\
"record the price difference between a purchase order and its related vendor bill when validating this vendor bill.")
+1
View File
@@ -19,6 +19,7 @@
'views/res_config_settings_views.xml',
'views/res_partner_views.xml',
'views/stock_lot_views.xml',
'views/product_views.xml',
'report/purchase_report_views.xml',
'report/purchase_report_templates.xml',
'report/report_stock_rule.xml',
@@ -42,8 +42,14 @@ class AccountMove(models.Model):
continue
# Retrieve accounts needed to generate the price difference.
debit_expense_account = line._get_price_diff_account()
if not debit_expense_account:
debit_pdiff_account = False
if line.product_id.cost_method == 'standard':
debit_pdiff_account = line.product_id.property_account_creditor_price_difference \
or line.product_id.categ_id.property_account_creditor_price_difference_categ
debit_pdiff_account = move.fiscal_position_id.map_account(debit_pdiff_account)
else:
debit_pdiff_account = line.product_id.product_tmpl_id.get_product_accounts(fiscal_pos=move.fiscal_position_id)['expense']
if not debit_pdiff_account:
continue
# Retrieve stock valuation moves.
valuation_stock_moves = self.env['stock.move'].search([
@@ -74,7 +80,6 @@ class AccountMove(models.Model):
move.company_id, valuation_date, round=False
)
price_unit = line._get_gross_unit_price()
price_unit_val_dif = price_unit - valuation_price_unit
@@ -110,7 +115,7 @@ class AccountMove(models.Model):
line.company_currency_id,
line.company_id, fields.Date.today(),
),
'account_id': debit_expense_account.id,
'account_id': debit_pdiff_account.id,
'analytic_distribution': line.analytic_distribution,
'display_type': 'cogs',
}
@@ -25,10 +25,3 @@ class AccountMoveLine(models.Model):
total_out_and_not_invoiced_qty = max(0, out_qty - invoiced_qty)
out_and_not_invoiced_qty = min(aml_qty, total_out_and_not_invoiced_qty)
return self.product_id.uom_id._compute_quantity(out_and_not_invoiced_qty, self.product_uom_id)
def _get_price_diff_account(self):
self.ensure_one()
if self.product_id.cost_method == 'standard':
return False
accounts = self.product_id.product_tmpl_id.get_product_accounts(fiscal_pos=self.move_id.fiscal_position_id)
return accounts['expense']
+14
View File
@@ -5,10 +5,24 @@ from odoo import api, fields, models
from odoo.osv import expression
class ProductCategory(models.Model):
_inherit = "product.category"
property_account_creditor_price_difference_categ = fields.Many2one(
'account.account', string="Price Difference Account",
company_dependent=True,
help="This account will be used to value price difference between purchase price and accounting cost.")
class ProductTemplate(models.Model):
_name = 'product.template'
_inherit = 'product.template'
property_account_creditor_price_difference = fields.Many2one(
'account.account', string="Price Difference Account", company_dependent=True,
help="This account is used in automated inventory valuation to "\
"record the price difference between a purchase order and its related vendor bill when validating this vendor bill.")
@api.model
def _get_buy_route(self):
buy_route = self.env.ref('purchase_stock.route_warehouse0_buy', raise_if_not_found=False)
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_category_property_form" model="ir.ui.view">
<field name="name">product.category.property.form.inherit.stock</field>
<field name="name">product.category.property.form.inherit.purchase.stock</field>
<field name="model">product.category</field>
<field name="inherit_id" ref="account.view_category_property_form"/>
<field name="arch" type="xml">
@@ -14,7 +14,7 @@
</record>
<record id="product_template_form_view" model="ir.ui.view">
<field name="name">product.normal.form.inherit.stock</field>
<field name="name">product.normal.form.inherit.purchase.stock</field>
<field name="model">product.template</field>
<field name="inherit_id" ref="account.product_template_form_view"/>
<field name="arch" type="xml">
@@ -23,4 +23,4 @@
</field>
</field>
</record>
</odoo>
</odoo>