[ADD] stock_landed_costs_company: create LC from branch

If the user selects a branch and deactivates the parent company, he
will not be able to create any LC.

Explanations: Since the company field is a related one that targets
the company of the journal, and since the journal belongs to the parent
company, the LC created in the branch actually belongs to the parent
company, which triggers an access error.

Asking users to create branch-specific journals would just cancel
all the benefits of the company branch feature.

OPW-3651022

closes odoo/odoo#150972

X-original-commit: 915b2e2b8401db937db4162e32e84cf968728072
Signed-off-by: Arnold Moyaux (arm) <arm@odoo.com>
Signed-off-by: Adrien Widart (awt) <awt@odoo.com>
This commit is contained in:
Adrien Widart (awt)
2024-01-25 09:46:50 +00:00
parent 8a443222a1
commit 294a37b0a3
8 changed files with 185 additions and 0 deletions
+9
View File
@@ -2098,6 +2098,15 @@ resource_name = stock_landed_costs
replace_edited_strings = false
keep_translations = false
[o:odoo:p:odoo-17:r:stock_landed_costs_company]
file_filter = addons/stock_landed_costs_company/i18n/<lang>.po
source_file = addons/stock_landed_costs_company/i18n/stock_landed_costs_company.pot
type = PO
minimum_perc = 0
resource_name = stock_landed_costs_company
replace_edited_strings = false
keep_translations = false
[o:odoo:p:odoo-17:r:stock_picking_batch]
file_filter = addons/stock_picking_batch/i18n/<lang>.po
source_file = addons/stock_picking_batch/i18n/stock_picking_batch.pot
@@ -0,0 +1,12 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import models
def _stock_landed_costs_company_post_init(env):
env.cr.execute("""
UPDATE stock_landed_cost cost
SET company_id = journal.company_id
FROM account_journal journal
WHERE cost.account_journal_id = journal.id
""")
@@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
'name': 'Landed Costs for company\'s branches',
'version': '1.0',
'description': """
This module is a patch that stores the company_id field on the landed cost model.
That way, it is possible to create/use landed costs from a branch.
""",
'depends': ['stock_landed_costs'],
'category': 'Inventory/Inventory',
'sequence': 16,
'installable': True,
'auto_install': True,
'post_init_hook': '_stock_landed_costs_company_post_init',
'license': 'LGPL-3',
}
@@ -0,0 +1,26 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * stock_landed_costs_company
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-01-25 07:53+0000\n"
"PO-Revision-Date: 2024-01-25 07:53+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: stock_landed_costs_company
#: model:ir.model.fields,field_description:stock_landed_costs_company.field_stock_landed_cost__company_id
msgid "Company"
msgstr ""
#. module: stock_landed_costs_company
#: model:ir.model,name:stock_landed_costs_company.model_stock_landed_cost
msgid "Stock Landed Cost"
msgstr ""
@@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import stock_landed_cost
@@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models
class StockLandedCost(models.Model):
_inherit = 'stock.landed.cost'
company_id = fields.Many2one('res.company', 'Company', required=True, related=False, default=lambda self: self.env.company)
@@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import test_stock_landed_costs_branches
@@ -0,0 +1,103 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo.addons.stock_landed_costs.tests.test_stockvaluationlayer import TestStockValuationLCCommon
from odoo.tests import tagged, Form
@tagged('post_install', '-at_install')
class TestStockLandedCostsBranches(TestStockValuationLCCommon):
@classmethod
def setUpClass(cls, chart_template_ref=None):
super().setUpClass(chart_template_ref=chart_template_ref)
cls.company = cls.env.company
cls.branch = cls.env['res.company'].create({
'name': 'Branch',
'parent_id': cls.company.id,
})
cls.env['account.chart.template'].try_loading(cls.company.chart_template, company=cls.branch, install_demo=False)
cls.env.user.company_id = cls.branch
cls.vendor1 = cls.env['res.partner'].create({'name': 'vendor1'})
cls.product1.categ_id.property_cost_method = 'fifo'
def test_create_lc_from_branch(self):
"""
From a company's branch, create a LC and ensure it impacts the SVL
"""
warehouse = self.env['stock.warehouse'].search([('company_id', '=', self.branch.id)], limit=1)
supplier_location = self.env.ref('stock.stock_location_suppliers')
receipt = self.env['stock.picking'].create({
'location_id': supplier_location.id,
'location_dest_id': warehouse.lot_stock_id.id,
'picking_type_id': warehouse.in_type_id.id,
'move_ids': [(0, 0, {
'name': self.product1.name,
'location_id': supplier_location.id,
'location_dest_id': warehouse.lot_stock_id.id,
'picking_type_id': warehouse.in_type_id.id,
'product_id': self.product1.id,
'product_uom_qty': 1,
'product_uom': self.product1.uom_id.id,
'price_unit': 10,
})],
})
receipt.action_confirm()
receipt.action_assign()
receipt.move_line_ids.quantity = 1
receipt.button_validate()
lc_form = Form(self.env['stock.landed.cost'])
lc_form.picking_ids.add(receipt)
with lc_form.cost_lines.new() as cost_line:
cost_line.product_id = self.productlc1
cost_line.price_unit = 5
lc = lc_form.save()
lc.compute_landed_cost()
lc.button_validate()
self.assertEqual(self.product1.value_svl, 15)
self.assertEqual(self.product1.quantity_svl, 1)
self.assertEqual(self.product1.standard_price, 15)
def test_lc_generated_from_bill(self):
"""
Confirm PO, receive products, post bill and generate LC
"""
po_form = Form(self.env['purchase.order'])
po_form.partner_id = self.vendor1
with po_form.order_line.new() as po_line:
po_line.product_id = self.product1
po_line.product_qty = 1
po_line.price_unit = 10
po_line.taxes_id.clear()
po = po_form.save()
po.button_confirm()
receipt = po.picking_ids
receipt.move_line_ids.quantity = 1
receipt.button_validate()
action = po.action_create_invoice()
bill = self.env['account.move'].browse(action['res_id'])
bill_form = Form(bill)
bill_form.invoice_date = bill_form.date
with bill_form.invoice_line_ids.new() as inv_line:
inv_line.product_id = self.productlc1
inv_line.price_unit = 5
bill = bill_form.save()
bill.action_post()
action = bill.button_create_landed_costs()
lc_form = Form(self.env[action['res_model']].browse(action['res_id']))
lc_form.picking_ids.add(receipt)
lc = lc_form.save()
lc.button_validate()
self.assertEqual(self.product1.value_svl, 15)
self.assertEqual(self.product1.quantity_svl, 1)
self.assertEqual(self.product1.standard_price, 15)