1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- # -*- coding: utf-8 -*-
- # Part of Odoo. See LICENSE file for full copyright and licensing details.
- from datetime import timedelta
- from odoo.addons.account.tests.common import AccountTestInvoicingCommon
- from odoo.addons.mail.tests.common import MailCase
- from odoo.tests import tagged, Form, new_test_user
- from odoo.tools import mute_logger, format_amount
- from odoo import fields
- @tagged('-at_install', 'post_install')
- class TestPurchaseDashboard(AccountTestInvoicingCommon, MailCase):
- @classmethod
- def setUpClass(cls, chart_template_ref=None):
- super().setUpClass(chart_template_ref=chart_template_ref)
- # Create two new users
- cls.user_a = new_test_user(cls.env, login='purchaseusera', groups='purchase.group_purchase_user')
- cls.user_b = new_test_user(cls.env, login='purchaseuserb', groups='purchase.group_purchase_user')
- # Create two products.
- product_data = {
- 'name': 'SuperProduct',
- 'type': 'consu',
- }
- cls.product_100 = cls.env['product.product'].create({**product_data, 'standard_price': 100})
- cls.product_250 = cls.env['product.product'].create({**product_data, 'standard_price': 250})
- @mute_logger('odoo.addons.mail.models.mail_mail')
- def test_purchase_dashboard(self):
- '''
- Test purchase dashboard values with multiple users.
- '''
- # Create 3 Request for Quotations with lines.
- rfqs = self.env['purchase.order'].create([{
- 'partner_id': self.partner_a.id,
- 'company_id': self.user_a.company_id.id,
- 'currency_id': self.user_a.company_id.currency_id.id,
- 'date_order': fields.Date.today(),
- } for i in range(3)])
- for rfq, qty in zip(rfqs, [1, 2, 3]):
- rfq_form = Form(rfq)
- with rfq_form.order_line.new() as line_1:
- line_1.product_id = self.product_100
- line_1.product_qty = qty
- with rfq_form.order_line.new() as line_2:
- line_2.product_id = self.product_250
- line_2.product_qty = qty
- rfq_form.save()
- # Create 1 late RFQ without line.
- self.env['purchase.order'].create([{
- 'partner_id': self.partner_a.id,
- 'company_id': self.user_a.company_id.id,
- 'currency_id': self.user_a.company_id.currency_id.id,
- 'date_order': fields.Date.today() - timedelta(days=7)
- }])
- # Create 1 draft RFQ for user A.
- self.env['purchase.order'].with_user(self.user_a).create([{
- 'partner_id': self.partner_a.id,
- 'company_id': self.user_a.company_id.id,
- 'currency_id': self.user_a.company_id.currency_id.id,
- 'date_order': fields.Date().today() + timedelta(days=7)
- }])
- self.flush_tracking()
- with self.mock_mail_gateway():
- rfqs[0].with_user(self.user_a).write({'state': 'sent'})
- self.flush_tracking()
- # Sanity checks for rfq state.
- self.assertEqual(rfqs[0].state, 'sent')
- with self.mock_mail_gateway():
- rfqs[1].with_user(self.user_b).write({'state': 'sent'})
- self.flush_tracking()
- self.assertEqual(rfqs[1].state, 'sent')
- # Confirm Orders with lines.
- rfqs.button_confirm()
- # Retrieve dashboard as User A to check 'my_{to_send, waiting, late}' values.
- dashboard_result = rfqs.with_user(self.user_a).retrieve_dashboard()
- # Check dashboard values
- currency_id = self.env.company.currency_id
- zero_value_keys = ['all_waiting', 'my_waiting', 'my_late']
- self.assertListEqual([dashboard_result[key] for key in zero_value_keys], [0]*len(zero_value_keys))
- self.assertEqual(dashboard_result['all_to_send'], 2)
- self.assertEqual(dashboard_result['my_to_send'], 1)
- self.assertEqual(dashboard_result['all_late'], 1)
- self.assertEqual(dashboard_result['all_avg_order_value'], format_amount(self.env, self.tax_purchase_a.compute_all(700.0)['total_included'], currency_id))
- self.assertEqual(dashboard_result['all_avg_days_to_purchase'], 0)
- self.assertEqual(dashboard_result['all_total_last_7_days'], format_amount(self.env, self.tax_purchase_a.compute_all(2100.0)['total_included'], currency_id))
- self.assertEqual(dashboard_result['all_sent_rfqs'], 2)
|