diff --git a/contract/__manifest__.py b/contract/__manifest__.py index 4314f6d011..a2c6fedf95 100644 --- a/contract/__manifest__.py +++ b/contract/__manifest__.py @@ -34,6 +34,7 @@ "data/ir_ui_menu.xml", "wizards/contract_line_wizard.xml", "wizards/contract_manually_create_invoice.xml", + "wizards/contract_manually_single_invoice.xml", "wizards/contract_contract_terminate.xml", "views/contract_tag.xml", "views/abstract_contract_line.xml", diff --git a/contract/models/abstract_contract_line.py b/contract/models/abstract_contract_line.py index 8b3fa62b80..46a1741434 100644 --- a/contract/models/abstract_contract_line.py +++ b/contract/models/abstract_contract_line.py @@ -224,17 +224,27 @@ def _inverse_price_unit(self): for line in self.filtered(lambda x: not x.automatic_price): line.specific_price = line.price_unit + def _get_discounted_price_subtotal(self): + """Return the discounted price subtotal""" + subtotal = self._get_price_subtotal() + discount = self.discount / 100 + subtotal *= 1 - discount + return subtotal + + def _get_price_subtotal(self): + """Return the subtotal price (without discount)""" + self.ensure_one() + return self.quantity * self.price_unit + @api.depends("quantity", "price_unit", "discount") def _compute_price_subtotal(self): for line in self: - subtotal = line.quantity * line.price_unit - discount = line.discount / 100 - subtotal *= 1 - discount + subtotal_discounted = line._get_discounted_price_subtotal() if line.contract_id.pricelist_id: cur = line.contract_id.pricelist_id.currency_id - line.price_subtotal = cur.round(subtotal) + line.price_subtotal = cur.round(subtotal_discounted) else: - line.price_subtotal = subtotal + line.price_subtotal = subtotal_discounted @api.constrains("discount") def _check_discount(self): diff --git a/contract/models/contract.py b/contract/models/contract.py index 0057e833fe..99cb5eaec4 100644 --- a/contract/models/contract.py +++ b/contract/models/contract.py @@ -168,6 +168,37 @@ def _compute_group_id(self): if len(set(all_analytic_accounts)) == 1: record.group_id = all_analytic_accounts[0] + def generate_invoices_manually(self, date=None): + if date is None: + date = fields.Date.today() + while ( + self.recurring_next_date + and self.recurring_next_date <= date + and (not self.date_end or self.recurring_next_date <= self.date_end) + ): + _logger.info( + f"next date {self.recurring_next_date} <= {date}, " + f"date end {self.date_end} " + ) + # We create the invoices for the contract lines + result = self.with_company(self.company_id.id)._cron_recurring_create( + self.recurring_next_date, + create_type=self.generation_type, + domain=[("id", "=", self.id)], + ) + for record_list in result: + for record in record_list: + self.message_post( + body=_( + "Contract manually generated: " + f'' + f"{record.display_name}" + "" + ) + ) + return True + def get_formview_id(self, access_uid=None): if self.contract_type == "sale": return self.env.ref("contract.contract_contract_customer_form_view").id @@ -193,6 +224,10 @@ def write(self, vals): @api.model def _set_start_contract_modification(self): subtype_id = self.env.ref("contract.mail_message_subtype_contract_modification") + _logger.warning( + "recurring_create_invoice is deprecated in favor of " + "_recurring_create_invoice instead" + ) for record in self: if record.contract_line_ids: date_start = min(record.contract_line_ids.mapped("date_start")) @@ -669,17 +704,24 @@ def _get_recurring_create_func(self, create_type="invoice"): return self.__class__._recurring_create_invoice @api.model - def _cron_recurring_create(self, date_ref=False, create_type="invoice"): + def _cron_recurring_create( + self, date_ref=False, create_type="invoice", domain=None + ): """ The cron function in order to create recurrent documents from contracts. + The domain is used to add an extra filter """ + if domain is None: + domain = [] _recurring_create_func = self._get_recurring_create_func( create_type=create_type ) if not date_ref: date_ref = fields.Date.context_today(self) - domain = self._get_contracts_to_invoice_domain(date_ref) + domain = expression.AND( + [domain, self._get_contracts_to_invoice_domain(date_ref)] + ) domain = expression.AND( [ domain, @@ -688,6 +730,7 @@ def _cron_recurring_create(self, date_ref=False, create_type="invoice"): ) contracts = self.search(domain) companies = set(contracts.mapped("company_id")) + result = [] # Invoice by companies, so assignation emails get correct context for company in companies: contracts_to_invoice = contracts.filtered( @@ -697,8 +740,8 @@ def _cron_recurring_create(self, date_ref=False, create_type="invoice"): or contract.recurring_next_date <= contract.date_end ) ).with_company(company) - _recurring_create_func(contracts_to_invoice, date_ref) - return True + result.append(_recurring_create_func(contracts_to_invoice, date_ref)) + return result @api.model def cron_recurring_create_invoice(self, date_ref=None): diff --git a/contract/security/ir.model.access.csv b/contract/security/ir.model.access.csv index 63b7beaf76..2707753629 100644 --- a/contract/security/ir.model.access.csv +++ b/contract/security/ir.model.access.csv @@ -14,3 +14,4 @@ "contract_line_wizard","contract_line_wizard","model_contract_line_wizard","account.group_account_manager",1,1,1,1 "contract_manually_create_invoice_wizard","contract_manually_create_invoice_wizard","model_contract_manually_create_invoice","account.group_account_invoice",1,1,1,1 "contract_contract_terminate_wizard","contract_contract_terminate_wizard","model_contract_contract_terminate","contract.can_terminate_contract",1,1,1,1 +"contract_manually_single_invoice_wizard","contract_manually_single_process_wizard","model_contract_manually_single_invoice","account.group_account_invoice",1,1,1,1 diff --git a/contract/tests/test_contract.py b/contract/tests/test_contract.py index 0559e30a2b..945c4fb635 100644 --- a/contract/tests/test_contract.py +++ b/contract/tests/test_contract.py @@ -256,7 +256,9 @@ def test_contract(self): self.assertAlmostEqual(self.acct_line.price_subtotal, 50.0) self.acct_line.price_unit = 100.0 self.contract.partner_id = self.partner.id - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() self.invoice_monthly = self.contract._get_related_invoices() self.assertTrue(self.invoice_monthly) self.assertEqual(self.acct_line.recurring_next_date, to_date("2018-02-15")) @@ -266,7 +268,12 @@ def test_contract(self): self.assertEqual(self.contract.user_id, self.invoice_monthly.user_id) def test_contract_level_recurrence(self): - self.contract3.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + { + "date": self.contract3.recurring_next_date, + "contract_id": self.contract3.id, + } + ).create_invoice() self.contract3.flush_recordset() def test_contract_daily(self): @@ -275,7 +282,9 @@ def test_contract_daily(self): self.acct_line.recurring_next_date = "2018-02-22" self.acct_line.recurring_rule_type = "daily" self.contract.pricelist_id = False - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() invoice_daily = self.contract._get_related_invoices() self.assertTrue(invoice_daily) self.assertEqual(self.acct_line.recurring_next_date, recurring_next_date) @@ -294,7 +303,9 @@ def test_contract_invoice_followers(self): self.contract.message_subscribe( partner_ids=self.contract.partner_id.ids, subtype_ids=subtype_ids ) - self.contract._recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() invoice_daily = self.contract._get_related_invoices() self.assertTrue(invoice_daily) self.assertTrue(self.contract.partner_id in invoice_daily.message_partner_ids) @@ -306,7 +317,9 @@ def test_contract_invoice_salesperson(self): {"name": "Some Salesperson", "login": "salesperson_test"} ) self.contract.user_id = new_salesperson - self.contract._recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() invoice_daily = self.contract._get_related_invoices() self.assertTrue(invoice_daily) self.assertEqual(self.contract.user_id, invoice_daily.user_id) @@ -318,7 +331,9 @@ def test_contract_weekly_post_paid(self): self.acct_line.recurring_next_date = "2018-02-22" self.acct_line.recurring_rule_type = "weekly" self.acct_line.recurring_invoicing_type = "post-paid" - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() invoices_weekly = self.contract._get_related_invoices() self.assertTrue(invoices_weekly) self.assertEqual(self.acct_line.recurring_next_date, recurring_next_date) @@ -330,7 +345,9 @@ def test_contract_weekly_pre_paid(self): self.acct_line.recurring_next_date = "2018-02-22" self.acct_line.recurring_rule_type = "weekly" self.acct_line.recurring_invoicing_type = "pre-paid" - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() invoices_weekly = self.contract._get_related_invoices() self.assertTrue(invoices_weekly) self.assertEqual(self.acct_line.recurring_next_date, recurring_next_date) @@ -342,7 +359,9 @@ def test_contract_yearly_post_paid(self): self.acct_line.recurring_next_date = "2018-02-22" self.acct_line.recurring_rule_type = "yearly" self.acct_line.recurring_invoicing_type = "post-paid" - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() invoices_weekly = self.contract._get_related_invoices() self.assertTrue(invoices_weekly) self.assertEqual(self.acct_line.recurring_next_date, recurring_next_date) @@ -355,7 +374,9 @@ def test_contract_yearly_pre_paid(self): self.acct_line.recurring_next_date = "2018-02-22" self.acct_line.recurring_rule_type = "yearly" self.acct_line.recurring_invoicing_type = "pre-paid" - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() invoices_weekly = self.contract._get_related_invoices() self.assertTrue(invoices_weekly) self.assertEqual(self.acct_line.recurring_next_date, recurring_next_date) @@ -367,7 +388,9 @@ def test_contract_monthly_lastday(self): self.acct_line.recurring_next_date = "2018-02-22" self.acct_line.recurring_invoicing_type = "post-paid" self.acct_line.recurring_rule_type = "monthlylastday" - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() invoices_monthly_lastday = self.contract._get_related_invoices() self.assertTrue(invoices_monthly_lastday) self.assertEqual(self.acct_line.recurring_next_date, recurring_next_date) @@ -380,7 +403,9 @@ def test_contract_quarterly_pre_paid(self): self.acct_line.recurring_next_date = "2018-02-22" self.acct_line.recurring_rule_type = "quarterly" self.acct_line.recurring_invoicing_type = "pre-paid" - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() invoices_weekly = self.contract._get_related_invoices() self.assertTrue(invoices_weekly) self.assertEqual(self.acct_line.recurring_next_date, recurring_next_date) @@ -393,7 +418,9 @@ def test_contract_quarterly_post_paid(self): self.acct_line.recurring_next_date = "2018-02-22" self.acct_line.recurring_rule_type = "quarterly" self.acct_line.recurring_invoicing_type = "post-paid" - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() invoices_weekly = self.contract._get_related_invoices() self.assertTrue(invoices_weekly) self.assertEqual(self.acct_line.recurring_next_date, recurring_next_date) @@ -406,7 +433,9 @@ def test_contract_semesterly_pre_paid(self): self.acct_line.recurring_next_date = "2018-02-22" self.acct_line.recurring_rule_type = "semesterly" self.acct_line.recurring_invoicing_type = "pre-paid" - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() invoices_weekly = self.contract._get_related_invoices() self.assertTrue(invoices_weekly) self.assertEqual(self.acct_line.recurring_next_date, recurring_next_date) @@ -419,7 +448,9 @@ def test_contract_semesterly_post_paid(self): self.acct_line.recurring_next_date = "2018-02-22" self.acct_line.recurring_rule_type = "semesterly" self.acct_line.recurring_invoicing_type = "post-paid" - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() invoices_weekly = self.contract._get_related_invoices() self.assertTrue(invoices_weekly) self.assertEqual(self.acct_line.recurring_next_date, recurring_next_date) @@ -499,7 +530,12 @@ def test_check_journal(self): journal = self.env["account.journal"].search([("type", "=", "sale")]) journal.write({"type": "general"}) with self.assertRaises(ValidationError): - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + { + "date": self.contract.recurring_next_date, + "contract_id": self.contract.id, + } + ).create_invoice() def test_check_date_end(self): with self.assertRaises(ValidationError): @@ -1090,7 +1126,9 @@ def _error_message( def test_recurring_next_date(self): """recurring next date for a contract is the min for all lines""" - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() self.assertEqual( self.contract.recurring_next_date, min(self.contract.contract_line_ids.mapped("recurring_next_date")), @@ -1746,14 +1784,18 @@ def test_get_period_to_invoice_monthlylastday_postpaid(self): ) self.assertEqual(first, to_date("2018-01-05")) self.assertEqual(last, to_date("2018-01-31")) - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() first, last, recurring_next_date = self.acct_line._get_period_to_invoice( self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date, ) self.assertEqual(first, to_date("2018-02-01")) self.assertEqual(last, to_date("2018-02-28")) - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() first, last, recurring_next_date = self.acct_line._get_period_to_invoice( self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date, @@ -1775,7 +1817,9 @@ def test_get_period_to_invoice_monthlylastday_prepaid(self): self.assertEqual(last, to_date("2018-01-31")) self.assertEqual(recurring_next_date, to_date("2018-01-05")) self.assertEqual(self.acct_line.recurring_next_date, to_date("2018-01-05")) - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() first, last, recurring_next_date = self.acct_line._get_period_to_invoice( self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date, @@ -1785,7 +1829,9 @@ def test_get_period_to_invoice_monthlylastday_prepaid(self): self.assertEqual(recurring_next_date, to_date("2018-02-01")) self.assertEqual(self.acct_line.recurring_next_date, to_date("2018-02-01")) self.assertEqual(self.acct_line.last_date_invoiced, to_date("2018-01-31")) - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() first, last, recurring_next_date = self.acct_line._get_period_to_invoice( self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date, @@ -1795,7 +1841,9 @@ def test_get_period_to_invoice_monthlylastday_prepaid(self): self.assertEqual(recurring_next_date, to_date("2018-03-01")) self.assertEqual(self.acct_line.recurring_next_date, to_date("2018-03-01")) self.assertEqual(self.acct_line.last_date_invoiced, to_date("2018-02-28")) - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() first, last, recurring_next_date = self.acct_line._get_period_to_invoice( self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date, @@ -1811,7 +1859,9 @@ def test_get_period_to_invoice_monthly_pre_paid_2(self): self.acct_line.recurring_invoicing_type = "pre-paid" self.acct_line.recurring_rule_type = "monthly" self.acct_line.date_end = "2018-08-15" - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() first, last, recurring_next_date = self.acct_line._get_period_to_invoice( self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date, @@ -1831,7 +1881,9 @@ def test_get_period_to_invoice_monthly_post_paid_2(self): self.acct_line.recurring_invoicing_type = "post-paid" self.acct_line.recurring_rule_type = "monthly" self.acct_line.date_end = "2018-08-15" - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() first, last, recurring_next_date = self.acct_line._get_period_to_invoice( self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date, @@ -1857,14 +1909,18 @@ def test_get_period_to_invoice_monthly_post_paid(self): ) self.assertEqual(first, to_date("2018-01-05")) self.assertEqual(last, to_date("2018-02-04")) - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() first, last, recurring_next_date = self.acct_line._get_period_to_invoice( self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date, ) self.assertEqual(first, to_date("2018-02-05")) self.assertEqual(last, to_date("2018-03-04")) - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() first, last, recurring_next_date = self.acct_line._get_period_to_invoice( self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date, @@ -1883,14 +1939,18 @@ def test_get_period_to_invoice_monthly_pre_paid(self): ) self.assertEqual(first, to_date("2018-01-05")) self.assertEqual(last, to_date("2018-02-04")) - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() first, last, recurring_next_date = self.acct_line._get_period_to_invoice( self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date, ) self.assertEqual(first, to_date("2018-02-05")) self.assertEqual(last, to_date("2018-03-04")) - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() first, last, recurring_next_date = self.acct_line._get_period_to_invoice( self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date, @@ -1909,14 +1969,18 @@ def test_get_period_to_invoice_yearly_post_paid(self): ) self.assertEqual(first, to_date("2018-01-05")) self.assertEqual(last, to_date("2019-01-04")) - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() first, last, recurring_next_date = self.acct_line._get_period_to_invoice( self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date, ) self.assertEqual(first, to_date("2019-01-05")) self.assertEqual(last, to_date("2020-01-04")) - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() first, last, recurring_next_date = self.acct_line._get_period_to_invoice( self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date, @@ -1935,14 +1999,18 @@ def test_get_period_to_invoice_yearly_pre_paid(self): ) self.assertEqual(first, to_date("2018-01-05")) self.assertEqual(last, to_date("2019-01-04")) - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() first, last, recurring_next_date = self.acct_line._get_period_to_invoice( self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date, ) self.assertEqual(first, to_date("2019-01-05")) self.assertEqual(last, to_date("2020-01-04")) - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() first, last, recurring_next_date = self.acct_line._get_period_to_invoice( self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date, @@ -2185,9 +2253,15 @@ def test_sale_get_view(self): self.assertEqual(view["id"], sale_form_view.id) def test_contract_count_invoice(self): - self.contract.recurring_create_invoice() - self.contract.recurring_create_invoice() - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() self.contract._compute_invoice_count() self.assertEqual(self.contract.invoice_count, 3) @@ -2224,9 +2298,21 @@ def test_invoice_contract_without_lines(self): self.contract.contract_line_ids.cancel() self.contract.contract_line_ids.unlink() self.assertFalse(self.contract.recurring_create_invoice()) + # self.assertFalse( + # self.env["contract.manually.single.invoice"] + # .create( + # { + # "date": self.contract.recurring_next_date, + # "contract_id": self.contract.id, + # } + # ) + # .create_invoice() + # ) def test_stop_at_last_date_invoiced(self): - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() self.assertTrue(self.acct_line.recurring_next_date) self.acct_line.stop(self.acct_line.last_date_invoiced) self.assertFalse(self.acct_line.recurring_next_date) @@ -2285,7 +2371,9 @@ def test_action_terminate_contract(self): self.assertFalse(self.contract.terminate_comment) def test_terminate_date_before_last_date_invoiced(self): - self.contract.recurring_create_invoice() + self.env["contract.manually.single.invoice"].create( + {"date": self.contract.recurring_next_date, "contract_id": self.contract.id} + ).create_invoice() self.assertEqual(self.acct_line.last_date_invoiced, to_date("2018-02-14")) group_can_terminate_contract = self.env.ref("contract.can_terminate_contract") group_can_terminate_contract.users |= self.env.user diff --git a/contract/tests/test_contract_manually_create_invoice.py b/contract/tests/test_contract_manually_create_invoice.py index b8a5fd537d..1c33e062cc 100644 --- a/contract/tests/test_contract_manually_create_invoice.py +++ b/contract/tests/test_contract_manually_create_invoice.py @@ -45,6 +45,31 @@ def test_contract_manually_create_invoice(self): self.assertFalse(invoice_lines.mapped("move_id") - invoices) self.assertEqual(len(invoices), contract_to_invoice_count) + def test_contract_manually_single_contract(self): + contracts = self.env["contract.contract"] + for _i in range(10): + contracts |= self.contract.copy() + wizard = self.env["contract.manually.single.invoice"].create( + {"date": self.today, "contract_id": self.contract.id} + ) + wizard.create_invoice() + invoice_lines = self.env["account.move.line"].search( + [("contract_line_id", "in", contracts.mapped("contract_line_ids").ids)] + ) + self.assertEqual( + 0, + len(invoice_lines), + ) + invoice_lines = self.env["account.move.line"].search( + [("contract_line_id", "in", self.contract.mapped("contract_line_ids").ids)] + ) + self.assertEqual( + 2, + len(invoice_lines), + ) + # Two invoices are available from to 2018-1-1 2018-3-15. + # We are invoicing at the end of the month + def test_contract_manually_create_invoice_with_usererror(self): contracts = self.contract diff --git a/contract/views/contract.xml b/contract/views/contract.xml index 0cac09f3c6..a5880ef9b5 100644 --- a/contract/views/contract.xml +++ b/contract/views/contract.xml @@ -39,11 +39,11 @@ groups="base.group_user" />