diff --git a/rest/controllers/api/dlocal_controller.go b/rest/controllers/api/dlocal_controller.go index 6468ca2..f355e12 100644 --- a/rest/controllers/api/dlocal_controller.go +++ b/rest/controllers/api/dlocal_controller.go @@ -321,13 +321,13 @@ func DlocalWebhook(c *fiber.Ctx) error { var contratoID uint if _, err := fmt.Sscanf(orderID, "contrato-%d", &contratoID); err == nil && contratoID > 0 { if ok, err := models.MarcarContratoPagado(contratoID); err != nil { - log.Printf("[DLOCAL] Webhook: error marcando contrato %d como pagado: %v", contratoID, err) - } else { - log.Printf("[DLOCAL] Webhook: contrato %d marcado como pagado (nuevo=%v)", contratoID, ok) - if ok { - go services.DispatchSaasPaymentNotification(contratoID, payerEmail, "dlocal", monto, moneda) - go services.EnviarCorreoConfirmacionPago(contratoID, "dlocal") - } + log.Printf("[DLOCAL] Webhook: error marcando contrato %d como pagado: %v", contratoID, err) + } else { + log.Printf("[DLOCAL] Webhook: contrato %d marcado como pagado (nuevo=%v)", contratoID, ok) + if ok { + go services.DispatchSaasPaymentNotification(contratoID, payerEmail, "dlocal", monto, moneda) + go services.EnviarCorreoConfirmacionPago(contratoID, "dlocal") + } } } } diff --git a/rest/controllers/api/pago_controller.go b/rest/controllers/api/pago_controller.go index 1bc4049..8c2303f 100644 --- a/rest/controllers/api/pago_controller.go +++ b/rest/controllers/api/pago_controller.go @@ -81,17 +81,26 @@ func PagoExitosoPage(c *fiber.Ctx) error { if ok, _ := models.MarcarContratoPagado(contratoID); ok { go services.EnviarCorreoConfirmacionPago(contratoID, "bold") } - // Intentar enriquecer con datos del webhook log si ya llegó - go func() { + // Enriquecer callback log: primero webhook log, luego Bold API directa + go func(linkID string) { + // 1. Si el webhook ya llegó, usar esos datos if wLogs, err := models.GetBoldWebhookLogsByRef(ref); err == nil { for _, wl := range wLogs { if wl.PayerEmail != "" || wl.Monto > 0 { models.EnrichBoldCallbackLog(ref, wl.PayerEmail, wl.Monto) - break + return } } } - }() + // 2. Fallback: consultar Bold API directamente para obtener el monto + if linkID != "" { + if boldCfg, err := models.GetBoldConfig(); err == nil { + if _, _, monto, err := services.CheckBoldLinkStatus(boldCfg, linkID); err == nil && monto > 0 { + models.EnrichBoldCallbackLog(ref, "", monto) + } + } + } + }(paymentLink) } estado, fechaPago := verificarPago(ref) return c.Render("pago_exitoso", fiber.Map{ @@ -179,9 +188,11 @@ func verificarPago(ref string) (confirmado bool, fechaPago string) { log.Printf("[PAGO-ESTADO] Bold API error para link %s: %v", contrato.EnlacePagoLinkID, boldApiErr) } else if paid { log.Printf("[PAGO-ESTADO] Contrato %d confirmado via Bold API (payment_id=%s)", contratoID, paymentID) - if ok, _ := models.MarcarContratoPagado(contratoID); ok { - go services.EnviarCorreoConfirmacionPago(contratoID, "bold") - } + if ok, _ := models.MarcarContratoPagado(contratoID); ok { + go services.EnviarCorreoConfirmacionPago(contratoID, "bold") + } + // Enriquecer callback log con monto y email del cliente + go models.EnrichBoldCallbackLog(ref, contrato.Cliente.Email, monto) if paymentID != "" && !models.IsBoldNotificationDuplicate("api-check-"+paymentID) { _ = models.SaveBoldWebhookLog(models.BoldWebhookLog{ NotificationID: "api-check-" + paymentID, @@ -206,9 +217,9 @@ func verificarPago(ref string) (confirmado bool, fechaPago string) { log.Printf("[PAGO-ESTADO] dLocal API error para order_id %s: %v", ref, dlocalApiErr) } else if paid { log.Printf("[PAGO-ESTADO] Contrato %d confirmado via dLocal API (payment_id=%s)", contratoID, paymentID) - if ok, _ := models.MarcarContratoPagado(contratoID); ok { - go services.EnviarCorreoConfirmacionPago(contratoID, "dlocal") - } + if ok, _ := models.MarcarContratoPagado(contratoID); ok { + go services.EnviarCorreoConfirmacionPago(contratoID, "dlocal") + } notifID := "api-check-" + ref if !models.IsDlocalNotificationDuplicate(notifID) { _ = models.SaveDlocalPaymentLog(models.DlocalPaymentLog{