diff --git a/setup/shopinvader_api_warehouse_sale_channel/odoo/addons/shopinvader_api_warehouse_sale_channel b/setup/shopinvader_api_warehouse_sale_channel/odoo/addons/shopinvader_api_warehouse_sale_channel new file mode 120000 index 000000000..ecb15695e --- /dev/null +++ b/setup/shopinvader_api_warehouse_sale_channel/odoo/addons/shopinvader_api_warehouse_sale_channel @@ -0,0 +1 @@ +../../../../shopinvader_api_warehouse_sale_channel \ No newline at end of file diff --git a/setup/shopinvader_api_warehouse_sale_channel/setup.py b/setup/shopinvader_api_warehouse_sale_channel/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/shopinvader_api_warehouse_sale_channel/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/setup/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/odoo/addons/shopinvader_api_warehouse_sale_channel_search_engine_product_stock b/setup/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/odoo/addons/shopinvader_api_warehouse_sale_channel_search_engine_product_stock new file mode 120000 index 000000000..8e0f7a6d1 --- /dev/null +++ b/setup/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/odoo/addons/shopinvader_api_warehouse_sale_channel_search_engine_product_stock @@ -0,0 +1 @@ +../../../../shopinvader_api_warehouse_sale_channel_search_engine_product_stock \ No newline at end of file diff --git a/setup/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/setup.py b/setup/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/shopinvader_api_warehouse_sale_channel/README.rst b/shopinvader_api_warehouse_sale_channel/README.rst new file mode 100644 index 000000000..fdf66e5bb --- /dev/null +++ b/shopinvader_api_warehouse_sale_channel/README.rst @@ -0,0 +1,70 @@ +====================================== +Shopinvader API Warehouse Sale Channel +====================================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:2583993def7147257da5338903f45aa21b34842cca298efad108a192dd2a5d74 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-shopinvader%2Fodoo--shopinvader-lightgray.png?logo=github + :target: https://github.com/shopinvader/odoo-shopinvader/tree/16.0/shopinvader_api_warehouse_sale_channel + :alt: shopinvader/odoo-shopinvader + +|badge1| |badge2| |badge3| + +This module provides a way to link Warehouses to Sale Channels and +filter them in Shopinvader API endpoints according to the Sale Channel +linked to the endpoint. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Akretion + +Contributors +------------ + +- Florian Mounier florian.mounier@akretion.com + +Maintainers +----------- + +.. |maintainer-paradoxxxzero| image:: https://github.com/paradoxxxzero.png?size=40px + :target: https://github.com/paradoxxxzero + :alt: paradoxxxzero + +Current maintainer: + +|maintainer-paradoxxxzero| + +This module is part of the `shopinvader/odoo-shopinvader `_ project on GitHub. + +You are welcome to contribute. diff --git a/shopinvader_api_warehouse_sale_channel/__init__.py b/shopinvader_api_warehouse_sale_channel/__init__.py new file mode 100644 index 000000000..9ef814457 --- /dev/null +++ b/shopinvader_api_warehouse_sale_channel/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import routers diff --git a/shopinvader_api_warehouse_sale_channel/__manifest__.py b/shopinvader_api_warehouse_sale_channel/__manifest__.py new file mode 100644 index 000000000..78552ae7b --- /dev/null +++ b/shopinvader_api_warehouse_sale_channel/__manifest__.py @@ -0,0 +1,24 @@ +# Copyright 2025 Akretion (http://www.akretion.com). +# @author Florian Mounier +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Shopinvader API Warehouse Sale Channel", + "version": "16.0.1.0.0", + "author": "Akretion, Odoo Community Association (OCA)", + "summary": "Glue module to use Shopinvader API Warehouse with Sale Channel", + "category": "Uncategorized", + "depends": [ + "shopinvader_api_warehouse", + "shopinvader_sale_channel", + ], + "website": "https://github.com/shopinvader/odoo-shopinvader", + "data": [ + "views/stock_warehouse_views.xml", + ], + "maintainers": ["paradoxxxzero"], + "demo": [], + "installable": True, + "license": "AGPL-3", + "auto_install": True, +} diff --git a/shopinvader_api_warehouse_sale_channel/models/__init__.py b/shopinvader_api_warehouse_sale_channel/models/__init__.py new file mode 100644 index 000000000..7c61a1b65 --- /dev/null +++ b/shopinvader_api_warehouse_sale_channel/models/__init__.py @@ -0,0 +1,2 @@ +from . import stock_warehouse +from . import sale_channel diff --git a/shopinvader_api_warehouse_sale_channel/models/sale_channel.py b/shopinvader_api_warehouse_sale_channel/models/sale_channel.py new file mode 100644 index 000000000..e96a4c5a3 --- /dev/null +++ b/shopinvader_api_warehouse_sale_channel/models/sale_channel.py @@ -0,0 +1,15 @@ +# Copyright 2025 Akretion (http://www.akretion.com). +# @author Florian Mounier +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class SaleChannel(models.Model): + _inherit = "sale.channel" + + warehouse_ids = fields.Many2many( + "stock.warehouse", + string="Warehouses", + help="Warehouses associated with this sale channel.", + ) diff --git a/shopinvader_api_warehouse_sale_channel/models/stock_warehouse.py b/shopinvader_api_warehouse_sale_channel/models/stock_warehouse.py new file mode 100644 index 000000000..e88a30899 --- /dev/null +++ b/shopinvader_api_warehouse_sale_channel/models/stock_warehouse.py @@ -0,0 +1,15 @@ +# Copyright 2025 Akretion (http://www.akretion.com). +# @author Florian Mounier +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class StockWarehouse(models.Model): + _inherit = "stock.warehouse" + + sale_channel_ids = fields.Many2many( + "sale.channel", + string="Sale Channels", + help="Sale channels associated with this warehouse.", + ) diff --git a/shopinvader_api_warehouse_sale_channel/readme/CONTRIBUTORS.md b/shopinvader_api_warehouse_sale_channel/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..328a37da8 --- /dev/null +++ b/shopinvader_api_warehouse_sale_channel/readme/CONTRIBUTORS.md @@ -0,0 +1 @@ +- Florian Mounier diff --git a/shopinvader_api_warehouse_sale_channel/readme/DESCRIPTION.md b/shopinvader_api_warehouse_sale_channel/readme/DESCRIPTION.md new file mode 100644 index 000000000..8a1ab4d42 --- /dev/null +++ b/shopinvader_api_warehouse_sale_channel/readme/DESCRIPTION.md @@ -0,0 +1,2 @@ +This module provides a way to link Warehouses to Sale Channels and filter them +in Shopinvader API endpoints according to the Sale Channel linked to the endpoint. diff --git a/shopinvader_api_warehouse_sale_channel/routers/__init__.py b/shopinvader_api_warehouse_sale_channel/routers/__init__.py new file mode 100644 index 000000000..5dde317f7 --- /dev/null +++ b/shopinvader_api_warehouse_sale_channel/routers/__init__.py @@ -0,0 +1 @@ +from . import warehouse diff --git a/shopinvader_api_warehouse_sale_channel/routers/warehouse.py b/shopinvader_api_warehouse_sale_channel/routers/warehouse.py new file mode 100644 index 000000000..9f59d88e0 --- /dev/null +++ b/shopinvader_api_warehouse_sale_channel/routers/warehouse.py @@ -0,0 +1,22 @@ +# Copyright 2025 Akretion (http://www.akretion.com). +# @author Florian Mounier +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo import models +from odoo.osv import expression + + +class ShopinvaderApiWarehouseRouterHelper(models.AbstractModel): + _inherit = "shopinvader_api_warehouse.warehouse_router.helper" + + def _get_sale_channel_id(self) -> int: + return self.env.context.get("sale_channel_id") + + def _get_domain_adapter(self): + return expression.AND( + [ + super()._get_domain_adapter(), + [("sale_channel_ids", "in", (self._get_sale_channel_id(),))], + ] + ) diff --git a/shopinvader_api_warehouse_sale_channel/static/description/index.html b/shopinvader_api_warehouse_sale_channel/static/description/index.html new file mode 100644 index 000000000..a8fad764a --- /dev/null +++ b/shopinvader_api_warehouse_sale_channel/static/description/index.html @@ -0,0 +1,420 @@ + + + + + +Shopinvader API Warehouse Sale Channel + + + +
+

Shopinvader API Warehouse Sale Channel

+ + +

Beta License: AGPL-3 shopinvader/odoo-shopinvader

+

This module provides a way to link Warehouses to Sale Channels and +filter them in Shopinvader API endpoints according to the Sale Channel +linked to the endpoint.

+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Akretion
  • +
+
+ +
+

Maintainers

+

Current maintainer:

+

paradoxxxzero

+

This module is part of the shopinvader/odoo-shopinvader project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/shopinvader_api_warehouse_sale_channel/tests/__init__.py b/shopinvader_api_warehouse_sale_channel/tests/__init__.py new file mode 100644 index 000000000..45122e0ea --- /dev/null +++ b/shopinvader_api_warehouse_sale_channel/tests/__init__.py @@ -0,0 +1 @@ +from . import test_shopinvader_api_warehouse_sale_channel diff --git a/shopinvader_api_warehouse_sale_channel/tests/test_shopinvader_api_warehouse_sale_channel.py b/shopinvader_api_warehouse_sale_channel/tests/test_shopinvader_api_warehouse_sale_channel.py new file mode 100644 index 000000000..b58062417 --- /dev/null +++ b/shopinvader_api_warehouse_sale_channel/tests/test_shopinvader_api_warehouse_sale_channel.py @@ -0,0 +1,146 @@ +# Copyright 2025 Akretion (http://www.akretion.com). +# @author Florian Mounier +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from fastapi import status +from fastapi.responses import Response + +from odoo.addons.shopinvader_api_warehouse.routers.warehouse import warehouse_router +from odoo.addons.shopinvader_api_warehouse.tests.common import WarehouseCaseCommon + + +class TestShopinvaderApiWarehouseSaleChannel(WarehouseCaseCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls.sale_channel = cls.env["sale.channel"].create( + { + "name": "Test Sale Channel", + } + ) + cls.sale_channel2 = cls.env["sale.channel"].create( + { + "name": "Test Sale Channel 2", + } + ) + + cls.warehouse_1.sale_channel_ids = [(4, cls.sale_channel.id)] + cls.warehouse_2.sale_channel_ids = [(4, cls.sale_channel2.id)] + cls.env.ref("stock.warehouse0").sale_channel_ids = [ + (6, 0, (cls.sale_channel | cls.sale_channel2).ids) + ] + + cls.partner = cls.env["res.partner"].create( + { + "name": "FastAPI Warehouse Demo", + } + ) + + cls.default_fastapi_running_user = cls.env.ref("fastapi.my_demo_app_user") + cls.default_fastapi_running_user.groups_id |= cls.env.ref( + "shopinvader_api_security_sale.shopinvader_sale_user_group" + ) | cls.env.ref( + "shopinvader_api_warehouse.shopinvader_stock_warehouse_user_group" + ) + + cls.endpoint = cls.env.ref("fastapi.fastapi_endpoint_demo") + cls.endpoint.sale_channel_id = cls.sale_channel.id + # We use the api_key auth method here to be able to authenticate as + # a partner with the real dependency machinery (env creation) + cls.endpoint.demo_auth_method = "api_key" + cls.default_fastapi_app = cls.endpoint._get_app() + cls.default_fastapi_dependency_overrides = ( + cls.default_fastapi_app.dependency_overrides + ) + + def test_search_warehouse_1(self): + with self._create_test_client(router=warehouse_router) as test_client: + response: Response = test_client.get( + "/warehouses", headers={"api-key": "my_demo_app_user"} + ) + self.assertEqual(response.status_code, status.HTTP_200_OK) + warehouses_data = response.json() + self.assertEqual(warehouses_data["count"], 2) + default_warehouse_data = warehouses_data["items"][0] + default_warehouse = self.env.ref("stock.warehouse0") + self.assertEqual(default_warehouse_data["name"], default_warehouse.name) + self.assertEqual(default_warehouse_data["code"], default_warehouse.code) + self.assertEqual(default_warehouse_data["default"], None) + self.assertEqual( + default_warehouse_data["address"], default_warehouse.partner_id.street + ) + self.assertEqual( + default_warehouse_data["city"], default_warehouse.partner_id.city + ) + self.assertEqual( + default_warehouse_data["zip"], default_warehouse.partner_id.zip + ) + self.assertEqual( + default_warehouse_data["country"], + default_warehouse.partner_id.country_id.name, + ) + self.assertEqual( + default_warehouse_data["phone"], default_warehouse.partner_id.phone + ) + + warehouse_1_data = warehouses_data["items"][1] + self.assertEqual(warehouse_1_data["name"], self.warehouse_1.name) + self.assertEqual(warehouse_1_data["code"], self.warehouse_1.code) + self.assertEqual(warehouse_1_data["default"], None) + self.assertEqual( + warehouse_1_data["address"], self.warehouse_1.partner_id.street + ) + self.assertEqual(warehouse_1_data["city"], self.warehouse_1.partner_id.city) + self.assertEqual(warehouse_1_data["zip"], self.warehouse_1.partner_id.zip) + self.assertEqual( + warehouse_1_data["country"], + self.warehouse_1.partner_id.country_id.name, + ) + self.assertEqual(warehouse_1_data["phone"], self.warehouse_1.partner_id.phone) + + def test_search_warehouse_2(self): + self.endpoint.sale_channel_id = self.sale_channel2.id + + with self._create_test_client(router=warehouse_router) as test_client: + response: Response = test_client.get( + "/warehouses", headers={"api-key": "my_demo_app_user"} + ) + self.assertEqual(response.status_code, status.HTTP_200_OK) + warehouses_data = response.json() + self.assertEqual(warehouses_data["count"], 2) + default_warehouse_data = warehouses_data["items"][0] + default_warehouse = self.env.ref("stock.warehouse0") + self.assertEqual(default_warehouse_data["name"], default_warehouse.name) + self.assertEqual(default_warehouse_data["code"], default_warehouse.code) + self.assertEqual(default_warehouse_data["default"], None) + self.assertEqual( + default_warehouse_data["address"], default_warehouse.partner_id.street + ) + self.assertEqual( + default_warehouse_data["city"], default_warehouse.partner_id.city + ) + self.assertEqual( + default_warehouse_data["zip"], default_warehouse.partner_id.zip + ) + self.assertEqual( + default_warehouse_data["country"], + default_warehouse.partner_id.country_id.name, + ) + self.assertEqual( + default_warehouse_data["phone"], default_warehouse.partner_id.phone + ) + warehouse_2_data = warehouses_data["items"][1] + self.assertEqual(warehouse_2_data["name"], self.warehouse_2.name) + self.assertEqual(warehouse_2_data["code"], self.warehouse_2.code) + self.assertEqual(warehouse_2_data["default"], None) + self.assertEqual( + warehouse_2_data["address"], self.warehouse_2.partner_id.street + ) + self.assertEqual(warehouse_2_data["city"], self.warehouse_2.partner_id.city) + self.assertEqual(warehouse_2_data["zip"], self.warehouse_2.partner_id.zip) + self.assertEqual( + warehouse_2_data["country"], + self.warehouse_2.partner_id.country_id.name, + ) + self.assertEqual(warehouse_2_data["phone"], self.warehouse_2.partner_id.phone) diff --git a/shopinvader_api_warehouse_sale_channel/views/stock_warehouse_views.xml b/shopinvader_api_warehouse_sale_channel/views/stock_warehouse_views.xml new file mode 100644 index 000000000..7b7170e3c --- /dev/null +++ b/shopinvader_api_warehouse_sale_channel/views/stock_warehouse_views.xml @@ -0,0 +1,21 @@ + + + + + stock.warehouse + + + + + + + + diff --git a/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/README.rst b/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/README.rst new file mode 100644 index 000000000..9d9013ad9 --- /dev/null +++ b/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/README.rst @@ -0,0 +1,69 @@ +================================================================== +Shopinvader API Warehouse Sale Channel Search Engine Product Stock +================================================================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:60737e6309d500642f5097fbd215a849ce0388d357f6099d2edbf423c16f5354 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-shopinvader%2Fodoo--shopinvader-lightgray.png?logo=github + :target: https://github.com/shopinvader/odoo-shopinvader/tree/16.0/shopinvader_api_warehouse_sale_channel_search_engine_product_stock + :alt: shopinvader/odoo-shopinvader + +|badge1| |badge2| |badge3| + +This module provides a way to link Warehouses in Sale Channels to Search +Engine Product Stock export indexes. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Akretion + +Contributors +------------ + +- Florian Mounier florian.mounier@akretion.com + +Maintainers +----------- + +.. |maintainer-paradoxxxzero| image:: https://github.com/paradoxxxzero.png?size=40px + :target: https://github.com/paradoxxxzero + :alt: paradoxxxzero + +Current maintainer: + +|maintainer-paradoxxxzero| + +This module is part of the `shopinvader/odoo-shopinvader `_ project on GitHub. + +You are welcome to contribute. diff --git a/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/__init__.py b/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/__manifest__.py b/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/__manifest__.py new file mode 100644 index 000000000..fba302eb2 --- /dev/null +++ b/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/__manifest__.py @@ -0,0 +1,24 @@ +# Copyright 2025 Akretion (http://www.akretion.com). +# @author Florian Mounier +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Shopinvader API Warehouse Sale Channel Search Engine Product Stock", + "version": "16.0.1.0.0", + "author": "Akretion, Odoo Community Association (OCA)", + "summary": "Glue module to use Shopinvader API Warehouse Sale Channel with " + "Search Engine Product Stock", + "category": "Uncategorized", + "depends": [ + "sale_channel_search_engine", + "shopinvader_api_warehouse_sale_channel", + "shopinvader_search_engine_product_stock", + ], + "website": "https://github.com/shopinvader/odoo-shopinvader", + "data": [], + "maintainers": ["paradoxxxzero"], + "demo": [], + "installable": True, + "license": "AGPL-3", + "auto_install": True, +} diff --git a/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/models/__init__.py b/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/models/__init__.py new file mode 100644 index 000000000..9e3a40341 --- /dev/null +++ b/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/models/__init__.py @@ -0,0 +1 @@ +from . import se_index diff --git a/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/models/se_index.py b/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/models/se_index.py new file mode 100644 index 000000000..bb0ede3a4 --- /dev/null +++ b/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/models/se_index.py @@ -0,0 +1,14 @@ +# Copyright 2025 Akretion (http://www.akretion.com). +# @author Florian Mounier +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo import fields, models + + +class SeIndex(models.Model): + _inherit = "se.index" + + warehouse_ids = fields.Many2many( + related="backend_id.sale_channel_id.warehouse_ids", + ) diff --git a/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/readme/CONTRIBUTORS.md b/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..328a37da8 --- /dev/null +++ b/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/readme/CONTRIBUTORS.md @@ -0,0 +1 @@ +- Florian Mounier diff --git a/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/readme/DESCRIPTION.md b/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/readme/DESCRIPTION.md new file mode 100644 index 000000000..71e9aca80 --- /dev/null +++ b/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/readme/DESCRIPTION.md @@ -0,0 +1,2 @@ +This module provides a way to link Warehouses in Sale Channels to Search Engine +Product Stock export indexes. diff --git a/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/static/description/index.html b/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/static/description/index.html new file mode 100644 index 000000000..30fb52ad2 --- /dev/null +++ b/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/static/description/index.html @@ -0,0 +1,419 @@ + + + + + +Shopinvader API Warehouse Sale Channel Search Engine Product Stock + + + +
+

