status !== PaymentStatus::PENDING) {
return;
}
try {
// Obtener el booking para acceder al restaurant_id
$booking = $this->booking;
if (!$booking) {
return;
}
// Crear instancia del gateway MercadoPago
if (!class_exists('\Alexr\Payments\GatewayMercadopago')) {
return;
}
$gateway = new \Alexr\Payments\GatewayMercadopago($booking->restaurant_id);
// Obtener el payment_id desde settings
$payment_id = null;
// Prioridad 1: Buscar en settings['mercadopago_result']['payment_id']
if (isset($this->settings['mercadopago_result']['payment_id'])) {
$payment_id = $this->settings['mercadopago_result']['payment_id'];
}
if (!$payment_id) {
error_log("MercadoPago payment check: No payment ID found for payment {$this->id}");
return;
}
// Consultar el estado actual en MercadoPago
$mercadopago_payment = $gateway->get_pago($payment_id);
if (!$mercadopago_payment) {
error_log("MercadoPago payment check: Could not retrieve payment {$payment_id} from MercadoPago API");
return;
}
// Convertir a array para trabajar más fácilmente
$mp_data = json_decode(json_encode($mercadopago_payment), true);
$previous_status = $this->status;
$payment_updated = false;
$new_status_text = '';
// Verificar el estado del pago según MercadoPago
if (isset($mp_data['status'])) {
switch (strtolower($mp_data['status'])) {
case 'approved':
error_log("MercadoPago payment status check: Payment {$this->id} is now APPROVED, updating status");
$this->status = PaymentStatus::SUCCEEDED;
// Actualizar el booking
$booking->status = $booking->paymentStatus;
$booking->save();
// Enviar notificaciones
$booking->sendBookingEmail();
$booking->sendSmsNotification();
$booking->sendWhatsappNotification();
$payment_updated = true;
$new_status_text = 'APPROVED';
break;
case 'pending':
case 'in_process':
// Mantener como pending
$this->status = PaymentStatus::PENDING;
$booking->status = BookingStatus::PENDING_PAYMENT;
$booking->save();
$payment_updated = true;
$new_status_text = strtoupper($mp_data['status']);
break;
case 'rejected':
case 'cancelled':
error_log("MercadoPago payment status check: Payment {$this->id} is {$mp_data['status']}, updating status");
$this->status = PaymentStatus::CANCELLED;
$payment_updated = true;
$new_status_text = strtoupper($mp_data['status']);
break;
case 'refunded':
case 'charged_back':
error_log("MercadoPago payment status check: Payment {$this->id} is {$mp_data['status']}, updating status");
$this->status = PaymentStatus::FAILED;
$payment_updated = true;
$new_status_text = strtoupper($mp_data['status']);
break;
}
}
if ($payment_updated) {
// Actualizar settings con la información actualizada
$settings = $this->settings ?? [];
// Actualizar los datos del payment
$settings['mercadopago_payment'] = $mp_data;
// Agregar información de la verificación
$settings['status_check'] = [
'checked_at' => date('Y-m-d H:i:s'),
'previous_status' => $previous_status,
'new_status' => $this->status,
'mercadopago_status' => $mp_data['status'],
'source' => 'manual_check'
];
$this->settings = $settings;
$this->save();
error_log("MercadoPago payment successfully updated: booking {$booking->uuid}, status: {$new_status_text}");
}
} catch (\Exception $e) {
error_log('MercadoPago payment status check error: ' . $e->getMessage());
}
}
/**
* Obtiene los datos de MercadoPago formateados para mostrar
*/
public function getMercadopagoDataFormattedAttribute()
{
// Verificar estado del pago antes de mostrar los datos
$this->checkMercadopagoPaymentStatus();
$settings = $this->settings;
if (!isset($settings['mercadopago'])) {
return '
";
// Mostrar mensaje si se actualizó el estado
if (isset($settings['status_check'])) {
$statusCheck = $settings['status_check'];
$message .= "
";
$message .= "Status Updated: Payment status was automatically updated on {$statusCheck['checked_at']} from {$statusCheck['previous_status']} to {$statusCheck['new_status']} (MercadoPago: {$statusCheck['mercadopago_status']})";
$message .= "
";
}
// Datos del payment actualizado desde API si existe
if (isset($settings['mercadopago_payment'])) {
$payment = $settings['mercadopago_payment'];
$message .= "
MercadoPago Payment Information
";
$message .= "
Payment ID: {$payment['id']}
";
$message .= "
Status: " . strtoupper($payment['status']) . "
";
if (isset($payment['status_detail'])) {
$message .= "
Status Detail: {$payment['status_detail']}
";
}
// Información del monto
if (isset($payment['transaction_amount'])) {
$message .= "
Amount: {$payment['transaction_amount']} {$payment['currency_id']}
";
}
if (isset($payment['net_received_amount'])) {
$message .= "
Net Received: {$payment['net_received_amount']} {$payment['currency_id']}
";
}
// Fechas importantes
if (isset($payment['date_created'])) {
$message .= "
Created: " . date('Y-m-d H:i:s', strtotime($payment['date_created'])) . "
";
}
if (isset($payment['date_approved']) && $payment['date_approved']) {
$message .= "
Approved: " . date('Y-m-d H:i:s', strtotime($payment['date_approved'])) . "
";
}
if (isset($payment['date_last_updated'])) {
$message .= "
Last Updated: " . date('Y-m-d H:i:s', strtotime($payment['date_last_updated'])) . "
";
}
// Información del método de pago
if (isset($payment['payment_method_id'])) {
$message .= "
Payment Method: " . strtoupper($payment['payment_method_id']) . "
";
}
if (isset($payment['payment_type_id'])) {
$message .= "
Payment Type: " . strtoupper($payment['payment_type_id']) . "
";
}
// Información del payer
if (isset($payment['payer'])) {
$payer = $payment['payer'];
$message .= "
Payer Information
";
if (isset($payer['first_name']) && isset($payer['last_name'])) {
$message .= "
Name: {$payer['first_name']} {$payer['last_name']}
";
}
if (isset($payer['email'])) {
$message .= "
Email: {$payer['email']}
";
}
if (isset($payer['id'])) {
$message .= "
Payer ID: {$payer['id']}
";
}
if (isset($payer['identification'])) {
$identification = $payer['identification'];
$message .= "
Identification: {$identification['type']} {$identification['number']}
";
}
}
// Información de fees si está disponible
if (isset($payment['fee_details']) && !empty($payment['fee_details'])) {
$message .= "
Fee Details
";
foreach ($payment['fee_details'] as $fee) {
$message .= "
{$fee['type']}: {$fee['amount']} {$payment['currency_id']}
";
}
}
// Información de la tarjeta si existe
if (isset($payment['card'])) {
$card = $payment['card'];
$message .= "
Card Information
";
if (isset($card['last_four_digits'])) {
$message .= "
Card: **** **** **** {$card['last_four_digits']}
";
}
if (isset($card['cardholder']['name'])) {
$message .= "
Cardholder: {$card['cardholder']['name']}
";
}
}
// Operation type
if (isset($payment['operation_type'])) {
$message .= "
Operation Type: " . strtoupper($payment['operation_type']) . "
";
}
// External reference
if (isset($payment['external_reference'])) {
$message .= "
External Reference: {$payment['external_reference']}
";
}
}
// Datos de la preferencia inicial si no hay payment actualizado
elseif (isset($settings['mercadopago'])) {
$preference = $settings['mercadopago'];
$message .= "
MercadoPago Preference Information
";
if (isset($preference['id'])) {
$message .= "
Preference ID: {$preference['id']}
";
}
if (isset($preference['external_reference'])) {
$message .= "
External Reference: {$preference['external_reference']}
";
}
if (isset($preference['collector_id'])) {
$message .= "
Collector ID: {$preference['collector_id']}
";
}
// Items de la preferencia
if (isset($preference['items']) && !empty($preference['items'])) {
$item = $preference['items'][0];
$message .= "
Item Information
";
$message .= "
Title: {$item['title']}
";
$message .= "
Description: {$item['description']}
";
$message .= "
Quantity: {$item['quantity']}
";
$message .= "
Unit Price: {$item['unit_price']} {$item['currency_id']}
";
}
// Información del payer en la preferencia
if (isset($preference['payer'])) {
$payer = $preference['payer'];
$message .= "
Payer Information
";
$message .= "
Name: {$payer['name']} {$payer['surname']}
";
$message .= "
Email: {$payer['email']}
";
}
// Back URLs
if (isset($preference['back_urls'])) {
$backUrls = $preference['back_urls'];
$message .= "
Redirect URLs
";
$message .= "
";
$message .= "
";
$message .= "
";
}
// Init point (enlace de pago)
if (isset($preference['init_point'])) {
$message .= "
";
}
// Sandbox init point
if (isset($preference['sandbox_init_point'])) {
$message .= "
";
}
}
// Datos del resultado del callback si existen
if (isset($settings['mercadopago_result'])) {
$result = $settings['mercadopago_result'];
$message .= "
Callback Result
";
if (isset($result['alexr_gateway_mercadopago'])) {
$message .= "
Result Status: " . strtoupper($result['alexr_gateway_mercadopago']) . "
";
}
if (isset($result['payment_id'])) {
$message .= "
Payment ID: {$result['payment_id']}
";
}
if (isset($result['preference_id'])) {
$message .= "
Preference ID: {$result['preference_id']}
";
}
if (isset($result['collection_id'])) {
$message .= "
Collection ID: {$result['collection_id']}
";
}
if (isset($result['collection_status'])) {
$message .= "
Collection Status: " . strtoupper($result['collection_status']) . "
";
}
if (isset($result['merchant_order_id'])) {
$message .= "
Merchant Order ID: {$result['merchant_order_id']}
";
}
}
// Información del modelo Payment
$message .= "
Payment Model Information
";
$message .= "
Payment ID: {$this->id}
";
$message .= "
Current Status: " . strtoupper($this->status) . "
";
$message .= "
Amount: " . number_format($this->amount / 100, 2) . " " . strtoupper($this->currency) . "
";
$message .= "
Payment Type: " . strtoupper($this->payment_type) . "
";
// Mostrar datos en crudo en un área colapsable para debugging
$message .= "
Raw Data
";
$message .= "
";
$message .= "Show Raw Settings
";
$message .= "";
$message .= "
" . htmlspecialchars(json_encode($settings, JSON_PRETTY_PRINT)) . "
";
$message .= "
";
$message .= " ";
$message .= "
";
return $message;
}
}