Controller.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693
  1. <?php
  2. namespace pdf\web;
  3. use PhpOffice\PhpSpreadsheet\Helper\Html;
  4. use PhpOffice\PhpSpreadsheet\IOFactory;
  5. use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
  6. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  7. use PhpOffice\PhpSpreadsheet\Style\Alignment;
  8. use PhpOffice\PhpSpreadsheet\Style\Fill;
  9. use yii\filters\auth\CompositeAuth;
  10. use yii\filters\auth\QueryParamAuth;
  11. use yii\filters\Cors;
  12. use yii\web\Controller as WebController;
  13. class Controller extends WebController {
  14. /**
  15. * Si es verdadero imprime el contenido en el web
  16. * @var boolean $html
  17. */
  18. public $html = false;
  19. /**
  20. * Mostrar vista previa del pdf o descargar
  21. * true = descargar
  22. * @var boolean $descargar
  23. */
  24. public $descargar = false;
  25. /**
  26. * Configuración para la librería mpdf
  27. * @var array $configuracion
  28. */
  29. public $configuracion = [
  30. "format" => "letter",
  31. "default_font" => "Roboto",
  32. ];
  33. /**
  34. * Texto para la marca de agua
  35. * @var string $marcaDeAguaTexto
  36. */
  37. public $marcaDeAguaTexto = "";
  38. /**
  39. * Habilitar la marca de agua
  40. * @var boolean $html
  41. */
  42. public $marcaDeAgua = false;
  43. /**
  44. * Encoger las tablas para que quepan
  45. * @var int $encogerTablas
  46. */
  47. public $encogerTablas = 0;
  48. /**
  49. * Mantener proporciones de tabla
  50. * @var boolean $mantenerProporcionTabla
  51. */
  52. public $mantenerProporcionTabla = true;
  53. /**
  54. * Nombre del archivo al descargar
  55. * @var string $nombreArchivo
  56. */
  57. public $nombreArchivo = "";
  58. /**
  59. * Estilos para el pdf
  60. * @var string $hojaDeEstilo
  61. */
  62. public $hojaDeEstilo = "";
  63. /**
  64. * header para el pdf
  65. * @var string $header
  66. */
  67. public $header;
  68. /**
  69. * @var \yii\web\Request $req
  70. */
  71. public $req;
  72. /**
  73. * @var \yii\web\Response $res
  74. */
  75. public $res;
  76. //*
  77. /* public function behaviors() {
  78. $behavior = parent::behaviors();
  79. $behavior["authenticator"] = [
  80. "class" => CompositeAuth::className(),
  81. "authMethods" => [
  82. QueryParamAuth::className(),
  83. ]
  84. ];
  85. return $behavior;
  86. } */// */
  87. public function beforeAction($action) {
  88. parent::beforeAction($action);
  89. $basePath = \Yii::getAlias("@app");
  90. $this->req = \Yii::$app->getRequest();
  91. $this->res = \Yii::$app->getResponse();
  92. $this->html = intval($this->req->get("html", 0)) === 1;
  93. if ($this->html) {
  94. $this->res->format = \yii\web\Response::FORMAT_HTML;
  95. }
  96. $this->descargar = intval($this->req->get("descargar", "")) === 1;
  97. $this->marcaDeAgua = false; // intval($this->req->get("wm", 0)) === 1;
  98. $this->hojaDeEstilo = file_get_contents("{$basePath}/web/css/pdf.css");
  99. return true;
  100. }
  101. public function exportarPdf($contenido) {
  102. try {
  103. // $config = array_merge($this->configuracion, ['format' => 'A4']);
  104. $mpdf = new \Mpdf\Mpdf($this->configuracion);
  105. if (!empty($this->header)) {
  106. $mpdf->SetHTMLHeader($this->header);
  107. }
  108. $mpdf->WriteHTML($this->hojaDeEstilo, \Mpdf\HTMLParserMode::HEADER_CSS);
  109. $mpdf->SetWatermarkText($this->marcaDeAguaTexto);
  110. $mpdf->watermark_font = 'DejaVuSansCondensed';
  111. $mpdf->showWatermarkText = $this->marcaDeAgua;
  112. $mpdf->watermarkTextAlpha = 0.30;
  113. $mpdf->shrink_tables_to_fit = $this->encogerTablas;
  114. $mpdf->keep_table_proportions = $this->mantenerProporcionTabla;
  115. $mpdf->SetTitle($this->nombreArchivo);
  116. $mpdf->SetDisplayMode('default');
  117. $mpdf->SetFooter('Pag. {PAGENO} de {nbpg}');
  118. $mpdf->showImageErrors = false;
  119. $mpdf->useSubstitutions = false;
  120. $mpdf->simpleTables = false;
  121. $mpdf->WriteHTML($contenido, \Mpdf\HTMLParserMode::HTML_BODY);
  122. $dest = $this->descargar ? "D" : "I";
  123. if (strpos($this->nombreArchivo, '.pdf') === false) {
  124. $this->nombreArchivo .= ".pdf";
  125. }
  126. header('Access-Control-Allow-Origin: *');
  127. header('Access-Control-Expose-Headers: *');
  128. $mpdf->Output($this->nombreArchivo, $dest);
  129. } catch (\Exception $exception) {
  130. throw $exception;
  131. }
  132. \Yii::$app->end();
  133. }
  134. public function afterAction($action, $result) {
  135. if (!$this->html) {
  136. $result = str_replace('disabled="disabled"', '', $result);
  137. return $this->exportarPdf($result);
  138. }
  139. $this->marcaDeAgua = intval($this->req->get("wm", 1)) === 1;
  140. $watermark = "background-image: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' version='1.1' " .
  141. "height='100px' width='100px'><text transform='translate(20, 100) rotate(-45)' fill='rgb(210,210,210)' " .
  142. "font-size='18'>{$this->marcaDeAguaTexto}</text></svg>\");";
  143. if (!$this->marcaDeAgua) {
  144. $watermark = "";
  145. }
  146. $fondo = ".fondo-privado { background-color: rgb(141,216,169,0.7) !important; }";
  147. $result = str_replace("<pagebreak>", "<br>", $result);
  148. $result = "<style type=\"text/css\">{$this->hojaDeEstilo}\nbody{{$watermark}}\n{$fondo}</style>{$result}";
  149. return $result;
  150. }
  151. /**
  152. * funcion para generar cualquier Excel
  153. */
  154. public static function Excel(
  155. $titulo = "Reporte",
  156. $pestania = "Reporte",
  157. $nombre = "Reporte",
  158. $etiquetas = [],
  159. $campos = [],
  160. $datos,
  161. $usarApuntador = true, $isArray = false, $respaldo = false) {
  162. // Create new Spreadsheet object
  163. $basePath = \Yii::getAlias("@app");
  164. $spreadsheet = new Spreadsheet();
  165. $spreadsheet->setActiveSheetIndex(0);
  166. $spreadsheet->getSecurity()->setLockWindows(false);
  167. $spreadsheet->getSecurity()->setLockStructure(false);
  168. $spreadsheet->getActiveSheet()->getProtection()->setSheet(false);
  169. $spreadsheet->getActiveSheet()->getProtection()->setSort(false);
  170. $spreadsheet->getActiveSheet()->getProtection()->setInsertRows(false);
  171. $spreadsheet->getActiveSheet()->getProtection()->setFormatCells(false);
  172. // Set document properties
  173. $spreadsheet->getProperties()->setCreator('eDesarrollos')
  174. ->setLastModifiedBy('eDesarrollos')
  175. ->setTitle($titulo)
  176. ->setDescription($titulo);
  177. $spreadsheet->getActiveSheet()->setTitle($pestania);
  178. $style_titulo = [
  179. 'font' => [
  180. 'bold' => true,
  181. 'size' => 13,
  182. ],
  183. 'alignment' => [
  184. 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
  185. ]
  186. ];
  187. $style_titulo_etiquestas = [
  188. 'font' => [
  189. 'bold' => true,
  190. 'size' => 11,
  191. 'color' => ['rgb' => '000000'],
  192. 'background' => ['rgb' => '4c5966'],
  193. ],
  194. 'alignment' => [
  195. 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER_CONTINUOUS,
  196. ],
  197. 'fill' => [
  198. 'type' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_GRADIENT_LINEAR,
  199. 'rotation' => 90,
  200. 'startcolor' => ['argb' => '000000',],
  201. 'endcolor' => ['argb' => '000000',],
  202. ],
  203. ];
  204. $spreadsheet->setActiveSheetIndex(0);
  205. $i = $respaldo ? 1 : 7;
  206. $ltrs = [];
  207. $ltr = 65;
  208. $ltr2 = 64;
  209. foreach ($etiquetas as $v) {
  210. if ($ltr2 >= 65) {
  211. //if(!in_array(chr($ltr2), ["[","]","\\","^","_","`"]))
  212. $letra = chr($ltr2) . chr($ltr);
  213. } else {
  214. $letra = chr($ltr);
  215. }
  216. $ltrs[] = $letra;
  217. $spreadsheet->getActiveSheet()->setCellValue($letra . $i, $v);
  218. if ($ltr >= 90) {
  219. $ltr2++;
  220. $ltr = 65;
  221. } else {
  222. $ltr++;
  223. }
  224. }
  225. // Add some data
  226. $i++; //Es el renglón inicial
  227. if ($usarApuntador) {
  228. /* @var $datos ActiveQuery */
  229. if (!$isArray) {
  230. foreach ($datos->each() as $v) {
  231. $l = 0;
  232. foreach ($campos as $k => $a) {
  233. $spreadsheet
  234. ->getActiveSheet()
  235. ->setCellValue($ltrs[$l] . $i, isset($v[$a]) ? $v[$a] : "")
  236. ->getColumnDimension($ltrs[$l])
  237. ->setAutoSize(true);
  238. $l++;
  239. }
  240. $i++;
  241. }
  242. } else {
  243. foreach ($datos as $v) {
  244. $l = 0;
  245. foreach ($campos as $k => $a) {
  246. $spreadsheet
  247. ->getActiveSheet()
  248. ->setCellValue($ltrs[$l] . $i, isset($v[$a]) ? $v[$a] . "-" : "---")
  249. ->getColumnDimension($ltrs[$l])
  250. ->setAutoSize(true);
  251. $l++;
  252. }
  253. $i++;
  254. }
  255. }
  256. } else {
  257. foreach ($datos as $v) {
  258. $l = 0;
  259. foreach ($campos as $k => $a) {
  260. if (gettype($v[$a]) === 'array') {
  261. if (isset($v[$a][1]) && $v[$a][1] === "html") {
  262. $html = new Html();
  263. $spreadsheet
  264. ->getActiveSheet()
  265. ->setCellValue($ltrs[$l] . $i, isset($v[$a][0]) ? $html->toRichTextObject($v[$a][0]) : "")
  266. ->getColumnDimension($ltrs[$l])
  267. ->setAutoSize(true);
  268. } else {
  269. $spreadsheet
  270. ->getActiveSheet()
  271. ->setCellValue($ltrs[$l] . $i, isset($v[$a][0]) ? $v[$a][0] : "")
  272. ->getColumnDimension($ltrs[$l])
  273. ->setAutoSize(true);
  274. $spreadsheet
  275. ->getActiveSheet()
  276. ->getStyle($ltrs[$l] . $i)
  277. ->getNumberFormat()
  278. ->setFormatCode(NumberFormat::FORMAT_CURRENCY_USD);
  279. }
  280. } else {
  281. $spreadsheet
  282. ->getActiveSheet()
  283. ->setCellValue($ltrs[$l] . $i, isset($v[$a]) ? $v[$a] : "")
  284. ->getColumnDimension($ltrs[$l])
  285. ->setAutoSize(true);
  286. }
  287. $l++;
  288. }
  289. $i++;
  290. }
  291. }
  292. // Rename worksheet
  293. // $spreadsheet->getStyle('A1:A3')->getNumberFormat()->setFormatCode('#,##0.00');
  294. // Set active sheet index to the first sheet, so Excel opens this as the first sheet
  295. $spreadsheet->setActiveSheetIndex(0);
  296. $ultima_letra = array_pop($ltrs);
  297. if (!$respaldo) {
  298. $spreadsheet->getActiveSheet()->mergeCells('A3:' . $ultima_letra . "3");
  299. $spreadsheet->getActiveSheet()->getStyle("A3:" . $ultima_letra . "3")->applyFromArray($style_titulo);
  300. $spreadsheet->getActiveSheet()->setCellValue('A3', $titulo);
  301. //$spreadsheet->getActiveSheet()->setCellValue('A2', '=HIPERVINCULO("http://www.google.com/","Google")');
  302. $objDrawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
  303. $objDrawing->setName('Logo');
  304. $objDrawing->setDescription('Logo');
  305. $objDrawing->setPath($basePath . '/web/img/logo-salud.png');
  306. $objDrawing->setWidth(300);
  307. $objDrawing->setCoordinates('A1');
  308. $objDrawing->setWorksheet($spreadsheet->getActiveSheet());
  309. $spreadsheet->getActiveSheet()->getStyle("A7:" . $ultima_letra . "7")->applyFromArray($style_titulo_etiquestas);
  310. } else
  311. $spreadsheet->getActiveSheet()->getStyle("A1:" . $ultima_letra . "1")->applyFromArray($style_titulo_etiquestas);
  312. // Redirect output to a client's web browser (Xlsx)
  313. header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  314. header('Content-Disposition: attachment;filename="' . $nombre . '"');
  315. header('Cache-Control: max-age=0');
  316. $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
  317. $writer->save('php://output');
  318. exit;
  319. }
  320. public static function Excelp($titulo = "Reporte", $pestania = "Reporte", $nombre = "Reporte", $etiquetas = [], $campos = [], $datos, $usarApuntador = true, $isArray = false, $respaldo = false) {
  321. // Create new Spreadsheet object
  322. $basePath = \Yii::getAlias("@app");
  323. $spreadsheet = new Spreadsheet();
  324. $spreadsheet->setActiveSheetIndex(0);
  325. $spreadsheet->getSecurity()->setLockWindows(false);
  326. $spreadsheet->getSecurity()->setLockStructure(false);
  327. $spreadsheet->getActiveSheet()->getProtection()->setSheet(false);
  328. $spreadsheet->getActiveSheet()->getProtection()->setSort(false);
  329. $spreadsheet->getActiveSheet()->getProtection()->setInsertRows(false);
  330. $spreadsheet->getActiveSheet()->getProtection()->setFormatCells(false);
  331. // Set document properties
  332. $spreadsheet->getProperties()->setCreator('pbr')->setLastModifiedBy('pbr')->setTitle($titulo)
  333. ->setDescription($titulo);
  334. $spreadsheet->getActiveSheet()->setTitle($pestania);
  335. $style_titulo = [
  336. 'font' => [
  337. 'bold' => true,
  338. 'size' => 13,
  339. ],
  340. 'alignment' => [
  341. 'horizontal' => Alignment::HORIZONTAL_CENTER,
  342. ]
  343. ];
  344. $style_titulo_etiquestas = [
  345. 'font' => [
  346. 'bold' => true,
  347. 'size' => 11,
  348. 'color' => ['rgb' => '000000'],
  349. 'background' => ['rgb' => '4c5966'],
  350. ],
  351. 'alignment' => [
  352. 'horizontal' => Alignment::HORIZONTAL_CENTER_CONTINUOUS,
  353. ],
  354. 'fill' => [
  355. 'type' => Fill::FILL_GRADIENT_LINEAR,
  356. 'rotation' => 90,
  357. 'startcolor' => ['argb' => '000000',],
  358. 'endcolor' => ['argb' => '000000',],
  359. ],
  360. ];
  361. $spreadsheet->setActiveSheetIndex(0);
  362. $i = $respaldo ? 1 : 7;
  363. $ltrs = [];
  364. $ltr2 = 65;
  365. $ltr = 65;
  366. foreach ($etiquetas as $v) {
  367. if ($ltr > 90) {
  368. $letra = "A" . chr($ltr2);
  369. } else {
  370. $letra = chr($ltr);
  371. }
  372. $ltrs[] = $letra;
  373. $spreadsheet->getActiveSheet()->setCellValue($letra . $i, $v);
  374. if ($ltr > 90) {
  375. $ltr2++;
  376. }
  377. $ltr++;
  378. }
  379. // Add some data
  380. $i++; //Es el renglón inicial
  381. if ($usarApuntador) {
  382. /* @var $datos ActiveQuery */
  383. if (!$isArray) {
  384. foreach ($datos->each() as $v) {
  385. $l = 0;
  386. foreach ($campos as $k => $a) {
  387. $spreadsheet
  388. ->getActiveSheet()
  389. ->setCellValue($ltrs[$l] . $i, isset($v[$a]) ? $v[$a] : "")
  390. ->getColumnDimension($ltrs[$l])
  391. ->setAutoSize(true);
  392. $l++;
  393. }
  394. $i++;
  395. }
  396. } else {
  397. foreach ($datos as $v) {
  398. $l = 0;
  399. foreach ($campos as $k => $a) {
  400. $spreadsheet
  401. ->getActiveSheet()
  402. ->setCellValue($ltrs[$l] . $i, isset($v[$a]) ? $v[$a] : "")
  403. ->getColumnDimension($ltrs[$l])
  404. ->setAutoSize(true);
  405. $l++;
  406. }
  407. $i++;
  408. }
  409. }
  410. } else {
  411. foreach ($datos as $v) {
  412. $l = 0;
  413. foreach ($campos as $k => $a) {
  414. $spreadsheet
  415. ->getActiveSheet()
  416. ->setCellValue($ltrs[$l] . $i, isset($v[$a]) ? $v[$a] : "")
  417. ->getColumnDimension($ltrs[$l])
  418. ->setAutoSize(true);
  419. $l++;
  420. }
  421. $i++;
  422. }
  423. }
  424. // Rename worksheet
  425. // Set active sheet index to the first sheet, so Excel opens this as the first sheet
  426. $spreadsheet->setActiveSheetIndex(0);
  427. $ultima_letra = array_pop($ltrs);
  428. if (!$respaldo) {
  429. $spreadsheet->getActiveSheet()->mergeCells('A3:' . $ultima_letra . "3");
  430. $spreadsheet->getActiveSheet()->getStyle("A3:" . $ultima_letra . "3")->applyFromArray($style_titulo);
  431. $spreadsheet->getActiveSheet()->setCellValue('A3', $titulo);
  432. //$spreadsheet->getActiveSheet()->setCellValue('A2', '=HIPERVINCULO("http://www.google.com/","Google")');
  433. $objDrawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
  434. $objDrawing->setName('Logo');
  435. $objDrawing->setDescription('Logo');
  436. $objDrawing->setPath($basePath . '/web/img/logo-salud.png');
  437. $objDrawing->setWidth(300);
  438. $objDrawing->setCoordinates('A1');
  439. $objDrawing->setWorksheet($spreadsheet->getActiveSheet());
  440. $objDrawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
  441. $objDrawing->setName('Logo');
  442. $objDrawing->setDescription('Logo');
  443. $objDrawing->setPath($basePath . '/web/img/sa.png');
  444. $objDrawing->setWidth(150);
  445. $objDrawing->setCoordinates('M1');
  446. $objDrawing->setWorksheet($spreadsheet->getActiveSheet());
  447. $spreadsheet->getActiveSheet()->setCellValue('N3', " ");
  448. $spreadsheet->getActiveSheet()->setCellValue('O3', " ");
  449. //$spreadsheet->getActiveSheet()->getStyle("A7:" . $ultima_letra . "7")->applyFromArray($style_titulo_etiquestas);
  450. }
  451. // Redirect output to a client's web browser (Xlsx)
  452. header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  453. header('Content-Disposition: attachment;filename="' . $nombre . '"');
  454. header('Cache-Control: max-age=0');
  455. $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
  456. $writer->save('php://output');
  457. exit;
  458. }
  459. public function excelMir($datos = []) {
  460. // Create new Spreadsheet object
  461. $nombre = "excels.xlsx";
  462. $titulo = "Matriz de Indicadores para Resultados (2022)";
  463. $pestania = "pestania";
  464. $spreadsheet = new Spreadsheet();
  465. $spreadsheet->setActiveSheetIndex(0);
  466. $spreadsheet->getSecurity()->setLockWindows(false);
  467. $spreadsheet->getSecurity()->setLockStructure(false);
  468. $spreadsheet->getActiveSheet()->getProtection()->setSheet(false);
  469. $spreadsheet->getActiveSheet()->getProtection()->setSort(false);
  470. $spreadsheet->getActiveSheet()->getProtection()->setInsertRows(false);
  471. $spreadsheet->getActiveSheet()->getProtection()->setFormatCells(false);
  472. // Set document properties
  473. $spreadsheet->getProperties()->setCreator('pbr')->setLastModifiedBy('pbr')->setTitle($titulo)->setDescription($titulo);
  474. $spreadsheet->getActiveSheet()->setTitle($pestania);
  475. $style_titulo = [
  476. 'font' => [
  477. 'bold' => true,
  478. 'size' => 13,
  479. ],
  480. 'alignment' => [
  481. 'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
  482. ]
  483. ];
  484. $spreadsheet->setActiveSheetIndex(0);
  485. $spreadsheet->getActiveSheet()->setCellValue("A8", "Dependencia y/o Entidad:");
  486. $spreadsheet->getActiveSheet()->setCellValue("A9", "Programa Presupuestario:");//Eje De PED:
  487. $spreadsheet->getActiveSheet()->setCellValue("A10", "Eje De PED:");//:
  488. $spreadsheet->getActiveSheet()->setCellValue("A11", "Objetivo del PED:");
  489. $spreadsheet->getActiveSheet()->setCellValue("A12", "Beneficiarios:");
  490. // Rename worksheet
  491. // Set active sheet index to the first sheet, so Excel opens this as the first sheet
  492. $spreadsheet->setActiveSheetIndex(0);
  493. $spreadsheet->getActiveSheet()->mergeCells('F4:K4');
  494. $spreadsheet->getActiveSheet()->getStyle('F4:K4')->applyFromArray($style_titulo);
  495. $spreadsheet->getActiveSheet()->setCellValue('F4', $titulo);
  496. $losbenificiarios = "";
  497. if (count($datos["benificiarios"]) > 0) {
  498. foreach ($datos["benificiarios"] as $ben) {
  499. $losbenificiarios .= "{$ben->beneficiario->nombre}, ";
  500. }
  501. }
  502. $spreadsheet->setActiveSheetIndex(0);
  503. $spreadsheet->getActiveSheet()->setCellValue("C8", $datos["dependencia"]->nombre);
  504. $spreadsheet->getActiveSheet()->setCellValue("C9", $datos["programa"]->nombre);
  505. $spreadsheet->getActiveSheet()->setCellValue("C10", $datos["eje"]->nombre);
  506. $spreadsheet->getActiveSheet()->setCellValue("C11", $datos["mir"]->objetivo->nombre);
  507. $spreadsheet->getActiveSheet()->setCellValue("C12", $losbenificiarios);
  508. $spreadsheet->getActiveSheet()->setCellValue("A14", "");
  509. $spreadsheet->getActiveSheet()->setCellValue("B14", "Resumen Narrativo\n(Objetivos)");
  510. $spreadsheet->getActiveSheet()->mergeCells('B14:B15');
  511. $spreadsheet->getActiveSheet()->setCellValue("C14", "Indicadores");
  512. $spreadsheet->getActiveSheet()->mergeCells('C14:E14');
  513. $spreadsheet->getActiveSheet()->setCellValue("F14", "Programación");
  514. $spreadsheet->getActiveSheet()->mergeCells('F14:J14');
  515. $spreadsheet->getActiveSheet()->setCellValue("K14", "Meta % de Anua");
  516. $spreadsheet->getActiveSheet()->setCellValue("L14", "% de Avance");
  517. $spreadsheet->getActiveSheet()->setCellValue("M14", "Linea Base (año base)");
  518. $spreadsheet->getActiveSheet()->setCellValue("N14", "Sentido");
  519. $spreadsheet->getActiveSheet()->setCellValue("O14", "Frecuencia");
  520. $spreadsheet->getActiveSheet()->setCellValue("P14", "Medios de Verificación\n(Fuentes)");
  521. $spreadsheet->getActiveSheet()->setCellValue("Q14", "Supuestos");
  522. $spreadsheet->getActiveSheet()->mergeCells('K14:K15');
  523. $spreadsheet->getActiveSheet()->mergeCells('L14:L15');
  524. $spreadsheet->getActiveSheet()->mergeCells('M14:M15');
  525. $spreadsheet->getActiveSheet()->mergeCells('N14:N15');
  526. $spreadsheet->getActiveSheet()->mergeCells('O14:O15');
  527. $spreadsheet->getActiveSheet()->mergeCells('P14:P15');
  528. $spreadsheet->getActiveSheet()->mergeCells('Q14:Q15');
  529. $spreadsheet->getActiveSheet()->getStyle('A14:Q14')->applyFromArray($style_titulo);
  530. $spreadsheet->getActiveSheet()->getStyle('A15:Q15')->applyFromArray($style_titulo);
  531. $spreadsheet->getActiveSheet()->setCellValue("C15", "Nombre");
  532. $spreadsheet->getActiveSheet()->setCellValue("D15", "Unidad de\nMedida");
  533. $spreadsheet->getActiveSheet()->setCellValue("E15", "Fórmula");
  534. $spreadsheet->getActiveSheet()->setCellValue("F15", "I");
  535. $spreadsheet->getActiveSheet()->setCellValue("G15", "II");
  536. $spreadsheet->getActiveSheet()->setCellValue("H15", "III");
  537. $spreadsheet->getActiveSheet()->setCellValue("I15", "IV");
  538. $spreadsheet->getActiveSheet()->setCellValue("J15", "Avance\nAcumulado");
  539. $objDrawing = $this->cargarImagen($spreadsheet, '/web/img/logo-salud.png', 300, "A1");
  540. $objDrawing = $this->cargarImagen($spreadsheet, '/web/img/sa.png', 150, "Q5");
  541. $spreadsheet->getActiveSheet()->setCellValue('R3', " ");
  542. $i = 16;
  543. if ($datos["mir"] != null) {
  544. $nuevoNiveles = [];
  545. foreach ($datos["niveles"] as $nivel) {
  546. if (!isset($nuevoNiveles[$nivel->nivel])) {
  547. $nuevoNiveles[$nivel->nivel] = [];
  548. }
  549. $nuevoNiveles[$nivel->nivel][] = $nivel;
  550. }
  551. $ordenNivel = [
  552. "FIN",
  553. "PROPÓSITO",
  554. "COMPONENTE",
  555. "ACTIVIDAD"
  556. ];
  557. foreach ($ordenNivel as $k => $v) {
  558. $inicio = $i;
  559. $spreadsheet->getActiveSheet()->setCellValue("A" . $i, $v);
  560. $fin = 0;
  561. foreach ($nuevoNiveles[$v] as $nivel) {
  562. $spreadsheet->getActiveSheet()->setCellValue("B" . $i, $nivel->resumen);
  563. foreach ($nivel->matrizMIRIndicadores as $indicador) {
  564. $spreadsheet->getActiveSheet()->setCellValue("C" . $i, $indicador->nombre);
  565. $spreadsheet->getActiveSheet()->setCellValue("D" . $i, $indicador->unidadMedida->nombre);
  566. $spreadsheet->getActiveSheet()->setCellValue("E" . $i, $indicador->numerador);
  567. $spreadsheet->getActiveSheet()->setCellValue("E" . ($i + 1), $indicador->denominador);
  568. $spreadsheet->getActiveSheet()->setCellValue("F" . $i, $indicador->numeradorT1);
  569. $spreadsheet->getActiveSheet()->setCellValue("G" . $i, $indicador->numeradorT2);
  570. $spreadsheet->getActiveSheet()->setCellValue("H" . $i, $indicador->numeradorT3);
  571. $spreadsheet->getActiveSheet()->setCellValue("I" . $i, $indicador->numeradorT4);
  572. $spreadsheet->getActiveSheet()->setCellValue("F" . ($i + 1), $indicador->denominadorT1);
  573. $spreadsheet->getActiveSheet()->setCellValue("G" . ($i + 1), $indicador->denominadorT2);
  574. $spreadsheet->getActiveSheet()->setCellValue("H" . ($i + 1), $indicador->denominadorT3);
  575. $spreadsheet->getActiveSheet()->setCellValue("I" . ($i + 1), $indicador->denominadorT4);
  576. $spreadsheet->getActiveSheet()->setCellValue("J" . $i, $indicador->avanceAcumulado);
  577. $spreadsheet->getActiveSheet()->setCellValue("K" . $i, $indicador->metaAnual);
  578. $spreadsheet->getActiveSheet()->setCellValue("L" . $i, $indicador->porcentajeAvance);
  579. $spreadsheet->getActiveSheet()->setCellValue("M" . $i, $indicador->lineaBase);
  580. $spreadsheet->getActiveSheet()->setCellValue("N" . $i, $indicador->sentido->valor);
  581. $spreadsheet->getActiveSheet()->setCellValue("O" . $i, $indicador->frecuencia->nombre);
  582. $spreadsheet->getActiveSheet()->setCellValue("P" . $i, $indicador->metodoVerificacion);
  583. $spreadsheet->getActiveSheet()->setCellValue("Q" . $i, $indicador->supuestos);
  584. $spreadsheet->getActiveSheet()->setCellValue("R" . $i, " ");
  585. $i += 2;
  586. }
  587. //$spreadsheet->getActiveSheet()->mergeCells("B{$inicio}:B{$f}");
  588. }
  589. //$fin = $i+1;
  590. $spreadsheet->getActiveSheet()->mergeCells("A{$inicio}:A17");
  591. }
  592. }
  593. header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  594. header('Content-Disposition: attachment;filename="' . $nombre . '"');
  595. header('Cache-Control: max-age=0');
  596. $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
  597. $writer->save('php://output');
  598. exit;
  599. }
  600. function cargarImagen($spreadsheet, $imagen = "/web/img/logo-salud.png", $width = 300, $ubicacion = "A1") {
  601. $basePath = \Yii::getAlias("@app");
  602. $objDrawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
  603. $objDrawing->setName('Logo');
  604. $objDrawing->setDescription('Logo');
  605. $objDrawing->setPath($basePath . $imagen);
  606. $objDrawing->setWidth($width);
  607. $objDrawing->setCoordinates($ubicacion);
  608. $objDrawing->setWorksheet($spreadsheet->getActiveSheet());
  609. }
  610. }