diff --git a/README.md b/README.md index 864ed7cfc..3694fd50b 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ addon | version | maintainers | summary [edi_account_core_oca](edi_account_core_oca/) | 18.0.1.1.1 | etobella | Define EDI Configuration for Account Moves [edi_account_oca](edi_account_oca/) | 18.0.1.1.1 | etobella | Define some component listeners for Account Moves [edi_component_oca](edi_component_oca/) | 18.0.1.1.0 | simahawk etobella | Allow to use Connector as a source in EDI -[edi_core_oca](edi_core_oca/) | 18.0.1.7.1 | simahawk etobella | Define backends, exchange types, exchange records, basic automation and views for handling EDI exchanges. +[edi_core_oca](edi_core_oca/) | 18.0.1.7.2 | simahawk etobella | Define backends, exchange types, exchange records, basic automation and views for handling EDI exchanges. [edi_endpoint_oca](edi_endpoint_oca/) | 18.0.1.0.3 | | Base module allowing configuration of custom endpoints for EDI framework. [edi_exchange_template_oca](edi_exchange_template_oca/) | 18.0.1.3.3 | simahawk | Allows definition of exchanges via templates. [edi_exchange_template_party_data](edi_exchange_template_party_data/) | 18.0.1.0.1 | simahawk | Glue module between edi_exchange_template and edi_party_data diff --git a/edi_core_oca/README.rst b/edi_core_oca/README.rst index 67548dee5..a73b1e222 100644 --- a/edi_core_oca/README.rst +++ b/edi_core_oca/README.rst @@ -11,7 +11,7 @@ EDI !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:aa0c40a082ced3e5e5d376f0eaf4c3a4487421a5abc4c22a81665a279bddaad1 + !! source digest: sha256:5e54bc58f7c88ff2eaac2207226e25488a4aa47b800e1cdc606f485cf0523830 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/edi_core_oca/__manifest__.py b/edi_core_oca/__manifest__.py index 2ddb96481..31955b191 100644 --- a/edi_core_oca/__manifest__.py +++ b/edi_core_oca/__manifest__.py @@ -9,7 +9,7 @@ Define backends, exchange types, exchange records, basic automation and views for handling EDI exchanges. """, - "version": "18.0.1.7.1", + "version": "18.0.1.7.2", "website": "https://github.com/OCA/edi-framework", "development_status": "Beta", "license": "LGPL-3", diff --git a/edi_core_oca/i18n/edi_core_oca.pot b/edi_core_oca/i18n/edi_core_oca.pot index 35b6d0b94..e0b78270b 100644 --- a/edi_core_oca/i18n/edi_core_oca.pot +++ b/edi_core_oca/i18n/edi_core_oca.pot @@ -89,6 +89,11 @@ msgid "" "* Custom: let devs handle a custom behavior with specific developments\n" msgstr "" +#. module: edi_core_oca +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_type__exchange_record_count +msgid "# Exchange Records" +msgstr "" + #. module: edi_core_oca #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_consumer_mixin_buttons msgid " EDI actions" @@ -766,6 +771,7 @@ msgstr "" #. module: edi_core_oca #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_consumer_mixin__exchange_record_ids #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_related_record__exchange_record_id +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_type__exchange_record_ids msgid "Exchange Record" msgstr "" @@ -908,6 +914,7 @@ msgstr "" #: model:ir.actions.act_window,name:edi_core_oca.act_open_edi_exchange_record_view #: model:ir.ui.menu,name:edi_core_oca.menu_edi_exchange_record_root #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_backend_view_form +#: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_view_form msgid "Exchanges" msgstr "" diff --git a/edi_core_oca/i18n/es.po b/edi_core_oca/i18n/es.po index ae4534243..f187c3b4a 100644 --- a/edi_core_oca/i18n/es.po +++ b/edi_core_oca/i18n/es.po @@ -93,6 +93,11 @@ msgid "" "* Custom: let devs handle a custom behavior with specific developments\n" msgstr "" +#. module: edi_core_oca +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_type__exchange_record_count +msgid "# Exchange Records" +msgstr "" + #. module: edi_core_oca #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_consumer_mixin_buttons msgid " EDI actions" @@ -770,6 +775,7 @@ msgstr "" #. module: edi_core_oca #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_consumer_mixin__exchange_record_ids #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_related_record__exchange_record_id +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_type__exchange_record_ids msgid "Exchange Record" msgstr "" @@ -912,6 +918,7 @@ msgstr "" #: model:ir.actions.act_window,name:edi_core_oca.act_open_edi_exchange_record_view #: model:ir.ui.menu,name:edi_core_oca.menu_edi_exchange_record_root #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_backend_view_form +#: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_view_form msgid "Exchanges" msgstr "" diff --git a/edi_core_oca/i18n/fr.po b/edi_core_oca/i18n/fr.po index b09c20623..3cae61d56 100644 --- a/edi_core_oca/i18n/fr.po +++ b/edi_core_oca/i18n/fr.po @@ -95,6 +95,11 @@ msgid "" "* Custom: let devs handle a custom behavior with specific developments\n" msgstr "" +#. module: edi_core_oca +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_type__exchange_record_count +msgid "# Exchange Records" +msgstr "" + #. module: edi_core_oca #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_consumer_mixin_buttons msgid " EDI actions" @@ -780,6 +785,7 @@ msgstr "" #. module: edi_core_oca #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_consumer_mixin__exchange_record_ids #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_related_record__exchange_record_id +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_type__exchange_record_ids msgid "Exchange Record" msgstr "" @@ -923,6 +929,7 @@ msgstr "" #: model:ir.actions.act_window,name:edi_core_oca.act_open_edi_exchange_record_view #: model:ir.ui.menu,name:edi_core_oca.menu_edi_exchange_record_root #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_backend_view_form +#: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_view_form msgid "Exchanges" msgstr "" diff --git a/edi_core_oca/i18n/it.po b/edi_core_oca/i18n/it.po index 3147d8f34..bb9fcf0e8 100644 --- a/edi_core_oca/i18n/it.po +++ b/edi_core_oca/i18n/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 17.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-05-25 19:57+0000\n" +"PO-Revision-Date: 2026-05-29 13:46+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -154,6 +154,11 @@ msgstr "" "* Personalizzato: consente agli sviluppatori di gestire un comportamento " "personalizzato con sviluppo personalizzato\n" +#. module: edi_core_oca +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_type__exchange_record_count +msgid "# Exchange Records" +msgstr "N° record scambio" + #. module: edi_core_oca #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_consumer_mixin_buttons msgid " EDI actions" @@ -846,6 +851,7 @@ msgstr "Sequenza nome file scambio" #. module: edi_core_oca #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_consumer_mixin__exchange_record_ids #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_related_record__exchange_record_id +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_type__exchange_record_ids msgid "Exchange Record" msgstr "Record di scambio" @@ -990,6 +996,7 @@ msgstr "Scambiato oggi" #: model:ir.actions.act_window,name:edi_core_oca.act_open_edi_exchange_record_view #: model:ir.ui.menu,name:edi_core_oca.menu_edi_exchange_record_root #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_backend_view_form +#: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_view_form msgid "Exchanges" msgstr "Scambi" diff --git a/edi_core_oca/models/edi_exchange_type.py b/edi_core_oca/models/edi_exchange_type.py index 5850cf356..3346e487f 100644 --- a/edi_core_oca/models/edi_exchange_type.py +++ b/edi_core_oca/models/edi_exchange_type.py @@ -147,6 +147,14 @@ class EDIExchangeType(models.Model): """, ) advanced_settings = Serialized(default={}, compute="_compute_advanced_settings") + exchange_record_ids = fields.One2many( + comodel_name="edi.exchange.record", + inverse_name="type_id", + ) + exchange_record_count = fields.Integer( + string="# Exchange Records", + compute="_compute_exchange_record_count", + ) rule_ids = fields.One2many( comodel_name="edi.exchange.type.rule", inverse_name="type_id", @@ -240,6 +248,17 @@ def _compute_ack_for_type_ids(self): for rec in self: rec.ack_for_type_ids = [x.id for x in by_type_id.get(rec.id, [])] + @api.depends("exchange_record_ids") + def _compute_exchange_record_count(self): + data = self.env["edi.exchange.record"]._read_group( + [("type_id", "in", self.ids)], + groupby=["type_id"], + aggregates=["__count"], + ) + mapped_data = {type_.id: count for type_, count in data} + for rec in self: + rec.exchange_record_count = mapped_data.get(rec.id, 0) + def get_settings(self): return self.advanced_settings @@ -331,3 +350,16 @@ def copy_data(self, default=None): default = dict(default or {}) default.setdefault("code", f"{self.code}/COPY_FIXME") return super().copy_data(default=default) + + def action_view_exchange_records(self): + self.ensure_one() + action = self.env["ir.actions.act_window"]._for_xml_id( + "edi_core_oca.act_open_edi_exchange_record_view" + ) + action["domain"] = [("type_id", "=", self.id)] + action["context"] = { + "default_type_id": self.id, + "default_backend_id": self.backend_id.id, + "search_default_type_id": self.id, + } + return action diff --git a/edi_core_oca/static/description/index.html b/edi_core_oca/static/description/index.html index 295dbf5ea..7c70c56f1 100644 --- a/edi_core_oca/static/description/index.html +++ b/edi_core_oca/static/description/index.html @@ -372,7 +372,7 @@

EDI

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:aa0c40a082ced3e5e5d376f0eaf4c3a4487421a5abc4c22a81665a279bddaad1 +!! source digest: sha256:5e54bc58f7c88ff2eaac2207226e25488a4aa47b800e1cdc606f485cf0523830 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

Base EDI backend.

diff --git a/edi_core_oca/tests/test_exchange_type.py b/edi_core_oca/tests/test_exchange_type.py index 6edfd79c6..5d3ae33bb 100644 --- a/edi_core_oca/tests/test_exchange_type.py +++ b/edi_core_oca/tests/test_exchange_type.py @@ -167,3 +167,40 @@ def test_archive_rules(self): rule2.invalidate_recordset() self.assertFalse(rule1.active) self.assertFalse(rule2.active) + + def _create_exchange_record(self, exc_type): + return self.backend.create_record( + exc_type.code, + {"model": self.partner._name, "res_id": self.partner.id}, + ) + + def test_exchange_record_count(self): + exc_type = self.exchange_type_out + self.assertEqual(exc_type.exchange_record_count, 0) + rec1 = self._create_exchange_record(exc_type) + rec2 = self._create_exchange_record(exc_type) + # Record on a different type must not be counted + self._create_exchange_record(self.exchange_type_in) + self.assertEqual(exc_type.exchange_record_count, 2) + self.assertEqual(set(exc_type.exchange_record_ids.ids), {rec1.id, rec2.id}) + + def test_action_view_exchange_records(self): + exc_type = self.exchange_type_out + rec = self._create_exchange_record(exc_type) + action = exc_type.action_view_exchange_records() + self.assertEqual(action["type"], "ir.actions.act_window") + self.assertEqual(action["res_model"], "edi.exchange.record") + self.assertIn(("type_id", "=", exc_type.id), action["domain"]) + ctx = action["context"] + self.assertEqual(ctx.get("default_type_id"), exc_type.id) + self.assertEqual(ctx.get("default_backend_id"), exc_type.backend_id.id) + self.assertEqual(ctx.get("search_default_type_id"), exc_type.id) + # The action's domain must actually match the created exchange record + records = self.env[action["res_model"]].search(action["domain"]) + self.assertIn(rec, records) + + def test_action_view_exchange_records_requires_singleton(self): + with self.assertRaises(ValueError): + ( + self.exchange_type_out | self.exchange_type_in + ).action_view_exchange_records() diff --git a/edi_core_oca/views/edi_exchange_type_views.xml b/edi_core_oca/views/edi_exchange_type_views.xml index 244019da9..cddc4a36b 100644 --- a/edi_core_oca/views/edi_exchange_type_views.xml +++ b/edi_core_oca/views/edi_exchange_type_views.xml @@ -26,6 +26,20 @@ bg_color="bg-danger" invisible="active" /> +
+ +