Correction code employeur mail nouveau salarié et ajout glisser-deposer auto-correction
This commit is contained in:
parent
24adff88d5
commit
103d8fa939
2 changed files with 89 additions and 21 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue