diff --git a/fusion_plating/fusion_plating_portal/controllers/portal.py b/fusion_plating/fusion_plating_portal/controllers/portal.py index 49081645..ab557089 100644 --- a/fusion_plating/fusion_plating_portal/controllers/portal.py +++ b/fusion_plating/fusion_plating_portal/controllers/portal.py @@ -185,6 +185,20 @@ class FpCustomerPortal(CustomerPortal): ) invoice_count = Invoice.search_count(invoice_domain) + # Welcome-line summary counts (jobs-forward dashboard). + active_job_count = Job.search_count([ + ('partner_id', 'child_of', commercial.id), + ('state', 'in', ['received', 'in_progress', 'quality_check']), + ]) + awaiting_review_count = Quote.search_count([ + ('partner_id', 'child_of', commercial.id), + ('state', '=', 'quoted'), + ]) + ready_to_ship_count = Job.search_count([ + ('partner_id', 'child_of', commercial.id), + ('state', '=', 'ready_to_ship'), + ]) + values = { 'page_name': 'fp_dashboard', 'partner': partner, @@ -206,6 +220,10 @@ class FpCustomerPortal(CustomerPortal): # Invoices 'recent_invoices': recent_invoices, 'invoice_count': invoice_count, + # Welcome-line summary + 'active_job_count': active_job_count, + 'awaiting_review_count': awaiting_review_count, + 'ready_to_ship_count': ready_to_ship_count, } return request.render( 'fusion_plating_portal.fp_portal_home_dashboard', diff --git a/fusion_plating/fusion_plating_portal/tests/__init__.py b/fusion_plating/fusion_plating_portal/tests/__init__.py new file mode 100644 index 00000000..31c4afb1 --- /dev/null +++ b/fusion_plating/fusion_plating_portal/tests/__init__.py @@ -0,0 +1 @@ +from . import test_portal_dashboard diff --git a/fusion_plating/fusion_plating_portal/tests/test_portal_dashboard.py b/fusion_plating/fusion_plating_portal/tests/test_portal_dashboard.py new file mode 100644 index 00000000..220c9198 --- /dev/null +++ b/fusion_plating/fusion_plating_portal/tests/test_portal_dashboard.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +# Copyright 2026 Nexa Systems Inc. +# License OPL-1. + +from odoo.tests import TransactionCase, tagged + + +@tagged('post_install', '-at_install', 'fp_portal') +class TestPortalDashboard(TransactionCase): + """Welcome-line summary counts for the redesigned /my/home.""" + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.partner = cls.env['res.partner'].create({ + 'name': 'Test Customer Co.', + 'email': 'test@example.com', + }) + cls.portal_user = cls.env['res.users'].create({ + 'name': 'Portal Tester', + 'login': 'portal_tester', + 'partner_id': cls.partner.id, + 'group_ids': [(6, 0, [cls.env.ref('base.group_portal').id])], + }) + Job = cls.env['fusion.plating.portal.job'] + # 2 active, 1 ready_to_ship, 1 shipped (should not count as active) + cls.job_received = Job.create({ + 'name': 'WO-TEST-001', 'partner_id': cls.partner.id, 'state': 'received'}) + cls.job_in_progress = Job.create({ + 'name': 'WO-TEST-002', 'partner_id': cls.partner.id, 'state': 'in_progress'}) + cls.job_ready = Job.create({ + 'name': 'WO-TEST-003', 'partner_id': cls.partner.id, 'state': 'ready_to_ship'}) + cls.job_shipped = Job.create({ + 'name': 'WO-TEST-004', 'partner_id': cls.partner.id, 'state': 'shipped'}) + # 1 quoted RFQ (counts as awaiting_review), 1 new (does not count) + Quote = cls.env['fusion.plating.quote.request'] + cls.quote_quoted = Quote.create({ + 'name': 'QR-TEST-001', 'partner_id': cls.partner.id, 'state': 'quoted'}) + cls.quote_new = Quote.create({ + 'name': 'QR-TEST-002', 'partner_id': cls.partner.id, 'state': 'new'}) + + def test_welcome_counts_separates_active_from_ready_from_review(self): + """The 3 welcome-line numbers split correctly across states.""" + commercial = self.partner.commercial_partner_id + active = self.env['fusion.plating.portal.job'].search_count([ + ('partner_id', 'child_of', commercial.id), + ('state', 'in', ['received', 'in_progress', 'quality_check']), + ]) + awaiting_review = self.env['fusion.plating.quote.request'].search_count([ + ('partner_id', 'child_of', commercial.id), + ('state', '=', 'quoted'), + ]) + ready_to_ship = self.env['fusion.plating.portal.job'].search_count([ + ('partner_id', 'child_of', commercial.id), + ('state', '=', 'ready_to_ship'), + ]) + self.assertEqual(active, 2) + self.assertEqual(awaiting_review, 1) + self.assertEqual(ready_to_ship, 1)