| package transactions |
|
|
| import ( |
| "fmt" |
|
|
| "github.com/openmeterio/openmeter/openmeter/ledger" |
| ) |
|
|
| type TransactionTemplateCode string |
|
|
| const ( |
| TemplateCodeIssueCustomerReceivable TransactionTemplateCode = "customer.receivable.issue" |
| TemplateCodeAuthorizeCustomerReceivablePayment TransactionTemplateCode = "customer.receivable.payment.authorize" |
| TemplateCodeSettleCustomerReceivableFromPayment TransactionTemplateCode = "customer.receivable.payment.settle" |
| TemplateCodeAttributeCustomerAdvanceReceivableCostBasis TransactionTemplateCode = "customer.receivable.advance.attribute" |
| TemplateCodeCoverCustomerReceivable TransactionTemplateCode = "customer.receivable.cover" |
| TemplateCodeTransferCustomerFBOToAccrued TransactionTemplateCode = "customer.fbo.collect" |
| TemplateCodeTransferCustomerFBOAdvanceToAccrued TransactionTemplateCode = "customer.fbo.advance.collect" |
| TemplateCodeTransferCustomerReceivableToAccrued TransactionTemplateCode = "customer.receivable.collect" |
| TemplateCodeTranslateCustomerAccruedCostBasis TransactionTemplateCode = "customer.accrued.cost_basis.translate" |
| TemplateCodeRecognizeEarningsFromAttributableAccrued TransactionTemplateCode = "customer.accrued.earnings.recognize" |
| TemplateCodeConvertCurrency TransactionTemplateCode = "customer.fbo.currency.convert" |
| TemplateCodePlanCustomerFBOBreakage TransactionTemplateCode = "customer.fbo.breakage.plan" |
| TemplateCodeReleaseCustomerFBOBreakage TransactionTemplateCode = "customer.fbo.breakage.release" |
| TemplateCodeReopenCustomerFBOBreakage TransactionTemplateCode = "customer.fbo.breakage.reopen" |
| ) |
|
|
| const ( |
| legacyTemplateNameIssueCustomerReceivable = "IssueCustomerReceivableTemplate" |
| legacyTemplateNameFundCustomerReceivable = "FundCustomerReceivableTemplate" |
| legacyTemplateNameSettleCustomerReceivablePayment = "SettleCustomerReceivablePaymentTemplate" |
| legacyTemplateNameAuthorizeCustomerReceivablePayment = "AuthorizeCustomerReceivablePaymentTemplate" |
| legacyTemplateNameSettleCustomerReceivableFromPayment = "SettleCustomerReceivableFromPaymentTemplate" |
| legacyTemplateNameAttributeCustomerAdvanceReceivableCostBasis = "AttributeCustomerAdvanceReceivableCostBasisTemplate" |
| legacyTemplateNameCoverCustomerReceivable = "CoverCustomerReceivableTemplate" |
| legacyTemplateNameTransferCustomerFBOToAccrued = "TransferCustomerFBOToAccruedTemplate" |
| legacyTemplateNameTransferCustomerFBOAdvanceToAccrued = "TransferCustomerFBOAdvanceToAccruedTemplate" |
| legacyTemplateNameTransferCustomerReceivableToAccrued = "TransferCustomerReceivableToAccruedTemplate" |
| legacyTemplateNameTranslateCustomerAccruedCostBasis = "TranslateCustomerAccruedCostBasisTemplate" |
| legacyTemplateNameRecognizeEarningsFromAttributableAccrued = "RecognizeEarningsFromAttributableAccruedTemplate" |
| legacyTemplateNameConvertCurrency = "ConvertCurrencyTemplate" |
| legacyTemplateNamePlanCustomerFBOBreakage = "PlanCustomerFBOBreakageTemplate" |
| legacyTemplateNameReleaseCustomerFBOBreakage = "ReleaseCustomerFBOBreakageTemplate" |
| legacyTemplateNameReopenCustomerFBOBreakage = "ReopenCustomerFBOBreakageTemplate" |
| ) |
|
|
| var transactionTemplatesByLegacyName = map[string]TransactionTemplate{ |
| legacyTemplateNameIssueCustomerReceivable: IssueCustomerReceivableTemplate{}, |
| legacyTemplateNameFundCustomerReceivable: legacyFundCustomerReceivableTemplate{}, |
| legacyTemplateNameSettleCustomerReceivablePayment: legacySettleCustomerReceivablePaymentTemplate{}, |
| legacyTemplateNameAuthorizeCustomerReceivablePayment: AuthorizeCustomerReceivablePaymentTemplate{}, |
| legacyTemplateNameSettleCustomerReceivableFromPayment: SettleCustomerReceivableFromPaymentTemplate{}, |
| legacyTemplateNameAttributeCustomerAdvanceReceivableCostBasis: AttributeCustomerAdvanceReceivableCostBasisTemplate{}, |
| legacyTemplateNameCoverCustomerReceivable: CoverCustomerReceivableTemplate{}, |
| legacyTemplateNameTransferCustomerFBOToAccrued: TransferCustomerFBOToAccruedTemplate{}, |
| legacyTemplateNameTransferCustomerFBOAdvanceToAccrued: TransferCustomerFBOAdvanceToAccruedTemplate{}, |
| legacyTemplateNameTransferCustomerReceivableToAccrued: TransferCustomerReceivableToAccruedTemplate{}, |
| legacyTemplateNameTranslateCustomerAccruedCostBasis: TranslateCustomerAccruedCostBasisTemplate{}, |
| legacyTemplateNameRecognizeEarningsFromAttributableAccrued: RecognizeEarningsFromAttributableAccruedTemplate{}, |
| legacyTemplateNameConvertCurrency: ConvertCurrencyTemplate{}, |
| legacyTemplateNamePlanCustomerFBOBreakage: PlanCustomerFBOBreakageTemplate{}, |
| legacyTemplateNameReleaseCustomerFBOBreakage: ReleaseCustomerFBOBreakageTemplate{}, |
| legacyTemplateNameReopenCustomerFBOBreakage: ReopenCustomerFBOBreakageTemplate{}, |
| } |
|
|
| var transactionTemplatesByCode = map[TransactionTemplateCode]TransactionTemplate{ |
| IssueCustomerReceivableTemplate{}.code(): IssueCustomerReceivableTemplate{}, |
| AuthorizeCustomerReceivablePaymentTemplate{}.code(): AuthorizeCustomerReceivablePaymentTemplate{}, |
| SettleCustomerReceivableFromPaymentTemplate{}.code(): SettleCustomerReceivableFromPaymentTemplate{}, |
| AttributeCustomerAdvanceReceivableCostBasisTemplate{}.code(): AttributeCustomerAdvanceReceivableCostBasisTemplate{}, |
| CoverCustomerReceivableTemplate{}.code(): CoverCustomerReceivableTemplate{}, |
| TransferCustomerFBOToAccruedTemplate{}.code(): TransferCustomerFBOToAccruedTemplate{}, |
| TransferCustomerFBOAdvanceToAccruedTemplate{}.code(): TransferCustomerFBOAdvanceToAccruedTemplate{}, |
| TransferCustomerReceivableToAccruedTemplate{}.code(): TransferCustomerReceivableToAccruedTemplate{}, |
| TranslateCustomerAccruedCostBasisTemplate{}.code(): TranslateCustomerAccruedCostBasisTemplate{}, |
| RecognizeEarningsFromAttributableAccruedTemplate{}.code(): RecognizeEarningsFromAttributableAccruedTemplate{}, |
| ConvertCurrencyTemplate{}.code(): ConvertCurrencyTemplate{}, |
| PlanCustomerFBOBreakageTemplate{}.code(): PlanCustomerFBOBreakageTemplate{}, |
| ReleaseCustomerFBOBreakageTemplate{}.code(): ReleaseCustomerFBOBreakageTemplate{}, |
| ReopenCustomerFBOBreakageTemplate{}.code(): ReopenCustomerFBOBreakageTemplate{}, |
| } |
|
|
| func templateCode(template TransactionTemplate) (TransactionTemplateCode, error) { |
| code := template.code() |
| if code == "" { |
| return "", fmt.Errorf("unknown transaction template code for %T", template) |
| } |
|
|
| return code, nil |
| } |
|
|
| func transactionTemplateByCode(code string) (TransactionTemplate, error) { |
| template, ok := transactionTemplatesByCode[TransactionTemplateCode(code)] |
| if !ok { |
| return nil, fmt.Errorf("unknown correction template code %q", code) |
| } |
|
|
| return template, nil |
| } |
|
|
| func transactionTemplateByLegacyName(name string) (TransactionTemplate, error) { |
| template, ok := transactionTemplatesByLegacyName[name] |
| if !ok { |
| return nil, fmt.Errorf("unknown correction template name %q", name) |
| } |
|
|
| return template, nil |
| } |
|
|
| func TemplateCode(template TransactionTemplate) string { |
| code, err := templateCode(template) |
| if err != nil { |
| panic(err) |
| } |
|
|
| return string(code) |
| } |
|
|
| func annotateTemplateTransaction(input ledger.TransactionInput, template TransactionTemplate, direction ledger.TransactionDirection) (ledger.TransactionInput, error) { |
| code, err := templateCode(template) |
| if err != nil { |
| return nil, err |
| } |
|
|
| return WithAnnotations(input, ledger.TransactionAnnotations(string(code), direction)), nil |
| } |
|
|
| func appendResolvedTemplateTransaction( |
| inputs []ledger.TransactionInput, |
| input ledger.TransactionInput, |
| template TransactionTemplate, |
| direction ledger.TransactionDirection, |
| ) ([]ledger.TransactionInput, error) { |
| if input == nil { |
| return inputs, nil |
| } |
|
|
| annotated, err := annotateTemplateTransaction(input, template, direction) |
| if err != nil { |
| return nil, err |
| } |
|
|
| return append(inputs, annotated), nil |
| } |
|
|