Correction code employeur mail nouveau salarié et ajout glisser-deposer auto-correction

This commit is contained in:
Renaud 2025-10-12 20:32:32 +02:00
parent 24adff88d5
commit 103d8fa939
2 changed files with 89 additions and 21 deletions

View file

@ -184,14 +184,21 @@ export async function POST(req: NextRequest) {
if (orgId) {
try {
// Récupérer le code employeur depuis organization_details
const { data: orgDetailsData } = await supabase
const { data: orgDetailsData, error: orgDetailsError } = await supabase
.from('organization_details')
.select('code_employeur')
.eq('organization_id', orgId)
.eq('org_id', orgId)
.single();
console.log('🔍 [MATRICULE] Requête organization_details:', {
orgId,
orgDetailsData,
orgDetailsError,
hasCodeEmployeur: !!orgDetailsData?.code_employeur
});
const codeEmployeur = orgDetailsData?.code_employeur || '';
console.log('🔍 [MATRICULE] orgId:', orgId, 'code_employeur:', codeEmployeur);
console.log('🔍 [MATRICULE] code_employeur final:', codeEmployeur);
const { data: rows, error: qerr } = await supabase
.from('salaries')
@ -203,8 +210,9 @@ export async function POST(req: NextRequest) {
if (!qerr && Array.isArray(rows)) {
console.log('🔍 [MATRICULE] Nombre de salariés existants:', rows.length);
let maxNum = -Infinity;
let maxPrefix = '';
let detectedPrefix = '';
let maxPad = 0;
for (const r of rows) {
const s = (r?.code_salarie || '').toString();
const m = s.match(/(\d+)$/);
@ -213,17 +221,22 @@ export async function POST(req: NextRequest) {
const num = parseInt(numStr, 10);
if (!Number.isNaN(num) && num > maxNum) {
maxNum = num;
maxPrefix = s.slice(0, s.length - numStr.length);
detectedPrefix = s.slice(0, s.length - numStr.length);
maxPad = numStr.length;
}
}
}
if (maxNum !== -Infinity) {
// On a trouvé des matricules existants
const nextNum = maxNum + 1;
const padded = String(nextNum).padStart(maxPad, '0');
computedCode = `${maxPrefix}${padded}`;
const padded = String(nextNum).padStart(Math.max(maxPad, 3), '0');
// Utiliser le code employeur comme préfixe, même si les anciens n'en avaient pas
const prefix = codeEmployeur || detectedPrefix;
computedCode = `${prefix}${padded}`;
computedNum = nextNum;
console.log('✅ [MATRICULE] Incrémentation:', computedCode);
console.log('✅ [MATRICULE] Incrémentation:', computedCode, '(prefix utilisé:', prefix, 'prefix détecté:', detectedPrefix, ')');
} else {
// No existing numeric matricules found: use code_employeur as prefix
computedNum = 1;
@ -285,25 +298,27 @@ export async function POST(req: NextRequest) {
try {
const sbAuth = createSbServer();
const { data: { user } } = await sbAuth.auth.getUser();
let stafferName: string | null = null;
if (user) {
const { data: staffer } = await sbAuth.from('staff_users').select('name').eq('user_id', user.id).single();
if (staffer) {
stafferName = staffer.name;
}
}
// Récupérer les infos de l'organisation depuis les deux tables
const orgData = orgId ? await supabase.from('organizations').select('name').eq('id', orgId).single() : { data: null };
const orgDetailsData = orgId ? await supabase.from('organization_details').select('code_employeur').eq('organization_id', orgId).single() : { data: null };
const orgDetailsResult = orgId ? await supabase.from('organization_details').select('code_employeur, prenom_contact').eq('org_id', orgId).single() : { data: null, error: null };
console.log('🔍 [EMAIL] Données récupérées:', {
orgId,
orgData: orgData?.data,
orgDetailsData: 'data' in orgDetailsResult ? orgDetailsResult.data : null,
orgDetailsError: 'error' in orgDetailsResult ? orgDetailsResult.error : null
});
const orgDetails = {
data: orgData?.data ? {
name: orgData.data.name,
code_employeur: orgDetailsData?.data?.code_employeur || null
code_employeur: ('data' in orgDetailsResult && orgDetailsResult.data) ? orgDetailsResult.data.code_employeur || null : null,
prenom_contact: ('data' in orgDetailsResult && orgDetailsResult.data) ? orgDetailsResult.data.prenom_contact || null : null
} : null
};
console.log('🔍 [EMAIL] orgDetails final:', orgDetails);
// 1. Email de notification à l'équipe (existant)
if (user && orgDetails?.data) {
@ -312,9 +327,10 @@ export async function POST(req: NextRequest) {
type: 'employee-created',
toEmail: user.email || 'paie@odentas.fr', // Fallback
data: {
userName: stafferName || user.user_metadata?.name || 'Utilisateur',
userName: orgDetails.data.prenom_contact || user.user_metadata?.first_name || user.user_metadata?.display_name?.split(' ')[0] || 'Cher client',
companyName: orgDetails.data.name,
employerCode: orgDetails.data.code_employeur || 'N/A',
handlerName: 'Renaud BREVIERE-ABRAHAM',
employeeName: data.salarie,
email: data.adresse_mail,
matricule: data.code_salarie,

View file

@ -363,6 +363,48 @@ export default function AutoDeclarationPage() {
}) => {
const file = formData[type] as File | null;
const isUploading = uploading === type;
const [isDragging, setIsDragging] = useState(false);
const handleDragEnter = (e: React.DragEvent) => {
e.preventDefault();
e.stopPropagation();
if (!isUploading) {
setIsDragging(true);
}
};
const handleDragLeave = (e: React.DragEvent) => {
e.preventDefault();
e.stopPropagation();
setIsDragging(false);
};
const handleDragOver = (e: React.DragEvent) => {
e.preventDefault();
e.stopPropagation();
};
const handleDrop = (e: React.DragEvent) => {
e.preventDefault();
e.stopPropagation();
setIsDragging(false);
if (isUploading) return;
const files = e.dataTransfer.files;
if (files && files.length > 0) {
const droppedFile = files[0];
// Vérifier le type de fichier
const validTypes = ['.pdf', '.jpg', '.jpeg', '.png'];
const fileExtension = '.' + droppedFile.name.split('.').pop()?.toLowerCase();
if (validTypes.includes(fileExtension)) {
handleFileUpload(type, droppedFile);
} else {
toast.error('Type de fichier non autorisé. Utilisez PDF, JPG ou PNG.');
}
}
};
return (
<div className="space-y-2">
@ -386,7 +428,17 @@ export default function AutoDeclarationPage() {
</Button>
</div>
) : (
<div className="border-2 border-dashed border-gray-300 rounded-md p-6 text-center">
<div
className={`border-2 border-dashed rounded-md p-6 text-center transition-colors ${
isDragging
? 'border-blue-400 bg-blue-50'
: 'border-gray-300 bg-white'
}`}
onDragEnter={handleDragEnter}
onDragLeave={handleDragLeave}
onDragOver={handleDragOver}
onDrop={handleDrop}
>
<input
type="file"
id={`file-${type}`}
@ -408,7 +460,7 @@ export default function AutoDeclarationPage() {
<Upload className="h-8 w-8 text-gray-400 mb-2" />
)}
<span className="text-sm text-gray-600">
{isUploading ? 'Téléchargement...' : 'Choisir un fichier'}
{isUploading ? 'Téléchargement...' : isDragging ? 'Déposez le fichier ici' : 'Glissez un fichier ou cliquez pour choisir'}
</span>
<span className="text-xs text-gray-400 mt-1">
PDF, JPG, PNG (max 10MB)