espace-paie-odentas/app/api/staff/payslips/check-existing/route.ts
odentas dd570d4509 feat: Améliorations majeures des contrats et fiches de paie
- Ajout détails cachets/répétitions/heures au modal ContractDetails
- Card verte avec validation quand tous les contrats ont une fiche de paie
- Système complet de création de fiches de paie avec recherche et vérification
- Modal liste des contrats sans paie avec création directe
- Amélioration édition dates dans PayslipDetailsModal
- Optimisation recherche contrats (ordre des filtres)
- Augmentation limite pagination ContractsGrid à 200
- Ajout logs debug génération PDF logo
- Script SQL vérification cohérence structure/organisation
2025-11-27 20:31:11 +01:00

100 lines
3.1 KiB
TypeScript

// app/api/staff/payslips/check-existing/route.ts
import { createSbServer } from "@/lib/supabaseServer";
import { NextRequest, NextResponse } from "next/server";
export async function GET(request: NextRequest) {
try {
const sb = createSbServer();
// Vérifier l'authentification
const { data: { user } } = await sb.auth.getUser();
if (!user) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}
// Vérifier que c'est un staff
const { data: me } = await sb
.from("staff_users")
.select("is_staff")
.eq("user_id", user.id)
.maybeSingle();
if (!me?.is_staff) {
return NextResponse.json({ error: "Forbidden" }, { status: 403 });
}
const searchParams = request.nextUrl.searchParams;
const contractId = searchParams.get("contract_id");
if (!contractId) {
return NextResponse.json({ error: "contract_id requis" }, { status: 400 });
}
// Récupérer le contrat pour vérifier s'il est mono-mois
const { data: contract, error: contractError } = await sb
.from("cddu_contracts")
.select("start_date, end_date")
.eq("id", contractId)
.single();
if (contractError || !contract) {
return NextResponse.json({ error: "Contrat non trouvé" }, { status: 404 });
}
// Déterminer si le contrat est mono-mois
const contractStartDate = new Date(contract.start_date);
const contractEndDate = new Date(contract.end_date);
const isMultiMonth = contractStartDate.getMonth() !== contractEndDate.getMonth() ||
contractStartDate.getFullYear() !== contractEndDate.getFullYear();
console.log("[GET /api/staff/payslips/check-existing] Contract:", {
contractId,
start_date: contract.start_date,
end_date: contract.end_date,
isMultiMonth
});
// Si le contrat est multi-mois, pas besoin de bloquer
if (isMultiMonth) {
return NextResponse.json({
has_existing: false,
is_multi_month: true
});
}
// Vérifier si une paie existe déjà pour ce contrat mono-mois
const { data: payslips, error } = await sb
.from("payslips")
.select("id, period_month")
.eq("contract_id", contractId)
.limit(1);
if (error) {
console.error("[GET /api/staff/payslips/check-existing] Database error:", error);
return NextResponse.json({ error: "Database error" }, { status: 500 });
}
const hasExisting = payslips && payslips.length > 0;
if (hasExisting) {
const monthYear = new Date(payslips[0].period_month).toLocaleDateString('fr-FR', {
month: 'long',
year: 'numeric'
});
return NextResponse.json({
has_existing: true,
is_multi_month: false,
message: `Une fiche de paie existe déjà pour ce contrat mono-mois (${monthYear})`
});
}
return NextResponse.json({
has_existing: false,
is_multi_month: false
});
} catch (error) {
console.error("[GET /api/staff/payslips/check-existing] Error:", error);
return NextResponse.json({ error: "Internal server error" }, { status: 500 });
}
}