- Backend NestJS com 12 módulos - Frontend React com dashboard e gestão - Manuais técnico e de negócios (MD + PDF) - Workflow de aprovação com alçadas - RBAC com 6 perfis de acesso
250 lines
23 KiB
TypeScript
250 lines
23 KiB
TypeScript
import { Injectable, OnModuleInit } from '@nestjs/common';
|
|
import { InjectRepository } from '@nestjs/typeorm';
|
|
import { Repository, DataSource } from 'typeorm';
|
|
import * as bcrypt from 'bcryptjs';
|
|
import { v4 as uuid } from 'uuid';
|
|
import { Perfil } from '../../modules/users/entities/perfil.entity';
|
|
import { Usuario } from '../../modules/users/entities/usuario.entity';
|
|
import { Local } from '../../modules/locais/entities/local.entity';
|
|
import { CentroCusto } from '../../modules/centros-custo/entities/centro-custo.entity';
|
|
import { Categoria } from '../../modules/categorias/entities/categoria.entity';
|
|
import { Fornecedor } from '../../modules/fornecedores/entities/fornecedor.entity';
|
|
import { Certidao } from '../../modules/fornecedores/entities/certidao.entity';
|
|
import { Demanda } from '../../modules/demandas/entities/demanda.entity';
|
|
import { ItemLinha } from '../../modules/demandas/entities/item-linha.entity';
|
|
import { Proposta } from '../../modules/propostas/entities/proposta.entity';
|
|
import { OrcamentoPlanejado } from '../../modules/orcamento/entities/orcamento-planejado.entity';
|
|
import { WorkflowAprovacao } from '../../modules/workflow/entities/workflow-aprovacao.entity';
|
|
import { OrdemServico } from '../../modules/ordens-servico/entities/ordem-servico.entity';
|
|
import { Alerta } from '../../modules/dashboard/entities/alerta.entity';
|
|
|
|
@Injectable()
|
|
export class SeedService {
|
|
constructor(
|
|
@InjectRepository(Perfil) private perfilRepo: Repository<Perfil>,
|
|
@InjectRepository(Usuario) private userRepo: Repository<Usuario>,
|
|
@InjectRepository(Local) private localRepo: Repository<Local>,
|
|
@InjectRepository(CentroCusto) private ccRepo: Repository<CentroCusto>,
|
|
@InjectRepository(Categoria) private catRepo: Repository<Categoria>,
|
|
@InjectRepository(Fornecedor) private fornRepo: Repository<Fornecedor>,
|
|
@InjectRepository(Certidao) private certRepo: Repository<Certidao>,
|
|
@InjectRepository(Demanda) private demandaRepo: Repository<Demanda>,
|
|
@InjectRepository(ItemLinha) private itemRepo: Repository<ItemLinha>,
|
|
@InjectRepository(Proposta) private propRepo: Repository<Proposta>,
|
|
@InjectRepository(OrcamentoPlanejado) private orcRepo: Repository<OrcamentoPlanejado>,
|
|
@InjectRepository(WorkflowAprovacao) private wfRepo: Repository<WorkflowAprovacao>,
|
|
@InjectRepository(OrdemServico) private osRepo: Repository<OrdemServico>,
|
|
@InjectRepository(Alerta) private alertaRepo: Repository<Alerta>,
|
|
) {}
|
|
|
|
async seed() {
|
|
const existingPerfis = await this.perfilRepo.count();
|
|
if (existingPerfis > 0) return;
|
|
|
|
console.log('🌱 Seeding database...');
|
|
const hash = await bcrypt.hash('123456', 10);
|
|
|
|
// Perfis
|
|
const perfis = [
|
|
{ id: uuid(), nome: 'solicitante', descricao: 'Solicitante de demandas', permissoes: {} },
|
|
{ id: uuid(), nome: 'gestor_facilities', descricao: 'Gestor de Facilities', permissoes: {} },
|
|
{ id: uuid(), nome: 'aprovador_financeiro', descricao: 'Aprovador Financeiro', permissoes: {} },
|
|
{ id: uuid(), nome: 'diretoria', descricao: 'Diretoria', permissoes: {} },
|
|
{ id: uuid(), nome: 'fornecedor', descricao: 'Fornecedor', permissoes: {} },
|
|
{ id: uuid(), nome: 'administrador', descricao: 'Administrador do Sistema', permissoes: {} },
|
|
];
|
|
await this.perfilRepo.save(perfis);
|
|
|
|
// Centros de Custo
|
|
const ccs = [
|
|
{ id: uuid(), codigo: 'CC-001', nome: 'Sede Corporativa SP' },
|
|
{ id: uuid(), codigo: 'CC-002', nome: 'Filial Rio de Janeiro' },
|
|
{ id: uuid(), codigo: 'CC-003', nome: 'Centro de Distribuição MG' },
|
|
{ id: uuid(), codigo: 'CC-004', nome: 'Escritório Curitiba' },
|
|
{ id: uuid(), codigo: 'CC-005', nome: 'Fábrica Campinas' },
|
|
];
|
|
await this.ccRepo.save(ccs);
|
|
|
|
// Usuários
|
|
const users = [
|
|
{ id: uuid(), nome: 'Admin Sistema', email: 'admin@hefesto.com', senha_hash: hash, perfil_id: perfis[5].id },
|
|
{ id: uuid(), nome: 'Maria Silva', email: 'maria.silva@hefesto.com', senha_hash: hash, perfil_id: perfis[0].id },
|
|
{ id: uuid(), nome: 'João Santos', email: 'joao.santos@hefesto.com', senha_hash: hash, perfil_id: perfis[1].id },
|
|
{ id: uuid(), nome: 'Ana Oliveira', email: 'ana.oliveira@hefesto.com', senha_hash: hash, perfil_id: perfis[2].id },
|
|
{ id: uuid(), nome: 'Carlos Mendes', email: 'carlos.mendes@hefesto.com', senha_hash: hash, perfil_id: perfis[3].id },
|
|
{ id: uuid(), nome: 'Roberto Lima', email: 'roberto.lima@hefesto.com', senha_hash: hash, perfil_id: perfis[0].id },
|
|
{ id: uuid(), nome: 'Fernanda Costa', email: 'fernanda.costa@hefesto.com', senha_hash: hash, perfil_id: perfis[1].id },
|
|
{ id: uuid(), nome: 'Paulo Rodrigues', email: 'paulo.rodrigues@hefesto.com', senha_hash: hash, perfil_id: perfis[4].id },
|
|
{ id: uuid(), nome: 'Luciana Ferreira', email: 'luciana.ferreira@hefesto.com', senha_hash: hash, perfil_id: perfis[4].id },
|
|
{ id: uuid(), nome: 'Ricardo Almeida', email: 'ricardo.almeida@hefesto.com', senha_hash: hash, perfil_id: perfis[4].id },
|
|
];
|
|
await this.userRepo.save(users);
|
|
|
|
// Locais
|
|
const locais = [
|
|
{ id: uuid(), nome: 'Torre Norte - SP', endereco: 'Av. Paulista, 1000, São Paulo - SP', centro_custo_id: ccs[0].id, responsavel_id: users[2].id },
|
|
{ id: uuid(), nome: 'Torre Sul - SP', endereco: 'Av. Paulista, 1002, São Paulo - SP', centro_custo_id: ccs[0].id, responsavel_id: users[2].id },
|
|
{ id: uuid(), nome: 'Escritório RJ', endereco: 'Rua do Ouvidor, 50, Rio de Janeiro - RJ', centro_custo_id: ccs[1].id, responsavel_id: users[6].id },
|
|
{ id: uuid(), nome: 'CD Betim', endereco: 'Rod. Fernão Dias, km 492, Betim - MG', centro_custo_id: ccs[2].id, responsavel_id: users[2].id },
|
|
{ id: uuid(), nome: 'Fábrica Campinas', endereco: 'Distrito Industrial, Campinas - SP', centro_custo_id: ccs[4].id, responsavel_id: users[6].id },
|
|
];
|
|
await this.localRepo.save(locais);
|
|
|
|
// Categorias
|
|
const cats = [
|
|
{ id: uuid(), nome: 'Manutenção Predial', criticidade_padrao: 'media', sla_dias: 15 },
|
|
{ id: uuid(), nome: 'Climatização e HVAC', criticidade_padrao: 'alta', sla_dias: 7 },
|
|
{ id: uuid(), nome: 'Limpeza e Conservação', criticidade_padrao: 'baixa', sla_dias: 30 },
|
|
{ id: uuid(), nome: 'Segurança Patrimonial', criticidade_padrao: 'critica', sla_dias: 3 },
|
|
{ id: uuid(), nome: 'Elétrica e Iluminação', criticidade_padrao: 'alta', sla_dias: 10 },
|
|
{ id: uuid(), nome: 'Paisagismo', criticidade_padrao: 'baixa', sla_dias: 45 },
|
|
{ id: uuid(), nome: 'Dedetização e Controle de Pragas', criticidade_padrao: 'media', sla_dias: 15 },
|
|
{ id: uuid(), nome: 'Reforma e Adequação', criticidade_padrao: 'media', sla_dias: 60 },
|
|
];
|
|
await this.catRepo.save(cats);
|
|
|
|
// Fornecedores
|
|
const forns = [
|
|
{ id: uuid(), tipo_pessoa: 'PJ', cpf_cnpj: '12.345.678/0001-90', razao_social: 'TechClima Engenharia Ltda', nome_fantasia: 'TechClima', email: 'contato@techclima.com.br', telefone: '(11) 3456-7890', rating: 4.5, usuario_id: users[7].id, categorias_atendidas: [cats[1].id] },
|
|
{ id: uuid(), tipo_pessoa: 'PJ', cpf_cnpj: '23.456.789/0001-01', razao_social: 'ServiLimp Serviços de Limpeza S/A', nome_fantasia: 'ServiLimp', email: 'comercial@servilimp.com.br', telefone: '(11) 2345-6789', rating: 3.8, usuario_id: users[8].id, categorias_atendidas: [cats[2].id] },
|
|
{ id: uuid(), tipo_pessoa: 'PJ', cpf_cnpj: '34.567.890/0001-12', razao_social: 'Forte Segurança Empresarial Ltda', nome_fantasia: 'Forte Seg', email: 'propostas@forteseg.com.br', telefone: '(21) 3456-7890', rating: 4.2, usuario_id: users[9].id, categorias_atendidas: [cats[3].id] },
|
|
{ id: uuid(), tipo_pessoa: 'PJ', cpf_cnpj: '45.678.901/0001-23', razao_social: 'EletroForce Instalações Elétricas', nome_fantasia: 'EletroForce', email: 'orcamento@eletroforce.com.br', telefone: '(11) 4567-8901', rating: 4.0, categorias_atendidas: [cats[4].id] },
|
|
{ id: uuid(), tipo_pessoa: 'PJ', cpf_cnpj: '56.789.012/0001-34', razao_social: 'Predial Master Engenharia', nome_fantasia: 'Predial Master', email: 'contato@predialmaster.com.br', telefone: '(11) 5678-9012', rating: 4.7, categorias_atendidas: [cats[0].id, cats[7].id] },
|
|
];
|
|
await this.fornRepo.save(forns);
|
|
|
|
// Certidões
|
|
const certs = [
|
|
{ id: uuid(), fornecedor_id: forns[0].id, tipo: 'CND Federal', numero: 'CND-2026-001', data_emissao: '2026-01-10', data_validade: '2026-07-10', status: 'vigente' },
|
|
{ id: uuid(), fornecedor_id: forns[0].id, tipo: 'CND Estadual', numero: 'CND-2026-002', data_emissao: '2026-01-15', data_validade: '2026-07-15', status: 'vigente' },
|
|
{ id: uuid(), fornecedor_id: forns[1].id, tipo: 'CND Federal', numero: 'CND-2025-100', data_emissao: '2025-06-01', data_validade: '2025-12-01', status: 'vencida' },
|
|
{ id: uuid(), fornecedor_id: forns[2].id, tipo: 'CND Federal', numero: 'CND-2026-050', data_emissao: '2026-01-20', data_validade: '2026-07-20', status: 'vigente' },
|
|
{ id: uuid(), fornecedor_id: forns[2].id, tipo: 'FGTS', numero: 'CRF-2026-003', data_emissao: '2026-01-05', data_validade: '2026-02-05', status: 'vigente' },
|
|
{ id: uuid(), fornecedor_id: forns[3].id, tipo: 'CND Municipal', numero: 'CND-2026-080', data_emissao: '2025-12-15', data_validade: '2026-06-15', status: 'vigente' },
|
|
{ id: uuid(), fornecedor_id: forns[4].id, tipo: 'CND Federal', numero: 'CND-2026-200', data_emissao: '2026-02-01', data_validade: '2026-08-01', status: 'vigente' },
|
|
{ id: uuid(), fornecedor_id: forns[4].id, tipo: 'CND Trabalhista', numero: 'CNDT-2026-010', data_emissao: '2026-01-25', data_validade: '2026-07-25', status: 'vigente' },
|
|
];
|
|
await this.certRepo.save(certs);
|
|
|
|
// Demandas
|
|
const demandas = [
|
|
{ id: uuid(), numero: 1, titulo: 'Manutenção preventiva ar-condicionado Torre Norte', descricao: 'Revisão semestral de todos os 48 splits e 6 centrais de ar', local_id: locais[0].id, centro_custo_id: ccs[0].id, categoria_id: cats[1].id, criticidade: 'alta', status: 'em_cotacao', solicitante_id: users[1].id, gestor_id: users[2].id, data_desejada: '2026-03-15' },
|
|
{ id: uuid(), numero: 2, titulo: 'Contratação de serviço de limpeza - Escritório RJ', descricao: 'Limpeza diária do escritório RJ - 2 pavimentos, 800m²', local_id: locais[2].id, centro_custo_id: ccs[1].id, categoria_id: cats[2].id, criticidade: 'media', status: 'propostas_recebidas', solicitante_id: users[5].id, gestor_id: users[6].id },
|
|
{ id: uuid(), numero: 3, titulo: 'Instalação de câmeras de segurança - CD Betim', descricao: 'Instalação de 32 câmeras IP + NVR + cabeamento', local_id: locais[3].id, centro_custo_id: ccs[2].id, categoria_id: cats[3].id, criticidade: 'critica', status: 'em_aprovacao', solicitante_id: users[1].id, gestor_id: users[2].id },
|
|
{ id: uuid(), numero: 4, titulo: 'Troca de iluminação para LED - Torre Sul', descricao: 'Substituição de 500 lâmpadas fluorescentes por LED', local_id: locais[1].id, centro_custo_id: ccs[0].id, categoria_id: cats[4].id, criticidade: 'media', status: 'aprovada', solicitante_id: users[5].id, gestor_id: users[2].id },
|
|
{ id: uuid(), numero: 5, titulo: 'Reforma do refeitório - Fábrica Campinas', descricao: 'Reforma completa: piso, pintura, bancadas, instalações', local_id: locais[4].id, centro_custo_id: ccs[4].id, categoria_id: cats[7].id, criticidade: 'media', status: 'em_execucao', solicitante_id: users[1].id, gestor_id: users[6].id },
|
|
{ id: uuid(), numero: 6, titulo: 'Dedetização trimestral - Todas as unidades', descricao: 'Controle de pragas urbanas em todas as 5 unidades', local_id: locais[0].id, centro_custo_id: ccs[0].id, categoria_id: cats[6].id, criticidade: 'baixa', status: 'aberta', solicitante_id: users[5].id },
|
|
{ id: uuid(), numero: 7, titulo: 'Reparo no telhado - CD Betim', descricao: 'Vazamento em 3 pontos do galpão principal', local_id: locais[3].id, centro_custo_id: ccs[2].id, categoria_id: cats[0].id, criticidade: 'alta', status: 'em_escopo', solicitante_id: users[1].id, gestor_id: users[2].id },
|
|
{ id: uuid(), numero: 8, titulo: 'Manutenção do paisagismo - Sede SP', descricao: 'Poda, jardinagem e manutenção das áreas verdes', local_id: locais[0].id, centro_custo_id: ccs[0].id, categoria_id: cats[5].id, criticidade: 'baixa', status: 'rascunho', solicitante_id: users[5].id },
|
|
{ id: uuid(), numero: 9, titulo: 'Instalação de gerador de emergência - Torre Norte', descricao: 'Gerador diesel 500kVA com QTA', local_id: locais[0].id, centro_custo_id: ccs[0].id, categoria_id: cats[4].id, criticidade: 'critica', status: 'concluida', solicitante_id: users[1].id, gestor_id: users[2].id },
|
|
{ id: uuid(), numero: 10, titulo: 'Adequação NR-10 - Fábrica Campinas', descricao: 'Adequação de quadros e instalações elétricas à NR-10', local_id: locais[4].id, centro_custo_id: ccs[4].id, categoria_id: cats[4].id, criticidade: 'alta', status: 'cancelada', solicitante_id: users[5].id, gestor_id: users[6].id },
|
|
];
|
|
await this.demandaRepo.save(demandas);
|
|
|
|
// Itens de Linha
|
|
const itens = [
|
|
{ id: uuid(), demanda_id: demandas[0].id, descricao: 'Revisão splits 9000 BTUs (24 un)', tipo: 'mao_de_obra', quantidade: 24, unidade: 'un', ordem: 1 },
|
|
{ id: uuid(), demanda_id: demandas[0].id, descricao: 'Revisão splits 12000 BTUs (18 un)', tipo: 'mao_de_obra', quantidade: 18, unidade: 'un', ordem: 2 },
|
|
{ id: uuid(), demanda_id: demandas[0].id, descricao: 'Revisão splits 18000 BTUs (6 un)', tipo: 'mao_de_obra', quantidade: 6, unidade: 'un', ordem: 3 },
|
|
{ id: uuid(), demanda_id: demandas[0].id, descricao: 'Revisão centrais de ar (6 un)', tipo: 'mao_de_obra', quantidade: 6, unidade: 'un', ordem: 4 },
|
|
{ id: uuid(), demanda_id: demandas[0].id, descricao: 'Filtros de reposição', tipo: 'material', quantidade: 54, unidade: 'un', ordem: 5 },
|
|
{ id: uuid(), demanda_id: demandas[2].id, descricao: 'Câmera IP 4MP Hikvision', tipo: 'material', quantidade: 32, unidade: 'un', ordem: 1 },
|
|
{ id: uuid(), demanda_id: demandas[2].id, descricao: 'NVR 32 canais', tipo: 'equipamento', quantidade: 1, unidade: 'un', ordem: 2 },
|
|
{ id: uuid(), demanda_id: demandas[2].id, descricao: 'Cabo UTP Cat6 (caixa 305m)', tipo: 'material', quantidade: 4, unidade: 'cx', ordem: 3 },
|
|
{ id: uuid(), demanda_id: demandas[2].id, descricao: 'Instalação e configuração', tipo: 'mao_de_obra', quantidade: 1, unidade: 'vb', ordem: 4 },
|
|
{ id: uuid(), demanda_id: demandas[4].id, descricao: 'Demolição e remoção', tipo: 'mao_de_obra', quantidade: 1, unidade: 'vb', ordem: 1 },
|
|
{ id: uuid(), demanda_id: demandas[4].id, descricao: 'Piso porcelanato 60x60', tipo: 'material', quantidade: 120, unidade: 'm²', ordem: 2 },
|
|
{ id: uuid(), demanda_id: demandas[4].id, descricao: 'Pintura epóxi paredes', tipo: 'mao_de_obra', quantidade: 280, unidade: 'm²', ordem: 3 },
|
|
];
|
|
await this.itemRepo.save(itens);
|
|
|
|
// Propostas
|
|
const propostas = [
|
|
// Demanda 1 - Ar condicionado
|
|
{ id: uuid(), demanda_id: demandas[0].id, fornecedor_id: forns[0].id, valor_bruto: 48500, valor_liquido: 42350, impostos: { iss: 2425, inss: 2425, pcc: 1300 }, condicao_pagamento: '30/60 dias', prazo_execucao_dias: 15, status: 'recebida', match_escopo_pct: 95 },
|
|
{ id: uuid(), demanda_id: demandas[0].id, fornecedor_id: forns[3].id, valor_bruto: 52000, valor_liquido: 45500, impostos: { iss: 2600, inss: 2600, pcc: 1300 }, condicao_pagamento: '30 dias', prazo_execucao_dias: 10, status: 'recebida', match_escopo_pct: 88 },
|
|
// Demanda 2 - Limpeza
|
|
{ id: uuid(), demanda_id: demandas[1].id, fornecedor_id: forns[1].id, valor_bruto: 18500, valor_liquido: 16200, impostos: { iss: 925, inss: 925, pcc: 450 }, condicao_pagamento: 'Mensal', prazo_execucao_dias: 365, status: 'analisada', match_escopo_pct: 100 },
|
|
{ id: uuid(), demanda_id: demandas[1].id, fornecedor_id: forns[4].id, valor_bruto: 21000, valor_liquido: 18400, impostos: { iss: 1050, inss: 1050, pcc: 500 }, condicao_pagamento: 'Mensal', prazo_execucao_dias: 365, status: 'recebida', match_escopo_pct: 92 },
|
|
// Demanda 3 - Câmeras
|
|
{ id: uuid(), demanda_id: demandas[2].id, fornecedor_id: forns[2].id, valor_bruto: 145000, valor_liquido: 126800, impostos: { iss: 7250, inss: 7250, pcc: 3700 }, condicao_pagamento: '30/60/90 dias', prazo_execucao_dias: 30, status: 'selecionada', selecionada: true, match_escopo_pct: 97 },
|
|
{ id: uuid(), demanda_id: demandas[2].id, fornecedor_id: forns[3].id, valor_bruto: 158000, valor_liquido: 138200, impostos: { iss: 7900, inss: 7900, pcc: 4000 }, condicao_pagamento: '50% + 50%', prazo_execucao_dias: 25, status: 'rejeitada', match_escopo_pct: 85 },
|
|
{ id: uuid(), demanda_id: demandas[2].id, fornecedor_id: forns[4].id, valor_bruto: 139000, valor_liquido: 121600, impostos: { iss: 6950, inss: 6950, pcc: 3500 }, condicao_pagamento: '30/60/90 dias', prazo_execucao_dias: 35, status: 'rejeitada', match_escopo_pct: 90 },
|
|
// Demanda 4 - LED
|
|
{ id: uuid(), demanda_id: demandas[3].id, fornecedor_id: forns[3].id, valor_bruto: 75000, valor_liquido: 65600, impostos: { iss: 3750, inss: 3750, pcc: 1900 }, condicao_pagamento: '30/60 dias', prazo_execucao_dias: 20, status: 'selecionada', selecionada: true, match_escopo_pct: 98 },
|
|
{ id: uuid(), demanda_id: demandas[3].id, fornecedor_id: forns[0].id, valor_bruto: 82000, valor_liquido: 71800, impostos: { iss: 4100, inss: 4100, pcc: 2000 }, condicao_pagamento: '30 dias', prazo_execucao_dias: 25, status: 'rejeitada', match_escopo_pct: 93 },
|
|
// Demanda 5 - Reforma refeitório
|
|
{ id: uuid(), demanda_id: demandas[4].id, fornecedor_id: forns[4].id, valor_bruto: 280000, valor_liquido: 245000, impostos: { iss: 14000, inss: 14000, pcc: 7000 }, condicao_pagamento: 'Medição mensal', prazo_execucao_dias: 90, status: 'selecionada', selecionada: true, match_escopo_pct: 100 },
|
|
{ id: uuid(), demanda_id: demandas[4].id, fornecedor_id: forns[3].id, valor_bruto: 310000, valor_liquido: 271200, impostos: { iss: 15500, inss: 15500, pcc: 7800 }, condicao_pagamento: '30/60/90 dias', prazo_execucao_dias: 75, status: 'rejeitada', match_escopo_pct: 88 },
|
|
// Demanda 9 - Gerador
|
|
{ id: uuid(), demanda_id: demandas[8].id, fornecedor_id: forns[3].id, valor_bruto: 320000, valor_liquido: 280000, impostos: { iss: 16000, inss: 16000, pcc: 8000 }, condicao_pagamento: '50% + 50%', prazo_execucao_dias: 45, status: 'selecionada', selecionada: true, match_escopo_pct: 96 },
|
|
{ id: uuid(), demanda_id: demandas[8].id, fornecedor_id: forns[4].id, valor_bruto: 295000, valor_liquido: 258100, impostos: { iss: 14750, inss: 14750, pcc: 7400 }, condicao_pagamento: '30/60/90 dias', prazo_execucao_dias: 60, status: 'rejeitada', match_escopo_pct: 91 },
|
|
{ id: uuid(), demanda_id: demandas[8].id, fornecedor_id: forns[0].id, valor_bruto: 345000, valor_liquido: 301800, impostos: { iss: 17250, inss: 17250, pcc: 8700 }, condicao_pagamento: '30 dias', prazo_execucao_dias: 40, status: 'rejeitada', match_escopo_pct: 82 },
|
|
];
|
|
await this.propRepo.save(propostas);
|
|
|
|
// Workflow
|
|
const workflows = [
|
|
{ id: uuid(), demanda_id: demandas[2].id, proposta_id: propostas[4].id, valor_total: 145000, status: 'em_andamento', etapa_atual: 2, etapas: [
|
|
{ ordem: 1, perfil: 'gestor_facilities', status: 'aprovado', data_acao: '2026-02-05T10:00:00Z', observacao: 'Projeto necessário para segurança', ressalva: false },
|
|
{ ordem: 2, perfil: 'aprovador_financeiro', status: 'pendente', data_acao: null, observacao: null, ressalva: false },
|
|
{ ordem: 3, perfil: 'diretoria', status: 'pendente', data_acao: null, observacao: null, ressalva: false },
|
|
]},
|
|
{ id: uuid(), demanda_id: demandas[3].id, proposta_id: propostas[7].id, valor_total: 75000, status: 'aprovado', etapa_atual: 3, etapas: [
|
|
{ ordem: 1, perfil: 'gestor_facilities', status: 'aprovado', data_acao: '2026-01-20T09:00:00Z', observacao: 'OK', ressalva: false },
|
|
{ ordem: 2, perfil: 'aprovador_financeiro', status: 'aprovado', data_acao: '2026-01-21T14:00:00Z', observacao: 'Dentro do orçamento', ressalva: false },
|
|
{ ordem: 3, perfil: 'diretoria', status: 'aprovado', data_acao: '2026-01-22T11:00:00Z', observacao: 'Aprovado', ressalva: false },
|
|
]},
|
|
{ id: uuid(), demanda_id: demandas[4].id, proposta_id: propostas[9].id, valor_total: 280000, status: 'aprovado', etapa_atual: 3, etapas: [
|
|
{ ordem: 1, perfil: 'gestor_facilities', status: 'aprovado', data_acao: '2026-01-10T10:00:00Z', observacao: 'Urgente', ressalva: false },
|
|
{ ordem: 2, perfil: 'aprovador_financeiro', status: 'aprovado_com_ressalva', data_acao: '2026-01-11T16:00:00Z', observacao: 'Verificar possibilidade de parcelamento maior', ressalva: true },
|
|
{ ordem: 3, perfil: 'diretoria', status: 'aprovado', data_acao: '2026-01-12T09:00:00Z', observacao: 'Aprovado', ressalva: false },
|
|
]},
|
|
];
|
|
await this.wfRepo.save(workflows);
|
|
|
|
// Ordens de Serviço
|
|
const oss = [
|
|
{ id: uuid(), numero: 1, demanda_id: demandas[3].id, proposta_id: propostas[7].id, fornecedor_id: forns[3].id, valor: 75000, status: 'emitida', data_inicio: null },
|
|
{ id: uuid(), numero: 2, demanda_id: demandas[4].id, proposta_id: propostas[9].id, fornecedor_id: forns[4].id, valor: 280000, status: 'em_execucao', data_inicio: '2026-01-20' },
|
|
{ id: uuid(), numero: 3, demanda_id: demandas[8].id, proposta_id: propostas[11].id, fornecedor_id: forns[3].id, valor: 320000, status: 'concluida', data_inicio: '2025-11-01', data_conclusao: '2025-12-15' },
|
|
];
|
|
await this.osRepo.save(oss);
|
|
|
|
// Orçamento Planejado 2026
|
|
const orcData = [];
|
|
for (let mes = 1; mes <= 12; mes++) {
|
|
for (const cc of ccs) {
|
|
for (const cat of cats.slice(0, 5)) {
|
|
orcData.push({
|
|
id: uuid(),
|
|
ano: 2026,
|
|
mes,
|
|
centro_custo_id: cc.id,
|
|
categoria_id: cat.id,
|
|
valor_planejado: Math.round((15000 + Math.random() * 85000) * 100) / 100,
|
|
valor_comprometido: mes <= 2 ? Math.round(Math.random() * 30000 * 100) / 100 : 0,
|
|
valor_realizado: mes <= 1 ? Math.round(Math.random() * 20000 * 100) / 100 : 0,
|
|
});
|
|
}
|
|
}
|
|
}
|
|
// Save in batches
|
|
for (let i = 0; i < orcData.length; i += 50) {
|
|
await this.orcRepo.save(orcData.slice(i, i + 50));
|
|
}
|
|
|
|
// Alertas
|
|
const alertas = [
|
|
{ id: uuid(), usuario_id: users[3].id, tipo: 'aprovacao_pendente', titulo: 'Aprovação pendente: Câmeras CD Betim', mensagem: 'A demanda #3 aguarda sua aprovação financeira. Valor: R$ 145.000,00', entidade: 'workflow', entidade_id: workflows[0].id },
|
|
{ id: uuid(), usuario_id: users[2].id, tipo: 'sla_vencendo', titulo: 'SLA próximo: Dedetização', mensagem: 'A demanda #6 está há 10 dias sem andamento', entidade: 'demanda', entidade_id: demandas[5].id },
|
|
{ id: uuid(), usuario_id: users[0].id, tipo: 'certidao_vencendo', titulo: 'Certidão vencida: ServiLimp', mensagem: 'A CND Federal da ServiLimp está vencida desde 01/12/2025', entidade: 'fornecedor', entidade_id: forns[1].id },
|
|
{ id: uuid(), usuario_id: users[2].id, tipo: 'estouro_orcamento', titulo: 'Alerta de orçamento: CC Sede SP', mensagem: 'O centro de custo CC-001 está com comprometimento acima de 80% para Climatização em Janeiro', entidade: 'orcamento' },
|
|
{ id: uuid(), usuario_id: users[6].id, tipo: 'os_atrasada', titulo: 'OS em atraso: Reforma Refeitório', mensagem: 'A OS #2 está em execução há mais de 30 dias', entidade: 'ordem_servico', entidade_id: oss[1].id },
|
|
];
|
|
await this.alertaRepo.save(alertas);
|
|
|
|
console.log('✅ Seed completed!');
|
|
}
|
|
}
|