miinventario-backend-v2/src/modules/inventory/entities/inventory-item.entity.ts
rckrdmrd 5a1c966ed2 Migración desde miinventario/backend - Estándar multi-repo v2
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 08:12:15 -06:00

81 lines
1.8 KiB
TypeScript

import {
Entity,
PrimaryGeneratedColumn,
Column,
CreateDateColumn,
UpdateDateColumn,
ManyToOne,
JoinColumn,
Index,
} from 'typeorm';
import { Store } from '../../stores/entities/store.entity';
import { Video } from '../../videos/entities/video.entity';
@Entity('inventory_items')
@Index(['storeId', 'name'])
@Index(['storeId', 'category'])
@Index(['storeId', 'barcode'])
export class InventoryItem {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column({ type: 'uuid' })
storeId: string;
@ManyToOne(() => Store)
@JoinColumn({ name: 'storeId' })
store: Store;
@Column({ type: 'uuid', nullable: true })
detectedByVideoId: string;
@ManyToOne(() => Video, { nullable: true })
@JoinColumn({ name: 'detectedByVideoId' })
detectedByVideo: Video;
@Column({ type: 'varchar', length: 255 })
name: string;
@Column({ type: 'varchar', length: 100, nullable: true })
category: string;
@Column({ type: 'varchar', length: 100, nullable: true })
subcategory: string;
@Column({ type: 'varchar', length: 50, nullable: true })
barcode: string;
@Column({ type: 'int', default: 0 })
quantity: number;
@Column({ type: 'int', nullable: true })
minStock: number;
@Column({ type: 'decimal', precision: 10, scale: 2, nullable: true })
price: number;
@Column({ type: 'decimal', precision: 10, scale: 2, nullable: true })
cost: number;
@Column({ type: 'varchar', length: 500, nullable: true })
imageUrl: string;
@Column({ type: 'decimal', precision: 5, scale: 2, nullable: true })
detectionConfidence: number;
@Column({ type: 'boolean', default: false })
isManuallyEdited: boolean;
@Column({ type: 'jsonb', nullable: true })
metadata: Record<string, unknown>;
@Column({ type: 'timestamp', nullable: true })
lastCountedAt: Date;
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
}