public function actionEgreso($diferido = false) { // chequea que se haya elegido un porton, sino es asi se redirecciona a la eleccion de porton if (!\Yii::$app->session->get('porton')) { // se setea returnUrl para que funcione el goBack en portones/elegir (parecido a lo que hace login()) //Yii::$app->user->setReturnUrl(Yii::$app->urlManager->createUrl(['accesos/egreso'])); return $this->redirect(['portones/elegir', 'backUrl' => 'accesos/egreso']); } // inicializa modelo $model = new Accesos(); // si viene por POST, es decir, si se intenta grabar if (isset($_POST['Accesos'])) { $model->attributes = $_POST['Accesos']; // recupera de la sesion los 2 grupos $sessPersonas = \Yii::$app->session->get('egrpersonas'); $sessVehiculo = \Yii::$app->session->get('egrvehiculos'); // se verifica que estén los 2 grupos cargados $rechaza = false; if (!$sessPersonas) { \Yii::$app->session->addFlash('danger', 'Debe especificar al menos una persona'); $rechaza = true; } if (!$sessVehiculo) { \Yii::$app->session->addFlash('danger', 'Debe especificar un vehiculo'); $rechaza = true; } if ($diferido) { if (!AccesosAutmanual::periodoManualActivo($model->egr_hora)) { \Yii::$app->session->addFlash('danger', 'Fecha/hora no está dentro de un periodo habilitado'); $rechaza = true; } } if ($rechaza) { // actualiza los 2 grupos en variables que se van a pasar al render // si se modifica, modificar tambien antes del render del final de la funcion $listas = $this->refreshListas(); return $this->render('egreso', ['model' => $model, 'tmpListas' => $listas, 'diferido' => $diferido]); } // Para que coincidan las fechas y horas en todos los registros se utilizan variables auxiliares antes de grabar if ($diferido) { $fecAux = $model->egr_hora; $horAux = $model->egr_hora; } else { $fecAux = date("Y-m-d"); $horAux = new Expression('CURRENT_TIMESTAMP'); } // Comienza Transaccion $transaction = Yii::$app->db->beginTransaction(); try { $controlEgreso = $model->control; foreach ($sessPersonas as $id_persona) { $model = Accesos::find()->where(['id_persona' => $id_persona, 'egr_fecha' => null])->orderBy(['id' => SORT_DESC])->one(); if (!empty($model)) { foreach ($sessVehiculo as $model->egr_id_vehiculo) { // Aunque deberia haber un solo vehiculo // Para que save() no funcione como update sino como insert, // se debe resetear el id y setear isNewRecord como true //$model->id = null; $model->egr_fecha = $fecAux; $model->egr_hora = $horAux; $model->egr_id_porton = \Yii::$app->session->get('porton'); $model->egr_id_user = \Yii::$app->user->identity->id; if ($controlEgreso) { if ($model->control) { $model->control = $model->control . '.- ' . $controlEgreso; } else { $model->control = $controlEgreso; } } $model->save(); } } else { $model = new Accesos(); foreach ($sessVehiculo as $model->egr_id_vehiculo) { // Aunque deberia haber un solo vehiculo // Para que save() no funcione como update sino como insert, // se debe resetear el id y setear isNewRecord como true $model->id = null; $model->id_persona = $id_persona; $model->ing_id_vehiculo = $model->egr_id_vehiculo; $model->ing_fecha = $fecAux; $model->ing_hora = $horAux; $model->egr_fecha = $fecAux; $model->egr_hora = $horAux; $model->egr_id_porton = \Yii::$app->session->get('porton'); $model->ing_id_porton = $model->egr_id_porton; $model->egr_id_user = \Yii::$app->user->identity->id; $model->ing_id_user = \Yii::$app->user->identity->id; $model->id_concepto = 0; $model->motivo = 'Sin ingreso'; $model->isNewRecord = true; $model->save(); } } //foreach vehiculos } //foreach personas // Todo bien $transaction->commit(); \Yii::$app->session->addFlash('success', 'Egreso grabado correctamente'); // limpia todo \Yii::$app->session->remove('egrpersonas'); \Yii::$app->session->remove('egrvehiculos'); return $this->redirect(['egreso']); } catch (\Exception $e) { $transaction->rollBack(); Yii::$app->session->addFlash('danger', 'Hubo un error en la grabación'); throw $e; } // try..catch } // if POST // actualiza los 2 grupos en un array que se va a pasar al render // si se modifica, modificar tambien dentro del if (rechaza) $listas = $this->refreshListas(); return $this->render('egreso', ['model' => $model, 'tmpListas' => $listas, 'diferido' => $diferido]); }