Help us shape the future of Go! Take the 2026 Go Developer Survey

paymentmanager

package module
v0.4.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 23, 2026 License: MIT Imports: 12 Imported by: 0

README

Payment Manager

Módulo de dominio para registrar pagos de mesón (efectivo, débito, crédito, transferencia) y pagos online (Webpay Plus, vía una pasarela inyectada). Maneja devoluciones y la conciliación con la pasarela. Diseño: docs/ARCHITECTURE.md; flujos y ramas probadas: docs/diagrams/flows.md.

Inicio rápido

En la raíz del repo, abre la demo (pantalla Pagos y un paso de cobro de mesón, con la pasarela en memoria sandbox):

webtyp

Operaciones

Op Descripción Require
get_charge Consulta el valor a pagar y su moneda payment_online, Read
create_counter_payment Registra un pago de mesón (genera un número de recibo secuencial) payment, Create
start_online_payment Inicia flujo webpay payment_online, Create
get_payment_status Estado actual de un pago payment_online, Read
get_payment Obtiene un pago (limpio de token) payment, Read
list_payments_by_reference Pagos de una reserva/referencia payment, Read
list_payments Lista pagos payment, Read
refund_payment Realiza una devolución parcial o total refund, Create
list_refunds Devoluciones de un pago refund, Read
start_terminal_payment Inicia cobro en máquina payment, Create
refresh_terminal_payment Refresca el estado en la máquina payment, Update
reconcile_payments Cierra pagos online y de máquina pendientes payment, Update

Estados

Estado Descripción
PENDING Pago online iniciado, esperando respuesta de pasarela
PAID Pago completado y acreditado
FAILED Pago rechazado por la pasarela
CANCELLED El cliente abortó o canceló el flujo webpay, o cancelado en la máquina
EXPIRED El pago webpay no fue completado a tiempo
PARTIALLY_REFUNDED Se devolvió parte del monto, pero queda saldo
REFUNDED Devolución total del monto

Cableado en una app

gw, _ := transbank.Open(env.Get(transbank.EnvWebpay)) // github.com/veltylabs/transbank
pos := tuu.NewTerminal()
pm, err := paymentmanager.New(db, paymentmanager.Deps{
	Publisher: broker,
	Gateway:   gw,
	Terminal:  pos,
	Charges:   []paymentmanager.ChargeSource{{Module: "appointment_booking", Reader: bookingModule, Device: "POS-12345"}},
})
  • El esquema lo crea migrate.Migrate(conn, compiler) desde el cmd/migrate de la app.
  • La app corre reconcile_payments cada minuto.
  • ui.PaymentStep es el paso de cobro que incrustan otras pantallas; ui.Browser es la pantalla Pagos; ui.TakeReturn lee la vuelta de la pasarela.

Economic facts

Este módulo publica hechos económicos (money.Fact) usando la dependencia webtyp.com/money. Cuando un pago es completado exitosamente o una devolución es registrada, se publican hechos Charged y Refunded (respectivamente) sobre el events.Publisher configurado en Deps.Publisher. El Scope corresponde al módulo que pidió el cobro (ReferenceModule). La contabilidad y seguimiento de caja quedan fuera de payment_manager y se realizan en otro lado suscribiéndose a estos hechos (money.Subscribe).

Archivos clave

Archivo Qué contiene
model.go / model_orm.go Modelos (model_orm.go lo genera ormc; no editar)
fsm.go Máquina de estados del pago
ports.go Puertos Gateway y ChargeReader
module.go / repository.go Servicio y consultas
ops.go Operaciones, recursos RBAC y códigos HTTP
view.go Presenter de la lista de pagos
amount.go FormatAmount
sandbox/ Pasarela en memoria para pruebas y demo
migrate/ Esquema (payment, refund)
ui/ Paso de pago, pantalla Pagos, vuelta de la pasarela
seed/, web/ Datos y demo

Documentation

Index

Constants

View Source
const (
	ErrNotFound            = domainError("payment not found")
	ErrRefundNotFound      = domainError("refund not found")
	ErrMissingArgs         = domainError("missing required arguments")
	ErrUnknownReference    = domainError("no charge reader for this reference module")
	ErrNotPayable          = domainError("the reference has nothing to pay")
	ErrUnsupportedCurrency = domainError("unsupported currency")
	ErrInvalidMethod       = domainError("invalid payment method for this channel")
	ErrInvalidTransition   = domainError("invalid payment status transition")
	ErrRefundExceeds       = domainError("refund amount exceeds what is left to refund")
	ErrIdTaken             = domainError("id already used by another operation")
	ErrAlreadyPaid         = domainError("the reference is already paid")
	ErrNotPaid             = domainError("payment is not paid")
	ErrConflict            = domainError("payment changed concurrently")
	ErrGatewayUnavailable  = domainError("online payments are not configured")
	ErrGatewayFailed       = domainError("payment gateway call failed")
	ErrAmountMismatch      = domainError("gateway amount differs from the payment amount")
	ErrTerminalUnavailable = domainError("card terminal payments are not configured")
	ErrNoTerminalDevice    = domainError("no card terminal device for this reference module")
	ErrTerminalFailed      = domainError("card terminal call failed")
	ErrTerminalRequired    = domainError("card payments for this reference go through the card terminal")
	ErrNotTerminal         = domainError("payment is not a card terminal payment")
)
View Source
const (
	SourcePayment    = "payment"
	SourcePaymentFee = "payment_fee"
	SourceRefund     = "refund"
)

Origen de los hechos.

View Source
const (
	EventPay           = "PAY"
	EventFail          = "FAIL"
	EventCancel        = "CANCEL"
	EventExpire        = "EXPIRE"
	EventRefundPartial = "REFUND_PARTIAL"
	EventRefundTotal   = "REFUND_TOTAL"
)

Eventos de la máquina de estados del pago.

View Source
const (
	ChannelCounter  = "counter"
	ChannelOnline   = "online"
	ChannelTerminal = "terminal" // cobro en caja empujado a la máquina de tarjeta
)
View Source
const (
	MethodCash     = "cash"
	MethodDebit    = "debit"
	MethodCredit   = "credit"
	MethodTransfer = "transfer"
	MethodCard     = "card" // pago en línea con tarjeta, cualquiera sea el procesador
)
View Source
const (
	CurrencyCLP = "CLP"
	CurrencyUSD = "USD"
)
View Source
const (
	StatusPending           = "PENDING"
	StatusPaid              = "PAID"
	StatusFailed            = "FAILED"
	StatusCancelled         = "CANCELLED" // el cliente abandonó el pago online
	StatusExpired           = "EXPIRED"   // venció sin respuesta de la pasarela
	StatusPartiallyRefunded = "PARTIALLY_REFUNDED"
	StatusRefunded          = "REFUNDED"
)
View Source
const (
	RefundKindReversed  = "REVERSED"  // pasarela: reversa total
	RefundKindNullified = "NULLIFIED" // pasarela: anulación total o parcial
	RefundKindManual    = "MANUAL"    // mesón: devolución registrada por el cajero
)
View Source
const (
	PendingTimeout      = 600       // un pago PENDING (online o máquina) más viejo que esto se concilia
	GatewayStatusWindow = 7 * 86400 // la pasarela guarda el estado 7 días
)

Tiempos (segundos).

View Source
const (
	EventPaymentPaid     = "payment.paid"
	EventPaymentFailed   = "payment.failed"
	EventPaymentRefunded = "payment.refunded"
)

Eventos publicados después de cada mutación exitosa. Payload: *Payment, o *Refund en EventPaymentRefunded.

View Source
const (
	OpGetCharge               = "get_charge"
	OpCreateCounterPayment    = "create_counter_payment"
	OpStartOnlinePayment      = "start_online_payment"
	OpGetPaymentStatus        = "get_payment_status"
	OpGetPayment              = "get_payment"
	OpListPaymentsByReference = "list_payments_by_reference"
	OpListPayments            = "list_payments"
	OpRefundPayment           = "refund_payment"
	OpListRefunds             = "list_refunds"
	OpStartTerminalPayment    = "start_terminal_payment"
	OpRefreshTerminalPayment  = "refresh_terminal_payment"
	OpReconcilePayments       = "reconcile_payments"
)

