/** * 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); }
/** * 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; }