import { Column, Entity, Index, PrimaryGeneratedColumn } from 'typeorm'; import { TimestampedEntity } from './timestamped.entity'; export enum AssetInformationStatus { DRAFT = 'DRAFT', PENDING_SURVEY = 'PENDING_SURVEY', SURVEYED = 'SURVEYED', VALIDATED = 'VALIDATED', OBSERVED = 'OBSERVED', OUTDATED = 'OUTDATED', INACTIVE = 'INACTIVE', } export enum AssetOperationalStatus { UNKNOWN = 'UNKNOWN', IN_SERVICE = 'IN_SERVICE', TEMPORARILY_OUT_OF_SERVICE = 'TEMPORARILY_OUT_OF_SERVICE', OUT_OF_SERVICE = 'OUT_OF_SERVICE', DECOMMISSIONED = 'DECOMMISSIONED', ABANDONED = 'ABANDONED', } export enum AssetDataOrigin { MANUAL = 'MANUAL', FIELD_SURVEY = 'FIELD_SURVEY', PROVIDED_DOCUMENT = 'PROVIDED_DOCUMENT', IMPORT = 'IMPORT', SYSTEM = 'SYSTEM', } @Entity({ name: 'assets' }) @Index('idx_assets_type_id', ['assetTypeId']) @Index('idx_assets_parent_id', ['parentId']) @Index('idx_assets_operational_area_id', ['operationalAreaId']) @Index('idx_assets_operator_company_id', ['operatorCompanyId']) @Index('idx_assets_concession_type_id', ['concessionTypeId']) @Index('idx_assets_inventory_family_id', ['inventoryFamilyId']) @Index('idx_assets_information_status', ['informationStatus']) @Index('idx_assets_operational_status', ['operationalStatus']) @Index('idx_assets_data_origin', ['dataOrigin']) @Index('idx_assets_provenance_verified_at', ['provenanceVerifiedAt']) export class Asset extends TimestampedEntity { @PrimaryGeneratedColumn('uuid') id!: string; @Column({ name: 'asset_type_id', type: 'uuid' }) assetTypeId!: string; @Column({ name: 'parent_id', type: 'uuid', nullable: true }) parentId!: string | null; @Column({ name: 'operational_area_id', type: 'uuid', nullable: true }) operationalAreaId!: string | null; @Column({ name: 'operator_company_id', type: 'uuid', nullable: true }) operatorCompanyId!: string | null; @Column({ name: 'concession_type_id', type: 'uuid', nullable: true }) concessionTypeId!: string | null; @Column({ name: 'inventory_family_id', type: 'uuid', nullable: true }) inventoryFamilyId!: string | null; @Column({ name: 'is_inventory_instance', type: 'boolean', default: false }) isInventoryInstance!: boolean; @Column({ type: 'varchar', length: 120 }) code!: string; @Column({ type: 'varchar', length: 200 }) name!: string; @Column({ name: 'common_name', type: 'varchar', length: 200, nullable: true }) commonName!: string | null; @Column({ type: 'text', nullable: true }) description!: string | null; @Column({ name: 'information_status', type: 'enum', enum: AssetInformationStatus, enumName: 'asset_information_status', default: AssetInformationStatus.DRAFT, }) informationStatus!: AssetInformationStatus; @Column({ name: 'operational_status', type: 'enum', enum: AssetOperationalStatus, enumName: 'asset_operational_status', default: AssetOperationalStatus.UNKNOWN }) operationalStatus!: AssetOperationalStatus; @Column({ name: 'created_by', type: 'uuid', nullable: true }) createdBy!: string | null; @Column({ name: 'updated_by', type: 'uuid', nullable: true }) updatedBy!: string | null; @Column({ name: 'current_version', type: 'integer', default: 0 }) currentVersion!: number; @Column({ name: 'data_origin', type: 'varchar', length: 32, default: AssetDataOrigin.MANUAL }) dataOrigin!: AssetDataOrigin; @Column({ name: 'source_name', type: 'varchar', length: 160, nullable: true }) sourceName!: string | null; @Column({ name: 'source_reference', type: 'varchar', length: 255, nullable: true }) sourceReference!: string | null; @Column({ name: 'source_observed_at', type: 'timestamptz', nullable: true }) sourceObservedAt!: Date | null; @Column({ name: 'source_notes', type: 'text', nullable: true }) sourceNotes!: string | null; @Column({ name: 'provenance_verified_at', type: 'timestamptz', nullable: true }) provenanceVerifiedAt!: Date | null; @Column({ name: 'provenance_verified_by', type: 'uuid', nullable: true }) provenanceVerifiedBy!: string | null; @Column({ name: 'provenance_updated_at', type: 'timestamptz', default: () => 'CURRENT_TIMESTAMP' }) provenanceUpdatedAt!: Date; @Column({ name: 'provenance_updated_by', type: 'uuid', nullable: true }) provenanceUpdatedBy!: string | null; }