From 69bad80367665b4d4aaf7fc18ed8731919ebc3e4 Mon Sep 17 00:00:00 2001 From: Almacen Date: Mon, 17 Nov 2025 09:28:10 -0500 Subject: [PATCH] se agrego , observacion y maraca en neas, y ademas se mejoro el reporte de inventario --- .../InventarioInicialController.php | 175 +++++++++++++----- .../Http/Controllers/NeaBienesController.php | 5 + .../Controllers/PdfReportesController.php | 10 +- .../views/reporteInventario/index.blade.php | 94 +++++----- .../views/reporteNea/index.blade.php | 169 ++++++++++------- backend/routes/api.php | 4 +- frontend/src/config/api.js | 2 +- frontend/src/views/Neas/from/CrearBines.js | 23 +++ .../views/Neas/from/CreateEditNeaEntrada.js | 36 ++-- frontend/src/views/Neas/from/EditBienes.js | 47 +++-- 10 files changed, 365 insertions(+), 200 deletions(-) diff --git a/backend/app/Http/Controllers/InventarioInicialController.php b/backend/app/Http/Controllers/InventarioInicialController.php index d0482cf..a2a071c 100644 --- a/backend/app/Http/Controllers/InventarioInicialController.php +++ b/backend/app/Http/Controllers/InventarioInicialController.php @@ -46,79 +46,154 @@ class InventarioInicialController extends Controller return response()->json(['valid' => $e], 401); } } - public function generarReporteInventario(Request $request) { - if (!auth()->user()->hasPermissionTo('inventario reporte')) { // Corregido nombre del permiso - return response()->json(['valid' => false, 'error' => 'Usted no está autorizado'], 403); - } - ini_set('memory_limit', '512M'); + ini_set('memory_limit', '1024M'); + ini_set('pcre.backtrack_limit', '10000000'); + set_time_limit(0); - // $request->validate([ - // 'fecha_desde' => 'required|date', - // 'fecha_hasta' => 'required|date|after_or_equal:fecha_desde', - // ]); try { + $registros = DB::table('inventario_inicials') + ->select( + 'inventario_inicials.*', + 'bienes.codigo as bien_codigo', + 'bienes.descripcion as bien_descripcion', + 'bienes.marca', + 'inventario_inicials.cuenta', + 'unidad_medidas.nombre as unidad_medida', + DB::raw('ROUND(inventario_inicials.cantidad, 4) as cantidad'), + DB::raw('ROUND(inventario_inicials.precio, 4) as precio'), + DB::raw('ROUND(inventario_inicials.cantidad * inventario_inicials.precio, 4) as valor_total') + ) + ->join('bienes', 'bienes.id', '=', 'inventario_inicials.bienes_id') + ->join('unidad_medidas', 'unidad_medidas.id', '=', 'bienes.id_unidad_medida') + ->orderBy('bienes.descripcion', 'asc') + ->get(); - - // $añoDesde = Carbon::parse($request->input('fecha_desde'))->year; - // $añoHasta = Carbon::parse($request->input('fecha_hasta'))->year; - - // Filtrar registros por rango de fechas - $registros = DB::table('inventario_inicials') - ->select( - 'inventario_inicials.*', - 'bienes.codigo as bien_codigo', - 'bienes.descripcion as bien_descripcion', - 'bienes.marca', - 'inventario_inicials.cuenta', - 'unidad_medidas.nombre as unidad_medida', - DB::raw('ROUND(inventario_inicials.cantidad, 4) as cantidad'), - DB::raw('ROUND(inventario_inicials.precio, 4) as precio'), - DB::raw('ROUND(inventario_inicials.cantidad * inventario_inicials.precio, 4) as valor_total') - ) - ->join('bienes', 'bienes.id', '=', 'inventario_inicials.bienes_id') - ->join('unidad_medidas', 'unidad_medidas.id', '=', 'bienes.id_unidad_medida') - ->orderBy('bienes.descripcion', 'asc') - ->get(); - // Generar PDF con MPDF $mpdf = new \Mpdf\Mpdf([ 'mode' => 'utf-8', 'format' => 'A4-P', 'margin_left' => 8, 'margin_right' => 8, 'margin_top' => 45, - 'margin_bottom' => 35, + 'margin_bottom' => 45, + 'default_font' => 'dejavusans', ]); + // Márgenes y comportamiento del salto de página + $mpdf->SetAutoPageBreak(true, 45); + $mpdf->setAutoBottomMargin = 'stretch'; + + // Configuraciones de tabla + $mpdf->simpleTables = true; + $mpdf->packTableData = true; + $mpdf->keep_table_proportions = true; + $mpdf->use_kwt = true; + $mpdf->shrink_tables_to_fit = 0; + $mpdf->SetCompression(true); + + // Header y Footer $imgLogo = public_path('assets/images/UNAP.png'); $htmlHeader = view('reporteInventario._header', compact('imgLogo'))->render(); - $mpdf->SetHTMLHeader($htmlHeader, '0'); + $mpdf->SetHTMLHeader($htmlHeader); $htmlFooter = view('reporteInventario._footer')->render(); - $mpdf->SetHTMLFooter($htmlFooter, '0'); - // Renderizar la vista de PDF - // Renderizar la vista en partes más pequeñas - $html = view('reporteInventario.index', compact('registros'))->render(); + $mpdf->SetHTMLFooter($htmlFooter); - // Dividir en partes y escribir por fragmentos - $chunks = str_split($html, 25000); // Dividir cada 50,000 caracteres - - foreach ($chunks as $chunk) { - $mpdf->WriteHTML($chunk); - } + // Render vista principal completa (sin dividir) + $html = view('reporteInventario.index', compact('registros'))->render(); + $mpdf->WriteHTML($html); + // Descargar PDF return response()->streamDownload(function () use ($mpdf) { - $mpdf->Output('reporte_inventario_inicial.pdf', 'D'); // 'D' fuerza la descarga + $mpdf->Output('reporte_inventario_inicial.pdf', 'D'); }, 'reporte_inventario_inicial.pdf'); - } catch (\Exception $e) { // Especifica el tipo de excepción si es necesario + + } catch (\Exception $e) { return response()->json([ 'success' => false, - 'message' => $e->getMessage() + 'message' => $e->getMessage(), ]); } } - + // public function generarReporteInventario(Request $request) + // { + // ini_set('memory_limit', '1024M'); + // ini_set('pcre.backtrack_limit', '10000000'); + + // set_time_limit(seconds: 0); + + // try { + // $registros = DB::table('inventario_inicials') + // ->select( + // 'inventario_inicials.*', + // 'bienes.codigo as bien_codigo', + // 'bienes.descripcion as bien_descripcion', + // 'bienes.marca', + // 'inventario_inicials.cuenta', + // 'unidad_medidas.nombre as unidad_medida', + // DB::raw('ROUND(inventario_inicials.cantidad, 4) as cantidad'), + // DB::raw('ROUND(inventario_inicials.precio, 4) as precio'), + // DB::raw('ROUND(inventario_inicials.cantidad * inventario_inicials.precio, 4) as valor_total') + // ) + // ->join('bienes', 'bienes.id', '=', 'inventario_inicials.bienes_id') + // ->join('unidad_medidas', 'unidad_medidas.id', '=', 'bienes.id_unidad_medida') + // ->orderBy('bienes.descripcion', 'asc') + // ->get(); + + // $mpdf = new \Mpdf\Mpdf([ + // 'mode' => 'utf-8', + // 'format' => 'A4-P', + // 'margin_left' => 8, + // 'margin_right' => 8, + // 'margin_top' => 45, + // 'margin_bottom' => 45, // margen inferior ampliado + // 'default_font' => 'dejavusans', + // ]); + + // // Mantener márgenes inferiores visibles + // $mpdf->SetAutoPageBreak(true, 45); // mismo valor que margin_bottom + // $mpdf->autoPageBreak = true; + // $mpdf->setAutoBottomMargin = 'stretch'; // fuerza margen dinámico + + // // Configuración adicional (ya probada) + // $mpdf->simpleTables = true; + // $mpdf->packTableData = true; + // $mpdf->keep_table_proportions = true; + // $mpdf->use_kwt = true; + // $mpdf->shrink_tables_to_fit = 0; + // $mpdf->SetImportUse(); + // $mpdf->SetCompression(true); + + + // // Header y Footer + // $imgLogo = public_path('assets/images/UNAP.png'); + // $htmlHeader = view('reporteInventario._header', compact('imgLogo'))->render(); + // $mpdf->SetHTMLHeader($htmlHeader); + // $htmlFooter = view('reporteInventario._footer')->render(); + // $mpdf->SetHTMLFooter($htmlFooter); + + // // Render vista principal + // $html = view('reporteInventario.index', compact('registros'))->render(); + + // // Dividir HTML en fragmentos grandes (evita pérdida de estilos) + // // $chunks = str_split($html, 50000); + // // foreach ($chunks as $chunk) { + // // $mpdf->WriteHTML($chunk); + // // } + // $mpdf->WriteHTML($html); + + // // Descargar + // return response()->streamDownload(function () use ($mpdf) { + // $mpdf->Output('reporte_inventario_inicial.pdf', 'D'); + // }, 'reporte_inventario_inicial.pdf'); + // } catch (\Exception $e) { + // return response()->json([ + // 'success' => false, + // 'message' => $e->getMessage(), + // ]); + // } + // } public function listEnable() { @@ -191,7 +266,7 @@ class InventarioInicialController extends Controller $query = DB::table('inventario_inicials') ->join('bienes as b', 'b.id', '=', 'inventario_inicials.bienes_id') ->join('unidad_medidas as m', 'm.id', '=', 'b.id_unidad_medida') - ->select('inventario_inicials.*', 'b.descripcion','m.nombre as nombre_medida') + ->select('inventario_inicials.*', 'b.descripcion', 'm.nombre as nombre_medida') ->get(); // Usa first() si solo esperas un resultado return response()->json(['data' => $query], 201); @@ -206,9 +281,9 @@ class InventarioInicialController extends Controller $query = DB::table('inventario_inicials') ->join('bienes as b', 'b.id', '=', 'inventario_inicials.bienes_id') ->join('unidad_medidas as m', 'm.id', '=', 'b.id_unidad_medida') - ->select('inventario_inicials.*', 'b.descripcion','m.nombre as nombre_medida') + ->select('inventario_inicials.*', 'b.descripcion', 'm.nombre as nombre_medida') ->where('inventario_inicials.status', 1) - ->where('inventario_inicials.cantidad','>', 0) + ->where('inventario_inicials.cantidad', '>', 0) ->get(); // Usa first() si solo esperas un resultado return response()->json(['data' => $query], 201); diff --git a/backend/app/Http/Controllers/NeaBienesController.php b/backend/app/Http/Controllers/NeaBienesController.php index f27a1ef..6c80c51 100644 --- a/backend/app/Http/Controllers/NeaBienesController.php +++ b/backend/app/Http/Controllers/NeaBienesController.php @@ -63,6 +63,7 @@ class NeaBienesController extends Controller 'precio' => 'required', 'cuenta_contable' => 'required', 'marca', + 'observacion' => 'nullable|string', 'fecha_registro' => 'required', // 'status' => 'required', ]); @@ -79,6 +80,7 @@ class NeaBienesController extends Controller 'id_unidad_medida' => $request->id_unidad_medida, 'fte_fto' => $request->fte_fto, 'precio' => $request->precio, + 'observacion' => $request->observacion, 'cuenta_contable' => $request->cuenta_contable, 'fecha_registro' => $request->fecha_registro, 'created_at' => now(), @@ -110,6 +112,7 @@ class NeaBienesController extends Controller 'registros.*.precio' => 'required|numeric', 'registros.*.cuenta_contable' => 'required', 'registros.*.marca' => 'nullable|string', + 'registros.*.observacion' => 'nullable|string', 'registros.*.fecha_registro' => 'required|date', ]; @@ -292,6 +295,7 @@ class NeaBienesController extends Controller 'precio' => 'required', 'cuenta_contable' => 'required', 'marca' => 'nullable|string', + 'observacion' => 'nullable|string', 'fecha_registro' => 'required', ]); @@ -311,6 +315,7 @@ class NeaBienesController extends Controller 'precio' => $request->precio, 'cuenta_contable' => $request->cuenta_contable, 'marca' => $request->marca, + 'observacion' => $request->observacion, 'fecha_registro' => $request->fecha_registro, 'updated_at' => now(), ]); diff --git a/backend/app/Http/Controllers/PdfReportesController.php b/backend/app/Http/Controllers/PdfReportesController.php index 2300c41..85f65b2 100644 --- a/backend/app/Http/Controllers/PdfReportesController.php +++ b/backend/app/Http/Controllers/PdfReportesController.php @@ -81,6 +81,8 @@ class PdfReportesController extends Controller 'nea_bienes.cantidad_inicial', 'nea_bienes.fte_fto', 'nea_bienes.precio', + 'nea_bienes.marca', + 'nea_bienes.observacion', 'nea_bienes.cuenta_contable', 'unidad_medidas.nombre as nombre_medida', 'bienes.descripcion', @@ -631,7 +633,7 @@ class PdfReportesController extends Controller $fecha_hasta = Carbon::parse($request->input('fecha_hasta'))->endOfDay(); // Filtrar registros por rango de fechas - + $reportes = DB::table('pecosa_bienes') ->select( @@ -648,7 +650,7 @@ class PdfReportesController extends Controller ->join('bienes as b', 'b.id', '=', 'i.bienes_id') ->join('pecosa_pedidos', 'pecosa_pedidos.id', '=', 'pecosa_bienes.id_pecosa_pedido') ->join('trabajadores', 'trabajadores.id', '=', 'pecosa_pedidos.id_trabajadores2') - ->whereBetween('pecosa_pedidos.fecha', [$fecha_desde , $fecha_hasta]) + ->whereBetween('pecosa_pedidos.fecha', [$fecha_desde, $fecha_hasta]) ->groupBy( 'pecosa_bienes.id_pecosa_pedido', 'pecosa_pedidos.codigo', @@ -661,7 +663,7 @@ class PdfReportesController extends Controller ) ->orderBy('fecha', 'asc') ->get(); - + // Generar el PDF $mpdf = new \Mpdf\Mpdf([ @@ -675,7 +677,7 @@ class PdfReportesController extends Controller // // Configurar encabezado y pie de página - + $imgLogo = public_path('assets/images/UNAP.png'); $htmlHeader = view('relacionPecosa._header', compact('imgLogo', 'fecha_desde', 'fecha_hasta'))->render(); $mpdf->SetHTMLHeader($htmlHeader, '0'); diff --git a/backend/resources/views/reporteInventario/index.blade.php b/backend/resources/views/reporteInventario/index.blade.php index a7c36fa..bf053a3 100644 --- a/backend/resources/views/reporteInventario/index.blade.php +++ b/backend/resources/views/reporteInventario/index.blade.php @@ -9,9 +9,10 @@