From 4b2ed9f90ea8cd79a2bce3653d0c1131264f323c Mon Sep 17 00:00:00 2001
From: ale <ale.tasistro@gmail.com>
Date: Sat, 21 Dec 2024 13:20:34 -0300
Subject: [PATCH 01/23] Generalizacion de tab-secciones

---
 resources/js/components/admin/Body.vue        |  5 ++++-
 .../js/components/admin/TabsSecciones.vue     | 20 +++++--------------
 2 files changed, 9 insertions(+), 16 deletions(-)

diff --git a/resources/js/components/admin/Body.vue b/resources/js/components/admin/Body.vue
index 5010fa6..32419ec 100644
--- a/resources/js/components/admin/Body.vue
+++ b/resources/js/components/admin/Body.vue
@@ -1,6 +1,6 @@
 <template>
     <div class="block ml-3 mr-3 is-max-widescreen is-max-desktop">
-        <admin-tabs-secciones></admin-tabs-secciones>
+        <admin-tabs-secciones :tabs="tabs" :tabInicial="tabActiva"></admin-tabs-secciones>
         <div class="block" id="pedidos-seccion"
             :class="seccionActiva === 'pedidos-seccion' ? 'is-active' : 'is-hidden'">
             <div class="block pb-6" id="pedidos-tabla-y-dropdown" v-show="hayPedidos">
@@ -52,6 +52,9 @@ export default {
             pedidos: [],
             bonosDeTransporte: 0,
             totalBonosBarriales: 0,
+            tabs: [{ id: "pedidos", nombre: "Pedidos" },
+                   { id: "bonos", nombre: "Bonos" },
+                   { id: "caracteristicas", nombre: "Caracteristicas opcionales" }],
             tabActiva: "pedidos",
             seccionActiva: "pedidos-seccion",
         }
diff --git a/resources/js/components/admin/TabsSecciones.vue b/resources/js/components/admin/TabsSecciones.vue
index 0444b08..7a2f88a 100644
--- a/resources/js/components/admin/TabsSecciones.vue
+++ b/resources/js/components/admin/TabsSecciones.vue
@@ -19,23 +19,13 @@
 
 <script>
 export default {
+    props: {
+      tabs: Array,
+      tabInicial: String,
+    },
     data() {
         return {
-            tabActiva: "pedidos",
-            tabs: [
-                {
-                    id: "pedidos",
-                    nombre: "Pedidos"
-                },
-                {
-                    id: "bonos",
-                    nombre: "Bonos"
-                },
-                {
-                    id: "caracteristicas",
-                    nombre: "Caracteristicas opcionales"
-                }
-            ]
+            tabActiva: this.tabInicial,
         }
     },
     methods: {

From bddaf223e4076901c25d076739cb7532841e7b4d Mon Sep 17 00:00:00 2001
From: ale <ale.tasistro@gmail.com>
Date: Sat, 21 Dec 2024 13:21:39 -0300
Subject: [PATCH 02/23] tab-secciones movida a comunes

---
 resources/js/components/admin/Body.vue                       | 4 ++--
 resources/js/components/{admin => comunes}/TabsSecciones.vue | 0
 2 files changed, 2 insertions(+), 2 deletions(-)
 rename resources/js/components/{admin => comunes}/TabsSecciones.vue (100%)

diff --git a/resources/js/components/admin/Body.vue b/resources/js/components/admin/Body.vue
index 32419ec..1b4b8c5 100644
--- a/resources/js/components/admin/Body.vue
+++ b/resources/js/components/admin/Body.vue
@@ -1,6 +1,6 @@
 <template>
     <div class="block ml-3 mr-3 is-max-widescreen is-max-desktop">
-        <admin-tabs-secciones :tabs="tabs" :tabInicial="tabActiva"></admin-tabs-secciones>
+        <comunes-tabs-secciones :tabs="tabs" :tabInicial="tabActiva"></comunes-tabs-secciones>
         <div class="block" id="pedidos-seccion"
             :class="seccionActiva === 'pedidos-seccion' ? 'is-active' : 'is-hidden'">
             <div class="block pb-6" id="pedidos-tabla-y-dropdown" v-show="hayPedidos">
@@ -34,7 +34,7 @@
 
 <script>
 import CaracteristicasOpcionales from "./CaracteristicasOpcionales.vue";
-import TabsSecciones from "./TabsSecciones.vue";
+import TabsSecciones from "../comunes/TabsSecciones.vue";
 import DropdownDescargar from "./DropdownDescargar.vue";
 import TablaPedidos from "./TablaPedidos.vue";
 import TablaBonos from "./TablaBonos.vue";
diff --git a/resources/js/components/admin/TabsSecciones.vue b/resources/js/components/comunes/TabsSecciones.vue
similarity index 100%
rename from resources/js/components/admin/TabsSecciones.vue
rename to resources/js/components/comunes/TabsSecciones.vue

From 22cbac14f1428d1cac9f4cdc512a2e4fa696d113 Mon Sep 17 00:00:00 2001
From: ale <ale.tasistro@gmail.com>
Date: Sat, 21 Dec 2024 13:29:14 -0300
Subject: [PATCH 03/23] =?UTF-8?q?Pesta=C3=B1as=20para=20body=20de=20compra?=
 =?UTF-8?q?s?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 resources/js/components/compras/Body.vue | 74 ++++++++++++++++--------
 1 file changed, 51 insertions(+), 23 deletions(-)

diff --git a/resources/js/components/compras/Body.vue b/resources/js/components/compras/Body.vue
index 8ba4d5f..47df9fb 100644
--- a/resources/js/components/compras/Body.vue
+++ b/resources/js/components/compras/Body.vue
@@ -1,42 +1,70 @@
 <template>
-    <div class="container is-fluid has-text-centered">
-        <div class="block">
-            <div class="field">
-                <p class="control">
-                    <a href="/compras/pedidos/descargar" class="button">
+    <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" id="pedidos-compras-seccion"
+             :class="seccionActiva === 'pedidos-compras-seccion' ? 'is-active' : 'is-hidden'">
+            <div class="block">
+                <div class="field">
+                    <p class="control">
+                        <a href="/compras/pedidos/descargar" class="button">
                         <span class="icon is-small">
                             <i class="fas fa-download"></i>
                         </span>
-                        <span>Descargar planilla de totales</span>
-                    </a>
-                </p>
-            </div>
-            <div class="field">
-                <p class="control">
-                    <a href="/compras/pedidos/notas" class="button">
+                            <span>Descargar planilla de totales</span>
+                        </a>
+                    </p>
+                </div>
+                <div class="field">
+                    <p class="control">
+                        <a href="/compras/pedidos/notas" class="button">
                         <span class="icon is-small">
                             <i class="fas fa-sticky-note"></i>
                         </span>
-                        <span>Descargar planilla de notas</span>
-                    </a>
-                </p>
-            </div>
-            <div class="field">
-                <p class="control">
-                    <a href="/compras/pedidos/transporte" class="button">
+                            <span>Descargar planilla de notas</span>
+                        </a>
+                    </p>
+                </div>
+                <div class="field">
+                    <p class="control">
+                        <a href="/compras/pedidos/transporte" class="button">
                         <span class="icon is-small">
                             <i class="fa fa-truck"></i>
                         </span>
-                        <span>Descargar planilla de transporte</span>
-                    </a>
-                </p>
+                            <span>Descargar planilla de transporte</span>
+                        </a>
+                    </p>
+                </div>
+            </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">
+                <p> Todavía no hay nada por acá </p>
             </div>
         </div>
     </div>
 </template>
 
 <script>
-export default {
+import TabsSecciones from "../comunes/TabsSecciones.vue";
 
+export default {
+    components: {
+        TabsSecciones,
+    },
+    data() {
+        return {
+            tabs: [{ id: "pedidos-compras", nombre: "Pedidos" },
+                { id: "canasta-compras", nombre: "Canasta" }],
+            tabActiva: "pedidos-compras",
+            seccionActiva: "pedidos-compras-seccion",
+        }
+    },
+    methods: {
+        setSeccionActiva(tabId) {
+            this.tabActiva = tabId;
+            this.seccionActiva = tabId + "-seccion";
+        },
+    }
 }
 </script>

From 92782be7f694e4acdade846721a7795817ad4ec4 Mon Sep 17 00:00:00 2001
From: ale <ale.tasistro@gmail.com>
Date: Sat, 21 Dec 2024 13:48:40 -0300
Subject: [PATCH 04/23] Descargas movidas a dropdown

---
 resources/js/components/compras/Body.vue      | 37 +++-----------
 .../components/compras/DropdownDescargar.vue  | 50 +++++++++++++++++++
 2 files changed, 56 insertions(+), 31 deletions(-)
 create mode 100644 resources/js/components/compras/DropdownDescargar.vue

diff --git a/resources/js/components/compras/Body.vue b/resources/js/components/compras/Body.vue
index 47df9fb..23e9f0a 100644
--- a/resources/js/components/compras/Body.vue
+++ b/resources/js/components/compras/Body.vue
@@ -3,37 +3,9 @@
         <comunes-tabs-secciones :tabs="tabs" :tabInicial="tabActiva"></comunes-tabs-secciones>
         <div class="block" id="pedidos-compras-seccion"
              :class="seccionActiva === 'pedidos-compras-seccion' ? 'is-active' : 'is-hidden'">
-            <div class="block">
-                <div class="field">
-                    <p class="control">
-                        <a href="/compras/pedidos/descargar" class="button">
-                        <span class="icon is-small">
-                            <i class="fas fa-download"></i>
-                        </span>
-                            <span>Descargar planilla de totales</span>
-                        </a>
-                    </p>
-                </div>
-                <div class="field">
-                    <p class="control">
-                        <a href="/compras/pedidos/notas" class="button">
-                        <span class="icon is-small">
-                            <i class="fas fa-sticky-note"></i>
-                        </span>
-                            <span>Descargar planilla de notas</span>
-                        </a>
-                    </p>
-                </div>
-                <div class="field">
-                    <p class="control">
-                        <a href="/compras/pedidos/transporte" class="button">
-                        <span class="icon is-small">
-                            <i class="fa fa-truck"></i>
-                        </span>
-                            <span>Descargar planilla de transporte</span>
-                        </a>
-                    </p>
-                </div>
+            <div class="block pb-6" id="pedidos-compras-tabla-y-dropdown">
+                <compras-dropdown-descargar>
+                </compras-dropdown-descargar>
             </div>
         </div>
         <div class="block pb-6" id="canasta-compras-seccion"
@@ -47,10 +19,12 @@
 
 <script>
 import TabsSecciones from "../comunes/TabsSecciones.vue";
+import DropdownDescargar from "./DropdownDescargar.vue";
 
 export default {
     components: {
         TabsSecciones,
+        DropdownDescargar,
     },
     data() {
         return {
@@ -58,6 +32,7 @@ export default {
                 { id: "canasta-compras", nombre: "Canasta" }],
             tabActiva: "pedidos-compras",
             seccionActiva: "pedidos-compras-seccion",
+            hayAprobados: true,
         }
     },
     methods: {
diff --git a/resources/js/components/compras/DropdownDescargar.vue b/resources/js/components/compras/DropdownDescargar.vue
new file mode 100644
index 0000000..a37d916
--- /dev/null
+++ b/resources/js/components/compras/DropdownDescargar.vue
@@ -0,0 +1,50 @@
+<template>
+    <div class="buttons is-right">
+        <div class="dropdown" :class="{'is-active': dropdownActivo}" @mouseleave="dropdownActivo = false">
+            <div class="dropdown-trigger">
+                <button class="button" aria-haspopup="true" aria-controls="dropdown-menu" :disabled="!hayAprobados" @click="dropdownActivo = !dropdownActivo">
+                    <span class="icon is-small">
+                        <i class="fas fa-download"></i>
+                    </span>
+                    <span>Descargar planillas</span>
+                    <span class="icon is-small">
+                        <i class="fas fa-angle-down" aria-hidden="true"></i>
+                    </span>
+                </button>
+            </div>
+            <div class="dropdown-menu" id="dropdown-menu" role="menu">
+                <div class="dropdown-content">
+                    <a href="/compras/pedidos/descargar" class="dropdown-item">
+                        Pedidos por barrio
+                    </a>
+                    <a href="/compras/pedidos/notas" class="dropdown-item">
+                        Notas por barrio
+                    </a>
+                    <a href="/compras/pedidos/transporte" class="dropdown-item">
+                        Transporte por barrio
+                    </a>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            dropdownActivo: false
+        }
+    },
+    computed: {
+        hayAprobados: function() {
+            return this.$parent.hayAprobados;
+        }
+    },
+
+}
+</script>
+
+<style>
+
+</style>

From bea8de2c8cdbd8c93224983e5c82f716fa8cc979 Mon Sep 17 00:00:00 2001
From: ale <ale.tasistro@gmail.com>
Date: Sat, 21 Dec 2024 13:56:45 -0300
Subject: [PATCH 05/23] Siempre habilitado

---
 resources/js/components/compras/DropdownDescargar.vue | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/resources/js/components/compras/DropdownDescargar.vue b/resources/js/components/compras/DropdownDescargar.vue
index a37d916..5929613 100644
--- a/resources/js/components/compras/DropdownDescargar.vue
+++ b/resources/js/components/compras/DropdownDescargar.vue
@@ -2,7 +2,7 @@
     <div class="buttons is-right">
         <div class="dropdown" :class="{'is-active': dropdownActivo}" @mouseleave="dropdownActivo = false">
             <div class="dropdown-trigger">
-                <button class="button" aria-haspopup="true" aria-controls="dropdown-menu" :disabled="!hayAprobados" @click="dropdownActivo = !dropdownActivo">
+                <button class="button" aria-haspopup="true" aria-controls="dropdown-menu" @click="dropdownActivo = !dropdownActivo">
                     <span class="icon is-small">
                         <i class="fas fa-download"></i>
                     </span>
@@ -36,12 +36,6 @@ export default {
             dropdownActivo: false
         }
     },
-    computed: {
-        hayAprobados: function() {
-            return this.$parent.hayAprobados;
-        }
-    },
-
 }
 </script>
 

