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/CanastaLog.php b/app/CanastaLog.php new file mode 100644 index 0000000..a6de251 --- /dev/null +++ b/app/CanastaLog.php @@ -0,0 +1,11 @@ +getClientOriginalName(); + + $data->move(resource_path($path), $nombre); + + self::log($path . $nombre, self::ARCHIVO_SUBIDO); + + return $nombre; + } + + public static function cargarCanasta($archivo) { + self::limpiarTablas(); + + $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); + } + + self::agregarBonoBarrial(); + + self::log($archivo, self::CANASTA_CARGADA); + } + + 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; + } + + /** + * @param $path + * @param $descripcion + * @return void + */ + private static function log($path, $descripcion): void + { + $log = new CanastaLog([ + 'path' => $path, + 'descripcion' => $descripcion, + ]); + $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/app/Http/Controllers/ComprasController.php b/app/Http/Controllers/ComprasController.php index 48e9ef4..92be64e 100644 --- a/app/Http/Controllers/ComprasController.php +++ b/app/Http/Controllers/ComprasController.php @@ -3,10 +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'); } @@ -33,4 +37,23 @@ class ComprasController { return view('auth/compras_login'); } + + public function cargarCanasta(Request $request) + { + $request->validate([ + 'data' => 'required|file|mimes:csv,txt|max:2048', + ]); + + $nombre = CanastaHelper::guardarCanasta($request->file('data'), self::CANASTAS_PATH); + CanastaHelper::cargarCanasta(self::CANASTAS_PATH . $nombre); + + return response()->json([ + 'message' => 'Canasta cargada exitosamente', + ], 200); + } + + public function descargarCanastaEjemplo() { + $file = resource_path('csv/productos.csv'); + return response()->download($file); + } } 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..e746113 --- /dev/null +++ b/database/migrations/2024_12_21_181409_crear_carga_de_canastas.php @@ -0,0 +1,33 @@ +id(); + $table->string('path'); + $table->string('descripcion'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('carga_de_canastas'); + } +} diff --git a/database/seeds/CanastaSeeder.php b/database/seeds/CanastaSeeder.php index 0edc5b5..167fa8f 100644 --- a/database/seeds/CanastaSeeder.php +++ b/database/seeds/CanastaSeeder.php @@ -1,13 +1,11 @@ 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); } } 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/admin/Body.vue b/resources/js/components/admin/Body.vue index 5010fa6..1b4b8c5 100644 --- a/resources/js/components/admin/Body.vue +++ b/resources/js/components/admin/Body.vue @@ -1,6 +1,6 @@