Shopinvader API Warehouse Sale Channel Search Engine Product Stock

+ + +

Beta License: AGPL-3 shopinvader/odoo-shopinvader

+

This module provides a way to link Warehouses in Sale Channels to Search +Engine Product Stock export indexes.

+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Akretion
  • +
+
+ +
+

Maintainers

+

Current maintainer:

+

paradoxxxzero

+

This module is part of the shopinvader/odoo-shopinvader project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/tests/__init__.py b/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/tests/__init__.py new file mode 100644 index 000000000..4ea31378b --- /dev/null +++ b/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/tests/__init__.py @@ -0,0 +1 @@ +from . import test_shopinvader_api_warehouse_sale_channel_search_engine_product_stock diff --git a/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/tests/test_shopinvader_api_warehouse_sale_channel_search_engine_product_stock.py b/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/tests/test_shopinvader_api_warehouse_sale_channel_search_engine_product_stock.py new file mode 100644 index 000000000..7e57a168a --- /dev/null +++ b/shopinvader_api_warehouse_sale_channel_search_engine_product_stock/tests/test_shopinvader_api_warehouse_sale_channel_search_engine_product_stock.py @@ -0,0 +1,46 @@ +# Copyright 2025 Akretion (http://www.akretion.com). +# @author Florian Mounier +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo.addons.shopinvader_search_engine_product_stock.tests.common import ( + StockCommonCase, +) + + +class TestShopinvaderApiWarehouseSaleChannelSearchEngineProductStock(StockCommonCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls.sale_channel = cls.env["sale.channel"].create( + { + "name": "Test Sale Channel", + } + ) + cls.sale_channel2 = cls.env["sale.channel"].create( + { + "name": "Test Sale Channel 2", + } + ) + + cls.warehouse_1.sale_channel_ids = [(4, cls.sale_channel.id)] + cls.warehouse_2.sale_channel_ids = [(4, cls.sale_channel2.id)] + cls.index.backend_id.sale_channel_id = cls.sale_channel + + def test_warehouse_sync_1(self): + self.assertEqual(self.index.warehouse_ids, self.warehouse_1) + self.assertEqual( + self.index.backend_id.sale_channel_id.warehouse_ids, self.warehouse_1 + ) + + self.warehouse_1.sale_channel_ids = [ + (6, 0, (self.sale_channel | self.sale_channel2).ids) + ] + self.assertEqual(self.index.warehouse_ids, self.warehouse_1) + + self.warehouse_1.sale_channel_ids = [(4, self.sale_channel.id)] + self.warehouse_2.sale_channel_ids = [ + (6, 0, (self.sale_channel | self.sale_channel2).ids) + ] + self.assertEqual(self.index.warehouse_ids, self.warehouse_1 | self.warehouse_2)