102 lines
3.3 KiB
Go
102 lines
3.3 KiB
Go
package economics
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/tech/sendico/pkg/merrors"
|
|
paymentv1 "github.com/tech/sendico/pkg/proto/common/payment/v1"
|
|
quotationv2 "github.com/tech/sendico/pkg/proto/payments/quotation/v2"
|
|
)
|
|
|
|
const (
|
|
SettlementModeValueFixSource = "fix_source"
|
|
SettlementModeValueFixReceived = "fix_received"
|
|
|
|
FeeTreatmentValueAddToSource = "add_to_source"
|
|
FeeTreatmentValueDeductFromDestination = "deduct_from_destination"
|
|
)
|
|
|
|
func DefaultSettlementMode() paymentv1.SettlementMode {
|
|
return paymentv1.SettlementMode_SETTLEMENT_FIX_SOURCE
|
|
}
|
|
|
|
func DefaultFeeTreatment() quotationv2.FeeTreatment {
|
|
return quotationv2.FeeTreatment_FEE_TREATMENT_ADD_TO_SOURCE
|
|
}
|
|
|
|
func IsValidSettlementMode(mode paymentv1.SettlementMode) bool {
|
|
switch mode {
|
|
case paymentv1.SettlementMode_SETTLEMENT_UNSPECIFIED,
|
|
paymentv1.SettlementMode_SETTLEMENT_FIX_SOURCE,
|
|
paymentv1.SettlementMode_SETTLEMENT_FIX_RECEIVED:
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
func IsValidFeeTreatment(value quotationv2.FeeTreatment) bool {
|
|
switch value {
|
|
case quotationv2.FeeTreatment_FEE_TREATMENT_UNSPECIFIED,
|
|
quotationv2.FeeTreatment_FEE_TREATMENT_ADD_TO_SOURCE,
|
|
quotationv2.FeeTreatment_FEE_TREATMENT_DEDUCT_FROM_DESTINATION:
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
func ResolveSettlementAndFee(
|
|
mode paymentv1.SettlementMode,
|
|
feeTreatment quotationv2.FeeTreatment,
|
|
) (paymentv1.SettlementMode, quotationv2.FeeTreatment, error) {
|
|
if !IsValidSettlementMode(mode) {
|
|
return paymentv1.SettlementMode_SETTLEMENT_UNSPECIFIED, quotationv2.FeeTreatment_FEE_TREATMENT_UNSPECIFIED, merrors.InvalidArgument("settlement_mode is invalid")
|
|
}
|
|
if !IsValidFeeTreatment(feeTreatment) {
|
|
return paymentv1.SettlementMode_SETTLEMENT_UNSPECIFIED, quotationv2.FeeTreatment_FEE_TREATMENT_UNSPECIFIED, merrors.InvalidArgument("fee_treatment is invalid")
|
|
}
|
|
|
|
resolvedMode := mode
|
|
if resolvedMode == paymentv1.SettlementMode_SETTLEMENT_UNSPECIFIED {
|
|
resolvedMode = DefaultSettlementMode()
|
|
}
|
|
resolvedFee := feeTreatment
|
|
if resolvedFee == quotationv2.FeeTreatment_FEE_TREATMENT_UNSPECIFIED {
|
|
resolvedFee = DefaultFeeTreatment()
|
|
}
|
|
return resolvedMode, resolvedFee, nil
|
|
}
|
|
|
|
func FeeTreatmentFromString(value string) (quotationv2.FeeTreatment, bool) {
|
|
switch strings.ToLower(strings.TrimSpace(value)) {
|
|
case "", "unspecified", "fee_treatment_unspecified":
|
|
return quotationv2.FeeTreatment_FEE_TREATMENT_UNSPECIFIED, true
|
|
case FeeTreatmentValueAddToSource, "fee_treatment_add_to_source":
|
|
return quotationv2.FeeTreatment_FEE_TREATMENT_ADD_TO_SOURCE, true
|
|
case FeeTreatmentValueDeductFromDestination, "fee_treatment_deduct_from_destination":
|
|
return quotationv2.FeeTreatment_FEE_TREATMENT_DEDUCT_FROM_DESTINATION, true
|
|
default:
|
|
return quotationv2.FeeTreatment_FEE_TREATMENT_UNSPECIFIED, false
|
|
}
|
|
}
|
|
|
|
func ResolveFeeTreatmentFromStringOrDefault(value string) quotationv2.FeeTreatment {
|
|
parsed, ok := FeeTreatmentFromString(value)
|
|
if !ok || parsed == quotationv2.FeeTreatment_FEE_TREATMENT_UNSPECIFIED {
|
|
return DefaultFeeTreatment()
|
|
}
|
|
return parsed
|
|
}
|
|
|
|
func FeeTreatmentValue(value quotationv2.FeeTreatment) string {
|
|
switch value {
|
|
case quotationv2.FeeTreatment_FEE_TREATMENT_DEDUCT_FROM_DESTINATION:
|
|
return FeeTreatmentValueDeductFromDestination
|
|
case quotationv2.FeeTreatment_FEE_TREATMENT_ADD_TO_SOURCE:
|
|
return FeeTreatmentValueAddToSource
|
|
default:
|
|
return ""
|
|
}
|
|
}
|