diff --git a/.docker_files/main/__manifest__.py b/.docker_files/main/__manifest__.py index f28cd0e3..d6e3179c 100644 --- a/.docker_files/main/__manifest__.py +++ b/.docker_files/main/__manifest__.py @@ -70,7 +70,6 @@ "project_time_range", "project_timesheet_analytic_update", "project_type", - "stock_location_production", "project_wip", "project_wip_material", "timesheet_task_project_no_change", diff --git a/Dockerfile b/Dockerfile index 29851345..aca0f8ec 100644 --- a/Dockerfile +++ b/Dockerfile @@ -72,7 +72,6 @@ COPY project_timesheet_analytic_update /mnt/extra-addons/project_timesheet_anal COPY project_type /mnt/extra-addons/project_type COPY project_wip /mnt/extra-addons/project_wip COPY project_wip_material /mnt/extra-addons/project_wip_material -COPY stock_location_production /mnt/extra-addons/stock_location_production COPY timesheet_task_project_no_change /mnt/extra-addons/timesheet_task_project_no_change diff --git a/project_material/__manifest__.py b/project_material/__manifest__.py index 01cb9680..210f24ee 100644 --- a/project_material/__manifest__.py +++ b/project_material/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Project Material", - "version": "14.0.1.2.1", + "version": "14.0.1.4.0", "author": "Numigi", "maintainer": "Numigi", "website": "https://bit.ly/numigi-com", @@ -12,7 +12,6 @@ "summary": "Consume material on projects", "depends": [ "project_task_date_planned", - "stock_location_production", "stock_account", "purchase_stock", ], diff --git a/project_material/i18n/fr.po b/project_material/i18n/fr.po index b1e62497..8f938176 100644 --- a/project_material/i18n/fr.po +++ b/project_material/i18n/fr.po @@ -477,3 +477,10 @@ msgid "" msgstr "" "Vous ne pouvez pas modifier l'article ou la tâche sur la ligne de matériel " "{line} car elle est liée à un (des) mouvement(s) de stock au statut terminé." + + +#. module: project_material +#: code:addons/project_material/models/stock_warehouse.py:73 +#, python-format +msgid "You need to have a property_stock_production for product.template. Please contact your administrator or manager." +msgstr "Vous devez définir une property_stock_production pour product.template. Veuillez contacter votre administrateur ou manager." diff --git a/project_material/init_hook.py b/project_material/init_hook.py index fff20738..b5f3c09c 100644 --- a/project_material/init_hook.py +++ b/project_material/init_hook.py @@ -14,3 +14,4 @@ def _setup_warehouses_consumption_routes(env): for warehouse in warehouses: warehouse._create_or_update_consumption_picking_types() warehouse._create_or_update_consumption_route() + warehouse._create_consumption_mto_pull() diff --git a/project_material/models/project_task.py b/project_material/models/project_task.py index c9959b75..560b4de2 100644 --- a/project_material/models/project_task.py +++ b/project_material/models/project_task.py @@ -103,25 +103,22 @@ def write(self, vals): def copy(self, vals=None): task = super().copy(vals) - if self.material_line_ids: task.procurement_disabled = True task._copy_material_lines_from(self) - return task - @api.onchange("project_id") - def _onchange_project_enable_procurements(self): - if self.project_id: - self.procurement_disabled = False - def _copy_material_lines_from(self, task): if not self.date_planned: self.date_planned = date(2099, 1, 1) - for line in task.material_line_ids: line.copy({"task_id": self.id}) + @api.onchange("project_id") + def _onchange_project_enable_procurements(self): + if self.project_id: + self.procurement_disabled = False + def _run_procurements(self): for line in self.mapped("material_line_ids"): line._run_procurements() diff --git a/project_material/models/project_task_material.py b/project_material/models/project_task_material.py index ae759856..ce868d1a 100644 --- a/project_material/models/project_task_material.py +++ b/project_material/models/project_task_material.py @@ -318,13 +318,9 @@ def _propagate_planned_date_to_stock_moves(self): moves_to_update = moves.filtered( lambda m: m.state not in ("done", "cancel") ) - delay = moves_to_update.mapped("rule_id.delay") if delay: date_planned = date_planned - timedelta(delay[0]) - - # FIX ME : update date_expected on v12 but use what field on v14 instead - # Maybe `date` ? moves_to_update.with_context(do_not_propagate=True).write( {"date": date_planned} ) diff --git a/project_material/models/stock_move.py b/project_material/models/stock_move.py index 9104f7cd..603c7f8c 100644 --- a/project_material/models/stock_move.py +++ b/project_material/models/stock_move.py @@ -12,18 +12,21 @@ class StockMove(models.Model): index=True, ondelete="restrict", readonly=True, + check_company=True, ) project_id = fields.Many2one( related="task_id.project_id", store=True, readonly=True, + check_company=True, ) material_line_id = fields.Many2one( "project.task.material", "Material Line", index=True, ondelete="restrict", + check_company=True, ) def _get_new_picking_values(self): @@ -51,6 +54,7 @@ class StockMoveWithNoAggregation(models.Model): "Destination Material Line", compute="_compute_destination_material_line_id", store=True, + check_company=True, ) @api.depends("material_line_id", "move_dest_ids") diff --git a/project_material/models/stock_picking.py b/project_material/models/stock_picking.py index db3db8ab..4ba2cc90 100644 --- a/project_material/models/stock_picking.py +++ b/project_material/models/stock_picking.py @@ -12,11 +12,13 @@ class StockPicking(models.Model): "project.task", index=True, ondelete="restrict", + check_company=True, ) project_id = fields.Many2one( related="task_id.project_id", store=True, readonly=True, + check_company=True, ) task_readonly = fields.Boolean(compute="_compute_task_modifiers") diff --git a/project_material/models/stock_rule.py b/project_material/models/stock_rule.py index bf01c8fd..1433d453 100644 --- a/project_material/models/stock_rule.py +++ b/project_material/models/stock_rule.py @@ -7,30 +7,7 @@ class StockRule(models.Model): _inherit = "stock.rule" - def _get_stock_move_values( - self, - product_id, - product_qty, - product_uom, - location_id, - name, - origin, - company_id, - values, - ): - result = super()._get_stock_move_values( - product_id, - product_qty, - product_uom, - location_id, - name, - origin, - company_id, - values, - ) - result["material_line_id"] = values.get("material_line_id") - result["task_id"] = values.get("task_id") - if self.group_propagation_option == "propagate": - group_id = values.get("group_id", False) and values["group_id"].id - result["group_id"] = group_id - return result + def _get_custom_move_fields(self): + fields = super(StockRule, self)._get_custom_move_fields() + fields += ["material_line_id", "task_id"] + return fields diff --git a/project_material/models/stock_warehouse.py b/project_material/models/stock_warehouse.py index 4b97ba03..e508b19c 100644 --- a/project_material/models/stock_warehouse.py +++ b/project_material/models/stock_warehouse.py @@ -13,11 +13,6 @@ class Warehouse(models.Model): _inherit = "stock.warehouse" - def _get_default_consumption_location_id(self): - return self.env.ref( - "stock_location_production.location_production", raise_if_not_found=False - ).id - consu_steps = fields.Selection( [(ONE_STEP_KEY, ONE_STEP_DESCRIPTION)], default=ONE_STEP_KEY ) @@ -28,27 +23,51 @@ def _has_one_step_consumption(self): consu_location_id = fields.Many2one( "stock.location", "Consumption Location", - domain=[("usage", "=", "production")], + domain="[('usage', '=', 'production'), ('company_id', '=', company_id)]", + compute='_compute_consu_location_id', ondelete="restrict", - default=_get_default_consumption_location_id, + store=True, + check_company=True, ) consu_type_id = fields.Many2one( - "stock.picking.type", "Consumption Picking Type", ondelete="restrict" + "stock.picking.type", + "Consumption Type", + ondelete="restrict", + check_company=True, ) consu_return_type_id = fields.Many2one( - "stock.picking.type", "Consumption Return Picking Type", ondelete="restrict" + "stock.picking.type", + "Consumption Return Type", + ondelete="restrict", + check_company=True, ) consu_route_id = fields.Many2one( - "stock.location.route", "Consumption Route", ondelete="restrict" + "stock.location.route", + "Consumption Route", + ondelete="restrict", + domain="[('company_id', '=', company_id)]", + check_company=True, ) consu_mto_pull_id = fields.Many2one( - "stock.rule", "Consumption MTO Pull", ondelete="restrict" + "stock.rule", + "Consumption MTO Pull", + ondelete="restrict", + domain="[('company_id', '=', company_id)]", + check_company=True, ) + @api.depends('company_id') + def _compute_consu_location_id(self): + for record in self: + Proprerty = self.env["ir.property"].with_company(record.company_id) + record.consu_location_id = Proprerty._get( + "property_stock_production", "product.template" + ).id + @api.model def create(self, vals): """When creating a new warehouse, create the consumption route. @@ -83,7 +102,6 @@ def _create_or_update_consumption_picking_types(self): def _create_consumption_picking_types(self): vals = self._get_consumption_picking_type_create_values() self.consu_type_id = self.env["stock.picking.type"].create(vals) - vals = self._get_consumption_return_picking_type_create_values() self.consu_return_type_id = self.env["stock.picking.type"].create(vals) @@ -302,16 +320,23 @@ def _has_two_steps_consumption(self): consu_prep_location_id = fields.Many2one( "stock.location", "Preparation Picking Location", - domain=[("usage", "=", "internal")], + domain="[('usage', '=', 'internal'), ('company_id', '=', company_id)]", ondelete="restrict", + check_company=True, ) consu_prep_type_id = fields.Many2one( - "stock.picking.type", "Preparation Picking Type", ondelete="restrict" + "stock.picking.type", + "Preparation Picking Type", + ondelete="restrict", + check_company=True, ) consu_prep_return_type_id = fields.Many2one( - "stock.picking.type", "Preparation Return Picking Type", ondelete="restrict" + "stock.picking.type", + "Preparation Return Picking Type", + ondelete="restrict", + check_company=True, ) def _create_consumption_route(self): diff --git a/project_material/tests/test_consumption_route.py b/project_material/tests/test_consumption_route.py index e6ce73dd..7c87e7b6 100644 --- a/project_material/tests/test_consumption_route.py +++ b/project_material/tests/test_consumption_route.py @@ -21,9 +21,13 @@ def setUpClass(cls): class TestConsumptionStep(ConsumptionRouteCase): def test_default_consumption_location(self): - assert self.new_warehouse.consu_location_id == self.env.ref( - "stock_location_production.location_production" + consu_location_id = ( + self.env["ir.property"] + .with_company(self.new_company.id) + ._get("property_stock_production", "product.template") ) + self.assertTrue(consu_location_id.exists()) + assert self.new_warehouse.consu_location_id.id == consu_location_id.id def test_main_warehouse_has_consumption_route(self): assert self.main_warehouse.consu_route_id diff --git a/project_material/views/stock_warehouse.xml b/project_material/views/stock_warehouse.xml index 436202c2..bf90445e 100644 --- a/project_material/views/stock_warehouse.xml +++ b/project_material/views/stock_warehouse.xml @@ -8,13 +8,20 @@ - - + + + + + + + + diff --git a/stock_location_production/README.rst b/stock_location_production/README.rst deleted file mode 100644 index 202d327b..00000000 --- a/stock_location_production/README.rst +++ /dev/null @@ -1,7 +0,0 @@ -Stock Picking Split Quantity -============================ -This module adds a Production Stock Location data. - -Contributors ------------- -* Numigi (tm) and all its contributors (https://bit.ly/numigiens) diff --git a/stock_location_production/__init__.py b/stock_location_production/__init__.py deleted file mode 100644 index 0ab5e8ea..00000000 --- a/stock_location_production/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# © 2023 Numigi (tm) and all its contributors (https://bit.ly/numigiens) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). diff --git a/stock_location_production/__manifest__.py b/stock_location_production/__manifest__.py deleted file mode 100644 index 26466bd5..00000000 --- a/stock_location_production/__manifest__.py +++ /dev/null @@ -1,18 +0,0 @@ -# © 2023 Numigi (tm) and all its contributors (https://bit.ly/numigiens) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -{ - "name": "Stock Location Production", - "version": "1.0.0", - "author": "Numigi", - "maintainer": "Numigi", - "website": "https://bit.ly/numigi-com", - "license": "AGPL-3", - "category": "Stock", - "depends": ["stock"], - "summary": """ - Add a Production Stock Location data. - """, - "data": ["data/stock_data.xml"], - "installable": True, -} diff --git a/stock_location_production/data/stock_data.xml b/stock_location_production/data/stock_data.xml deleted file mode 100644 index 157b1f05..00000000 --- a/stock_location_production/data/stock_data.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Production - - production - - - - \ No newline at end of file diff --git a/stock_location_production/static/description/icon.png b/stock_location_production/static/description/icon.png deleted file mode 100644 index e69de29b..00000000