diff --git a/database/migrations/.snapshot-dkala.json b/database/migrations/.snapshot-dkala.json index 680f764..631414b 100644 --- a/database/migrations/.snapshot-dkala.json +++ b/database/migrations/.snapshot-dkala.json @@ -2824,17 +2824,6 @@ "default": "false", "mappedType": "boolean" }, - "price": { - "name": "price", - "type": "numeric(10,0)", - "unsigned": false, - "autoincrement": false, - "primary": false, - "nullable": true, - "precision": 10, - "scale": 0, - "mappedType": "decimal" - }, "max_purchase_quantity": { "name": "max_purchase_quantity", "type": "int", @@ -2844,6 +2833,71 @@ "nullable": true, "default": "null", "mappedType": "integer" + }, + "min_purchase_quantity": { + "name": "min_purchase_quantity", + "type": "int", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "default": "null", + "mappedType": "integer" + }, + "pricing_type": { + "name": "pricing_type", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "default": "'fixed'", + "enumItems": [ + "fixed", + "variable" + ], + "mappedType": "enum" + }, + "purchase_unit": { + "name": "purchase_unit", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "default": "'number'", + "enumItems": [ + "number", + "kilogram", + "gram", + "centimeter", + "meter", + "milliliter", + "liter" + ], + "mappedType": "enum" + }, + "purchase_pitch": { + "name": "purchase_pitch", + "type": "numeric(10,3)", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": true, + "precision": 10, + "scale": 3, + "default": "null", + "mappedType": "decimal" + }, + "need_admin_acceptance": { + "name": "need_admin_acceptance", + "type": "boolean", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "default": "false", + "mappedType": "boolean" } }, "name": "products", @@ -3842,7 +3896,8 @@ "deliveredToRecepient", "shipped", "completed", - "canceled" + "canceled", + "needConfirmation" ], "mappedType": "enum" }, @@ -5209,6 +5264,21 @@ "precision": 10, "scale": 0, "mappedType": "decimal" + }, + "status": { + "name": "status", + "type": "text", + "unsigned": false, + "autoincrement": false, + "primary": false, + "nullable": false, + "default": "'normal'", + "enumItems": [ + "normal", + "needConfirmation", + "confirmed" + ], + "mappedType": "enum" } }, "name": "order_items", diff --git a/database/migrations/Migration20260628071208.ts b/database/migrations/Migration20260628071208.ts new file mode 100644 index 0000000..f998707 --- /dev/null +++ b/database/migrations/Migration20260628071208.ts @@ -0,0 +1,23 @@ +import { Migration } from '@mikro-orm/migrations'; + +export class Migration20260628071208 extends Migration { + + override async up(): Promise { + this.addSql(`alter table "orders" drop constraint if exists "orders_status_check";`); + + this.addSql(`alter table "products" add column "min_purchase_quantity" int null, add column "pricing_type" text check ("pricing_type" in ('fixed', 'variable')) not null default 'fixed', add column "purchase_unit" text check ("purchase_unit" in ('number', 'kilogram', 'gram', 'centimeter', 'meter', 'milliliter', 'liter')) not null default 'number', add column "purchase_pitch" numeric(10,3) null, add column "need_admin_acceptance" boolean not null default false;`); + + this.addSql(`alter table "orders" add constraint "orders_status_check" check("status" in ('pendingPayment', 'paid', 'preparing', 'deliveredToRecepient', 'shipped', 'completed', 'canceled', 'needConfirmation'));`); + + this.addSql(`alter table "order_items" add column "status" text check ("status" in ('normal', 'needConfirmation', 'confirmed')) not null default 'normal';`); + } + + override async down(): Promise { + this.addSql(`alter table "orders" drop constraint if exists "orders_status_check";`); + + this.addSql(`alter table "products" add column "price" numeric(10,0) null;`); + + this.addSql(`alter table "orders" add constraint "orders_status_check" check("status" in ('pendingPayment', 'paid', 'preparing', 'deliveredToRecepient', 'shipped', 'completed', 'canceled'));`); + } + +} diff --git a/src/modules/auth/services/auth.service.ts b/src/modules/auth/services/auth.service.ts index 3f1cbc9..f4fe084 100644 --- a/src/modules/auth/services/auth.service.ts +++ b/src/modules/auth/services/auth.service.ts @@ -52,8 +52,9 @@ export class AuthService { const key = isAdmin ? this.adminOtpKey(slug, normalizedPhone) : this.userOtpKey(slug, normalizedPhone); await this.cacheService.set(key, code, this.OTP_EXPIRATION_TIME); - await this.smsService.sendotp(normalizedPhone, code); + // await this.smsService.sendotp(normalizedPhone, code); + console.log('code', code); return { code: null }; } diff --git a/src/modules/orders/interface/order.interface.ts b/src/modules/orders/interface/order.interface.ts index 4072900..a256c7e 100644 --- a/src/modules/orders/interface/order.interface.ts +++ b/src/modules/orders/interface/order.interface.ts @@ -21,7 +21,6 @@ export enum OrderStatus { COMPLETED = 'completed', CANCELED = 'canceled', NEED_CONFIRMATION = 'needConfirmation', - CONFIRMED = 'confirmed', } export interface OrderCouponDetail { diff --git a/src/modules/orders/listeners/order.listeners.ts b/src/modules/orders/listeners/order.listeners.ts index 113ed1f..6e39fc8 100644 --- a/src/modules/orders/listeners/order.listeners.ts +++ b/src/modules/orders/listeners/order.listeners.ts @@ -39,6 +39,7 @@ export class OrderListeners { [OrderStatus.SHIPPED]: 'ارسال شده', [OrderStatus.COMPLETED]: 'تکمیل شده', [OrderStatus.CANCELED]: 'لغو شده', + [OrderStatus.NEED_CONFIRMATION]: 'به تایید نیاز دارد', }; return statusMap[status] || status; } diff --git a/src/modules/orders/providers/orders.service.ts b/src/modules/orders/providers/orders.service.ts index 5ddb028..6b8db69 100644 --- a/src/modules/orders/providers/orders.service.ts +++ b/src/modules/orders/providers/orders.service.ts @@ -7,16 +7,14 @@ import { Shop } from '../../shops/entities/shop.entity'; import { Variant } from '../../products/entities/variant.entity'; import { CartService } from '../../cart/providers/cart.service'; import { OrderStatus, OrderUserAddress } from '../interface/order.interface'; -import { PaymentMethodEnum, PaymentStatusEnum } from '../../payments/interface/payment'; +import { PaymentMethodEnum } from '../../payments/interface/payment'; import { Cart } from '../../cart/interfaces/cart.interface'; import { PaymentMethod } from '../../payments/entities/payment-method.entity'; -import { PaymentsService } from '../../payments/services/payments.service'; import { DeliveryMethodEnum } from '../../delivery/interface/delivery'; import { Delivery } from '../../delivery/entities/delivery.entity'; import { OrderRepository } from '../repositories/order.repository'; import { FindOrdersDto } from '../dto/find-orders.dto'; import { PaginatedResult } from 'src/common/interfaces/pagination.interface'; -import { Payment } from 'src/modules/payments/entities/payment.entity'; import { StatusTransitionRef } from '../interface/order.interface'; import { EventEmitter2 } from '@nestjs/event-emitter'; import { OrderCreatedEvent, OrderStatusChangedEvent } from '../events/order.events'; @@ -43,6 +41,7 @@ export class OrdersService { private readonly logger = new Logger(OrdersService.name); private static readonly STATUS_TRANSITIONS: Record = { + [OrderStatus.NEED_CONFIRMATION]: [ OrderStatus.CANCELED, OrderStatus.PENDING_PAYMENT], [OrderStatus.PENDING_PAYMENT]: [OrderStatus.PAID, OrderStatus.CANCELED, OrderStatus.PREPARING], [OrderStatus.PAID]: [OrderStatus.PREPARING, OrderStatus.CANCELED], [OrderStatus.PREPARING]: [OrderStatus.SHIPPED, OrderStatus.DELIVERED_TO_RECEPIENT, OrderStatus.CANCELED], @@ -59,7 +58,6 @@ export class OrdersService { private readonly shopService: ShopService, private readonly deliveryService: DeliveryService, private readonly paymentMethodService: PaymentMethodService, - private readonly paymentsService: PaymentsService, private readonly eventEmitter: EventEmitter2, private readonly userService: UserService, ) { } diff --git a/src/modules/payments/services/payments.service.ts b/src/modules/payments/services/payments.service.ts index 667f42b..5dc73d2 100644 --- a/src/modules/payments/services/payments.service.ts +++ b/src/modules/payments/services/payments.service.ts @@ -34,6 +34,10 @@ export class PaymentsService { return { paymentUrl: null }; } + if (ctx.order.status === OrderStatus.NEED_CONFIRMATION) { + throw new BadRequestException('سفارش به تایید نیاز دارد'); + } + switch (ctx.method) { case PaymentMethodEnum.Cash: await this.handleCashPayment(ctx);