mirror of
https://github.com/OCA/contract.git
synced 2025-02-13 17:57:24 +02:00
[IMP] contract_variable_qty_timesheet: black, isort
This commit is contained in:
@@ -2,22 +2,16 @@
|
|||||||
# Copyright 2019 Tecnativa - Pedro M. Baeza
|
# Copyright 2019 Tecnativa - Pedro M. Baeza
|
||||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
{
|
{
|
||||||
'name': 'Contract Variable Qty Timesheet',
|
"name": "Contract Variable Qty Timesheet",
|
||||||
'summary': 'Add formula to invoice ',
|
"summary": "Add formula to invoice ",
|
||||||
'version': '12.0.1.0.0',
|
"version": "12.0.1.0.0",
|
||||||
'category': 'Contract Management',
|
"category": "Contract Management",
|
||||||
'website': 'https://github.com/oca/contract',
|
"website": "https://github.com/oca/contract",
|
||||||
'author': 'Tecnativa, '
|
"author": "Tecnativa, " "Odoo Community Association (OCA)",
|
||||||
'Odoo Community Association (OCA)',
|
"license": "AGPL-3",
|
||||||
'license': 'AGPL-3',
|
"installable": True,
|
||||||
'installable': True,
|
"development_status": "Production/Stable",
|
||||||
'development_status': 'Production/Stable',
|
"depends": ["contract_variable_quantity", "hr_timesheet",],
|
||||||
'depends': [
|
"data": ["data/contract_line_qty_formula_data.xml",],
|
||||||
'contract_variable_quantity',
|
"maintainers": ["carlosdauden", "pedrobaeza"],
|
||||||
'hr_timesheet',
|
|
||||||
],
|
|
||||||
'data': [
|
|
||||||
'data/contract_line_qty_formula_data.xml',
|
|
||||||
],
|
|
||||||
'maintainers': ['carlosdauden', 'pedrobaeza'],
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
<!-- Copyright 2018 Tecnativa - Carlos Dauden
|
<!-- Copyright 2018 Tecnativa - Carlos Dauden
|
||||||
Copyright 2019 Tecnativa - Pedro M. Baeza
|
Copyright 2019 Tecnativa - Pedro M. Baeza
|
||||||
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
|
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
|
||||||
<odoo>
|
<odoo>
|
||||||
|
<record
|
||||||
<record id="contract_line_qty_formula_project_timesheet" model="contract.line.qty.formula">
|
id="contract_line_qty_formula_project_timesheet"
|
||||||
<field name='name'>Project Timesheets</field>
|
model="contract.line.qty.formula"
|
||||||
<field name="code">group = env['account.analytic.line'].read_group([
|
>
|
||||||
|
<field name='name'>Project Timesheets</field>
|
||||||
|
<field name="code">group = env['account.analytic.line'].read_group([
|
||||||
('account_id', '=', line.analytic_account_id.id),
|
('account_id', '=', line.analytic_account_id.id),
|
||||||
('product_id', '=', False),
|
('product_id', '=', False),
|
||||||
('project_id', '!=', False),
|
('project_id', '!=', False),
|
||||||
@@ -15,11 +17,13 @@
|
|||||||
], fields=['unit_amount'], groupby=[])
|
], fields=['unit_amount'], groupby=[])
|
||||||
result = group and group[0]['unit_amount'] or 0.0
|
result = group and group[0]['unit_amount'] or 0.0
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
<record
|
||||||
<record id="contract_line_qty_formula_task_timesheet" model="contract.line.qty.formula">
|
id="contract_line_qty_formula_task_timesheet"
|
||||||
<field name='name'>Task Timesheets</field>
|
model="contract.line.qty.formula"
|
||||||
<field name="code">group = env['account.analytic.line'].read_group([
|
>
|
||||||
|
<field name='name'>Task Timesheets</field>
|
||||||
|
<field name="code">group = env['account.analytic.line'].read_group([
|
||||||
('account_id', '=', line.analytic_account_id.id),
|
('account_id', '=', line.analytic_account_id.id),
|
||||||
('product_id', '=', False),
|
('product_id', '=', False),
|
||||||
('task_id', '!=', False),
|
('task_id', '!=', False),
|
||||||
@@ -28,11 +32,13 @@ result = group and group[0]['unit_amount'] or 0.0
|
|||||||
], fields=['unit_amount'], groupby=[])
|
], fields=['unit_amount'], groupby=[])
|
||||||
result = group and group[0]['unit_amount'] or 0.0
|
result = group and group[0]['unit_amount'] or 0.0
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
<record
|
||||||
<record id="contract_line_qty_formula_analytic_same_product" model="contract.line.qty.formula">
|
id="contract_line_qty_formula_analytic_same_product"
|
||||||
<field name='name'>Analytic Same Product</field>
|
model="contract.line.qty.formula"
|
||||||
<field name="code">group = env['account.analytic.line'].read_group([
|
>
|
||||||
|
<field name='name'>Analytic Same Product</field>
|
||||||
|
<field name="code">group = env['account.analytic.line'].read_group([
|
||||||
('account_id', '=', line.analytic_account_id.id),
|
('account_id', '=', line.analytic_account_id.id),
|
||||||
('product_id', '=', line.product_id.id),
|
('product_id', '=', line.product_id.id),
|
||||||
('date', '>=', period_first_date),
|
('date', '>=', period_first_date),
|
||||||
@@ -40,6 +46,5 @@ result = group and group[0]['unit_amount'] or 0.0
|
|||||||
], fields=['unit_amount'], groupby=[])
|
], fields=['unit_amount'], groupby=[])
|
||||||
result = group and group[0]['unit_amount'] or 0.0
|
result = group and group[0]['unit_amount'] or 0.0
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|||||||
@@ -9,88 +9,82 @@ class TestContractVariableQtyTimesheet(common.SavepointCase):
|
|||||||
@classmethod
|
@classmethod
|
||||||
def setUpClass(cls):
|
def setUpClass(cls):
|
||||||
super().setUpClass()
|
super().setUpClass()
|
||||||
cls.partner = cls.env['res.partner'].create({'name': 'Test partner'})
|
cls.partner = cls.env["res.partner"].create({"name": "Test partner"})
|
||||||
cls.analytic_account = cls.env['account.analytic.account'].create({
|
cls.analytic_account = cls.env["account.analytic.account"].create(
|
||||||
'name': 'Test analytic account'})
|
{"name": "Test analytic account"}
|
||||||
cls.contract = cls.env['contract.contract'].create({
|
)
|
||||||
'name': 'Test contract',
|
cls.contract = cls.env["contract.contract"].create(
|
||||||
'partner_id': cls.partner.id})
|
{"name": "Test contract", "partner_id": cls.partner.id}
|
||||||
cls.product = cls.env['product.product'].create({
|
)
|
||||||
'name': 'Test product'})
|
cls.product = cls.env["product.product"].create({"name": "Test product"})
|
||||||
contract_line_vals = {
|
contract_line_vals = {
|
||||||
'contract_id': cls.contract.id,
|
"contract_id": cls.contract.id,
|
||||||
'analytic_account_id': cls.analytic_account.id,
|
"analytic_account_id": cls.analytic_account.id,
|
||||||
'product_id': cls.product.id,
|
"product_id": cls.product.id,
|
||||||
'uom_id': cls.product.uom_id.id,
|
"uom_id": cls.product.uom_id.id,
|
||||||
'name': 'Test line contract',
|
"name": "Test line contract",
|
||||||
'recurring_interval': 1,
|
"recurring_interval": 1,
|
||||||
'recurring_rule_type': 'monthly',
|
"recurring_rule_type": "monthly",
|
||||||
'recurring_invoicing_type': 'pre-paid',
|
"recurring_invoicing_type": "pre-paid",
|
||||||
'date_start': '2020-01-01',
|
"date_start": "2020-01-01",
|
||||||
'recurring_next_date': '2020-01-01',
|
"recurring_next_date": "2020-01-01",
|
||||||
'qty_type': 'variable',
|
"qty_type": "variable",
|
||||||
'qty_formula_id': cls.env.ref(
|
"qty_formula_id": cls.env.ref(
|
||||||
'contract_variable_qty_timesheet.'
|
"contract_variable_qty_timesheet."
|
||||||
'contract_line_qty_formula_project_timesheet').id,
|
"contract_line_qty_formula_project_timesheet"
|
||||||
|
).id,
|
||||||
}
|
}
|
||||||
cls.contract_line = cls.env['contract.line'].create(
|
cls.contract_line = cls.env["contract.line"].create(contract_line_vals)
|
||||||
contract_line_vals)
|
cls.project = cls.env["project.project"].create(
|
||||||
cls.project = cls.env['project.project'].create({
|
{"name": "Test project", "analytic_account_id": cls.analytic_account.id,}
|
||||||
'name': 'Test project',
|
)
|
||||||
'analytic_account_id': cls.analytic_account.id,
|
cls.task = cls.env["project.task"].create(
|
||||||
})
|
{"project_id": cls.project.id, "name": "Test task",}
|
||||||
cls.task = cls.env['project.task'].create({
|
)
|
||||||
'project_id': cls.project.id,
|
|
||||||
'name': 'Test task',
|
|
||||||
})
|
|
||||||
|
|
||||||
def _contract_invoicing(self, contract):
|
def _contract_invoicing(self, contract):
|
||||||
date_ref = fields.Date.from_string('2020-01-01')
|
date_ref = fields.Date.from_string("2020-01-01")
|
||||||
contract._recurring_create_invoice(date_ref)
|
contract._recurring_create_invoice(date_ref)
|
||||||
return contract._get_related_invoices()
|
return contract._get_related_invoices()
|
||||||
|
|
||||||
def _create_analytic_line(self, project, task, date, product, unit_amount):
|
def _create_analytic_line(self, project, task, date, product, unit_amount):
|
||||||
return self.env['account.analytic.line'].create({
|
return self.env["account.analytic.line"].create(
|
||||||
'account_id': self.analytic_account.id,
|
{
|
||||||
'project_id': project and project.id,
|
"account_id": self.analytic_account.id,
|
||||||
'task_id': task and task.id,
|
"project_id": project and project.id,
|
||||||
'name': 'Test %s %s' % (date, unit_amount),
|
"task_id": task and task.id,
|
||||||
'date': date,
|
"name": "Test {} {}".format(date, unit_amount),
|
||||||
'product_id': product and product.id,
|
"date": date,
|
||||||
'unit_amount': unit_amount,
|
"product_id": product and product.id,
|
||||||
})
|
"unit_amount": unit_amount,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
def test_project_timesheet(self):
|
def test_project_timesheet(self):
|
||||||
self._create_analytic_line(
|
self._create_analytic_line(self.project, self.task, "2020-01-01", False, 3)
|
||||||
self.project, self.task, '2020-01-01', False, 3)
|
self._create_analytic_line(False, False, "2020-01-01", False, 1)
|
||||||
self._create_analytic_line(
|
|
||||||
False, False, '2020-01-01', False, 1)
|
|
||||||
invoice = self._contract_invoicing(self.contract)
|
invoice = self._contract_invoicing(self.contract)
|
||||||
self.assertEqual(len(invoice.invoice_line_ids), 1)
|
self.assertEqual(len(invoice.invoice_line_ids), 1)
|
||||||
self.assertAlmostEqual(invoice.invoice_line_ids.quantity, 3)
|
self.assertAlmostEqual(invoice.invoice_line_ids.quantity, 3)
|
||||||
|
|
||||||
def test_task_timesheet(self):
|
def test_task_timesheet(self):
|
||||||
self.contract_line.qty_formula_id = self.env.ref(
|
self.contract_line.qty_formula_id = self.env.ref(
|
||||||
'contract_variable_qty_timesheet.'
|
"contract_variable_qty_timesheet."
|
||||||
'contract_line_qty_formula_task_timesheet'
|
"contract_line_qty_formula_task_timesheet"
|
||||||
).id
|
).id
|
||||||
self._create_analytic_line(
|
self._create_analytic_line(self.project, self.task, "2020-01-01", False, 3)
|
||||||
self.project, self.task, '2020-01-01', False, 3)
|
self._create_analytic_line(self.project, False, "2020-01-01", False, 1)
|
||||||
self._create_analytic_line(
|
|
||||||
self.project, False, '2020-01-01', False, 1)
|
|
||||||
invoice = self._contract_invoicing(self.contract)
|
invoice = self._contract_invoicing(self.contract)
|
||||||
self.assertEqual(len(invoice.invoice_line_ids), 1)
|
self.assertEqual(len(invoice.invoice_line_ids), 1)
|
||||||
self.assertAlmostEqual(invoice.invoice_line_ids.quantity, 3)
|
self.assertAlmostEqual(invoice.invoice_line_ids.quantity, 3)
|
||||||
|
|
||||||
def test_same_product(self):
|
def test_same_product(self):
|
||||||
self.contract_line.qty_formula_id = self.env.ref(
|
self.contract_line.qty_formula_id = self.env.ref(
|
||||||
'contract_variable_qty_timesheet.'
|
"contract_variable_qty_timesheet."
|
||||||
'contract_line_qty_formula_analytic_same_product'
|
"contract_line_qty_formula_analytic_same_product"
|
||||||
).id
|
).id
|
||||||
self._create_analytic_line(
|
self._create_analytic_line(False, False, "2020-01-01", self.product, 3)
|
||||||
False, False, '2020-01-01', self.product, 3)
|
self._create_analytic_line(self.project, False, "2020-01-01", False, 1)
|
||||||
self._create_analytic_line(
|
|
||||||
self.project, False, '2020-01-01', False, 1)
|
|
||||||
invoice = self._contract_invoicing(self.contract)
|
invoice = self._contract_invoicing(self.contract)
|
||||||
self.assertEqual(len(invoice.invoice_line_ids), 1)
|
self.assertEqual(len(invoice.invoice_line_ids), 1)
|
||||||
self.assertAlmostEqual(invoice.invoice_line_ids.quantity, 3)
|
self.assertAlmostEqual(invoice.invoice_line_ids.quantity, 3)
|
||||||
|
|||||||
Reference in New Issue
Block a user