reksec

testeando Codigo para insertar registro repetido MYSQL en una celda específica EXCEL

Oct 27th, 2024 (edited)
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 17.43 KB | None | 0 0
  1. <?php
  2. include("conexion.php");
  3. $objCon = new Conexion();
  4. $id_reporte = 1; //lo pongo asi para probar
  5. $tipo_actividad2 = 2; //lo pongo asi para probar
  6. require __DIR__ . "/vendor/autoload.php";
  7.  
  8. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  9. use PhpOffice\PhpSpreadsheet\IOFactory;
  10. use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
  11.  
  12. //consultando los detalles del reporte a descargar segun el ID que se obtuvo por POST
  13. $sqlDetalleReporte = "SELECT I.doc_identidad AS 'DOCUMENTO_IDENTIDAD',
  14.                            I.ape_nombres AS 'APELLIDOS_NOMBRES_PACIENTE',
  15.                            I.fecha_ingreso AS 'FECHA_INGRESO',
  16.                            I.fecha_nacimiento AS 'FECHA_NACIMIENTO',
  17.                            I.discapacidad AS 'DISCAPACIDAD',
  18.  
  19.                            DET.planificacion_intervencion AS 'PLANIFICACION_INTERVENCION',
  20.                            DET.tipo_intervencion AS 'TIPO_INTERVENCION',
  21.                            GRUP.nombre_grupo_especifico AS 'GRUPO_ESPECIFICO',
  22.                            DET.otros_relevantes AS 'OTROS_RELEVANTES',
  23.                            REG.nombre_regimen AS 'REGIMEN',
  24.                            ETP.nombre_etapa AS 'ETAPA',
  25.                            I.pab_celda_etapa AS 'PABELLON',
  26.                            DESCRIP.nombre_descripciones AS 'DESCRIPCION',
  27.                            DET.dia_actividades AS 'DIA',
  28.                            SES.nombre_sesiones AS 'SESIONES_NAME',
  29.                            CONCAT(U.ape_paterno,' ',U.ape_materno,' ',U.nombres) AS 'DATOS_PROFESIONAL',
  30.                            DET.observaciones AS 'OBSERVACIONES',
  31.                            DET.cambio_PTIP_PTIS 'PTI_P_PTI_S'
  32.                        FROM reportes_mensuales REP
  33.                        INNER JOIN detalle_reporte_mensual DET ON REP.id_reporte_mensual=DET.id_reporte_mensual
  34.                        INNER JOIN grupo_especifico GRUP ON DET.id_grupo_especifico=GRUP.id_grupo_especifico
  35.                        INNER JOIN pacientes I ON DET.id_paciente=I.id_paciente
  36.                        INNER JOIN usuarios U ON REP.id_usuario=U.id_usuario
  37.                        INNER JOIN regimen REG ON DET.id_regimen=REG.id_regimen
  38.                        INNER JOIN etapa ETP ON DET.id_etapa=ETP.id_etapa
  39.                        INNER JOIN descripciones DESCRIP ON DET.id_descripciones=DESCRIP.id_descripciones
  40.                        INNER JOIN sessiones SES ON DET.id_sesiones=SES.id_sesiones
  41.  
  42.                        WHERE REP.id_reporte_mensual=:id_reporte";
  43. $rsDetalleReporte = $objCon->getConexion()->prepare($sqlDetalleReporte);
  44. $rsDetalleReporte->bindParam(':id_reporte', $id_reporte, PDO::PARAM_INT);
  45. $contador=1; // pongo 1 porque el formato comienza en la linea 2
  46. if ($rsDetalleReporte->execute()) {
  47.     $rutaArchivo = "reportes/FORMATO_SOCIAL.xlsx";
  48.     $inputFileType = IOFactory::identify($rutaArchivo);
  49.     $reader = IOFactory::createReader($inputFileType);
  50.     $spreadsheet = $reader->load($rutaArchivo);
  51.     $spreadsheet->setActiveSheetIndex(0);
  52.     $sheet = $spreadsheet->getActiveSheet();
  53.  
  54.     while ($filaDetalleReporte = $rsDetalleReporte->fetch(PDO::FETCH_OBJ)) {
  55.         $contador++;
  56.  
  57.      
  58.         $rutaReporte = "./reportes/Reporte_mensual_social.xlsx";
  59.         if (file_exists($rutaReporte)) {
  60.             //abriendo el archivo para leerlo
  61.             $inputFileType2 = IOFactory::identify($rutaReporte, [IOFactory::READER_XLSX]);
  62.             $reader2 = IOFactory::createReader($inputFileType2);
  63.             $spreadsheet2 = $reader2->load($rutaReporte);
  64.             $spreadsheet2->setActiveSheetIndex(0);
  65.             $sheet = $spreadsheet2->getActiveSheet();
  66.  
  67.             //vamos ha hallar el valor Buscado con una consulta SQL de todos los registros repetidos en ese reprote.
  68.             $SqlPacientesRepetidos = "SELECT I.doc_identidad AS 'DOCUMENTO_IDENTIDAD',
  69.                                        I.ape_nombres AS 'APELLIDOS_NOMBRES_PACIENTE',
  70.                                        I.fecha_ingreso AS 'FECHA_INGRESO',
  71.                                        I.fecha_nacimiento AS 'FECHA_NACIMIENTO',
  72.                                        I.discapacidad AS 'vulnerabilidad_especifica',
  73.  
  74.                                        DET.planificacion_intervencion AS 'PLANIFICACION_INTERVENCION',
  75.                                        DET.tipo_intervencion AS 'TIPO_INTERVENCION',
  76.                                        GRUP.nombre_grupo_especifico AS 'GRUPO_ESPECIFICO',
  77.                                        DET.otros_relevantes AS 'OTROS_RELEVANTES',
  78.                                        REG.nombre_regimen AS 'REGIMEN',
  79.                                        ETP.nombre_etapa AS 'ETAPA',
  80.                                        I.pab_celda_etapa AS 'PABELLON',
  81.                                        DESCRIP.nombre_descripciones AS 'DESCRIPCION',
  82.                                        DET.dia_actividades AS 'DIA',
  83.                                        SES.nombre_sesiones AS 'SESIONES_NAME',
  84.                                        CONCAT(U.ape_paterno,' ',U.ape_materno,' ',U.nombres) AS 'DATOS_PROFESIONAL',
  85.                                        DET.observaciones AS 'OBSERVACIONES',
  86.                                        DET.cambio_PTIP_PTIS 'PTI_P_PTI_S'
  87.                                    FROM reportes_mensuales REP
  88.                                    INNER JOIN detalle_reporte_mensual DET ON REP.id_reporte_mensual=DET.id_reporte_mensual
  89.                                    INNER JOIN grupo_especifico GRUP ON DET.id_grupo_especifico=GRUP.id_grupo_especifico
  90.                                    INNER JOIN pacientes I ON DET.id_paciente=I.id_paciente
  91.                                    INNER JOIN usuarios U ON REP.id_usuario=U.id_usuario
  92.                                    INNER JOIN regimen REG ON DET.id_regimen=REG.id_regimen
  93.                                    INNER JOIN etapa ETP ON DET.id_etapa=ETP.id_etapa
  94.                                    INNER JOIN descripciones DESCRIP ON DET.id_descripciones=DESCRIP.id_descripciones
  95.                                    INNER JOIN sessiones SES ON DET.id_sesiones=SES.id_sesiones
  96.  
  97.                                    WHERE REP.id_reporte_mensual=:id_reporte AND DET.id_paciente IN (SELECT id_paciente FROM detalle_reporte_mensual GROUP BY id_paciente HAVING count(id_paciente)>1) AND  SES.nombre_sesiones!='NULL'  ORDER BY `DIA` DESC LIMIT 1;";
  98.  
  99.             $rsPacientesRepetidos = $objCon->getConexion()->prepare($SqlPacientesRepetidos);
  100.             $rsPacientesRepetidos->bindParam(':id_reporte', $id_reporte, PDO::PARAM_INT);
  101.             if ($rsPacientesRepetidos->execute()) {
  102.                 while ($filaPacientesRepetidos = $rsPacientesRepetidos->fetch(PDO::FETCH_OBJ)) {
  103.                     if($filaPacientesRepetidos->documento_identidad==$filaDetalleReporte->documento_identidad){
  104.                         $valorBuscado = $filaPacientesRepetidos->documento_identidad;
  105.  
  106.                         // Rango de columnas dependiendo del tipo de actividad
  107.                        $rangoColumnas = ($tipo_actividad2 == 1) ? ['Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AD']: ['AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN'];
  108.                
  109.                         // Recorre las filas buscando el DOCUMENTO_IDENTIDAD
  110.                         foreach ($sheet->getRowIterator() as $fila) {
  111.                             $cellIterator = $fila->getCellIterator();
  112.                             $cellIterator->setIterateOnlyExistingCells(false);
  113.                
  114.                             foreach ($cellIterator as $cell) {
  115.                                 if ($cell->getValue() == $valorBuscado) {
  116.                                     echo "<script>alert('valor Buscado: $valorBuscado  == valor de Celda: ".$cell->getValue()."');</script>";
  117.                                     $filaActual = $cell->getRow();
  118.                                     $insertado = false;
  119.                
  120.                                     // Busca la primera celda vacía en el rango especificado
  121.                                     foreach ($rangoColumnas as $columna) {
  122.                                         if ($sheet->getCell($columna . $filaActual)->getValue() === null) {
  123.                                             if ($tipo_actividad2 == 1) {
  124.                                                 // Para tipo_actividad = 1 (Individual)
  125.                                                 $sheet->setCellValue($columna . $filaActual, $filaDetalleReporte->descripcion); // Descripción en columna actual
  126.                                                 $siguienteColumna = Coordinate::stringFromColumnIndex(Coordinate::columnIndexFromString($columna) + 1);
  127.                                                 $sheet->setCellValue($siguienteColumna . $filaActual, $filaDetalleReporte->dia); // Día en siguiente columna
  128.                                             } else {
  129.                                                 // Para tipo_actividad = 2 (Grupal)
  130.                                                 echo "<script>alert('Nombre Sesion: $filaDetalleReporte->sesiones_name DIA:$filaDetalleReporte->dia ');</script>";
  131.                                                 $sheet->setCellValue($columna . $filaActual, $filaDetalleReporte->sesiones_name); // Sesión en columna actual
  132.                                                 $siguienteColumna = Coordinate::stringFromColumnIndex(Coordinate::columnIndexFromString($columna) + 1);
  133.                                                 $sheet->setCellValue($siguienteColumna . $filaActual, $filaDetalleReporte->dia); // Día en siguiente columna
  134.                                             }
  135.                                             $insertado = true;
  136.                                             break; // Salir del bucle al insertar
  137.                                         }
  138.                                     }
  139.                                     if ($insertado) goto salir_for;//break 2; // Salir de ambos bucles al insertar
  140.                                 }
  141.                             }
  142.                         }
  143.  
  144.  
  145.                     }
  146.                 }
  147.  
  148.             }
  149.  
  150.            
  151.            
  152.                 //recorrio todas las filas, pero no encontró registros iguales en excel con Mysql,
  153.                 //entonces debe registrar el nuevo registro. porque si NO e sigual entonces es un nuevo registro.
  154.  
  155.                          //llenando registro nuevo en EXCEL
  156.                      
  157.                             $spreadsheet->getActiveSheet()->setCellValue('C' . $contador, $filaDetalleReporte->documento_identidad);
  158.                             $spreadsheet->getActiveSheet()->setCellValue('D' . $contador, $filaDetalleReporte->apellidos_nombres_paciente);
  159.                             $spreadsheet->getActiveSheet()->setCellValue('E' . $contador, 'MASCULINO');
  160.                             $spreadsheet->getActiveSheet()->setCellValue('F' . $contador, $filaDetalleReporte->fecha_ingreso);
  161.                             $spreadsheet->getActiveSheet()->setCellValue('G' . $contador, $filaDetalleReporte->fecha_nacimiento);
  162.  
  163.                             $formulaActual = "=((NOW()-G" . $contador . ")/365)-0.5";
  164.                             $spreadsheet->getActiveSheet()
  165.                                 ->getStyle("H" . $contador)
  166.                                 ->getNumberFormat()
  167.                                 ->setFormatCode('0');
  168.                             $spreadsheet->getActiveSheet()->setCellValue("H" . $contador, $formulaActual); //formula de la edad
  169.  
  170.                             //$spreadsheet->getActiveSheet()->setCellValue('H2','');
  171.                             $spreadsheet->getActiveSheet()->setCellValue('I' . $contador, $filaDetalleReporte->vulnerabilidad_especifica);
  172.                             $spreadsheet->getActiveSheet()->setCellValue('J' . $contador, $planificacion_intervencion);
  173.                             $spreadsheet->getActiveSheet()->setCellValue('K' . $contador, $tipo_intervencion);
  174.                             $spreadsheet->getActiveSheet()->setCellValue('L' . $contador, $filaDetalleReporte->grupo_especifico);
  175.                             $spreadsheet->getActiveSheet()->setCellValue('M' . $contador, $filaDetalleReporte->otros_relevantes);
  176.                             $spreadsheet->getActiveSheet()->setCellValue('N' . $contador, $filaDetalleReporte->regimen);
  177.                             $spreadsheet->getActiveSheet()->setCellValue('O' . $contador, $filaDetalleReporte->etapa);
  178.                             $spreadsheet->getActiveSheet()->setCellValue('P' . $contador, $filaDetalleReporte->pabellon);
  179.  
  180.                             //Verifica si el Tratamiento es Individual o Grupal
  181.                              if($tipo_actividad2==1){ // SI ES INDIVIDUAL
  182.                                  $spreadsheet->getActiveSheet()->setCellValue('Q'.$contador, $filaDetalleReporte->descripcion);
  183.                                 $spreadsheet->getActiveSheet()->setCellValue('R'.$contador, $filaDetalleReporte->dia);
  184.                              }else{
  185.                                  $spreadsheet->getActiveSheet()->setCellValue('AE'.$contador, $filaDetalleReporte->sesiones_name);
  186.                                 $spreadsheet->getActiveSheet()->setCellValue('AF'.$contador, $filaDetalleReporte->dia);
  187.                              }
  188.  
  189.  
  190.                             $spreadsheet->getActiveSheet()->setCellValue('AO' . $contador, $filaDetalleReporte->datos_profesional);
  191.                             $spreadsheet->getActiveSheet()->setCellValue('AP' . $contador, $filaDetalleReporte->observaciones);
  192.                             $spreadsheet->getActiveSheet()->setCellValue('AQ' . $contador, $filaDetalleReporte->pti_p_pti_s);
  193.  
  194.  
  195.         }else{
  196.             //si el archivo no existe, hay que crearlo.
  197.                          //llenando registro nuevo en EXCEL
  198.              
  199.                             $spreadsheet->getActiveSheet()->setCellValue('C' . $contador, $filaDetalleReporte->documento_identidad);
  200.                             $spreadsheet->getActiveSheet()->setCellValue('D' . $contador, $filaDetalleReporte->apellidos_nombres_paciente);
  201.                             $spreadsheet->getActiveSheet()->setCellValue('E' . $contador, 'MASCULINO');
  202.                             $spreadsheet->getActiveSheet()->setCellValue('F' . $contador, $filaDetalleReporte->fecha_ingreso);
  203.                             $spreadsheet->getActiveSheet()->setCellValue('G' . $contador, $filaDetalleReporte->fecha_nacimiento);
  204.  
  205.                             $formulaActual = "=((NOW()-G" . $contador . ")/365)-0.5";
  206.                             $spreadsheet->getActiveSheet()
  207.                                 ->getStyle("H" . $contador)
  208.                                 ->getNumberFormat()
  209.                                 ->setFormatCode('0');
  210.                             $spreadsheet->getActiveSheet()->setCellValue("H" . $contador, $formulaActual); //formula de la edad
  211.  
  212.                             //$spreadsheet->getActiveSheet()->setCellValue('H2','');
  213.                             $spreadsheet->getActiveSheet()->setCellValue('I' . $contador, $filaDetalleReporte->vulnerabilidad_especifica);
  214.                             $spreadsheet->getActiveSheet()->setCellValue('J' . $contador, $planificacion_intervencion);
  215.                             $spreadsheet->getActiveSheet()->setCellValue('K' . $contador, $tipo_intervencion);
  216.                             $spreadsheet->getActiveSheet()->setCellValue('L' . $contador, $filaDetalleReporte->grupo_especifico);
  217.                             $spreadsheet->getActiveSheet()->setCellValue('M' . $contador, $filaDetalleReporte->otros_relevantes);
  218.                             $spreadsheet->getActiveSheet()->setCellValue('N' . $contador, $filaDetalleReporte->regimen);
  219.                             $spreadsheet->getActiveSheet()->setCellValue('O' . $contador, $filaDetalleReporte->etapa);
  220.                             $spreadsheet->getActiveSheet()->setCellValue('P' . $contador, $filaDetalleReporte->pabellon);
  221.  
  222.                             //Verifica si el Tratamiento es Individual o Grupal
  223.                              if($tipo_actividad2==1){ // SI ES INDIVIDUAL
  224.                                  $spreadsheet->getActiveSheet()->setCellValue('Q'.$contador, $filaDetalleReporte->descripcion);
  225.                                 $spreadsheet->getActiveSheet()->setCellValue('R'.$contador, $filaDetalleReporte->dia);
  226.                              }else{
  227.                                  $spreadsheet->getActiveSheet()->setCellValue('AE'.$contador, $filaDetalleReporte->sesiones_name);
  228.                                 $spreadsheet->getActiveSheet()->setCellValue('AF'.$contador, $filaDetalleReporte->dia);
  229.                              }
  230.  
  231.  
  232.                             $spreadsheet->getActiveSheet()->setCellValue('AO' . $contador, $filaDetalleReporte->datos_profesional);
  233.                             $spreadsheet->getActiveSheet()->setCellValue('AP' . $contador, $filaDetalleReporte->observaciones);
  234.                             $spreadsheet->getActiveSheet()->setCellValue('AQ' . $contador, $filaDetalleReporte->pti_p_pti_s);
  235.  
  236.  
  237.  
  238.  
  239.                        
  240.    }
  241.  
  242.  
  243. salir_for: //Aqui no hace nada
  244.  
  245.    
  246.     }
  247.  
  248.     // Guardar el archivo Excel modificado
  249.     $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
  250.     $writer->save('reportes/Reporte_mensual_social.xlsx');
  251.     echo "Archivo guardado exitosamente en reportes/Reporte_mensual_social.xlsx";
  252.  
  253.  
  254.  
  255. } else {
  256.     echo "Ups!, ha habido un Error.";
  257. }
  258. ?>
Advertisement
Add Comment
Please, Sign In to add comment