package workers import ( "gestion/db" "gestion/services" "log" "time" ) // StartDynamicPaymentChecker démarre un checker qui recharge le client NowPayments à chaque tick // (permet de prendre en compte les changements de clé API sans redémarrer) func StartDynamicPaymentChecker(database *db.Database, clientFn func() *services.NowPaymentsClient, interval time.Duration) { go func() { ticker := time.NewTicker(interval) defer ticker.Stop() for range ticker.C { np := clientFn() if np == nil { continue } checkPendingCryptoPayments(database, np) } }() log.Printf("[CRON] payment checker dynamique démarré (toutes les %s)", interval) } func checkPendingCryptoPayments(database *db.Database, np *services.NowPaymentsClient) { payments, err := database.GetPendingCryptoPayments() if err != nil { log.Printf("[CRON] erreur récupération paiements en attente: %v", err) return } for _, payment := range payments { status, err := np.GetPaymentStatus(payment.NowPaymentID) if err != nil { log.Printf("[CRON] erreur vérification paiement %d: %v", payment.ID, err) continue } if status.PaymentStatus == payment.Status { continue } log.Printf("[CRON] paiement %d (cmd %d): %s → %s", payment.ID, payment.CommandID, payment.Status, status.PaymentStatus) payAmount, _ := status.PayAmount.Float64() if err := database.UpdateCryptoPaymentStatus(payment.ID, status.PaymentStatus, payAmount); err != nil { log.Printf("[CRON] erreur mise à jour paiement %d: %v", payment.ID, err) continue } switch status.PaymentStatus { case "finished", "confirmed": if err := database.ActivateCryptoCommand(payment.CommandID); err != nil { log.Printf("[CRON] erreur activation commande %d: %v", payment.CommandID, err) } else { log.Printf("[CRON] commande %d activée après paiement crypto", payment.CommandID) } case "failed", "expired": if err := database.CancelCryptoCommand(payment.CommandID); err != nil { log.Printf("[CRON] erreur annulation commande %d: %v", payment.CommandID, err) } else { log.Printf("[CRON] commande %d annulée (paiement %s)", payment.CommandID, status.PaymentStatus) } } } }