diff --git a/.gitignore b/.gitignore index 7c37daf..68da81a 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,8 @@ yarn-error.log .idea /resources/csv/exports/*.csv /resources/csv/canastas/*.csv +/storage/csv/exports/*.csv +/storage/csv/canastas/*.csv /public/css/ /public/js/ /public/mix-manifest.json diff --git a/app/GrupoDeCompra.php b/app/GrupoDeCompra.php index a5f8cc4..a16f87b 100644 --- a/app/GrupoDeCompra.php +++ b/app/GrupoDeCompra.php @@ -117,7 +117,8 @@ class GrupoDeCompra extends Model public function exportarPedidosAPdf() { $subpedidos = $this->pedidosAprobados(); - PdfHelper::exportarPedidos($this->nombre . '.pdf', $subpedidos); + $fecha = now()->format('Y-m-d'); + PdfHelper::exportarPedidos($this->nombre . '-' . $fecha . '.pdf', $subpedidos); } function pedidoParaPdf(): array @@ -150,7 +151,8 @@ class GrupoDeCompra extends Model public static function exportarPedidosBarrialesAPdf() { $barrios = GrupoDeCompra::barriosMenosPrueba()->get(); - PdfHelper::exportarPedidos('pedidos_por_barrio.pdf', $barrios); + $fecha = now()->format('Y-m-d'); + PdfHelper::exportarPedidos('pedidos_por_barrio-' . $fecha . '.pdf', $barrios); } static function filaVacia(string $product, int $columns): array @@ -184,7 +186,8 @@ class GrupoDeCompra extends Model { $records = $this->generarColumnaCantidades(); - CsvHelper::generarCsv('csv/exports/' . $this->nombre . '.csv', $records); + $fecha = now()->format('Y-m-d'); + CsvHelper::generarCsv('csv/exports/' . $this->nombre . '-' . $fecha . '.csv', $records); } public function generarColumnaCantidades(): array @@ -241,7 +244,8 @@ class GrupoDeCompra extends Model } array_splice($records, 0, 0, array($nucleos)); - CsvHelper::generarCsv('csv/exports/' . $this->nombre . '-completo.csv', $records); + $fecha = now()->format('Y-m-d'); + CsvHelper::generarCsv('csv/exports/' . $this->nombre . '-completo-' . $fecha . '.csv', $records); } public function agregarCantidad($pedido, $id, array $records, $fila, int $i): array diff --git a/app/Helpers/CanastaHelper.php b/app/Helpers/CanastaHelper.php index 5ec9485..bda7f71 100644 --- a/app/Helpers/CanastaHelper.php +++ b/app/Helpers/CanastaHelper.php @@ -7,6 +7,7 @@ use App\CanastaLog; use DatabaseSeeder; use Illuminate\Support\Arr; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\File; use Illuminate\Support\Str; class CanastaHelper @@ -19,10 +20,25 @@ class CanastaHelper const CANASTA_CARGADA = 'Canasta cargada'; const PRODUCTO_TALLE_COLOR = "PTC"; + public static function canastaActual() { + $result = []; + $log = CanastaLog::where('descripcion', self::CANASTA_CARGADA) + ->orderBy('created_at', 'desc') + ->first(); + $nombre = str_replace("csv/canastas/", "", $log->path); + $result["nombre"] = str_replace(".csv", "", $nombre); + $result["fecha"] = $log->created_at; + return $result; + } + public static function guardarCanasta($data, $path): string { + if (!File::exists(storage_path('csv/canastas'))) { + File::makeDirectory(storage_path('csv/canastas'), 0755, true); + } + $nombre = $data->getClientOriginalName(); - $data->move(resource_path($path), $nombre); + $data->move(storage_path($path), $nombre); self::log($path . $nombre, self::ARCHIVO_SUBIDO); diff --git a/app/Helpers/CsvHelper.php b/app/Helpers/CsvHelper.php index 95f2cfd..5686b96 100644 --- a/app/Helpers/CsvHelper.php +++ b/app/Helpers/CsvHelper.php @@ -2,6 +2,7 @@ namespace App\Helpers; +use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\Log; use Iterator; use League\Csv\CannotInsertRecord; @@ -13,7 +14,7 @@ use League\Csv\Writer; class CsvHelper { public static function getRecords($filePath): Iterator { - $csv = Reader::createFromPath(resource_path($filePath)); + $csv = Reader::createFromPath(storage_path($filePath)); try { $csv->setDelimiter("|"); $csv->setEnclosure("'"); @@ -27,8 +28,12 @@ class CsvHelper public static function generarCsv($filePath, $contenido, $headers = null): void { + if (!File::exists(storage_path('csv/exports'))) { + File::makeDirectory(storage_path('csv/exports'), 0755, true); + } + try { - $writer = Writer::createFromPath(resource_path($filePath), 'w'); + $writer = Writer::createFromPath(storage_path($filePath), 'w'); if ($headers) { $writer->insertOne($headers); } diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index c7312df..3073578 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -23,14 +23,26 @@ class AdminController extends Controller public function exportarPedidoACSV(GrupoDeCompra $gdc): BinaryFileResponse { $gdc->exportarPedidoEnCSV(); - $file = resource_path('csv/exports/'.$gdc->nombre.'.csv'); - return response()->download($file); + $pattern = storage_path('csv/exports/'. $gdc->nombre . '-*.csv'); + $files = glob($pattern); + + usort($files, function ($a, $b) { + return filemtime($b) <=> filemtime($a); + }); + + return response()->download($files[0]); } public function exportarPedidoConNucleosACSV(GrupoDeCompra $gdc): BinaryFileResponse { $gdc->exportarPedidoConNucleosEnCSV(); - $file = resource_path('csv/exports/'.$gdc->nombre.'-completo.csv'); - return response()->download($file); + $pattern = storage_path('csv/exports/'.$gdc->nombre.'-completo-*.csv'); + $files = glob($pattern); + + usort($files, function ($a, $b) { + return filemtime($b) <=> filemtime($a); + }); + + return response()->download($files[0]); } } diff --git a/app/Http/Controllers/Api/CanastaController.php b/app/Http/Controllers/Api/CanastaController.php new file mode 100644 index 0000000..510a364 --- /dev/null +++ b/app/Http/Controllers/Api/CanastaController.php @@ -0,0 +1,13 @@ +json(CanastaHelper::canastaActual()); + } +} diff --git a/app/Http/Controllers/ComisionesController.php b/app/Http/Controllers/ComisionesController.php new file mode 100644 index 0000000..9ffd3f1 --- /dev/null +++ b/app/Http/Controllers/ComisionesController.php @@ -0,0 +1,70 @@ + filemtime($a); + }); + + return response()->download($files[0]); + } + + public function descargarNotas(): BinaryFileResponse + { + Producto::planillaNotas(); + $pattern = storage_path('csv/exports/notas-por-barrio-*.csv'); + $files = glob($pattern); + + usort($files, function ($a, $b) { + return filemtime($b) <=> filemtime($a); + }); + + return response()->download($files[0]); + } + + public function pdf() { + GrupoDeCompra::exportarPedidosBarrialesAPdf(); + } + + public function cargarCanasta(Request $request): JsonResponse + { + $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', + ]); + } + + public function descargarCanastaEjemplo(): BinaryFileResponse + { + $file = storage_path('csv/productos.csv'); + return response()->download($file); + } +} diff --git a/app/Http/Controllers/RouteController.php b/app/Http/Controllers/RouteController.php index 3d29cdc..e5b4a57 100644 --- a/app/Http/Controllers/RouteController.php +++ b/app/Http/Controllers/RouteController.php @@ -22,7 +22,7 @@ class RouteController extends Controller case $admin->id: return redirect('/admin'); case $comision->id: - return redirect('/compras'); + return redirect('/comisiones'); default: abort(400, 'Rol de usuario invalido'); } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index ddef983..cbf821d 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -57,8 +57,6 @@ class Kernel extends HttpKernel */ protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, - 'admin' => \App\Http\Middleware\Admin::class, - 'compras' => \App\Http\Middleware\Compras::class, 'role' => \App\Http\Middleware\CheckRole::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index 265a157..7eabcdf 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -18,8 +18,8 @@ class Authenticate extends Middleware $path = $request->path(); if (preg_match('~^admin.*~i', $path)) return route('admin.login'); - if (preg_match('~^compras.*~i', $path)) - return route('compras.login'); + if (preg_match('~^comisiones.*~i', $path)) + return route('comisiones.login'); return route('login'); } } diff --git a/app/Producto.php b/app/Producto.php index 15c19ae..505909d 100644 --- a/app/Producto.php +++ b/app/Producto.php @@ -109,7 +109,8 @@ class Producto extends Model $planilla[$filaTransporte][] = $cantidad; } - CsvHelper::generarCsv('csv/exports/pedidos-por-barrio.csv', $planilla, $headers); + $fecha = now()->format('Y-m-d'); + CsvHelper::generarCsv('csv/exports/pedidos-por-barrio- ' . $fecha . '.csv', $planilla, $headers); } public static function notasPorBarrio(): Collection @@ -146,6 +147,7 @@ class Producto extends Model $planilla[] = $fila; } - CsvHelper::generarCsv('csv/exports/notas-por-barrio.csv', $planilla, $headers); + $fecha = now()->format('Y-m-d'); + CsvHelper::generarCsv('csv/exports/notas-por-barrio-' . $fecha . '.csv', $planilla, $headers); } } diff --git a/resources/js/components/AppMain.vue b/resources/js/components/AppMain.vue index ffd0e0e..6d35896 100644 --- a/resources/js/components/AppMain.vue +++ b/resources/js/components/AppMain.vue @@ -1,14 +1,17 @@ diff --git a/resources/js/components/login/LoginInput.vue b/resources/js/components/login/LoginInput.vue index 04584a8..8305deb 100644 --- a/resources/js/components/login/LoginInput.vue +++ b/resources/js/components/login/LoginInput.vue @@ -14,7 +14,7 @@ export default { diff --git a/resources/js/components/pedidos/Body.vue b/resources/js/components/pedidos/Body.vue index 5c23c20..706adc2 100644 --- a/resources/js/components/pedidos/Body.vue +++ b/resources/js/components/pedidos/Body.vue @@ -25,6 +25,7 @@ import NavMigas from "./NavMigas.vue"; import Chismosa from "./Chismosa.vue"; export default { + name: "PedidosBody", components: { Chismosa, NavMigas, CartelPedidoAprobado, PedidoSelect, Canasta }, computed: { ...mapGetters('pedido', ["pedidoDefinido"]), diff --git a/resources/js/store/modules/login.js b/resources/js/store/modules/login.js index d41dad9..e5b9fcd 100644 --- a/resources/js/store/modules/login.js +++ b/resources/js/store/modules/login.js @@ -58,7 +58,7 @@ const getters = { ayuda: "Si no la sabés, consultá a la comisión informática", label: "Seleccioná tu región" }; - case 'compras': + case 'comisiones': return { titulo: "Comisiones MPS", subtitlo: "página de comisiones", @@ -87,7 +87,7 @@ const getters = { texto: "has-text-white", botones: "is-warning", }; - case 'compras': + case 'comisiones': return { fondo: "has-background-warning", texto: "", @@ -109,9 +109,9 @@ const getters = { case 'admin': return [ { nombre: "Pedidos", href: "/" }, - { nombre: "Compras", href: "/compras" } + { nombre: "Comisiones", href: "/comisiones" } ]; - case 'compras': + case 'comisiones': return [ { nombre: "Pedidos", href: "/" }, { nombre: "Administración", href: "/admin" } @@ -119,7 +119,7 @@ const getters = { case 'pedido': return [ { nombre: "Administración", href: "/admin" }, - { nombre: "Compras", href: "/compras" } + { nombre: "Comisiones", href: "/comisiones" } ]; default: throw new Error("Url inválida"); diff --git a/resources/js/store/modules/ui.js b/resources/js/store/modules/ui.js index a8b6c91..02367ec 100644 --- a/resources/js/store/modules/ui.js +++ b/resources/js/store/modules/ui.js @@ -2,9 +2,13 @@ const state = { show_chismosa: false, show_devoluciones: false, migas: [{ nombre: 'Pedidos', action: 'pedido/resetear' }], + canasta_actual: null, }; const mutations = { + setCanastaActual(state, { canasta }) { + state.canasta_actual = canasta; + }, toggleChismosa(state) { state.show_chismosa = !state.show_chismosa; }, @@ -25,6 +29,10 @@ const mutations = { }; const actions = { + async getCanastaActual({ commit }) { + const response = await axios.get('/api/canasta-actual'); + commit("setCanastaActual", { canasta: response.data }); + }, clickMiga({ dispatch }, { miga }) { let dropWhile = (array, pred) => { let result = array.slice(0); diff --git a/routes/api.php b/routes/api.php index e2acfdd..c9d08d1 100644 --- a/routes/api.php +++ b/routes/api.php @@ -17,6 +17,8 @@ Route::middleware('api')->group(function() { Route::get('/regiones', 'Api\GrupoDeCompraController@regiones'); Route::get('/regiones/{region}', 'Api\GrupoDeCompraController@region'); + Route::get('/canasta-actual', 'Api\CanastaController@canastaActual'); + Route::prefix('grupos-de-compra')->group(function() { Route::get('/', 'Api\GrupoDeCompraController@index'); Route::get('/{grupoDeCompra}', 'Api\GrupoDeCompraController@show'); diff --git a/routes/web.php b/routes/web.php index b963c10..a0cade9 100644 --- a/routes/web.php +++ b/routes/web.php @@ -45,14 +45,14 @@ Route::middleware(['auth', 'role:admin_barrio'])->group(function () { Route::get('/admin/exportar-pedido-con-nucleos-a-csv/{gdc}', 'AdminController@exportarPedidoConNucleosACSV'); }); -Route::get('/compras/login', 'ComprasController@show')->name('compras.login'); +Route::get('/comisiones/login', 'ComisionesController@show')->name('comisiones.login'); Route::middleware(['auth', 'role:comision'])->group( function() { - Route::get('/compras', 'RouteController@main')->name('compras'); - 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/pdf', 'ComprasController@pdf')->name('compras.pedidos.pdf'); - Route::get('/compras/canasta/ejemplo', 'ComprasController@descargarCanastaEjemplo')->name('compras.canasta.ejemplo'); - Route::post('/compras/canasta', 'ComprasController@cargarCanasta')->name('compras.canasta'); - Route::post('/compras/saldos', 'ComprasController@cargarSaldos')->name('compras.canasta'); + Route::get('/comisiones', 'RouteController@main')->name('comisiones'); + Route::get('/comisiones/pedidos/descargar', 'ComisionesController@descargarPedidos')->name('comisiones.pedidos.descargar'); + Route::get('/comisiones/pedidos/notas', 'ComisionesController@descargarNotas')->name('comisiones.pedidos.descargar'); + Route::get('/comisiones/pedidos/pdf', 'ComisionesController@pdf')->name('comisiones.pedidos.pdf'); + Route::get('/comisiones/canasta/ejemplo', 'ComisionesController@descargarCanastaEjemplo')->name('comisiones.canasta.ejemplo'); + Route::post('/comisiones/canasta', 'ComisionesController@cargarCanasta')->name('comisiones.canasta'); + Route::post('/comisiones/saldos', 'ComprasController@cargarSaldos')->name('compras.canasta'); }); diff --git a/run_watch.sh b/run_watch.sh new file mode 100755 index 0000000..f0fbd92 --- /dev/null +++ b/run_watch.sh @@ -0,0 +1 @@ +sudo docker compose exec app npm run watch