ObraController.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  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\Fill;
  10. use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
  11. use v1\models\Obra;
  12. use v1\models\ObraHerramienta;
  13. use Yii;
  14. use excel\web\Controller;
  15. use v1\models\Gasto;
  16. use v1\models\Nomina;
  17. use v1\models\ObraRubro;
  18. use v1\models\Pago;
  19. use yii\web\Response;
  20. class ObraController extends Controller
  21. {
  22. public static $estiloCeldaIzquierda12 = [
  23. 'font' => [
  24. 'bold' => true,
  25. 'size' => 12,
  26. 'color' => ['argb' => 'FF000000'],
  27. ],
  28. 'alignment' => [
  29. 'horizontal' => Alignment::HORIZONTAL_LEFT,
  30. 'vertical' => Alignment::VERTICAL_CENTER,
  31. ],
  32. ];
  33. public static $celdaVertical = [
  34. 'font' => [
  35. 'bold' => true,
  36. 'size' => 14,
  37. 'color' => ['argb' => 'FFFFFFFF'],
  38. ],
  39. 'alignment' => [
  40. // 'textRotation' => 90,
  41. 'horizontal' => Alignment::HORIZONTAL_CENTER,
  42. 'vertical' => Alignment::VERTICAL_CENTER
  43. ],
  44. 'fill' => [
  45. 'fillType' => Fill::FILL_SOLID,
  46. 'startColor' => ['argb' => "FF625FF5"]
  47. ],
  48. ];
  49. public static $celdaHorizontal = [
  50. 'font' => [
  51. 'bold' => true,
  52. 'size' => 14,
  53. 'color' => ['argb' => 'FF000000'],
  54. ],
  55. 'alignment' => [
  56. 'horizontal' => Alignment::HORIZONTAL_CENTER,
  57. 'vertical' => Alignment::VERTICAL_CENTER
  58. ],
  59. 'fill' => [
  60. 'fillType' => Fill::FILL_SOLID,
  61. 'startColor' => ['argb' => "FFE7E7E7"]
  62. ],
  63. ];
  64. public static $celdaFuente12 = [
  65. 'font' => [
  66. 'bold' => true,
  67. 'size' => 10,
  68. 'color' => ['argb' => 'FF000000'],
  69. ],
  70. 'alignment' => [
  71. 'horizontal' => Alignment::HORIZONTAL_LEFT,
  72. 'vertical' => Alignment::VERTICAL_CENTER
  73. ],
  74. ];
  75. public static $celdaVerticalF12 = [
  76. 'font' => [
  77. 'bold' => true,
  78. 'size' => 10,
  79. 'color' => ['argb' => 'FF000000'],
  80. ],
  81. 'alignment' => [
  82. 'textRotation' => 90,
  83. 'horizontal' => Alignment::HORIZONTAL_CENTER,
  84. 'vertical' => Alignment::VERTICAL_CENTER
  85. ],
  86. 'fill' => [
  87. 'fillType' => Fill::FILL_SOLID,
  88. 'startColor' => ['argb' => "FFE7E7E7"]
  89. ],
  90. ];
  91. public function encabezadoHoja($logo)
  92. {
  93. $celdas = [
  94. "A1" => [
  95. "valor" => $logo,
  96. "combinar" => "G4",
  97. ],
  98. ];
  99. foreach ($celdas as $coordenada => $valor) {
  100. $this->agregarCelda($coordenada, $valor);
  101. }
  102. $this->renglonActual = 6;
  103. return $this;
  104. }
  105. public function actionExcelObra($idObra)
  106. {
  107. $json = intval($this->req->get("json", ""));
  108. $obra = Obra::findOne($idObra);
  109. $request = Yii::$app->request;
  110. if ($json) {
  111. \Yii::$app->getResponse()->format = Response::FORMAT_JSON;
  112. return $json;
  113. }
  114. $BASEPATH = \Yii::getAlias('@app') . "/web";
  115. $logo = $BASEPATH . '/img/logos/edesarrollos-unicolor-azul.png';
  116. $fechaInicio = (new DateTime($obra->fechaInicio))->format('d-m-Y');
  117. $fechaFin = (new DateTime($obra->fechaFinal))->format('d-m-Y');
  118. $this->encabezadoHoja($this->logo($logo, 'A1'));
  119. $estiloEncabezado = array_merge(self::$celdaVertical, self::$bordes);
  120. $encabezadoTabla = [
  121. "A6" => [
  122. "valor" => "Obra: $obra->nombre",
  123. "combinar" => "D6",
  124. "estilo" => $estiloEncabezado
  125. ],
  126. "A7" => [
  127. "valor" => "Fecha Inicial: $fechaInicio ",
  128. "combinar" => "B7",
  129. "estilo" => $estiloEncabezado
  130. ],
  131. "C7" => [
  132. "valor" => "Fecha Final: $fechaFin",
  133. "combinar" => "D7",
  134. "estilo" => $estiloEncabezado
  135. ]
  136. ];
  137. $this->agregarRenglones($encabezadoTabla);
  138. $empleados = ObraEmpleado::find()
  139. ->joinWith('empleado')
  140. ->andWhere(['{{ObraEmpleado}}.[[eliminado]]' => null])->andWhere(['{{ObraEmpleado}}.[[idObra]]' => $idObra]);
  141. $empleados->orderBy(['creado' => SORT_DESC]);
  142. $encabezadoTabla = [
  143. "A9" => [
  144. "valor" => "Empleados",
  145. "estilo" => $estiloEncabezado,
  146. "combinar" => "B9",
  147. ],
  148. "A10" => [
  149. "valor" => "Nombre",
  150. "estilo" => $estiloEncabezado,
  151. ],
  152. "B10" => [
  153. "valor" => "Fecha Alta",
  154. "estilo" => $estiloEncabezado,
  155. ],
  156. "C9" => [
  157. "valor" => "Empleados",
  158. "estilo" => $estiloEncabezado,
  159. "combinar" => "D9",
  160. ],
  161. "C10" => [
  162. "valor" => "Nombre",
  163. "estilo" => $estiloEncabezado,
  164. ],
  165. "D10" => [
  166. "valor" => "Fecha Alta",
  167. "estilo" => $estiloEncabezado,
  168. ],
  169. ];
  170. $rEmpleado = 11;
  171. $this->agregarRenglones($encabezadoTabla);
  172. $estiloCeldaIzquierda = array_merge(self::$bordes, self::$celdaFuente12);
  173. $estiloCondicional = $this->estiloCondicional();
  174. foreach ($empleados->each() as $obraEmpleado) {
  175. $empleado = $obraEmpleado->empleado;
  176. $fecha = (new DateTime($empleado->fechaAlta))->format('d-m-Y');
  177. $renglones = [
  178. "A{$rEmpleado}" => [
  179. "valor" => $empleado->nombre,
  180. "estilo" => $estiloCeldaIzquierda,
  181. ],
  182. "B{$rEmpleado}" => [
  183. "valor" => $fecha,
  184. "estilo" => $estiloCeldaIzquierda,
  185. ],
  186. ];
  187. $this->agregarRenglones($renglones);
  188. $rEmpleado += 1;
  189. }
  190. $herramienta = ObraHerramienta::find()
  191. ->joinWith('herramienta')
  192. ->andWhere(['{{ObraHerramienta}}.[[eliminado]]' => null])->andWhere(['{{ObraHerramienta}}.[[idObra]]' => $idObra]);
  193. $herramienta->orderBy(['creado' => SORT_DESC]);
  194. $rHerramienta = 11;
  195. foreach ($herramienta->each() as $obraHerramienta) {
  196. $herramienta = $obraHerramienta->herramienta;
  197. $renglones = [
  198. "C{$rHerramienta}" => [
  199. "valor" => $herramienta->nombre,
  200. "estilo" => $estiloCeldaIzquierda,
  201. ],
  202. "D{$rHerramienta}" => [
  203. "valor" => $obraHerramienta->cantidad,
  204. "estilo" => $estiloCeldaIzquierda,
  205. "formato" => "$#,##0.00",
  206. "estiloCondicional" => $estiloCondicional
  207. ],
  208. ];
  209. $this->agregarRenglones($renglones);
  210. $rHerramienta += 1;
  211. }
  212. $totalesController = new \v1\controllers\ObraController('totales', Yii::$app);
  213. $totalGasto = $totalesController->actionTotalGasto($idObra);
  214. $totalPago = $totalesController->actionTotalPago($idObra);
  215. $totalNomina = $totalesController->actionTotalNomina($idObra);
  216. $totalRubro = $totalesController->actionTotalRubro($idObra);
  217. $saldo = $totalesController->actionSaldo($totalGasto, $totalNomina, $totalPago);
  218. $ejercidoObra = $totalesController->actionEjercidoObra($totalGasto, $totalRubro);
  219. $ejercer = $totalesController->actionEjercer($totalRubro, $totalPago);
  220. $startRowTotales = max($rEmpleado, $rHerramienta) + 2;
  221. $encabezadoTablaTotales = [
  222. "A{$startRowTotales}" => [
  223. "valor" => "Gasto Total",
  224. "estilo" => $estiloEncabezado,
  225. ],
  226. "B{$startRowTotales}" => [
  227. "valor" => "Pago Total",
  228. "estilo" => $estiloEncabezado,
  229. ],
  230. "C{$startRowTotales}" => [
  231. "valor" => "Nómina total",
  232. "estilo" => $estiloEncabezado,
  233. ],
  234. "D{$startRowTotales}" => [
  235. "valor" => "Rubro de Obra",
  236. "estilo" => $estiloEncabezado,
  237. ],
  238. "E{$startRowTotales}" => [
  239. "valor" => "Saldo total",
  240. "estilo" => $estiloEncabezado,
  241. ],
  242. "F{$startRowTotales}" => [
  243. "valor" => "Ejercido obra",
  244. "estilo" => $estiloEncabezado,
  245. ],
  246. "G{$startRowTotales}" => [
  247. "valor" => "Por ejercer",
  248. "estilo" => $estiloEncabezado,
  249. ],
  250. ];
  251. $this->agregarRenglones($encabezadoTablaTotales);
  252. $datos = $startRowTotales + 1;
  253. $renglones = [
  254. "A{$datos}" => [
  255. "valor" => $totalGasto,
  256. "estilo" => $estiloCeldaIzquierda,
  257. "formato" => "$#,##0.00",
  258. "estiloCondicional" => $estiloCondicional
  259. ],
  260. "B{$datos}" => [
  261. "valor" => $totalPago,
  262. "estilo" => $estiloCeldaIzquierda,
  263. "formato" => "$#,##0.00",
  264. "estiloCondicional" => $estiloCondicional,
  265. ],
  266. "C{$datos}" => [
  267. "valor" => $totalNomina,
  268. "estilo" => $estiloCeldaIzquierda,
  269. "formato" => "$#,##0.00",
  270. "estiloCondicional" => $estiloCondicional,
  271. ],
  272. "D{$datos}" => [
  273. "valor" => $totalRubro,
  274. "estilo" => $estiloCeldaIzquierda,
  275. "formato" => "$#,##0.00",
  276. "estiloCondicional" => $estiloCondicional,
  277. ],
  278. "E{$datos}" => [
  279. "valor" => $saldo,
  280. "estilo" => $estiloCeldaIzquierda,
  281. "formato" => "$#,##0.00",
  282. "estiloCondicional" => $estiloCondicional,
  283. ],
  284. "F{$datos}" => [
  285. "valor" => $ejercidoObra,
  286. "estilo" => $estiloCeldaIzquierda,
  287. "formato" => "#,##0.00%",
  288. "estiloCondicional" => $estiloCondicional,
  289. ],
  290. "G{$datos}" => [
  291. "valor" => $ejercer,
  292. "estilo" => $estiloCeldaIzquierda,
  293. "formato" => "$#,##0.00",
  294. "estiloCondicional" => $estiloCondicional,
  295. ],
  296. ];
  297. $this->agregarRenglones($renglones);
  298. $anchoColumnas = [
  299. "A" => ["ancho" => 20],
  300. "B" => ["ancho" => 20],
  301. "C" => ["ancho" => 20],
  302. "D" => ["ancho" => 20],
  303. "E" => ["ancho" => 20],
  304. "F" => ["ancho" => 20],
  305. "G" => ["ancho" => 20],
  306. ];
  307. $this->anchoColumnas($anchoColumnas);
  308. //Gastos
  309. $this->nuevaHoja(1, 'Gasto');
  310. $gasto = Gasto::find()
  311. ->joinWith('conceptosObra')
  312. ->andWhere(['{{Gasto}}.[[eliminado]]' => null])->andWhere(['{{Gasto}}.[[idObra]]' => $idObra]);
  313. $gasto->orderBy(['fechaCompra' => SORT_DESC]);
  314. $this->encabezadoHoja($this->logo($logo, 'A1'));
  315. $encabezadoTabla = [
  316. "A6" => [
  317. "valor" => "Concepto Obra",
  318. "estilo" => $estiloEncabezado
  319. ],
  320. "B6" => [
  321. "valor" => "Cantidad ",
  322. "estilo" => $estiloEncabezado
  323. ],
  324. "C6" => [
  325. "valor" => "Fecha Compra",
  326. "estilo" => $estiloEncabezado
  327. ],
  328. "D6" => [
  329. "valor" => "Descripción",
  330. "estilo" => $estiloEncabezado
  331. ]
  332. ];
  333. $r = 7;
  334. $this->agregarRenglones($encabezadoTabla);
  335. $estiloCeldaIzquierda = array_merge(self::$bordes, self::$celdaFuente12);
  336. $estiloCondicional = $this->estiloCondicional();
  337. foreach ($gasto->each() as $obraGasto) {
  338. $fecha = (new DateTime($obraGasto->fechaCompra))->format('d-m-Y');
  339. $gasto = $obraGasto->conceptosObra;
  340. $renglones = [
  341. "A{$r}" => [
  342. "valor" => $gasto->concepto,
  343. "estilo" => $estiloCeldaIzquierda
  344. ],
  345. "B{$r}" => [
  346. "valor" => $obraGasto->cantidad,
  347. "estilo" => $estiloCeldaIzquierda,
  348. "formato" => "$#,##0.00",
  349. "estiloCondicional" => $estiloCondicional
  350. ],
  351. "C{$r}" => [
  352. "valor" => $fecha,
  353. "estilo" => $estiloCeldaIzquierda
  354. ],
  355. "D{$r}" => [
  356. "valor" => $obraGasto->descripcion,
  357. "estilo" => $estiloCeldaIzquierda
  358. ]
  359. ];
  360. $this->agregarRenglones($renglones);
  361. $r += 1;
  362. }
  363. $anchoColumnas = [
  364. "A" => ["ancho" => 20],
  365. "B" => ["ancho" => 20],
  366. "C" => ["ancho" => 20],
  367. "D" => ["ancho" => 20],
  368. ];
  369. $this->anchoColumnas($anchoColumnas);
  370. //Pagos
  371. $this->nuevaHoja(2, 'Pago');
  372. $pago = Pago::find()
  373. ->joinWith('conceptosObra')
  374. ->andWhere(['{{Pago}}.[[eliminado]]' => null])->andWhere(['{{Pago}}.[[idObra]]' => $idObra]);
  375. $pago->orderBy(['fechaPago' => SORT_DESC]);
  376. $this->encabezadoHoja($this->logo($logo, 'A1'));
  377. $encabezadoTabla = [
  378. "A6" => [
  379. "valor" => "Concepto Obra",
  380. "estilo" => $estiloEncabezado
  381. ],
  382. "B6" => [
  383. "valor" => "Cantidad ",
  384. "estilo" => $estiloEncabezado
  385. ],
  386. "C6" => [
  387. "valor" => "Fecha Pago",
  388. "estilo" => $estiloEncabezado
  389. ],
  390. "D6" => [
  391. "valor" => "Descripción",
  392. "estilo" => $estiloEncabezado
  393. ]
  394. ];
  395. $r = 7;
  396. $this->agregarRenglones($encabezadoTabla);
  397. $estiloCeldaIzquierda = array_merge(self::$bordes, self::$celdaFuente12);
  398. $estiloCondicional = $this->estiloCondicional();
  399. foreach ($pago->each() as $obraPago) {
  400. $fecha = (new DateTime($obraPago->fechaPago))->format('d-m-Y');
  401. $Pago = $obraPago->conceptosObra;
  402. $renglones = [
  403. "A{$r}" => [
  404. "valor" => $Pago->concepto,
  405. "estilo" => $estiloCeldaIzquierda
  406. ],
  407. "B{$r}" => [
  408. "valor" => $obraPago->cantidad,
  409. "estilo" => $estiloCeldaIzquierda,
  410. "formato" => "$#,##0.00",
  411. "estiloCondicional" => $estiloCondicional
  412. ],
  413. "C{$r}" => [
  414. "valor" => $fecha,
  415. "estilo" => $estiloCeldaIzquierda
  416. ],
  417. "D{$r}" => [
  418. "valor" => $obraPago->descripcion,
  419. "estilo" => $estiloCeldaIzquierda
  420. ]
  421. ];
  422. $this->agregarRenglones($renglones);
  423. $r += 1;
  424. }
  425. $anchoColumnas = [
  426. "A" => ["ancho" => 20],
  427. "B" => ["ancho" => 20],
  428. "C" => ["ancho" => 20],
  429. "D" => ["ancho" => 20],
  430. ];
  431. $this->anchoColumnas($anchoColumnas);
  432. $this->nuevaHoja(3, 'Nomina');
  433. $nomina = Nomina::find()
  434. ->joinWith('empleado')
  435. ->andWhere(['{{Nomina}}.[[eliminado]]' => null])->andWhere(['{{Nomina}}.[[idObra]]' => $idObra]);
  436. $nomina->orderBy(['fechaInicio' => SORT_DESC]);
  437. $this->encabezadoHoja($this->logo($logo, 'A1'));
  438. $encabezadoTabla = [
  439. "A6" => [
  440. "valor" => "Concepto Obra",
  441. "estilo" => $estiloEncabezado
  442. ],
  443. "B6" => [
  444. "valor" => "Cantidad ",
  445. "estilo" => $estiloEncabezado
  446. ],
  447. "C6" => [
  448. "valor" => "Fecha Inicio",
  449. "estilo" => $estiloEncabezado
  450. ],
  451. "D6" => [
  452. "valor" => "Fecha Fin",
  453. "estilo" => $estiloEncabezado
  454. ]
  455. ];
  456. $r = 7;
  457. $this->agregarRenglones($encabezadoTabla);
  458. $estiloCeldaIzquierda = array_merge(self::$bordes, self::$celdaFuente12);
  459. $estiloCondicional = $this->estiloCondicional();
  460. foreach ($nomina->each() as $obraNomina) {
  461. $fechaInicio = (new DateTime($obraNomina->fechaInicio))->format('d-m-Y');
  462. $fechaFin = (new DateTime($obraNomina->fechaFin))->format('d-m-Y');
  463. $empleado = $obraNomina->empleado;
  464. $renglones = [
  465. "A{$r}" => [
  466. "valor" => $empleado->nombre,
  467. "estilo" => $estiloCeldaIzquierda
  468. ],
  469. "B{$r}" => [
  470. "valor" => $obraNomina->montoPagado,
  471. "estilo" => $estiloCeldaIzquierda,
  472. "formato" => "$#,##0.00",
  473. "estiloCondicional" => $estiloCondicional
  474. ],
  475. "C{$r}" => [
  476. "valor" => $fechaInicio,
  477. "estilo" => $estiloCeldaIzquierda
  478. ],
  479. "D{$r}" => [
  480. "valor" => $fechaFin,
  481. "estilo" => $estiloCeldaIzquierda
  482. ]
  483. ];
  484. $this->agregarRenglones($renglones);
  485. $r += 1;
  486. }
  487. $anchoColumnas = [
  488. "A" => ["ancho" => 20],
  489. "B" => ["ancho" => 20],
  490. "C" => ["ancho" => 20],
  491. "D" => ["ancho" => 20],
  492. ];
  493. $this->anchoColumnas($anchoColumnas);
  494. $this->nuevaHoja(4, 'Rubro');
  495. $rubro = ObraRubro::find()
  496. ->joinWith('conceptoObra')
  497. ->andWhere(['{{ObraRubro}}.[[eliminado]]' => null])->andWhere(['{{ObraRubro}}.[[idObra]]' => $idObra]);
  498. $rubro->orderBy(['creado' => SORT_DESC]);
  499. $this->encabezadoHoja($this->logo($logo, 'A1'));
  500. $encabezadoTabla = [
  501. "A6" => [
  502. "valor" => "Concepto Obra",
  503. "estilo" => $estiloEncabezado
  504. ],
  505. "B6" => [
  506. "valor" => "Cantidad ",
  507. "estilo" => $estiloEncabezado
  508. ],
  509. "C6" => [
  510. "valor" => "Fecha Compra",
  511. "estilo" => $estiloEncabezado
  512. ],
  513. "D6" => [
  514. "valor" => "Descripción",
  515. "estilo" => $estiloEncabezado
  516. ]
  517. ];
  518. $r = 7;
  519. $this->agregarRenglones($encabezadoTabla);
  520. $estiloCeldaIzquierda = array_merge(self::$bordes, self::$celdaFuente12);
  521. $estiloCondicional = $this->estiloCondicional();
  522. foreach ($rubro->each() as $obraRubro) {
  523. $fecha = (new DateTime($obraRubro->fechaCompra))->format('d-m-Y');
  524. $rubro = $obraRubro->conceptoObra;
  525. $renglones = [
  526. "A{$r}" => [
  527. "valor" => $rubro->concepto,
  528. "estilo" => $estiloCeldaIzquierda
  529. ],
  530. "B{$r}" => [
  531. "valor" => $obraRubro->cantidad,
  532. "estilo" => $estiloCeldaIzquierda,
  533. "formato" => "$#,##0.00",
  534. "estiloCondicional" => $estiloCondicional
  535. ],
  536. "C{$r}" => [
  537. "valor" => $fecha,
  538. "estilo" => $estiloCeldaIzquierda
  539. ],
  540. "D{$r}" => [
  541. "valor" => $obraRubro->descripcion,
  542. "estilo" => $estiloCeldaIzquierda
  543. ]
  544. ];
  545. $this->agregarRenglones($renglones);
  546. $r += 1;
  547. }
  548. $anchoColumnas = [
  549. "A" => ["ancho" => 20],
  550. "B" => ["ancho" => 20],
  551. "C" => ["ancho" => 20],
  552. "D" => ["ancho" => 20],
  553. ];
  554. $this->anchoColumnas($anchoColumnas);
  555. $documento = $this->obtenerHojaDeCalculo();
  556. $this->crear($documento, "Obra_" . date("YmdHis"), self::TIPO_EXCEL);
  557. \Yii::$app->end();
  558. }
  559. }