From dd02cde85c7934d0b6c83e9646b669eb25023ef0 Mon Sep 17 00:00:00 2001 From: odentas Date: Tue, 23 Dec 2025 14:42:47 +0100 Subject: [PATCH] feat: Ajouter colonne Analytique et renommer colonnes montants (B, NPAS, NP, CE) dans staff/payslips --- app/(app)/staff/payslips/page.tsx | 2 +- app/api/staff/payslips/search/route.ts | 17 +++++++++++++---- components/staff/PayslipsGrid.tsx | 19 ++++++++++++++----- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/app/(app)/staff/payslips/page.tsx b/app/(app)/staff/payslips/page.tsx index bc9eff9..dba3f49 100644 --- a/app/(app)/staff/payslips/page.tsx +++ b/app/(app)/staff/payslips/page.tsx @@ -40,7 +40,7 @@ export default async function StaffPayslipsPage() { gross_amount, net_amount, net_after_withholding, employer_cost, processed, aem_status, transfer_done, organization_id, created_at, cddu_contracts!contract_id( - id, contract_number, employee_name, employee_id, structure, type_de_contrat, org_id, + id, contract_number, employee_name, employee_id, structure, type_de_contrat, org_id, analytique, salaries!employee_id(salarie, nom, prenom), organizations!org_id(organization_details(code_employeur)) )` diff --git a/app/api/staff/payslips/search/route.ts b/app/api/staff/payslips/search/route.ts index 6b19605..8a0ce16 100644 --- a/app/api/staff/payslips/search/route.ts +++ b/app/api/staff/payslips/search/route.ts @@ -51,7 +51,7 @@ export async function GET(req: NextRequest) { gross_amount, net_amount, net_after_withholding, employer_cost, processed, aem_status, transfer_done, organization_id, storage_path, created_at, cddu_contracts!contract_id( - id, contract_number, employee_name, employee_id, structure, type_de_contrat, org_id, + id, contract_number, employee_name, employee_id, structure, type_de_contrat, org_id, analytique, salaries!employee_id(salarie, nom, prenom), organizations!org_id(organization_details(code_employeur)) )`, @@ -106,7 +106,7 @@ export async function GET(req: NextRequest) { gross_amount, net_amount, net_after_withholding, employer_cost, processed, aem_status, transfer_done, organization_id, storage_path, created_at, cddu_contracts!contract_id( - id, contract_number, employee_name, employee_id, structure, type_de_contrat, org_id, + id, contract_number, employee_name, employee_id, structure, type_de_contrat, org_id, analytique, salaries!employee_id(salarie, nom, prenom), organizations!org_id(organization_details(code_employeur)) )`, @@ -162,6 +162,9 @@ export async function GET(req: NextRequest) { } else if (sort === 'structure') { valueA = a.cddu_contracts?.structure || ''; valueB = b.cddu_contracts?.structure || ''; + } else if (sort === 'analytique') { + valueA = a.cddu_contracts?.analytique || ''; + valueB = b.cddu_contracts?.analytique || ''; } else { valueA = a[sort]; valueB = b[sort]; @@ -206,7 +209,7 @@ export async function GET(req: NextRequest) { gross_amount, net_amount, net_after_withholding, employer_cost, processed, aem_status, transfer_done, organization_id, created_at, cddu_contracts!contract_id( - id, contract_number, employee_name, employee_id, structure, type_de_contrat, org_id, + id, contract_number, employee_name, employee_id, structure, type_de_contrat, org_id, analytique, salaries!employee_id(salarie, nom, prenom) )`, { count: "exact" } @@ -287,6 +290,9 @@ export async function GET(req: NextRequest) { } else if (sort === 'structure') { valueA = contractA?.structure || ''; valueB = contractB?.structure || ''; + } else if (sort === 'analytique') { + valueA = contractA?.analytique || ''; + valueB = contractB?.analytique || ''; } else { valueA = (a as any)[sort]; valueB = (b as any)[sort]; @@ -375,7 +381,7 @@ export async function GET(req: NextRequest) { // Si le tri est sur des champs de la jointure, on trie côté serveur let sortedPayslips = payslips || []; - if (sort === 'contract_number' || sort === 'employee_name' || sort === 'structure') { + if (sort === 'contract_number' || sort === 'employee_name' || sort === 'structure' || sort === 'analytique') { sortedPayslips = [...sortedPayslips].sort((a: any, b: any) => { let valueA: any; let valueB: any; @@ -389,6 +395,9 @@ export async function GET(req: NextRequest) { } else if (sort === 'structure') { valueA = a.cddu_contracts?.structure || ''; valueB = b.cddu_contracts?.structure || ''; + } else if (sort === 'analytique') { + valueA = a.cddu_contracts?.analytique || ''; + valueB = b.cddu_contracts?.analytique || ''; } if (typeof valueA === 'string') valueA = valueA.toLowerCase(); diff --git a/components/staff/PayslipsGrid.tsx b/components/staff/PayslipsGrid.tsx index 0c6274f..6141dab 100644 --- a/components/staff/PayslipsGrid.tsx +++ b/components/staff/PayslipsGrid.tsx @@ -126,6 +126,7 @@ type Payslip = { structure?: string | null; type_de_contrat?: string | null; org_id?: string | null; + analytique?: string | null; salaries?: { salarie?: string | null; nom?: string | null; @@ -591,6 +592,10 @@ export default function PayslipsGrid({ initialData, activeOrgId }: { initialData valueA = a.cddu_contracts?.structure || ''; valueB = b.cddu_contracts?.structure || ''; break; + case 'analytique': + valueA = a.cddu_contracts?.analytique || ''; + valueB = b.cddu_contracts?.analytique || ''; + break; default: valueA = a[field as keyof Payslip] || ''; valueB = b[field as keyof Payslip] || ''; @@ -1042,6 +1047,9 @@ export default function PayslipsGrid({ initialData, activeOrgId }: { initialData { setSortField('contract_number'); setSortOrder((o) => o === 'asc' ? 'desc' : 'asc'); }}> N° contrat {sortField === 'contract_number' ? (sortOrder === 'asc' ? '▲' : '▼') : ''} + { setSortField('analytique'); setSortOrder((o) => o === 'asc' ? 'desc' : 'asc'); }}> + Analytique {sortField === 'analytique' ? (sortOrder === 'asc' ? '▲' : '▼') : ''} + { setSortField('pay_number'); setSortOrder((o) => o === 'asc' ? 'desc' : 'asc'); }}> N° Paie {sortField === 'pay_number' ? (sortOrder === 'asc' ? '▲' : '▼') : ''} @@ -1055,20 +1063,20 @@ export default function PayslipsGrid({ initialData, activeOrgId }: { initialData Période {sortField === 'period_start' ? (sortOrder === 'asc' ? '▲' : '▼') : ''} { setSortField('gross_amount'); setSortOrder((o) => o === 'asc' ? 'desc' : 'asc'); }}> - Brut {sortField === 'gross_amount' ? (sortOrder === 'asc' ? '▲' : '▼') : ''} + B {sortField === 'gross_amount' ? (sortOrder === 'asc' ? '▲' : '▼') : ''} { setSortField('net_amount'); setSortOrder((o) => o === 'asc' ? 'desc' : 'asc'); }}> - Net avant PAS {sortField === 'net_amount' ? (sortOrder === 'asc' ? '▲' : '▼') : ''} + NPAS {sortField === 'net_amount' ? (sortOrder === 'asc' ? '▲' : '▼') : ''} { setSortField('net_after_withholding'); setSortOrder((o) => o === 'asc' ? 'desc' : 'asc'); }}> - Net à payer {sortField === 'net_after_withholding' ? (sortOrder === 'asc' ? '▲' : '▼') : ''} + NP {sortField === 'net_after_withholding' ? (sortOrder === 'asc' ? '▲' : '▼') : ''} { setSortField('employer_cost'); setSortOrder((o) => o === 'asc' ? 'desc' : 'asc'); }}> - Coût employeur {sortField === 'employer_cost' ? (sortOrder === 'asc' ? '▲' : '▼') : ''} + CE {sortField === 'employer_cost' ? (sortOrder === 'asc' ? '▲' : '▼') : ''} - + Totaux ({selectedPayslipIds.size > 0 ? `${selectedPayslipIds.size} ligne${selectedPayslipIds.size > 1 ? 's' : ''} sélectionnée${selectedPayslipIds.size > 1 ? 's' : ''}` : `${sortedRows.length} ligne${sortedRows.length > 1 ? 's' : ''}`}) @@ -1155,6 +1163,7 @@ export default function PayslipsGrid({ initialData, activeOrgId }: { initialData > {r.cddu_contracts?.contract_number || "—"} + {r.cddu_contracts?.analytique || "—"} {r.pay_number ?? "—"} {formatEmployeeName(r)}