From 5a4b933f11daac436e72e97d67be079e74039fec Mon Sep 17 00:00:00 2001
From: ale <ale.tasistro@gmail.com>
Date: Sat, 21 Dec 2024 14:17:47 -0300
Subject: [PATCH 06/23] Agregado csv input para canasta

---
 resources/js/components/compras/Body.vue      |  8 ++-
 .../js/components/compras/CanastaInput.vue    | 69 +++++++++++++++++++
 2 files changed, 75 insertions(+), 2 deletions(-)
 create mode 100644 resources/js/components/compras/CanastaInput.vue

diff --git a/resources/js/components/compras/Body.vue b/resources/js/components/compras/Body.vue
index 23e9f0a..9828a73 100644
--- a/resources/js/components/compras/Body.vue
+++ b/resources/js/components/compras/Body.vue
@@ -11,7 +11,9 @@
         <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">
-                <p> Todavía no hay nada por acá </p>
+                <div class="buttons is-right">
+                    <compras-canasta-input></compras-canasta-input>
+                </div>
             </div>
         </div>
     </div>
@@ -20,11 +22,13 @@
 <script>
 import TabsSecciones from "../comunes/TabsSecciones.vue";
 import DropdownDescargar from "./DropdownDescargar.vue";
+import CanastaInput from "./CanastaInput.vue";
 
 export default {
     components: {
         TabsSecciones,
         DropdownDescargar,
+        CanastaInput,
     },
     data() {
         return {
@@ -32,7 +36,7 @@ export default {
                 { id: "canasta-compras", nombre: "Canasta" }],
             tabActiva: "pedidos-compras",
             seccionActiva: "pedidos-compras-seccion",
-            hayAprobados: true,
+            archivo: undefined,
         }
     },
     methods: {
diff --git a/resources/js/components/compras/CanastaInput.vue b/resources/js/components/compras/CanastaInput.vue
new file mode 100644
index 0000000..22bc687
--- /dev/null
+++ b/resources/js/components/compras/CanastaInput.vue
@@ -0,0 +1,69 @@
+<template>
+    <div class="block">
+        <div class="file has-name is-right">
+            <label class="file-label">
+                <input
+                    class="file-input"
+                    type="file"
+                    name="canasta"
+                    @change="onFileChange"
+                />
+                <span class="file-cta">
+                <span class="file-icon">
+                  <i class="fas fa-cloud-upload-alt"></i>
+                </span>
+                <span class="file-label">Subir canasta</span>
+              </span>
+                <span class="file-name" v-if="archivo">
+                {{ archivo.nombre }}
+              </span>
+            </label>
+        </div>
+    </div>
+</template>
+
+<script>
+import axios from "axios";
+
+export default {
+    name: "CanastaInput",
+    data() {
+        return {
+            archivo: null,
+            cargando: false,
+        };
+    },
+    methods: {
+        async onFileChange(event) {
+            const archivo = event.target.files[0];
+            if (archivo && archivo.type === "text/csv") {
+                this.archivo = { file: archivo, nombre: archivo.name };
+                const formData = new FormData();
+                formData.append("file", this.archivo.file);
+
+                try {
+                    this.cargando = true;
+                    const response = await axios.post("/cargar-canasta", formData, {
+                        headers: {
+                            "Content-Type": "multipart/form-data",
+                        },
+                    });
+                    this.$root.$toast(response.data.message || "Canasta cargada!");
+                } catch (error) {
+                    this.$root.$toast(error.response?.data?.message || "Hubo errores.");
+                } finally {
+                    this.cargando = false;
+                    this.archivo = null;
+                }
+            } else {
+                this.$root.$toast("La canasta debe ser .CSV")
+                this.archivo = null;
+            }
+        },
+    },
+};
+</script>
+
+<style scoped>
+
+</style>

From 131bf33a73b8f0f88f0dfcec366be419ca936d08 Mon Sep 17 00:00:00 2001
From: ale <ale.tasistro@gmail.com>
Date: Sat, 21 Dec 2024 14:29:48 -0300
Subject: [PATCH 07/23] Agregada ruta y logica para cargar canastas

---
 .gitignore                                    |  1 +
 app/Http/Controllers/ComprasController.php    | 16 ++++++++++++++
 .../js/components/compras/CanastaInput.vue    | 22 +++++++++----------
 routes/web.php                                |  1 +
 4 files changed, 29 insertions(+), 11 deletions(-)

diff --git a/.gitignore b/.gitignore
index 6de1c86..7c37daf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,6 +12,7 @@ npm-debug.log
 yarn-error.log
 .idea
 /resources/csv/exports/*.csv
+/resources/csv/canastas/*.csv
 /public/css/
 /public/js/
 /public/mix-manifest.json
diff --git a/app/Http/Controllers/ComprasController.php b/app/Http/Controllers/ComprasController.php
index 48e9ef4..48ee549 100644
--- a/app/Http/Controllers/ComprasController.php
+++ b/app/Http/Controllers/ComprasController.php
@@ -4,6 +4,7 @@ namespace App\Http\Controllers;
 
 use App\GrupoDeCompra;
 use App\Producto;
+use Illuminate\Http\Request;
 
 class ComprasController
 {
@@ -33,4 +34,19 @@ class ComprasController
     {
         return view('auth/compras_login');
     }
+
+    public function cargarCanasta(Request $request)
+    {
+        $request->validate([
+            'data' => 'required|file|mimes:csv,txt|max:2048',
+        ]);
+
+        $archivo = $request->file('data');
+        $path = resource_path('/csv/canastas/');
+        $archivo->move($path, $archivo->getClientOriginalName());
+
+        return response()->json([
+            'message' => 'Canasta cargada exitosamente',
+        ], 200);
+    }
 }
diff --git a/resources/js/components/compras/CanastaInput.vue b/resources/js/components/compras/CanastaInput.vue
index 22bc687..0cb55b2 100644
--- a/resources/js/components/compras/CanastaInput.vue
+++ b/resources/js/components/compras/CanastaInput.vue
@@ -6,14 +6,14 @@
                     class="file-input"
                     type="file"
                     name="canasta"
-                    @change="onFileChange"
+                    @change="archivoSubido"
                 />
                 <span class="file-cta">
-                <span class="file-icon">
-                  <i class="fas fa-cloud-upload-alt"></i>
-                </span>
-                <span class="file-label">Subir canasta</span>
-              </span>
+                    <span class="file-icon">
+                      <i class="fas fa-cloud-upload-alt"></i>
+                    </span>
+                    <span class="file-label">Subir canasta</span>
+                  </span>
                 <span class="file-name" v-if="archivo">
                 {{ archivo.nombre }}
               </span>
@@ -34,21 +34,21 @@ export default {
         };
     },
     methods: {
-        async onFileChange(event) {
+        async archivoSubido(event) {
             const archivo = event.target.files[0];
             if (archivo && archivo.type === "text/csv") {
-                this.archivo = { file: archivo, nombre: archivo.name };
+                this.archivo = {data: archivo, nombre: archivo.name};
                 const formData = new FormData();
-                formData.append("file", this.archivo.file);
+                formData.append("data", this.archivo.data);
 
                 try {
                     this.cargando = true;
-                    const response = await axios.post("/cargar-canasta", formData, {
+                    const response = await axios.post("/compras/canasta", formData, {
                         headers: {
                             "Content-Type": "multipart/form-data",
                         },
                     });
-                    this.$root.$toast(response.data.message || "Canasta cargada!");
+                    this.$root.$toast(response.data.message || "Canasta cargada exitosamente");
                 } catch (error) {
                     this.$root.$toast(error.response?.data?.message || "Hubo errores.");
                 } finally {
diff --git a/routes/web.php b/routes/web.php
index d6f239f..8604d18 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -83,4 +83,5 @@ Route::middleware(['compras'])->group( function() {
     Route::get('/compras/pedidos/descargar', 'ComprasController@descargarPedidos')->name('compras.pedidos.descargar');
     Route::get('/compras/pedidos/notas', 'ComprasController@descargarNotas')->name('compras.pedidos.descargar');
     Route::get('/compras/pedidos/transporte', 'ComprasController@descargarTransporte')->name('compras.pedidos.descargar');
+    Route::post('/compras/canasta', 'ComprasController@cargarCanasta')->name('compras.canasta');
 });

From ac4d5895be4b9e178627d6e7708abd7ab0c40437 Mon Sep 17 00:00:00 2001
From: ale <ale.tasistro@gmail.com>
Date: Sat, 21 Dec 2024 14:56:53 -0300
Subject: [PATCH 08/23] Logica de trabajo con CSV y carga movida a
 CanastaHelper.php

---
 app/Helpers/CanastaHelper.php    | 97 ++++++++++++++++++++++++++++++++
 database/seeds/CanastaSeeder.php | 83 +--------------------------
 2 files changed, 100 insertions(+), 80 deletions(-)
 create mode 100644 app/Helpers/CanastaHelper.php

diff --git a/app/Helpers/CanastaHelper.php b/app/Helpers/CanastaHelper.php
new file mode 100644
index 0000000..1433781
--- /dev/null
+++ b/app/Helpers/CanastaHelper.php
@@ -0,0 +1,97 @@
+<?php
+
+namespace App\Helpers;
+
+use App\Proveedor;
+use DatabaseSeeder;
+use Illuminate\Support\Arr;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Str;
+use League\Csv\Reader;
+
+class CanastaHelper
+{
+    const FILA_HEADER = "Tipo";
+    const ULTIMA_FILA = "TOTAL";
+
+    public static function cargarCanasta($archivo) {
+        $csv = Reader::createFromPath(resource_path($archivo), 'r');
+        $csv->setDelimiter("|");
+        $iHeader = self::obtenerIndiceDeHeader($csv);
+        $csv->setHeaderOffset($iHeader);
+        $registros = $csv->getRecords();
+
+        $toInsert = [];
+        $categoria = '';
+        foreach($registros as $i => $registro){
+            //filas que están arriba del header
+            if ($i <= $iHeader){
+                continue;
+            }
+
+            //finalizar
+            if ($registro[self::FILA_HEADER] == self::ULTIMA_FILA) {
+                break;
+            }
+
+            //filas que no tienen tipo
+            if (!Arr::has($registro,self::FILA_HEADER)|| trim($registro[self::FILA_HEADER]) == ''){
+                var_dump("no hay tipo en la fila " . $i);
+                continue;
+            }
+
+            //saltear bono de transporte
+            if ($registro[self::FILA_HEADER] == "T"){
+                continue;
+            }
+
+            //obtener categoria
+            if ($registro['Producto'] == '') {
+                //es la pregunta de la copa?
+                if (Str::contains($registro[self::FILA_HEADER],"¿")) { continue; }
+                $categoria = $registro[self::FILA_HEADER];
+                continue;
+            }
+
+            //completar producto
+            $toInsert[] = [
+                'fila'          => $i,
+                'categoria'     => $categoria,
+                'nombre'        => trim(str_replace('*', ' ',$registro['Producto'])),
+                'precio'        => $registro['Precio'],
+                'proveedor_id'  => self::obtenerProveedor($registro['Producto']),
+                'bono'          => $registro[self::FILA_HEADER] == "B",
+                'requiere_notas'=> $registro[self::FILA_HEADER] =="PTC",
+            ];
+        }
+
+        foreach (array_chunk($toInsert,DatabaseSeeder::CHUNK_SIZE) as $chunk)
+        {
+            DB::table('productos')->insert($chunk);
+        }
+    }
+
+    private static function obtenerIndiceDeHeader($csv){
+        $registros = $csv->getRecords();
+        $iheader = 0;
+        foreach ($registros as $i => $registro){
+            if (strtolower($registro[0]) == strtolower(self::FILA_HEADER)) {
+                $iheader = $i;
+                break;
+            }
+        }
+        return $iheader;
+    }
+
+    private static function obtenerProveedor($nombre) {
+        $result = null;
+        if (Str::contains($nombre,"*")){
+            $result = Proveedor::firstOrCreate([
+                'nombre' => 'Proveedor de economía solidaria',
+                'economia_solidaria' => 1,
+                'nacional' => 1
+            ])->id;
+        }
+        return $result;
+    }
+}
diff --git a/database/seeds/CanastaSeeder.php b/database/seeds/CanastaSeeder.php
index 0edc5b5..90775b0 100644
--- a/database/seeds/CanastaSeeder.php
+++ b/database/seeds/CanastaSeeder.php
@@ -1,13 +1,13 @@
 <?php
 
+use App\Helpers\CanastaHelper;
 use Illuminate\Database\Seeder;
 use League\Csv\Reader;
 use App\Proveedor;
 
 class CanastaSeeder extends Seeder
 {
-    const FILA_HEADER = "Tipo";
-    const ULTIMA_FILA = "TOTAL";
+    const ARCHIVO_DEFAULT = 'csv/productos.csv';
 
     /**
      * Run the database seeds.
@@ -16,83 +16,6 @@ class CanastaSeeder extends Seeder
      */
     public function run()
     {
-        $csv = Reader::createFromPath(resource_path('csv/productos.csv'), 'r');
-        $csv->setDelimiter("|");
-        $iHeader = $this->obtenerIndiceDeHeader($csv);
-        $csv->setHeaderOffset($iHeader);
-        $registros = $csv->getRecords();
-
-        $toInsert = [];
-        $categoria = '';
-        foreach($registros as $i => $registro){
-            //filas que están arriba del header
-            if ($i <= $iHeader){
-                continue;
-            }
-
-            //finalizar
-            if ($registro[$this::FILA_HEADER] == $this::ULTIMA_FILA){
-                break;
-            }
-
-            //filas que no tienen tipo
-            if (!Arr::has($registro,$this::FILA_HEADER)|| trim($registro[$this::FILA_HEADER]) == ''){
-                var_dump("no hay tipo en la fila " . $i);
-                continue;
-            }
-
-            //saltear bono de transporte
-            if ($registro[$this::FILA_HEADER] == "T"){
-                continue;
-            }
-
-            //obtener categoria
-            if ($registro['Producto'] == '') {
-                //es la pregunta de la copa?
-                if (Str::contains($registro[$this::FILA_HEADER],"¿")) { continue; }
-                $categoria = $registro[$this::FILA_HEADER];
-                continue;
-            }
-
-            //completar producto
-            $toInsert[] = [
-                'fila'          => $i,
-                'categoria'     => $categoria,
-                'nombre'        => trim(str_replace('*', ' ',$registro['Producto'])),
-                'precio'        => $registro['Precio'],
-                'proveedor_id'  => $this->obtenerProveedor($registro['Producto']),
-                'bono'          => $registro[$this::FILA_HEADER] == "B",
-                'requiere_notas'=> $registro[$this::FILA_HEADER] =="PTC",
-            ];
-        }
-
-        foreach (array_chunk($toInsert,DatabaseSeeder::CHUNK_SIZE) as $chunk)
-        {
-            DB::table('productos')->insert($chunk);
-        }
-    }
-
-    private function obtenerIndiceDeHeader($csv){
-        $registros = $csv->getRecords();
-        $iheader = 0;
-        foreach ($registros as $i => $registro){
-            if (strtolower($registro[0]) == strtolower($this::FILA_HEADER)) {
-                $iheader = $i;
-                break;
-            }
-        }
-        return $iheader;
-    }
-
-    private function obtenerProveedor($nombre) {
-        $result = null;
-        if (Str::contains($nombre,"*")){
-            $result = Proveedor::firstOrCreate([
-                'nombre' => 'Proveedor de economía solidaria',
-                'economia_solidaria' => 1,
-                'nacional' => 1
-            ])->id;
-        }
-        return $result;
+        CanastaHelper::cargarCanasta(self::ARCHIVO_DEFAULT);
     }
 }

From 57b8d6bcceb4206bf10ec7af1fd310a0b956a696 Mon Sep 17 00:00:00 2001
From: ale <ale.tasistro@gmail.com>
Date: Sat, 21 Dec 2024 14:57:03 -0300
Subject: [PATCH 09/23] Agregada logica para cargar canasta

---
 app/Http/Controllers/ComprasController.php | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/app/Http/Controllers/ComprasController.php b/app/Http/Controllers/ComprasController.php
index 48ee549..d30db9d 100644
--- a/app/Http/Controllers/ComprasController.php
+++ b/app/Http/Controllers/ComprasController.php
@@ -3,11 +3,14 @@
 namespace App\Http\Controllers;
 
 use App\GrupoDeCompra;
+use App\Helpers\CanastaHelper;
 use App\Producto;
 use Illuminate\Http\Request;
 
 class ComprasController
 {
+    const CANASTAS_PATH = 'csv/canastas/';
+
     public function indexPedidos() {
         return view('compras_pedidos');
     }
@@ -41,9 +44,11 @@ class ComprasController
             'data' => 'required|file|mimes:csv,txt|max:2048',
         ]);
 
