self.assertEqual(sale_order.invoice_status,'to invoice','Sale Timesheet: Adding a new service line (so line) should put the SO in "to invocie" state.')
self.assertEqual(sale_order.tasks_count,2,"Two tasks (1 per SO line) should have been created on SO confirmation")
self.assertEqual(len(sale_order.invoice_ids),2,"A second invoice should have been created from the SO")
self.assertTrue(float_is_zero(invoice.amount_total-so_line_ordered_task_new_project.price_unit*3,precision_digits=2),'Sale: invoice generation on timesheets product is wrong')
self.assertEqual(sale_order.project_project_id,task_serv3.project_id,"When creating task in new project, the task should be in SO project (if already exists), otherwise it created one.")
deftest_timesheet_delivery(self):
""" Test timesheet invoicing with 'invoice on delivery' timetracked products
self.assertEqual(task_serv2.project_id,self.project_global,"Sale Timesheet: task should be created in global project")
self.assertTrue(task_serv2,"Sale Timesheet: on SO confirmation, a task should have been created in global project")
self.assertTrue(task_serv3,"Sale Timesheet: on SO confirmation, a task should have been created in a new project")
self.assertEqual(sale_order.invoice_status,'no','Sale Timesheet: "invoice on delivery" should not need to be invoiced on so confirmation')
self.assertEqual(sale_order.analytic_account_id,task_serv3.project_id.analytic_account_id,"SO should have create a project")
self.assertEqual(sale_order.tasks_count,2,"Two tasks (1 per SO line) should have been created on SO confirmation")
# let's log some timesheets
self.env['account.analytic.line'].create({
'name':'Test Line',
'project_id':task_serv2.project_id.id,# global project
'task_id':task_serv2.id,
'unit_amount':10.5,
'employee_id':self.employee_manager.id,
})
self.assertEqual(so_line_deliver_global_project.invoice_status,'to invoice','Sale Timesheet: "invoice on delivery" timesheets should set the so line in "to invoice" status when logged')
self.assertEqual(so_line_deliver_task_project.invoice_status,'no','Sale Timesheet: so line invoice status should not change when no timesheet linked to the line')
self.assertEqual(sale_order.invoice_status,'to invoice','Sale Timesheet: "invoice on delivery" timesheets should set the so in "to invoice" status when logged')
self.assertTrue(float_is_zero(invoice.amount_total-so_line_deliver_global_project.price_unit*10.5,precision_digits=2),'Sale: invoice generation on timesheets product is wrong')
# log some timesheets again
self.env['account.analytic.line'].create({
'name':'Test Line',
'project_id':task_serv2.project_id.id,# global project
'task_id':task_serv2.id,
'unit_amount':39.5,
'employee_id':self.employee_user.id,
})
self.assertEqual(so_line_deliver_global_project.invoice_status,'to invoice','Sale Timesheet: "invoice on delivery" timesheets should set the so line in "to invoice" status when logged')
self.assertEqual(so_line_deliver_task_project.invoice_status,'no','Sale Timesheet: so line invoice status should not change when no timesheet linked to the line')
self.assertEqual(sale_order.invoice_status,'to invoice','Sale Timesheet: "invoice on delivery" timesheets should not modify the invoice_status of the so')
# create a second invoice
sale_order.action_invoice_create()
self.assertEqual(so_line_deliver_global_project.invoice_status,'invoiced','Sale Timesheet: "invoice on delivery" timesheets should set the so line in "to invoice" status when logged')
self.assertEqual(sale_order.invoice_status,'no','Sale Timesheet: "invoice on delivery" timesheets should be invoiced completely by now')
self.assertEqual(sale_order.project_project_id,task_serv3.project_id,"SO should not have create a second project, since so line 3 already create one project for the SO")
# let's log some timesheets on the project
self.env['account.analytic.line'].create({
'name':'Test Line',
'project_id':sale_order.project_project_id.id,# global project
'unit_amount':7,
'employee_id':self.employee_user.id,
})
self.assertTrue(float_is_zero(so_line_deliver_only_project.qty_delivered,precision_digits=2),"Timesheeting on project should not incremented the delivered quantity on the SO line")
self.assertEqual(sale_order.invoice_status,'no','Sale Timesheet: "invoice on delivery" timesheets should be invoiced completely by now')
deftest_timesheet_manual(self):
""" Test timesheet invoicing with 'invoice on delivery' timetracked products
'project_id':sale_order.project_project_id.id,# global project
'unit_amount':3,
'employee_id':self.employee_manager.id,
})
self.assertEqual(so_line_manual_global_project.task_id.sale_line_id,so_line_manual_global_project,"Task from a milestone product should be linked to its SO line too")
self.assertEqual(timesheet1.timesheet_invoice_type,'billable_fixed',"Milestone timesheet goes in billable fixed category")
self.assertTrue(float_is_zero(so_line_manual_global_project.qty_delivered,precision_digits=2),"Milestone Timesheeting should not incremented the delivered quantity on the SO line")
self.assertEqual(so_line_manual_global_project.qty_to_invoice,0.0,"Manual service should not be affected by timesheet on their created task.")
self.assertEqual(so_line_manual_only_project.qty_to_invoice,0.0,"Manual service should not be affected by timesheet on their created project.")
self.assertEqual(sale_order.invoice_status,'no','Sale Timesheet: "invoice on delivery" should not need to be invoiced on so confirmation')