import { Entity, PrimaryGeneratedColumn, Column, Index, ManyToOne, JoinColumn, } from 'typeorm'; import { CartaPorte } from './carta-porte.entity'; /** * Tipo de Ubicación */ export enum TipoUbicacionCartaPorte { ORIGEN = 'Origen', DESTINO = 'Destino', } @Entity({ schema: 'compliance', name: 'ubicaciones_carta_porte' }) @Index('idx_ubicacion_carta', ['cartaPorteId']) export class UbicacionCartaPorte { @PrimaryGeneratedColumn('uuid') id: string; @Column({ name: 'tenant_id', type: 'uuid' }) tenantId: string; @Column({ name: 'carta_porte_id', type: 'uuid' }) cartaPorteId: string; @ManyToOne(() => CartaPorte, (cp) => cp.ubicaciones) @JoinColumn({ name: 'carta_porte_id' }) cartaPorte: CartaPorte; // Tipo @Column({ name: 'tipo_ubicacion', type: 'varchar', length: 10 }) tipoUbicacion: string; // ID Ubicación (catálogo SAT) @Column({ name: 'id_ubicacion', type: 'varchar', length: 10, nullable: true }) idUbicacion: string | null; // RFC @Column({ name: 'rfc_remitente_destinatario', type: 'varchar', length: 13, nullable: true }) rfcRemitenteDestinatario: string | null; @Column({ name: 'nombre_remitente_destinatario', type: 'varchar', length: 200, nullable: true }) nombreRemitenteDestinatario: string | null; // Domicilio @Column({ type: 'varchar', length: 3, default: 'MEX' }) pais: string; @Column({ type: 'varchar', length: 10, nullable: true }) estado: string | null; @Column({ type: 'varchar', length: 10, nullable: true }) municipio: string | null; @Column({ type: 'varchar', length: 10, nullable: true }) localidad: string | null; @Column({ name: 'codigo_postal', type: 'varchar', length: 10 }) codigoPostal: string; @Column({ type: 'varchar', length: 10, nullable: true }) colonia: string | null; @Column({ type: 'varchar', length: 200, nullable: true }) calle: string | null; @Column({ name: 'numero_exterior', type: 'varchar', length: 50, nullable: true }) numeroExterior: string | null; @Column({ name: 'numero_interior', type: 'varchar', length: 50, nullable: true }) numeroInterior: string | null; @Column({ type: 'varchar', length: 500, nullable: true }) referencia: string | null; // Fechas @Column({ name: 'fecha_hora_salida_llegada', type: 'timestamptz', nullable: true }) fechaHoraSalidaLlegada: Date | null; // Distancia @Column({ name: 'distancia_recorrida', type: 'decimal', precision: 10, scale: 2, nullable: true }) distanciaRecorrida: number | null; // Secuencia @Column({ type: 'int' }) secuencia: number; // Helpers get esOrigen(): boolean { return this.tipoUbicacion === TipoUbicacionCartaPorte.ORIGEN; } get esDestino(): boolean { return this.tipoUbicacion === TipoUbicacionCartaPorte.DESTINO; } get direccionCompleta(): string { const partes = [ this.calle, this.numeroExterior ? `#${this.numeroExterior}` : null, this.numeroInterior ? `Int. ${this.numeroInterior}` : null, this.colonia, `CP ${this.codigoPostal}`, ].filter(Boolean); return partes.join(', '); } }