diff --git a/apps/backend/src/routes/promotions.ts b/apps/backend/src/routes/promotions.ts
index bd27540..9e23ccb 100644
--- a/apps/backend/src/routes/promotions.ts
+++ b/apps/backend/src/routes/promotions.ts
@@ -17,4 +17,63 @@ export const promotionsRoute = new Elysia({ prefix: "/promotions" })
},
orderBy: { level: 'asc' }
});
+ })
+ .get("/", async () => {
+ return await prisma.promotion.findMany({
+ orderBy: [{ level: 'asc' }, { createdAt: 'desc' }]
+ });
+ })
+ .post("/", async ({ body, set }) => {
+ try {
+ const data = body as any;
+ return await prisma.promotion.create({ data });
+ } catch (err) {
+ set.status = 500;
+ return { error: "Failed to create promotion" };
+ }
+ }, {
+ body: t.Object({
+ name: t.String(),
+ level: t.Number(),
+ type: t.String(),
+ value: t.Number(),
+ minPurchase: t.Number(),
+ isActive: t.Boolean(),
+ startDate: t.Optional(t.Nullable(t.String())),
+ endDate: t.Optional(t.Nullable(t.String()))
+ })
+ })
+ .put("/:id", async ({ params: { id }, body, set }) => {
+ try {
+ const data = body as any;
+ return await prisma.promotion.update({
+ where: { id: Number(id) },
+ data
+ });
+ } catch (err) {
+ set.status = 500;
+ return { error: "Failed to update promotion" };
+ }
+ }, {
+ body: t.Object({
+ name: t.String(),
+ level: t.Number(),
+ type: t.String(),
+ value: t.Number(),
+ minPurchase: t.Number(),
+ isActive: t.Boolean(),
+ startDate: t.Optional(t.Nullable(t.String())),
+ endDate: t.Optional(t.Nullable(t.String()))
+ })
+ })
+ .delete("/:id", async ({ params: { id }, set }) => {
+ try {
+ await prisma.promotion.delete({
+ where: { id: Number(id) }
+ });
+ return { success: true };
+ } catch (err) {
+ set.status = 500;
+ return { error: "Failed to delete promotion" };
+ }
});
diff --git a/apps/backend/src/routes/settings.ts b/apps/backend/src/routes/settings.ts
index b66b2d3..c3d3960 100644
--- a/apps/backend/src/routes/settings.ts
+++ b/apps/backend/src/routes/settings.ts
@@ -40,6 +40,7 @@ export const settingsRoute = new Elysia({ prefix: "/settings" })
shippingFee: t.Number(),
bankName: t.String(),
bankAccountName: t.String(),
- bankAccountNumber: t.String()
+ bankAccountNumber: t.String(),
+ pointsEarnRate: t.Number()
})
});
diff --git a/packages/types/index.ts b/packages/types/index.ts
index 0cf0adb..1137c20 100644
--- a/packages/types/index.ts
+++ b/packages/types/index.ts
@@ -93,6 +93,7 @@ export interface StoreSettings {
bankName: string
bankAccountName: string
bankAccountNumber: string
+ pointsEarnRate: number
}
export interface OrderItem {
@@ -113,6 +114,20 @@ export interface Order {
customerEmail: string
customerPhone: string
shippingAddress: string
+
+ subtotal?: number
+ promoLevel1Name?: string | null
+ promoLevel1Disc?: number
+ promoLevel2Name?: string | null
+ promoLevel2Disc?: number
+
+ couponCode?: string | null
+ discountAmount?: number
+
+ pointsUsed?: number
+ pointsDiscount?: number
+ pointsEarned?: number
+
totalAmount: number
shippingFee: number
status: string