Operaciones del módulo; en el cable van como "payment_manager.<op>".

View Source
const (
	ResourcePayment       = "payment"
	ResourcePaymentOnline = "payment_online"
	ResourceRefund        = "refund"
)

Recursos RBAC. La app concede ResourcePaymentOnline a la identidad anónima para la reserva online; el resto, solo al personal.

View Source
const (
	QueryPayment = "payment"
	QueryStatus  = "status"
)

QueryPayment y QueryStatus son los parámetros de la query con que la ruta de retorno de la pasarela devuelve el navegador a la app: /?payment=<id>&status=<estado>#<pantalla>.

View Source
const (
	OutcomePending    = "pending"
	OutcomeAuthorized = "authorized"
	OutcomeRejected   = "rejected"
	OutcomeCancelled  = "cancelled"
	OutcomeExpired    = "expired"
)
View Source
const ListWindowSeconds = 30 * time.Day

ListWindowSeconds es cuánto hacia atrás muestra la lista de pagos: 30 días.

View Source
const ModelName = "payment_manager"

Variables

View Source
var ChargeResultModel = model.Definition{
	Name: "charge_result",
	Fields: model.Fields{
		{Name: "amount", Type: model.Int()},
		{Name: "currency", Type: model.Text()},
		{Name: "payable", Type: model.Bool()},
		{Name: "terminal", Type: model.Bool()},
	},
}
View Source
var CreateCounterPaymentArgsModel = model.Definition{
	Name: "create_counter_payment_args",
	Fields: model.Fields{
		{Name: "tenant_id", Type: model.Text(), NotNull: true},
		{Name: "id", Type: model.Text(), NotNull: true},
		{Name: "reference_module", Type: model.Text(), NotNull: true},
		{Name: "reference_id", Type: model.Text(), NotNull: true},
		{Name: "method", Type: input.Radio(), NotNull: true},
		{Name: "created_by", Type: model.Text()},
	},
}
View Source
var GetChargeArgsModel = model.Definition{
	Name: "get_charge_args",
	Fields: model.Fields{
		{Name: "tenant_id", Type: model.Text(), NotNull: true},
		{Name: "reference_module", Type: model.Text(), NotNull: true},
		{Name: "reference_id", Type: model.Text(), NotNull: true},
	},
}
View Source
var GetPaymentArgsModel = model.Definition{
	Name: "get_payment_args",
	Fields: model.Fields{
		{Name: "tenant_id", Type: model.Text(), NotNull: true},
		{Name: "id", Type: model.Text(), NotNull: true},
	},
}
View Source
var ListPaymentsArgsModel = model.Definition{
	Name: "list_payments_args",
	Fields: model.Fields{
		{Name: "tenant_id", Type: model.Text(), NotNull: true},
		{Name: "from", Type: model.Int(), NotNull: true},
		{Name: "to", Type: model.Int(), NotNull: true},
	},
}
View Source
var ListPaymentsByReferenceArgsModel = model.Definition{
	Name: "list_payments_by_reference_args",
	Fields: model.Fields{
		{Name: "tenant_id", Type: model.Text(), NotNull: true},
		{Name: "reference_module", Type: model.Text(), NotNull: true},
		{Name: "reference_id", Type: model.Text(), NotNull: true},
	},
}
View Source
var ListRefundsArgsModel = model.Definition{
	Name: "list_refunds_args",
	Fields: model.Fields{
		{Name: "tenant_id", Type: model.Text(), NotNull: true},
		{Name: "payment_id", Type: model.Text(), NotNull: true},
	},
}
View Source
var PaymentCounterModel = model.Definition{
	Name: "payment_counter",
	Fields: model.Fields{
		{Name: "tenant_id", Type: model.Text(), DB: &model.FieldDB{PK: true}, NotNull: true},
		{Name: "next_number", Type: model.Int(), NotNull: true},
	},
}
View Source
var PaymentCounter_ = struct {
	TenantId   string
	NextNumber string
}{
	TenantId:   "tenant_id",
	NextNumber: "next_number",
}
View Source
var PaymentModel = model.Definition{
	Name: "payment",
	Fields: model.Fields{
		{Name: "id", Type: model.Text(), DB: &model.FieldDB{PK: true}, NotNull: true, Permitted: model.Permitted{Letters: true, Numbers: true, Extra: []rune{'.', '-', '_'}, Minimum: 1, Maximum: 26}},
		{Name: "tenant_id", Type: model.Text(), NotNull: true},
		{Name: "reference_module", Type: model.Text(), NotNull: true, Permitted: model.Permitted{Maximum: 60}},
		{Name: "reference_id", Type: model.Text(), NotNull: true, Permitted: model.Permitted{Maximum: 64}},
		{Name: "channel", Type: model.Text(), NotNull: true},
		{Name: "method", Type: model.Text(), NotNull: true},
		{Name: "amount", Type: model.Int(), NotNull: true},
		{Name: "currency", Type: model.Text(), NotNull: true, Permitted: model.Permitted{Letters: true, Minimum: 3, Maximum: 3}},
		{Name: "status", Type: model.Text(), NotNull: true},
		{Name: "refunded_amount", Type: model.Int()},
		{Name: "provider_token", Type: model.Text(), OmitEmpty: true},
		{Name: "provider", Type: model.Text(), OmitEmpty: true, Permitted: model.Permitted{Letters: true, Numbers: true, Extra: []rune{'_', '-'}, Maximum: 30}},

		{Name: "authorization_code", Type: model.Text(), OmitEmpty: true, Permitted: model.Permitted{Letters: true, Numbers: true, Maximum: 6}},
		{Name: "payment_type_code", Type: model.Text(), OmitEmpty: true, Permitted: model.Permitted{Letters: true, Maximum: 2}},
		{Name: "installments", Type: model.Int(), OmitEmpty: true},
		{Name: "card_last4", Type: model.Text(), OmitEmpty: true, Permitted: model.Permitted{Numbers: true, Maximum: 4}},
		{Name: "receipt_number", Type: model.Text(), OmitEmpty: true, Permitted: model.Permitted{Maximum: 40}},
		{Name: "return_to", Type: model.Text(), OmitEmpty: true, Permitted: model.Permitted{Letters: true, Numbers: true, Extra: []rune{'_', '-'}, Maximum: 60}},
		{Name: "created_by", Type: model.Text(), OmitEmpty: true},
		{Name: "created_at", Type: model.UnixTime()},
		{Name: "paid_at", Type: model.UnixTime(), OmitEmpty: true},
		{Name: "updated_at", Type: model.UnixTime()},
		{Name: "revision", Type: model.Int()},
	},
}
View Source
var PaymentStatusResultModel = model.Definition{
	Name: "payment_status_result",
	Fields: model.Fields{
		{Name: "id", Type: model.Text()},
		{Name: "status", Type: model.Text()},
	},
}
View Source
var Payment_ = struct {
	Id                string
	TenantId          string
	ReferenceModule   string
	ReferenceId       string
	Channel           string
	Method            string
	Amount            string
	Currency          string
	Status            string
	RefundedAmount    string
	ProviderToken     string
	Provider          string
	AuthorizationCode string
	PaymentTypeCode   string
	Installments      string
	CardLast4         string
	ReceiptNumber     string
	ReturnTo          string
	CreatedBy         string
	CreatedAt         string
	PaidAt            string
	UpdatedAt         string
	Revision          string
}{
	Id:                "id",
	TenantId:          "tenant_id",
	ReferenceModule:   "reference_module",
	ReferenceId:       "reference_id",
	Channel:           "channel",
	Method:            "method",
	Amount:            "amount",
	Currency:          "currency",
	Status:            "status",
	RefundedAmount:    "refunded_amount",
	ProviderToken:     "provider_token",
	Provider:          "provider",
	AuthorizationCode: "authorization_code",
	PaymentTypeCode:   "payment_type_code",
	Installments:      "installments",
	CardLast4:         "card_last4",
	ReceiptNumber:     "receipt_number",
	ReturnTo:          "return_to",
	CreatedBy:         "created_by",
	CreatedAt:         "created_at",
	PaidAt:            "paid_at",
	UpdatedAt:         "updated_at",
	Revision:          "revision",
}
View Source
var ReconcilePaymentsArgsModel = model.Definition{
	Name: "reconcile_payments_args",
	Fields: model.Fields{
		{Name: "tenant_id", Type: model.Text(), NotNull: true},
	},
}
View Source
var ReconcileResultModel = model.Definition{
	Name: "reconcile_result",
	Fields: model.Fields{
		{Name: "closed", Type: model.Int()},
	},
}
View Source
var RefundModel = model.Definition{
	Name: "refund",
	Fields: model.Fields{
		{Name: "id", Type: model.Text(), DB: &model.FieldDB{PK: true}, NotNull: true, Permitted: model.Permitted{Letters: true, Numbers: true, Extra: []rune{'.', '-', '_'}, Minimum: 1, Maximum: 26}},
		{Name: "tenant_id", Type: model.Text(), NotNull: true},
		{Name: "payment_id", Type: model.Text(), Ref: &PaymentModel, DB: &model.FieldDB{RefColumn: "id"}, NotNull: true},
		{Name: "amount", Type: model.Int(), NotNull: true},
		{Name: "kind", Type: model.Text(), NotNull: true},
		{Name: "method", Type: model.Text(), OmitEmpty: true},
		{Name: "reason", Type: input.Textarea(), NotNull: true, Permitted: model.Permitted{Maximum: 255}},
		{Name: "authorization_code", Type: model.Text(), OmitEmpty: true},
		{Name: "created_by", Type: model.Text(), OmitEmpty: true},
		{Name: "created_at", Type: model.UnixTime()},
	},
}
View Source
var RefundPaymentArgsModel = model.Definition{
	Name: "refund_payment_args",
	Fields: model.Fields{
		{Name: "tenant_id", Type: model.Text(), NotNull: true},
		{Name: "id", Type: model.Text(), NotNull: true},
		{Name: "payment_id", Type: model.Text(), NotNull: true},
		{Name: "amount", Type: model.Int(), NotNull: true},
		{Name: "reason", Type: input.Textarea(), NotNull: true, Permitted: model.Permitted{Maximum: 255}},
		{Name: "method", Type: model.Text()},
		{Name: "created_by", Type: model.Text()},
	},
}
View Source
var Refund_ = struct {
	Id                string
	TenantId          string
	PaymentId         string
	Amount            string
	Kind              string
	Method            string
	Reason            string
	AuthorizationCode string
	CreatedBy         string
	CreatedAt         string
}{
	Id:                "id",
	TenantId:          "tenant_id",
	PaymentId:         "payment_id",
	Amount:            "amount",
	Kind:              "kind",
	Method:            "method",
	Reason:            "reason",
	AuthorizationCode: "authorization_code",
	CreatedBy:         "created_by",
	CreatedAt:         "created_at",
}
View Source
var StartOnlinePaymentArgsModel = model.Definition{
	Name: "start_online_payment_args",
	Fields: model.Fields{
		{Name: "tenant_id", Type: model.Text(), NotNull: true},
		{Name: "id", Type: model.Text(), NotNull: true},
		{Name: "reference_module", Type: model.Text(), NotNull: true},
		{Name: "reference_id", Type: model.Text(), NotNull: true},

		{Name: "return_to", Type: model.Text(), Permitted: model.Permitted{Letters: true, Numbers: true, Extra: []rune{'_', '-'}, Maximum: 60}},
		{Name: "payer_name", Type: model.Text(), Permitted: model.Permitted{Letters: true, Tilde: true, Spaces: true, Maximum: 120}},
		{Name: "payer_email", Type: model.Text(), Permitted: model.Permitted{Letters: true, Numbers: true, Extra: []rune{'@', '.', '-', '_', '+'}, Maximum: 120}},
		{Name: "payer_phone", Type: model.Text(), Permitted: model.Permitted{Numbers: true, Extra: []rune{'+'}, Maximum: 20}},
		{Name: "created_by", Type: model.Text()},
	},
}
View Source
var StartOnlinePaymentResultModel = model.Definition{
	Name: "start_online_payment_result",
	Fields: model.Fields{
		{Name: "payment_id", Type: model.Text()},
		{Name: "redirect_url", Type: model.Text()},
		{Name: "token", Type: model.Text()},
		{Name: "token_field", Type: model.Text()},
	},
}
View Source
var StartTerminalPaymentArgsModel = model.Definition{
	Name: "start_terminal_payment_args",
	Fields: model.Fields{
		{Name: "tenant_id", Type: model.Text(), NotNull: true},
		{Name: "id", Type: model.Text(), NotNull: true},
		{Name: "reference_module", Type: model.Text(), NotNull: true},
		{Name: "reference_id", Type: model.Text(), NotNull: true},
		{Name: "method", Type: input.Radio(), NotNull: true},
		{Name: "created_by", Type: model.Text()},
	},
}

