feat: add printer types
This commit is contained in:
@@ -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)
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user