EnakPoint can only be redeemed for vouchers now: it can no longer pay for orders and is never cashed out (docs/enakgame-prd.md §3.2, EG-001, EG-002). No order was ever paid with EnakPoint, so there is no data to move. Removed: - POST /customer/wallet/payment-code, POST /customer/orders/:id/pay-with-points and GET /orders/:id/point-payment/preview, with their processors, repositories, services, handlers and tests. - The point payment method type: paying, splitting and refunding with it, the outlet filter on the method list, and the system-method guard. - points and payment_code on CreatePayment; points_used and point_value on payments; accepts_point_payment on the customer outlets. - The outlet point_payment settings. A PUT that still sends them is rejected as an unknown field. - The EnakPoint split in the payment method analytics. - PAYMENT and PAYMENT_REFUND from the wallet type rules. Tests that used them as a generic EnakPoint debit use REWARD_REDEEM. - The EnakPoint-paid part from the earning basis, which is subtotal − discount again. Migration 000102 drops the trigger, the point methods and their index, the payments columns, and the outlet settings, and restores the method type CHECK without point. payments.payment_method_id is ON DELETE RESTRICT, so it fails rather than lose a payment made with EnakPoint. The integration docs list the removed endpoints and fields, and the EnakPoint & EnakCoin PRD and tasks note what is superseded. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
75 lines
2.3 KiB
Go
75 lines
2.3 KiB
Go
package processor
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"apskel-pos-be/internal/models"
|
|
"apskel-pos-be/internal/repository"
|
|
)
|
|
|
|
type customerOutletRepoFake struct {
|
|
orgs map[uuid.UUID]uuid.UUID
|
|
outlets map[uuid.UUID][]repository.CustomerOutlet
|
|
}
|
|
|
|
func (f customerOutletRepoFake) CustomerOrganizationID(_ context.Context, id uuid.UUID) (uuid.UUID, error) {
|
|
org, ok := f.orgs[id]
|
|
if !ok {
|
|
return uuid.Nil, repository.ErrWalletNotFound
|
|
}
|
|
return org, nil
|
|
}
|
|
|
|
func (f customerOutletRepoFake) ListActiveOutlets(_ context.Context, org uuid.UUID) ([]repository.CustomerOutlet, error) {
|
|
return f.outlets[org], nil
|
|
}
|
|
|
|
type outletSettingsFake map[uuid.UUID]models.OutletLoyaltySettings
|
|
|
|
func (f outletSettingsFake) Outlet(_ context.Context, id uuid.UUID) (*models.OutletLoyaltySettings, error) {
|
|
s := f[id]
|
|
return &s, nil
|
|
}
|
|
|
|
func TestCustomerOutlets_ListsTheCustomersOrganizationWithLoyaltyFlags(t *testing.T) {
|
|
customer, org, other := uuid.New(), uuid.New(), uuid.New()
|
|
kemang, blokm := uuid.New(), uuid.New()
|
|
addr := "Jl. Kemang Raya 10"
|
|
repo := customerOutletRepoFake{
|
|
orgs: map[uuid.UUID]uuid.UUID{customer: org},
|
|
outlets: map[uuid.UUID][]repository.CustomerOutlet{
|
|
org: {{ID: blokm, Name: "Blok M"}, {ID: kemang, Name: "Kemang", Address: &addr}},
|
|
other: {{ID: uuid.New(), Name: "Not mine"}},
|
|
},
|
|
}
|
|
settings := outletSettingsFake{
|
|
kemang: {Point: models.LoyaltyEarnSettings{Enabled: true}},
|
|
}
|
|
|
|
got, err := NewCustomerOutletProcessor(repo, settings).List(context.Background(), customer)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, []models.CustomerOutlet{
|
|
{ID: blokm, Name: "Blok M"},
|
|
{ID: kemang, Name: "Kemang", Address: &addr, EarnsPoints: true},
|
|
}, got)
|
|
}
|
|
|
|
func TestCustomerOutlets_UnknownCustomer(t *testing.T) {
|
|
_, err := NewCustomerOutletProcessor(customerOutletRepoFake{}, outletSettingsFake{}).List(context.Background(), uuid.New())
|
|
assert.ErrorIs(t, err, repository.ErrWalletNotFound)
|
|
}
|
|
|
|
func TestCustomerOutlets_NoOutletsIsAnEmptyList(t *testing.T) {
|
|
customer := uuid.New()
|
|
repo := customerOutletRepoFake{orgs: map[uuid.UUID]uuid.UUID{customer: uuid.New()}}
|
|
got, err := NewCustomerOutletProcessor(repo, outletSettingsFake{}).List(context.Background(), customer)
|
|
require.NoError(t, err)
|
|
assert.NotNil(t, got)
|
|
assert.Empty(t, got)
|
|
}
|