feat: Ajouter colonne Analytique et renommer colonnes montants (B, NPAS, NP, CE) dans staff/payslips
This commit is contained in:
parent
a24b8dfb09
commit
dd02cde85c
3 changed files with 28 additions and 10 deletions
|
|
@ -40,7 +40,7 @@ export default async function StaffPayslipsPage() {
|
||||||
gross_amount, net_amount, net_after_withholding, employer_cost,
|
gross_amount, net_amount, net_after_withholding, employer_cost,
|
||||||
processed, aem_status, transfer_done, organization_id, created_at,
|
processed, aem_status, transfer_done, organization_id, created_at,
|
||||||
cddu_contracts!contract_id(
|
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),
|
salaries!employee_id(salarie, nom, prenom),
|
||||||
organizations!org_id(organization_details(code_employeur))
|
organizations!org_id(organization_details(code_employeur))
|
||||||
)`
|
)`
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ export async function GET(req: NextRequest) {
|
||||||
gross_amount, net_amount, net_after_withholding, employer_cost,
|
gross_amount, net_amount, net_after_withholding, employer_cost,
|
||||||
processed, aem_status, transfer_done, organization_id, storage_path, created_at,
|
processed, aem_status, transfer_done, organization_id, storage_path, created_at,
|
||||||
cddu_contracts!contract_id(
|
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),
|
salaries!employee_id(salarie, nom, prenom),
|
||||||
organizations!org_id(organization_details(code_employeur))
|
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,
|
gross_amount, net_amount, net_after_withholding, employer_cost,
|
||||||
processed, aem_status, transfer_done, organization_id, storage_path, created_at,
|
processed, aem_status, transfer_done, organization_id, storage_path, created_at,
|
||||||
cddu_contracts!contract_id(
|
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),
|
salaries!employee_id(salarie, nom, prenom),
|
||||||
organizations!org_id(organization_details(code_employeur))
|
organizations!org_id(organization_details(code_employeur))
|
||||||
)`,
|
)`,
|
||||||
|
|
@ -162,6 +162,9 @@ export async function GET(req: NextRequest) {
|
||||||
} else if (sort === 'structure') {
|
} else if (sort === 'structure') {
|
||||||
valueA = a.cddu_contracts?.structure || '';
|
valueA = a.cddu_contracts?.structure || '';
|
||||||
valueB = b.cddu_contracts?.structure || '';
|
valueB = b.cddu_contracts?.structure || '';
|
||||||
|
} else if (sort === 'analytique') {
|
||||||
|
valueA = a.cddu_contracts?.analytique || '';
|
||||||
|
valueB = b.cddu_contracts?.analytique || '';
|
||||||
} else {
|
} else {
|
||||||
valueA = a[sort];
|
valueA = a[sort];
|
||||||
valueB = b[sort];
|
valueB = b[sort];
|
||||||
|
|
@ -206,7 +209,7 @@ export async function GET(req: NextRequest) {
|
||||||
gross_amount, net_amount, net_after_withholding, employer_cost,
|
gross_amount, net_amount, net_after_withholding, employer_cost,
|
||||||
processed, aem_status, transfer_done, organization_id, created_at,
|
processed, aem_status, transfer_done, organization_id, created_at,
|
||||||
cddu_contracts!contract_id(
|
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)
|
salaries!employee_id(salarie, nom, prenom)
|
||||||
)`,
|
)`,
|
||||||
{ count: "exact" }
|
{ count: "exact" }
|
||||||
|
|
@ -287,6 +290,9 @@ export async function GET(req: NextRequest) {
|
||||||
} else if (sort === 'structure') {
|
} else if (sort === 'structure') {
|
||||||
valueA = contractA?.structure || '';
|
valueA = contractA?.structure || '';
|
||||||
valueB = contractB?.structure || '';
|
valueB = contractB?.structure || '';
|
||||||
|
} else if (sort === 'analytique') {
|
||||||
|
valueA = contractA?.analytique || '';
|
||||||
|
valueB = contractB?.analytique || '';
|
||||||
} else {
|
} else {
|
||||||
valueA = (a as any)[sort];
|
valueA = (a as any)[sort];
|
||||||
valueB = (b 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
|
// Si le tri est sur des champs de la jointure, on trie côté serveur
|
||||||
let sortedPayslips = payslips || [];
|
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) => {
|
sortedPayslips = [...sortedPayslips].sort((a: any, b: any) => {
|
||||||
let valueA: any;
|
let valueA: any;
|
||||||
let valueB: any;
|
let valueB: any;
|
||||||
|
|
@ -389,6 +395,9 @@ export async function GET(req: NextRequest) {
|
||||||
} else if (sort === 'structure') {
|
} else if (sort === 'structure') {
|
||||||
valueA = a.cddu_contracts?.structure || '';
|
valueA = a.cddu_contracts?.structure || '';
|
||||||
valueB = b.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();
|
if (typeof valueA === 'string') valueA = valueA.toLowerCase();
|
||||||
|
|
|
||||||
|
|
@ -126,6 +126,7 @@ type Payslip = {
|
||||||
structure?: string | null;
|
structure?: string | null;
|
||||||
type_de_contrat?: string | null;
|
type_de_contrat?: string | null;
|
||||||
org_id?: string | null;
|
org_id?: string | null;
|
||||||
|
analytique?: string | null;
|
||||||
salaries?: {
|
salaries?: {
|
||||||
salarie?: string | null;
|
salarie?: string | null;
|
||||||
nom?: string | null;
|
nom?: string | null;
|
||||||
|
|
@ -591,6 +592,10 @@ export default function PayslipsGrid({ initialData, activeOrgId }: { initialData
|
||||||
valueA = a.cddu_contracts?.structure || '';
|
valueA = a.cddu_contracts?.structure || '';
|
||||||
valueB = b.cddu_contracts?.structure || '';
|
valueB = b.cddu_contracts?.structure || '';
|
||||||
break;
|
break;
|
||||||
|
case 'analytique':
|
||||||
|
valueA = a.cddu_contracts?.analytique || '';
|
||||||
|
valueB = b.cddu_contracts?.analytique || '';
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
valueA = a[field as keyof Payslip] || '';
|
valueA = a[field as keyof Payslip] || '';
|
||||||
valueB = b[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'); }}>
|
<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' ? '▲' : '▼') : ''}
|
N° contrat {sortField === 'contract_number' ? (sortOrder === 'asc' ? '▲' : '▼') : ''}
|
||||||
</th>
|
</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'); }}>
|
<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' ? '▲' : '▼') : ''}
|
N° Paie {sortField === 'pay_number' ? (sortOrder === 'asc' ? '▲' : '▼') : ''}
|
||||||
</th>
|
</th>
|
||||||
|
|
@ -1055,20 +1063,20 @@ export default function PayslipsGrid({ initialData, activeOrgId }: { initialData
|
||||||
Période {sortField === 'period_start' ? (sortOrder === 'asc' ? '▲' : '▼') : ''}
|
Période {sortField === 'period_start' ? (sortOrder === 'asc' ? '▲' : '▼') : ''}
|
||||||
</th>
|
</th>
|
||||||
<th className="text-right px-3 py-2 cursor-pointer" onClick={() => { setSortField('gross_amount'); setSortOrder((o) => o === 'asc' ? 'desc' : 'asc'); }}>
|
<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>
|
||||||
<th className="text-right px-3 py-2 cursor-pointer" onClick={() => { setSortField('net_amount'); setSortOrder((o) => o === 'asc' ? 'desc' : 'asc'); }}>
|
<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>
|
||||||
<th className="text-right px-3 py-2 cursor-pointer" onClick={() => { setSortField('net_after_withholding'); setSortOrder((o) => o === 'asc' ? 'desc' : 'asc'); }}>
|
<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>
|
||||||
<th className="text-right px-3 py-2 cursor-pointer" onClick={() => { setSortField('employer_cost'); setSortOrder((o) => o === 'asc' ? 'desc' : 'asc'); }}>
|
<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>
|
</th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr className="bg-indigo-50 border-t border-slate-200 font-semibold">
|
<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">
|
<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' : ''}`})
|
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>
|
</span>
|
||||||
|
|
@ -1155,6 +1163,7 @@ export default function PayslipsGrid({ initialData, activeOrgId }: { initialData
|
||||||
>
|
>
|
||||||
{r.cddu_contracts?.contract_number || "—"}
|
{r.cddu_contracts?.contract_number || "—"}
|
||||||
</td>
|
</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">{r.pay_number ?? "—"}</td>
|
||||||
<td className="px-3 py-2">{formatEmployeeName(r)}</td>
|
<td className="px-3 py-2">{formatEmployeeName(r)}</td>
|
||||||
<td className="px-3 py-2">
|
<td className="px-3 py-2">
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue