reksec

Untitled

Nov 7th, 2024
45
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 19.08 KB | None | 0 0
  1. <?php
  2. include("conexion.php"); // Asumiendo que tu conexión está configurada aquí
  3. require __DIR__ . "/vendor/autoload.php";
  4. $objCon = new Conexion();
  5.  
  6. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  7. use PhpOffice\PhpSpreadsheet\IOFactory;
  8. use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
  9. use Monolog\Level;
  10. use Monolog\Logger;
  11. use Monolog\Handler\StreamHandler;
  12. use Monolog\Handler\FirePHPHandler;
  13.  
  14. // Configuración básica para mostrar todos los errores
  15. error_reporting(E_ALL);
  16. ini_set('display_errors', 'On');
  17.  
  18. //Guardando el tipo_actividad
  19. // $tipoActividad=2;
  20.  
  21. class Registro
  22. {
  23.     public $interno;
  24.  
  25.     public function __construct($data)
  26.     {
  27.         $this->interno = [
  28.             'doc_identidad' => $data['documento_identidad'],
  29.             'datos_adicionales' => [
  30.                 'nombre_completo' => $data['apellidos_nombres_interno'],
  31.                 'fecha_ingreso' => $data['fecha_ingreso'],
  32.                 'fecha_nac' => $data['fecha_nacimiento'],
  33.                 'discapacidad' => $data['discapacidad'],
  34.                 'planificacion_intervencion' => $data['planificacion_intervencion'],
  35.                 'tipo_intervencion' => $data['tipo_intervencion'],
  36.                 'grupo_especifico' => $data['grupo_especifico'],
  37.                 'otros_relevantes' => $data['otros_relevantes'],
  38.                 'regimen' => $data['regimen'],
  39.                 'etapa' => $data['etapa'],
  40.                 'pabellon' => $data['pabellon'],
  41.                 'descripcion' => mb_convert_encoding($data['descripcion'], "UTF-8"),
  42.                 'dia' => $data['dia'],
  43.                 'nombre_sesion' => mb_convert_encoding($data['nombre_sesion'], "UTF-8"),
  44.                 'profesional' => $data['datos_profesional'],
  45.                 'observaciones' => $data['observaciones']
  46.                 // ... otros datos adicionales
  47.  
  48.             ]
  49.         ];
  50.         // $this->nombre_completo = $data['apellidos_nombres_interno'];
  51.  
  52.  
  53.  
  54.     }
  55. }
  56.  
  57. class GeneradorReporteExcel
  58. {
  59.     private $spreadsheet;
  60.     private $sheet;
  61.     private $logger;
  62.  
  63.     public function __construct()
  64.     {
  65.         $this->spreadsheet = new Spreadsheet();
  66.         $this->sheet = $this->spreadsheet->getActiveSheet();
  67.  
  68.         //Logs
  69.         $this->logger = new Logger('my_app');
  70.         $this->logger->pushHandler(new StreamHandler(__DIR__ . '/reportes/debug.log', Level::Debug));
  71.        
  72.         $this->logger->pushHandler(new FirePHPHandler());
  73.     }
  74.  
  75.     private function obtenerValor($registro, $columna, $fila, $tipoActividad)
  76.     {
  77.         switch ($columna) {
  78.             case 'C':
  79.                 return $registro->interno['doc_identidad'];
  80.             case 'D':
  81.                 return $registro->interno['datos_adicionales']['nombre_completo'];
  82.             case 'E':
  83.                 return 'MASCULINO';
  84.             case 'F':
  85.                 return $registro->interno['datos_adicionales']['fecha_ingreso'];
  86.             case 'G':
  87.                 return $registro->interno['datos_adicionales']['fecha_nac'];
  88.             case 'H':
  89.                 // Obtener la celda de fecha de nacimiento (suponiendo que 'G2' es relativa)
  90.                 $celdaFechaNacimiento = 'G' . $fila; // Ajusta la fila según tu lógica
  91.                 // Construir la fórmula completa
  92.                 $formula = "=(NOW()-" . $celdaFechaNacimiento . ")/365-0.5";
  93.                 return $formula;
  94.             case 'I':
  95.                 return $registro->interno['datos_adicionales']['discapacidad'];
  96.             case 'J':
  97.                 //planificacion d ela intervencion
  98.                 if ($registro->interno['datos_adicionales']['planificacion_intervencion'] == 1) {
  99.                     $planificacion_intervencion = "PTI_EN_PROCESO";
  100.                 }
  101.  
  102.                 if ($registro->interno['datos_adicionales']['planificacion_intervencion'] == 2) {
  103.                     $planificacion_intervencion = "PTI_P";
  104.                 }
  105.  
  106.                 if ($registro->interno['datos_adicionales']['planificacion_intervencion'] == 3) {
  107.                     $planificacion_intervencion = "PTI_S";
  108.                 }
  109.                 if ($registro->interno['datos_adicionales']['planificacion_intervencion'] == 4) {
  110.                     $planificacion_intervencion = "POPE_ANTIGUA";
  111.                 }
  112.                 return $planificacion_intervencion;
  113.             case 'K':
  114.                 //tipo de intervencion
  115.                 if ($registro->interno['datos_adicionales']['tipo_intervencion'] == 1) {
  116.                     $tipo_intervencion = "INDUCCION_Y_ADAPTACION_AL_REGIMEN_PENITENCIARIO";
  117.                 }
  118.                 if ($registro->interno['datos_adicionales']['tipo_intervencion'] == 2) {
  119.                     $tipo_intervencion = "INTERVENCION_GENERAL";
  120.                 }
  121.                 if ($registro->interno['datos_adicionales']['tipo_intervencion'] == 3) {
  122.                     $tipo_intervencion = "INTERVENCION_ESPECIALIZADA";
  123.                 }
  124.                 if ($registro->interno['datos_adicionales']['tipo_intervencion'] == 4) {
  125.                     $tipo_intervencion = "PROGRAMACIÓN_SOBRE_NECESIDADES_DE_INTERVENCIÓN_COMPLEMENTARIA";
  126.                 }
  127.                 return $tipo_intervencion;
  128.             case 'L':
  129.                 return $registro->interno['datos_adicionales']['grupo_especifico'];
  130.             case 'M':
  131.                 return $registro->interno['datos_adicionales']['otros_relevantes'];
  132.             case 'N':
  133.                 return $registro->interno['datos_adicionales']['regimen'];
  134.             case 'O':
  135.                 return $registro->interno['datos_adicionales']['etapa'];
  136.             case 'P':
  137.                 return $registro->interno['datos_adicionales']['pabellon'];
  138.             case 'Q':
  139.             case 'S':
  140.             case 'U':
  141.             case 'W':
  142.             case 'Y':
  143.             case 'AA':
  144.             case 'AC':
  145.                 if ($tipoActividad === 1) {
  146.                     $descripcion=$registro->interno['datos_adicionales']['descripcion']; // O el campo de descripción que corresponda
  147.                 } else {
  148.                     $descripcion='';
  149.                 }
  150.                 return $descripcion;
  151.             case 'R':
  152.             case 'T':
  153.             case 'V':
  154.             case 'X':
  155.             case 'Z':
  156.             case 'AB':
  157.             case 'AD':
  158.                 if ($tipoActividad === 1) {
  159.                     $dia=$registro->interno['datos_adicionales']['dia']; // O el campo de descripción que corresponda
  160.                 } else {
  161.                     $dia='';
  162.                 }
  163.                 return $dia;
  164.             case 'AE':
  165.             case 'AG':
  166.             case 'AI':
  167.             case 'AK':
  168.             case 'AM':
  169.                 if ($tipoActividad == 2) {
  170.                     // Manejar el caso cuando tipoActividad es 2 (si aplica)
  171.                     $nombre_sesion=$registro->interno['datos_adicionales']['nombre_sesion']; // O el campo de nombre de sesión que corresponda
  172.                 } else {
  173.                     $nombre_sesion='';
  174.                 }
  175.                 return $nombre_sesion;
  176.  
  177.             case 'AF':
  178.             case 'AH':
  179.             case 'AJ':
  180.             case 'AL':
  181.             case 'AN':
  182.                 if ($tipoActividad == 2) {
  183.                     // Manejar el caso cuando tipoActividad no es 1 ni 2
  184.                     $dia=$registro->interno['datos_adicionales']['dia']; // O el campo de nombre de sesión que corresponda
  185.                 } else {
  186.                     $dia='';
  187.                 }
  188.                 return $dia;
  189.  
  190.             case 'AO':
  191.                 return $registro->interno['datos_adicionales']['profesional'];
  192.             case 'AP':
  193.                 return $registro->interno['datos_adicionales']['observaciones'];
  194.                 // case 'AQ':
  195.                 //     return $registro->interno['datos_adicionales']['nombre_completo'];
  196.             default:
  197.                 return '';
  198.         }
  199.     }
  200.  
  201.  
  202.  
  203.     private function escribirEnCelda($columna, $fila, $valor)
  204.     {
  205.         // $this->logger->debug("Escribiendo $valor en la celda $columna$fila");
  206.         // $this->sheet->setCellValue($columna . $fila, $valor);
  207.  
  208.         try {
  209.             // $this->logger->info('My logger is now ready');
  210.             // $this->logger->debug("Escribiendo $valor en la celda $columna$fila");
  211.             $this->sheet->setCellValue($columna . $fila, $valor);
  212.         } catch (\Exception $e) {
  213.             $this->logger->error("Error al escribir en la celda: " . $e->getMessage());
  214.         }
  215.     }
  216.  
  217.     private function getRangoColumnas($tipoActividad, $esNuevoRegistro)
  218.     {
  219.         if($tipoActividad==1){
  220.         return $esNuevoRegistro ? ['C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD'] : ['O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', 'AC', 'AD'];
  221.         }else{
  222.             return $esNuevoRegistro ?  ['C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'AE', 'AF', 'AG', 'AH','AI','AJ','AK','AL','AM','AN','AO','AP'] : ['AE', 'AF', 'AG', 'AH','AI','AJ','AK','AL','AM','AN'];
  223.         }
  224.     }
  225.  
  226.     private function buscarFilaPorDni($dni)
  227.     {
  228.         // Suponiendo que el DNI está en la columna C
  229.         $highestRow = $this->sheet->getHighestRow();
  230.         for ($row = 2; $row <= $highestRow; $row++) {
  231.             if ($this->sheet->getCell('C' . $row)->getValue() === $dni) {
  232.                 $tipoActividad = 2; //$this->sheet->getCell('A' . $row)->getValue(); // Suponiendo que el tipo de actividad está en la columna A
  233.                 $rangoColumnas = $this->getRangoColumnas($tipoActividad, false);
  234.                 return [
  235.                     'fila' => $row,
  236.                     'rangoColumnas' => $rangoColumnas
  237.                 ];
  238.             }
  239.         }
  240.         return false;
  241.     }
  242.  
  243.     // private function crearNuevaFila($fila, $registro, $rangoColumnas) {
  244.     //     foreach ($rangoColumnas as $columna) {
  245.     //         $valor = $registro->datos_adicionales[$columna] ?? '';
  246.     //         $this->sheet->setCellValueExplicit($columna . $fila, $valor, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING); // Ajusta el tipo de dato según sea necesario
  247.     //         $this->logger->debug("Escribiendo $valor en la celda $columna$fila");
  248.     //     }
  249.     // }
  250.  
  251.  
  252.   /*  
  253.     private function crearNuevaFila($fila, $registro, $rangoColumnas, $tipoActividad)
  254.     {
  255.         foreach ($rangoColumnas as $columna) {
  256.  
  257.             $valor = $this->obtenerValor($registro, $columna, $fila, $tipoActividad);
  258.             $this->logger->debug("Columna: " . json_encode($columna)."  = " . $valor . " Tipo_Actividad: " . $tipoActividad);
  259.             // Validación adicional: Verificar si el valor es una cadena vacía o null
  260.             if (!empty($valor)) {
  261.                 if ($columna === 'H') {
  262.                     // Establecer el formato de la celda como General
  263.                     $this->sheet->getStyle($columna . $fila)->getNumberFormat()->setFormatCode('0');
  264.                     // $this->sheet->setCellValueExplicit($columna . $fila, $valor, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_FORMULA);
  265.                     $this->sheet->setCellValue($columna . $fila, $valor);
  266.                 } else {
  267.                     $this->escribirEnCelda($columna, $fila, $valor);
  268.                 }
  269.                 $this->logger->debug("Se está llenando la Fila: $fila en la columna $columna con el valor: $valor");
  270.             } else {
  271.                 $this->logger->warning("El valor para la columna $columna es nulo o vacío.");
  272.             }
  273.  
  274.  
  275.             // Verificar si se ha alcanzado el final del rango de columnas
  276.             if ($columna === end($rangoColumnas)) {
  277.                 // Si es el último registro, inicializar el rango de columnas para el siguiente registro
  278.                 $rangoColumnas = $this->getRangoColumnas($tipoActividad, true);
  279.             }
  280.            
  281.         }
  282.     }
  283.   */
  284.  
  285.  
  286.  
  287.  private function crearNuevaFila($fila, $registro, $rangoColumnas, $tipoActividad,$esNuevoRegistro) {
  288.     $columnaIndex = 0; // Inicializamos el índice de columna
  289.  
  290.     foreach ($rangoColumnas as $columna) {
  291.         if($tipoActividad=2 && $esNuevoRegistro==true){
  292.             if($columnaIndex==16 || $columnaIndex==17 || $columnaIndex==18 || $columnaIndex==19 || $columnaIndex==20 || $columnaIndex==21 || $columnaIndex==22){
  293.                 $this->logger->debug("columnaIndex: $columnaIndex - Pertenece a la columna: $columna ---> NO SE REGISTRO");
  294.                 continue;
  295.             }
  296.         }else{
  297.  
  298.        }
  299.        
  300.         $valor = $this->obtenerValor($registro, $columna, $fila, $tipoActividad);
  301.         $this->escribirEnCelda($columna, $fila, $valor);
  302.         $this->logger->debug("columnaIndex: $columnaIndex - Pertenece a la columna: $columna ---> valor = $valor ");
  303.         $columnaIndex++;
  304.        
  305.         // $this->logger->debug("columnaIndex: $columnaIndex - Pertenece a la columna: $columna[$columnaIndex] ---> valor = $valor ");
  306.         // Validación adicional: Verificar si el valor es una cadena vacía o null
  307.         // if (!empty($valor)) {
  308.         //     $this->escribirEnCelda($columna, $fila, $valor);
  309.         //     $columnaIndex++; // Incrementamos el índice solo si escribimos un valor
  310.              
  311.         //     // Si es un nuevo registro y ya escribimos los dos primeros valores, salimos del bucle
  312.         // for($columnaIndex=15;$columnaIndex<24;$columnaIndex++) {
  313.         //         continue 2;
  314.         //     }
  315.         //     // $columnaIndex = 23; // Ajustar el índice para la siguiente columna (AG)
  316.         // }
  317.     }
  318. }
  319.  
  320.  
  321.     private function actualizarFila($fila, $registro,  $rangosAdicionales=true)
  322.     {
  323.         $tipoActividad = 2; //$registro->tipo_actividad;
  324.         $rangoColumnas = $this->getRangoColumnas($tipoActividad, false);
  325.  
  326.         // Encontrar la primera columna vacía en el rango adicional
  327.         $columnaVacía = null;
  328.         foreach ($rangosAdicionales[$tipoActividad] as $columna) {
  329.             if ($this->sheet->getCell($columna . $fila)->getValue() === null) {
  330.                 $columnaVacía = $columna;
  331.                 break;
  332.             }
  333.         }
  334.  
  335.         // Si se encontró una columna vacía, escribir el valor
  336.         if ($columnaVacía) {
  337.             $columnaIndex = array_search($columnaVacía, $rangoColumnas);
  338.             $valor = $registro->datos_adicionales[$columnaIndex]; // $this->obtenerValor($registro, $columna);
  339.             $this->escribirEnCelda($columnaVacía, $fila, $valor);
  340.         }
  341.     }
  342.  
  343.  
  344.  
  345.     public function generarReporte($registros, $rutaArchivo, $formatoArchivo)
  346.     {
  347.         // Cargar el archivo de formato
  348.         $this->spreadsheet = IOFactory::load($formatoArchivo);
  349.         $this->sheet = $this->spreadsheet->getActiveSheet();
  350.  
  351.         $fila = 2;
  352.  
  353.         foreach ($registros as $registro) {
  354.             $tipoActividad = 2; //$registro->datos_adicionales['tipo_intervencion'];
  355.  
  356.             // Determinar si es un nuevo registro o no ---> OK!
  357.             if ($this->buscarFilaPorDni($registro->interno['doc_identidad'])) {
  358.                 $rangoColumnas = $this->getRangoColumnas($tipoActividad, false); // Registro existente
  359.             } else {
  360.                 $rangoColumnas = $this->getRangoColumnas($tipoActividad, true); // Nuevo registro
  361.             }
  362.  
  363.  
  364.             $dni = $registro->interno['doc_identidad'];
  365.             $filaExistente = $this->buscarFilaPorDni($dni);
  366.  
  367.             if ($filaExistente) {
  368.                 // $this->logger->info('My logger is now ready');
  369.                 $this->actualizarFila($filaExistente, $registro, $rangoColumnas);
  370.             } else {
  371.                 $this->crearNuevaFila($fila, $registro, $rangoColumnas, $tipoActividad,true);
  372.                 $fila++;
  373.             }
  374.         }
  375.  
  376.         // Guardar el archivo Excel
  377.         $writer = IOFactory::createWriter($this->spreadsheet, 'Xlsx');
  378.         $writer->save($rutaArchivo);
  379.     }
  380.  
  381.     // ... (resto de los métodos)
  382. }
  383.  
  384. // ... (tu código de conexión a la base de datos y consulta SQL)
  385. $id_reporte = 1;
  386. // Consulta SQL
  387. $sql = "SELECT I.doc_identidad AS 'DOCUMENTO_IDENTIDAD',
  388.                            I.ape_nombres AS 'APELLIDOS_NOMBRES_INTERNO',
  389.                            I.fecha_ingreso AS 'FECHA_INGRESO',
  390.                            I.fecha_nacimiento AS 'FECHA_NACIMIENTO',
  391.                            I.discapacidad AS 'discapacidad',
  392.  
  393.                            DET.planificacion_intervencion AS 'PLANIFICACION_INTERVENCION',
  394.                            DET.tipo_intervencion AS 'TIPO_INTERVENCION',
  395.                            GRUP.nombre_grupo_especifico AS 'GRUPO_ESPECIFICO',
  396.                            DET.otros_relevantes AS 'OTROS_RELEVANTES',
  397.                            REG.nombre_regimen AS 'REGIMEN',
  398.                            ETP.nombre_etapa AS 'ETAPA',
  399.                            I.pab_celda_etapa AS 'PABELLON',
  400.                            DESCRIP.nombre_descripciones AS 'DESCRIPCION',
  401.                            DET.dia_actividades AS 'dia',
  402.                            SES.nombre_sesiones AS 'nombre_sesion',
  403.                            CONCAT(U.ape_paterno,' ',U.ape_materno,' ',U.nombres) AS 'DATOS_PROFESIONAL',
  404.                            DET.observaciones AS 'OBSERVACIONES',
  405.                            DET.cambio_PTIP_PTIS AS 'PTI_P_PTI_S'
  406.                        FROM reportes_mensuales REP
  407.                        INNER JOIN detalle_reporte_mensual DET ON REP.id_reporte_mensual=DET.id_reporte_mensual
  408.                        INNER JOIN grupo_especifico GRUP ON DET.id_grupo_especifico=GRUP.id_grupo_especifico
  409.                        INNER JOIN internos I ON DET.id_interno=I.id_interno
  410.                        INNER JOIN usuarios U ON REP.id_usuario=U.id_usuario
  411.                        INNER JOIN regimen REG ON DET.id_regimen=REG.id_regimen
  412.                        INNER JOIN etapa ETP ON DET.id_etapa=ETP.id_etapa
  413.                        INNER JOIN descripciones DESCRIP ON DET.id_descripciones=DESCRIP.id_descripciones
  414.                        INNER JOIN sessiones SES ON DET.id_sesiones=SES.id_sesiones
  415.  
  416.                        WHERE REP.id_reporte_mensual=:id_reporte"; // Tu consulta SQL completa
  417.  
  418. $rsDetalleReporte = $objCon->getConexion()->prepare($sql);
  419. $rsDetalleReporte->bindParam(':id_reporte', $id_reporte, PDO::PARAM_INT);
  420.  
  421. if ($rsDetalleReporte->execute()) {
  422.     $registros = [];
  423.     while ($row = $rsDetalleReporte->fetch(PDO::FETCH_ASSOC)) {
  424.         $registro = new Registro($row);
  425.         $registros[] = $registro;
  426.  
  427.         // Imprimir los datos del registro para verificar
  428.         // echo json_encode($registro)."<br>";
  429.     }
  430.  
  431.     // Verificar si el array $registros está vacío
  432.     if (empty($registros)) {
  433.         echo "No se encontraron registros.";
  434.     } else {
  435.         // Generar el reporte
  436.         $generador = new GeneradorReporteExcel();
  437.         $generador->generarReporte($registros, 'reportes/reporte_actualizado.xlsx', 'reportes/FORMATO_SOCIAL.xlsx');
  438.     }
  439. } else {
  440.     // Manejar errores en la ejecución de la consulta
  441.     echo "Error al ejecutar la consulta: " . $rsDetalleReporte->errorInfo()[2];
  442. }
  443. ?>
Advertisement
Add Comment
Please, Sign In to add comment