coupon module
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
];
|
||||
|
||||
Reference in New Issue
Block a user