diff --git a/__manifest__.py b/__manifest__.py index 9d4ee19..5e4c2c7 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -18,7 +18,7 @@ # { 'name': 'bemade_multiple_billing_contacts', - 'version': '15.0.1.0.0', + 'version': '15.0.1.0.1', 'summary': 'Send invoices to multiple contacts by default.', 'description': """By default, newly created invoices add all invoice addresses for the given partner as followers on the invoice. If billing contacts are set manually on the sales order, those billing diff --git a/models/account_move.py b/models/account_move.py index e5b191a..a12ddda 100644 --- a/models/account_move.py +++ b/models/account_move.py @@ -25,8 +25,8 @@ class AccountMove(models.Model): def _post(self, soft=True): # Override the original method to subscribe the partner's billing contacts instead of self.partner_id initial_subscribers = self.message_partner_ids.ids - final_subscribers = initial_subscribers + self.partner_id.billing_contacts.ids + final_subscribers = initial_subscribers + self.billing_contacts.ids posted = super()._post() - self.message_unsubscribe(self.message_partner_ids - initial_subscribers) + self.message_unsubscribe([s.id for s in self.message_partner_ids if s not in initial_subscribers]) self.message_subscribe(final_subscribers) return posted diff --git a/tests/test_billing_contacts.py b/tests/test_billing_contacts.py index 47f0a9b..c99d4d5 100644 --- a/tests/test_billing_contacts.py +++ b/tests/test_billing_contacts.py @@ -1,6 +1,9 @@ from odoo.tests import TransactionCase, tagged +from odoo import Command +import datetime +@tagged('-at_install', 'post_install') class TestBillingContacts(TransactionCase): @classmethod def setUpClass(cls): @@ -31,10 +34,74 @@ class TestBillingContacts(TransactionCase): 'parent_id': cls.parent_co.id, 'type': 'contact', }) + cls.product = cls.env['product.product'].with_company(cls.parent_co.company_id).create({ + 'name': 'Product', + 'categ_id': cls.env['product.category'].create({'name': 'Product Category'}).id, + 'list_price': 100.0, + 'type': 'service', + 'uom_id': cls.env.ref('uom.product_uom_unit').id, + 'uom_po_id': cls.env.ref('uom.product_uom_unit').id, + 'default_code': 'PRODUCT-X', + 'invoice_policy': 'order', + 'expense_policy': 'no', + 'taxes_id': [(6, 0, [])], + 'supplier_taxes_id': [(6, 0, [])], + }) - @tagged('-at_install', 'post_install') - def test_sale_order_defaults(self): - billing_contacts = self.parent_co.billing_contacts + cls.sale_order = cls.env['sale.order'].create({ + 'partner_id': cls.parent_co.id, + 'client_order_ref': 'abc123', + }) + + cls.env['sale.order.line'].create({ + 'product_id': cls.product.id, + 'name': cls.product.name, + 'product_uom_qty': 2, + 'product_uom': cls.product.uom_id.id, + 'price_unit': cls.product.list_price, + 'order_id': cls.sale_order.id, + 'tax_id': False, + 'qty_delivered_manual': 2, + }) + + def test_billing_contacts_structure(self): self.assertTrue(self.billing_contact1 in self.parent_co.billing_contacts) self.assertTrue(self.billing_contact2 in self.parent_co.billing_contacts) self.assertTrue(self.non_billing_contact not in self.parent_co.billing_contacts) + + def test_sale_order_default_billing_contacts(self): + self.assertTrue(self.sale_order.billing_contacts == self.parent_co.billing_contacts) + + def test_sale_order_change_contacts(self): + # Test that changing the billing contacts on an SO doesn't change them on the partner + # Validate that changing them manually on the SO transfers to the invoice + self.sale_order.write({'billing_contacts': [Command.link(self.non_billing_contact.id)]}) + self.assertTrue(all([c in self.sale_order.billing_contacts for c in self.parent_co.billing_contacts])) + self.assertTrue(self.non_billing_contact not in self.parent_co.billing_contacts) + self.assertTrue(self.non_billing_contact in self.sale_order.billing_contacts) + + def test_sale_order_to_invoice_contacts(self): + # Test that the invoices created from sales orders take the billing contacts configured on the SO + + self.sale_order.write({'billing_contacts': [Command.link(self.non_billing_contact.id)]}) + self.sale_order.action_confirm() + + wiz = self.env['sale.advance.payment.inv'].create({}) + invoice = wiz._create_invoice(self.sale_order,self.sale_order.order_line[0],self.sale_order.order_line.price_total) + self.assertTrue(invoice) + self.assertTrue(invoice.billing_contacts == self.sale_order.billing_contacts) + + def test_direct_invoice_contacts(self): + invoice = self.env['account.move'].create({ + 'move_type': 'out_invoice', + 'partner_id': self.parent_co, + }) + self.assertTrue(self.parent_co.billing_contacts == invoice.billing_contacts) + + def test_invoice_followers_on_validate(self): + self.sale_order.action_confirm() + wiz = self.env['sale.advance.payment.inv'].create({}) + invoice = wiz._create_invoice(self.sale_order,self.sale_order.order_line[0],self.sale_order.order_line.price_total) + invoice.write({'date': datetime.date.today()}) + invoice.action_post() + self.assertTrue(all([r in invoice.message_partner_ids for r in self.parent_co.billing_contacts]))