Functions

func FormatAmount added in v0.1.0

func FormatAmount(amount int64, currency string) string

func NewView added in v0.1.0

func NewView(caller router.Caller, tenantId string) view.Presenter

NewView construye el Presenter de solo lectura de los pagos del tenant de los últimos ListWindowSeconds.

func StatusFor added in v0.1.0

func StatusFor(err error) int

StatusFor es el código HTTP de un error del módulo (tabla del plan, §5).

func Transition added in v0.1.0

func Transition(current, event string) (string, error)

Transition devuelve el estado al que lleva event desde current, o ErrInvalidTransition.

Types

type BankDays added in v0.4.0

type BankDays interface {
	BankDayAfter(from time.Unix, days int) (time.Unix, error)
}

BankDays convierte días hábiles bancarios en fecha. Lo cumple business_calendar.(*Module).BankDayAfter. Ejemplo: deps.BankDays = calendario

type ChargeReader added in v0.1.0

type ChargeReader interface {
	Charge(tenantId, referenceId string) (amount int64, currency string, payable bool, err error)
}

type ChargeResult added in v0.1.0

type ChargeResult struct {
	Amount   int64
	Currency string
	Payable  bool
	Terminal bool
}

func (*ChargeResult) DecodeFields added in v0.1.0

func (m *ChargeResult) DecodeFields(r model.FieldReader)

func (*ChargeResult) EncodeFields added in v0.1.0

func (m *ChargeResult) EncodeFields(w model.FieldWriter)

func (*ChargeResult) IsNil added in v0.1.0

func (m *ChargeResult) IsNil() bool

func (*ChargeResult) ModelName added in v0.1.0

func (m *ChargeResult) ModelName() string

func (*ChargeResult) Pointers added in v0.1.0

func (m *ChargeResult) Pointers() []any

func (*ChargeResult) Schema added in v0.1.0

func (m *ChargeResult) Schema() []model.Field

func (*ChargeResult) Validate added in v0.1.0

func (m *ChargeResult) Validate(action byte) error

type ChargeResultList added in v0.1.0

type ChargeResultList []*ChargeResult

func (*ChargeResultList) Append added in v0.1.0

func (s *ChargeResultList) Append() model.Fielder

func (*ChargeResultList) At added in v0.1.0

func (s *ChargeResultList) At(i int) model.Fielder

func (*ChargeResultList) DecodeFields added in v0.1.0

func (s *ChargeResultList) DecodeFields(_ model.FieldReader)

func (*ChargeResultList) EncodeFields added in v0.1.0

func (s *ChargeResultList) EncodeFields(_ model.FieldWriter)

func (*ChargeResultList) IsNil added in v0.1.0

func (s *ChargeResultList) IsNil() bool

func (*ChargeResultList) Len added in v0.1.0

func (s *ChargeResultList) Len() int

type ChargeSource added in v0.1.0

type ChargeSource struct {
	Module string
	Reader ChargeReader
	Device string // id de la máquina de la caja que cobra las referencias de este módulo; "" = sin máquina
}

type CreateCounterPaymentArgs added in v0.1.0

type CreateCounterPaymentArgs struct {
	TenantId        string
	Id              string
	ReferenceModule string
	ReferenceId     string
	Method          string
	CreatedBy       string
}

func (*CreateCounterPaymentArgs) DecodeFields added in v0.1.0

func (m *CreateCounterPaymentArgs) DecodeFields(r model.FieldReader)

func (*CreateCounterPaymentArgs) EncodeFields added in v0.1.0

func (m *CreateCounterPaymentArgs) EncodeFields(w model.FieldWriter)

func (*CreateCounterPaymentArgs) IsNil added in v0.1.0

func (m *CreateCounterPaymentArgs) IsNil() bool

func (*CreateCounterPaymentArgs) ModelName added in v0.1.0

func (m *CreateCounterPaymentArgs) ModelName() string

func (*CreateCounterPaymentArgs) Pointers added in v0.1.0

func (m *CreateCounterPaymentArgs) Pointers() []any

func (*CreateCounterPaymentArgs) Schema added in v0.1.0

func (m *CreateCounterPaymentArgs) Schema() []model.Field

func (*CreateCounterPaymentArgs) Validate added in v0.1.0

func (m *CreateCounterPaymentArgs) Validate(action byte) error

type CreateCounterPaymentArgsList added in v0.1.0

type CreateCounterPaymentArgsList []*CreateCounterPaymentArgs

func (*CreateCounterPaymentArgsList) Append added in v0.1.0

func (*CreateCounterPaymentArgsList) At added in v0.1.0

func (*CreateCounterPaymentArgsList) DecodeFields added in v0.1.0

func (s *CreateCounterPaymentArgsList) DecodeFields(_ model.FieldReader)

func (*CreateCounterPaymentArgsList) EncodeFields added in v0.1.0

func (s *CreateCounterPaymentArgsList) EncodeFields(_ model.FieldWriter)

func (*CreateCounterPaymentArgsList) IsNil added in v0.1.0

func (*CreateCounterPaymentArgsList) Len added in v0.1.0

type Deps added in v0.1.0

type Deps struct {
	Publisher events.Publisher // opcional — nil desactiva la publicación
	Gateway   Gateway          // opcional — nil: el canal online responde ErrGatewayUnavailable
	Charges   []ChargeSource   // requerido: quién responde el monto de cada módulo de referencia
	Terminal  Terminal         // opcional — nil: el cobro con máquina responde ErrTerminalUnavailable
	BankDays  BankDays         // requerido si el Terminal o el Gateway implementan PayoutTerms
}

Deps son las dependencias que inyecta la raíz de composición.

type Gateway added in v0.1.0

type Gateway interface {
	Provider() string
	Start(req GatewayStart) (GatewayStarted, error)
	Status(token string) (GatewayResult, error)
	Refund(token string, amount int64) (GatewayRefund, error)
}

Gateway es la pasarela de pago en línea. La implementación (github.com/veltylabs/transbank, github.com/veltylabs/tuu) la inyecta la app; verifica sola lo que le devuelve su procesador y llama a CompleteOnlinePayment con el resultado ya verificado. Sus llamadas son síncronas y solo corren en el servidor.

type GatewayRefund added in v0.1.0

type GatewayRefund struct {
	Kind              string
	AuthorizationCode string
	Amount            int64
}

type GatewayResult added in v0.1.0

type GatewayResult struct {
	Outcome           string
	Amount            int64
	AuthorizationCode string
	PaymentTypeCode   string
	Installments      int64
	CardLast4         string
}

type GatewayStart added in v0.1.0

type GatewayStart struct {
	PaymentId   string // nuestro id (Webpay: buy_order y session_id; TUU: x_reference)
	Amount      int64
	Currency    string
	Description string // texto corto para el pagador; puede ir vacío
	Payer       Payer  // lo exige TUU; Webpay lo ignora
}

type GatewayStarted added in v0.1.0

type GatewayStarted struct {
	Token       string // id del cobro en el procesador; se guarda en Payment.ProviderToken
	RedirectURL string
	TokenField  string // no vacío: el navegador envía Token por POST en este campo (Webpay: "token_ws"); vacío: GET a RedirectURL
}

type GetChargeArgs added in v0.1.0

type GetChargeArgs struct {
	TenantId        string
	ReferenceModule string
	ReferenceId     string
}

func (*GetChargeArgs) DecodeFields added in v0.1.0

func (m *GetChargeArgs) DecodeFields(r model.FieldReader)

func (*GetChargeArgs) EncodeFields added in v0.1.0

func (m *GetChargeArgs) EncodeFields(w model.FieldWriter)

func (*GetChargeArgs) IsNil added in v0.1.0

func (m *GetChargeArgs) IsNil() bool

func (*GetChargeArgs) ModelName added in v0.1.0

func (m *GetChargeArgs) ModelName() string

func (*GetChargeArgs) Pointers added in v0.1.0

func (m *GetChargeArgs) Pointers() []any

func (*GetChargeArgs) Schema added in v0.1.0

func (m *GetChargeArgs) Schema() []model.Field

func (*GetChargeArgs) Validate added in v0.1.0

func (m *GetChargeArgs) Validate(action byte) error

type GetChargeArgsList added in v0.1.0

type GetChargeArgsList []*GetChargeArgs

func (*GetChargeArgsList) Append added in v0.1.0

func (s *GetChargeArgsList) Append() model.Fielder

func (*GetChargeArgsList) At added in v0.1.0

func (*GetChargeArgsList) DecodeFields added in v0.1.0

func (s *GetChargeArgsList) DecodeFields(_ model.FieldReader)

func (*GetChargeArgsList) EncodeFields added in v0.1.0

func (s *GetChargeArgsList) EncodeFields(_ model.FieldWriter)

func (*GetChargeArgsList) IsNil added in v0.1.0

func (s *GetChargeArgsList) IsNil() bool

func (*GetChargeArgsList) Len added in v0.1.0

func (s *GetChargeArgsList) Len() int

type GetPaymentArgs added in v0.1.0

type GetPaymentArgs struct {
	TenantId string
	Id       string
}

func (*GetPaymentArgs) DecodeFields added in v0.1.0

func (m *GetPaymentArgs) DecodeFields(r model.FieldReader)

func (*GetPaymentArgs) EncodeFields added in v0.1.0

func (m *GetPaymentArgs) EncodeFields(w model.FieldWriter)

func (*GetPaymentArgs) IsNil added in v0.1.0

func (m *GetPaymentArgs) IsNil() bool

func (*GetPaymentArgs) ModelName added in v0.1.0

func (m *GetPaymentArgs) ModelName() string

func (*GetPaymentArgs) Pointers added in v0.1.0

func (m *GetPaymentArgs) Pointers() []any

func (*GetPaymentArgs) Schema added in v0.1.0

func (m *GetPaymentArgs) Schema() []model.Field

func (*GetPaymentArgs) Validate added in v0.1.0

func (m *GetPaymentArgs) Validate(action byte) error

type GetPaymentArgsList added in v0.1.0

type GetPaymentArgsList []*GetPaymentArgs

func (*GetPaymentArgsList) Append added in v0.1.0

func (s *GetPaymentArgsList) Append() model.Fielder

func (*GetPaymentArgsList) At added in v0.1.0

func (*GetPaymentArgsList) DecodeFields added in v0.1.0

func (s *GetPaymentArgsList) DecodeFields(_ model.FieldReader)

func (*GetPaymentArgsList) EncodeFields added in v0.1.0

func (s *GetPaymentArgsList) EncodeFields(_ model.FieldWriter)

func (*GetPaymentArgsList) IsNil added in v0.1.0

func (s *GetPaymentArgsList) IsNil() bool

func (*GetPaymentArgsList) Len added in v0.1.0

func (s *GetPaymentArgsList) Len() int

type ListPaymentsArgs added in v0.1.0

type ListPaymentsArgs struct {
	TenantId string
	From     int64
	To       int64
}

func (*ListPaymentsArgs) DecodeFields added in v0.1.0

func (m *ListPaymentsArgs) DecodeFields(r model.FieldReader)

func (*ListPaymentsArgs) EncodeFields added in v0.1.0

func (m *ListPaymentsArgs) EncodeFields(w model.FieldWriter)

func (*ListPaymentsArgs) IsNil added in v0.1.0

func (m *ListPaymentsArgs) IsNil() bool

func (*ListPaymentsArgs) ModelName added in v0.1.0

func (m *ListPaymentsArgs) ModelName() string

func (*ListPaymentsArgs) Pointers added in v0.1.0

func (m *ListPaymentsArgs) Pointers() []any

func (*ListPaymentsArgs) Schema added in v0.1.0

