diff --git a/oca_dependencies.txt b/oca_dependencies.txt index dfc5374f6c..cea3669972 100644 --- a/oca_dependencies.txt +++ b/oca_dependencies.txt @@ -7,9 +7,15 @@ ak-odoo-incubator https://github.com/akretion/ak-odoo-incubator 10.0 search-engine product-attribute product-variant +stock-logistics-workflow +sale-workflow storage https://github.com/akretion/storage 10.0 payment-gateway https://github.com/akretion/payment-gateway 10.0 base_rest https://github.com/oca/rest-framework 10.0 # TODO remove me when the PR is merged https://github.com/OCA/sale-workflow/pull/755 sale-workflow https://github.com/acsone/sale-workflow 10.0-sale_promotion_rule_discount_amount-lmi +# TODO remove me when the PR is merged https://github.com/OCA/sale-workflow/pull/843 +sale-workflow https://github.com/acsone/sale-workflow 10.0-sale_delivery_note +# TODO remove me when the PR is merged https://github.com/OCA/stock-logistics-workflow/pull/524 +stock-logistics-workflow https://github.com/acsone/stock-logistics-workflow 10.0-sale_stock_delivery_note diff --git a/setup/shopinvader_delivery_note/odoo/__init__.py b/setup/shopinvader_delivery_note/odoo/__init__.py new file mode 100644 index 0000000000..de40ea7ca0 --- /dev/null +++ b/setup/shopinvader_delivery_note/odoo/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/setup/shopinvader_delivery_note/odoo/addons/__init__.py b/setup/shopinvader_delivery_note/odoo/addons/__init__.py new file mode 100644 index 0000000000..de40ea7ca0 --- /dev/null +++ b/setup/shopinvader_delivery_note/odoo/addons/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/setup/shopinvader_delivery_note/odoo/addons/shopinvader_delivery_note b/setup/shopinvader_delivery_note/odoo/addons/shopinvader_delivery_note new file mode 120000 index 0000000000..35796c9875 --- /dev/null +++ b/setup/shopinvader_delivery_note/odoo/addons/shopinvader_delivery_note @@ -0,0 +1 @@ +../../../../shopinvader_delivery_note \ No newline at end of file diff --git a/setup/shopinvader_delivery_note/setup.py b/setup/shopinvader_delivery_note/setup.py new file mode 100644 index 0000000000..28c57bb640 --- /dev/null +++ b/setup/shopinvader_delivery_note/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/shopinvader_delivery_note/__init__.py b/shopinvader_delivery_note/__init__.py new file mode 100644 index 0000000000..35cebfd836 --- /dev/null +++ b/shopinvader_delivery_note/__init__.py @@ -0,0 +1,3 @@ +# Copyright 2019 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from . import services diff --git a/shopinvader_delivery_note/__manifest__.py b/shopinvader_delivery_note/__manifest__.py new file mode 100644 index 0000000000..e2487b1e47 --- /dev/null +++ b/shopinvader_delivery_note/__manifest__.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +{ + "name": "Shopinvader delivery note", + "description": """Shopinvader addons to let user define a delivery note""", + "author": "ACSONE SA/NV", + "website": "http://shopinvader.com/", + "category": "e-commerce", + "version": "10.0.1.0.0", + "license": "AGPL-3", + "depends": [ + "shopinvader", + # OCA/stock-logistics-workflow + "sale_stock_delivery_note", + ], +} diff --git a/shopinvader_delivery_note/services/__init__.py b/shopinvader_delivery_note/services/__init__.py new file mode 100644 index 0000000000..2dc57e84b7 --- /dev/null +++ b/shopinvader_delivery_note/services/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from . import abstract_sale +from . import cart diff --git a/shopinvader_delivery_note/services/abstract_sale.py b/shopinvader_delivery_note/services/abstract_sale.py new file mode 100644 index 0000000000..f1c3d72ef7 --- /dev/null +++ b/shopinvader_delivery_note/services/abstract_sale.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from odoo.addons.component.core import AbstractComponent + + +class AbstractSaleService(AbstractComponent): + _inherit = "shopinvader.abstract.sale.service" + + def _convert_one_sale(self, sale): + values = super(AbstractSaleService, self)._convert_one_sale(sale) + values.update({"delivery_note": sale.delivery_note}) + return values diff --git a/shopinvader_delivery_note/services/cart.py b/shopinvader_delivery_note/services/cart.py new file mode 100644 index 0000000000..0f2bca20f9 --- /dev/null +++ b/shopinvader_delivery_note/services/cart.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from odoo.addons.component.core import Component + + +class CartService(Component): + _inherit = "shopinvader.cart.service" + + def _validator_update(self): + validator = super(CartService, self)._validator_update() + validator.update({"delivery_note": {"type": "string"}}) + return validator + + def _prepare_delivery_note(self, delivery_note, params): + """ + Put the given delivery note into params dict (used to create the + sale.order). + :param delivery_note: str or bool + :param params: dict + :return: bool + """ + # If the user try to remove the value, we'll have an empty string + if delivery_note or isinstance(delivery_note, (str, unicode)): + params.update({"delivery_note": delivery_note}) + return True + + def _prepare_update(self, cart, params): + params = super(CartService, self)._prepare_update(cart, params) + self._prepare_delivery_note(params.pop("delivery_note", False), params) + return params diff --git a/shopinvader_delivery_note/tests/__init__.py b/shopinvader_delivery_note/tests/__init__.py new file mode 100644 index 0000000000..e0b6329ebb --- /dev/null +++ b/shopinvader_delivery_note/tests/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from . import test_sale_order_delivery_note diff --git a/shopinvader_delivery_note/tests/test_sale_order_delivery_note.py b/shopinvader_delivery_note/tests/test_sale_order_delivery_note.py new file mode 100644 index 0000000000..cdc8969838 --- /dev/null +++ b/shopinvader_delivery_note/tests/test_sale_order_delivery_note.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# Copyright 2019 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from uuid import uuid4 + +from odoo.addons.shopinvader.tests.test_cart import CommonConnectedCartCase + + +class TestSaleOrderDeliveryNote(CommonConnectedCartCase): + """ + Tests about the delivery note provided by the customer. + This field should by passed into the related picking. + """ + + def setUp(self): + super(TestSaleOrderDeliveryNote, self).setUp() + + def test_update_delivery_note1(self): + """ + Execute some update on existing cart (update many times the + delivery_note) then confirm it to check if the delivery_note is + passed to related pickings. + :return: + """ + delivery_notes = [ + str(uuid4()), + str(uuid4()), + "", + "", + str(uuid4()), + str(uuid4()), + ] + for delivery_note in delivery_notes: + params = {"delivery_note": delivery_note} + self.service.dispatch("update", params=params) + self.assertEquals(self.cart.delivery_note, delivery_note) + result = self.service.dispatch("update", _id=self.cart.id) + data = result.get("data", {}) + self.assertEquals(data.get("delivery_note"), delivery_note) + self.cart.action_confirm() + pickings = self.cart.picking_ids + self.assertTrue(pickings) + for picking in pickings: + # Should be equals to the last delivery_note set on the cart + self.assertEquals(picking.delivery_note, delivery_note) + return