<template> <div class="block ml-3 mr-3 is-max-widescreen is-max-desktop"> <comunes-tabs-secciones :tabs="tabs" :tabInicial="tabActiva"></comunes-tabs-secciones> <div class="block pb-6" id="pedidos-compras-seccion" :class="seccionActiva === 'pedidos-compras-seccion' ? 'is-active' : 'is-hidden'"> <div class="block" id="pedidos-compras-tabla-y-dropdown"> <dropdown-descargar> </dropdown-descargar> </div> </div> <div class="block pb-6" id="canasta-compras-seccion" :class="seccionActiva === 'canasta-compras-seccion' ? 'is-active' : 'is-hidden'"> <div class="block" id="canasta-compras-seccion"> <article class="message is-warning"> <div class="message-header"> <p>Formato de la canasta</p> </div> <div class="message-body"> <div class="content"> La planilla de la canasta tiene que tener el siguiente formato para que la aplicación la lea correctamente: <ul> <li> Los precios deben usar punto y no coma decimal </li> <li> El nombre de las columnas deben ser "Tipo", "Producto", y "Precio" respectivamente </li> <li> Las celdas deben separarse con '|' </li> <li> No puede haber "enters" en ninguna celda </li> <li> El bono de transporte debe tener tipo 'T' </li> </ul> <a class="has-text-info" href="/compras/canasta/ejemplo">Planilla de ejemplo.</a> <article class="message is-danger mt-2"> <div class="message-body"> <div class="content"> Cuidado! Cargar una nueva canasta elimina todos los pedidos de la aplicación. </div> </div> </article> </div> </div> </article> <div class="buttons is-right"> <canasta-input></canasta-input> </div> </div> </div> <div class="block pb-6" id="saldos-compras-seccion" :class="seccionActiva === 'saldos-compras-seccion' ? 'is-active' : 'is-hidden'" > <div class="block" id="saldos-compras-seccion"> <article class="message is-warning"> <div class="message-header"> <p> <button class="icon" aria-label="foldout" @click="toggleSaldosFileDialog"> <i class="fa" :class="show_saldos_file_dialog ? 'fa-arrow-up' : 'fa-arrow-down'"></i> </button> Cargar saldos </p> </div> <div class="message-body" v-if="show_saldos_file_dialog"> <div class="content"> La planilla de saldos tiene que tener el siguiente formato para que la aplicación la lea correctamente: <ul> <li>Los valores deben usar punto y no coma decimal</li> <li>El nombre de las columnas deben ser "Barrio" y "Saldo"</li> <li>Las celdas deben separarse con '|'</li> <li>No puede haber "enters" en ninguna celda</li> <li>El nombre de los barrios debe estar exactamente igual que como están configurados en esta aplicacaión</li> </ul> <article class="message is-danger mt-2"> <div class="message-body"> <div class="content"> Cargar un archivo de saldos sólo reemplazará los saldos de los barrios presentes en la tabla. </div> </div> </article> </div> <input-file-button text="Subir archivo" @archivo-subido="saldosSubido" /> </div> </article> <table class="table container"> <thead> <tr> <th>Barrio</th> <th>Saldo</th> </tr> </thead> <tbody> <tr v-for="gdc in grupos_de_compra"> <th>{{ gdc.nombre }}</th> <td> <input id="cantidad" v-model="gdc.saldo" class="input is-small" type="number" style="text-align: center" @input="saldoModificado(gdc.id)"> </td> <td> <button :disabled="!isSaldoModificado(gdc.id)" class="button is-small is-success ml-1" @click="confirmar_saldo(gdc.id)"> <span class="icon"> <i class="fas fa-check"></i> </span> </button> </td> </tr> </tbody> </table> </div> </div> </div> </template> <script> import TabsSecciones from "../comunes/TabsSecciones.vue"; import DropdownDescargar from "./DropdownDescargar.vue"; import CanastaInput from "./CanastaInput.vue"; import InputFileButton from "../comunes/InputFileButton.vue"; import { mapActions, mapState } from "vuex"; export default { components: { TabsSecciones, DropdownDescargar, CanastaInput, InputFileButton, }, data() { return { tabs: [ { id: "pedidos-compras", nombre: "Pedidos" }, { id: "canasta-compras", nombre: "Canasta" }, { id: "saldos-compras", nombre: "Saldos" }, ], tabActiva: "pedidos-compras", seccionActiva: "pedidos-compras-seccion", archivo: undefined, saldo_modificado: {}, show_saldos_file_dialog: false, } }, methods: { setSeccionActiva(tabId) { this.tabActiva = tabId; this.seccionActiva = tabId + "-seccion"; }, ...mapActions('comisiones', ['getGruposDeCompra', 'setSaldo']), ...mapActions('ui',["toast"]), async confirmar_saldo(gdc_id) { var saldo = this.getSaldo(gdc_id); await this.setSaldo({ gdc_id: gdc_id, saldo: saldo, }); this.saldo_modificado[gdc_id] = false; await this.getGruposDeCompra(); }, saldoModificado(gdc_id) { this.saldo_modificado[gdc_id] = true; }, isSaldoModificado(gdc_id) { return gdc_id in this.saldo_modificado && this.saldo_modificado[gdc_id]; }, getSaldo(gdc_id) { for (var i = 0; i < this.grupos_de_compra.length; i++) { if (this.grupos_de_compra[i].id == gdc_id) { return this.grupos_de_compra[i].saldo; } } return 0; }, async saldosSubido(event) { var archivo = event.archivo; if (archivo.type === "text/csv") { const formData = new FormData(); formData.append("data", archivo); try { const response = await axios.post("/compras/saldos", formData, { headers: { "Content-Type": "multipart/form-data", }, }); this.getGruposDeCompra(); this.toast({ mensaje: (response.data.message || "Canasta cargada exitosamente") }); } catch (error) { console.log(error); this.toast({ mensaje: (error.response?.data?.message || "Hubo errores.") }); } event.component.cargando = false; } else { this.toast("El archivo debe ser .CSV"); event.component.cargando = false; } }, toggleSaldosFileDialog() { this.show_saldos_file_dialog = !this.show_saldos_file_dialog; }, }, computed: { ...mapState('comisiones', [ 'grupos_de_compra', ]), }, async mounted() { await this.getGruposDeCompra(); }, } </script>