func (m *ListPaymentsArgs) Schema() []model.Field

func (*ListPaymentsArgs) Validate added in v0.1.0

func (m *ListPaymentsArgs) Validate(action byte) error

type ListPaymentsArgsList added in v0.1.0

type ListPaymentsArgsList []*ListPaymentsArgs

func (*ListPaymentsArgsList) Append added in v0.1.0

func (s *ListPaymentsArgsList) Append() model.Fielder

func (*ListPaymentsArgsList) At added in v0.1.0

func (*ListPaymentsArgsList) DecodeFields added in v0.1.0

func (s *ListPaymentsArgsList) DecodeFields(_ model.FieldReader)

func (*ListPaymentsArgsList) EncodeFields added in v0.1.0

func (s *ListPaymentsArgsList) EncodeFields(_ model.FieldWriter)

func (*ListPaymentsArgsList) IsNil added in v0.1.0

func (s *ListPaymentsArgsList) IsNil() bool

func (*ListPaymentsArgsList) Len added in v0.1.0

func (s *ListPaymentsArgsList) Len() int

type ListPaymentsByReferenceArgs added in v0.1.0

type ListPaymentsByReferenceArgs struct {
	TenantId        string
	ReferenceModule string
	ReferenceId     string
}

func (*ListPaymentsByReferenceArgs) DecodeFields added in v0.1.0

func (m *ListPaymentsByReferenceArgs) DecodeFields(r model.FieldReader)

func (*ListPaymentsByReferenceArgs) EncodeFields added in v0.1.0

func (m *ListPaymentsByReferenceArgs) EncodeFields(w model.FieldWriter)

func (*ListPaymentsByReferenceArgs) IsNil added in v0.1.0

func (m *ListPaymentsByReferenceArgs) IsNil() bool

func (*ListPaymentsByReferenceArgs) ModelName added in v0.1.0

func (m *ListPaymentsByReferenceArgs) ModelName() string

func (*ListPaymentsByReferenceArgs) Pointers added in v0.1.0

func (m *ListPaymentsByReferenceArgs) Pointers() []any

func (*ListPaymentsByReferenceArgs) Schema added in v0.1.0

func (m *ListPaymentsByReferenceArgs) Schema() []model.Field

func (*ListPaymentsByReferenceArgs) Validate added in v0.1.0

func (m *ListPaymentsByReferenceArgs) Validate(action byte) error

type ListPaymentsByReferenceArgsList added in v0.1.0

type ListPaymentsByReferenceArgsList []*ListPaymentsByReferenceArgs

func (*ListPaymentsByReferenceArgsList) Append added in v0.1.0

func (*ListPaymentsByReferenceArgsList) At added in v0.1.0

func (*ListPaymentsByReferenceArgsList) DecodeFields added in v0.1.0

func (*ListPaymentsByReferenceArgsList) EncodeFields added in v0.1.0

func (*ListPaymentsByReferenceArgsList) IsNil added in v0.1.0

func (*ListPaymentsByReferenceArgsList) Len added in v0.1.0

type ListRefundsArgs added in v0.1.0

type ListRefundsArgs struct {
	TenantId  string
	PaymentId string
}

func (*ListRefundsArgs) DecodeFields added in v0.1.0

func (m *ListRefundsArgs) DecodeFields(r model.FieldReader)

func (*ListRefundsArgs) EncodeFields added in v0.1.0

func (m *ListRefundsArgs) EncodeFields(w model.FieldWriter)

func (*ListRefundsArgs) IsNil added in v0.1.0

func (m *ListRefundsArgs) IsNil() bool

func (*ListRefundsArgs) ModelName added in v0.1.0

func (m *ListRefundsArgs) ModelName() string

func (*ListRefundsArgs) Pointers added in v0.1.0

func (m *ListRefundsArgs) Pointers() []any

func (*ListRefundsArgs) Schema added in v0.1.0

func (m *ListRefundsArgs) Schema() []model.Field

func (*ListRefundsArgs) Validate added in v0.1.0

func (m *ListRefundsArgs) Validate(action byte) error

type ListRefundsArgsList added in v0.1.0

type ListRefundsArgsList []*ListRefundsArgs

func (*ListRefundsArgsList) Append added in v0.1.0

func (s *ListRefundsArgsList) Append() model.Fielder

func (*ListRefundsArgsList) At added in v0.1.0

func (*ListRefundsArgsList) DecodeFields added in v0.1.0

func (s *ListRefundsArgsList) DecodeFields(_ model.FieldReader)

func (*ListRefundsArgsList) EncodeFields added in v0.1.0

func (s *ListRefundsArgsList) EncodeFields(_ model.FieldWriter)

func (*ListRefundsArgsList) IsNil added in v0.1.0

func (s *ListRefundsArgsList) IsNil() bool

func (*ListRefundsArgsList) Len added in v0.1.0

func (s *ListRefundsArgsList) Len() int

type Module added in v0.1.0

type Module struct {
	// contains filtered or unexported fields
}

Module registra, confirma y devuelve pagos.

func New

func New(db *orm.DB, deps Deps) (*Module, error)

New conecta el módulo a un *orm.DB ya migrado (ver el subpaquete migrate).

func (*Module) Charge added in v0.1.0

func (m *Module) Charge(tenantId, referenceModule, referenceId string) (amount int64, currency string, payable bool, err error)

Charge pregunta al módulo dueño de la referencia cuánto se cobra. El monto nunca viene del cliente.

func (*Module) CompleteOnlinePayment added in v0.1.0

func (m *Module) CompleteOnlinePayment(r OnlineResult) (Payment, error)

CompleteOnlinePayment asienta el resultado que el adaptador ya verificó. Es idempotente: un pago que ya no está PENDING se devuelve tal cual.

func (*Module) CreateCounterPayment added in v0.1.0

func (m *Module) CreateCounterPayment(cmd CreateCounterPaymentArgs) (Payment, error)

CreateCounterPayment registra un pago hecho en el mesón. Nace pagado. Repetir el mismo id con la misma referencia devuelve el pago guardado.

func (*Module) Due added in v0.2.0

func (m *Module) Due(tenantId, referenceModule, referenceId string) (amount int64, currency string, err error)

Due devuelve lo que falta cobrar de una referencia: el monto que informa su ChargeReader menos el bruto de los pagos PAID y PARTIALLY_REFUNDED de esa referencia. Un pago PENDING, FAILED, CANCELLED, EXPIRED o REFUNDED no cuenta. El monto nunca viene del cliente.

func (*Module) GetPayment added in v0.1.0

func (m *Module) GetPayment(tenantId, id string) (Payment, error)

GetPayment lee un pago del tenant.

func (*Module) ListPayments added in v0.1.0

func (m *Module) ListPayments(tenantId string, from, to time.Unix) ([]Payment, error)

ListPayments lista los pagos creados en [from, to) (segundos).

func (*Module) ListPaymentsByReference added in v0.1.0

func (m *Module) ListPaymentsByReference(tenantId, referenceModule, referenceId string) ([]Payment, error)

ListPaymentsByReference lista los pagos de una referencia.

func (*Module) ListRefunds added in v0.1.0

func (m *Module) ListRefunds(tenantId, paymentId string) ([]Refund, error)

ListRefunds lista las devoluciones de un pago.

func (*Module) ModelName added in v0.1.0

func (m *Module) ModelName() string

func (*Module) MountOperations added in v0.1.0

func (m *Module) MountOperations(reg router.OperationRegistry)

func (*Module) NextReceiptNumber added in v0.1.21

func (m *Module) NextReceiptNumber(tenantId string) (string, error)

NextReceiptNumber returns this tenant's next sequential receipt number, formatted "R-000001" (zero-padded to 6 digits; grows past it without truncating). It must be gap-free per tenant.

func (*Module) PaidAmount added in v0.1.0

func (m *Module) PaidAmount(tenantId, paymentId, referenceModule, referenceId string) (amount int64, currency string, err error)

PaidAmount verifica un pago para el módulo dueño de la referencia: devuelve el monto neto (pagado menos devuelto) solo si el pago es de esa referencia y está pagado.

func (*Module) ReconcilePayments added in v0.2.0

func (m *Module) ReconcilePayments(tenantId string, now time.Unix) (int, error)

