|
| 1 | +# Copyright 2023 ForgeFlow SL. |
| 2 | +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
| 3 | + |
| 4 | +import logging |
| 5 | + |
| 6 | +from odoo import SUPERUSER_ID, api |
| 7 | +from odoo.tools.sql import column_exists, table_exists |
| 8 | + |
| 9 | +_logger = logging.getLogger(__name__) |
| 10 | + |
| 11 | + |
| 12 | +def pre_init_hook(cr): |
| 13 | + if not column_exists(cr, "stock_move", "area_reserved_availability"): |
| 14 | + cr.execute( |
| 15 | + """ |
| 16 | + ALTER TABLE "stock_move" |
| 17 | + ADD COLUMN "area_reserved_availability" double precision DEFAULT 0 |
| 18 | + """ |
| 19 | + ) |
| 20 | + cr.execute( |
| 21 | + """ |
| 22 | + ALTER TABLE "stock_move" ALTER COLUMN "area_reserved_availability" DROP DEFAULT |
| 23 | + """ |
| 24 | + ) |
| 25 | + |
| 26 | + if not table_exists(cr, "stock_move_stock_reserve_area_rel"): |
| 27 | + cr.execute( |
| 28 | + """ |
| 29 | + CREATE TABLE stock_move_stock_reserve_area_rel |
| 30 | + (stock_move_id INTEGER, stock_reserve_area_id INTEGER); |
| 31 | + """ |
| 32 | + ) |
| 33 | + |
| 34 | + |
| 35 | +def assign_reserve_area_ids_to_stock_move_query(cr): |
| 36 | + query = """ |
| 37 | + INSERT INTO stock_move_stock_reserve_area_rel (stock_move_id, stock_reserve_area_id) |
| 38 | + SELECT DISTINCT sm.id AS stock_move_id, srl.reserve_area_id AS stock_reserve_area_id |
| 39 | + FROM stock_move sm |
| 40 | + JOIN stock_location sl ON sm.location_id = sl.id |
| 41 | + JOIN stock_reserve_area_stock_location_rel srl ON sl.id = srl.location_id |
| 42 | + WHERE NOT EXISTS ( |
| 43 | + SELECT 1 |
| 44 | + FROM stock_move_stock_reserve_area_rel existing_rel |
| 45 | + WHERE existing_rel.stock_move_id = sm.id |
| 46 | + AND existing_rel.stock_reserve_area_id = srl.reserve_area_id |
| 47 | + ); |
| 48 | + """ |
| 49 | + cr.execute(query) |
| 50 | + |
| 51 | + |
| 52 | +def post_init_hook(cr, registry): |
| 53 | + """ |
| 54 | + This post-init-hook will create a Reserve Area for each existing WH. |
| 55 | + """ |
| 56 | + _logger.info("Starting Post Init Hook") |
| 57 | + |
| 58 | + env = api.Environment(cr, SUPERUSER_ID, dict()) |
| 59 | + warehouse_obj = env["stock.warehouse"] |
| 60 | + warehouses = warehouse_obj.search([]) |
| 61 | + reserve_area_obj = env["stock.reserve.area"] |
| 62 | + _logger.info("Creating a Reserve Area for each WH") |
| 63 | + for warehouse_id in warehouses.ids: |
| 64 | + warehouse = warehouse_obj.browse(warehouse_id) |
| 65 | + |
| 66 | + all_locations = env["stock.location"].search( |
| 67 | + [("id", "child_of", warehouse.view_location_id.id)] |
| 68 | + ) |
| 69 | + |
| 70 | + reserve_area_obj.create( |
| 71 | + { |
| 72 | + "name": warehouse.name, |
| 73 | + "location_ids": [(6, 0, all_locations.ids)], |
| 74 | + "company_id": warehouse.company_id.id, |
| 75 | + } |
| 76 | + ) |
| 77 | + |
| 78 | + _logger.info("Starting assign_reserve_area_ids_to_stock_move_query") |
| 79 | + |
| 80 | + assign_reserve_area_ids_to_stock_move_query(cr) |
0 commit comments