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 '
No MercadoPago data available
'; } $message = "
"; // 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 .= "
Success: Success URL
"; $message .= "
Pending: Pending URL
"; $message .= "
Failure: Failure URL
"; } // Init point (enlace de pago) if (isset($preference['init_point'])) { $message .= "
MercadoPago Payment Link >>
"; } // Sandbox init point if (isset($preference['sandbox_init_point'])) { $message .= "
Sandbox Payment Link >>
"; } } // 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; } }