diff --git a/app/Helpers/CsvHelper.php b/app/Helpers/CsvHelper.php index c27ff6d..c8d8c5a 100644 --- a/app/Helpers/CsvHelper.php +++ b/app/Helpers/CsvHelper.php @@ -2,6 +2,7 @@ namespace App\Helpers; +use App\Http\Controllers\ComisionesController; use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\Log; use Iterator; @@ -13,15 +14,13 @@ use League\Csv\Writer; class CsvHelper { + /** * @throws Exception */ public static function getRecords($filePath, $message): Iterator { - $csv = Reader::createFromPath($filePath); try { - $csv->setDelimiter("|"); - $csv->setEnclosure("'"); - $csv->setHeaderOffset(0); + $csv = self::getReader($filePath); return $csv->getRecords(); } catch (InvalidArgument|Exception $e) { Log::error($e->getMessage()); @@ -29,20 +28,74 @@ class CsvHelper } } - public static function generarCsv($filePath, $contenido, $headers = null): void + /** + * @throws Exception + */ + public static function cambiarParametro(string $id, string $valor): void { - if (!File::exists(storage_path('csv/exports'))) { - File::makeDirectory(storage_path('csv/exports'), 0755, true); - } - try { - $writer = Writer::createFromPath(storage_path($filePath), 'w'); - if ($headers) { - $writer->insertOne($headers); + $updated = false; + $filePath = resource_path(ComisionesController::PARAMETROS_PATH); + $csv = self::getReader($filePath); + $headers = $csv->getHeader(); + $records = array_map(fn($r) => (array) $r, iterator_to_array($csv->getRecords())); + + foreach ($records as &$record) { + if ($record['id'] === $id) { + $record['valor'] = $valor; + $updated = true; + break; + } } - $writer->insertAll($contenido); - } catch (CannotInsertRecord $e) { - Log::error($e->getMessage(), $e->getTrace()); + unset($record); + + if (!$updated) + throw new Exception("Parametro '{$id}' no encontrado."); + + self::generarCsv($filePath, $records, $headers, "|", "'", false); + } catch (CannotInsertRecord | InvalidArgument $e) { + Log::error("Error al actualizar csv: " . $e->getMessage()); + throw new Exception("Error al actualizar csv", $e); } } + + /** + * @throws InvalidArgument + * @throws CannotInsertRecord + */ + public static function generarCsv($filePath, $contenido, $headers = null, $delimiter = null, $enclosure = null, $export = true): void + { + $path = $filePath; + + if ($export) { + if (!File::exists(storage_path('csv/exports'))) + File::makeDirectory(storage_path('csv/exports'), 0755, true); + $path = storage_path($filePath); + } + + $writer = Writer::createFromPath($path, 'w'); + if ($delimiter) + $writer->setDelimiter($delimiter); + if ($enclosure) + $writer->setEnclosure($enclosure); + if ($headers) + $writer->insertOne($headers); + + $writer->insertAll($contenido); + } + + /** + * @param string $filePath + * @return Reader + * @throws InvalidArgument + * @throws Exception + */ + private static function getReader(string $filePath): Reader + { + $csv = Reader::createFromPath($filePath); + $csv->setDelimiter("|"); + $csv->setEnclosure("'"); + $csv->setHeaderOffset(0); + return $csv; + } } diff --git a/app/Http/Controllers/ComisionesController.php b/app/Http/Controllers/ComisionesController.php index 769d6b7..c8af381 100644 --- a/app/Http/Controllers/ComisionesController.php +++ b/app/Http/Controllers/ComisionesController.php @@ -15,6 +15,7 @@ use Symfony\Component\HttpFoundation\BinaryFileResponse; class ComisionesController { + const PARAMETROS_PATH = 'csv/parametros.csv'; const CANASTAS_PATH = 'csv/canastas/'; const BARRIO = "Barrio"; const SALDO = "Saldo"; @@ -110,4 +111,42 @@ class ComisionesController return response()->json(GrupoDeCompraResource::collection(GrupoDeCompra::all())); } + + public function obtenerParametros() + { + try { + $records = self::parametrosRecords(); + $result = []; + foreach ($records as $record) + $result[] = $record; + return response()->json($result); + } catch (Exception $e) { + return response()->json(['message' => $e->getMessage()], 500); + } + } + + public function modificarParametros(string $parametro_id, Request $request) { + try { + if (collect(self::parametrosRecords()) + ->contains('id', $parametro_id)) { + $valid = $request->validate([ + 'valor' => ['required', 'numeric', 'gte:0'], + ]); + CsvHelper::cambiarParametro($parametro_id, $valid['valor']); + return response()->noContent(); + } + return response()->json(['message' => 'Parametro no encontrado.'], 404); + } catch (Exception $e) { + return response()->json(['message' => $e->getMessage()], 500); + } + } + + /** + * @throws Exception + */ + private static function parametrosRecords(): array + { + $records = CsvHelper::getRecords(resource_path(self::PARAMETROS_PATH), "No se pudo leer el archivo."); + return iterator_to_array($records); + } } diff --git a/resources/csv/parametros.csv b/resources/csv/parametros.csv new file mode 100644 index 0000000..297e2ca --- /dev/null +++ b/resources/csv/parametros.csv @@ -0,0 +1,3 @@ +id|nombre|valor +bono-transporte|'Bono de transporte'|15 +monto-olla|'Monto por olla'|1200 diff --git a/routes/api.php b/routes/api.php index 0eaef54..9043edc 100644 --- a/routes/api.php +++ b/routes/api.php @@ -52,4 +52,6 @@ Route::middleware('api')->group(function() { Route::prefix('ollas')->group(function() { Route::get('/{gdc}','Api\OllasController@pedido'); }); + + Route::get('/parametros', 'ComisionesController@obtenerParametros'); }); diff --git a/routes/web.php b/routes/web.php index e77342a..324eda0 100644 --- a/routes/web.php +++ b/routes/web.php @@ -56,6 +56,7 @@ Route::middleware(['auth', 'role:comision'])->group( function() { Route::get('/comisiones/canasta/ejemplo', 'ComisionesController@descargarCanastaEjemplo')->name('comisiones.canasta.ejemplo'); Route::post('/comisiones/canasta', 'ComisionesController@cargarCanasta')->name('comisiones.canasta'); Route::post('/comisiones/saldos', 'ComisionesController@cargarSaldos')->name('comisiones.saldos'); + Route::put('/comisiones/parametros/{parametro_id}', 'ComisionesController@modificarParametros'); }); Route::get('/ollas/login', 'OllasController@show')->name('ollas.login');