[MIG] account_chorus_notify: migrate to 18.0
This commit is contained in:
32
account_chorus_notify/README.md
Normal file
32
account_chorus_notify/README.md
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# account_chorus_notify
|
||||||
|
|
||||||
|
Posts a notification on supplier invoices when their Chorus flow is rejected.
|
||||||
|
|
||||||
|
Override of `chorus.flow.update_flow_status()`: when a flow status becomes `IN_REJETE`, a message is posted on each related invoice (`invoice_ids`) with the flow reference.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Make sure `l10n_fr_chorus_account` is available, then use the standard Odoo module installation procedure to install `account_chorus_notify`.
|
||||||
|
|
||||||
|
## Known issues / Roadmap
|
||||||
|
|
||||||
|
None yet.
|
||||||
|
|
||||||
|
## Bug Tracker
|
||||||
|
|
||||||
|
Bugs are tracked on [our issues website](https://github.com/elabore-coop/account-tools/issues). In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed feedback.
|
||||||
|
|
||||||
|
## Credits
|
||||||
|
|
||||||
|
### Contributors
|
||||||
|
|
||||||
|
* Stéphan Sainléger - [Github](https://github.com/stephansainleger)
|
||||||
|
|
||||||
|
### Funders
|
||||||
|
|
||||||
|
The development of this module has been financially supported by:
|
||||||
|
* [Elabore](https://elabore.coop)
|
||||||
|
|
||||||
|
### Maintainer
|
||||||
|
|
||||||
|
This module is maintained by Elabore.
|
||||||
2
account_chorus_notify/__init__.py
Normal file
2
account_chorus_notify/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
|
||||||
|
from . import models
|
||||||
75
account_chorus_notify/__manifest__.py
Normal file
75
account_chorus_notify/__manifest__.py
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
# Copyright 2021 Elabore ()
|
||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "account_chorus_notify",
|
||||||
|
"version": "18.0.1.0.0",
|
||||||
|
"author": "Elabore",
|
||||||
|
"maintainer": "False",
|
||||||
|
"website": "False",
|
||||||
|
"license": "AGPL-3",
|
||||||
|
"category": "False",
|
||||||
|
"summary": "Send notification when chorus invoice failed",
|
||||||
|
"description": """
|
||||||
|
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
|
||||||
|
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
|
||||||
|
:alt: License: AGPL-3
|
||||||
|
=======================
|
||||||
|
Account Chorus Notify
|
||||||
|
=======================
|
||||||
|
Send notification when chorus invoice failed
|
||||||
|
|
||||||
|
Installation
|
||||||
|
============
|
||||||
|
Just install account_chorus_notify, all dependencies will be installed by default.
|
||||||
|
|
||||||
|
Known issues / Roadmap
|
||||||
|
======================
|
||||||
|
|
||||||
|
Bug Tracker
|
||||||
|
===========
|
||||||
|
Bugs are tracked on `GitHub Issues
|
||||||
|
<https://github.com/elabore-coop/elabore-odoo-addons/issues>`_. In case of trouble, please
|
||||||
|
check there if your issue has already been reported. If you spotted it first,
|
||||||
|
help us smashing it by providing a detailed and welcomed feedback.
|
||||||
|
|
||||||
|
Credits
|
||||||
|
=======
|
||||||
|
|
||||||
|
Images
|
||||||
|
------
|
||||||
|
* Elabore: `Icon <https://elabore.coop/web/image/res.company/1/logo?unique=f3db262>`_.
|
||||||
|
|
||||||
|
|
||||||
|
Funders
|
||||||
|
-------
|
||||||
|
The development of this module has been financially supported by:
|
||||||
|
* Elabore (https://elabore.coop)
|
||||||
|
|
||||||
|
Maintainer
|
||||||
|
----------
|
||||||
|
This module is maintained by ELABORE.
|
||||||
|
|
||||||
|
""",
|
||||||
|
# any module necessary for this one to work correctly
|
||||||
|
"depends": [
|
||||||
|
"l10n_fr_chorus_account",
|
||||||
|
],
|
||||||
|
"external_dependencies": {
|
||||||
|
"python": [],
|
||||||
|
},
|
||||||
|
# always loaded
|
||||||
|
"data": [
|
||||||
|
|
||||||
|
],
|
||||||
|
# only loaded in demonstration mode
|
||||||
|
"demo": [],
|
||||||
|
"js": [],
|
||||||
|
"css": [],
|
||||||
|
"qweb": [],
|
||||||
|
"installable": True,
|
||||||
|
# Install this module automatically if all dependency have been previously
|
||||||
|
# and independently installed. Used for synergetic or glue modules.
|
||||||
|
"auto_install": False,
|
||||||
|
"application": False,
|
||||||
|
}
|
||||||
2
account_chorus_notify/models/__init__.py
Normal file
2
account_chorus_notify/models/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
|
||||||
|
from . import chorus_flow
|
||||||
14
account_chorus_notify/models/chorus_flow.py
Normal file
14
account_chorus_notify/models/chorus_flow.py
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
from odoo import models, fields, api, _
|
||||||
|
|
||||||
|
|
||||||
|
class ChorusFlow(models.Model):
|
||||||
|
_inherit = "chorus.flow"
|
||||||
|
|
||||||
|
def update_flow_status(self):
|
||||||
|
res = super(ChorusFlow, self).update_flow_status()
|
||||||
|
for flow in self:
|
||||||
|
if flow.status == 'IN_REJETE':
|
||||||
|
for invoice in flow.invoice_ids:
|
||||||
|
invoice.message_post(body=_("Chorus flow n°%s rejected.")%(flow.name,))
|
||||||
|
return res
|
||||||
1
account_chorus_notify/tests/__init__.py
Normal file
1
account_chorus_notify/tests/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from . import test_chorus_notify
|
||||||
100
account_chorus_notify/tests/test_chorus_notify.py
Normal file
100
account_chorus_notify/tests/test_chorus_notify.py
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from odoo import Command, fields
|
||||||
|
from odoo.tests.common import TransactionCase
|
||||||
|
|
||||||
|
|
||||||
|
class TestChorusNotify(TransactionCase):
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
super().setUpClass()
|
||||||
|
cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True))
|
||||||
|
cls.company = cls.env.ref('base.main_company')
|
||||||
|
cls.partner = cls.env['res.partner'].create({
|
||||||
|
'name': 'Test Vendor',
|
||||||
|
'company_id': cls.company.id,
|
||||||
|
})
|
||||||
|
|
||||||
|
cls.expense_account = cls.env['account.account'].create({
|
||||||
|
'code': '6TEST001',
|
||||||
|
'name': 'Test Expense',
|
||||||
|
'account_type': 'expense',
|
||||||
|
})
|
||||||
|
|
||||||
|
cls.journal = cls.env['account.journal'].create({
|
||||||
|
'name': 'Test Purchase',
|
||||||
|
'type': 'purchase',
|
||||||
|
'code': 'PURCH',
|
||||||
|
})
|
||||||
|
|
||||||
|
cls.flow = cls.env['chorus.flow'].create({
|
||||||
|
'name': 'TEST-FLOW-001',
|
||||||
|
'date': fields.Date.today(),
|
||||||
|
'company_id': cls.company.id,
|
||||||
|
})
|
||||||
|
|
||||||
|
cls.invoice = cls.env['account.move'].create({
|
||||||
|
'move_type': 'in_invoice',
|
||||||
|
'journal_id': cls.journal.id,
|
||||||
|
'partner_id': cls.partner.id,
|
||||||
|
'invoice_date': fields.Date.today(),
|
||||||
|
'chorus_flow_id': cls.flow.id,
|
||||||
|
'invoice_line_ids': [Command.create({
|
||||||
|
'name': 'Test line',
|
||||||
|
'price_unit': 100,
|
||||||
|
'quantity': 1,
|
||||||
|
'account_id': cls.expense_account.id,
|
||||||
|
})],
|
||||||
|
})
|
||||||
|
|
||||||
|
def _patch_chorus_api(self, status):
|
||||||
|
self.patch(
|
||||||
|
type(self.env['res.company']),
|
||||||
|
'_chorus_get_api_params',
|
||||||
|
lambda self, raise_if_ko=True: {'dummy': True},
|
||||||
|
)
|
||||||
|
self.patch(
|
||||||
|
type(self.env['chorus.flow']),
|
||||||
|
'_chorus_api_consulter_cr',
|
||||||
|
lambda self, api_params, session=None: (
|
||||||
|
{'status': status, 'notes': ''}, session,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
def _assert_rejection_message(self, invoice, flow_name, expected=True):
|
||||||
|
messages = invoice.message_ids.filtered(
|
||||||
|
lambda m: 'Chorus flow n°%s rejected.' % flow_name in (m.body or '')
|
||||||
|
)
|
||||||
|
if expected:
|
||||||
|
self.assertTrue(
|
||||||
|
messages,
|
||||||
|
"A rejection message should be posted on invoice %s" % invoice.name,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
self.assertFalse(
|
||||||
|
messages,
|
||||||
|
"No rejection message expected on invoice %s" % invoice.name,
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_flow_rejected_notifies_invoice(self):
|
||||||
|
self._patch_chorus_api('IN_REJETE')
|
||||||
|
self.flow.update_flow_status()
|
||||||
|
self.assertEqual(self.flow.status, 'IN_REJETE')
|
||||||
|
self._assert_rejection_message(self.invoice, 'TEST-FLOW-001')
|
||||||
|
|
||||||
|
def test_flow_accepted_does_not_notify(self):
|
||||||
|
self._patch_chorus_api('IN_INTEGRE')
|
||||||
|
self.flow.update_flow_status()
|
||||||
|
self.assertEqual(self.flow.status, 'IN_INTEGRE')
|
||||||
|
self._assert_rejection_message(self.invoice, 'TEST-FLOW-001', expected=False)
|
||||||
|
|
||||||
|
def test_flow_rejected_no_invoices(self):
|
||||||
|
flow2 = self.env['chorus.flow'].create({
|
||||||
|
'name': 'TEST-FLOW-002',
|
||||||
|
'date': fields.Date.today(),
|
||||||
|
'company_id': self.company.id,
|
||||||
|
})
|
||||||
|
self._patch_chorus_api('IN_REJETE')
|
||||||
|
flow2.update_flow_status()
|
||||||
|
self.assertEqual(flow2.status, 'IN_REJETE')
|
||||||
Reference in New Issue
Block a user