ReconcilePayments cierra los pagos online y de máquina que siguen PENDING después de PendingTimeout (diagrama §8). Devuelve cuántos cerró.

func (*Module) RefreshTerminalPayment added in v0.2.0

func (m *Module) RefreshTerminalPayment(tenantId, id string) (Payment, error)

RefreshTerminalPayment consulta la máquina y asienta el resultado de un pago PENDING. Un pago que ya no está PENDING se devuelve tal cual.

func (*Module) RefundPayment added in v0.1.0

func (m *Module) RefundPayment(cmd RefundPaymentArgs) (Refund, error)

RefundPayment devuelve amount de un pago pagado. En online lo pide a la pasarela; en mesón registra la devolución con su medio.

func (*Module) StartOnlinePayment added in v0.1.0

func (m *Module) StartOnlinePayment(cmd StartOnlinePaymentArgs) (StartOnlinePaymentResult, error)

StartOnlinePayment crea el pago PENDING y pide a la pasarela un token y la URL a la que se envía al cliente.

func (*Module) StartTerminalPayment added in v0.2.0

func (m *Module) StartTerminalPayment(cmd StartTerminalPaymentArgs) (Payment, error)

StartTerminalPayment crea el pago PENDING y envía el monto a la máquina de la caja del módulo de la referencia. Repetir el mismo id con la misma referencia devuelve el pago guardado.

type OnlineResult added in v0.3.0

type OnlineResult struct {
	PaymentId string
	Result    GatewayResult
}

OnlineResult es lo que el adaptador ya verificó (firma del aviso o confirmación con el procesador).

type Payer added in v0.3.0

type Payer struct {
	Name  string
	Email string
	Phone string
}

Payer es quien paga en línea. Los campos pueden ir vacíos; un adaptador que los exige responde error.

type Payment added in v0.1.0

type Payment struct {
	Id                string
	TenantId          string
	ReferenceModule   string
	ReferenceId       string
	Channel           string
	Method            string
	Amount            int64
	Currency          string
	Status            string
	RefundedAmount    int64
	ProviderToken     string
	Provider          string
	AuthorizationCode string
	PaymentTypeCode   string
	Installments      int64
	CardLast4         string
	ReceiptNumber     string
	ReturnTo          string
	CreatedBy         string
	CreatedAt         time.Unix
	PaidAt            time.Unix
	UpdatedAt         time.Unix
	Revision          int64
}

func ReadOnePayment added in v0.1.0

func ReadOnePayment(qb *orm.QB, model *Payment) (*Payment, error)

func (*Payment) DecodeFields added in v0.1.0

func (m *Payment) DecodeFields(r model.FieldReader)

func (*Payment) EncodeFields added in v0.1.0

func (m *Payment) EncodeFields(w model.FieldWriter)

func (*Payment) IsNil added in v0.1.0

func (m *Payment) IsNil() bool

func (*Payment) Item added in v0.1.0

func (p *Payment) Item() view.Item

Item proyecta un pago como fila: monto y medio; estado y referencia.

func (*Payment) ModelName added in v0.1.0

func (m *Payment) ModelName() string

func (*Payment) Pointers added in v0.1.0

func (m *Payment) Pointers() []any

func (*Payment) Schema added in v0.1.0

func (m *Payment) Schema() []model.Field

func (*Payment) Validate added in v0.1.0

func (m *Payment) Validate(action byte) error

type PaymentCounter added in v0.1.21

type PaymentCounter struct {
	TenantId   string
	NextNumber int64
}

func ReadOnePaymentCounter added in v0.1.21

func ReadOnePaymentCounter(qb *orm.QB, model *PaymentCounter) (*PaymentCounter, error)

func (*PaymentCounter) DecodeFields added in v0.1.21

func (m *PaymentCounter) DecodeFields(r model.FieldReader)

func (*PaymentCounter) EncodeFields added in v0.1.21

func (m *PaymentCounter) EncodeFields(w model.FieldWriter)

func (*PaymentCounter) IsNil added in v0.1.21

func (m *PaymentCounter) IsNil() bool

func (*PaymentCounter) ModelName added in v0.1.21

func (m *PaymentCounter) ModelName() string

func (*PaymentCounter) Pointers added in v0.1.21

func (m *PaymentCounter) Pointers() []any

func (*PaymentCounter) Schema added in v0.1.21

func (m *PaymentCounter) Schema() []model.Field

func (*PaymentCounter) Validate added in v0.1.21

func (m *PaymentCounter) Validate(action byte) error

type PaymentCounterList added in v0.1.21

type PaymentCounterList []*PaymentCounter

func ReadAllPaymentCounter added in v0.1.21

func ReadAllPaymentCounter(qb *orm.QB) (PaymentCounterList, error)

func (*PaymentCounterList) Append added in v0.1.21

func (s *PaymentCounterList) Append() model.Fielder

func (*PaymentCounterList) At added in v0.1.21

func (*PaymentCounterList) DecodeFields added in v0.1.21

func (s *PaymentCounterList) DecodeFields(_ model.FieldReader)

func (*PaymentCounterList) EncodeFields added in v0.1.21

func (s *PaymentCounterList) EncodeFields(_ model.FieldWriter)

func (*PaymentCounterList) IsNil added in v0.1.21

func (s *PaymentCounterList) IsNil() bool

func (*PaymentCounterList) Len added in v0.1.21

func (s *PaymentCounterList) Len() int

type PaymentList added in v0.1.0

type PaymentList []*Payment

func ReadAllPayment added in v0.1.0

func ReadAllPayment(qb *orm.QB) (PaymentList, error)

func (*PaymentList) Append added in v0.1.0

func (s *PaymentList) Append() model.Fielder

func (*PaymentList) At added in v0.1.0

func (s *PaymentList) At(i int) model.Fielder

func (*PaymentList) DecodeFields added in v0.1.0

func (s *PaymentList) DecodeFields(_ model.FieldReader)

func (*PaymentList) EncodeFields added in v0.1.0

func (s *PaymentList) EncodeFields(_ model.FieldWriter)

func (*PaymentList) IsNil added in v0.1.0

func (s *PaymentList) IsNil() bool

func (*PaymentList) Len added in v0.1.0

func (s *PaymentList) Len() int

type PaymentStatusResult added in v0.1.0

type PaymentStatusResult struct {
	Id     string
	Status string
}

func (*PaymentStatusResult) DecodeFields added in v0.1.0

func (m *PaymentStatusResult) DecodeFields(r model.FieldReader)

func (*PaymentStatusResult) EncodeFields added in v0.1.0

func (m *PaymentStatusResult) EncodeFields(w model.FieldWriter)

func (*PaymentStatusResult) IsNil added in v0.1.0

func (m *PaymentStatusResult) IsNil() bool

func (*PaymentStatusResult) ModelName added in v0.1.0

func (m *PaymentStatusResult) ModelName() string

func (*PaymentStatusResult) Pointers added in v0.1.0

func (m *PaymentStatusResult) Pointers() []any

func (*PaymentStatusResult) Schema added in v0.1.0

func (m *PaymentStatusResult) Schema() []model.Field

func (*PaymentStatusResult) Validate added in v0.1.0

func (m *PaymentStatusResult) Validate(action byte) error

type PaymentStatusResultList added in v0.1.0

type PaymentStatusResultList []*PaymentStatusResult

func (*PaymentStatusResultList) Append added in v0.1.0

func (*PaymentStatusResultList) At added in v0.1.0

func (*PaymentStatusResultList) DecodeFields added in v0.1.0

func (s *PaymentStatusResultList) DecodeFields(_ model.FieldReader)

func (*PaymentStatusResultList) EncodeFields added in v0.1.0

func (s *PaymentStatusResultList) EncodeFields(_ model.FieldWriter)

func (*PaymentStatusResultList) IsNil added in v0.1.0

func (s *PaymentStatusResultList) IsNil() bool

func (*PaymentStatusResultList) Len added in v0.1.0

func (s *PaymentStatusResultList) Len() int

type Payout added in v0.4.0

type Payout struct {
	Fee          int64
	FeeTax       int64
	BusinessDays int
}

Payout es lo que responde el adaptador: comisión, IVA de la comisión y días hábiles hasta el depósito. El neto depositado es Amount − Fee − FeeTax.

