Skip to content

Commit 1ac5d62

Browse files
committed
edi_purchase: use edi.configuration
1 parent 04ee2ba commit 1ac5d62

16 files changed

+218
-7
lines changed

edi_purchase_oca/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
from . import models
2+
from . import components

edi_purchase_oca/__manifest__.py

+12-3
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,18 @@
77
Define EDI Configuration for Purchase Orders""",
88
"version": "14.0.1.0.0",
99
"license": "LGPL-3",
10-
"author": "ForgeFlow, Odoo Community Association (OCA)",
10+
"author": "ForgeFlow, Camptocamp, Odoo Community Association (OCA)",
1111
"website": "https://github.com/OCA/edi",
1212
"depends": ["purchase", "edi_oca", "component_event"],
13-
"data": ["views/purchase_order_views.xml", "views/edi_exchange_record_views.xml"],
14-
"demo": [],
13+
"data": [
14+
"views/purchase_order_views.xml",
15+
"views/edi_exchange_record_views.xml",
16+
"views/res_partner_view.xml",
17+
"data/edi_configuration.xml",
18+
],
19+
"demo": [
20+
"demo/edi_backend.xml",
21+
"demo/edi_exchange_type.xml",
22+
"demo/edi_configuration.xml",
23+
],
1524
}
+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import listeners
+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Copyright 2024 Camptocamp SA
2+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
3+
4+
from odoo.addons.component.core import Component
5+
6+
7+
class EDIConfigPOListener(Component):
8+
_name = "edi.listener.config.purchase.order"
9+
_inherit = "base.event.listener"
10+
_apply_on = ["purchase.order"]
11+
12+
def on_record_create(self, record, fields=None):
13+
trigger = "on_record_create"
14+
return self._exec_conf(record, trigger)
15+
16+
def on_record_write(self, record, fields=None):
17+
trigger = "on_record_write"
18+
return self._exec_conf(record, trigger)
19+
20+
def on_edi_purchase_order_state_change(self, record, state=None):
21+
trigger = "on_edi_purchase_order_state_change"
22+
return self._exec_conf(record, trigger)
23+
24+
def _exec_conf(self, record, trigger, conf_field="edi_purchase_conf_ids"):
25+
confs = record.partner_id[conf_field].edi_get_conf(trigger)
26+
for conf in confs:
27+
conf.edi_exec_snippet_do(record)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<odoo>
3+
<!-- Generic state change -->
4+
<record
5+
id="edi_conf_trigger_purchase_order_state_change"
6+
model="edi.configuration.trigger"
7+
>
8+
<field name="name">On PO state change</field>
9+
<field name="code">on_edi_purchase_order_state_change</field>
10+
<field name="description">Trigger when a purchase order state changes</field>
11+
<field name="model_id" ref="purchase.model_purchase_order" />
12+
</record>
13+
</odoo>

edi_purchase_oca/demo/edi_backend.xml

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<odoo>
3+
<record id="demo_edi_backend_type_purchase" model="edi.backend.type">
4+
<field name="name">Purchase DEMO</field>
5+
<field name="code">purchase_demo</field>
6+
</record>
7+
<record id="demo_edi_backend" model="edi.backend">
8+
<field name="name">purchase DEMO</field>
9+
<field name="backend_type_id" ref="demo_edi_backend_type_purchase" />
10+
</record>
11+
</odoo>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
<odoo>
3+
<record id="demo_edi_configuration_confirmed" model="edi.configuration">
4+
<field name="name">Demo PO send</field>
5+
<field
6+
name="description"
7+
>Show case how you can send out an order automatically</field>
8+
<field name="type_id" ref="demo_edi_exc_type_order_out" />
9+
<field name="backend_id" ref="demo_edi_backend" />
10+
<field name="model_id" ref="purchase.model_purchase_order" />
11+
<field name="trigger_id" ref="edi_conf_trigger_purchase_order_state_change" />
12+
<field name="snippet_do">
13+
# ('draft', 'RFQ'),
14+
# ('sent', 'RFQ Sent'),
15+
# ('to approve', 'To Approve'),
16+
# ('purchase', 'Purchase Order'),
17+
# ('done', 'Locked'),
18+
# ('cancel', 'Cancelled')
19+
if record.state == 'purchase':
20+
record._edi_send_via_edi(conf.type_id)
21+
</field>
22+
</record>
23+
</odoo>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
<odoo>
3+
4+
<record id="demo_edi_exc_type_order_out" model="edi.exchange.type">
5+
<field name="backend_type_id" ref="demo_edi_backend_type_purchase" />
6+
<field name="backend_id" ref="demo_edi_backend" />
7+
<field name="name">Demo Purchase Order out</field>
8+
<field name="code">demo_PurchaseOrder_out</field>
9+
<field name="direction">output</field>
10+
<field name="exchange_filename_pattern">{record_name}-{type.code}-{dt}</field>
11+
<field name="exchange_file_ext">xml</field>
12+
</record>
13+
14+
</odoo>

edi_purchase_oca/models/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
from . import purchase_order
2+
from . import res_partner

edi_purchase_oca/models/purchase_order.py

+11-4
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,23 @@
66

77
class PurchaseOrder(models.Model):
88
_name = "purchase.order"
9-
_inherit = ["purchase.order", "edi.exchange.consumer.mixin"]
9+
_inherit = [
10+
"purchase.order",
11+
"edi.exchange.consumer.mixin",
12+
]
1013

1114
def button_confirm(self):
12-
result = super().button_confirm()
13-
if self:
15+
res = super().button_confirm()
16+
# DEPRECATED: rely on `on_edi_purchase_order_state_change`
17+
# provided automatically by edi.consumer.mixin
18+
if self: # TODO: is this check necessary?
1419
self._event("on_button_confirm_purchase_order").notify(self)
15-
return result
20+
return res
1621

1722
def button_cancel(self):
1823
result = super().button_cancel()
24+
# DEPRECATED: rely on `on_edi_purchase_order_state_change`
25+
# provided automatically by edi.consumer.mixin
1926
if self:
2027
self._event("on_button_cancel_purchase_order").notify(self)
2128
return result
+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Copyright 2024 Camptocamp SA
2+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
3+
4+
5+
from odoo import fields, models
6+
7+
8+
class ResPartner(models.Model):
9+
_inherit = "res.partner"
10+
11+
edi_purchase_conf_ids = fields.Many2many(
12+
string="EDI purchase configuration",
13+
comodel_name="edi.configuration",
14+
relation="res_partner_edi_purchase_configuration_rel",
15+
column1="partner_id",
16+
column2="conf_id",
17+
domain=[("model_name", "=", "purchase.order")],
18+
)
+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
* Lois Rilo <lois.rilo@forgeflow.com>
2+
* Simone Orsi <simone.orsi@camptocamp.com>

edi_purchase_oca/readme/DESCRIPTION.rst

+9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
11
This module intends to create a base to be extended by local edi rules
22
for purchase.
33

4+
5+
Configuration
6+
~~~~~~~~~~~~~
7+
8+
TODO
9+
10+
Deprecated mode
11+
~~~~~~~~~~~~~~~
12+
413
In order to add a new integration, you need to create a listener:
514

615
.. code-block:: python

edi_purchase_oca/tests/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import test_edi_conf
+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# Copyright 2024 CamptoCamp SA
2+
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
3+
4+
from unittest import mock
5+
6+
from odoo.addons.edi_oca.tests.common import EDIBackendCommonComponentTestCase
7+
8+
9+
class TestsPurchaseEDIConfiguration(EDIBackendCommonComponentTestCase):
10+
@classmethod
11+
def setUpClass(cls):
12+
super().setUpClass()
13+
cls.purchase_order = cls.env["purchase.order"]
14+
cls.product = cls.env["product.product"].create(
15+
{
16+
"name": "Product 1",
17+
"default_code": "1234567",
18+
}
19+
)
20+
cls.exc_type_out = cls.env.ref("edi_purchase_oca.demo_edi_exc_type_order_out")
21+
cls.edi_conf = cls.env.ref("edi_purchase_oca.demo_edi_configuration_confirmed")
22+
cls.partner.edi_purchase_conf_ids = cls.edi_conf
23+
24+
@mock.patch("odoo.addons.edi_oca.models.edi_backend.EDIBackend._validate_data")
25+
@mock.patch("odoo.addons.edi_oca.models.edi_backend.EDIBackend._exchange_generate")
26+
@mock.patch("odoo.addons.edi_oca.models.edi_backend.EDIBackend._exchange_send")
27+
def test_order_confirm(self, mock_send, mock_generate, mock_validate):
28+
mock_generate.return_value = "TEST PO OUT"
29+
order = self.purchase_order.create(
30+
{
31+
"partner_id": self.partner.id,
32+
"order_line": [
33+
(
34+
0,
35+
0,
36+
{
37+
"product_id": self.product.id,
38+
"product_qty": 10,
39+
"price_unit": 100.0,
40+
},
41+
)
42+
],
43+
}
44+
)
45+
self.assertEqual(order.state, "draft")
46+
self.assertEqual(len(order.exchange_record_ids), 0)
47+
order.button_confirm()
48+
self.assertEqual(order.state, "purchase")
49+
self.assertEqual(len(order.exchange_record_ids), 1)
50+
self.assertEqual(order.exchange_record_ids[0].type_id, self.exc_type_out)
51+
self.assertEqual(
52+
order.exchange_record_ids[0]._get_file_content(), "TEST PO OUT"
53+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<odoo>
3+
<record id="view_partner_form" model="ir.ui.view">
4+
<field name="name">res.partner.edi.purchase</field>
5+
<field name="model">res.partner</field>
6+
<field name="inherit_id" ref="edi_oca.view_partner_form" />
7+
<field name="arch" type="xml">
8+
<group name="edi_main" position="inside">
9+
<group name="purchase" string="Purchase">
10+
<field name="edi_purchase_conf_ids" nolabel="1">
11+
<tree>
12+
<field name="name" />
13+
<field name="trigger_id" />
14+
<field name="type_id" />
15+
<field name="model_id" />
16+
</tree>
17+
</field>
18+
</group>
19+
</group>
20+
</field>
21+
</record>
22+
</odoo>

0 commit comments

Comments
 (0)