coupon module

This commit is contained in:
2025-12-06 12:50:51 +03:30
parent 7a5b181af2
commit 816cb639e7
15 changed files with 804 additions and 3 deletions
+7 -2
View File
@@ -11,6 +11,7 @@ import { CategoriesSeeder } from './categories.seeder';
import { FoodsSeeder } from './foods.seeder';
import { AdminsSeeder } from './admins.seeder';
import { UsersSeeder } from './users.seeder';
import { CouponsSeeder } from './coupons.seeder';
export class DatabaseSeeder extends Seeder {
async run(em: EntityManager) {
@@ -47,11 +48,15 @@ export class DatabaseSeeder extends Seeder {
const foodsSeeder = new FoodsSeeder();
await foodsSeeder.run(em, restaurantsMap, categoriesMap);
// 9. Create Admins
// 9. Create Coupons
const couponsSeeder = new CouponsSeeder();
await couponsSeeder.run(em, restaurantsMap);
// 10. Create Admins
const adminsSeeder = new AdminsSeeder();
await adminsSeeder.run(em, rolesMap, restaurantsMap);
// 10. Create Users
// 11. Create Users
const usersSeeder = new UsersSeeder();
await usersSeeder.run(em);
}
+43
View File
@@ -0,0 +1,43 @@
import type { EntityManager } from '@mikro-orm/core';
import { Coupon } from '../modules/coupons/entities/coupon.entity';
import { Restaurant } from '../modules/restaurants/entities/restaurant.entity';
import { couponsData } from './data/coupons.data';
export class CouponsSeeder {
async run(em: EntityManager, restaurantsMap: Map<string, Restaurant>): Promise<void> {
for (const couponData of couponsData) {
const restaurant = restaurantsMap.get(couponData.restaurantSlug);
if (!restaurant) continue;
const existing = await em.findOne(Coupon, {
code: couponData.code,
restaurant: { id: restaurant.id },
});
if (!existing) {
const coupon = em.create(Coupon, {
restaurant,
code: couponData.code,
name: couponData.name,
description: couponData.description,
type: couponData.type,
value: couponData.value,
maxDiscount: couponData.maxDiscount,
minOrderAmount: couponData.minOrderAmount,
maxUses: couponData.maxUses,
maxUsesPerUser: couponData.maxUsesPerUser,
startDate: couponData.startDate ? new Date(couponData.startDate) : undefined,
endDate: couponData.endDate ? new Date(couponData.endDate) : undefined,
isActive: couponData.isActive,
usedCount: 0,
});
em.persist(coupon);
}
}
await em.flush();
}
}
+95
View File
@@ -0,0 +1,95 @@
import { CouponType } from '../../modules/coupons/entities/coupon.entity';
export interface CouponData {
restaurantSlug: string;
code: string;
name: string;
description?: string;
type: CouponType;
value: number;
maxDiscount?: number;
minOrderAmount?: number;
maxUses?: number;
maxUsesPerUser?: number;
startDate?: string;
endDate?: string;
isActive: boolean;
}
export const couponsData: CouponData[] = [
{
restaurantSlug: 'zhivan',
code: 'WELCOME10',
name: 'خوش آمدگویی ۱۰٪',
description: 'تخفیف ۱۰ درصدی برای اولین خرید',
type: CouponType.PERCENTAGE,
value: 10,
maxDiscount: 50000,
minOrderAmount: 100000,
maxUses: 100,
maxUsesPerUser: 1,
isActive: true,
},
{
restaurantSlug: 'zhivan',
code: 'FIXED50K',
name: 'تخفیف ۵۰ هزار تومانی',
description: 'تخفیف ثابت ۵۰ هزار تومانی',
type: CouponType.FIXED,
value: 50000,
minOrderAmount: 200000,
maxUses: 50,
maxUsesPerUser: 2,
isActive: true,
},
{
restaurantSlug: 'zhivan',
code: 'WEEKEND20',
name: 'تعطیلات ۲۰٪',
description: 'تخفیف ۲۰ درصدی برای آخر هفته',
type: CouponType.PERCENTAGE,
value: 20,
maxDiscount: 100000,
minOrderAmount: 150000,
maxUses: 200,
isActive: true,
},
{
restaurantSlug: 'boote',
code: 'FIRST15',
name: 'اولین خرید ۱۵٪',
description: 'تخفیف ۱۵ درصدی برای اولین خرید',
type: CouponType.PERCENTAGE,
value: 15,
maxDiscount: 75000,
minOrderAmount: 100000,
maxUses: 100,
maxUsesPerUser: 1,
isActive: true,
},
{
restaurantSlug: 'boote',
code: 'SAVE30K',
name: 'صرفه جویی ۳۰ هزار',
description: 'تخفیف ثابت ۳۰ هزار تومانی',
type: CouponType.FIXED,
value: 30000,
minOrderAmount: 100000,
maxUses: 100,
isActive: true,
},
{
restaurantSlug: 'boote',
code: 'VIP25',
name: 'ویژه ۲۵٪',
description: 'تخفیف ویژه ۲۵ درصدی',
type: CouponType.PERCENTAGE,
value: 25,
maxDiscount: 150000,
minOrderAmount: 200000,
maxUses: 50,
maxUsesPerUser: 1,
isActive: true,
},
];