-        $archivo = $request->file('data');
-        $path = resource_path('/csv/canastas/');
-        $archivo->move($path, $archivo->getClientOriginalName());
+        $data = $request->file('data');
+        $nombre = $data->getClientOriginalName();
+
+        $data->move(resource_path(self::CANASTAS_PATH), $nombre);
+        CanastaHelper::cargarCanasta(self::CANASTAS_PATH . $nombre);
 
         return response()->json([
             'message' => 'Canasta cargada exitosamente',

From 95a9a404d2a0bc4b8faf2a9f3020a527ba997ce2 Mon Sep 17 00:00:00 2001
From: ale <ale.tasistro@gmail.com>
Date: Sat, 21 Dec 2024 15:08:35 -0300
Subject: [PATCH 10/23] Manejo de archivos movido a helper y limpieza

---
 app/Helpers/CanastaHelper.php              | 8 ++++++++
 app/Http/Controllers/ComprasController.php | 5 +----
 database/seeds/CanastaSeeder.php           | 2 --
 3 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/app/Helpers/CanastaHelper.php b/app/Helpers/CanastaHelper.php
index 1433781..c0b933b 100644
--- a/app/Helpers/CanastaHelper.php
+++ b/app/Helpers/CanastaHelper.php
@@ -14,6 +14,14 @@ class CanastaHelper
     const FILA_HEADER = "Tipo";
     const ULTIMA_FILA = "TOTAL";
 
+    public static function guardarCanasta($data, $path): string
+    {
+        $nombre = $data->getClientOriginalName();
+
+        $data->move(resource_path($path), $nombre);
+        return $nombre;
+    }
+
     public static function cargarCanasta($archivo) {
         $csv = Reader::createFromPath(resource_path($archivo), 'r');
         $csv->setDelimiter("|");
diff --git a/app/Http/Controllers/ComprasController.php b/app/Http/Controllers/ComprasController.php
index d30db9d..a2e01f6 100644
--- a/app/Http/Controllers/ComprasController.php
+++ b/app/Http/Controllers/ComprasController.php
@@ -44,10 +44,7 @@ class ComprasController
             'data' => 'required|file|mimes:csv,txt|max:2048',
         ]);
 
-        $data = $request->file('data');
-        $nombre = $data->getClientOriginalName();
-
-        $data->move(resource_path(self::CANASTAS_PATH), $nombre);
+        $nombre = CanastaHelper::guardarCanasta($request->file('data'), self::CANASTAS_PATH);
         CanastaHelper::cargarCanasta(self::CANASTAS_PATH . $nombre);
 
         return response()->json([
diff --git a/database/seeds/CanastaSeeder.php b/database/seeds/CanastaSeeder.php
index 90775b0..167fa8f 100644
--- a/database/seeds/CanastaSeeder.php
+++ b/database/seeds/CanastaSeeder.php
@@ -2,8 +2,6 @@
 
 use App\Helpers\CanastaHelper;
 use Illuminate\Database\Seeder;
-use League\Csv\Reader;
-use App\Proveedor;
 
 class CanastaSeeder extends Seeder
 {

From c31b808f05ffd8546c8caeb8c6e6d9a7ad6f8437 Mon Sep 17 00:00:00 2001
From: ale <ale.tasistro@gmail.com>
Date: Sat, 21 Dec 2024 15:16:10 -0300
Subject: [PATCH 11/23] Agregada tabla para log de carga de canastas

---
 ...4_12_21_181409_crear_carga_de_canastas.php | 33 +++++++++++++++++++
 1 file changed, 33 insertions(+)
 create mode 100644 database/migrations/2024_12_21_181409_crear_carga_de_canastas.php

diff --git a/database/migrations/2024_12_21_181409_crear_carga_de_canastas.php b/database/migrations/2024_12_21_181409_crear_carga_de_canastas.php
new file mode 100644
index 0000000..66e81db
--- /dev/null
+++ b/database/migrations/2024_12_21_181409_crear_carga_de_canastas.php
@@ -0,0 +1,33 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CrearCargaDeCanastas extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('carga_de_canastas', function (Blueprint $table) {
+            $table->id();
+            $table->string('nombre');
+            $table->string('descripcion');
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('carga_de_canastas');
+    }
+}

From cc734866c5ac5b686c3b7aefa685f5d542a75308 Mon Sep 17 00:00:00 2001
From: ale <ale.tasistro@gmail.com>
Date: Sat, 21 Dec 2024 15:48:06 -0300
Subject: [PATCH 12/23] Agregada logica para logs de carga de canastas

---
 app/CanastaLog.php            | 11 +++++++++++
 app/Helpers/CanastaHelper.php | 28 ++++++++++++++++++++++++----
 2 files changed, 35 insertions(+), 4 deletions(-)
 create mode 100644 app/CanastaLog.php

diff --git a/app/CanastaLog.php b/app/CanastaLog.php
new file mode 100644
index 0000000..d079c84
--- /dev/null
+++ b/app/CanastaLog.php
@@ -0,0 +1,11 @@
+<?php
+
+namespace App;
+
+use Illuminate\Database\Eloquent\Model;
+
+class CanastaLog extends Model
+{
+    protected $fillable = ["nombre", "descripcion"];
+    protected $table = "carga_de_canastas";
+}
diff --git a/app/Helpers/CanastaHelper.php b/app/Helpers/CanastaHelper.php
index c0b933b..ad06271 100644
--- a/app/Helpers/CanastaHelper.php
+++ b/app/Helpers/CanastaHelper.php
@@ -3,6 +3,7 @@
 namespace App\Helpers;
 
 use App\Proveedor;
+use App\CanastaLog;
 use DatabaseSeeder;
 use Illuminate\Support\Arr;
 use Illuminate\Support\Facades\DB;
@@ -13,12 +14,16 @@ class CanastaHelper
 {
     const FILA_HEADER = "Tipo";
     const ULTIMA_FILA = "TOTAL";
+    const ARCHIVO_SUBIDO = 'Archivo subido';
+    const CANASTA_CARGADA = 'Canasta cargada';
 
-    public static function guardarCanasta($data, $path): string
-    {
+    public static function guardarCanasta($data, $path): string {
         $nombre = $data->getClientOriginalName();
 
         $data->move(resource_path($path), $nombre);
+
+        self::log($path . $nombre, self::ARCHIVO_SUBIDO);
+
         return $nombre;
     }
 
@@ -73,10 +78,11 @@ class CanastaHelper
             ];
         }
 
-        foreach (array_chunk($toInsert,DatabaseSeeder::CHUNK_SIZE) as $chunk)
-        {
+        foreach (array_chunk($toInsert,DatabaseSeeder::CHUNK_SIZE) as $chunk) {
             DB::table('productos')->insert($chunk);
         }
+
+        self::log($archivo, self::CANASTA_CARGADA);
     }
 
     private static function obtenerIndiceDeHeader($csv){
@@ -102,4 +108,18 @@ class CanastaHelper
         }
         return $result;
     }
+
+    /**
+     * @param $nombre
+     * @param $descripcion
+     * @return void
+     */
+    private static function log($nombre, $descripcion): void
+    {
+        $log = new CanastaLog([
+            'nombre' => $nombre,
+            'descripcion' => $descripcion,
+        ]);
+        $log->save();
+    }
 }

From 83016d38b07ebd9930d681fe761bf25c3a4d229f Mon Sep 17 00:00:00 2001
From: ale <ale.tasistro@gmail.com>
Date: Sun, 22 Dec 2024 01:51:53 -0300
Subject: [PATCH 13/23] Agregado instructivo para planilla de canasta

---
 app/Http/Controllers/ComprasController.php |  5 +++++
 resources/js/components/compras/Body.vue   | 20 ++++++++++++++++++++
 routes/web.php                             |  1 +
 3 files changed, 26 insertions(+)

diff --git a/app/Http/Controllers/ComprasController.php b/app/Http/Controllers/ComprasController.php
index a2e01f6..92be64e 100644
--- a/app/Http/Controllers/ComprasController.php
+++ b/app/Http/Controllers/ComprasController.php
@@ -51,4 +51,9 @@ class ComprasController
             'message' => 'Canasta cargada exitosamente',
         ], 200);
     }
