generator client { provider = "prisma-client-js" binaryTargets = ["native", "debian-openssl-3.0.x"] } datasource db { provider = "postgresql" url = env("DATABASE_URL") } enum Role { ADMIN OPERATOR CLIENT GESTOR_PROJETOS PO FISCAL_CONTRATO GESTOR_CONTRATO } enum DeliverableStatus { RASCUNHO EMITIDA EM_EXECUCAO AGUARDANDO_VALIDACAO EM_REVISAO APROVADA GLOSADA ENCERRADA CANCELADA AGUARDANDO_PAGAMENTO PAGA } enum TimelineEventType { CRIACAO EDICAO STATUS_CHANGE ASSIGNMENT BACKLOG ANOTACAO ALOCACAO VALOR_RECALCULADO } enum BacklogItemStatus { PENDENTE ACEITO REJEITADO } enum NoteType { OBSERVACAO RISCO IMPEDIMENTO DECISAO } enum SprintType { DESCOBERTA DESIGN ARQUITETURA CONSTRUCAO } enum WorkOrderStatus { RASCUNHO EMITIDA EM_EXECUCAO TOTALMENTE_PAGA CANCELADA } enum DeliverableType { DESCOBERTA DESIGN ARQUITETURA CONSTRUCAO MANUTENCAO LICENCA } enum ContractItemType { UST SAAS_LICENSE } enum SprintStatus { RASCUNHO EM_EXECUCAO FINALIZADA CANCELADA } enum SprintHistoryEventType { ENTREGAVEL_ADICIONADO ENTREGAVEL_REMOVIDO STATUS_CHANGE ENTREGAVEL_MOVIDO } enum IntegrationScope { DELIVERABLES_READ CLIENTS_READ } model User { id String @id @default(uuid()) name String email String @unique password String role Role @default(GESTOR_PROJETOS) clientSubRole String? @map("client_sub_role") isActive Boolean @default(true) mustChangePassword Boolean @default(false) clientId String? @map("client_id") createdAt DateTime @default(now()) updatedAt DateTime @updatedAt client Client? @relation(fields: [clientId], references: [id]) passwordResetTokens PasswordResetToken[] @@map("users") } model PasswordResetToken { id String @id @default(uuid()) userId String @map("user_id") tokenHash String @unique @map("token_hash") expiresAt DateTime @map("expires_at") usedAt DateTime? @map("used_at") createdAt DateTime @default(now()) @map("created_at") user User @relation(fields: [userId], references: [id]) @@index([userId]) @@map("password_reset_tokens") } model Client { id String @id @default(uuid()) name String document String? email String? phone String? contactName String? @map("contact_name") description String? isActive Boolean @default(true) @map("is_active") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") contracts Contract[] contractItems ContractItem[] deliverables Deliverable[] users User[] profiles ClientProfile[] allocationTemplates AllocationTemplate[] @@map("clients") } model ContractItem { id String @id @default(uuid()) code String name String description String? totalUst Decimal @map("total_ust") ustValue Decimal? @map("ust_value") itemType ContractItemType @default(UST) @map("item_type") timeboxDescoberta Decimal? @map("timebox_descoberta") timeboxDesign Decimal? @map("timebox_design") timeboxArquitetura Decimal? @map("timebox_arquitetura") timeboxConstrucao Decimal? @map("timebox_construcao") isActive Boolean @default(true) @map("is_active") clientId String @map("client_id") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") client Client @relation(fields: [clientId], references: [id]) deliverables Deliverable[] allocationTemplates AllocationTemplate[] workOrders WorkOrder[] @@unique([code, clientId]) @@map("contract_items") } model Professional { id String @id @default(uuid()) name String document String? email String? phone String? role String? isActive Boolean @default(true) @map("is_active") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") deliverableAssignments DeliverableAssignment[] @@map("professionals") } model Contract { id String @id @default(uuid()) clientId String @map("client_id") name String code String? description String? startDate DateTime? @map("start_date") endDate DateTime? @map("end_date") ustValue Decimal? @map("ust_value") isActive Boolean @default(true) @map("is_active") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") client Client @relation(fields: [clientId], references: [id]) projects Project[] deliverables Deliverable[] workOrders WorkOrder[] @@map("contracts") } model Project { id String @id @default(uuid()) contractId String @map("contract_id") name String code String? description String? startDate DateTime? @map("start_date") endDate DateTime? @map("end_date") isActive Boolean @default(true) @map("is_active") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") contract Contract @relation(fields: [contractId], references: [id]) deliverables Deliverable[] workOrders WorkOrderProject[] @@map("projects") } model Sprint { id String @id @default(uuid()) name String code String? status SprintStatus @default(RASCUNHO) startDate DateTime @map("start_date") endDate DateTime @map("end_date") goal String? isActive Boolean @default(true) @map("is_active") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") deliverables Deliverable[] history SprintHistory[] @relation("SprintHistory") targetHistory SprintHistory[] @relation("SprintHistoryTarget") @@map("sprints") } model Deliverable { id String @id @default(uuid()) code String @unique title String description String? status DeliverableStatus @default(RASCUNHO) type DeliverableType clientId String @map("client_id") contractId String @map("contract_id") projectId String @map("project_id") contractItemId String @map("contract_item_id") workOrderId String @map("work_order_id") sprintId String @map("sprint_id") startDate DateTime @map("start_date") expectedEndDate DateTime @map("expected_end_date") numWeeks Int @map("num_weeks") timeboxManutencao Decimal? @map("timebox_manutencao") ustValue Decimal? @map("ust_value") ustQuantity Decimal? @map("ust_quantity") totalValue Decimal? @map("total_value") isActive Boolean @default(true) @map("is_active") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") createdBy String? @map("created_by") updatedBy String? @map("updated_by") client Client @relation(fields: [clientId], references: [id]) contract Contract @relation(fields: [contractId], references: [id]) project Project @relation(fields: [projectId], references: [id]) contractItem ContractItem @relation(fields: [contractItemId], references: [id]) workOrder WorkOrder @relation(fields: [workOrderId], references: [id]) sprint Sprint @relation(fields: [sprintId], references: [id]) statusHistory DeliverableStatusHistory[] assignments DeliverableAssignment[] backlogItems DeliverableBacklogItem[] timelineEvents TimelineEvent[] notes Note[] sprintHistory SprintHistory[] allocations DeliverableAllocation[] @@map("deliverables") } model DeliverableStatusHistory { id String @id @default(uuid()) deliverableId String @map("deliverable_id") previousStatus DeliverableStatus? @map("previous_status") newStatus DeliverableStatus @map("new_status") observation String? createdAt DateTime @default(now()) @map("created_at") createdBy String? @map("created_by") deliverable Deliverable @relation(fields: [deliverableId], references: [id]) @@map("deliverable_status_history") } model DeliverableAssignment { id String @id @default(uuid()) deliverableId String @map("deliverable_id") professionalId String @map("professional_id") role String? startDate DateTime? @map("start_date") endDate DateTime? @map("end_date") observation String? isActive Boolean @default(true) @map("is_active") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") createdBy String? @map("created_by") deliverable Deliverable @relation(fields: [deliverableId], references: [id]) professional Professional @relation(fields: [professionalId], references: [id]) @@map("deliverable_assignments") } model DeliverableBacklogItem { id String @id @default(uuid()) deliverableId String @map("deliverable_id") title String description String? acceptanceCriteria String? @map("acceptance_criteria") status BacklogItemStatus @default(PENDENTE) rejectionReason String? @map("rejection_reason") sortOrder Int @default(0) @map("sort_order") isActive Boolean @default(true) @map("is_active") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") createdBy String? @map("created_by") updatedBy String? @map("updated_by") deliverable Deliverable @relation(fields: [deliverableId], references: [id]) @@map("deliverable_backlog_items") } model TimelineEvent { id String @id @default(uuid()) deliverableId String @map("deliverable_id") type TimelineEventType title String description String? metadata Json? createdAt DateTime @default(now()) @map("created_at") createdBy String? @map("created_by") deliverable Deliverable @relation(fields: [deliverableId], references: [id]) @@map("timeline_events") } model Note { id String @id @default(uuid()) deliverableId String @map("deliverable_id") type NoteType title String description String? isRelevant Boolean @default(false) @map("is_relevant") isActive Boolean @default(true) @map("is_active") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") createdBy String? @map("created_by") updatedBy String? @map("updated_by") deliverable Deliverable @relation(fields: [deliverableId], references: [id]) @@map("notes") } model SprintHistory { id String @id @default(uuid()) sprintId String @map("sprint_id") eventType SprintHistoryEventType @map("event_type") description String deliverableId String? @map("deliverable_id") targetSprintId String? @map("target_sprint_id") previousStatus SprintStatus? @map("previous_status") newStatus SprintStatus? @map("new_status") createdAt DateTime @default(now()) @map("created_at") createdBy String? @map("created_by") sprint Sprint @relation("SprintHistory", fields: [sprintId], references: [id]) targetSprint Sprint? @relation("SprintHistoryTarget", fields: [targetSprintId], references: [id]) deliverable Deliverable? @relation(fields: [deliverableId], references: [id]) @@map("sprint_history") } model ClientProfile { id String @id @default(uuid()) name String isActive Boolean @default(true) @map("is_active") clientId String @map("client_id") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") client Client @relation(fields: [clientId], references: [id]) allocationTemplateItems AllocationTemplateItem[] deliverableAllocations DeliverableAllocation[] @@map("client_profiles") } model AllocationTemplate { id String @id @default(uuid()) clientId String @map("client_id") sprintType SprintType @map("sprint_type") contractItemId String @map("contract_item_id") isActive Boolean @default(true) @map("is_active") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") client Client @relation(fields: [clientId], references: [id]) contractItem ContractItem @relation(fields: [contractItemId], references: [id]) items AllocationTemplateItem[] @@unique([clientId, sprintType, contractItemId]) @@map("allocation_templates") } model AllocationTemplateItem { id String @id @default(uuid()) templateId String @map("template_id") profileId String @map("profile_id") quantity Int allocationPercentage Decimal @map("allocation_percentage") template AllocationTemplate @relation(fields: [templateId], references: [id], onDelete: Cascade) profile ClientProfile @relation(fields: [profileId], references: [id]) @@map("allocation_template_items") } model DeliverableAllocation { id String @id @default(uuid()) deliverableId String @map("deliverable_id") profileId String @map("profile_id") quantity Int allocationPercentage Decimal @map("allocation_percentage") calculatedValue Decimal? @map("calculated_value") isActive Boolean @default(true) @map("is_active") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") createdBy String? @map("created_by") deliverable Deliverable @relation(fields: [deliverableId], references: [id]) profile ClientProfile @relation(fields: [profileId], references: [id]) @@map("deliverable_allocations") } model WorkOrder { id String @id @default(uuid()) code String name String description String? contractId String @map("contract_id") contractItemId String @map("contract_item_id") reservedUst Decimal @map("reserved_ust") totalValue Decimal? @map("total_value") status WorkOrderStatus @default(RASCUNHO) startDate DateTime @map("start_date") endDate DateTime? @map("end_date") isActive Boolean @default(true) @map("is_active") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") createdBy String? @map("created_by") updatedBy String? @map("updated_by") contract Contract @relation(fields: [contractId], references: [id]) contractItem ContractItem @relation(fields: [contractItemId], references: [id]) projects WorkOrderProject[] deliverables Deliverable[] statusHistory WorkOrderStatusHistory[] @@unique([code, contractId]) @@map("work_orders") } model WorkOrderProject { workOrderId String @map("work_order_id") projectId String @map("project_id") createdAt DateTime @default(now()) @map("created_at") workOrder WorkOrder @relation(fields: [workOrderId], references: [id], onDelete: Cascade) project Project @relation(fields: [projectId], references: [id]) @@id([workOrderId, projectId]) @@map("work_order_projects") } model WorkOrderStatusHistory { id String @id @default(uuid()) workOrderId String @map("work_order_id") previousStatus WorkOrderStatus? @map("previous_status") newStatus WorkOrderStatus @map("new_status") observation String? createdAt DateTime @default(now()) @map("created_at") createdBy String? @map("created_by") workOrder WorkOrder @relation(fields: [workOrderId], references: [id]) @@map("work_order_status_history") } model IntegrationApiKey { id String @id @default(uuid()) name String hashedKey String @unique @map("hashed_key") lastFourChars String @map("last_four_chars") scopes IntegrationScope[] isActive Boolean @default(true) @map("is_active") expiresAt DateTime? @map("expires_at") lastUsedAt DateTime? @map("last_used_at") rateLimitPerMinute Int @default(60) @map("rate_limit_per_minute") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") createdBy String? @map("created_by") updatedBy String? @map("updated_by") usages IntegrationApiKeyUsage[] @@map("integration_api_keys") } model IntegrationApiKeyUsage { id String @id @default(uuid()) apiKeyId String @map("api_key_id") endpoint String statusCode Int @map("status_code") ipAddress String? @map("ip_address") userAgent String? @map("user_agent") createdAt DateTime @default(now()) @map("created_at") apiKey IntegrationApiKey @relation(fields: [apiKeyId], references: [id]) @@index([apiKeyId]) @@map("integration_api_key_usage") }