ObraController.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. <?php
  2. namespace app\modules\excel\controllers;
  3. use v1\models\ObraEmpleado;
  4. use v1\models\Usuario;
  5. use DateTime;
  6. use DateTimeZone;
  7. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  8. use PhpOffice\PhpSpreadsheet\Style\Alignment;
  9. use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
  10. use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
  11. use v1\models\Obra;
  12. use v1\models\ObraHerramienta;
  13. use Yii;
  14. use yii\web\Controller;
  15. class ObraController extends Controller
  16. {
  17. public function actionExcelObra($idObra)
  18. {
  19. $obra = Obra::findOne($idObra);
  20. $request = Yii::$app->request;
  21. $spreadsheet = new Spreadsheet();
  22. $sheet = $spreadsheet->getActiveSheet();
  23. $sheet->setTitle('Informacion General');
  24. $BASEPATH = \Yii::getAlias('@app') . "/web";
  25. $logo = $BASEPATH . '/img/logos/edesarrollos-unicolor-azul.png';
  26. $fechaInicio = (new DateTime($obra->fechaInicio))->format('d-m-Y');
  27. $fechaFin = (new DateTime($obra->fechaFinal))->format('d-m-Y');
  28. $drawing = new Drawing();
  29. $drawing->setName('Logotipo');
  30. $drawing->setDescription('Logotipo de la empresa');
  31. $drawing->setPath($logo);
  32. $drawing->setHeight(70);
  33. $drawing->setCoordinates('A1');
  34. $drawing->setOffsetX(10);
  35. $drawing->setOffsetY(10);
  36. $drawing->setWorksheet($sheet);
  37. $sheet->mergeCells('A5:N5');
  38. $sheet->setCellValue('A5', 'Obra: ' . $obra->nombre);
  39. $sheet->mergeCells('A6:G6');
  40. $sheet->setCellValue('A6', 'Fecha Inicial: ' . $fechaInicio);
  41. $sheet->mergeCells('H6:N6');
  42. $sheet->setCellValue('H6', 'Fecha Final: ' . $fechaFin);
  43. $sheet->getStyle('A5')->getFont()->setBold(true);
  44. $sheet->getStyle('A5')->getFont()->setSize(16);
  45. $headerStyle = [
  46. 'font' => [
  47. 'bold' => true,
  48. 'color' => ['argb' => 'FFFFFFFF'] // Letras en blanco
  49. ],
  50. 'alignment' => [
  51. 'horizontal' => Alignment::HORIZONTAL_CENTER,
  52. 'vertical' => Alignment::VERTICAL_CENTER,
  53. 'wrapText' => true
  54. ],
  55. 'fill' => [
  56. 'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID,
  57. 'startColor' => ['argb' => 'FF625FF5'] // Fondo azul (con opacidad FF)
  58. ],
  59. 'borders' => [
  60. 'allBorders' => [
  61. 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
  62. 'color' => ['argb' => 'FF020073'], // Bordes azul oscuro (con opacidad FF)
  63. ],
  64. ],
  65. ];
  66. // Aplicar el borde a las celdas combinadas
  67. $sheet->getStyle('A5:N5')->applyFromArray($headerStyle);
  68. $sheet->getStyle('A6:G6')->applyFromArray($headerStyle);
  69. $sheet->getStyle('H6:N6')->applyFromArray($headerStyle);
  70. //Empleados
  71. $empleados = ObraEmpleado::find()
  72. ->joinWith('empleado')
  73. ->andWhere(['{{ObraEmpleado}}.[[eliminado]]' => null])->andWhere(['{{ObraEmpleado}}.[[idObra]]' => $idObra]);
  74. $empleados->orderBy(['creado' => SORT_DESC]);
  75. $sheet->mergeCells('A8:G8');
  76. $sheet->setCellValue('A8', 'Empleados');
  77. $sheet->getStyle('A8:G8')->applyFromArray($headerStyle);
  78. $sheet->mergeCells('A9:D9');
  79. $sheet->setCellValue('A9', 'Nombre');
  80. $sheet->getStyle('A9:D9')->applyFromArray($headerStyle);
  81. $sheet->mergeCells('E9:G9');
  82. $sheet->setCellValue('E9', 'Fecha Alta');
  83. $sheet->getStyle('E9:G9')->applyFromArray($headerStyle);
  84. $cellBorderStyle = [
  85. 'borders' => [
  86. 'allBorders' => [
  87. 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
  88. 'color' => ['argb' => 'FF000000'], // Color negro
  89. ],
  90. ],
  91. ];
  92. $rowEmpleados = 10;
  93. foreach ($empleados->each() as $obraEmpleado) {
  94. $empleado = $obraEmpleado->empleado;
  95. $fecha = (new DateTime($empleado->fechaAlta))->format('d-m-Y');
  96. $sheet->mergeCells('A' . $rowEmpleados . ':D' . $rowEmpleados);
  97. $sheet->setCellValue('A' . $rowEmpleados, $empleado->nombre);
  98. $sheet->getStyle('A' . $rowEmpleados . ':D' . $rowEmpleados)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_JUSTIFY);
  99. $sheet->getStyle('A' . $rowEmpleados . ':D' . $rowEmpleados)->applyFromArray($cellBorderStyle);
  100. $sheet->mergeCells('E' . $rowEmpleados . ':G' . $rowEmpleados);
  101. $sheet->setCellValue('E' . $rowEmpleados, $fecha);
  102. $sheet->getStyle('E' . $rowEmpleados . ':G' . $rowEmpleados)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_JUSTIFY);
  103. $sheet->getStyle('E' . $rowEmpleados . ':G' . $rowEmpleados)->applyFromArray($cellBorderStyle);
  104. $rowEmpleados++;
  105. }
  106. //Herramientas
  107. $query = ObraHerramienta::find()
  108. ->joinWith('herramienta')
  109. ->andWhere(['{{ObraHerramienta}}.[[eliminado]]' => null])->andWhere(['{{ObraHerramienta}}.[[idObra]]' => $idObra]);
  110. $query->orderBy(['creado' => SORT_DESC]);
  111. $sheet->mergeCells('H8:N8');
  112. $sheet->setCellValue('H8', 'Herramientas');
  113. $sheet->getStyle('H8:N8')->applyFromArray($headerStyle);
  114. $sheet->mergeCells('H9:K9');
  115. $sheet->setCellValue('H9', 'Herramienta');
  116. $sheet->getStyle('H9:K9')->applyFromArray($headerStyle);
  117. $sheet->mergeCells('L9:N9');
  118. $sheet->setCellValue('L9', 'Cantidad');
  119. $sheet->getStyle('L9:N9')->applyFromArray($headerStyle);
  120. $rowHerramientas = 10;
  121. foreach ($query->each() as $obraHerramienta) {
  122. $herramienta = $obraHerramienta->herramienta;
  123. $sheet->mergeCells('H' . $rowHerramientas . ':K' . $rowHerramientas);
  124. $sheet->setCellValue('H' . $rowHerramientas, $herramienta->nombre); // Nombre del empleado
  125. $sheet->getStyle('H' . $rowHerramientas . ':K' . $rowHerramientas)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_JUSTIFY);
  126. $sheet->getStyle('H' . $rowHerramientas . ':K' . $rowHerramientas)->applyFromArray($cellBorderStyle);
  127. $sheet->mergeCells('L' . $rowHerramientas . ':N' . $rowHerramientas);
  128. $sheet->setCellValue('L' . $rowHerramientas, $obraHerramienta->cantidad); // Nombre del empleado
  129. $sheet->getStyle('L' . $rowHerramientas . ':N' . $rowHerramientas)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_JUSTIFY);
  130. $sheet->getStyle('L' . $rowHerramientas . ':N' . $rowHerramientas)->applyFromArray($cellBorderStyle);
  131. $rowHerramientas++;
  132. }
  133. //Totales
  134. $totalesController = new \v1\controllers\ObraController('totales', Yii::$app);
  135. $totalGasto = $totalesController->actionTotalGasto($idObra);
  136. $totalPago = $totalesController->actionTotalPago($idObra);
  137. $totalNomina = $totalesController->actionTotalNomina($idObra);
  138. $totalRubro = $totalesController->actionTotalRubro($idObra);
  139. $saldo = $totalesController->actionSaldo($totalGasto, $totalNomina, $totalPago);
  140. $ejercidoObra = $totalesController->actionEjercidoObra($totalGasto, $totalRubro);
  141. $ejercer = $totalesController->actionEjercer($totalRubro, $totalPago);
  142. $startRowTotales = max($rowEmpleados, $rowHerramientas) + 2;
  143. // Gasto total
  144. $sheet->mergeCells("A{$startRowTotales}:B{$startRowTotales}");
  145. $sheet->getStyle("A{$startRowTotales}:B{$startRowTotales}")->applyFromArray($headerStyle);
  146. $sheet->setCellValue("A{$startRowTotales}", 'Gasto total');
  147. $sheet->mergeCells("A" . ($startRowTotales + 1) . ":B" . ($startRowTotales + 1)); // Merge en la fila de resultados
  148. $sheet->setCellValue("A" . ($startRowTotales + 1), $totalGasto);
  149. $sheet->getStyle("A" . ($startRowTotales + 1))->getNumberFormat()->setFormatCode('"$"#,##0');
  150. $sheet->getStyle("A" . ($startRowTotales + 1). ":B" . ($startRowTotales + 1))->applyFromArray($cellBorderStyle);
  151. // Pago total
  152. $sheet->mergeCells("C{$startRowTotales}:D{$startRowTotales}");
  153. $sheet->getStyle("C{$startRowTotales}:D{$startRowTotales}")->applyFromArray($headerStyle);
  154. $sheet->setCellValue("C{$startRowTotales}", 'Pago total');
  155. $sheet->mergeCells("C" . ($startRowTotales + 1) . ":D" . ($startRowTotales + 1)); // Merge en la fila de resultados
  156. $sheet->setCellValue("C" . ($startRowTotales + 1), $totalPago);
  157. $sheet->getStyle("C" . ($startRowTotales + 1))->getNumberFormat()->setFormatCode('"$"#,##0');
  158. $sheet->getStyle("C" . ($startRowTotales + 1). ":D". ($startRowTotales + 1))->applyFromArray($cellBorderStyle);
  159. // Nómina total
  160. $sheet->mergeCells("E{$startRowTotales}:F{$startRowTotales}");
  161. $sheet->getStyle("E{$startRowTotales}:F{$startRowTotales}")->applyFromArray($headerStyle);
  162. $sheet->setCellValue("E{$startRowTotales}", 'Nómina total');
  163. $sheet->mergeCells("E" . ($startRowTotales + 1) . ":F" . ($startRowTotales + 1)); // Merge en la fila de resultados
  164. $sheet->setCellValue("E" . ($startRowTotales + 1), $totalNomina);
  165. $sheet->getStyle("E" . ($startRowTotales + 1))->getNumberFormat()->setFormatCode('"$"#,##0');
  166. $sheet->getStyle("E" . ($startRowTotales + 1).":F". ($startRowTotales + 1))->applyFromArray($cellBorderStyle);
  167. // Rubro de Obra total
  168. $sheet->mergeCells("G{$startRowTotales}:H{$startRowTotales}");
  169. $sheet->getStyle("G{$startRowTotales}:H{$startRowTotales}")->applyFromArray($headerStyle);
  170. $sheet->setCellValue("G{$startRowTotales}", 'Rubro de Obra total');
  171. $sheet->mergeCells("G" . ($startRowTotales + 1) . ":H" . ($startRowTotales + 1)); // Merge en la fila de resultados
  172. $sheet->setCellValue("G" . ($startRowTotales + 1), $totalRubro);
  173. $sheet->getStyle("G" . ($startRowTotales + 1))->getNumberFormat()->setFormatCode('"$"#,##0');
  174. $sheet->getStyle("G" . ($startRowTotales + 1). ":H". ($startRowTotales + 1))->applyFromArray($cellBorderStyle);
  175. // Saldo total
  176. $sheet->mergeCells("I{$startRowTotales}:J{$startRowTotales}");
  177. $sheet->getStyle("I{$startRowTotales}:J{$startRowTotales}")->applyFromArray($headerStyle);
  178. $sheet->setCellValue("I{$startRowTotales}", 'Saldo total');
  179. $sheet->mergeCells("I" . ($startRowTotales + 1) . ":J" . ($startRowTotales + 1)); // Merge en la fila de resultados
  180. $sheet->setCellValue("I" . ($startRowTotales + 1), $saldo);
  181. $sheet->getStyle("I" . ($startRowTotales + 1))->getNumberFormat()->setFormatCode('"$"#,##0');
  182. $sheet->getStyle("I" . ($startRowTotales + 1). ":J" . ($startRowTotales + 1))->applyFromArray($cellBorderStyle);
  183. // Ejercido obra
  184. $sheet->mergeCells("K{$startRowTotales}:L{$startRowTotales}");
  185. $sheet->getStyle("K{$startRowTotales}:L{$startRowTotales}")->applyFromArray($headerStyle);
  186. $sheet->setCellValue("K{$startRowTotales}", 'Ejercido obra');
  187. $sheet->mergeCells("K" . ($startRowTotales + 1) . ":L" . ($startRowTotales + 1)); // Merge en la fila de resultados
  188. $sheet->setCellValue("K" . ($startRowTotales + 1), $ejercidoObra);
  189. $sheet->getStyle("K" . ($startRowTotales + 1))->getNumberFormat()->setFormatCode('"$"#,##0');
  190. $sheet->getStyle("K" . ($startRowTotales + 1). ":L". ($startRowTotales + 1))->applyFromArray($cellBorderStyle);
  191. // Por ejercer
  192. $sheet->mergeCells("M{$startRowTotales}:N{$startRowTotales}");
  193. $sheet->getStyle("M{$startRowTotales}:N{$startRowTotales}")->applyFromArray($headerStyle);
  194. $sheet->setCellValue("M{$startRowTotales}", 'Por ejercer');
  195. $sheet->mergeCells("M" . ($startRowTotales + 1) . ":N" . ($startRowTotales + 1)); // Merge en la fila de resultados
  196. $sheet->setCellValue("M" . ($startRowTotales + 1), $ejercer);
  197. $sheet->getStyle("M" . ($startRowTotales + 1))->getNumberFormat()->setFormatCode('"$"#,##0');
  198. $sheet->getStyle("M" . ($startRowTotales + 1). ":N" . ($startRowTotales + 1))->applyFromArray($cellBorderStyle);
  199. $excelGasto= new \app\modules\excel\controllers\ObraGastoController('totales', Yii::$app);
  200. $sheetGasto = $excelGasto->actionExcelGasto($idObra);
  201. $spreadsheet->addSheet($sheetGasto);
  202. $excelPago= new \app\modules\excel\controllers\ObraPagoController('totales', Yii::$app);
  203. $sheetPago = $excelPago->actionExcelPago($idObra);
  204. $spreadsheet->addSheet($sheetPago);
  205. $excelNomina= new \app\modules\excel\controllers\ObraNominaController('totales', Yii::$app);
  206. $sheetNomina = $excelNomina->actionExcelNomina($idObra);
  207. $spreadsheet->addSheet($sheetNomina);
  208. $excelRubro= new \app\modules\excel\controllers\ObraRubroController('totales', Yii::$app);
  209. $sheetRubro = $excelRubro->actionExcelRubro($idObra);
  210. $spreadsheet->addSheet($sheetRubro);
  211. $sheet->getStyle('A5')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
  212. $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
  213. try {
  214. ob_start();
  215. $writer->save("php://output");
  216. $documento = ob_get_contents();
  217. ob_clean();
  218. Yii::$app->getResponse()->sendContentAsFile($documento, "Obra.xlsx");
  219. } catch (\Exception $exception) {
  220. return null;
  221. }
  222. }
  223. }