diff --git a/edi_stock_oca/README.rst b/edi_stock_oca/README.rst new file mode 100644 index 000000000..d4c6da4eb --- /dev/null +++ b/edi_stock_oca/README.rst @@ -0,0 +1,96 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +============= +EDI Stock OCA +============= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:2bfa1cb755a6f8e89e8c22b36e0b803a587a8607be92c3de5eb8b11e9371faec + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/license-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-OCA%2Fedi--framework-lightgray.png?logo=github + :target: https://github.com/OCA/edi-framework/tree/19.0/edi_stock_oca + :alt: OCA/edi-framework +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/edi-framework-19-0/edi-framework-19-0-edi_stock_oca + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/edi-framework&target_branch=19.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module intends to create a base to be extended by local edi rules +for stock. + +In order to add a new integration for an stock picking, you need to +create a listener: + +.. code:: python + + class MyEventListener(Component): + _name = "stock.picking.event.listener.demo" + _inherit = "base.event.listener" + _apply_on = ["stock.picking"] + + def on_validate(self, picking): + """Add your code here about creation of record""" + +**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 +------- + +* Creu Blanca + +Contributors +------------ + +- Alba Riera +- Alex Paris +- Simone Orsi + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/edi-framework `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/edi_stock_oca/__init__.py b/edi_stock_oca/__init__.py new file mode 100644 index 000000000..0f00a6730 --- /dev/null +++ b/edi_stock_oca/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import components diff --git a/edi_stock_oca/__manifest__.py b/edi_stock_oca/__manifest__.py new file mode 100644 index 000000000..985d0ac16 --- /dev/null +++ b/edi_stock_oca/__manifest__.py @@ -0,0 +1,23 @@ +# Copyright 2022 Creu Blanca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "EDI Stock OCA", + "summary": """ + Define EDI Configuration for Stock""", + "version": "19.0.1.0.0", + "license": "AGPL-3", + "author": "Creu Blanca, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/edi-framework", + "depends": ["stock", "edi_core_oca", "edi_component_oca"], + "data": [ + "data/edi_configuration.xml", + "views/stock_picking.xml", + "views/res_partner.xml", + ], + "demo": [ + "demo/edi_backend.xml", + "demo/edi_exchange_type.xml", + "demo/edi_configuration.xml", + ], +} diff --git a/edi_stock_oca/components/__init__.py b/edi_stock_oca/components/__init__.py new file mode 100644 index 000000000..a441d8bd1 --- /dev/null +++ b/edi_stock_oca/components/__init__.py @@ -0,0 +1 @@ +from . import listeners diff --git a/edi_stock_oca/components/listeners.py b/edi_stock_oca/components/listeners.py new file mode 100644 index 000000000..f2cdfb5a6 --- /dev/null +++ b/edi_stock_oca/components/listeners.py @@ -0,0 +1,24 @@ +from odoo.addons.component.core import Component + + +class EDIConfigSPListener(Component): + _name = "edi.listener.config.stock.picking" + _inherit = "base.event.listener" + _apply_on = ["stock.picking"] + + def on_record_create(self, record, fields=None): + trigger = "on_record_create" + return self._exec_conf(record, trigger) + + def on_record_write(self, record, fields=None): + trigger = "on_record_write" + return self._exec_conf(record, trigger) + + def on_edi_stock_picking_state_change(self, record, state=None): + trigger = "on_edi_stock_picking_state_change" + return self._exec_conf(record, trigger) + + def _exec_conf(self, record, trigger, conf_field="edi_stock_picking_conf_ids"): + confs = record.partner_id[conf_field].edi_get_conf(trigger) + for conf in confs: + conf.edi_exec_snippet_do(record) diff --git a/edi_stock_oca/data/edi_configuration.xml b/edi_stock_oca/data/edi_configuration.xml new file mode 100644 index 000000000..75d7a30b1 --- /dev/null +++ b/edi_stock_oca/data/edi_configuration.xml @@ -0,0 +1,13 @@ + + + + + On Transfer state change + on_edi_stock_picking_state_change + Trigger when a stock picking state changes + + + diff --git a/edi_stock_oca/demo/edi_backend.xml b/edi_stock_oca/demo/edi_backend.xml new file mode 100644 index 000000000..c8526fee7 --- /dev/null +++ b/edi_stock_oca/demo/edi_backend.xml @@ -0,0 +1,11 @@ + + + + TRANSFER DEMO + picking_demo + + + TRANSFER DEMO + + + diff --git a/edi_stock_oca/demo/edi_configuration.xml b/edi_stock_oca/demo/edi_configuration.xml new file mode 100644 index 000000000..faa9feca3 --- /dev/null +++ b/edi_stock_oca/demo/edi_configuration.xml @@ -0,0 +1,21 @@ + + + + Demo Transfer - Done + Show case state change to done + + + + + +# ('draft', 'Draft'), +# ('waiting', 'Waiting Another Operation'), +# ('confirmed', 'Waiting'), +# ('assigned', 'Ready'), +# ('done', 'Done'), +# ('cancel', 'Cancelled'), +if record.state in ('done', 'cancel', 'confirmed', 'assigned'): + record._edi_send_via_edi(conf.type_id) + + + diff --git a/edi_stock_oca/demo/edi_exchange_type.xml b/edi_stock_oca/demo/edi_exchange_type.xml new file mode 100644 index 000000000..75a39d6bb --- /dev/null +++ b/edi_stock_oca/demo/edi_exchange_type.xml @@ -0,0 +1,12 @@ + + + + + + Demo Transfer Response + demo_Transfer_out + output + {record_name}-{type.code}-{dt} + xml + + diff --git a/edi_stock_oca/i18n/edi_stock_oca.pot b/edi_stock_oca/i18n/edi_stock_oca.pot new file mode 100644 index 000000000..59b67947c --- /dev/null +++ b/edi_stock_oca/i18n/edi_stock_oca.pot @@ -0,0 +1,105 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * edi_stock_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \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: edi_stock_oca +#: model:ir.model,name:edi_stock_oca.model_res_partner +msgid "Contact" +msgstr "" + +#. module: edi_stock_oca +#: model:ir.model.fields,field_description:edi_stock_oca.field_stock_picking__edi_disable_auto +msgid "Disable auto" +msgstr "" + +#. module: edi_stock_oca +#: model_terms:ir.ui.view,arch_db:edi_stock_oca.stock_picking_form_view +msgid "EDI" +msgstr "" + +#. module: edi_stock_oca +#: model:ir.model.fields,field_description:edi_stock_oca.field_stock_picking__origin_edi_endpoint_id +msgid "EDI origin endpoint" +msgstr "" + +#. module: edi_stock_oca +#: model:ir.model.fields,field_description:edi_stock_oca.field_stock_picking__origin_exchange_type_id +msgid "EDI origin exchange type" +msgstr "" + +#. module: edi_stock_oca +#: model:ir.model.fields,field_description:edi_stock_oca.field_stock_picking__origin_exchange_record_id +msgid "EDI origin record" +msgstr "" + +#. module: edi_stock_oca +#: model:ir.model.fields,help:edi_stock_oca.field_stock_picking__origin_exchange_record_id +msgid "EDI record that originated this document." +msgstr "" + +#. module: edi_stock_oca +#: model:ir.model.fields,field_description:edi_stock_oca.field_res_partner__edi_stock_picking_conf_ids +#: model:ir.model.fields,field_description:edi_stock_oca.field_res_users__edi_stock_picking_conf_ids +msgid "EDI stock configuration" +msgstr "" + +#. module: edi_stock_oca +#: model:ir.model.fields,field_description:edi_stock_oca.field_stock_picking__edi_config +msgid "Edi Config" +msgstr "" + +#. module: edi_stock_oca +#: model:ir.model.fields,field_description:edi_stock_oca.field_stock_picking__edi_has_form_config +msgid "Edi Has Form Config" +msgstr "" + +#. module: edi_stock_oca +#: model_terms:ir.ui.view,arch_db:edi_stock_oca.stock_picking_form_view +msgid "Electronic Data Interchange" +msgstr "" + +#. module: edi_stock_oca +#: model:ir.model.fields,field_description:edi_stock_oca.field_stock_picking__exchange_record_ids +msgid "Exchange Record" +msgstr "" + +#. module: edi_stock_oca +#: model:ir.model.fields,field_description:edi_stock_oca.field_stock_picking__exchange_record_count +msgid "Exchange Record Count" +msgstr "" + +#. module: edi_stock_oca +#: model:ir.model.fields,field_description:edi_stock_oca.field_stock_picking__exchange_related_record_ids +msgid "Exchange Related Record" +msgstr "" + +#. module: edi_stock_oca +#: model:ir.model.fields,help:edi_stock_oca.field_stock_picking__origin_edi_endpoint_id +msgid "Record generated via this endpoint" +msgstr "" + +#. module: edi_stock_oca +#: model:ir.model,name:edi_stock_oca.model_stock_picking +msgid "Transfer" +msgstr "" + +#. module: edi_stock_oca +#: model_terms:ir.ui.view,arch_db:edi_stock_oca.view_partner_form +msgid "Transfers" +msgstr "" + +#. module: edi_stock_oca +#: model:ir.model.fields,help:edi_stock_oca.field_stock_picking__edi_disable_auto +msgid "When marked, EDI automatic processing will be avoided" +msgstr "" diff --git a/edi_stock_oca/i18n/it.po b/edi_stock_oca/i18n/it.po new file mode 100644 index 000000000..a435e29c0 --- /dev/null +++ b/edi_stock_oca/i18n/it.po @@ -0,0 +1,111 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * edi_stock_oca +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-09-15 08:42+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.4\n" + +#. module: edi_stock_oca +#: model:ir.model,name:edi_stock_oca.model_res_partner +msgid "Contact" +msgstr "Contatto" + +#. module: edi_stock_oca +#: model:ir.model.fields,field_description:edi_stock_oca.field_stock_picking__edi_disable_auto +msgid "Disable auto" +msgstr "Disabilita automatico" + +#. module: edi_stock_oca +#: model_terms:ir.ui.view,arch_db:edi_stock_oca.stock_picking_form_view +msgid "EDI" +msgstr "EDI" + +#. module: edi_stock_oca +#: model:ir.model.fields,field_description:edi_stock_oca.field_stock_picking__origin_edi_endpoint_id +msgid "EDI origin endpoint" +msgstr "Endpoint origine EDI" + +#. module: edi_stock_oca +#: model:ir.model.fields,field_description:edi_stock_oca.field_stock_picking__origin_exchange_type_id +msgid "EDI origin exchange type" +msgstr "Tipo scambio origine EDI" + +#. module: edi_stock_oca +#: model:ir.model.fields,field_description:edi_stock_oca.field_stock_picking__origin_exchange_record_id +msgid "EDI origin record" +msgstr "Record origine EDI" + +#. module: edi_stock_oca +#: model:ir.model.fields,help:edi_stock_oca.field_stock_picking__origin_exchange_record_id +msgid "EDI record that originated this document." +msgstr "Record EDI che ha generato questo documento." + +#. module: edi_stock_oca +#: model:ir.model.fields,field_description:edi_stock_oca.field_res_partner__edi_stock_picking_conf_ids +#: model:ir.model.fields,field_description:edi_stock_oca.field_res_users__edi_stock_picking_conf_ids +msgid "EDI stock configuration" +msgstr "Configurazione magazzino EDI" + +#. module: edi_stock_oca +#: model:ir.model.fields,field_description:edi_stock_oca.field_stock_picking__edi_config +msgid "Edi Config" +msgstr "Configurazione EDI" + +#. module: edi_stock_oca +#: model:ir.model.fields,field_description:edi_stock_oca.field_stock_picking__edi_has_form_config +msgid "Edi Has Form Config" +msgstr "EDI ha una maschera di configurazione" + +#. module: edi_stock_oca +#: model_terms:ir.ui.view,arch_db:edi_stock_oca.stock_picking_form_view +msgid "Electronic Data Interchange" +msgstr "Scambio Dati Elettronico" + +#. module: edi_stock_oca +#: model:ir.model.fields,field_description:edi_stock_oca.field_stock_picking__exchange_record_ids +msgid "Exchange Record" +msgstr "Record di scambio" + +#. module: edi_stock_oca +#: model:ir.model.fields,field_description:edi_stock_oca.field_stock_picking__exchange_record_count +msgid "Exchange Record Count" +msgstr "Conteggio record di scambio" + +#. module: edi_stock_oca +#: model:ir.model.fields,field_description:edi_stock_oca.field_stock_picking__exchange_related_record_ids +msgid "Exchange Related Record" +msgstr "Record relativo allo scambio" + +#. module: edi_stock_oca +#: model:ir.model.fields,help:edi_stock_oca.field_stock_picking__origin_edi_endpoint_id +msgid "Record generated via this endpoint" +msgstr "Record generato attraverso questo endpoint" + +#. module: edi_stock_oca +#: model:ir.model,name:edi_stock_oca.model_stock_picking +msgid "Transfer" +msgstr "Trasferimento" + +#. module: edi_stock_oca +#: model_terms:ir.ui.view,arch_db:edi_stock_oca.view_partner_form +msgid "Transfers" +msgstr "Trasferimenti" + +#. module: edi_stock_oca +#: model:ir.model.fields,help:edi_stock_oca.field_stock_picking__edi_disable_auto +msgid "When marked, EDI automatic processing will be avoided" +msgstr "Quando selezionata, l'elaborazione EDI automatica verrĂ  evitata" + +#~ msgid "EDI Configuration" +#~ msgstr "Configurazione EDI" diff --git a/edi_stock_oca/models/__init__.py b/edi_stock_oca/models/__init__.py new file mode 100644 index 000000000..6192433eb --- /dev/null +++ b/edi_stock_oca/models/__init__.py @@ -0,0 +1,2 @@ +from . import stock_picking +from . import res_partner diff --git a/edi_stock_oca/models/res_partner.py b/edi_stock_oca/models/res_partner.py new file mode 100644 index 000000000..2b14d0ed3 --- /dev/null +++ b/edi_stock_oca/models/res_partner.py @@ -0,0 +1,18 @@ +# Copyright 2025 ForgeFlow +# Copyright 2025 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResPartner(models.Model): + _inherit = "res.partner" + + edi_stock_picking_conf_ids = fields.Many2many( + string="EDI stock configuration", + comodel_name="edi.configuration", + relation="res_partner_edi_stock_picking_configuration_rel", + column1="partner_id", + column2="conf_id", + domain=[("model_name", "=", "stock.picking")], + ) diff --git a/edi_stock_oca/models/stock_picking.py b/edi_stock_oca/models/stock_picking.py new file mode 100644 index 000000000..b6736baba --- /dev/null +++ b/edi_stock_oca/models/stock_picking.py @@ -0,0 +1,42 @@ +# Copyright 2022 Creu Blanca +# Copyright 2025 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from contextlib import contextmanager + +from odoo import models + + +class StockPicking(models.Model): + _name = "stock.picking" + _inherit = ["stock.picking", "edi.exchange.consumer.mixin"] + + # Override all methods to trigger EDI exchange after picking state changes. + # ``stock.picking.state`` is computed so we cannot rely + # on the write as done by the consumer mixin.` + def action_confirm(self): + with self._edi_exchange_event_trigger(): + result = super().action_confirm() + return result + + def _action_done(self): + with self._edi_exchange_event_trigger(): + result = super()._action_done() + return result + + def action_cancel(self): + with self._edi_exchange_event_trigger(): + result = super().action_cancel() + return result + + @contextmanager + def _edi_exchange_event_trigger(self): + for picking in self: + picking._event("on_edi_stock_picking_before_state_change").notify( + picking, state=picking.state + ) + yield + for picking in self: + picking._event("on_edi_stock_picking_state_change").notify( + picking, state=picking.state + ) diff --git a/edi_stock_oca/pyproject.toml b/edi_stock_oca/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/edi_stock_oca/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/edi_stock_oca/readme/CONTRIBUTORS.md b/edi_stock_oca/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..c04d1b98b --- /dev/null +++ b/edi_stock_oca/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- Alba Riera \ +- Alex Paris \ +- Simone Orsi \ diff --git a/edi_stock_oca/readme/DESCRIPTION.md b/edi_stock_oca/readme/DESCRIPTION.md new file mode 100644 index 000000000..e8a73b091 --- /dev/null +++ b/edi_stock_oca/readme/DESCRIPTION.md @@ -0,0 +1,15 @@ +This module intends to create a base to be extended by local edi rules +for stock. + +In order to add a new integration for an stock picking, you need to +create a listener: + +``` python +class MyEventListener(Component): + _name = "stock.picking.event.listener.demo" + _inherit = "base.event.listener" + _apply_on = ["stock.picking"] + + def on_validate(self, picking): + """Add your code here about creation of record""" +``` diff --git a/edi_stock_oca/static/description/icon.png b/edi_stock_oca/static/description/icon.png new file mode 100644 index 000000000..3a0328b51 Binary files /dev/null and b/edi_stock_oca/static/description/icon.png differ diff --git a/edi_stock_oca/static/description/index.html b/edi_stock_oca/static/description/index.html new file mode 100644 index 000000000..e1fe22923 --- /dev/null +++ b/edi_stock_oca/static/description/index.html @@ -0,0 +1,443 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

