class OrderBuilder {
private data: OrderData = {
id: `test-order-${Date.now()}`,
status: "new",
serviceType: "delivery",
items: [],
customer: null,
totalAmount: new Price(0, "CHF"),
createdAt: new Date(),
updatedAt: new Date(),
};
// États
asNew(): OrderBuilder {
this.data.status = "new";
return this;
}
asConfirmed(): OrderBuilder {
this.data.status = "confirmed";
return this;
}
// Types de service
asDelivery(): OrderBuilder {
this.data.serviceType = "delivery";
return this;
}
asPickup(): OrderBuilder {
this.data.serviceType = "pickup";
return this;
}
// Relations
withCustomer(customer?: Customer): OrderBuilder {
this.data.customer = customer || new CustomerBuilder().build();
return this;
}
withItems(items: OrderItem[]): OrderBuilder {
this.data.items = items;
return this;
}
addItem(item: OrderItem): OrderBuilder {
this.data.items.push(item);
return this;
}
// Données spécifiques
withAmount(amount: number): OrderBuilder {
this.data.totalAmount = new Price(amount, "CHF");
return this;
}
// Scénarios prédéfinis
asNewDeliveryOrder(): OrderBuilder {
return this.asNew().asDelivery().withDefaultCustomer();
}
// Construction finale
build(): Order {
this.validate();
return new Order(this.data);
}
private validate(): void {
if (!this.data.customer) {
throw new Error("Customer is required");
}
if (this.data.items.length === 0) {
throw new Error("Order must have at least one item");
}
}
}