+
+    public function descargarCanastaEjemplo() {
+        $file = resource_path('csv/productos.csv');
+        return response()->download($file);
+    }
 }
diff --git a/resources/js/components/compras/Body.vue b/resources/js/components/compras/Body.vue
index 9828a73..6e85c2b 100644
--- a/resources/js/components/compras/Body.vue
+++ b/resources/js/components/compras/Body.vue
@@ -11,6 +11,26 @@
         <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> Después del último producto, en la primera celda, debe estar la palabra "TOTAL", para indicar el final de la lista </li>
+                                <li> El nombre de la columna de precios debe ser "Precio" </li>
+                                <li> Las columnas deben separarse con '|' </li>
+                                <li> No puede haber "enters" en la planilla </li>
+                                <li> Todos los bonos deben tener tipo 'B' para evitar que paguen transporte </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>
+                        </div>
+                    </div>
+                </article>
                 <div class="buttons is-right">
                     <compras-canasta-input></compras-canasta-input>
                 </div>
diff --git a/routes/web.php b/routes/web.php
index 8604d18..b6d0392 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -84,4 +84,5 @@ Route::middleware(['compras'])->group( function() {
     Route::get('/compras/pedidos/notas', 'ComprasController@descargarNotas')->name('compras.pedidos.descargar');
     Route::get('/compras/pedidos/transporte', 'ComprasController@descargarTransporte')->name('compras.pedidos.descargar');
     Route::post('/compras/canasta', 'ComprasController@cargarCanasta')->name('compras.canasta');
+    Route::get('/compras/canasta/ejemplo', 'ComprasController@descargarCanastaEjemplo')->name('compras.canasta.ejemplo');
 });

