164 lines
5.3 KiB
Vue
164 lines
5.3 KiB
Vue
<template>
|
||
<v-container v-if="authStore.isAdmin" class="fill-height">
|
||
<v-row v-if="!result && !loading" justify="center">
|
||
<v-col cols="12" md="8">
|
||
<v-card class="pa-6" elevation="4">
|
||
<v-card-title class="text-h5 font-weight-bold text-center">
|
||
🔄 Sincronización de Clientes
|
||
</v-card-title>
|
||
|
||
<v-card-text>
|
||
<p>
|
||
Esta acción sincronizará los <strong>clientes</strong> desde el sistema
|
||
<strong>Tryton</strong> hacia la plataforma.
|
||
</p>
|
||
<v-alert type="warning" dense border="start" border-color="warning" class="mt-4">
|
||
<strong>Advertencia:</strong> Este proceso podría tardar varios minutos
|
||
y reemplazar datos existentes en la plataforma.
|
||
Asegúrese de que la información en Tryton esté actualizada antes de
|
||
continuar.
|
||
</v-alert>
|
||
<p class="mt-4">
|
||
Durante la sincronización, no se podrán modificar clientes en la
|
||
plataforma para evitar conflictos.
|
||
</p>
|
||
</v-card-text>
|
||
|
||
<v-card-actions class="justify-center">
|
||
<v-btn color="primary" @click="startSync">
|
||
Iniciar Sincronización
|
||
</v-btn>
|
||
<v-btn text @click="$router.push('/')">
|
||
Cancelar
|
||
</v-btn>
|
||
</v-card-actions>
|
||
</v-card>
|
||
</v-col>
|
||
</v-row>
|
||
|
||
<v-row v-else-if="loading" justify="center" align="center">
|
||
<v-col cols="12" class="text-center">
|
||
<v-progress-circular indeterminate color="primary" size="64"></v-progress-circular>
|
||
<p class="mt-4 text-h6">Sincronizando clientes...</p>
|
||
</v-col>
|
||
</v-row>
|
||
|
||
<v-row v-else>
|
||
<v-col cols="12">
|
||
<v-alert type="success" variant="tonal" class="mb-4">
|
||
<strong>Sincronización completada</strong>
|
||
</v-alert>
|
||
</v-col>
|
||
|
||
<v-col cols="12" md="6">
|
||
<v-card elevation="2">
|
||
<v-card-title class="bg-error text-white">❌ Fallidos ({{ result.failed_parties?.length || 0 }})</v-card-title>
|
||
<v-card-text>
|
||
<v-data-table
|
||
:items="formatItems(result.failed_parties)"
|
||
density="compact"
|
||
:headers="[{ title: 'ID', key: 'id' }]"
|
||
></v-data-table>
|
||
</v-card-text>
|
||
</v-card>
|
||
</v-col>
|
||
|
||
<v-col cols="12" md="6">
|
||
<v-card elevation="2">
|
||
<v-card-title class="bg-success text-white">✅ Creados ({{ result.created_customers?.length || 0 }})</v-card-title>
|
||
<v-card-text>
|
||
<v-data-table
|
||
:items="formatItems(result.created_customers)"
|
||
density="compact"
|
||
:headers="[{ title: 'ID', key: 'id' }]"
|
||
></v-data-table>
|
||
</v-card-text>
|
||
</v-card>
|
||
</v-col>
|
||
|
||
<v-col cols="12" md="6">
|
||
<v-card elevation="2">
|
||
<v-card-title class="bg-warning">🔄 Actualizados ({{ result.updated_customers?.length || 0 }})</v-card-title>
|
||
<v-card-text>
|
||
<v-data-table
|
||
:items="formatItems(result.updated_customers)"
|
||
density="compact"
|
||
:headers="[{ title: 'ID', key: 'id' }]"
|
||
></v-data-table>
|
||
</v-card-text>
|
||
</v-card>
|
||
</v-col>
|
||
|
||
<v-col cols="12" md="6">
|
||
<v-card elevation="2">
|
||
<v-card-title class="bg-grey-lighten-1">⏭️ Sin cambios ({{ result.untouched_customers?.length || 0 }})</v-card-title>
|
||
<v-card-text>
|
||
<v-data-table
|
||
:items="formatItems(result.untouched_customers)"
|
||
density="compact"
|
||
:headers="[{ title: 'ID', key: 'id' }]"
|
||
></v-data-table>
|
||
</v-card-text>
|
||
</v-card>
|
||
</v-col>
|
||
|
||
<v-col cols="12" md="6">
|
||
<v-card elevation="2">
|
||
<v-card-title class="bg-info text-white">🔍 Verificados ({{ result.checked_tryton_parties?.length || 0 }})</v-card-title>
|
||
<v-card-text>
|
||
<v-data-table
|
||
:items="formatItems(result.checked_tryton_parties)"
|
||
density="compact"
|
||
:headers="[{ title: 'ID', key: 'id' }]"
|
||
></v-data-table>
|
||
</v-card-text>
|
||
</v-card>
|
||
</v-col>
|
||
|
||
<v-col cols="12" class="text-center mt-4">
|
||
<v-btn color="primary" @click="$router.push('/')">
|
||
Volver al inicio
|
||
</v-btn>
|
||
</v-col>
|
||
</v-row>
|
||
</v-container>
|
||
</template>
|
||
|
||
<script>
|
||
import { useAuthStore } from '@/stores/auth';
|
||
import { inject } from 'vue';
|
||
|
||
export default {
|
||
name: 'CustomersFromTryton',
|
||
setup() {
|
||
const authStore = useAuthStore();
|
||
return { authStore };
|
||
},
|
||
data() {
|
||
return {
|
||
api: inject('api'),
|
||
loading: false,
|
||
result: null,
|
||
}
|
||
},
|
||
methods: {
|
||
formatItems(ids) {
|
||
if (!ids || ids.length === 0) return [];
|
||
return ids.map(id => ({ id }));
|
||
},
|
||
startSync() {
|
||
this.loading = true;
|
||
this.api.getCustomersFromTryton()
|
||
.then(response => {
|
||
this.result = response;
|
||
this.loading = false;
|
||
})
|
||
.catch(error => {
|
||
console.error('Error al sincronizar clientes:', error);
|
||
this.loading = false;
|
||
});
|
||
}
|
||
}
|
||
}
|
||
</script>
|