feature/csv-clarion-exchange-type

This commit is contained in:
hreyes
2026-03-04 15:50:30 -07:00
parent afc0a35f1c
commit e486fd750f
8 changed files with 208 additions and 26 deletions

View File

@@ -437,11 +437,20 @@ export const api = {
// CSV import for Tipos de Cambio (flujo en general_catalogs/exchange_rate/imports)
exchangeRateImports: {
upload: (file: File, companyId: number) => {
upload: (
file: File,
companyId: number,
params?: { reemplazar_sin_preguntar?: boolean; date_format?: string }
) => {
const formData = new FormData();
formData.append('file', file);
const search = new URLSearchParams({ company_id: String(companyId) });
if (params?.reemplazar_sin_preguntar !== undefined)
search.set('reemplazar_sin_preguntar', String(!!params.reemplazar_sin_preguntar));
if (params?.date_format != null && params.date_format !== '')
search.set('date_format', params.date_format);
return fetchApi(
`/v1/a76/exchange-rate/imports/upload?company_id=${companyId}`,
`/v1/a76/exchange-rate/imports/upload?${search.toString()}`,
{ method: 'POST', body: formData }
);
},

View File

@@ -42,7 +42,8 @@
let totalSkipped = $derived(
(commitResults?.skipped_invalid || 0) +
(commitResults?.skipped_missing_fk || 0) +
(commitResults?.skipped_missing_invoice || 0)
(commitResults?.skipped_missing_invoice || 0) +
(commitResults?.skipped_duplicate || 0)
);
function handleOpenChange(newOpen: boolean) {

View File

@@ -176,7 +176,16 @@
if (useExchangeRateImport) {
try {
const res = await api.exchangeRateImports.upload(file, companyId);
const catalogosSettings = allSettings['catalogos'] || {};
const globalMode = globalSettings['mode'] ?? catalogosSettings['mode'] ?? 'update';
const reemplazar_sin_preguntar = globalMode === 'replace';
// Formato activo del selector global (Formato de Fecha); mismo default que la barra
const dateFormat =
globalSettings['dateFormat'] ?? catalogosSettings['dateFormat'] ?? globalCsvParams.find((p) => p.name === 'dateFormat')?.defaultValue ?? 'dd/mm/yyyy';
const res = await api.exchangeRateImports.upload(file, companyId, {
reemplazar_sin_preguntar,
date_format: dateFormat
});
if (res.data?.job_id) {
currentJobId = res.data.job_id;
pollStatus();
@@ -518,16 +527,20 @@
commitResults = res.data;
showResultModal = true;
const inserted = res.data?.inserted || 0;
const updated = res.data?.updated || 0;
const skippedInvalid = res.data?.skipped_invalid || 0;
const skippedFk = res.data?.skipped_missing_fk || 0;
const skippedDup = res.data?.skipped_duplicate || 0;
const skippedDetails = res.data?.skipped_details || [];
if (inserted > 0) {
toast.success(`Importación completada: ${inserted} registros insertados`);
if (inserted > 0 || updated > 0) {
const parts = [];
if (inserted > 0) parts.push(`${inserted} insertados`);
if (updated > 0) parts.push(`${updated} actualizados`);
toast.success(`Importación completada: ${parts.join(', ')}`);
if (skippedInvalid > 0 || skippedFk > 0 || skippedDup > 0) {
const totalSkipped = skippedInvalid + skippedFk + skippedDup;
toast.warning(`${totalSkipped} registros fueron rechazados`);
toast.warning(`${totalSkipped} registros fueron rechazados u omitidos`);
}
} else {
toast.error('No se insertaron registros. Revisa los errores a continuación.');