Skip to content

Commit

Permalink
[FIX] contract_sale_generation: Isolate sale generation (OCA#118)
Browse files Browse the repository at this point in the history
Closes OCA#117
  • Loading branch information
angelmoya authored and Bastian Guenther committed Jan 12, 2023
1 parent 06fb3c0 commit a4f5b9c
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 6 deletions.
3 changes: 2 additions & 1 deletion contract_sale_generation/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

{
'name': 'Contracts Management - Recurring Sales',
'version': '10.0.1.0.0',
'version': '10.0.2.0.0',
'category': 'Contract Management',
'license': 'AGPL-3',
'author': "PESOL, "
Expand All @@ -17,6 +17,7 @@
'views/account_analytic_account_view.xml',
'views/account_analytic_contract_view.xml',
'views/sale_view.xml',
'data/contract_cron.xml',
],
'installable': True,
}
14 changes: 14 additions & 0 deletions contract_sale_generation/data/contract_cron.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding='UTF-8'?>
<odoo>

<record model="ir.cron" id="account_analytic_cron_for_sale">
<field name="name">Generate Recurring sales from Contracts</field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
<field name="model" eval="'account.analytic.account'"/>
<field name="function" eval="'cron_recurring_create_sale'"/>
<field name="args" eval="'()'"/>
</record>

</odoo>
53 changes: 52 additions & 1 deletion contract_sale_generation/models/account_analytic_account.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
# Copyright 2017 Angel Moya <angel.moya@pesol.es>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo import api, models
from odoo import api, models, fields
from odoo.exceptions import ValidationError
from odoo.tools.translate import _

Expand Down Expand Up @@ -70,6 +70,12 @@ def _create_invoice(self):
if self.type == 'invoice':
return super(AccountAnalyticAccount, self)._create_invoice()
else:
return self.env['account.invoice']

@api.multi
def _create_sale(self):
self.ensure_one()
if self.type == 'sale':
sale_vals = self._prepare_sale()
sale = self.env['sale.order'].create(sale_vals)
for line in self.recurring_invoice_line_ids:
Expand All @@ -78,3 +84,48 @@ def _create_invoice(self):
if self.sale_autoconfirm:
sale.action_confirm()
return sale
else:
return self.env['sale.order']

@api.multi
def recurring_create_sale(self):
"""
Create sales from contracts
:return: sales created
"""
sales = self.env['sale.order']
for contract in self:
ref_date = contract.recurring_next_date or fields.Date.today()
if (contract.date_start > ref_date or
contract.date_end and contract.date_end < ref_date):
raise ValidationError(
_("You must review start and end dates!\n%s") %
contract.name)
old_date = fields.Date.from_string(ref_date)
new_date = old_date + self.get_relative_delta(
contract.recurring_rule_type, contract.recurring_interval)
ctx = self.env.context.copy()
ctx.update({
'old_date': old_date,
'next_date': new_date,
# Force company for correct evaluate domain access rules
'force_company': contract.company_id.id,
})
# Re-read contract with correct company
sales |= contract.with_context(ctx)._create_sale()
contract.write({
'recurring_next_date': new_date.strftime('%Y-%m-%d')
})
return sales

@api.model
def cron_recurring_create_sale(self):
today = fields.Date.today()
contracts = self.search([
('recurring_invoices', '=', True),
('recurring_next_date', '<=', today),
'|',
('date_end', '=', False),
('date_end', '>=', today),
])
return contracts.recurring_create_sale()
8 changes: 4 additions & 4 deletions contract_sale_generation/tests/test_contract_sale.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,10 @@ def test_contract(self):

self.contract.partner_id = False
with self.assertRaises(ValidationError):
self.contract.recurring_create_invoice()
self.contract.recurring_create_sale()
self.contract.partner_id = self.partner.id

self.contract.recurring_create_invoice()
self.contract.recurring_create_sale()
self.sale_monthly = self.env['sale.order'].search(
[('project_id', '=', self.contract.id),
('state', '=', 'draft')])
Expand All @@ -84,10 +84,10 @@ def test_contract_autoconfirm(self):

self.contract.partner_id = False
with self.assertRaises(ValidationError):
self.contract.recurring_create_invoice()
self.contract.recurring_create_sale()
self.contract.partner_id = self.partner.id

self.contract.recurring_create_invoice()
self.contract.recurring_create_sale()
self.sale_monthly = self.env['sale.order'].search(
[('project_id', '=', self.contract.id),
('state', '=', 'sale')])
Expand Down

0 comments on commit a4f5b9c

Please sign in to comment.