Last active
April 26, 2016 00:27
-
-
Save Faryshta/298fe7c73005c904a5fd3b59107f1c5f to your computer and use it in GitHub Desktop.
Tarea de Transacciones
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Editar el siguiente controlador para que siga el un flujo ACID usando | |
* transactions. | |
* | |
* Puedes crear una transacción usando. | |
* | |
* ```php | |
* use yii\db\Transaction; | |
* | |
* $transaction = Yii::$app->db->beginTransaction(Transaction::SERIALIZE); | |
* ``` | |
* | |
* No es necesario que pueda ejecutarse el archivo, basta con que siga el flujo | |
* estudiado en clase. | |
* | |
* > Tip: valide los modelos usando `validate()` y luego guardelos usando | |
* > el metodo `save(false)` | |
* | |
* > Tip: Se provee una funcion interna `findCredito()` que evalua permisos. | |
*/ | |
use Yii; | |
use common\models\Credito; | |
use common\models\CreditoPago; | |
use common\models\CreditoArchivo; | |
/** | |
* @author Angel (Faryshta) Guevara <aguevara@tecnocen.com> | |
*/ | |
class CreditoController extends \yii\web\Controller | |
{ | |
/** | |
* Crea un credito y los archivos relacionados | |
* devuelve false en caso de error | |
* @param float $monto cantidad solicitada. | |
* @return boolean si la operación es exitosa | |
*/ | |
public function actionCreate($monto) | |
{ | |
$user_id = Yii::$app->user->id; | |
// crear credito | |
$credito = new Credito(); | |
$credito->user_id = Yii::$app->user->id; | |
$credito->monto = $monto; | |
$credito->estatus = 'revision'; | |
$credito->save(); | |
// buscar si el usuario tiene creditos en estatus distinto de 'pagado'. | |
if (Credito::find()->where(['user_id' => $user_id]) | |
->andWhere(['!=', 'estatus', 'pagado']) | |
->exist() | |
) { | |
$credito->delete(); | |
return false; | |
} | |
// guardar archivos | |
foreach (Yii::$app->post('CreditoArchivo') as $data) { | |
$creditoArchivo = new CreditoArchivo(); | |
$creditoArchivo->load($data); | |
$creditoArchivo->credito_id = $credito->id; | |
if (!$creditoArchivo->save()) { | |
return false; | |
} | |
} | |
return true; | |
} | |
/** | |
* Crea un pago para un credito siempre y cuando el monto del credito sea | |
* mayor al monto de adeudo y cambia el estatus a 'pagado' si el credito | |
* fue completamente pagado. | |
* | |
* @param int $id | |
* @param float $monto | |
* @return boolean si la operación es exitosa | |
*/ | |
public function actionCreditoPago($id, $monto) | |
{ | |
// crear pago | |
$creditoPago = new CreditoPago([ | |
'credito_id' => $id, | |
'monto' => $monto, | |
]); | |
$creditoPago->save(); | |
$credito = $this->findCredito($id); | |
if ($credito->monto < $monto) { | |
// mensaje de error | |
return false; | |
} elseif ($credito->estatus != 'adedudo') { | |
// mensaje de error | |
return false; | |
} else { | |
// actualizar monto | |
$credito->monto = $credito->monto - $monto; | |
$credito->save(); | |
if ($credito->monto = 0) { | |
$credtio->estatus = 'pagado'; | |
$credito->save(); | |
} | |
return true; | |
} | |
} | |
/** | |
* Borra un credito y sus archivos siempre y cuando este en estatus | |
* pendiente y no tenga pagos asociados. | |
* | |
* @param int $id | |
*/ | |
public function actionDelete($id) | |
{ | |
// borrar archivos relacionados | |
foreach (CreditoArchivos::findAll(['credito_id' => $id]) as $archivo) { | |
$archivo->delete(); | |
} | |
// revisar que no tenga pagos | |
if (CreditoPago::find()->where(['credito_id' => $id])->exist()) { | |
// mensaje error | |
return false; | |
} | |
$credito = $this->findCredito($id); | |
if ($credito->estatus != 'pendiente') { | |
// mensaje error | |
return false; | |
} | |
return $credito->delete(); | |
} | |
/** | |
* Devuelve un credito dependiendo del $id y valida que el credito este | |
* asociado al usuario logueado | |
* @param int $id | |
* @return Credito | |
* @internal no editar | |
*/ | |
protected function findCredito($id) | |
{ | |
if (null === ($credito = Credito::findOne($id))) { | |
if ($credito->user_id == Yii::$app->user->id) { | |
return $credito; | |
} | |
throw new ForbiddenHttpException( | |
'No tiene permisos para este credito.' | |
); | |
} | |
throw new NotFoundHttpException('Credito no encontrado.'); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment