Skip to content

Instantly share code, notes, and snippets.

@Faryshta
Last active April 26, 2016 00:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Faryshta/298fe7c73005c904a5fd3b59107f1c5f to your computer and use it in GitHub Desktop.
Save Faryshta/298fe7c73005c904a5fd3b59107f1c5f to your computer and use it in GitHub Desktop.
Tarea de Transacciones
<?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