Os lo explico con código:
Código PHP:
// Si la petición es correcta y segura
if (strcasecmp($peticion->firma, $firma) == 0) {
if ($peticion->coderror == '000' || ($peticion->coderror == '002' && $peticion->deserror = 'IdTransaccion repetido. (03010000017)' )) {
$bookings = array();
// Update bookings
$transaccionesToBookings = Admin_Model_TransaccionToBooking::getByTransaccionId($peticion->idtransaccion);
foreach ($transaccionesToBookings as $transaccionToBooking) {
$booking = Admin_Model_Booking::getById($transaccionToBooking->bookingId);
$booking->depositIsPaid = 1;
$booking->isConfirmed = 1;
$booking->update();
$bookings[] = $booking;
}
// Update transaccion
$transaccion = Admin_Model_Transaccion::getByTransaccionId($peticion->idtransaccion);
$transaccion->isPaid = 1;
$transaccion->update();
// Send Email Confirmation
$this->_sendBookingEmail($bookings, $booking->getCustomer(), $transaccion);
}
$paymentData = array();
$paymentData['amount'] = $transaccion->amount;
$paymentData['concept'] = $peticion->coderror . ' - ' . $peticion->deserror;
$paymentData['transaction'] = $peticion->idtransaccion;
$paymentData['payment_method'] = 'TPV';
Admin_Model_Payment::createNewPayment($paymentData);
Todo viene a raíz de un problema que tuve hoy. La funcion $this->_sendBookingEmail() falló. Entonces se ejecutaron todas las instrucciones hasta ahí, actualizando la base de datos. Pero al detenerse en esa línea debido al fallo el script no continuó, luego en la base de datos faltaba la información que proporciona la última instrucción:
Admin_Model_Payment::createNewPayment($paymentData )
Esa instrucción añade una nueva fila con los datos del pago.
El código anterior en resumidas cuentas haría:
- comprueba que la petición viene del TPV
- marca las reservas como pagadas
- envía email de confirmación
- añade el resultado de la operación a la base de datos (puede ser una operación fallida o no).