From 9f93a170533cfc881ab3ba4b1d06642db7a39565 Mon Sep 17 00:00:00 2001
From: ale <ale.tasistro@gmail.com>
Date: Sun, 22 Dec 2024 01:54:04 -0300
Subject: [PATCH 14/23] Cambio mensaje

---
 resources/js/components/compras/Body.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/resources/js/components/compras/Body.vue b/resources/js/components/compras/Body.vue
index 6e85c2b..0508b51 100644
--- a/resources/js/components/compras/Body.vue
+++ b/resources/js/components/compras/Body.vue
@@ -23,7 +23,7 @@
                                 <li> Después del último producto, en la primera celda, debe estar la palabra "TOTAL", para indicar el final de la lista </li>
                                 <li> El nombre de la columna de precios debe ser "Precio" </li>
                                 <li> Las columnas deben separarse con '|' </li>
-                                <li> No puede haber "enters" en la planilla </li>
+                                <li> No puede haber "enters" en ningún campo de la planilla </li>
                                 <li> Todos los bonos deben tener tipo 'B' para evitar que paguen transporte </li>
                                 <li> El bono de transporte debe tener tipo 'T' </li>
                             </ul>

From 76f2af2ef97a710eeee7ac70253db0b683bed551 Mon Sep 17 00:00:00 2001
From: ale <ale.tasistro@gmail.com>
Date: Sun, 22 Dec 2024 09:43:57 -0300
Subject: [PATCH 15/23] Cambio mensaje

---
 resources/js/components/compras/Body.vue | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/resources/js/components/compras/Body.vue b/resources/js/components/compras/Body.vue
index 0508b51..97fc07e 100644
--- a/resources/js/components/compras/Body.vue
+++ b/resources/js/components/compras/Body.vue
@@ -20,10 +20,10 @@
                             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> Después del último producto, en la primera celda, debe estar la palabra "TOTAL", para indicar el final de la lista </li>
+                                <li> Después del último producto, en la primera columna, debe estar la palabra "TOTAL" para indicar el final de la lista </li>
                                 <li> El nombre de la columna de precios debe ser "Precio" </li>
-                                <li> Las columnas deben separarse con '|' </li>
-                                <li> No puede haber "enters" en ningún campo de la planilla </li>
+                                <li> Las celdas deben separarse con '|' </li>
+                                <li> No puede haber "enters" en ninguna celda </li>
                                 <li> Todos los bonos deben tener tipo 'B' para evitar que paguen transporte </li>
                                 <li> El bono de transporte debe tener tipo 'T' </li>
                             </ul>

From 30eb82220140348a37c8db8947a6c71b2500e1cf Mon Sep 17 00:00:00 2001
From: ale <ale.tasistro@gmail.com>
Date: Sun, 22 Dec 2024 10:28:05 -0300
Subject: [PATCH 16/23] Limpieza de tablas previa a cargar + bono barrial

---
 app/Helpers/CanastaHelper.php                 | 26 +++++++++++++++++++
 resources/js/components/compras/Body.vue      |  7 +++++
 .../js/components/compras/CanastaInput.vue    |  6 ++---
 3 files changed, 36 insertions(+), 3 deletions(-)

diff --git a/app/Helpers/CanastaHelper.php b/app/Helpers/CanastaHelper.php
index ad06271..8473cb2 100644
--- a/app/Helpers/CanastaHelper.php
+++ b/app/Helpers/CanastaHelper.php
@@ -2,6 +2,7 @@
 
 namespace App\Helpers;
 
+use App\Producto;
 use App\Proveedor;
 use App\CanastaLog;
 use DatabaseSeeder;
@@ -28,6 +29,8 @@ class CanastaHelper
     }
 
     public static function cargarCanasta($archivo) {
+        self::limpiarTablas();
+
         $csv = Reader::createFromPath(resource_path($archivo), 'r');
         $csv->setDelimiter("|");
         $iHeader = self::obtenerIndiceDeHeader($csv);
@@ -82,6 +85,8 @@ class CanastaHelper
             DB::table('productos')->insert($chunk);
         }
 
+        self::agregarBonoBarrial();
+
         self::log($archivo, self::CANASTA_CARGADA);
     }
 
@@ -122,4 +127,25 @@ class CanastaHelper
         ]);
         $log->save();
     }
+
+    private static function limpiarTablas()
+    {
+        DB::delete('delete from producto_subpedido');
+        DB::delete('delete from productos');
+        DB::delete('delete from subpedidos');
+    }
+
+    private static function agregarBonoBarrial()
+    {
+        $categoria = Producto::all()->pluck('categoria')->unique()->flatten()->first(function ($c) { return Str::contains($c, 'BONO'); });
+        DB::table('productos')->insert([
+            'fila' => 420,
+            'nombre' => "Bono barrial",
+            'precio' => 20,
+            'categoria' => $categoria,
+            'bono' => 1,
+            'proveedor_id'  => null,
+            'requiere_notas'=> false,
+        ]);
+    }
 }
diff --git a/resources/js/components/compras/Body.vue b/resources/js/components/compras/Body.vue
index 97fc07e..90a1490 100644
--- a/resources/js/components/compras/Body.vue
+++ b/resources/js/components/compras/Body.vue
@@ -28,6 +28,13 @@
                                 <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>
diff --git a/resources/js/components/compras/CanastaInput.vue b/resources/js/components/compras/CanastaInput.vue
index 0cb55b2..32eca4f 100644
--- a/resources/js/components/compras/CanastaInput.vue
+++ b/resources/js/components/compras/CanastaInput.vue
@@ -13,10 +13,10 @@
                       <i class="fas fa-cloud-upload-alt"></i>
                     </span>
                     <span class="file-label">Subir canasta</span>
-                  </span>
+                </span>
                 <span class="file-name" v-if="archivo">
-                {{ archivo.nombre }}
-              </span>
+                    {{ archivo.nombre }}
+                </span>
             </label>
         </div>
     </div>

From 345be9c6883b6d0aec2de98889013f2dceb462bc Mon Sep 17 00:00:00 2001
From: ale <ale.tasistro@gmail.com>
Date: Sun, 22 Dec 2024 23:41:25 -0300
Subject: [PATCH 17/23] Cambio mensaje

---
 resources/js/components/compras/Body.vue | 1 -
 1 file changed, 1 deletion(-)

diff --git a/resources/js/components/compras/Body.vue b/resources/js/components/compras/Body.vue
index 90a1490..8bb0d3d 100644
--- a/resources/js/components/compras/Body.vue
+++ b/resources/js/components/compras/Body.vue
@@ -20,7 +20,6 @@
                             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> Después del último producto, en la primera columna, debe estar la palabra "TOTAL" para indicar el final de la lista </li>
                                 <li> El nombre de la columna de precios debe ser "Precio" </li>
                                 <li> Las celdas deben separarse con '|' </li>
                                 <li> No puede haber "enters" en ninguna celda </li>

