ticketing

package
v0.0.0-...-96123f1 Latest Latest
Warning

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

Go to latest
Published: Nov 20, 2020 License: MIT Imports: 12 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func CoverCredit

func CoverCredit(store PurchaseStore,
	existingPayment *ClaimPayment,
	payments []FinancialInstrument) error

CoverCredit adds funds to a payment to cover for receivables.

func DebtBalanced

func DebtBalanced(payments ...FinancialInstrument) (bool, int64)

DebtBalanced returns true if all cretid notes or similar instruments have been covered or an amount if not.

func PaymentBalanced

func PaymentBalanced(amount int64, payments ...FinancialInstrument) (bool, int64)

PaymentBalanced returns true or false depending on balancing status and missing payment amount if any.

func TransferClaims

func TransferClaims(storer PurchaseStore,
	source, target *Attendee, claims []SlotClaim) (*Attendee, *Attendee, error)

TransferClaims transfer claims from one user the the other, assuming they belong to the first.

Types

type AssetType

type AssetType string

AssetType is a type of accounting asset.

const (
	// ATCash in this context means it is money, like a stripe payment
	ATCash AssetType = "cash"
	// ATReceivable in this context means it is a promise of payment
	ATReceivable AssetType = "receivable"
	// ATDiscount in this context means an issued discount (represented as a fixed amount for
	// accounting's sake)
	ATDiscount AssetType = "discount"
)

type Attendee

type Attendee struct {
	ID    uint64 `gaum:"field_name:id"`
	Email string `gaum:"field_name:email"`
	// CoCAccepted, claims cannot be used without this.
	CoCAccepted bool `gaum:"field_name:co_c_accepted"`
	Claims      []SlotClaim
}

Attendee is a person attending one or more Slots of the Conference.

type ClaimPayment

type ClaimPayment struct {
	ID uint64 `gaum:"field_name:id"`
	// ClaimsPayed would be what in a bill one see as detail.
	ClaimsPayed []*SlotClaim
	Payment     []FinancialInstrument
	Invoice     string `gaum:"field_name:invoice"` // let us fill this once we know how to invoice
}

ClaimPayment represents a payment for N claims

func PayClaims

func PayClaims(store PurchaseStore,
	attendee *Attendee, claims []SlotClaim,
	payments []FinancialInstrument) (*ClaimPayment, error)

PayClaims assigns payments and/or credits to a set of claims.

func (*ClaimPayment) Fulfilled

func (c *ClaimPayment) Fulfilled() bool

Fulfilled returns true if the payment of this invoice has been fulfilled

func (*ClaimPayment) TotalDue

func (c *ClaimPayment) TotalDue() int64

TotalDue returns the total cost to cover by this payment.

type ErrInvalidCurrency

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

ErrInvalidCurrency should be returned when paying with the wrong kind of instrument for instance covering credit with credit.

func (*ErrInvalidCurrency) Error

func (e *ErrInvalidCurrency) Error() string

type EventSlot

type EventSlot struct {
	ID          uint64     `gaum:"field_name:id"`
	Event       *def.Event `gaum:"field_name:event"`
	Name        string     `gaum:"field_name:name"`
	Description string     `gaum:"field_name:description"`
	Cost        int64      `gaum:"field_name:cost"`
	Capacity    int        `gaum:"field_name:capacity"`   // int should be enough even if we organize glastonbury
	StartDate   uint64     `gaum:"field_name:start_date"` // StartDate is Unix timestamp, seconds since Epoch (1/1/1970 UTC)
	EndDate     uint64     `gaum:"field_name:end_date"`   // EndDate is Unix timestamp, seconds since Epoch (1/1/1970 UTC)
	// DependsOn means that these two Slots need to be acquired together, user must either buy
	// both Slots or pre-own one of the one it depends on.
	DependsOn *EventSlot
	// PurchaseableFrom indicates when this item is on sale, for instance early bird tickets are the first
	// ones to go on sale.
	PurchaseableFrom uint64 `gaum:"field_name:purchaseable_from"` // PurchaseableFrom is Unix timestamp, seconds since Epoch (1/1/1970 UTC)
	// PuchaseableUntil indicates when this item stops being on sale, for instance early bird tickets can
	// no loger be purchased N months before event.
	PurchaseableUntil uint64 `gaum:"field_name:purchaseable_until"` // PurchaseableUntil is Unix timestamp, seconds since Epoch (1/1/1970 UTC)
	// AvailableToPublic indicates is this is something that will appear on the tickets purchase page (ie, we can
	// issue sponsor tickets and those cannot be bought individually)
	AvailableToPublic bool `gaum:"field_name:available_to_public"`
}

