You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

277 lines
7.2 KiB
JavaScript

2 months ago
// src/store/procesoAdmision.store.js
import { defineStore } from 'pinia'
import api from '../axios'
export const useProcesoAdmisionStore = defineStore('procesoAdmision', {
state: () => ({
loading: false,
error: null,
// listado
procesos: [],
pagination: {
current_page: 1,
per_page: 15,
total: 0,
last_page: 1
},
// detalle
procesoActual: null,
// detalles del proceso actual
detalles: []
}),
actions: {
_setError(err) {
this.error =
err?.response?.data?.message ||
err?.response?.data?.error ||
err?.message ||
'Ocurrió un error'
},
// =========================
// PROCESOS
// =========================
// GET /api/admin/procesos-admision
async fetchProcesos(params = {}) {
this.loading = true
this.error = null
try {
const { data } = await api.get('/admin/procesos-admision', {
params: {
per_page: this.pagination.per_page,
...params
}
})
// Laravel paginate
this.procesos = data.data ?? []
this.pagination.current_page = data.current_page ?? 1
this.pagination.per_page = data.per_page ?? this.pagination.per_page
this.pagination.total = data.total ?? this.procesos.length
this.pagination.last_page = data.last_page ?? 1
return true
} catch (err) {
this._setError(err)
return false
} finally {
this.loading = false
}
},
// GET /api/admin/procesos-admision/{id}?include_detalles=1
async fetchProceso(id, { include_detalles = true } = {}) {
this.loading = true
this.error = null
try {
const { data } = await api.get(`/admin/procesos-admision/${id}`, {
params: { include_detalles: include_detalles ? 1 : 0 }
})
this.procesoActual = data
this.detalles = Array.isArray(data.detalles) ? data.detalles : []
return true
} catch (err) {
this._setError(err)
return false
} finally {
this.loading = false
}
},
// POST /api/admin/procesos-admision (multipart/form-data)
async createProceso(payload) {
// payload puede ser objeto normal o FormData
this.loading = true
this.error = null
try {
const isFormData = payload instanceof FormData
await api.post('/admin/procesos-admision', payload, {
headers: isFormData ? { 'Content-Type': 'multipart/form-data' } : undefined
})
// refrescar lista
await this.fetchProcesos({ page: 1 })
return true
} catch (err) {
this._setError(err)
return false
} finally {
this.loading = false
}
},
// PATCH /api/admin/procesos-admision/{id} (multipart/form-data)
async updateProceso(id, payload, { method = 'patch' } = {}) {
this.loading = true
this.error = null
try {
const isFormData = payload instanceof FormData
const { data } = await api.request({
url: `/admin/procesos-admision/${id}`,
method,
data: payload,
headers: isFormData ? { 'Content-Type': 'multipart/form-data' } : undefined
})
// actualizar cache local
if (this.procesoActual?.id === id) {
this.procesoActual = data
}
// refrescar listado (opcional, pero recomendado)
await this.fetchProcesos({
page: this.pagination.current_page,
per_page: this.pagination.per_page
})
return true
} catch (err) {
this._setError(err)
return false
} finally {
this.loading = false
}
},
// DELETE /api/admin/procesos-admision/{id}
async deleteProceso(id) {
this.loading = true
this.error = null
try {
await api.delete(`/admin/procesos-admision/${id}`)
// limpiar caches
this.procesos = this.procesos.filter(p => p.id !== id)
if (this.procesoActual?.id === id) {
this.procesoActual = null
this.detalles = []
}
return true
} catch (err) {
this._setError(err)
return false
} finally {
this.loading = false
}
},
// =========================
// DETALLES (POR PROCESO)
// =========================
// GET /api/admin/procesos-admision/{procesoId}/detalles?tipo=requisitos
async fetchDetalles(procesoId, params = {}) {
this.loading = true
this.error = null
try {
const { data } = await api.get(`/admin/procesos-admision/${procesoId}/detalles`, {
params
})
this.detalles = Array.isArray(data) ? data : []
return true
} catch (err) {
this._setError(err)
return false
} finally {
this.loading = false
}
},
// POST /api/admin/procesos-admision/{procesoId}/detalles (multipart/form-data)
async createDetalle(procesoId, payload) {
this.loading = true
this.error = null
try {
const isFormData = payload instanceof FormData
await api.post(`/admin/procesos-admision/${procesoId}/detalles`, payload, {
headers: isFormData ? { 'Content-Type': 'multipart/form-data' } : undefined
})
await this.fetchDetalles(procesoId)
return true
} catch (err) {
this._setError(err)
return false
} finally {
this.loading = false
}
},
// GET /api/admin/detalles-admision/{id}
async fetchDetalleById(detalleId) {
this.loading = true
this.error = null
try {
const { data } = await api.get(`/admin/detalles-admision/${detalleId}`)
return data
} catch (err) {
this._setError(err)
return null
} finally {
this.loading = false
}
},
// PATCH /api/admin/detalles-admision/{id} (multipart/form-data)
async updateDetalle(detalleId, payload, { method = 'patch' } = {}) {
this.loading = true
this.error = null
try {
const isFormData = payload instanceof FormData
const { data } = await api.request({
url: `/admin/detalles-admision/${detalleId}`,
method,
data: payload,
headers: isFormData ? { 'Content-Type': 'multipart/form-data' } : undefined
})
// actualizar cache local si existe
const idx = this.detalles.findIndex(d => d.id === data.id)
if (idx >= 0) this.detalles[idx] = data
return true
} catch (err) {
this._setError(err)
return false
} finally {
this.loading = false
}
},
// DELETE /api/admin/detalles-admision/{id}
async deleteDetalle(detalleId, procesoId = null) {
this.loading = true
this.error = null
try {
await api.delete(`/admin/detalles-admision/${detalleId}`)
this.detalles = this.detalles.filter(d => d.id !== detalleId)
// si me pasas procesoId, refresca desde backend
if (procesoId) await this.fetchDetalles(procesoId)
return true
} catch (err) {
this._setError(err)
return false
} finally {
this.loading = false
}
}
}
})