mirror of
https://github.com/OCA/contract.git
synced 2025-02-13 17:57:24 +02:00
[IMP] - A canceled contract line can't be set to auto-renew
[REF] Contract: pep8 [IMP] Contract: update USAGE section of README [IMP]call onchange_is_auto_renew when changing template
This commit is contained in:
committed by
Francisco Ivan Anton Prieto
parent
5c8c875b61
commit
107dbc65d6
@@ -225,6 +225,7 @@ class AccountAnalyticAccount(models.Model):
|
|||||||
)
|
)
|
||||||
new_lines += contract_line_model.new(vals)
|
new_lines += contract_line_model.new(vals)
|
||||||
new_lines._onchange_date_start()
|
new_lines._onchange_date_start()
|
||||||
|
new_lines._onchange_is_auto_renew()
|
||||||
return new_lines
|
return new_lines
|
||||||
|
|
||||||
@api.multi
|
@api.multi
|
||||||
|
|||||||
@@ -409,6 +409,14 @@ class AccountAnalyticInvoiceLine(models.Model):
|
|||||||
rec.recurring_interval,
|
rec.recurring_interval,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@api.constrains('is_canceled', 'is_auto_renew')
|
||||||
|
def _check_auto_renew_canceled_lines(self):
|
||||||
|
for rec in self:
|
||||||
|
if rec.is_canceled and rec.is_auto_renew:
|
||||||
|
raise ValidationError(
|
||||||
|
_("A canceled contract line can't be set to auto-renew")
|
||||||
|
)
|
||||||
|
|
||||||
@api.constrains('recurring_next_date', 'date_start')
|
@api.constrains('recurring_next_date', 'date_start')
|
||||||
def _check_recurring_next_date_start_date(self):
|
def _check_recurring_next_date_start_date(self):
|
||||||
for line in self.filtered('recurring_next_date'):
|
for line in self.filtered('recurring_next_date'):
|
||||||
@@ -886,7 +894,7 @@ class AccountAnalyticInvoiceLine(models.Model):
|
|||||||
self.mapped('predecessor_contract_line_id').write(
|
self.mapped('predecessor_contract_line_id').write(
|
||||||
{'successor_contract_line_id': False}
|
{'successor_contract_line_id': False}
|
||||||
)
|
)
|
||||||
return self.write({'is_canceled': True})
|
return self.write({'is_canceled': True, 'is_auto_renew': False})
|
||||||
|
|
||||||
@api.multi
|
@api.multi
|
||||||
def uncancel(self, recurring_next_date):
|
def uncancel(self, recurring_next_date):
|
||||||
|
|||||||
@@ -1,27 +1,25 @@
|
|||||||
To use this module, you need to:
|
#. Contracts are in Invoicing -> Customers -> Customer and Invoicing -> Vendors -> Supplier Contracts
|
||||||
|
#. When creating a contract, fill fields for selecting the invoicing parameters:
|
||||||
|
|
||||||
#. Go to Accounting -> Contracts and select or create a new contract.
|
* a journal
|
||||||
#. Check *Generate recurring invoices automatically*.
|
* a price list (optional)
|
||||||
#. Fill fields for selecting the recurrency and invoice parameters:
|
|
||||||
|
|
||||||
* Journal
|
#. And add the lines to be invoiced with:
|
||||||
* Pricelist
|
|
||||||
* Period. It can be any interval of days, weeks, months, months last day or
|
|
||||||
years.
|
|
||||||
* Start date and next invoice date.
|
|
||||||
* Invoicing type: pre-paid or post-paid.
|
|
||||||
|
|
||||||
#. Add the lines to be invoiced with the product, description, quantity and
|
* the product with a description, a quantity and a price
|
||||||
price.
|
* the recurrence parameters: interval (days, weeks, months, months last day or years),
|
||||||
#. You can mark Auto-price? for having a price automatically obtained applying
|
start date, date of next invoice (automatically computed, can be modified) and end date (optional)
|
||||||
the pricelist to the product price.
|
* auto-price, for having a price automatically obtained from the price list
|
||||||
#. You have the possibility to use the markers #START# or #END# in the
|
* #START# or #END# in the description field to display the start/end date of
|
||||||
description field to show the start and end date of the invoiced period.
|
the invoiced period in the invoice line description
|
||||||
#. Choosing between pre-paid and post-paid, you modify the dates that are shown
|
* pre-paid (invoice at period start) or post-paid (invoice at start of next period)
|
||||||
with the markers.
|
|
||||||
#. A cron is created with daily interval, but if you are in debug mode, you can
|
#. The "Generate Recurring Invoices from Contracts" cron runs daily to generate the invoices.
|
||||||
click on *Create invoices* to force this action.
|
If you are in debug mode, you can click on the invoice creation button.
|
||||||
#. Click *Show recurring invoices* link to show all invoices created by the
|
#. The *Show recurring invoices* shortcut on contracts shows all invoices created from the
|
||||||
contract.
|
contract.
|
||||||
#. Click on *Print > Contract* menu to print contract report.
|
#. The contract report can be printed from the Print menu
|
||||||
#. Click on *Send by Email* button to send contract by email.
|
#. The contract can be sent by email with the *Send by Email* button
|
||||||
|
#. Contract templates can be created from the Configuration -> Contracts -> Contract Templates menu.
|
||||||
|
They allow to define default journal, price list and lines when creating a contract.
|
||||||
|
To use it, just select the template on the contract and fields will be filled automatically.
|
||||||
|
|||||||
@@ -1160,8 +1160,17 @@ class TestContract(TestContractBase):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def test_cancel(self):
|
def test_cancel(self):
|
||||||
|
self.acct_line.write(
|
||||||
|
{
|
||||||
|
'date_end': self.today + relativedelta(months=5),
|
||||||
|
'is_auto_renew': True,
|
||||||
|
}
|
||||||
|
)
|
||||||
self.acct_line.cancel()
|
self.acct_line.cancel()
|
||||||
self.assertTrue(self.acct_line.is_canceled)
|
self.assertTrue(self.acct_line.is_canceled)
|
||||||
|
self.assertFalse(self.acct_line.is_auto_renew)
|
||||||
|
with self.assertRaises(ValidationError):
|
||||||
|
self.acct_line.is_auto_renew = True
|
||||||
self.acct_line.uncancel(self.today)
|
self.acct_line.uncancel(self.today)
|
||||||
self.assertFalse(self.acct_line.is_canceled)
|
self.assertFalse(self.acct_line.is_canceled)
|
||||||
|
|
||||||
@@ -1330,21 +1339,24 @@ class TestContract(TestContractBase):
|
|||||||
self.acct_line.recurring_rule_type = 'monthlylastday'
|
self.acct_line.recurring_rule_type = 'monthlylastday'
|
||||||
self.acct_line.date_end = '2018-03-15'
|
self.acct_line.date_end = '2018-03-15'
|
||||||
self.acct_line._onchange_date_start()
|
self.acct_line._onchange_date_start()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = \
|
||||||
|
self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced,
|
self.acct_line.last_date_invoiced,
|
||||||
self.acct_line.recurring_next_date,
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date('2018-01-05'))
|
self.assertEqual(first, to_date('2018-01-05'))
|
||||||
self.assertEqual(last, to_date('2018-01-31'))
|
self.assertEqual(last, to_date('2018-01-31'))
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = \
|
||||||
|
self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced,
|
self.acct_line.last_date_invoiced,
|
||||||
self.acct_line.recurring_next_date,
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date('2018-02-01'))
|
self.assertEqual(first, to_date('2018-02-01'))
|
||||||
self.assertEqual(last, to_date('2018-02-28'))
|
self.assertEqual(last, to_date('2018-02-28'))
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = \
|
||||||
|
self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced,
|
self.acct_line.last_date_invoiced,
|
||||||
self.acct_line.recurring_next_date,
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
@@ -1359,14 +1371,16 @@ class TestContract(TestContractBase):
|
|||||||
self.acct_line.date_end = '2018-08-15'
|
self.acct_line.date_end = '2018-08-15'
|
||||||
self.acct_line._onchange_date_start()
|
self.acct_line._onchange_date_start()
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = \
|
||||||
|
self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced,
|
self.acct_line.last_date_invoiced,
|
||||||
self.acct_line.recurring_next_date,
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date('2018-02-05'))
|
self.assertEqual(first, to_date('2018-02-05'))
|
||||||
self.assertEqual(last, to_date('2018-03-04'))
|
self.assertEqual(last, to_date('2018-03-04'))
|
||||||
self.acct_line.recurring_next_date = '2018-06-05'
|
self.acct_line.recurring_next_date = '2018-06-05'
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = \
|
||||||
|
self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced,
|
self.acct_line.last_date_invoiced,
|
||||||
self.acct_line.recurring_next_date,
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
@@ -1380,14 +1394,16 @@ class TestContract(TestContractBase):
|
|||||||
self.acct_line.date_end = '2018-08-15'
|
self.acct_line.date_end = '2018-08-15'
|
||||||
self.acct_line._onchange_date_start()
|
self.acct_line._onchange_date_start()
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = \
|
||||||
|
self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced,
|
self.acct_line.last_date_invoiced,
|
||||||
self.acct_line.recurring_next_date,
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date('2018-02-05'))
|
self.assertEqual(first, to_date('2018-02-05'))
|
||||||
self.assertEqual(last, to_date('2018-03-04'))
|
self.assertEqual(last, to_date('2018-03-04'))
|
||||||
self.acct_line.recurring_next_date = '2018-06-05'
|
self.acct_line.recurring_next_date = '2018-06-05'
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = \
|
||||||
|
self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced,
|
self.acct_line.last_date_invoiced,
|
||||||
self.acct_line.recurring_next_date,
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
@@ -1400,21 +1416,24 @@ class TestContract(TestContractBase):
|
|||||||
self.acct_line.recurring_rule_type = 'monthly'
|
self.acct_line.recurring_rule_type = 'monthly'
|
||||||
self.acct_line.date_end = '2018-03-15'
|
self.acct_line.date_end = '2018-03-15'
|
||||||
self.acct_line._onchange_date_start()
|
self.acct_line._onchange_date_start()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = \
|
||||||
|
self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced,
|
self.acct_line.last_date_invoiced,
|
||||||
self.acct_line.recurring_next_date,
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date('2018-01-05'))
|
self.assertEqual(first, to_date('2018-01-05'))
|
||||||
self.assertEqual(last, to_date('2018-02-04'))
|
self.assertEqual(last, to_date('2018-02-04'))
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = \
|
||||||
|
self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced,
|
self.acct_line.last_date_invoiced,
|
||||||
self.acct_line.recurring_next_date,
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date('2018-02-05'))
|
self.assertEqual(first, to_date('2018-02-05'))
|
||||||
self.assertEqual(last, to_date('2018-03-04'))
|
self.assertEqual(last, to_date('2018-03-04'))
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = \
|
||||||
|
self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced,
|
self.acct_line.last_date_invoiced,
|
||||||
self.acct_line.recurring_next_date,
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
@@ -1427,21 +1446,24 @@ class TestContract(TestContractBase):
|
|||||||
self.acct_line.recurring_rule_type = 'monthly'
|
self.acct_line.recurring_rule_type = 'monthly'
|
||||||
self.acct_line.date_end = '2018-03-15'
|
self.acct_line.date_end = '2018-03-15'
|
||||||
self.acct_line._onchange_date_start()
|
self.acct_line._onchange_date_start()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = \
|
||||||
|
self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced,
|
self.acct_line.last_date_invoiced,
|
||||||
self.acct_line.recurring_next_date,
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date('2018-01-05'))
|
self.assertEqual(first, to_date('2018-01-05'))
|
||||||
self.assertEqual(last, to_date('2018-02-04'))
|
self.assertEqual(last, to_date('2018-02-04'))
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = \
|
||||||
|
self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced,
|
self.acct_line.last_date_invoiced,
|
||||||
self.acct_line.recurring_next_date,
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date('2018-02-05'))
|
self.assertEqual(first, to_date('2018-02-05'))
|
||||||
self.assertEqual(last, to_date('2018-03-04'))
|
self.assertEqual(last, to_date('2018-03-04'))
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = \
|
||||||
|
self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced,
|
self.acct_line.last_date_invoiced,
|
||||||
self.acct_line.recurring_next_date,
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
@@ -1454,21 +1476,24 @@ class TestContract(TestContractBase):
|
|||||||
self.acct_line.recurring_rule_type = 'yearly'
|
self.acct_line.recurring_rule_type = 'yearly'
|
||||||
self.acct_line.date_end = '2020-03-15'
|
self.acct_line.date_end = '2020-03-15'
|
||||||
self.acct_line._onchange_date_start()
|
self.acct_line._onchange_date_start()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = \
|
||||||
|
self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced,
|
self.acct_line.last_date_invoiced,
|
||||||
self.acct_line.recurring_next_date,
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date('2018-01-05'))
|
self.assertEqual(first, to_date('2018-01-05'))
|
||||||
self.assertEqual(last, to_date('2019-01-04'))
|
self.assertEqual(last, to_date('2019-01-04'))
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = \
|
||||||
|
self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced,
|
self.acct_line.last_date_invoiced,
|
||||||
self.acct_line.recurring_next_date,
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date('2019-01-05'))
|
self.assertEqual(first, to_date('2019-01-05'))
|
||||||
self.assertEqual(last, to_date('2020-01-04'))
|
self.assertEqual(last, to_date('2020-01-04'))
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = \
|
||||||
|
self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced,
|
self.acct_line.last_date_invoiced,
|
||||||
self.acct_line.recurring_next_date,
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
@@ -1481,21 +1506,24 @@ class TestContract(TestContractBase):
|
|||||||
self.acct_line.recurring_rule_type = 'yearly'
|
self.acct_line.recurring_rule_type = 'yearly'
|
||||||
self.acct_line.date_end = '2020-03-15'
|
self.acct_line.date_end = '2020-03-15'
|
||||||
self.acct_line._onchange_date_start()
|
self.acct_line._onchange_date_start()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = \
|
||||||
|
self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced,
|
self.acct_line.last_date_invoiced,
|
||||||
self.acct_line.recurring_next_date,
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date('2018-01-05'))
|
self.assertEqual(first, to_date('2018-01-05'))
|
||||||
self.assertEqual(last, to_date('2019-01-04'))
|
self.assertEqual(last, to_date('2019-01-04'))
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = \
|
||||||
|
self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced,
|
self.acct_line.last_date_invoiced,
|
||||||
self.acct_line.recurring_next_date,
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
self.assertEqual(first, to_date('2019-01-05'))
|
self.assertEqual(first, to_date('2019-01-05'))
|
||||||
self.assertEqual(last, to_date('2020-01-04'))
|
self.assertEqual(last, to_date('2020-01-04'))
|
||||||
self.contract.recurring_create_invoice()
|
self.contract.recurring_create_invoice()
|
||||||
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
|
first, last, recurring_next_date = \
|
||||||
|
self.acct_line._get_period_to_invoice(
|
||||||
self.acct_line.last_date_invoiced,
|
self.acct_line.last_date_invoiced,
|
||||||
self.acct_line.recurring_next_date,
|
self.acct_line.recurring_next_date,
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user