e2cf486fcb
Purchase collects a payment from user using the specified price, description, and payment method. This is implemented at the lower layers using the payments.Invoices interface. There are also additions to stripecoinpayments stripemock to simulate errors returned from stripe invoices New and Pay. If an invoice exists with the same description, if it is a draft, it is deleted and a new one is created and paid. If it is open, pay it and don't create a new one. Change-Id: Ic3147434bc44a0777ecbedb3a4ed4c768eb02ea3
64 lines
2.2 KiB
Go
64 lines
2.2 KiB
Go
// Copyright (C) 2019 Storj Labs, Inc.
|
|
// See LICENSE for copying information.
|
|
|
|
package payments
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"storj.io/common/uuid"
|
|
)
|
|
|
|
const (
|
|
// InvoiceStatusDraft indicates the invoice is a draft.
|
|
InvoiceStatusDraft = "draft"
|
|
// InvoiceStatusOpen indicates the invoice is open.
|
|
InvoiceStatusOpen = "open"
|
|
// InvoiceStatusPaid indicates the invoice is paid.
|
|
InvoiceStatusPaid = "paid"
|
|
// InvoiceStatusUncollectible indicates the invoice is uncollectible.
|
|
InvoiceStatusUncollectible = "uncollectible"
|
|
// InvoiceStatusVoid indicates the invoice is void.
|
|
InvoiceStatusVoid = "void"
|
|
)
|
|
|
|
// Invoices exposes all needed functionality to manage account invoices.
|
|
//
|
|
// architecture: Service
|
|
type Invoices interface {
|
|
// Create creates an invoice with price and description.
|
|
Create(ctx context.Context, userID uuid.UUID, price int64, desc string) (*Invoice, error)
|
|
// Pay pays an invoice.
|
|
Pay(ctx context.Context, invoiceID, paymentMethodID string) (*Invoice, error)
|
|
// List returns a list of invoices for a given payment account.
|
|
List(ctx context.Context, userID uuid.UUID) ([]Invoice, error)
|
|
// ListWithDiscounts returns a list of invoices and coupon usages for a given payment account.
|
|
ListWithDiscounts(ctx context.Context, userID uuid.UUID) ([]Invoice, []CouponUsage, error)
|
|
// CheckPendingItems returns if pending invoice items for a given payment account exist.
|
|
CheckPendingItems(ctx context.Context, userID uuid.UUID) (existingItems bool, err error)
|
|
// AttemptPayOverdueInvoices attempts to pay a user's open, overdue invoices.
|
|
AttemptPayOverdueInvoices(ctx context.Context, userID uuid.UUID) (err error)
|
|
// Delete a draft invoice.
|
|
Delete(ctx context.Context, id string) (inv *Invoice, err error)
|
|
}
|
|
|
|
// Invoice holds all public information about invoice.
|
|
type Invoice struct {
|
|
ID string `json:"id"`
|
|
Description string `json:"description"`
|
|
Amount int64 `json:"amount"`
|
|
Status string `json:"status"`
|
|
Link string `json:"link"`
|
|
Start time.Time `json:"start"`
|
|
End time.Time `json:"end"`
|
|
}
|
|
|
|
// CouponUsage describes the usage of a coupon on an invoice.
|
|
type CouponUsage struct {
|
|
Coupon Coupon
|
|
Amount int64
|
|
PeriodStart time.Time
|
|
PeriodEnd time.Time
|
|
}
|