From ad33de7e26d8fd289fe4aa691391c257336dc1c7 Mon Sep 17 00:00:00 2001 From: laxmanhalaki Date: Fri, 6 Mar 2026 19:36:55 +0530 Subject: [PATCH] schemaenhanced and tried to fill the gaps --- src/App.tsx | 6 +- src/api/API.ts | 14 + .../applications/ApplicationDetails.tsx | 172 ++++++- .../applications/NonOpportunitiesPage.tsx | 260 ++++++++++ .../applications/ResignationDetails.tsx | 312 +++++++++--- .../applications/TerminationDetails.tsx | 463 +++++++++++++----- .../UnopportunityRequestsPage.tsx | 260 ---------- src/components/applications/WorkNotesPage.tsx | 58 ++- src/components/layout/Sidebar.tsx | 2 +- src/lib/mock-data.ts | 20 +- src/services/onboarding.service.ts | 18 + src/services/resignation.service.ts | 22 + src/services/termination.service.ts | 31 ++ 13 files changed, 1136 insertions(+), 502 deletions(-) create mode 100644 src/components/applications/NonOpportunitiesPage.tsx delete mode 100644 src/components/applications/UnopportunityRequestsPage.tsx create mode 100644 src/services/resignation.service.ts create mode 100644 src/services/termination.service.ts diff --git a/src/App.tsx b/src/App.tsx index afe1d00..a7d5e6e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -17,7 +17,7 @@ import { ProspectiveDashboardPage } from './components/dashboard/ProspectiveDash import { ApplicationsPage } from './components/applications/ApplicationsPage'; import { AllApplicationsPage } from './components/applications/AllApplicationsPage'; import { OpportunityRequestsPage } from './components/applications/OpportunityRequestsPage'; -import { UnopportunityRequestsPage } from './components/applications/UnopportunityRequestsPage'; +import { NonOpportunitiesPage } from './components/applications/NonOpportunitiesPage'; import { ApplicationDetails } from './components/applications/ApplicationDetails'; import { ResignationPage } from './components/applications/ResignationPage'; import { TerminationPage } from './components/applications/TerminationPage'; @@ -127,7 +127,7 @@ export default function App() { '/applications': 'Dealership Requests', '/all-applications': 'All Applications', '/opportunity-requests': 'Opportunity Requests', - '/unopportunity-requests': 'Unopportunity Requests', + '/non-opportunities': 'Non-opportunities', '/tasks': 'My Tasks', '/reports': 'Reports & Analytics', '/settings': 'Settings', @@ -222,7 +222,7 @@ export default function App() { {/* Admin/Lead Routes */} navigate(`/applications/${id}`)} />} /> - navigate(`/applications/${id}`)} />} /> + navigate(`/applications/${id}`)} />} /> {/* Other Modules */} } /> diff --git a/src/api/API.ts b/src/api/API.ts index 087ea57..90cff94 100644 --- a/src/api/API.ts +++ b/src/api/API.ts @@ -34,6 +34,8 @@ export const API = { submitQuestionnaireResponse: (data: any) => client.post('/questionnaire/response', data), getAllQuestionnaires: () => client.get('/onboarding/questionnaires'), getQuestionnaireById: (id: string) => client.get(`/onboarding/questionnaires/${id}`), + assignArchitectureTeam: (applicationId: string, assignedTo: string) => client.post(`/onboarding/applications/${applicationId}/assign-architecture`, { assignedTo }), + updateArchitectureStatus: (applicationId: string, status: string, remarks?: string) => client.post(`/onboarding/applications/${applicationId}/architecture-status`, { status, remarks }), // Documents uploadDocument: (id: string, data: any) => client.post(`/onboarding/applications/${id}/documents`, data, { @@ -86,6 +88,18 @@ export const API = { // Prospective Login sendOtp: (phone: string) => client.post('/prospective-login/send-otp', { phone }), verifyOtp: (phone: string, otp: string) => client.post('/prospective-login/verify-otp', { phone, otp }), + // Resignation + getResignationById: (id: string) => client.get(`/resignation/${id}`), + updateClearance: (id: string, data: any) => client.post(`/resignation/${id}/clearance`, data), + + // Termination + getTerminationById: (id: string) => client.get(`/termination/${id}`), + updateTerminationStatus: (id: string, data: any) => client.post(`/termination/${id}/status`, data), + issueSCN: (id: string, data: any) => client.post(`/termination/${id}/scn`, data), + uploadSCNResponse: (id: string, data: any) => client.post(`/termination/${id}/scn-response`, data, { + headers: { 'Content-Type': 'multipart/form-data' } + }), + finalizeTermination: (id: string, data: any) => client.post(`/termination/${id}/finalize`, data), }; export default API; diff --git a/src/components/applications/ApplicationDetails.tsx b/src/components/applications/ApplicationDetails.tsx index b62cee4..0956bd4 100644 --- a/src/components/applications/ApplicationDetails.tsx +++ b/src/components/applications/ApplicationDetails.tsx @@ -382,6 +382,13 @@ export function ApplicationDetails() { const [scheduledInterviewParticipants, setScheduledInterviewParticipants] = useState([]); const [interviews, setInterviews] = useState([]); const [isScheduling, setIsScheduling] = useState(false); + const [showAssignArchitectureModal, setShowAssignArchitectureModal] = useState(false); + const [architectureLeadId, setArchitectureLeadId] = useState(''); + const [isAssigningArchitecture, setIsAssigningArchitecture] = useState(false); + const [showArchitectureStatusModal, setShowArchitectureStatusModal] = useState(false); + const [architectureStatus, setArchitectureStatus] = useState('COMPLETED'); + const [architectureRemarks, setArchitectureRemarks] = useState(''); + const [isUpdatingArchitecture, setIsUpdatingArchitecture] = useState(false); // KT Matrix State const [ktMatrixScores, setKtMatrixScores] = useState>({}); @@ -1123,6 +1130,38 @@ export function ApplicationDetails() { setRejectionReason(''); }; + const handleAssignArchitecture = async () => { + if (!architectureLeadId) { + alert('Please select an architecture lead'); + return; + } + try { + setIsAssigningArchitecture(true); + await onboardingService.assignArchitectureTeam(applicationId!, architectureLeadId); + toast.success('Architecture team assigned successfully'); + setShowAssignArchitectureModal(false); + fetchApplication(); // Refresh to update status + } catch (error) { + toast.error('Failed to assign architecture team'); + } finally { + setIsAssigningArchitecture(false); + } + }; + + const handleUpdateArchitectureStatus = async () => { + try { + setIsUpdatingArchitecture(true); + await onboardingService.updateArchitectureStatus(applicationId!, architectureStatus, architectureRemarks); + toast.success('Architecture status updated successfully'); + setShowArchitectureStatusModal(false); + fetchApplication(); + } catch (error) { + toast.error('Failed to update architecture status'); + } finally { + setIsUpdatingArchitecture(false); + } + }; + const handleWorkNote = () => { if (!workNote.trim()) { alert('Please enter a note'); @@ -1367,7 +1406,7 @@ export function ApplicationDetails() { {/* Tabs Section */} {/* Only show tabs for shortlisted applications (opportunity requests and regular dealership requests) */} - {/* Hide tabs for unopportunity requests (lead generation) */} + {/* Hide tabs for non-opportunity requests (lead generation) */} {application.isShortlisted !== false && ( @@ -1939,7 +1978,7 @@ export function ApplicationDetails() { {/* Actions Card */} {/* Only show Actions card for shortlisted applications (opportunity requests and regular dealership requests) */} - {/* Hide Actions for unopportunity requests (lead generation) - these are read-only records */} + {/* Hide Actions for non-opportunity requests (lead generation) - these are read-only records */} {application.isShortlisted !== false && ( @@ -2002,6 +2041,28 @@ export function ApplicationDetails() { )} + {currentUser && ['DD Admin', 'Super Admin'].includes(currentUser.role) && application.status === 'Dealer Code Generation' && ( + + )} + + {((currentUser && currentUser.id === application.architectureAssignedTo) || (currentUser && ['DD Admin', 'Super Admin'].includes(currentUser.role))) && + application.architectureStatus === 'IN_PROGRESS' && ( + + )} + {/* Show Interview Feedback only if active interview exists AND feedback NOT submitted */} {activeInterviewForUser && !hasSubmittedFeedback && ( @@ -2099,7 +2160,7 @@ export function ApplicationDetails() { {/* Work Notes Chat */} {/* Only show Work Notes card for shortlisted applications (opportunity requests and regular dealership requests) */} - {/* Hide Work Notes for unopportunity requests (lead generation) - no workflow tracking needed */} + {/* Hide Work Notes for non-opportunity requests (lead generation) - no workflow tracking needed */} { application.isShortlisted !== false && ( @@ -2395,6 +2456,111 @@ export function ApplicationDetails() { + {/* Assign Architecture Team Modal */} + + + + Assign Architecture Team + + Select an architecture team lead for site planning and blueprints. + + +
+
+ + +
+
+ + +
+
+
+
+ + {/* Architecture Status Modal */} + + + + Update Architecture Status + + Mark the architectural work as completed and optionally add remarks. + + +
+
+ + +
+
+ +