type PayoutCharge added in v0.4.0

type PayoutCharge struct {
	Amount   int64
	Currency string
	Method   string // MethodDebit, MethodCredit o MethodCard
	Channel  string // ChannelTerminal o ChannelOnline
}

PayoutCharge es el cobro del que se pregunta el abono.

type PayoutTerms added in v0.4.0

type PayoutTerms interface {
	Payout(c PayoutCharge) (Payout, error)
}

PayoutTerms es lo que un adaptador (Terminal o Gateway) sabe de su plan contratado: cuánto descuenta el procesador y en cuántos días hábiles bancarios deposita. Es opcional: el módulo lo detecta con una aserción de tipo; sin él, un cobro con tarjeta se registra sin fecha de depósito ni comisión. Ejemplo: terms, ok := gateway.(paymentmanager.PayoutTerms)

type ReconcilePaymentsArgs added in v0.2.0

type ReconcilePaymentsArgs struct {
	TenantId string
}

func (*ReconcilePaymentsArgs) DecodeFields added in v0.2.0

func (m *ReconcilePaymentsArgs) DecodeFields(r model.FieldReader)

func (*ReconcilePaymentsArgs) EncodeFields added in v0.2.0

func (m *ReconcilePaymentsArgs) EncodeFields(w model.FieldWriter)

func (*ReconcilePaymentsArgs) IsNil added in v0.2.0

func (m *ReconcilePaymentsArgs) IsNil() bool

func (*ReconcilePaymentsArgs) ModelName added in v0.2.0

func (m *ReconcilePaymentsArgs) ModelName() string

func (*ReconcilePaymentsArgs) Pointers added in v0.2.0

func (m *ReconcilePaymentsArgs) Pointers() []any

func (*ReconcilePaymentsArgs) Schema added in v0.2.0

func (m *ReconcilePaymentsArgs) Schema() []model.Field

func (*ReconcilePaymentsArgs) Validate added in v0.2.0

func (m *ReconcilePaymentsArgs) Validate(action byte) error

type ReconcilePaymentsArgsList added in v0.2.0

type ReconcilePaymentsArgsList []*ReconcilePaymentsArgs

func (*ReconcilePaymentsArgsList) Append added in v0.2.0

func (*ReconcilePaymentsArgsList) At added in v0.2.0

func (*ReconcilePaymentsArgsList) DecodeFields added in v0.2.0

func (s *ReconcilePaymentsArgsList) DecodeFields(_ model.FieldReader)

func (*ReconcilePaymentsArgsList) EncodeFields added in v0.2.0

func (s *ReconcilePaymentsArgsList) EncodeFields(_ model.FieldWriter)

func (*ReconcilePaymentsArgsList) IsNil added in v0.2.0

func (s *ReconcilePaymentsArgsList) IsNil() bool

func (*ReconcilePaymentsArgsList) Len added in v0.2.0

func (s *ReconcilePaymentsArgsList) Len() int

type ReconcileResult added in v0.1.0

type ReconcileResult struct {
	Closed int64
}

func (*ReconcileResult) DecodeFields added in v0.1.0

func (m *ReconcileResult) DecodeFields(r model.FieldReader)

func (*ReconcileResult) EncodeFields added in v0.1.0

func (m *ReconcileResult) EncodeFields(w model.FieldWriter)

func (*ReconcileResult) IsNil added in v0.1.0

func (m *ReconcileResult) IsNil() bool

func (*ReconcileResult) ModelName added in v0.1.0

func (m *ReconcileResult) ModelName() string

func (*ReconcileResult) Pointers added in v0.1.0

func (m *ReconcileResult) Pointers() []any

func (*ReconcileResult) Schema added in v0.1.0

func (m *ReconcileResult) Schema() []model.Field

func (*ReconcileResult) Validate added in v0.1.0

func (m *ReconcileResult) Validate(action byte) error

type ReconcileResultList added in v0.1.0

type ReconcileResultList []*ReconcileResult

func (*ReconcileResultList) Append added in v0.1.0

func (s *ReconcileResultList) Append() model.Fielder

func (*ReconcileResultList) At added in v0.1.0

func (*ReconcileResultList) DecodeFields added in v0.1.0

func (s *ReconcileResultList) DecodeFields(_ model.FieldReader)

func (*ReconcileResultList) EncodeFields added in v0.1.0

func (s *ReconcileResultList) EncodeFields(_ model.FieldWriter)

func (*ReconcileResultList) IsNil added in v0.1.0

func (s *ReconcileResultList) IsNil() bool

func (*ReconcileResultList) Len added in v0.1.0

func (s *ReconcileResultList) Len() int

type Refund added in v0.1.0

type Refund struct {
	Id                string
	TenantId          string
	PaymentId         string
	Amount            int64
	Kind              string
	Method            string
	Reason            string
	AuthorizationCode string
	CreatedBy         string
	CreatedAt         time.Unix
}

func ReadOneRefund added in v0.1.0

func ReadOneRefund(qb *orm.QB, model *Refund) (*Refund, error)

func (*Refund) DecodeFields added in v0.1.0

func (m *Refund) DecodeFields(r model.FieldReader)

func (*Refund) EncodeFields added in v0.1.0

func (m *Refund) EncodeFields(w model.FieldWriter)

func (*Refund) IsNil added in v0.1.0

func (m *Refund) IsNil() bool

func (*Refund) ModelName added in v0.1.0

func (m *Refund) ModelName() string

func (*Refund) Pointers added in v0.1.0

func (m *Refund) Pointers() []any

func (*Refund) Schema added in v0.1.0

func (m *Refund) Schema() []model.Field

func (*Refund) SchemaExt added in v0.1.0

func (m *Refund) SchemaExt() []model.FieldExt

func (*Refund) Validate added in v0.1.0

func (m *Refund) Validate(action byte) error

type RefundList added in v0.1.0

type RefundList []*Refund

func ReadAllRefund added in v0.1.0

func ReadAllRefund(qb *orm.QB) (RefundList, error)

func (*RefundList) Append added in v0.1.0

func (s *RefundList) Append() model.Fielder

func (*RefundList) At added in v0.1.0

func (s *RefundList) At(i int) model.Fielder

func (*RefundList) DecodeFields added in v0.1.0

func (s *RefundList) DecodeFields(_ model.FieldReader)

func (*RefundList) EncodeFields added in v0.1.0

func (s *RefundList) EncodeFields(_ model.FieldWriter)

func (*RefundList) IsNil added in v0.1.0

func (s *RefundList) IsNil() bool

func (*RefundList) Len added in v0.1.0

func (s *RefundList) Len() int

type RefundPaymentArgs added in v0.1.0

type RefundPaymentArgs struct {
	TenantId  string
	Id        string
	PaymentId string
	Amount    int64
	Reason    string
	Method    string
	CreatedBy string
}

func (*RefundPaymentArgs) DecodeFields added in v0.1.0

func (m *RefundPaymentArgs) DecodeFields(r model.FieldReader)

func (*RefundPaymentArgs) EncodeFields added in v0.1.0

func (m *RefundPaymentArgs) EncodeFields(w model.FieldWriter)

func (*RefundPaymentArgs) IsNil added in v0.1.0

func (m *RefundPaymentArgs) IsNil() bool

func (*RefundPaymentArgs) ModelName added in v0.1.0

func (m *RefundPaymentArgs) ModelName() string

func (*RefundPaymentArgs) Pointers added in v0.1.0

func (m *RefundPaymentArgs) Pointers() []any

func (*RefundPaymentArgs) Schema added in v0.1.0

func (m *RefundPaymentArgs) Schema() []model.Field

func (*RefundPaymentArgs) Validate added in v0.1.0

func (m *RefundPaymentArgs) Validate(action byte) error

type RefundPaymentArgsList added in v0.1.0

type RefundPaymentArgsList []*RefundPaymentArgs

func (*RefundPaymentArgsList) Append added in v0.1.0

func (s *RefundPaymentArgsList) Append() model.Fielder

func (*RefundPaymentArgsList) At added in v0.1.0

func (*RefundPaymentArgsList) DecodeFields added in v0.1.0

func (s *RefundPaymentArgsList) DecodeFields(_ model.FieldReader)

