ObraGastoController.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. <?php
  2. namespace app\modules\excel\controllers;
  3. use DateTime;
  4. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  5. use PhpOffice\PhpSpreadsheet\Style\Alignment;
  6. use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
  7. use v1\models\Gasto;
  8. use v1\models\Obra;
  9. use Yii;
  10. use PhpOffice\PhpSpreadsheet\Style\Fill;
  11. use yii\web\Response;
  12. use excel\web\Controller;
  13. class ObraGastoController extends Controller
  14. {
  15. //Version de hugo
  16. public static $estiloCeldaIzquierda12 = [
  17. 'font' => [
  18. 'bold' => true,
  19. 'size' => 12,
  20. 'color' => ['argb' => 'FF000000'],
  21. ],
  22. 'alignment' => [
  23. 'horizontal' => Alignment::HORIZONTAL_LEFT,
  24. 'vertical' => Alignment::VERTICAL_CENTER,
  25. ],
  26. ];
  27. public static $celdaVertical = [
  28. 'font' => [
  29. 'bold' => true,
  30. 'size' => 14,
  31. 'color' => ['argb' => 'FFFFFFFF'],
  32. ],
  33. 'alignment' => [
  34. // 'textRotation' => 90,
  35. 'horizontal' => Alignment::HORIZONTAL_CENTER,
  36. 'vertical' => Alignment::VERTICAL_CENTER
  37. ],
  38. 'fill' => [
  39. 'fillType' => Fill::FILL_SOLID,
  40. 'startColor' => ['argb' => "FF625FF5"]
  41. ],
  42. ];
  43. public static $celdaHorizontal = [
  44. 'font' => [
  45. 'bold' => true,
  46. 'size' => 14,
  47. 'color' => ['argb' => 'FF000000'],
  48. ],
  49. 'alignment' => [
  50. 'horizontal' => Alignment::HORIZONTAL_CENTER,
  51. 'vertical' => Alignment::VERTICAL_CENTER
  52. ],
  53. 'fill' => [
  54. 'fillType' => Fill::FILL_SOLID,
  55. 'startColor' => ['argb' => "FFE7E7E7"]
  56. ],
  57. ];
  58. public static $celdaFuente12 = [
  59. 'font' => [
  60. 'bold' => true,
  61. 'size' => 10,
  62. 'color' => ['argb' => 'FF000000'],
  63. ],
  64. 'alignment' => [
  65. 'horizontal' => Alignment::HORIZONTAL_LEFT,
  66. 'vertical' => Alignment::VERTICAL_CENTER
  67. ],
  68. ];
  69. public static $celdaVerticalF12 = [
  70. 'font' => [
  71. 'bold' => true,
  72. 'size' => 10,
  73. 'color' => ['argb' => 'FF000000'],
  74. ],
  75. 'alignment' => [
  76. 'textRotation' => 90,
  77. 'horizontal' => Alignment::HORIZONTAL_CENTER,
  78. 'vertical' => Alignment::VERTICAL_CENTER
  79. ],
  80. 'fill' => [
  81. 'fillType' => Fill::FILL_SOLID,
  82. 'startColor' => ['argb' => "FFE7E7E7"]
  83. ],
  84. ];
  85. public function encabezadoHoja($logo)
  86. {
  87. $celdas = [
  88. "A1" => [
  89. "valor" => $logo,
  90. "combinar" => "G4",
  91. ],
  92. ];
  93. foreach ($celdas as $coordenada => $valor) {
  94. $this->agregarCelda($coordenada, $valor);
  95. }
  96. $this->renglonActual = 6;
  97. return $this;
  98. }
  99. public function actionGastoExcel($idObra)
  100. {
  101. $json = intval($this->req->get("json", ""));
  102. $obra = Obra::findOne($idObra);
  103. $query = Gasto::find()
  104. ->joinWith('conceptosObra')
  105. ->andWhere(['{{Gasto}}.[[eliminado]]' => null])->andWhere(['{{Gasto}}.[[idObra]]' => $idObra]);
  106. $query->orderBy(['fechaCompra' => SORT_DESC]);
  107. if ($json) {
  108. \Yii::$app->getResponse()->format = Response::FORMAT_JSON;
  109. return $json;
  110. }
  111. $BASEPATH = \Yii::getAlias('@app') . "/web";
  112. $logo = $BASEPATH . '/img/logos/edesarrollos-unicolor-azul.png';
  113. $this->encabezadoHoja($this->logo($logo, 'A1'));
  114. $fechaInicio = (new DateTime($obra->fechaInicio))->format('d-m-Y');
  115. $fechaFin = (new DateTime($obra->fechaFinal))->format('d-m-Y');
  116. $estiloEncabezado = array_merge(self::$celdaVertical, self::$bordes);
  117. $encabezadoTabla = [
  118. "A6" => [
  119. "valor" => "Gastos relacionado a la obra: $obra->nombre",
  120. "combinar" => "D6",
  121. "estilo" => $estiloEncabezado
  122. ],
  123. "A7" => [
  124. "valor" => "Fecha Inicial: $fechaInicio ",
  125. "combinar" => "B7",
  126. "estilo" => $estiloEncabezado
  127. ],
  128. "C7" => [
  129. "valor" => "Fecha Final: $fechaFin",
  130. "combinar" => "D7",
  131. "estilo" => $estiloEncabezado
  132. ]
  133. ];
  134. $this->agregarRenglones($encabezadoTabla);
  135. $encabezadoTabla = [
  136. "A9" => [
  137. "valor" => "Concepto Obra",
  138. "estilo" => $estiloEncabezado
  139. ],
  140. "B9" => [
  141. "valor" => "Cantidad ",
  142. "estilo" => $estiloEncabezado
  143. ],
  144. "C9" => [
  145. "valor" => "Fecha Compra",
  146. "estilo" => $estiloEncabezado
  147. ],
  148. "D9" => [
  149. "valor" => "Descripción",
  150. "estilo" => $estiloEncabezado
  151. ]
  152. ];
  153. $r = 10;
  154. $estiloCondicional = $this->estiloCondicional();
  155. $this->agregarRenglones($encabezadoTabla);
  156. $estiloCeldaIzquierda = array_merge(self::$bordes, self::$celdaFuente12);
  157. foreach ($query->each() as $obraGasto) {
  158. $fecha = (new DateTime($obraGasto->fechaCompra))->format('d-m-Y');
  159. $gasto = $obraGasto->conceptosObra;
  160. $renglones = [
  161. "A{$r}" => [
  162. "valor" => $gasto->concepto,
  163. "estilo" => $estiloCeldaIzquierda
  164. ],
  165. "B{$r}" => [
  166. "valor" => $obraGasto->cantidad,
  167. "estilo" => $estiloCeldaIzquierda,
  168. "formato" => "$#,##0.00",
  169. "estiloCondicional" => $estiloCondicional
  170. ],
  171. "C{$r}" => [
  172. "valor" => $fecha,
  173. "estilo" => $estiloCeldaIzquierda
  174. ],
  175. "D{$r}" => [
  176. "valor" => $obraGasto->descripcion,
  177. "estilo" => $estiloCeldaIzquierda
  178. ]
  179. ];
  180. $this->agregarRenglones($renglones);
  181. $r += 1;
  182. }
  183. $anchoColumnas = [
  184. "A" => ["ancho" => 20],
  185. "B" => ["ancho" => 20],
  186. "C" => ["ancho" => 20],
  187. "D" => ["ancho" => 20],
  188. ];
  189. $this->anchoColumnas($anchoColumnas);
  190. $documento = $this->obtenerHojaDeCalculo();
  191. $this->crear($documento, "Gasto_" . date("YmdHis"), self::TIPO_EXCEL);
  192. \Yii::$app->end();
  193. return $documento;
  194. }
  195. public function actionGastoConceptoExcel($idObra)
  196. {
  197. $json = intval($this->req->get("json", ""));
  198. $obra = Obra::findOne($idObra);
  199. $query = Gasto::find()
  200. ->select(['{{ConceptoObra}}.[[concepto]] AS concepto', 'SUM({{Gasto}}.[[cantidad]]) AS totalGasto'])
  201. ->innerJoin('{{ConceptoObra}}', '{{Gasto}}.[[idConceptoObra]] = {{ConceptoObra}}.[[id]]') // Relación explícita con delimitadores
  202. ->andWhere(['{{Gasto}}.[[eliminado]]' => null])
  203. ->andWhere(['{{Gasto}}.[[idObra]]' => $idObra])
  204. ->groupBy('{{ConceptoObra}}.[[id]]')
  205. ->asArray()
  206. ->all();
  207. if ($json) {
  208. \Yii::$app->getResponse()->format = Response::FORMAT_JSON;
  209. return $json;
  210. }
  211. $BASEPATH = \Yii::getAlias('@app') . "/web";
  212. $logo = $BASEPATH . '/img/logos/edesarrollos-unicolor-azul.png';
  213. $this->encabezadoHoja($this->logo($logo, 'A1'));
  214. $fechaInicio = (new DateTime($obra->fechaInicio))->format('d-m-Y');
  215. $fechaFin = (new DateTime($obra->fechaFinal))->format('d-m-Y');
  216. $estiloEncabezado = array_merge(self::$celdaVertical, self::$bordes);
  217. $encabezadoTabla = [
  218. "A6" => [
  219. "valor" => "Gastos por Concepto de Obra, relacionado a la obra: $obra->nombre",
  220. "combinar" => "D6",
  221. "estilo" => $estiloEncabezado
  222. ],
  223. "A7" => [
  224. "valor" => "Fecha Inicial: $fechaInicio ",
  225. "combinar" => "B7",
  226. "estilo" => $estiloEncabezado
  227. ],
  228. "C7" => [
  229. "valor" => "Fecha Final: $fechaFin",
  230. "combinar" => "D7",
  231. "estilo" => $estiloEncabezado
  232. ]
  233. ];
  234. $this->agregarRenglones($encabezadoTabla);
  235. $encabezadoTabla = [
  236. "A9" => [
  237. "valor" => "Concepto Obra",
  238. "estilo" => $estiloEncabezado
  239. ],
  240. "B9" => [
  241. "valor" => "Total:",
  242. "estilo" => $estiloEncabezado
  243. ],
  244. ];
  245. $r = 10;
  246. $estiloCondicional = $this->estiloCondicional();
  247. $this->agregarRenglones($encabezadoTabla);
  248. $estiloCeldaIzquierda = array_merge(self::$bordes, self::$celdaFuente12);
  249. $TotalGasto= 0;
  250. foreach ($query as $obraGasto) {
  251. $TotalGasto=$TotalGasto+=$obraGasto['totalGasto'];
  252. $renglones = [
  253. "A{$r}" => [
  254. "valor" => $obraGasto['concepto'],
  255. "estilo" => $estiloCeldaIzquierda
  256. ],
  257. "B{$r}" => [
  258. "valor" => $obraGasto['totalGasto'],
  259. "estilo" => $estiloCeldaIzquierda,
  260. "formato" => "$#,##0.00",
  261. "estiloCondicional" => $estiloCondicional
  262. ],
  263. ];
  264. $this->agregarRenglones($renglones);
  265. $r += 1;
  266. }
  267. $r+=1;
  268. $renglonesTotales = [
  269. "A{$r}" => [
  270. "valor" => "TOTAL",
  271. "estilo" => $estiloEncabezado
  272. ],
  273. "B{$r}" => [
  274. "valor" => $TotalGasto,
  275. "estilo" => $estiloCeldaIzquierda,
  276. "formato" => "$#,##0.00",
  277. "estiloCondicional" => $estiloCondicional
  278. ],
  279. ];
  280. $this->agregarRenglones($renglonesTotales);
  281. $anchoColumnas = [
  282. "A" => ["ancho" => 20],
  283. "B" => ["ancho" => 20],
  284. "C" => ["ancho" => 20],
  285. "D" => ["ancho" => 20],
  286. ];
  287. $this->anchoColumnas($anchoColumnas);
  288. $documento = $this->obtenerHojaDeCalculo();
  289. $this->crear($documento, "GastoConcepto_" . date("YmdHis"), self::TIPO_EXCEL);
  290. \Yii::$app->end();
  291. return $documento;
  292. }
  293. }