- 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
100 lines
3.1 KiB
TypeScript
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 });
|
|
}
|
|
}
|