From 184b53cfc8d62273ca5a450486ff262ed5fb9bf2 Mon Sep 17 00:00:00 2001
From: ale <ale.tasistro@gmail.com>
Date: Mon, 23 Dec 2024 00:09:39 -0300
Subject: [PATCH 18/23] Cambios minimos

---
 resources/js/app.js                              | 2 +-
 resources/js/components/compras/Body.vue         | 4 ++--
 resources/js/components/compras/CanastaInput.vue | 2 +-
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/resources/js/app.js b/resources/js/app.js
index d61ca56..c2bf1a6 100644
--- a/resources/js/app.js
+++ b/resources/js/app.js
@@ -32,7 +32,7 @@ Vue.prototype.$rootMiga = {
 Vue.prototype.$settearProducto = function(cantidad, id) {
   Event.$emit("sync-subpedido", this.cant, this.producto.id)
 }
-Vue.prototype.$toast = function(mensaje, duration = 1000) {
+Vue.prototype.$toast = function(mensaje, duration = 2000) {
   return window.bulmaToast.toast({
     message: mensaje,
     duration: duration,
diff --git a/resources/js/components/compras/Body.vue b/resources/js/components/compras/Body.vue
index 8bb0d3d..8bcf794 100644
--- a/resources/js/components/compras/Body.vue
+++ b/resources/js/components/compras/Body.vue
@@ -1,9 +1,9 @@
 <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" id="pedidos-compras-seccion"
+        <div class="block pb-6" id="pedidos-compras-seccion"
              :class="seccionActiva === 'pedidos-compras-seccion' ? 'is-active' : 'is-hidden'">
-            <div class="block pb-6" id="pedidos-compras-tabla-y-dropdown">
+            <div class="block" id="pedidos-compras-tabla-y-dropdown">
                 <compras-dropdown-descargar>
                 </compras-dropdown-descargar>
             </div>
diff --git a/resources/js/components/compras/CanastaInput.vue b/resources/js/components/compras/CanastaInput.vue
index 32eca4f..99da19e 100644
--- a/resources/js/components/compras/CanastaInput.vue
+++ b/resources/js/components/compras/CanastaInput.vue
@@ -15,7 +15,7 @@
                     <span class="file-label">Subir canasta</span>
                 </span>
                 <span class="file-name" v-if="archivo">
-                    {{ archivo.nombre }}
+                    {{ 'Cargando ' + archivo.nombre }}
                 </span>
             </label>
         </div>

From 1f2ab91bd3c37a0f22b6f10cdae69daee96f9969 Mon Sep 17 00:00:00 2001
From: ale <ale.tasistro@gmail.com>
Date: Mon, 23 Dec 2024 15:57:18 -0300
Subject: [PATCH 19/23] Cambios nombre columna

---
 .../migrations/2024_12_21_181409_crear_carga_de_canastas.php    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/database/migrations/2024_12_21_181409_crear_carga_de_canastas.php b/database/migrations/2024_12_21_181409_crear_carga_de_canastas.php
index 66e81db..e746113 100644
--- a/database/migrations/2024_12_21_181409_crear_carga_de_canastas.php
+++ b/database/migrations/2024_12_21_181409_crear_carga_de_canastas.php
@@ -15,7 +15,7 @@ class CrearCargaDeCanastas extends Migration
     {
         Schema::create('carga_de_canastas', function (Blueprint $table) {
             $table->id();
-            $table->string('nombre');
+            $table->string('path');
             $table->string('descripcion');
             $table->timestamps();
         });

From d0ffcda22625d59d94d8d686aba9fd6118a897ca Mon Sep 17 00:00:00 2001
From: ale <ale.tasistro@gmail.com>
Date: Mon, 23 Dec 2024 15:58:14 -0300
Subject: [PATCH 20/23] Cambios nombre columna

---
 app/Helpers/CanastaHelper.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/Helpers/CanastaHelper.php b/app/Helpers/CanastaHelper.php
index 8473cb2..3e0d4e5 100644
--- a/app/Helpers/CanastaHelper.php
+++ b/app/Helpers/CanastaHelper.php
@@ -122,7 +122,7 @@ class CanastaHelper
     private static function log($nombre, $descripcion): void
     {
         $log = new CanastaLog([
-            'nombre' => $nombre,
+            'path' => $nombre,
             'descripcion' => $descripcion,
         ]);
         $log->save();

From 5feb2ff22f535f4ce1cf71beac8b662713a0f020 Mon Sep 17 00:00:00 2001
From: ale <ale.tasistro@gmail.com>
Date: Mon, 23 Dec 2024 15:58:33 -0300
Subject: [PATCH 21/23] Cambios nombre columna

---
 app/Helpers/CanastaHelper.php | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/app/Helpers/CanastaHelper.php b/app/Helpers/CanastaHelper.php
index 3e0d4e5..ce37cf7 100644
--- a/app/Helpers/CanastaHelper.php
+++ b/app/Helpers/CanastaHelper.php
@@ -115,14 +115,14 @@ class CanastaHelper
     }
 
     /**
-     * @param $nombre
+     * @param $path
      * @param $descripcion
      * @return void
      */
-    private static function log($nombre, $descripcion): void
+    private static function log($path, $descripcion): void
     {
         $log = new CanastaLog([
-            'path' => $nombre,
+            'path' => $path,
             'descripcion' => $descripcion,
         ]);
         $log->save();

From 7b36aa0b0c84e8d5d4af9b6b2f25d59a112b00df Mon Sep 17 00:00:00 2001
From: ale <ale.tasistro@gmail.com>
Date: Mon, 23 Dec 2024 18:54:49 -0300
Subject: [PATCH 22/23] Arreglado error en FilaCaracteristica.vue

---
 resources/js/components/admin/FilaCaracteristica.vue | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/resources/js/components/admin/FilaCaracteristica.vue b/resources/js/components/admin/FilaCaracteristica.vue
index 9d5654b..ea01839 100644
--- a/resources/js/components/admin/FilaCaracteristica.vue
+++ b/resources/js/components/admin/FilaCaracteristica.vue
@@ -6,7 +6,9 @@ export default {
         caracteristica: Object
     },
     data() {
-        gdc: undefined
+        return {
+            gdc: undefined
+        }
     },
     watch: {
         '$root.gdc' : {

From 94c2baff076d9092edde2abda871d2e459de8c70 Mon Sep 17 00:00:00 2001
From: ale <ale.tasistro@gmail.com>
Date: Tue, 24 Dec 2024 15:02:46 -0300
Subject: [PATCH 23/23] Arreglado nombre de campo

---
 app/CanastaLog.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/CanastaLog.php b/app/CanastaLog.php
index d079c84..a6de251 100644
--- a/app/CanastaLog.php
+++ b/app/CanastaLog.php
@@ -6,6 +6,6 @@ use Illuminate\Database\Eloquent\Model;
 
 class CanastaLog extends Model
 {
-    protected $fillable = ["nombre", "descripcion"];
+    protected $fillable = ["path", "descripcion"];
     protected $table = "carga_de_canastas";
 }