/**
  * Genera un listado en formato PDF en base a los parametros obtenidos
  * del fichero listados.yml de cada controlador y los datos filtrados
  * segun el request
  * @return array Template y valores
  */
 public function listadoAction($aditionalFilter = '')
 {
     if ($this->values['permisos']['permisosModulo']['LI']) {
         // Lee la configuracion del listado
         $formato = new Form($this->entity, 'listados.yml');
         $parametros = $formato->getFormatoListado($this->request['formatoListado']);
         unset($formato);
         $this->values['archivo'] = $this->listado->getPdf($parametros, $aditionalFilter);
         $template = '_global/listadoPdf.html.twig';
     } else {
         $template = "_global/forbiden.html.twig";
     }
     return array('template' => $template, 'values' => $this->values);
 }
Example #2
0
 /**
  * Genera un archivo XLSX con el listado
  * @param integer $idFormatoListado
  * @param string $aditionalFilter
  * @return string $archivo El nombre completo (con la ruta) del archivo xlsx generado
  */
 public function getXls($idFormatoListado, $aditionalFilter = '')
 {
     // CARGAR EL MOTOR PARA GENERAR ARCHIVOS EXCELS
     $config = sfYaml::load('config/config.yml');
     $config = $config['config'];
     if (file_exists($config['excel'])) {
         include_once $config['excel'];
     } else {
         die("NO SE PUEDE ENCONTRAR EL MOTOR EXCEL");
     }
     set_time_limit(0);
     // Lee la configuracion del listado $idFormatoListado y
     // la guarda en $parametros
     $formato = new Form($this->entity, 'listados.yml');
     $parametros = $formato->getFormatoListado($idFormatoListado);
     unset($formato);
     // CREAR EL DOCUMENTO
     $objPHPExcel = new PHPExcel();
     $objPHPExcel->getProperties()->setCreator("ERP Albatronic")->setTitle($parametros['title']);
     $objPHPExcel->getDefaultStyle()->getFont()->setName('Arial');
     $objPHPExcel->getDefaultStyle()->getFont()->setSize(14);
     $objPHPExcel->getActiveSheet()->setTitle($parametros['title']);
     $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1', $parametros['title'])->setCellValue('A3', 'Generado por ' . $_SESSION['usuarioPortal']['Nombre'])->setCellValue('A4', 'Fecha ' . date('d/m/Y H:i:s'));
     // Fila de titulos
     $columna = 'A';
     foreach ($parametros['columns'] as $column) {
         $objPHPExcel->setActiveSheetIndex(0)->setCellValue($columna . '6', $column['title']);
         $columna++;
     }
     // Construyo el array con los datos a listar.
     // Sustituyo el ORDERBY que hay en el filtro por pantalla
     // con el que viene de los parametros del listado
     if ($this->getQuery() == '') {
         $this->filter['orderBy'] = $parametros['order_by'];
         $this->makeQuery($aditionalFilter);
     }
     $em = new EntityManager($this->form->getConection());
     $em->query($this->getQuery());
     $rows = $em->fetchResult();
     $nRegistros = $em->numRows();
     $em->desConecta();
     unset($em);
     $breakField = trim((string) $parametros['break_field']);
     if ($breakField) {
         $breakField = explode(",", $breakField);
     } else {
         $breakField = array();
     }
     $valorAnterior = '';
     // Itero el array con los datos para generar cada renglón del listado
     $totales = array();
     $subTotales = array();
     $fila = 7;
     $objPHPExcel->getDefaultStyle()->getFont()->setSize(10);
     $objeto = new $this->entity();
     foreach ($rows as $row) {
         $columna = 'A';
         $objeto->bind($row);
         // Control (si se ha definido) del campo de ruptura
         if (count($breakField)) {
             // Instancio el objeto por el que se hace el break
             $objetoBreak = $objeto->{"get{$breakField['0']}"}();
             $valorActual = $objetoBreak->__toString();
             if ($valorAnterior != $valorActual) {
                 if ($valorAnterior != '') {
                     $this->pintaTotalesExcel($objPHPExcel, $fila, $parametros['columns'], $subTotales);
                     $fila++;
                     $columna = 'A';
                     $subTotales = array();
                 }
                 // Pinto el valor del campo de ruptura y los eventuales valores
                 // adicionales que se hayan indicado en el nodo xml <break_field>
                 $texto = $valorActual;
                 for ($i = 1; $i < count($breakField); $i++) {
                     $texto .= " " . $objetoBreak->{"get{$breakField[$i]}"}();
                 }
                 $fila++;
                 $objPHPExcel->setActiveSheetIndex(0)->setCellValue($columna . $fila, $texto);
             }
             $valorAnterior = $valorActual;
             unset($objetoBreak);
         }
         // Recorro las columnas que componen cada renglón
         $fila++;
         foreach ($parametros['columns'] as $value) {
             $formato = trim((string) $value['format']);
             $texto = trim($objeto->{"get{$value['field']}"}());
             if ($formato) {
                 $texto = sprintf($formato, $texto);
             }
             $objPHPExcel->setActiveSheetIndex(0)->setCellValue($columna . $fila, $texto);
             // Calcular Eventuales totales y subtotales de cada columna
             if (strtoupper($value['total']) == 'YES') {
                 $totales[(string) $value['field']] += (double) $texto;
                 $subTotales[(string) $value['field']] += (double) $texto;
             }
             $columna++;
         }
     }
     unset($objeto);
     // Pintar los subtotales y totales si hay
     if (count($totales)) {
         if ($breakField) {
             $this->pintaTotalesExcel($objPHPExcel, $fila, $parametros['columns'], $subTotales);
         }
         $fila++;
         $this->pintaTotalesExcel($objPHPExcel, $fila, $parametros['columns'], $totales);
     }
     $objPHPExcel->getActiveSheet()->setTitle($parametros['title']);
     $objPHPExcel->setActiveSheetIndex(0);
     $archivo = "docs/docs" . $_SESSION['emp'] . "/xls/" . md5(date('d-m-Y H:i:s')) . ".xlsx";
     $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
     $objWriter->save($archivo);
     unset($objPHPExcel);
     return $archivo;
 }