EventSlot holds information for any sellable/giftable slot we have in the event for a Talk or any other activity that requires admission.

type FinancialInstrument

type FinancialInstrument interface {
	// Total is the total amount fulfilled by this instrument
	Total() int64
	// Type is the type of asset represented
	Type() AssetType
}

FinancialInstrument represents any kind of instrument used to cover a debt. oto: "skip"

type PaymentMethodConferenceDiscount

type PaymentMethodConferenceDiscount struct {
	ID uint64 `gaum:"field_name:id"`
	// Detail describes what kind of discount was issued (ie 100% sponsor, 30% grant)
	Detail string `gaum:"field_name:detail"`
	Amount int64  `gaum:"field_name:amount"` // Money is handled in ints to ease use of OTO, do not divide
}

PaymentMethodConferenceDiscount represents a discount issued by the event.

func (*PaymentMethodConferenceDiscount) Total

Total implements FinancialInstrument

func (*PaymentMethodConferenceDiscount) Type

Type implements FinancialInstrument

type PaymentMethodCreditNote

type PaymentMethodCreditNote struct {
	ID     uint64 `gaum:"field_name:id"`
	Detail string `gaum:"field_name:detail"`
	Amount int64  `gaum:"field_name:amount"` // Money is handled in ints to ease use of OTO, do not divide
}

PaymentMethodCreditNote represents credit extended to defer payment.

func (*PaymentMethodCreditNote) Total

func (p *PaymentMethodCreditNote) Total() int64

Total implements FinancialInstrument

func (*PaymentMethodCreditNote) Type

Type implements FinancialInstrument

type PaymentMethodMoney

type PaymentMethodMoney struct {
	ID         uint64 `gaum:"field_name:id"`
	PaymentRef string `gaum:"field_name:ref"`    // stripe payment ID/Log?
	Amount     int64  `gaum:"field_name:amount"` // Money is handled in ints to ease use of OTO, do not divide
}

PaymentMethodMoney represents a payment in cash.

func (*PaymentMethodMoney) Total

func (p *PaymentMethodMoney) Total() int64

Total implements FinancialInstrument

func (*PaymentMethodMoney) Type

func (p *PaymentMethodMoney) Type() AssetType

Type implements FinancialInstrument

type PurchaseStore

type PurchaseStore interface {
	// AtomicOperation returns a store which will act as one single atomic operation.
	// It returns a commit and cancel functions and the Store .
	AtomicOperation() (func() error, func() error, PurchaseStore, error)
	// CreateSlotClaim saves a slot claim and returns it with the populated ID
	CreateSlotClaim(*SlotClaim) (*SlotClaim, error)

	// UpdateAttendee saves the passed attendee attributes on top of the existing one.
	UpdateAttendee(*Attendee) (*Attendee, error)

	CreateClaimPayment(*ClaimPayment) (*ClaimPayment, error)

	UpdateClaimPayment(*ClaimPayment) (*ClaimPayment, error)
	ChangeSlotClaimOwner([]SlotClaim, *Attendee, *Attendee) (*Attendee, *Attendee, error)

	CreateAttendee(a *Attendee) (*Attendee, error)
	ReadAttendeeByEmail(email string) (*Attendee, error)
	ReadAttendeeByID(id uint64) (*Attendee, error)
	CreateEventSlot(e *EventSlot) (*EventSlot, error)
	ReadEventSlotByID(id uint64) (*EventSlot, error)
	UpdateEventSlot(e *EventSlot) error
}

