ObraController.php 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. <?php
  2. namespace v1\controllers;
  3. use app\models\ObraEmpleado;
  4. use app\models\ObraHerramienta;
  5. use common\data\Respuesta;
  6. use common\rest\AuthController;
  7. use Exception;
  8. use Mpdf\Tag\Select;
  9. use Yii;
  10. use yii\db\Expression;
  11. use yii\db\Query;
  12. class ObraController extends AuthController {
  13. public $modelClass = "v1\models\Obra";
  14. public function actionIndex() {
  15. $id = trim($this->req->get("id", ""));
  16. $buscar = trim($this->req->get("q", ""));
  17. $inicio = trim($this->req->get("inicio", ""));
  18. $fin = trim($this->req->get("fin", ""));
  19. $query = $this->queryInicial;
  20. if ($id!=="") {
  21. $query->andWhere(["id" => $id]);
  22. }
  23. if ($inicio !== "" && $fin !== "") {
  24. $query->andWhere([">=", "[[fechaInicio]]", $inicio])
  25. ->andWhere(["<=", "[[fechaFinal]]", $fin]);
  26. }
  27. if ($buscar) {
  28. $query->andWhere([
  29. "OR",
  30. ["ilike", "nombre", $buscar]
  31. ]);
  32. }
  33. return new Respuesta($query, $this->limite, $this->pagina, $this->ordenar);
  34. }
  35. public function actionGuardar() {
  36. $id = trim($this->req->getBodyParam("id", ""));
  37. $herramientas = $this->req->getBodyParam("herramientas", []);
  38. $empleados = $this->req->getBodyParam("empleados", []);
  39. $modelo = null;
  40. $transaccion = \Yii::$app->db->beginTransaction();
  41. try {
  42. if ($id !== "") {
  43. $modelo = $this->modelClass::findOne($id);
  44. }
  45. if ($modelo === null) {
  46. $modelo = new $this->modelClass();
  47. $modelo->uuid();
  48. $modelo->creado = new Expression('now()');
  49. } else {
  50. $modelo->modificado = new Expression('now()');
  51. }
  52. $modelo->load($this->req->getBodyParams(), '');
  53. $clave = $modelo->clave;
  54. $existeClave = $this->modelClass::find()->andwhere(['clave' => $clave])->andWhere(['<>', 'id', $id])->andWhere(['eliminado'=>null])->exists();
  55. if ($existeClave) {
  56. return (new Respuesta())
  57. ->esError()
  58. ->mensaje("La clave '$clave' ya existe. Por favor, ingresa una clave diferente.");
  59. }
  60. $modelo->load($this->req->getBodyParams(), '');
  61. if (!$modelo->save()) {
  62. return (new Respuesta($modelo))
  63. ->mensaje("Hubo un problema al guardar la obra");
  64. }
  65. ObraHerramienta::deleteAll(['idObra' => $modelo->id]);
  66. foreach ($herramientas as $herramienta) {
  67. if (isset($herramienta['id']) && isset($herramienta['cantidad'])) {
  68. $obraHerramienta = new ObraHerramienta();
  69. $obraHerramienta->uuid();
  70. $obraHerramienta->idHerramienta = $herramienta['id'];
  71. $obraHerramienta->idObra = $modelo->id;
  72. $obraHerramienta->cantidad = $herramienta['cantidad'];
  73. if (!$obraHerramienta->save()) {
  74. $transaccion->rollBack();
  75. return (new Respuesta($obraHerramienta))
  76. ->mensaje("Hubo un problema al guardar la Herramienta con ID {$herramienta['id']}");
  77. }
  78. } else {
  79. Yii::error('Faltan datos en el array de herramientas', ['item' => $herramienta]);
  80. }
  81. }
  82. $transaccion->commit();
  83. $modelo->refresh();
  84. return (new Respuesta($modelo))
  85. ->mensaje("Obra ha sido guardado de manera exitosa");
  86. } catch (\Exception $e) {
  87. $transaccion->rollBack();
  88. return (new Respuesta($modelo))
  89. ->esError()
  90. ->mensaje($e->getMessage());
  91. }
  92. }
  93. public function actionEliminar() {
  94. $id = trim($this->req->getBodyParam("id", ""));
  95. $modelo = null;
  96. if ($id !== "") {
  97. $modelo = $this->modelClass::findOne(["id" => $id]);
  98. }
  99. if ($modelo === null) {
  100. return (new Respuesta())
  101. ->esError()
  102. ->mensaje("Obra no encontrada");
  103. }
  104. $modelo->eliminado = new Expression('now()');
  105. if (!$modelo->save()) {
  106. return (new Respuesta($modelo))
  107. ->mensaje("No se pudo eliminar la obra");
  108. }
  109. return (new Respuesta())
  110. ->mensaje("Obra eliminada");
  111. }
  112. public function actionTotalGasto($id){
  113. $TotalGasto=0;
  114. $q=(new Query())->select(['{{Gasto}}.[[cantidad]]'])
  115. ->from('Gasto')
  116. ->innerJoin('Obra', '{{Obra}}.[[id]] = {{Gasto}}.[[idObra]]')
  117. ->andWhere(['{{Gasto}}.[[idObra]]' => $id])
  118. ->andWhere(['{{Gasto}}.[[eliminado]]'=>null])
  119. ->column();
  120. foreach($q as $cantidad){
  121. $TotalGasto=$TotalGasto+$cantidad;
  122. }
  123. return $TotalGasto;
  124. }
  125. public function actionTotalPago($id){
  126. $TotalPago= 0;
  127. $q=(new Query())->select(['{{Pago}}.[[cantidad]]'])
  128. ->from('Pago')
  129. ->innerJoin('Obra', '{{Obra}}.[[id]] = {{Pago}}.[[idObra]]')
  130. ->andWhere(['{{Pago}}.[[idObra]]' => $id])
  131. ->andWhere(['{{Pago}}.[[eliminado]]'=>null])
  132. ->column();
  133. foreach($q as $cantidad){
  134. $TotalPago=$TotalPago+$cantidad;
  135. }
  136. return $TotalPago;
  137. }
  138. public function actionTotalNomina($id){
  139. try {
  140. $TotalNomina= 0;
  141. $NominaDescuento=0;
  142. $q=(new Query())->select(['{{Nomina}}.[[montoPagado]]','{{Nomina}}.[[descuento]]'])
  143. ->from('Nomina')
  144. ->innerJoin('Obra', '{{Obra}}.[[id]] = {{Nomina}}.[[idObra]]')
  145. ->andWhere(['{{Nomina}}.[[idObra]]' => $id])
  146. ->andWhere(['{{Nomina}}.[[eliminado]]'=>null])
  147. ->all();
  148. foreach($q as $cantidad){
  149. $montoPagado= $cantidad['montoPagado'];
  150. $descuento= $cantidad['descuento'];
  151. $NominaDescuento= $montoPagado-($montoPagado*($descuento/100));
  152. $TotalNomina=$TotalNomina+$NominaDescuento;
  153. }
  154. return $TotalNomina;
  155. } catch (\Exception $e) {
  156. Yii::error("Error en actionTotalNomina: " . $e->getMessage());
  157. return ['error' => 'Error al calcular la nómina. Verifique el log para más detalles.'];
  158. }
  159. }
  160. public function actionTotalRubro($id){
  161. try {
  162. $TotalRubro= 0;
  163. $q=(new Query())->select(['{{ObraRubro}}.[[cantidad]]', '{{ObraRubro}}.[[descuento]]'])
  164. ->from('ObraRubro')
  165. ->rightJoin('Obra', '{{Obra}}.[[id]] = {{ObraRubro}}.[[idObra]]')
  166. ->andWhere(['{{ObraRubro}}.[[idObra]]' => $id])
  167. ->andWhere(['{{ObraRubro}}.[[eliminado]]'=>null])
  168. ->all();
  169. foreach ($q as $rubro) {
  170. $cantidad = $rubro['cantidad'];
  171. $descuento = $rubro['descuento'] ?? 0;
  172. $cantidadConDescuento = $cantidad * (1 - $descuento / 100);
  173. // Suma al total
  174. $TotalRubro += $cantidadConDescuento;
  175. }
  176. return $TotalRubro;
  177. } catch (\Exception $e) {
  178. Yii::error("Error en actionRubro: " . $e->getMessage());
  179. return ['error' => 'Error al calcular el Rubro. Verifique el log para más detalles.'];
  180. }
  181. }
  182. public function actionSaldo($gasto, $nomina, $pago){
  183. try{
  184. $TotalSaldo=($gasto+$nomina)-$pago;
  185. return $TotalSaldo;
  186. }catch(\Exception $e){
  187. Yii::error("Error en actionsaldo: " . $e->getMessage());
  188. return ['error' => 'Error al calcular el Saldo. Verifique el log para más detalles.'];
  189. }
  190. }
  191. public function actionEjercidoObra($ejercer, $rubro){
  192. try{
  193. if (($ejercer - $rubro) != 0) {
  194. $TotalEjercido = ($rubro / ($ejercer - $rubro)) * 100;
  195. $TotalEjercido = round($TotalEjercido, 2);
  196. } else {
  197. $TotalEjercido = 0; // Evita dividir por cero
  198. }
  199. return $TotalEjercido;
  200. }catch(\Exception $e){
  201. Yii::error("Error en actionEjercidoObra: " . $e->getMessage());
  202. return ['error' => 'Error al calcular el Ejercido. Verifique el log para más detalles.'];
  203. }
  204. }
  205. public function actionEjercer($gasto, $nomina, $rubro){
  206. try{
  207. $TotalEjercer=($gasto+$nomina)-$rubro;
  208. return $TotalEjercer;
  209. }catch(\Exception $e){
  210. Yii::error("Error en actionEjercidoObra: " . $e->getMessage());
  211. return ['error' => 'Error al calcular el Ejercido. Verifique el log para más detalles.'];
  212. }
  213. }
  214. }