ObraRubroController.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. <?php
  2. namespace app\modules\excel\controllers;
  3. use DateTime;
  4. use DateTimeZone;
  5. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  6. use PhpOffice\PhpSpreadsheet\Style\Alignment;
  7. use PhpOffice\PhpSpreadsheet\Style\Fill;
  8. use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
  9. use v1\models\Obra;
  10. use v1\models\ObraRubro;
  11. use Yii;
  12. use excel\web\Controller;
  13. use yii\web\Response;
  14. class ObraRubroController extends Controller
  15. {
  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 actionExcelObraRubro($idObra)
  100. {
  101. $obra = Obra::findOne($idObra);
  102. $request = Yii::$app->request;
  103. $query = ObraRubro::find()
  104. ->joinWith('conceptoObra')
  105. ->andWhere(['{{ObraRubro}}.[[eliminado]]' => null])->andWhere(['{{ObraRubro}}.[[idObra]]' => $idObra]);
  106. $query->orderBy(['fechaCompra' => SORT_DESC]);
  107. $BASEPATH = \Yii::getAlias('@app') . "/web";
  108. $logo = $BASEPATH . '/img/logos/edesarrollos-unicolor-azul.png';
  109. $fechaInicio = (new DateTime($obra->fechaInicio))->format('d-m-Y');
  110. $fechaFin = (new DateTime($obra->fechaFinal))->format('d-m-Y');
  111. $this->encabezadoHoja($this->logo($logo, 'A1'));
  112. $estiloEncabezado = array_merge(self::$celdaVertical, self::$bordes);
  113. $encabezadoTabla = [
  114. "A6" => [
  115. "valor" => "Rubro relacionado a la obra: $obra->nombre",
  116. "combinar" => "D6",
  117. "estilo" => $estiloEncabezado
  118. ],
  119. "A7" => [
  120. "valor" => "Fecha Inicial: $fechaInicio ",
  121. "combinar" => "B7",
  122. "estilo" => $estiloEncabezado
  123. ],
  124. "C7" => [
  125. "valor" => "Fecha Final: $fechaFin",
  126. "combinar" => "D7",
  127. "estilo" => $estiloEncabezado
  128. ]
  129. ];
  130. $this->agregarRenglones($encabezadoTabla);
  131. $encabezadoTabla = [
  132. "A9" => [
  133. "valor" => "Concepto Obra",
  134. "estilo" => $estiloEncabezado
  135. ],
  136. "B9" => [
  137. "valor" => "Cantidad ",
  138. "estilo" => $estiloEncabezado
  139. ],
  140. "C9" => [
  141. "valor" => "Fecha Compra",
  142. "estilo" => $estiloEncabezado
  143. ],
  144. "D9" => [
  145. "valor" => "Descripción",
  146. "estilo" => $estiloEncabezado
  147. ]
  148. ];
  149. $r = 10;
  150. $this->agregarRenglones($encabezadoTabla);
  151. $estiloCeldaIzquierda = array_merge(self::$bordes, self::$celdaFuente12);
  152. $estiloCondicional = $this->estiloCondicional();
  153. foreach ($query->each() as $obraRubro) {
  154. $fecha = (new DateTime($obraRubro->fechaCompra))->format('d-m-Y');
  155. $rubro = $obraRubro->conceptoObra;
  156. $renglones = [
  157. "A{$r}" => [
  158. "valor" => $rubro->concepto,
  159. "estilo" => $estiloCeldaIzquierda
  160. ],
  161. "B{$r}" => [
  162. "valor" => $obraRubro->cantidad,
  163. "estilo" => $estiloCeldaIzquierda,
  164. "formato" => "$#,##0.00",
  165. "estiloCondicional" => $estiloCondicional
  166. ],
  167. "C{$r}" => [
  168. "valor" => $fecha,
  169. "estilo" => $estiloCeldaIzquierda
  170. ],
  171. "D{$r}" => [
  172. "valor" => $obraRubro->descripcion,
  173. "estilo" => $estiloCeldaIzquierda
  174. ]
  175. ];
  176. $this->agregarRenglones($renglones);
  177. $r += 1;
  178. }
  179. $anchoColumnas = [
  180. "A" => ["ancho" => 20],
  181. "B" => ["ancho" => 20],
  182. "C" => ["ancho" => 20],
  183. "D" => ["ancho" => 20],
  184. ];
  185. $this->anchoColumnas($anchoColumnas);
  186. $documento = $this->obtenerHojaDeCalculo();
  187. $this->crear($documento, "Rubro_" . date("YmdHis"), self::TIPO_EXCEL);
  188. \Yii::$app->end();
  189. }
  190. public function actionRubroConceptoExcel($idObra)
  191. {
  192. $json = intval($this->req->get("json", ""));
  193. $obra = Obra::findOne($idObra);
  194. $query = ObraRubro::find()
  195. ->select(['{{ConceptoObra}}.[[concepto]] AS concepto', 'SUM({{ObraRubro}}.[[cantidad]]) AS totalObraRubro'])
  196. ->innerJoin('{{ConceptoObra}}', '{{ObraRubro}}.[[idConceptoObra]] = {{ConceptoObra}}.[[id]]')
  197. ->andWhere(['{{ObraRubro}}.[[eliminado]]' => null])
  198. ->andWhere(['{{ObraRubro}}.[[idObra]]' => $idObra])
  199. ->groupBy('{{ConceptoObra}}.[[id]]')
  200. ->asArray()
  201. ->all();
  202. if ($json) {
  203. \Yii::$app->getResponse()->format = Response::FORMAT_JSON;
  204. return $json;
  205. }
  206. $BASEPATH = \Yii::getAlias('@app') . "/web";
  207. $logo = $BASEPATH . '/img/logos/edesarrollos-unicolor-azul.png';
  208. $this->encabezadoHoja($this->logo($logo, 'A1'));
  209. $fechaInicio = (new DateTime($obra->fechaInicio))->format('d-m-Y');
  210. $fechaFin = (new DateTime($obra->fechaFinal))->format('d-m-Y');
  211. $estiloEncabezado = array_merge(self::$celdaVertical, self::$bordes);
  212. $encabezadoTabla = [
  213. "A6" => [
  214. "valor" => "Rubro por Concepto de Obra, relacionado a la obra: $obra->nombre",
  215. "combinar" => "D6",
  216. "estilo" => $estiloEncabezado
  217. ],
  218. "A7" => [
  219. "valor" => "Fecha Inicial: $fechaInicio ",
  220. "combinar" => "B7",
  221. "estilo" => $estiloEncabezado
  222. ],
  223. "C7" => [
  224. "valor" => "Fecha Final: $fechaFin",
  225. "combinar" => "D7",
  226. "estilo" => $estiloEncabezado
  227. ]
  228. ];
  229. $this->agregarRenglones($encabezadoTabla);
  230. $encabezadoTabla = [
  231. "A9" => [
  232. "valor" => "Concepto Obra",
  233. "estilo" => $estiloEncabezado
  234. ],
  235. "B9" => [
  236. "valor" => "Total:",
  237. "estilo" => $estiloEncabezado
  238. ],
  239. ];
  240. $r = 10;
  241. $estiloCondicional = $this->estiloCondicional();
  242. $this->agregarRenglones($encabezadoTabla);
  243. $estiloCeldaIzquierda = array_merge(self::$bordes, self::$celdaFuente12);
  244. $TotalObraRubro= 0;
  245. foreach ($query as $obraObraRubro) {
  246. $TotalObraRubro=$TotalObraRubro+$obraObraRubro['totalObraRubro'];
  247. $renglones = [
  248. "A{$r}" => [
  249. "valor" => $obraObraRubro['concepto'],
  250. "estilo" => $estiloCeldaIzquierda
  251. ],
  252. "B{$r}" => [
  253. "valor" => $obraObraRubro['totalObraRubro'],
  254. "estilo" => $estiloCeldaIzquierda,
  255. "formato" => "$#,##0.00",
  256. "estiloCondicional" => $estiloCondicional
  257. ],
  258. ];
  259. $this->agregarRenglones($renglones);
  260. $r += 1;
  261. }
  262. $r+=1;
  263. $renglonesTotales = [
  264. "A{$r}" => [
  265. "valor" => "TOTAL",
  266. "estilo" => $estiloEncabezado
  267. ],
  268. "B{$r}" => [
  269. "valor" => $TotalObraRubro,
  270. "estilo" => $estiloCeldaIzquierda,
  271. "formato" => "$#,##0.00",
  272. "estiloCondicional" => $estiloCondicional
  273. ],
  274. ];
  275. $this->agregarRenglones($renglonesTotales);
  276. $anchoColumnas = [
  277. "A" => ["ancho" => 20],
  278. "B" => ["ancho" => 20],
  279. "C" => ["ancho" => 20],
  280. "D" => ["ancho" => 20],
  281. ];
  282. $this->anchoColumnas($anchoColumnas);
  283. $documento = $this->obtenerHojaDeCalculo();
  284. $this->crear($documento, "ObraRubroConcepto_" . date("YmdHis"), self::TIPO_EXCEL);
  285. \Yii::$app->end();
  286. return $documento;
  287. }
  288. }