feat: Ajouter colonne Analytique et renommer colonnes montants (B, NPAS, NP, CE) dans staff/payslips

This commit is contained in:
odentas 2025-12-23 14:42:47 +01:00
parent a24b8dfb09
commit dd02cde85c
3 changed files with 28 additions and 10 deletions

View file

@ -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))
)`

View file

@ -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();

View file

@ -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
<th className="text-left px-3 py-2 cursor-pointer" onClick={() => { setSortField('contract_number'); setSortOrder((o) => o === 'asc' ? 'desc' : 'asc'); }}>
N° contrat {sortField === 'contract_number' ? (sortOrder === 'asc' ? '▲' : '▼') : ''}
</th>
<th className="text-left px-3 py-2 cursor-pointer" onClick={() => { setSortField('analytique'); setSortOrder((o) => o === 'asc' ? 'desc' : 'asc'); }}>
Analytique {sortField === 'analytique' ? (sortOrder === 'asc' ? '▲' : '▼') : ''}
</th>
<th className="text-left px-3 py-2 cursor-pointer" onClick={() => { setSortField('pay_number'); setSortOrder((o) => o === 'asc' ? 'desc' : 'asc'); }}>
N° Paie {sortField === 'pay_number' ? (sortOrder === 'asc' ? '▲' : '▼') : ''}
</th>
@ -1055,20 +1063,20 @@ export default function PayslipsGrid({ initialData, activeOrgId }: { initialData
Période {sortField === 'period_start' ? (sortOrder === 'asc' ? '▲' : '▼') : ''}
</th>
<th className="text-right px-3 py-2 cursor-pointer" onClick={() => { setSortField('gross_amount'); setSortOrder((o) => o === 'asc' ? 'desc' : 'asc'); }}>
Brut {sortField === 'gross_amount' ? (sortOrder === 'asc' ? '▲' : '▼') : ''}
B {sortField === 'gross_amount' ? (sortOrder === 'asc' ? '▲' : '▼') : ''}
</th>
<th className="text-right px-3 py-2 cursor-pointer" onClick={() => { setSortField('net_amount'); setSortOrder((o) => o === 'asc' ? 'desc' : 'asc'); }}>
Net avant PAS {sortField === 'net_amount' ? (sortOrder === 'asc' ? '▲' : '▼') : ''}
NPAS {sortField === 'net_amount' ? (sortOrder === 'asc' ? '▲' : '▼') : ''}
</th>
<th className="text-right px-3 py-2 cursor-pointer" onClick={() => { 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' ? '▲' : '▼') : ''}
</th>
<th className="text-right px-3 py-2 cursor-pointer" onClick={() => { setSortField('employer_cost'); setSortOrder((o) => o === 'asc' ? 'desc' : 'asc'); }}>
Coût employeur {sortField === 'employer_cost' ? (sortOrder === 'asc' ? '▲' : '▼') : ''}
CE {sortField === 'employer_cost' ? (sortOrder === 'asc' ? '▲' : '▼') : ''}
</th>
</tr>
<tr className="bg-indigo-50 border-t border-slate-200 font-semibold">
<td className="px-3 py-2" colSpan={9}>
<td className="px-3 py-2" colSpan={10}>
<span className="text-slate-700">
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' : ''}`})
</span>
@ -1155,6 +1163,7 @@ export default function PayslipsGrid({ initialData, activeOrgId }: { initialData
>
{r.cddu_contracts?.contract_number || "—"}
</td>
<td className="px-3 py-2">{r.cddu_contracts?.analytique || "—"}</td>
<td className="px-3 py-2">{r.pay_number ?? "—"}</td>
<td className="px-3 py-2">{formatEmployeeName(r)}</td>
<td className="px-3 py-2">