Files
ToldoConjunto/apps/toldo-app/src/views/Exportar.vue
2026-10-25 18:09:01 -05:00

72 lines
3.3 KiB
Vue

<template>
<div>
<div class="mb-5"><div class="text-overline text-primary">DATOS LOCALES</div><h1 class="text-h4 mb-1">Exportar e importar</h1><div class="text-body-2 text-medium-emphasis">Haz copias de seguridad para continuar trabajando sin internet.</div></div>
<section>
<v-card class="mb-4"><v-card-title>Exportar copia de seguridad</v-card-title><v-card-text><p class="mb-3">Incluye catálogo, movimientos, ventas, gastos, cuadres y jornadas.</p><v-btn @click="exportar" color="primary" prepend-icon="mdi-download">Descargar JSON</v-btn></v-card-text></v-card>
</section>
<section>
<v-card><v-card-title>Restaurar datos</v-card-title><v-card-text><v-file-input accept=".json" label="Seleccionar copia JSON" @update:model-value="archivo = $event" /><v-alert v-if="mensaje" :type="tipoMensaje" variant="tonal" class="mb-3">{{ mensaje }}</v-alert><v-btn @click="importar" :disabled="!archivo" color="secondary" prepend-icon="mdi-upload">Importar datos</v-btn></v-card-text></v-card>
</section>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { db } from '@toldo/data';
import { ExportImportService } from '@toldo/services';
const exportService = new ExportImportService();
const archivo = ref<File | null>(null);
const mensaje = ref('');
const tipoMensaje = ref<'success' | 'error'>('success');
function onFileChange(e: any) {
archivo.value = e.target.files[0];
}
async function exportar() {
const data = {
productores: await db.productores.toArray(),
productos: await db.productos.toArray(),
movimientosInventario: await db.movimientosInventario.toArray(),
ventas: await db.ventas.toArray(),
ventaLineas: await db.ventaLineas.toArray(),
gastos: await db.gastos.toArray(),
ajustes: await db.ajustes.toArray(),
cuadres: await db.cuadres.toArray(),
jornadas: await db.jornadas.toArray(),
};
const exp = exportService.exportAll(data);
const blob = new Blob([JSON.stringify(exp, null, 2)], { type: 'application/json' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `toldo-export-${new Date().toISOString().split('T')[0]}.json`;
a.click();
URL.revokeObjectURL(url);
}
async function importar() {
if (!archivo.value) return;
const text = await archivo.value.text();
try {
const json = JSON.parse(text);
const imp = exportService.import(json);
if (imp.data.productores.length) await db.productores.bulkPut(imp.data.productores);
if (imp.data.productos.length) await db.productos.bulkPut(imp.data.productos);
if (imp.data.movimientosInventario.length) await db.movimientosInventario.bulkPut(imp.data.movimientosInventario);
if (imp.data.ventas.length) await db.ventas.bulkPut(imp.data.ventas);
if (imp.data.ventaLineas.length) await db.ventaLineas.bulkPut(imp.data.ventaLineas);
if (imp.data.gastos.length) await db.gastos.bulkPut(imp.data.gastos);
if (imp.data.ajustes.length) await db.ajustes.bulkPut(imp.data.ajustes);
if (imp.data.cuadres.length) await db.cuadres.bulkPut(imp.data.cuadres);
if (imp.data.jornadas?.length) await db.jornadas.bulkPut(imp.data.jornadas);
tipoMensaje.value = 'success'; mensaje.value = 'Datos importados correctamente.';
} catch (e: any) {
tipoMensaje.value = 'error'; mensaje.value = e.message;
}
}
</script>