EDI Stock OCA

+ +

Beta License: AGPL-3 OCA/edi-framework Translate me on Weblate Try me on Runboat

+

This module intends to create a base to be extended by local edi rules +for stock.

+

In order to add a new integration for an stock picking, you need to +create a listener:

+
+class MyEventListener(Component):
+    _name = "stock.picking.event.listener.demo"
+    _inherit = "base.event.listener"
+    _apply_on = ["stock.picking"]
+
+    def on_validate(self, picking):
+        """Add your code here about creation of record"""
+
+

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

+
    +
  • Creu Blanca
  • +
+
+ +
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/edi-framework project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+
+ + diff --git a/edi_stock_oca/tests/__init__.py b/edi_stock_oca/tests/__init__.py new file mode 100644 index 000000000..25aeb70b8 --- /dev/null +++ b/edi_stock_oca/tests/__init__.py @@ -0,0 +1 @@ +from . import test_edi diff --git a/edi_stock_oca/tests/test_edi.py b/edi_stock_oca/tests/test_edi.py new file mode 100644 index 000000000..0462fd6ca --- /dev/null +++ b/edi_stock_oca/tests/test_edi.py @@ -0,0 +1,124 @@ +# Copyright 2022 Creu Blanca +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +from unittest import mock + +from odoo.addons.edi_component_oca.tests.common import EDIBackendCommonComponentTestCase + + +class TestProcessComponent(EDIBackendCommonComponentTestCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.exc_type_out = cls._create_exchange_type( + name="TRANSFER DEMO", + code="demo_Transfer_out", + direction="output", + exchange_file_ext="xml", + exchange_filename_pattern="{record_name}-{type.code}-{dt}", + ) + cls.edi_conf = cls.env["edi.configuration"].create( + { + "name": "Demo Transfer - Done", + "description": "Show case state change to done", + "backend_id": cls.backend.id, + "type_id": cls.exc_type_out.id, + "trigger_id": cls.env.ref( + "edi_stock_oca.edi_conf_trigger_stock_picking_state_change" + ).id, + "model_id": cls.env["ir.model"]._get_id("stock.picking"), + "snippet_do": """ +# ('draft', 'Draft'), +# ('waiting', 'Waiting Another Operation'), +# ('confirmed', 'Waiting'), +# ('assigned', 'Ready'), +# ('done', 'Done'), +# ('cancel', 'Cancelled'), +if record.state in ('done', 'cancel', 'confirmed', 'assigned'): + record._edi_send_via_edi(conf.type_id) + """, + } + ) + cls.partner.edi_stock_picking_conf_ids = cls.edi_conf + cls.warehouse = cls.env["stock.warehouse"].search([], limit=1) + cls.stock_location = cls.warehouse.lot_stock_id + cls.supplier_location = cls.env.ref("stock.stock_location_suppliers") + cls.picking_type = cls.env["stock.picking.type"].create( + { + "name": "Test Picking Type", + "sequence_code": "TPT", + "code": "internal", + "default_location_src_id": cls.supplier_location.id, + "default_location_dest_id": cls.stock_location.id, + } + ) + cls.product = cls.env["product.product"].create( + { + "name": "Product 1", + "default_code": "1234567", + } + ) + + def _create_picking(self): + picking = self.env["stock.picking"].create( + { + "partner_id": self.partner.id, + "picking_type_id": self.picking_type.id, + "location_id": self.supplier_location.id, + "location_dest_id": self.stock_location.id, + } + ) + move_a = self.env["stock.move"].create( + { + "product_id": self.product.id, + "product_uom_qty": 1, + "product_uom": self.product.uom_id.id, + "picking_id": picking.id, + "location_id": self.supplier_location.id, + "location_dest_id": self.stock_location.id, + } + ) + move_a.move_line_ids.quantity = 4 + return picking + + def _mock_generate(self, exc_rec): + return f"TRANSFER STATE {exc_rec.record.state}" + + @mock.patch("odoo.addons.edi_core_oca.models.edi_backend.EDIBackend._validate_data") + @mock.patch( + "odoo.addons.edi_core_oca.models.edi_backend.EDIBackend._exchange_generate" + ) + @mock.patch("odoo.addons.edi_core_oca.models.edi_backend.EDIBackend._exchange_send") + def test_picking_cancel_flow(self, mock_send, mock_generate, mock_validate): + mock_generate.side_effect = self._mock_generate + picking = self._create_picking() + self.assertFalse(picking.exchange_record_ids) + picking.action_confirm() + self.assertEqual(len(picking.exchange_record_ids), 1) + record1 = picking.exchange_record_ids + self.assertEqual(record1.type_id, self.exc_type_out) + self.assertEqual(record1._get_file_content(), "TRANSFER STATE assigned") + picking.action_cancel() + self.assertEqual(len(picking.exchange_record_ids), 2) + record2 = picking.exchange_record_ids - record1 + self.assertEqual(record2.type_id, self.exc_type_out) + self.assertEqual(record2._get_file_content(), "TRANSFER STATE cancel") + + @mock.patch("odoo.addons.edi_core_oca.models.edi_backend.EDIBackend._validate_data") + @mock.patch( + "odoo.addons.edi_core_oca.models.edi_backend.EDIBackend._exchange_generate" + ) + @mock.patch("odoo.addons.edi_core_oca.models.edi_backend.EDIBackend._exchange_send") + def test_picking_done_flow(self, mock_send, mock_generate, mock_validate): + mock_generate.side_effect = self._mock_generate + picking = self._create_picking() + self.assertFalse(picking.exchange_record_ids) + picking.action_confirm() + self.assertEqual(len(picking.exchange_record_ids), 1) + record1 = picking.exchange_record_ids + self.assertEqual(record1.type_id, self.exc_type_out) + self.assertEqual(record1._get_file_content(), "TRANSFER STATE assigned") + picking.button_validate() + self.assertEqual(len(picking.exchange_record_ids), 2) + record2 = picking.exchange_record_ids - record1 + self.assertEqual(record2.type_id, self.exc_type_out) + self.assertEqual(record2._get_file_content(), "TRANSFER STATE done") diff --git a/edi_stock_oca/views/res_partner.xml b/edi_stock_oca/views/res_partner.xml new file mode 100644 index 000000000..d80a693c9 --- /dev/null +++ b/edi_stock_oca/views/res_partner.xml @@ -0,0 +1,24 @@ + + + + + res.partner.view.form + res.partner + + + + + + + + + + + + + + + + + diff --git a/edi_stock_oca/views/stock_picking.xml b/edi_stock_oca/views/stock_picking.xml new file mode 100644 index 000000000..43b87ca33 --- /dev/null +++ b/edi_stock_oca/views/stock_picking.xml @@ -0,0 +1,38 @@ + + + + + stock.picking.form (in edi_stock_oca) + stock.picking + + + + + + + + + + + + + + + + + + +