func (*RefundPaymentArgsList) EncodeFields added in v0.1.0

func (s *RefundPaymentArgsList) EncodeFields(_ model.FieldWriter)

func (*RefundPaymentArgsList) IsNil added in v0.1.0

func (s *RefundPaymentArgsList) IsNil() bool

func (*RefundPaymentArgsList) Len added in v0.1.0

func (s *RefundPaymentArgsList) Len() int

type StartOnlinePaymentArgs added in v0.1.0

type StartOnlinePaymentArgs struct {
	TenantId        string
	Id              string
	ReferenceModule string
	ReferenceId     string
	ReturnTo        string
	PayerName       string
	PayerEmail      string
	PayerPhone      string
	CreatedBy       string
}

func (*StartOnlinePaymentArgs) DecodeFields added in v0.1.0

func (m *StartOnlinePaymentArgs) DecodeFields(r model.FieldReader)

func (*StartOnlinePaymentArgs) EncodeFields added in v0.1.0

func (m *StartOnlinePaymentArgs) EncodeFields(w model.FieldWriter)

func (*StartOnlinePaymentArgs) IsNil added in v0.1.0

func (m *StartOnlinePaymentArgs) IsNil() bool

func (*StartOnlinePaymentArgs) ModelName added in v0.1.0

func (m *StartOnlinePaymentArgs) ModelName() string

func (*StartOnlinePaymentArgs) Pointers added in v0.1.0

func (m *StartOnlinePaymentArgs) Pointers() []any

func (*StartOnlinePaymentArgs) Schema added in v0.1.0

func (m *StartOnlinePaymentArgs) Schema() []model.Field

func (*StartOnlinePaymentArgs) Validate added in v0.1.0

func (m *StartOnlinePaymentArgs) Validate(action byte) error

type StartOnlinePaymentArgsList added in v0.1.0

type StartOnlinePaymentArgsList []*StartOnlinePaymentArgs

func (*StartOnlinePaymentArgsList) Append added in v0.1.0

func (*StartOnlinePaymentArgsList) At added in v0.1.0

func (*StartOnlinePaymentArgsList) DecodeFields added in v0.1.0

func (s *StartOnlinePaymentArgsList) DecodeFields(_ model.FieldReader)

func (*StartOnlinePaymentArgsList) EncodeFields added in v0.1.0

func (s *StartOnlinePaymentArgsList) EncodeFields(_ model.FieldWriter)

func (*StartOnlinePaymentArgsList) IsNil added in v0.1.0

func (s *StartOnlinePaymentArgsList) IsNil() bool

func (*StartOnlinePaymentArgsList) Len added in v0.1.0

type StartOnlinePaymentResult added in v0.1.0

type StartOnlinePaymentResult struct {
	PaymentId   string
	RedirectUrl string
	Token       string
	TokenField  string
}

func (*StartOnlinePaymentResult) DecodeFields added in v0.1.0

func (m *StartOnlinePaymentResult) DecodeFields(r model.FieldReader)

func (*StartOnlinePaymentResult) EncodeFields added in v0.1.0

func (m *StartOnlinePaymentResult) EncodeFields(w model.FieldWriter)

func (*StartOnlinePaymentResult) IsNil added in v0.1.0

func (m *StartOnlinePaymentResult) IsNil() bool

func (*StartOnlinePaymentResult) ModelName added in v0.1.0

func (m *StartOnlinePaymentResult) ModelName() string

func (*StartOnlinePaymentResult) Pointers added in v0.1.0

func (m *StartOnlinePaymentResult) Pointers() []any

func (*StartOnlinePaymentResult) Schema added in v0.1.0

func (m *StartOnlinePaymentResult) Schema() []model.Field

func (*StartOnlinePaymentResult) Validate added in v0.1.0

func (m *StartOnlinePaymentResult) Validate(action byte) error

type StartOnlinePaymentResultList added in v0.1.0

type StartOnlinePaymentResultList []*StartOnlinePaymentResult

func (*StartOnlinePaymentResultList) Append added in v0.1.0

func (*StartOnlinePaymentResultList) At added in v0.1.0

func (*StartOnlinePaymentResultList) DecodeFields added in v0.1.0

func (s *StartOnlinePaymentResultList) DecodeFields(_ model.FieldReader)

func (*StartOnlinePaymentResultList) EncodeFields added in v0.1.0

func (s *StartOnlinePaymentResultList) EncodeFields(_ model.FieldWriter)

func (*StartOnlinePaymentResultList) IsNil added in v0.1.0

func (*StartOnlinePaymentResultList) Len added in v0.1.0

type StartTerminalPaymentArgs added in v0.2.0

type StartTerminalPaymentArgs struct {
	TenantId        string
	Id              string
	ReferenceModule string
	ReferenceId     string
	Method          string
	CreatedBy       string
}

func (*StartTerminalPaymentArgs) DecodeFields added in v0.2.0

func (m *StartTerminalPaymentArgs) DecodeFields(r model.FieldReader)

func (*StartTerminalPaymentArgs) EncodeFields added in v0.2.0

func (m *StartTerminalPaymentArgs) EncodeFields(w model.FieldWriter)

func (*StartTerminalPaymentArgs) IsNil added in v0.2.0

func (m *StartTerminalPaymentArgs) IsNil() bool

func (*StartTerminalPaymentArgs) ModelName added in v0.2.0

func (m *StartTerminalPaymentArgs) ModelName() string

func (*StartTerminalPaymentArgs) Pointers added in v0.2.0

func (m *StartTerminalPaymentArgs) Pointers() []any

func (*StartTerminalPaymentArgs) Schema added in v0.2.0

func (m *StartTerminalPaymentArgs) Schema() []model.Field

func (*StartTerminalPaymentArgs) Validate added in v0.2.0

func (m *StartTerminalPaymentArgs) Validate(action byte) error

type StartTerminalPaymentArgsList added in v0.2.0

type StartTerminalPaymentArgsList []*StartTerminalPaymentArgs

func (*StartTerminalPaymentArgsList) Append added in v0.2.0

func (*StartTerminalPaymentArgsList) At added in v0.2.0

func (*StartTerminalPaymentArgsList) DecodeFields added in v0.2.0

func (s *StartTerminalPaymentArgsList) DecodeFields(_ model.FieldReader)

func (*StartTerminalPaymentArgsList) EncodeFields added in v0.2.0

func (s *StartTerminalPaymentArgsList) EncodeFields(_ model.FieldWriter)

func (*StartTerminalPaymentArgsList) IsNil added in v0.2.0

func (*StartTerminalPaymentArgsList) Len added in v0.2.0

type Terminal added in v0.2.0

type Terminal interface {
	Provider() string                              // nombre del procesador; se guarda en cada pago ("tuu")
	Push(req TerminalPush) (TerminalPushed, error) // envía el monto a la máquina; idempotente por RequestId
	Status(token string) (TerminalResult, error)   // estado del cobro en la máquina
}

Terminal es la máquina de cobro con tarjeta de una caja. La implementación concreta (por ejemplo github.com/veltylabs/tuu) la inyecta la app; sus llamadas son síncronas y solo corren en el servidor.

type TerminalPush added in v0.2.0

type TerminalPush struct {
	RequestId   string // = Payment.Id; la máquina lo usa como llave de idempotencia
	Device      string // id de la máquina en el procesador (TUU: número de serie)
	Amount      int64
	Currency    string
	Method      string // MethodDebit | MethodCredit
	Description string // texto corto que muestra la máquina; puede ir vacío
}

type TerminalPushed added in v0.2.0

type TerminalPushed struct {
	Token string // id del cobro en el procesador; se guarda en Payment.ProviderToken
}

type TerminalResult added in v0.2.0

type TerminalResult struct {
	Outcome           string // OutcomePending | OutcomeAuthorized | OutcomeRejected | OutcomeCancelled
	Amount            int64
	AuthorizationCode string
	CardLast4         string
}

Directories

Path Synopsis
Package migrate crea y actualiza el esquema de payment_manager.
Package migrate crea y actualiza el esquema de payment_manager.
Package sandbox es una pasarela de pago en memoria que implementa paymentmanager.Gateway.
Package sandbox es una pasarela de pago en memoria que implementa paymentmanager.Gateway.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL