feat: add printer types

This commit is contained in:
efrilm
2026-10-01 22:26:44 +07:00
parent 892575202b
commit b0ef226af1
25 changed files with 2048 additions and 66 deletions
@@ -0,0 +1,46 @@
package processor
import (
"testing"
"apskel-pos-be/internal/entities"
"github.com/google/uuid"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// The items AddToOrder creates have no product loaded, so their responses used to go out
// without a name or a printer, and the POS could not print them.
func TestAddedItemsFromOrderUsesTheReloadedProduct(t *testing.T) {
outletID := uuid.New()
paket := entities.Product{ID: uuid.New(), Name: "Paket Makan Minum"}
paket.SetPrinterTypes([]string{"kitchen", "bar"})
paket.ProductOutletPrices = []entities.ProductOutletPrice{{OutletID: outletID, PrintToChecker: false}}
esTeh := entities.Product{ID: uuid.New(), Name: "Es Teh"}
esTeh.SetPrinterTypes([]string{"bar"})
existing := entities.OrderItem{ID: uuid.New(), ProductID: esTeh.ID, Product: esTeh}
addedPaket := &entities.OrderItem{ID: uuid.New(), ProductID: paket.ID}
addedEsTeh := &entities.OrderItem{ID: uuid.New(), ProductID: esTeh.ID}
order := &entities.Order{
OutletID: outletID,
OrderItems: []entities.OrderItem{
existing,
{ID: addedEsTeh.ID, ProductID: esTeh.ID, Product: esTeh},
{ID: addedPaket.ID, ProductID: paket.ID, Product: paket},
},
}
responses := addedItemsFromOrder([]*entities.OrderItem{addedPaket, addedEsTeh}, order)
require.Len(t, responses, 2, "only the added items, not the ones already on the order")
assert.Equal(t, addedPaket.ID, responses[0].ID, "in the order they were requested")
assert.Equal(t, "Paket Makan Minum", responses[0].ProductName)
assert.Equal(t, []string{"kitchen", "bar"}, responses[0].PrinterTypes)
assert.False(t, responses[0].PrintToChecker, "the outlet's print_to_checker is loaded too")
assert.Equal(t, addedEsTeh.ID, responses[1].ID)
assert.Equal(t, []string{"bar"}, responses[1].PrinterTypes)
}
+24 -6
View File
@@ -568,16 +568,10 @@ func (p *OrderProcessorImpl) AddToOrder(ctx context.Context, orderID uuid.UUID,
return nil, fmt.Errorf("failed to update order: %w", err)
}
var addedItemResponses []models.OrderItemResponse
for _, orderItem := range addedOrderItems {
if err := p.orderItemRepo.Create(ctx, orderItem); err != nil {
return nil, fmt.Errorf("failed to create order item: %w", err)
}
itemResponse := mappers.OrderItemEntityToResponse(orderItem, order.OutletID)
if itemResponse != nil {
addedItemResponses = append(addedItemResponses, *itemResponse)
}
}
orderWithRelations, err := p.orderRepo.GetWithRelations(ctx, orderID)
@@ -585,6 +579,10 @@ func (p *OrderProcessorImpl) AddToOrder(ctx context.Context, orderID uuid.UUID,
return nil, fmt.Errorf("failed to retrieve updated order: %w", err)
}
// The items just created carry no product, so take them from the reloaded order: the
// POS prints added items from this response and needs their name and printers.
addedItemResponses := addedItemsFromOrder(addedOrderItems, orderWithRelations)
updatedOrderResponse := mappers.OrderEntityToResponse(orderWithRelations)
p.attachEarnings(ctx, updatedOrderResponse)
@@ -596,6 +594,26 @@ func (p *OrderProcessorImpl) AddToOrder(ctx context.Context, orderID uuid.UUID,
}, nil
}
// addedItemsFromOrder maps the added items in the order they were requested, using their
// copies in the reloaded order, which have the product and its outlet prices loaded.
func addedItemsFromOrder(added []*entities.OrderItem, order *entities.Order) []models.OrderItemResponse {
reloaded := make(map[uuid.UUID]*entities.OrderItem, len(order.OrderItems))
for i := range order.OrderItems {
reloaded[order.OrderItems[i].ID] = &order.OrderItems[i]
}
var responses []models.OrderItemResponse
for _, item := range added {
if loaded, ok := reloaded[item.ID]; ok {
item = loaded
}
if response := mappers.OrderItemEntityToResponse(item, order.OutletID); response != nil {
responses = append(responses, *response)
}
}
return responses
}
func (p *OrderProcessorImpl) UpdateOrder(ctx context.Context, id uuid.UUID, req *models.UpdateOrderRequest) (*models.OrderResponse, error) {
// Get existing order
order, err := p.orderRepo.GetByID(ctx, id)
@@ -199,7 +199,7 @@ func (p *ProductRecipeProcessorImpl) entityToResponse(entity *entities.ProductRe
Cost: entity.Product.Cost,
BusinessType: string(entity.Product.BusinessType),
ImageURL: entity.Product.ImageURL,
PrinterType: entity.Product.PrinterType,
PrinterTypes: entity.Product.GetPrinterTypes(),
Metadata: entity.Product.Metadata,
IsActive: entity.Product.IsActive,
CreatedAt: entity.Product.CreatedAt,