up
This commit is contained in:
@@ -13,11 +13,11 @@ type BoldConfig struct {
|
||||
ApiKeyProd string `json:"api_key_prod" gorm:"column:api_key_prod;type:text"`
|
||||
SecretKeyProd string `json:"secret_key_prod" gorm:"column:secret_key_prod;type:text"`
|
||||
// Claves de prueba / test
|
||||
ApiKeyTest string `json:"api_key_test" gorm:"column:api_key_test;type:text"`
|
||||
ApiKeyTest string `json:"api_key_test" gorm:"column:api_key_test;type:text"`
|
||||
// En modo test la secret key es cadena vacía según la doc oficial
|
||||
SecretKeyTest string `json:"secret_key_test" gorm:"column:secret_key_test;type:text"`
|
||||
// Modo activo: "test" | "production"
|
||||
Modo string `json:"modo" gorm:"column:modo;default:'test'"`
|
||||
Modo string `json:"modo" gorm:"column:modo;default:'test'"`
|
||||
// URL a la que Bold redirige al usuario tras el pago
|
||||
CallbackUrl string `json:"callback_url" gorm:"column:callback_url;type:text"`
|
||||
// Nota interna
|
||||
@@ -186,6 +186,16 @@ func UpdateBoldCallbackEstado(referencia, estado string) {
|
||||
Update("estado", estado)
|
||||
}
|
||||
|
||||
// GetBoldCallbackLogByID carga un intento de pago por su PK.
|
||||
func GetBoldCallbackLogByID(id uint, out *BoldCallbackLog) error {
|
||||
return app.Http.Database.DB.First(out, id).Error
|
||||
}
|
||||
|
||||
// UpdateBoldCallbackEstadoByID actualiza el estado de un intento de pago específico por su PK.
|
||||
func UpdateBoldCallbackEstadoByID(id uint, estado string) error {
|
||||
return app.Http.Database.DB.Model(&BoldCallbackLog{}).Where("id = ?", id).Update("estado", estado).Error
|
||||
}
|
||||
|
||||
// GetBoldCallbackLogsPaginated devuelve los intentos de pago con paginación y filtro.
|
||||
func GetBoldCallbackLogsPaginated(page, limit int, estado string) ([]BoldCallbackLog, int64, error) {
|
||||
var logs []BoldCallbackLog
|
||||
|
||||
@@ -22,8 +22,8 @@ type Contrato struct {
|
||||
// Enlace de pago Bold: único por ciclo de pago.
|
||||
// Se reutiliza en múltiples notificaciones del mismo ciclo.
|
||||
// Se anula (vacía) cuando SALE_APPROVED llega y se registra el pago.
|
||||
EnlacePago string `json:"enlace_pago" gorm:"column:enlace_pago;type:text"`
|
||||
EnlacePagoLinkID string `json:"enlace_pago_link_id" gorm:"column:enlace_pago_link_id;type:varchar(64)"`
|
||||
EnlacePago string `json:"enlace_pago" gorm:"column:enlace_pago;type:text"`
|
||||
EnlacePagoLinkID string `json:"enlace_pago_link_id" gorm:"column:enlace_pago_link_id;type:varchar(64)"`
|
||||
// Confirmación de pago
|
||||
PagoConfirmado bool `json:"pago_confirmado" gorm:"column:pago_confirmado;default:false"`
|
||||
FechaPago *time.Time `json:"fecha_pago" gorm:"column:fecha_pago"`
|
||||
@@ -191,9 +191,9 @@ func LimpiarEnlacePago(contratoID uint) error {
|
||||
func MarcarContratoPagado(contratoID uint) error {
|
||||
now := time.Now()
|
||||
return app.Http.Database.DB.Model(&Contrato{}).Where("id = ?", contratoID).Updates(map[string]interface{}{
|
||||
"pago_confirmado": true,
|
||||
"fecha_pago": now,
|
||||
"enlace_pago": "",
|
||||
"pago_confirmado": true,
|
||||
"fecha_pago": now,
|
||||
"enlace_pago": "",
|
||||
"enlace_pago_link_id": "",
|
||||
}).Error
|
||||
}
|
||||
|
||||
@@ -105,9 +105,9 @@ type DlocalPaymentLog struct {
|
||||
gorm.Model
|
||||
// notification_id único; para entradas manuales se genera con prefijo "manual-"
|
||||
NotificationID string `json:"notification_id" gorm:"column:notification_id;uniqueIndex;type:varchar(128);not null"`
|
||||
Fuente string `json:"fuente" gorm:"column:fuente;type:varchar(20)"` // "webhook" | "manual"
|
||||
Tipo string `json:"tipo" gorm:"column:tipo;type:varchar(50)"` // PAYMENT, SUBSCRIPTION_CHARGE, …
|
||||
Estado string `json:"estado" gorm:"column:estado;type:varchar(30)"` // PAID, PENDING, REJECTED, CANCELLED, EXPIRED
|
||||
Fuente string `json:"fuente" gorm:"column:fuente;type:varchar(20)"` // "webhook" | "manual"
|
||||
Tipo string `json:"tipo" gorm:"column:tipo;type:varchar(50)"` // PAYMENT, SUBSCRIPTION_CHARGE, …
|
||||
Estado string `json:"estado" gorm:"column:estado;type:varchar(30)"` // PAID, PENDING, REJECTED, CANCELLED, EXPIRED
|
||||
PaymentID string `json:"payment_id" gorm:"column:payment_id;type:varchar(64)"`
|
||||
OrderID string `json:"order_id" gorm:"column:order_id;type:varchar(120)"`
|
||||
Referencia string `json:"referencia" gorm:"column:referencia;type:varchar(120)"`
|
||||
|
||||
@@ -13,7 +13,7 @@ type NotificacionRegla struct {
|
||||
PlantillaID uint `json:"plantilla_id" gorm:"column:plantilla_id"`
|
||||
Plantilla PlantillaCorreo `json:"plantilla" gorm:"foreignKey:PlantillaID"`
|
||||
Activo bool `json:"activo" gorm:"column:activo;default:true"`
|
||||
AplicaA string `json:"aplica_a" gorm:"column:aplica_a;default:'todos'"` // todos | renovable | unico
|
||||
AplicaA string `json:"aplica_a" gorm:"column:aplica_a;default:'todos'"` // todos | renovable | unico
|
||||
PasarelaEnlace string `json:"pasarela_enlace" gorm:"column:pasarela_enlace;default:'bold'"` // bold | dlocal | ninguna
|
||||
}
|
||||
|
||||
|
||||
@@ -10,15 +10,15 @@ import (
|
||||
// La vinculación es: Contrato → Servicios (m2m) → servicio_id ↔ SaasProducto.ServicioID → SaasApiConfig.SaasID
|
||||
type SaasApiConfig struct {
|
||||
gorm.Model
|
||||
SaasID uint `json:"saas_id" gorm:"column:saas_id;not null;index"`
|
||||
SaasProducto SaasProducto `json:"saas_producto" gorm:"foreignKey:SaasID"`
|
||||
Nombre string `json:"nombre" gorm:"column:nombre;not null"` // etiqueta amigable
|
||||
SaasID uint `json:"saas_id" gorm:"column:saas_id;not null;index"`
|
||||
SaasProducto SaasProducto `json:"saas_producto" gorm:"foreignKey:SaasID"`
|
||||
Nombre string `json:"nombre" gorm:"column:nombre;not null"` // etiqueta amigable
|
||||
// Pasarela que dispara este callback: dlocal | bold | ambas (default)
|
||||
Pasarela string `json:"pasarela" gorm:"column:pasarela;default:'ambas'"`
|
||||
EndpointURL string `json:"endpoint_url" gorm:"column:endpoint_url;type:text;not null"`
|
||||
Metodo string `json:"metodo" gorm:"column:metodo;default:'POST'"` // POST|PUT|GET
|
||||
ApiKeyHeader string `json:"api_key_header" gorm:"column:api_key_header"` // ej: "X-API-Key"
|
||||
ApiKeyValue string `json:"api_key_value" gorm:"column:api_key_value;type:text"` // valor secreto
|
||||
Pasarela string `json:"pasarela" gorm:"column:pasarela;default:'ambas'"`
|
||||
EndpointURL string `json:"endpoint_url" gorm:"column:endpoint_url;type:text;not null"`
|
||||
Metodo string `json:"metodo" gorm:"column:metodo;default:'POST'"` // POST|PUT|GET
|
||||
ApiKeyHeader string `json:"api_key_header" gorm:"column:api_key_header"` // ej: "X-API-Key"
|
||||
ApiKeyValue string `json:"api_key_value" gorm:"column:api_key_value;type:text"` // valor secreto
|
||||
// PayloadTemplate es un JSON con marcadores que se reemplazarán antes de enviar.
|
||||
// Variables disponibles: {{.ContratoID}} {{.Referencia}} {{.Email}} {{.Monto}} {{.Moneda}} {{.SaasID}} {{.SaasSlug}} {{.Fuente}}
|
||||
PayloadTemplate string `json:"payload_template" gorm:"column:payload_template;type:text"`
|
||||
|
||||
Reference in New Issue
Block a user