72 lines
3.3 KiB
Vue
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>
|