[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:
sbejaoui
2019-04-02 12:12:46 +02:00
committed by Francisco Ivan Anton Prieto
parent 5c8c875b61
commit 107dbc65d6
4 changed files with 135 additions and 100 deletions

View File

@@ -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

View File

@@ -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):

View File

@@ -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.

View File

@@ -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,24 +1339,27 @@ 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.last_date_invoiced, self.acct_line._get_period_to_invoice(
self.acct_line.recurring_next_date, self.acct_line.last_date_invoiced,
) 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.last_date_invoiced, self.acct_line._get_period_to_invoice(
self.acct_line.recurring_next_date, self.acct_line.last_date_invoiced,
) 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.last_date_invoiced, self.acct_line._get_period_to_invoice(
self.acct_line.recurring_next_date, self.acct_line.last_date_invoiced,
) self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date('2018-03-01')) self.assertEqual(first, to_date('2018-03-01'))
self.assertEqual(last, to_date('2018-03-15')) self.assertEqual(last, to_date('2018-03-15'))
self.acct_line.manual_renew_needed = True self.acct_line.manual_renew_needed = True
@@ -1359,17 +1371,19 @@ 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.last_date_invoiced, self.acct_line._get_period_to_invoice(
self.acct_line.recurring_next_date, self.acct_line.last_date_invoiced,
) 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.last_date_invoiced, self.acct_line._get_period_to_invoice(
self.acct_line.recurring_next_date, self.acct_line.last_date_invoiced,
) 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-07-04')) self.assertEqual(last, to_date('2018-07-04'))
@@ -1380,17 +1394,19 @@ 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.last_date_invoiced, self.acct_line._get_period_to_invoice(
self.acct_line.recurring_next_date, self.acct_line.last_date_invoiced,
) 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.last_date_invoiced, self.acct_line._get_period_to_invoice(
self.acct_line.recurring_next_date, self.acct_line.last_date_invoiced,
) 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-06-04')) self.assertEqual(last, to_date('2018-06-04'))
@@ -1400,24 +1416,27 @@ 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.last_date_invoiced, self.acct_line._get_period_to_invoice(
self.acct_line.recurring_next_date, self.acct_line.last_date_invoiced,
) 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.last_date_invoiced, self.acct_line._get_period_to_invoice(
self.acct_line.recurring_next_date, self.acct_line.last_date_invoiced,
) 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.last_date_invoiced, self.acct_line._get_period_to_invoice(
self.acct_line.recurring_next_date, self.acct_line.last_date_invoiced,
) self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date('2018-03-05')) self.assertEqual(first, to_date('2018-03-05'))
self.assertEqual(last, to_date('2018-03-15')) self.assertEqual(last, to_date('2018-03-15'))
@@ -1427,24 +1446,27 @@ 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.last_date_invoiced, self.acct_line._get_period_to_invoice(
self.acct_line.recurring_next_date, self.acct_line.last_date_invoiced,
) 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.last_date_invoiced, self.acct_line._get_period_to_invoice(
self.acct_line.recurring_next_date, self.acct_line.last_date_invoiced,
) 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.last_date_invoiced, self.acct_line._get_period_to_invoice(
self.acct_line.recurring_next_date, self.acct_line.last_date_invoiced,
) self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date('2018-03-05')) self.assertEqual(first, to_date('2018-03-05'))
self.assertEqual(last, to_date('2018-03-15')) self.assertEqual(last, to_date('2018-03-15'))
@@ -1454,24 +1476,27 @@ 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.last_date_invoiced, self.acct_line._get_period_to_invoice(
self.acct_line.recurring_next_date, self.acct_line.last_date_invoiced,
) 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.last_date_invoiced, self.acct_line._get_period_to_invoice(
self.acct_line.recurring_next_date, self.acct_line.last_date_invoiced,
) 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.last_date_invoiced, self.acct_line._get_period_to_invoice(
self.acct_line.recurring_next_date, self.acct_line.last_date_invoiced,
) self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date('2020-01-05')) self.assertEqual(first, to_date('2020-01-05'))
self.assertEqual(last, to_date('2020-03-15')) self.assertEqual(last, to_date('2020-03-15'))
@@ -1481,24 +1506,27 @@ 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.last_date_invoiced, self.acct_line._get_period_to_invoice(
self.acct_line.recurring_next_date, self.acct_line.last_date_invoiced,
) 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.last_date_invoiced, self.acct_line._get_period_to_invoice(
self.acct_line.recurring_next_date, self.acct_line.last_date_invoiced,
) 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.last_date_invoiced, self.acct_line._get_period_to_invoice(
self.acct_line.recurring_next_date, self.acct_line.last_date_invoiced,
) self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date('2020-01-05')) self.assertEqual(first, to_date('2020-01-05'))
self.assertEqual(last, to_date('2020-03-15')) self.assertEqual(last, to_date('2020-03-15'))