PurchaseStore offers functionality for persistence of ticketing models.

type SQLStorage

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

SQLStorage provides a Postgres Flavored storage backend to store ticketing information.

func NewSQLStorage

func NewSQLStorage(connectionString string, logger *log.Logger) (*SQLStorage, error)

NewSQLStorage returns a new Storage connected to the postgres-like db indicated by the connectionString.

func NewSQLStorageFromConnection

func NewSQLStorageFromConnection(conn connection.DB) *SQLStorage

NewSQLStorageFromConnection returns a new SQLStorage using the passed connection

func (*SQLStorage) AtomicOperation

func (s *SQLStorage) AtomicOperation() (func() error, func() error, PurchaseStore, error)

AtomicOperation begins a transaction and returns commit and rollback functions along with a new SQLStorage wrapping the tx

func (*SQLStorage) ChangeSlotClaimOwner

func (s *SQLStorage) ChangeSlotClaimOwner(slots []SlotClaim, source *Attendee, target *Attendee) (*Attendee, *Attendee, error)

ChangeSlotClaimOwner changes the passed claims owner from source to target

func (*SQLStorage) CreateAttendee

func (s *SQLStorage) CreateAttendee(a *Attendee) (*Attendee, error)

CreateAttendee creates a new attendee in the database and returns it.

func (*SQLStorage) CreateClaimPayment

func (s *SQLStorage) CreateClaimPayment(c *ClaimPayment) (*ClaimPayment, error)

CreateClaimPayment Creates c ClaimPayment record and asociates it with all the relevant payments.

func (*SQLStorage) CreateEventSlot

func (s *SQLStorage) CreateEventSlot(e *EventSlot) (*EventSlot, error)

CreateEventSlot saves a slot in the database.

func (*SQLStorage) CreateSlotClaim

func (s *SQLStorage) CreateSlotClaim(slotClaim *SlotClaim) (*SlotClaim, error)

CreateSlotClaim saves a slot claim and returns it with the populated ID

func (*SQLStorage) ReadAttendeeByEmail

func (s *SQLStorage) ReadAttendeeByEmail(email string) (*Attendee, error)

ReadAttendeeByEmail returns an attendee for that email if one exists.

func (*SQLStorage) ReadAttendeeByID

func (s *SQLStorage) ReadAttendeeByID(id uint64) (*Attendee, error)

ReadAttendeeByID returns an attendee for the given ID if one exists.

func (*SQLStorage) ReadEventSlotByID

func (s *SQLStorage) ReadEventSlotByID(id uint64) (*EventSlot, error)

ReadEventSlotByID returns an event slot identified by the passed ID.

func (*SQLStorage) UpdateAttendee

func (s *SQLStorage) UpdateAttendee(attendee *Attendee) (*Attendee, error)

UpdateAttendee saves the passed attendee attributes on top of the existing one.

func (*SQLStorage) UpdateClaimPayment

func (s *SQLStorage) UpdateClaimPayment(c *ClaimPayment) (*ClaimPayment, error)

UpdateClaimPayment saves the invoice and payments of this claim payment assuming it exists

func (*SQLStorage) UpdateEventSlot

func (s *SQLStorage) UpdateEventSlot(e *EventSlot) error

UpdateEventSlot updates event slot fields from the passed instance

type SlotClaim

type SlotClaim struct {
	ID        uint64 `gaum:"field_name:id"`
	EventSlot *EventSlot
	// TicketID should only be valid when combined with the correct Attendee ID/Email
	TicketID string `gaum:"field_name:ticket_id"` // uuid
	// Redeemed represents whether this has been used (ie the Attendee enrolled in front desk
	// or into the online conf system) until this is not true, transfer/refund might be possible.
	Redeemed bool `gaum:"field_name:redeemed"`
}

SlotClaim represents one occupancy of one slot.

func ClaimSlots

func ClaimSlots(storer PurchaseStore,
	attendee *Attendee, slots ...EventSlot) ([]SlotClaim, error)

ClaimSlots claims N slots for an attendee.

Jump to

Keyboard shortcuts

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