fix: rpc function
This commit is contained in:
@@ -19,7 +19,6 @@ function AuthProvider({ children }) {
|
||||
|
||||
useEffect(() => {
|
||||
if (!supabase) {
|
||||
console.warn("Supabase no configurado - falta VITE_SUPABASE_ANON_KEY");
|
||||
setLoading(false);
|
||||
return;
|
||||
}
|
||||
|
||||
+8
-13
@@ -32,7 +32,7 @@ const convertBinaryToBlobUrl = (data) => {
|
||||
return URL.createObjectURL(blob);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error("Error convirtiendo formato binario a Blob URL:", e);
|
||||
// ignore
|
||||
}
|
||||
return null;
|
||||
};
|
||||
@@ -86,7 +86,6 @@ export default function IdCardGenerator() {
|
||||
setPhotoSrc(editedUrl);
|
||||
setPhotoFile(new File([editedBlob], file.name, { type: editedBlob.type || 'image/jpeg' }));
|
||||
} catch (error) {
|
||||
console.error('Error al procesar la foto con IA en n8n:', error);
|
||||
alert('No se pudo procesar la foto con IA. Se usará la foto original para la vista previa.');
|
||||
} finally {
|
||||
setPhotoProcessing(false);
|
||||
@@ -162,7 +161,6 @@ export default function IdCardGenerator() {
|
||||
const resData = await response.json();
|
||||
return Array.isArray(resData) ? resData : (resData.empleados || resData.data || []);
|
||||
} catch (error) {
|
||||
console.error('Error de comunicación con n8n:', error);
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
@@ -172,14 +170,16 @@ export default function IdCardGenerator() {
|
||||
if (!cleanCedula) return;
|
||||
|
||||
try {
|
||||
// Se usa el cliente extraído directamente del array renderizado
|
||||
const clienteProyectoValue = currentEmployee?.selectedClient || 'Generico';
|
||||
await saveClienteProyecto(cleanCedula, clienteProyectoValue);
|
||||
console.log(`[Supabase DB] Guardado: ${cleanCedula} → ${clienteProyectoValue}`);
|
||||
|
||||
// 1) Guardar cédula + cliente_proyecto en carnet_empleados_creados_glm
|
||||
await saveClienteProyecto(cleanCedula, clienteProyectoValue);
|
||||
|
||||
// 2) Subir foto al storage
|
||||
const customFile = new File([blobData], `${cleanCedula}.jpg`, { type: 'image/jpeg' });
|
||||
const remoteStorageUrl = await uploadEmployeePhoto(cleanCedula, customFile);
|
||||
|
||||
// 3) Guardar URL de foto
|
||||
if (remoteStorageUrl) {
|
||||
await supabase.rpc("save_employee_photo", {
|
||||
p_employee_number: cleanCedula,
|
||||
@@ -187,7 +187,7 @@ export default function IdCardGenerator() {
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`[Supabase Sync Fallido] Cédula ${cleanCedula}:`, error);
|
||||
// silent
|
||||
}
|
||||
};
|
||||
|
||||
@@ -257,13 +257,11 @@ export default function IdCardGenerator() {
|
||||
setBulkDownloadStatus({ processing: false, text: '⬇ Descargar' });
|
||||
|
||||
} catch (innerErr) {
|
||||
console.error(innerErr);
|
||||
setBulkStatusText('❌ Error de lectura. Revisa el formato de columnas.');
|
||||
}
|
||||
};
|
||||
reader.readAsBinaryString(file);
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
setBulkStatusText('❌ Error cargando el motor XLSX.');
|
||||
}
|
||||
};
|
||||
@@ -301,18 +299,16 @@ export default function IdCardGenerator() {
|
||||
employees: employeesReadyForRender,
|
||||
baseUrl,
|
||||
onStateChange: null,
|
||||
// CORRECCIÓN AQUÍ: Buscamos al empleado en nuestro arreglo usando la cédula que nos devuelve script.jsx
|
||||
onProcessEmployeePhoto: (cedula, blobData) => {
|
||||
const currentEmp = employeesReadyForRender.find(emp => emp.employeeId === cedula);
|
||||
return handleBulkSupabaseSync(cedula, blobData, currentEmp);
|
||||
}
|
||||
});
|
||||
|
||||
setBulkStatusText('🎉 ¡Lote de carnets guardado correctamente!');
|
||||
setBulkStatusText(`✅ ¡Lote completado! ${employeesReadyForRender.length} carnets procesados.`);
|
||||
setBulkEmployees([]);
|
||||
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
setBulkStatusText(`❌ Error al procesar: ${error.message || error}`);
|
||||
} finally {
|
||||
setBulkDownloadStatus({ processing: false, text: '⬇ Descargar' });
|
||||
@@ -340,7 +336,6 @@ export default function IdCardGenerator() {
|
||||
onStateChange: setDownloadStatus
|
||||
});
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
alert(err.message);
|
||||
setDownloadStatus({ processing: false, text: '⬇ Descargar' });
|
||||
}
|
||||
|
||||
@@ -16,15 +16,12 @@ export default function EmployeeCard() {
|
||||
async function loadEmployee() {
|
||||
|
||||
const { data, error } = await supabase
|
||||
.from("empleados_glm")
|
||||
.select("photo_url, name, job_title, country, status")
|
||||
.eq("cedula", employeeNumber)
|
||||
.single();
|
||||
.rpc("get_carnet_publico", { p_cedula: employeeNumber });
|
||||
|
||||
if (error || !data) {
|
||||
if (error || !data || data.length === 0) {
|
||||
setNotFound(true);
|
||||
} else {
|
||||
setEmployee(data);
|
||||
setEmployee(data[0]);
|
||||
}
|
||||
|
||||
setLoading(false);
|
||||
|
||||
@@ -57,7 +57,7 @@ export function convertDriveUrlToDirect(url) {
|
||||
return `https://drive.google.com/thumbnail?id=${match[1]}&sz=w1000`;
|
||||
}
|
||||
} catch (e) {
|
||||
console.error("Error convirtiendo la URL de Drive:", e);
|
||||
// ignore
|
||||
}
|
||||
return url;
|
||||
}
|
||||
@@ -70,7 +70,7 @@ export async function fetchImageAsBlob(url) {
|
||||
const response = await fetch(url);
|
||||
if (response.ok) return await response.blob();
|
||||
} catch (e) {
|
||||
console.error("Error al obtener Blob local de URL blob/data:", e);
|
||||
// ignore
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@@ -80,7 +80,7 @@ export async function fetchImageAsBlob(url) {
|
||||
const response = await fetch(url);
|
||||
if (response.ok) return await response.blob();
|
||||
} catch {
|
||||
console.warn("No se pudo obtener el Blob directo de Drive debido a restricciones CORS.");
|
||||
// CORS blocked
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@@ -91,7 +91,6 @@ export async function fetchImageAsBlob(url) {
|
||||
if (!response.ok) throw new Error("Error en respuesta de red proxy");
|
||||
return await response.blob();
|
||||
} catch (e) {
|
||||
console.error("Error haciendo fetch con bypass CORS a la imagen externa:", e);
|
||||
try {
|
||||
const response = await fetch(url, { mode: 'cors' });
|
||||
return await response.blob();
|
||||
@@ -269,7 +268,7 @@ export async function downloadIDCards(config) {
|
||||
const backCanvas = await html2canvasLib(vBack, renderOpts);
|
||||
executeFileDownload(backCanvas.toDataURL('image/png'), `${cleanName}Reverso.png`);
|
||||
} catch (error) {
|
||||
console.error('Error generando las vistas en alta resolución:', error);
|
||||
// silent
|
||||
} finally {
|
||||
if (sandbox.parentNode) document.body.removeChild(sandbox);
|
||||
if (onStateChange) onStateChange({ processing: false, text: '⬇ Descargar' });
|
||||
@@ -334,7 +333,7 @@ export async function downloadBulkIDCards({ employees, baseUrl, onStateChange, o
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(`Error guardando foto en Supabase para Cédula: ${strictCleanId}`, err);
|
||||
// silent
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+6
-18
@@ -12,29 +12,17 @@ export async function saveClienteProyecto(employeeNumber, clienteProyecto) {
|
||||
const cleanCedula = String(employeeNumber || '').replace(/[-\s]/g, '');
|
||||
const valorCliente = clienteProyecto || 'Generico';
|
||||
|
||||
console.log(`[Supabase] → saveClienteProyecto llamada con: cedula="${cleanCedula}", cliente_proyecto="${valorCliente}"`);
|
||||
|
||||
if (!cleanCedula) {
|
||||
console.warn('[Supabase] saveClienteProyecto abortada: cédula vacía.');
|
||||
return;
|
||||
throw new Error('Cédula vacía, no se puede guardar.');
|
||||
}
|
||||
|
||||
// CORRECCIÓN: El objeto debe llevar la cédula para que upsert funcione por conflicto
|
||||
const { data, error } = await supabase
|
||||
.from('carnet_empleados_creados_glm')
|
||||
.upsert(
|
||||
{
|
||||
cedula: cleanCedula,
|
||||
cliente_proyecto: valorCliente
|
||||
},
|
||||
{ onConflict: 'cedula' }
|
||||
)
|
||||
.select();
|
||||
const { error } = await supabase.rpc('upsert_carnet_cliente', {
|
||||
p_cedula: cleanCedula,
|
||||
p_cliente_proyecto: valorCliente
|
||||
});
|
||||
|
||||
if (error) {
|
||||
console.error(`[Supabase] ❌ Error guardando cliente_proyecto para cédula ${cleanCedula}:`, error);
|
||||
} else {
|
||||
console.log(`[Supabase] ✅ Guardado exitoso carnet_empleados_creados_glm:`, data);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user