Files
parsshop-back/src/modules/users/entities/user-order.entity.ts

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;
}