172 lines
4.4 KiB
TypeScript
172 lines
4.4 KiB
TypeScript
import {
|
|
Column,
|
|
CreateDateColumn,
|
|
Entity,
|
|
Index,
|
|
JoinColumn,
|
|
ManyToOne,
|
|
OneToMany,
|
|
PrimaryGeneratedColumn,
|
|
UpdateDateColumn,
|
|
} from 'typeorm';
|
|
import { PaymentStatus } from '../enums/payment-status.enum';
|
|
import { OrderStatus } from '../enums/order-status.enum';
|
|
import { PaymentMethodCode } from '../../payments/enums/payment-method-code.enum';
|
|
import { User } from './user.entity';
|
|
import { UserOrderItem } from './user-order-item.entity';
|
|
|
|
@Entity({ name: 'user_orders' })
|
|
export class UserOrder {
|
|
@PrimaryGeneratedColumn('uuid')
|
|
id: string;
|
|
|
|
@Index({ unique: true })
|
|
@Column({ name: 'order_number', type: 'varchar', length: 50 })
|
|
orderNumber: string;
|
|
|
|
@Index()
|
|
@ManyToOne(() => User, { onDelete: 'CASCADE' })
|
|
@JoinColumn({ name: 'user_id' })
|
|
user: User;
|
|
|
|
@Column({
|
|
name: 'status',
|
|
type: 'enum',
|
|
enum: OrderStatus,
|
|
default: OrderStatus.PENDING_PAYMENT,
|
|
})
|
|
status: OrderStatus;
|
|
|
|
@Column({
|
|
name: 'payment_status',
|
|
type: 'enum',
|
|
enum: PaymentStatus,
|
|
default: PaymentStatus.PENDING,
|
|
})
|
|
paymentStatus: PaymentStatus;
|
|
|
|
@Column({
|
|
name: 'subtotal_amount',
|
|
type: 'numeric',
|
|
precision: 12,
|
|
scale: 2,
|
|
default: 0,
|
|
transformer: {
|
|
to: (value: number) => value,
|
|
from: (value: string) => Number(value),
|
|
},
|
|
})
|
|
subtotalAmount: number;
|
|
|
|
@Column({
|
|
name: 'shipping_amount',
|
|
type: 'numeric',
|
|
precision: 12,
|
|
scale: 2,
|
|
default: 0,
|
|
transformer: {
|
|
to: (value: number) => value,
|
|
from: (value: string) => Number(value),
|
|
},
|
|
})
|
|
shippingAmount: number;
|
|
|
|
@Column({
|
|
name: 'discount_amount',
|
|
type: 'numeric',
|
|
precision: 12,
|
|
scale: 2,
|
|
default: 0,
|
|
transformer: {
|
|
to: (value: number) => value,
|
|
from: (value: string) => Number(value),
|
|
},
|
|
})
|
|
discountAmount: number;
|
|
|
|
@Column({
|
|
name: 'total_amount',
|
|
type: 'numeric',
|
|
precision: 12,
|
|
scale: 2,
|
|
default: 0,
|
|
transformer: {
|
|
to: (value: number) => value,
|
|
from: (value: string) => Number(value),
|
|
},
|
|
})
|
|
totalAmount: number;
|
|
|
|
@Column({ name: 'currency', type: 'varchar', length: 20, default: 'IRR' })
|
|
currency: string;
|
|
|
|
@Column({
|
|
name: 'payment_method',
|
|
type: 'enum',
|
|
enum: PaymentMethodCode,
|
|
nullable: true,
|
|
})
|
|
paymentMethod?: PaymentMethodCode | null;
|
|
|
|
@Column({ name: 'payment_gateway', type: 'varchar', length: 50, nullable: true })
|
|
paymentGateway?: string | null;
|
|
|
|
@Column({
|
|
name: 'payment_metadata',
|
|
type: 'jsonb',
|
|
nullable: true,
|
|
})
|
|
paymentMetadata?: Record<string, unknown> | null;
|
|
|
|
@Column({ name: 'bank_slip_tracking_number', type: 'varchar', length: 100, nullable: true })
|
|
bankSlipTrackingNumber?: string | null;
|
|
|
|
@Column({ name: 'bank_slip_image_url', type: 'varchar', length: 500, nullable: true })
|
|
bankSlipImageUrl?: string | null;
|
|
|
|
@Column({ name: 'bank_slip_submitted_at', type: 'timestamp with time zone', nullable: true })
|
|
bankSlipSubmittedAt?: Date | null;
|
|
|
|
@Column({ name: 'payment_verified_at', type: 'timestamp with time zone', nullable: true })
|
|
paymentVerifiedAt?: Date | null;
|
|
|
|
@Column({ name: 'payment_reviewed_at', type: 'timestamp with time zone', nullable: true })
|
|
paymentReviewedAt?: Date | null;
|
|
|
|
@Column({ name: 'payment_reviewed_by_admin_id', type: 'uuid', nullable: true })
|
|
paymentReviewedByAdminId?: string | null;
|
|
|
|
@Column({ name: 'tracking_code', type: 'varchar', length: 100, nullable: true })
|
|
trackingCode?: string;
|
|
|
|
@Column({ name: 'shipping_method', type: 'varchar', length: 100, nullable: true })
|
|
shippingMethod?: string;
|
|
|
|
@Column({ name: 'notes', type: 'varchar', length: 500, nullable: true })
|
|
notes?: string;
|
|
|
|
@Column({ name: 'address_snapshot', type: 'jsonb', nullable: true })
|
|
addressSnapshot?: Record<string, unknown>;
|
|
|
|
@Column({ name: 'placed_at', type: 'timestamp with time zone', nullable: true })
|
|
placedAt?: Date;
|
|
|
|
@Column({ name: 'estimated_delivery_at', type: 'timestamp with time zone', nullable: true })
|
|
estimatedDeliveryAt?: Date;
|
|
|
|
@Column({ name: 'delivered_at', type: 'timestamp with time zone', nullable: true })
|
|
deliveredAt?: Date;
|
|
|
|
@Column({ name: 'cancelled_at', type: 'timestamp with time zone', nullable: true })
|
|
cancelledAt?: Date;
|
|
|
|
@OneToMany(() => UserOrderItem, (item) => item.order, { cascade: true, eager: true })
|
|
items: UserOrderItem[];
|
|
|
|
@CreateDateColumn({ name: 'created_at' })
|
|
createdAt: Date;
|
|
|
|
@UpdateDateColumn({ name: 'updated_at' })
|
|
updatedAt: Date;
|
|
}
|