diff --git a/src/modules/delivery/delivery.module.ts b/src/modules/delivery/delivery.module.ts index c11248c..3a657e7 100644 --- a/src/modules/delivery/delivery.module.ts +++ b/src/modules/delivery/delivery.module.ts @@ -4,9 +4,11 @@ import { DeliveryController } from './delivery.controller'; import { DeliveryService } from './delivery.service'; import { Delivery } from './entities/delivery.entity'; import { DeliveryZone } from './entities/delivery-zone.entity'; +import { DeliveryStatusHistory } from './entities/delivery-status-history.entity'; +import { Driver } from './entities/driver.entity'; @Module({ - imports: [TypeOrmModule.forFeature([Delivery, DeliveryZone])], + imports: [TypeOrmModule.forFeature([Delivery, DeliveryZone, DeliveryStatusHistory, Driver])], controllers: [DeliveryController], providers: [DeliveryService], exports: [DeliveryService], diff --git a/src/modules/delivery/entities/delivery-status-history.entity.ts b/src/modules/delivery/entities/delivery-status-history.entity.ts new file mode 100644 index 0000000..554b368 --- /dev/null +++ b/src/modules/delivery/entities/delivery-status-history.entity.ts @@ -0,0 +1,46 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + ManyToOne, + JoinColumn, + Index, +} from 'typeorm'; +import { Delivery } from './delivery.entity'; + +@Entity({ schema: 'delivery', name: 'delivery_status_history' }) +@Index(['deliveryId', 'createdAt']) +export class DeliveryStatusHistory { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column({ name: 'delivery_id' }) + deliveryId: string; + + @Column({ length: 20 }) + status: string; + + @Column({ name: 'previous_status', length: 20, nullable: true }) + previousStatus: string; + + @Column({ name: 'changed_by', nullable: true }) + changedBy: string; + + @Column({ name: 'changed_by_name', length: 100, nullable: true }) + changedByName: string; + + @Column({ type: 'text', nullable: true }) + notes: string; + + @Column({ type: 'jsonb', nullable: true }) + location: { lat: number; lng: number }; + + @CreateDateColumn({ name: 'created_at' }) + createdAt: Date; + + // Relations + @ManyToOne(() => Delivery) + @JoinColumn({ name: 'delivery_id' }) + delivery: Delivery; +} diff --git a/src/modules/delivery/entities/driver.entity.ts b/src/modules/delivery/entities/driver.entity.ts new file mode 100644 index 0000000..f115e6f --- /dev/null +++ b/src/modules/delivery/entities/driver.entity.ts @@ -0,0 +1,62 @@ +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + Index, +} from 'typeorm'; + +export enum DriverStatus { + AVAILABLE = 'available', + BUSY = 'busy', + OFFLINE = 'offline', + INACTIVE = 'inactive', +} + +@Entity({ schema: 'delivery', name: 'drivers' }) +@Index(['tenantId', 'status']) +@Index(['tenantId', 'active']) +export class Driver { + @PrimaryGeneratedColumn('uuid') + id: string; + + @Column({ name: 'tenant_id' }) + tenantId: string; + + @Column({ name: 'user_id', nullable: true }) + userId: string; + + @Column({ length: 100 }) + name: string; + + @Column({ length: 20 }) + phone: string; + + @Column({ name: 'vehicle_type', length: 50, nullable: true }) + vehicleType: string; + + @Column({ name: 'vehicle_plate', length: 20, nullable: true }) + vehiclePlate: string; + + @Column({ name: 'photo_url', type: 'text', nullable: true }) + photoUrl: string; + + @Column({ type: 'varchar', length: 20, default: DriverStatus.AVAILABLE }) + status: DriverStatus; + + @Column({ name: 'current_location', type: 'jsonb', nullable: true }) + currentLocation: { lat: number; lng: number }; + + @Column({ name: 'last_seen_at', type: 'timestamptz', nullable: true }) + lastSeenAt: Date; + + @Column({ default: true }) + active: boolean; + + @CreateDateColumn({ name: 'created_at' }) + createdAt: Date; + + @UpdateDateColumn({ name: 'updated_at' }) + updatedAt: Date; +}