feat(seeder): add ACME Corporation with 69 hilarious tech jobs

🏭 ACME Corp - Fornecedora Oficial do Coiote desde 1949

- Added acme.js seeder with 69 creative job postings
- Jobs include: Dev de TNT Inteligente, ML Engineer de Detecção de Papa-Léguas, Chief Explosion Officer, etc.
- Added Wile E. Coyote user (wile_e_coyote / MeepMeep@123)
- Updated README with ACME documentation
- Integrated ACME seeder into main flow

'Se não explodir, não é ACME!' ™
This commit is contained in:
Tiago Yamamoto 2025-12-22 22:32:17 -03:00
parent 018ded2659
commit e6bc791ee8
3 changed files with 313 additions and 6 deletions

View file

@ -12,16 +12,34 @@ Microserviço para popular o banco de dados com dados realistas de teste.
| Entidade | Quantidade | Descrição |
|----------|------------|-----------|
| **SuperAdmin** | 1 | Usuário administrador do sistema |
| **Empresas** | 10 | Empresas reais (Toyota, Honda, etc.) |
| **Admins/Recruiters** | 8 | Usuários de empresas |
| **Empresas** | 31 | 30 empresas tech + 🏭 ACME Corp |
| **Admins/Recruiters** | 8+ | Usuários de empresas |
| **Candidatos** | 30 | Job seekers de várias nacionalidades |
| **Vagas** | 50 | Vagas realistas com requisitos |
| **Vagas** | 1059 | 990 vagas normais + 69 vagas ACME (humor tech) |
| **Candidaturas** | 20 | Aplicações de exemplo |
| **Prefeituras** | 47 | Todas as prefeituras japonesas |
| **Cidades** | ~50 | Cidades de Aichi e Tokyo |
---
## 🏭 ACME Corporation
> "Se não explodir, não é ACME!" ™
A ACME Corp é nossa empresa especial com **69 vagas de tecnologia com humor**, inspirada nos clássicos Looney Tunes.
### Destaques das Vagas ACME:
- 🚀 Engenheiro de Software de Foguetes Portáteis
- 💣 Dev de TNT Inteligente
- 🕳️ Arquiteto de Túneis Instantâneos
- 📊 Data Scientist de Previsão de Falhas (Accuracy: 100%)
- 🦅 ML Engineer de Detecção de Papa-Léguas (Precision: 0%)
- 💥 Chief Explosion Officer (CEO)
- 🎨 UX Designer de Dinamite
- E mais 62 vagas hilárias...
---
## 🚀 Uso
### Instalação
@ -67,12 +85,19 @@ DB_NAME=gohorsejobs
- **Senha**: `Takeshi@2025`
### Recrutador
- **Login**: `maria_santos`
- **Login**: `maria_santos` (DesignHub)
- **Senha**: `User@2025`
### 🐺 Wile E. Coyote (ACME Corp)
- **Login**: `wile_e_coyote`
- **Senha**: `MeepMeep@123`
- **Empresa**: ACME Corporation
- **Cargo**: HR Manager & Chief Failure Officer
### Candidatos (todos usam mesma senha)
- **Login**: `paulo_santos`
- **Login**: `maria@email.com`
- **Login**: `ana_silva`, `carlos_santos`, `maria_oliveira`, `pedro_costa`, `juliana_ferreira`
- **Senha**: `User@2025`
---
@ -87,6 +112,7 @@ src/
├── users.js # Seed de usuários
├── companies.js # Seed de empresas
├── jobs.js # Seed de vagas
├── acme.js # 🏭 ACME Corp + 69 vagas com humor
├── cities.js # Seed de cidades
└── applications.js # Seed de candidaturas
```
@ -98,3 +124,5 @@ src/
- Execute as **migrations** antes do seed
- Use apenas em ambiente de **desenvolvimento**
- Senhas padrão são **apenas para testes**
- **ACME não se responsabiliza** por lesões causadas por produtos falhos 🐺

View file

@ -5,6 +5,7 @@ import { seedUsers } from './seeders/users.js';
import { seedCompanies } from './seeders/companies.js';
import { seedJobs } from './seeders/jobs.js';
import { seedApplications } from './seeders/applications.js';
import { seedAcmeCorp, seedWileECoyote } from './seeders/acme.js';
async function resetDatabase() {
console.log('🗑️ Resetting database...');
@ -58,6 +59,8 @@ async function seedDatabase() {
await seedCompanies();
await seedUsers();
await seedJobs();
await seedAcmeCorp(); // 🏭 ACME Corp + 69 vagas hilariantes
await seedWileECoyote(); // 🐺 Wile E. Coyote user
await seedApplications();
console.log('\n✅ Database seeding completed successfully!');
@ -65,8 +68,10 @@ async function seedDatabase() {
console.log(' - Regions seeded');
console.log(' - Cities seeded');
console.log(' - 1 SuperAdmin');
console.log(' - 30 Companies');
console.log(' - 990 Jobs (33 per company)');
console.log(' - 31 Companies (30 + ACME Corp)');
console.log(' - 1059 Jobs (990 + 69 ACME)');
console.log(' - 🏭 ACME Corp: 69 vagas com humor tech');
console.log(' - 🐺 Wile E. Coyote: wile_e_coyote / MeepMeep@123');
console.log(' - Work modes: onsite, hybrid, remote');
console.log(' - 20 Applications');

View file

@ -0,0 +1,274 @@
import { pool } from '../db.js';
import crypto from 'crypto';
/**
* 🎯 ACME Corporation - Fornecedora Oficial do Coiote desde 1949
*
* "Se não explodir, não é ACME!"
*
* Sede: Deserto de Mojave, Monument Valley, ou onde quer que o Papa-Léguas esteja.
* Endereço: Acme Corporation, Estrada do Deserto s/n, USA (entrega instantânea por catapulta)
*/
// 69 vagas com humor tech para a ACME Corp
const acmeJobTemplates = [
// === Desenvolvimento & Engenharia (jobs 1-20) ===
{ title: 'Engenheiro de Software de Foguetes Portáteis', skills: ['C++', 'Propulsão', 'Não Explodir'], salaryRange: [15000, 25000], desc: 'Desenvolver sistema de ignição que funcione ANTES de o usuário olhar para baixo.' },
{ title: 'Desenvolvedor Full Stack de Armadilhas', skills: ['React', 'Node.js', 'Física Cartoon'], salaryRange: [12000, 20000], desc: 'Criar UIs intuitivas para armadilhas que nunca funcionam conforme planejado.' },
{ title: 'Arquiteto de Sistemas de Catapultas', skills: ['AWS', 'Kubernetes', 'Balística'], salaryRange: [18000, 30000], desc: 'Projetar infraestrutura escalável para lançamento de coiotes a longas distâncias.' },
{ title: 'Dev Backend de Buracos Portáteis', skills: ['Python', 'Geometria Não-Euclidiana', 'ACME SDK'], salaryRange: [14000, 22000], desc: 'Implementar API REST para buracos que funcionam em qualquer superfície, exceto quando você precisa.' },
{ title: 'Frontend Engineer de Pedidos por Catálogo', skills: ['Vue.js', 'UX', 'Entrega Instantânea'], salaryRange: [10000, 16000], desc: 'Redesenhar o catálogo ACME para checkout em menos de 3 segundos.' },
{ title: 'Engenheiro de QA de Produtos Explosivos', skills: ['Selenium', 'Sobrevivência', 'Primeiros Socorros'], salaryRange: [8000, 40000], desc: 'Testar produtos ACME. Seguro de vida incluso. Alta rotatividade.' },
{ title: 'DevOps de Entregas Instantâneas', skills: ['Docker', 'Teletransporte', 'CI/CD'], salaryRange: [14000, 22000], desc: 'Garantir que produtos cheguem em 0.3 segundos, mesmo no meio do deserto.' },
{ title: 'Desenvolvedor de TNT Inteligente', skills: ['IoT', 'Sensores', 'Detonação Remota'], salaryRange: [16000, 26000], desc: 'Programar TNT com IA que sabe quando NÃO explodir (feature request do Coiote).' },
{ title: 'Engenheiro de Gravidade Seletiva', skills: ['Física Quântica', 'Cartoon Logic', 'Go'], salaryRange: [20000, 35000], desc: 'Desenvolver algoritmo que faz a gravidade funcionar apenas quando conveniente.' },
{ title: 'Programador de Placas de Penhascos', skills: ['React Native', 'GPS', 'Sinalização'], salaryRange: [9000, 14000], desc: 'Criar app que avisa "olhe para baixo" no momento certo.' },
{ title: 'SRE de Catapultas Gigantes', skills: ['Prometheus', 'Grafana', 'Elasticidade'], salaryRange: [15000, 24000], desc: 'Monitorar uptime de 99.9% em equipamentos que falham 100% das vezes.' },
{ title: 'Desenvolvedor de Patins-Foguete', skills: ['Rust', 'Propulsão', 'Freios?'], salaryRange: [13000, 21000], desc: 'Implementar sistema de frenagem. Urgente. Muito urgente.' },
{ title: 'Arquiteto de Túneis Instantâneos', skills: ['Three.js', '3D Modeling', 'Ilusão de Ótica'], salaryRange: [16000, 25000], desc: 'Projetar túneis que parecem reais mas só funcionam para Papa-Léguas.' },
{ title: 'Engenheiro de Machine Learning Anti-Bird', skills: ['TensorFlow', 'Computer Vision', 'Bip-Bip Detection'], salaryRange: [18000, 28000], desc: 'Treinar modelo para identificar Papa-Léguas. Dataset: 0 capturas bem-sucedidas.' },
{ title: 'Developer de Imãs Gigantes', skills: ['Eletromagnetismo', 'Física', 'Debugging'], salaryRange: [14000, 22000], desc: 'Corrigir bug onde imã atrai tudo EXCETO o alvo pretendido.' },
{ title: 'Programador de Guarda-Chuvas Anti-Bigorna', skills: ['C#', 'Resistência de Materiais', 'Otimismo'], salaryRange: [11000, 18000], desc: 'Desenvolver guarda-chuva que suporte 2 toneladas. Prazo: ontem.' },
{ title: 'Engenheiro de Som do Bip-Bip', skills: ['Audio Processing', 'FFT', 'Frustração'], salaryRange: [10000, 16000], desc: 'Analisar frequência do "Bip-Bip" para prever localização. Spoiler: não funciona.' },
{ title: 'Dev de Molas Gigantes', skills: ['Spring Boot', 'Elastic Stack', 'Física Clássica'], salaryRange: [12000, 19000], desc: 'Calcular trajetória de molas que sempre lançam na direção errada.' },
{ title: 'Arquiteto de Analytics de Falhas', skills: ['Apache Spark', 'Data Lake', 'Análise Post-Mortem'], salaryRange: [17000, 27000], desc: 'Construir dashboard de falhas. Sempre 100% no vermelho.' },
{ title: 'Desenvolvedor de Tintas Invisíveis', skills: ['WebGL', 'Shaders', 'Invisibilidade'], salaryRange: [13000, 20000], desc: 'Criar tinta que esconde buracos. Funciona apenas em demos.' },
// === Produto & Design (jobs 21-35) ===
{ title: 'Product Manager de Armadilhas', skills: ['Roadmap', 'Falhas', 'Pivoting'], salaryRange: [14000, 23000], desc: 'Priorizar features de armadilhas. Backlog: 3.847 itens, 0 entregas bem-sucedidas.' },
{ title: 'UX Designer de Dinamite', skills: ['Figma', 'User Research', 'Explosões'], salaryRange: [11000, 18000], desc: 'Redesenhar pavio de dinamite para melhor usabilidade durante perseguições.' },
{ title: 'UI Designer de Catálogos ACME', skills: ['Photoshop', 'Tipografia', 'Anos 50'], salaryRange: [9000, 15000], desc: 'Manter estética vintage do catálogo. Nada de dark mode.' },
{ title: 'Product Designer de Buracos Pintados', skills: ['Illustrator', 'Realismo', 'Ilusão'], salaryRange: [12000, 19000], desc: 'Projetar buracos 2D que pareçam 3D. Para todos, menos o Coiote.' },
{ title: 'Scrum Master de Projetos Explosivos', skills: ['Agile', 'Sprints (literais)', 'Retrospectivas'], salaryRange: [10000, 17000], desc: 'Facilitar sprints de 2 semanas que duram 3 segundos (e terminam em explosão).' },
{ title: 'Design Lead de Disfarces de Pedra', skills: ['3D Modeling', 'Texturização', 'Camuflagem'], salaryRange: [15000, 24000], desc: 'Liderar time de designers de disfarces que nunca enganam ninguém.' },
{ title: 'UX Researcher de Clientes Coiote', skills: ['Pesquisa Qualitativa', 'Empatia', 'Trauma'], salaryRange: [11000, 18000], desc: 'Entrevistar único cliente. Ele não consegue responder (está em queda livre).' },
{ title: 'Motion Designer de Explosões', skills: ['After Effects', 'Partículas', 'Timing Cômico'], salaryRange: [10000, 16000], desc: 'Animar explosões com timing perfeito. Estrelas girando na cabeça incluídas.' },
{ title: 'Information Architect de Manuais', skills: ['Documentação', 'Hierarquia', 'Avisos Ignorados'], salaryRange: [9000, 14000], desc: 'Organizar manuais que ninguém lê. "AVISO: NÃO OLHE PARA BAIXO" na página 347.' },
{ title: 'Brand Designer Anti-Papa-Léguas', skills: ['Branding', 'Identidade Visual', 'Vingança'], salaryRange: [12000, 20000], desc: 'Criar mascote corporativo que não seja humilhado por um pássaro.' },
{ title: 'Service Designer de Suporte ao Coiote', skills: ['Jornada do Cliente', 'Touchpoints', 'Dor'], salaryRange: [13000, 21000], desc: 'Mapear jornada do cliente. Spoiler: sempre termina no fundo de um canyon.' },
{ title: 'Design System Lead ACME', skills: ['Design Tokens', 'Componentes', 'Consistência'], salaryRange: [16000, 25000], desc: 'Criar sistema de design. Cores primárias: vermelho explosivo, preto chamuscado.' },
{ title: 'Accessibility Designer de Produtos', skills: ['WCAG', 'Inclusão', 'Bom Senso'], salaryRange: [11000, 18000], desc: 'Tornar produtos acessíveis. Adicionar aviso sonoro antes de explosões.' },
{ title: 'Product Owner de Foguetes', skills: ['Backlog', 'Priorização', 'Otimismo Irracional'], salaryRange: [14000, 22000], desc: 'Defender features de foguetes em reuniões. Taxa de sucesso: negativa.' },
{ title: 'Design QA de Bigornas', skills: ['Testes Visuais', 'Pixel Perfect', 'Peso'], salaryRange: [9000, 15000], desc: 'Verificar se bigornas estão pixeladas corretamente antes de cair.' },
// === Data & Analytics (jobs 36-45) ===
{ title: 'Data Scientist de Previsão de Falhas', skills: ['Python', 'Statistics', 'Pessimismo'], salaryRange: [16000, 26000], desc: 'Prever falhas de produtos. Accuracy: 100% (sempre falham).' },
{ title: 'Data Engineer de Pipeline de Explosões', skills: ['Airflow', 'Spark', 'ETL'], salaryRange: [14000, 23000], desc: 'Construir pipelines de dados de explosões. Volume: infinito.' },
{ title: 'Business Intelligence de Vendas', skills: ['Tableau', 'SQL', 'Negação'], salaryRange: [12000, 19000], desc: 'Criar dashboards mostrando vendas para único cliente há 75 anos.' },
{ title: 'ML Engineer de Detecção de Papa-Léguas', skills: ['PyTorch', 'YOLO', 'Frustração'], salaryRange: [17000, 27000], desc: 'Treinar detector. Precision: 0%. Recall: "ele já era".' },
{ title: 'Analytics Engineer de Métricas ACME', skills: ['DBT', 'Snowflake', 'Definição de Sucesso'], salaryRange: [15000, 24000], desc: 'Definir KPIs. Meta: reduzir falhas de 100% para 99.9%.' },
{ title: 'Data Analyst de Comportamento do Pássaro', skills: ['GA4', 'Mixpanel', 'Observação'], salaryRange: [11000, 18000], desc: 'Analisar padrões do Papa-Léguas. Conclusão: "ele corre muito rápido".' },
{ title: 'Quantitative Analyst de Apostas', skills: ['R', 'Monte Carlo', 'Vegas'], salaryRange: [18000, 28000], desc: 'Calcular probabilidade de captura. Resultado: 0.0000001%.' },
{ title: 'AI Research Scientist de Planos', skills: ['GPT', 'Reinforcement Learning', 'Arrependimento'], salaryRange: [20000, 32000], desc: 'Usar IA para criar planos melhores. IA: "desista".' },
{ title: 'Data Governance de Falhas', skills: ['Data Catalog', 'Lineage', 'Classificação'], salaryRange: [13000, 21000], desc: 'Catalogar 50 anos de falhas. Precisa de mais storage.' },
{ title: 'Growth Hacker ACME', skills: ['Experimentos', 'AB Testing', 'Milagres'], salaryRange: [14000, 22000], desc: 'Aumentar base de clientes. Cliente atual: 1. Meta: 2.' },
// === Infraestrutura & Ops (jobs 46-55) ===
{ title: 'Platform Engineer de Entrega Instantânea', skills: ['Terraform', 'Cloud', 'Teleporte'], salaryRange: [16000, 25000], desc: 'Manter infra de entrega em 0.3s. SLA: 99.9% de entregas, 100% de falhas.' },
{ title: 'Network Engineer de Comunicação Coiote', skills: ['TCP/IP', 'Sinalização', 'Fumaça'], salaryRange: [12000, 19000], desc: 'Manter rede de comunicação no deserto. Latência: problema do cliente.' },
{ title: 'Security Engineer de Patentes', skills: ['SOC2', 'Segredos Industriais', 'Espionagem'], salaryRange: [15000, 24000], desc: 'Proteger patentes de produtos que não funcionam de serem copiados.' },
{ title: 'Cloud Architect de Fábricas', skills: ['Multi-Cloud', 'Híbrido', 'Caos'], salaryRange: [19000, 30000], desc: 'Migrar fábricas para nuvem. Explosões agora são serverless.' },
{ title: 'SysAdmin de Servidores de Catálogo', skills: ['Linux', 'Uptime', 'Vintage'], salaryRange: [10000, 16000], desc: 'Manter servidor PDP-11 de 1972 que roda o catálogo.' },
{ title: 'Reliability Engineer de Teletransporte', skills: ['Chaos Engineering', 'Resiliência', 'Fé'], salaryRange: [17000, 26000], desc: 'Garantir confiabilidade de sistema que funciona quando quer.' },
{ title: 'Database Admin de Pedidos', skills: ['PostgreSQL', 'Backup', 'História'], salaryRange: [11000, 18000], desc: 'Gerenciar 75 anos de pedidos de um único cliente muito leal.' },
{ title: 'IT Support de Produtos ACME', skills: ['Troubleshooting', 'Paciência', 'Filosofia'], salaryRange: [7000, 12000], desc: 'Atender chamados: "meu foguete não para". Spoiler: não tem freio.' },
{ title: 'Incident Manager de Explosões', skills: ['Incident Response', 'Post-Mortem', 'Calma'], salaryRange: [14000, 22000], desc: 'Gerenciar incidentes. São tantos que viraram feature.' },
{ title: 'Cost Optimization de Bigornas', skills: ['FinOps', 'Bulk Buying', 'Logística'], salaryRange: [13000, 20000], desc: 'Otimizar custos de bigornas. Volume: 47 por dia.' },
// === Liderança & Gestão (jobs 56-65) ===
{ title: 'VP de Engenharia de Produtos Impossíveis', skills: ['Leadership', 'Estratégia', 'Resiliência'], salaryRange: [25000, 45000], desc: 'Liderar time de engenharia. Turnover: 100% (por razões físicas).' },
{ title: 'CTO de Inovação Explosiva', skills: ['Visão', 'Roadmap', 'Seguro de Vida'], salaryRange: [30000, 50000], desc: 'Definir futuro tecnológico da ACME. Previsão: mais explosões.' },
{ title: 'Director de R&D de Armadilhas', skills: ['Research', 'Development', 'Denial'], salaryRange: [22000, 38000], desc: 'Dirigir pesquisa de armadilhas que funcionem. Funding: ilimitado. Resultados: zero.' },
{ title: 'Engineering Manager de Foguetes', skills: ['People Management', '1-1s', 'Insurance'], salaryRange: [18000, 30000], desc: 'Gerenciar time de engenheiros de foguetes. Foco em retenção (literal).' },
{ title: 'Head de QA e Sobreviventes', skills: ['Test Strategy', 'Hiring', 'Eulogy Writing'], salaryRange: [20000, 32000], desc: 'Liderar QA. Principal desafio: encontrar testadores voluntários.' },
{ title: 'Director de Customer Success', skills: ['Retention', 'Upsell', 'Therapy'], salaryRange: [21000, 35000], desc: 'Garantir sucesso do cliente. Cliente atual precisa de terapia, não de sucesso.' },
{ title: 'VP de Produto Anti-Ave', skills: ['Product Strategy', 'Market Research', 'Obsessão'], salaryRange: [26000, 42000], desc: 'Definir estratégia de produto. Foco único: capturar Papa-Léguas.' },
{ title: 'Chief Explosion Officer (CEO)', skills: ['Vision', 'Inspiration', 'Fire Extinguisher'], salaryRange: [40000, 80000], desc: 'Liderar empresa. Escritório fica a 2km de distância de segurança.' },
{ title: 'Head de Segurança Ocupacional', skills: ['OSHA', 'Prevenção', 'Impossível'], salaryRange: [18000, 28000], desc: 'Implementar segurança no trabalho. Maior desafio da carreira.' },
{ title: 'Director de Parcerias Road Runner', skills: ['Negotiation', 'Diplomacy', 'Ironia'], salaryRange: [22000, 36000], desc: 'Negociar parceria com Papa-Léguas. Status: 75 anos sem resposta.' },
// === Especiais e Easter Eggs (jobs 66-69) ===
{ title: 'Estagiário de Testes de Produto (Urgente)', skills: ['Coragem', 'Agilidade', 'Plano de Saúde'], salaryRange: [800, 2000], desc: 'Testar novos produtos. Benefícios: todos, porque você vai precisar.' },
{ title: 'Ilustrador de Manuais "AVISO!"', skills: ['Illustrator', 'Perigo', 'Criatividade'], salaryRange: [9000, 14000], desc: 'Desenhar os 847 símbolos de aviso que ninguém lê.' },
{ title: 'Filosofo Corporativo de Fracassos', skills: ['Existencialismo', 'Camus', 'Sísifo'], salaryRange: [15000, 25000], desc: 'Dar significado a décadas de falhas. "A luta em si é suficiente para preencher o coração de um Coiote."' },
{ title: 'Narrador de Painéis de Queda', skills: ['Copywriting', 'Timing', 'Onomatopéia'], salaryRange: [10000, 16000], desc: 'Escrever textos para placas que aparecem antes de quedas. Ex: "Epa!", "Uh-oh", "Meep meep não vai me ajudar agora".' },
];
export async function seedAcmeCorp() {
console.log('🏭 Seeding ACME Corporation e 69 vagas hilariantes...');
try {
// Get or create a default region
const regionsRes = await pool.query('SELECT id FROM regions LIMIT 1');
const defaultRegionId = regionsRes.rows[0]?.id || null;
// 1. Create ACME Company
const acmeSlug = 'acme-corp';
const acmeCNPJ = '99.999.999/0001-99';
await pool.query(`
INSERT INTO companies (name, slug, type, document, address, region_id, phone, email, website, description, verified, active, logo_url)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)
ON CONFLICT (slug) DO UPDATE SET
name = EXCLUDED.name,
description = EXCLUDED.description,
verified = EXCLUDED.verified,
active = EXCLUDED.active
`, [
'ACME Corporation',
acmeSlug,
'company',
acmeCNPJ,
'Estrada do Deserto s/n, Monument Valley, Mojave, USA',
defaultRegionId,
'+1-800-ACME-TNT',
'careers@acme.corp',
'https://acme.corp',
JSON.stringify({
tagline: 'Se não explodir, não é ACME! ™',
founded: '1949',
ceo: 'Sr. Big Boss (nunca visto, apenas ouvido)',
mainClient: 'Wile E. Coyote - Cliente Leal há 75 anos',
headquarters: 'Deserto de Mojave (ou qualquer lugar onde o Papa-Léguas esteja)',
mission: 'Fornecer produtos de qualidade duvidosa para perseguição de aves corredoras',
values: ['Inovação Explosiva', 'Entrega Instantânea', 'Garantia de Entretenimento'],
disclaimer: 'ACME não se responsabiliza por lesões, explosões, quedas de penhascos, bigornas na cabeça, ou humilhação pública por um pássaro.'
}),
true,
true,
'https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Wile_E._Coyote_with_Acme_Rocket.svg/200px-Wile_E._Coyote_with_Acme_Rocket.svg.png'
]);
// Create Core Company entry
const acmeCoreId = 'acacacac-acac-acac-acac-acacacacacac'; // Memorable UUID
await pool.query(`
INSERT INTO core_companies (id, name, document, status)
VALUES ($1, $2, $3, 'ACTIVE')
ON CONFLICT (id) DO NOTHING
`, [acmeCoreId, 'ACME Corporation', acmeCNPJ]);
console.log(' ✓ ACME Corporation criada');
// 2. Get ACME company ID
const acmeRes = await pool.query("SELECT id FROM companies WHERE slug = 'acme-corp'");
const acmeCompanyId = acmeRes.rows[0].id;
// 3. Get or create seed user
await pool.query(`
INSERT INTO users (identifier, password_hash, role, full_name)
VALUES ('wile_e_coyote', '$2b$10$placeholder', 'recruiter', 'Wile E. Coyote - Genius (Self-Proclaimed)')
ON CONFLICT (identifier) DO NOTHING
`);
const seedUserRes = await pool.query("SELECT id FROM users WHERE identifier IN ('wile_e_coyote', 'system_seed') LIMIT 1");
const seedUserId = seedUserRes.rows[0]?.id || 1;
// 4. Seed 69 jobs
const workModes = ['onsite', 'hybrid', 'remote'];
const benefits = [
'Seguro de Vida Premium (você vai precisar)',
'Plano de Saúde Ilimitado',
'Kit de Primeiros Socorros Reforçado',
'Uniforme À Prova de Explosão (parcial)',
'Vale Transporte por Catapulta',
'Vale Refeição (Papa-Léguas não incluso)',
'Gympass (para correr do Papa-Léguas)',
'Terapia Pós-Explosão',
'Desconto em Produtos ACME (use por sua conta e risco)',
'Home Office no Deserto',
'Flexible Hours (produtos explodem a qualquer hora)',
'Stock Options (valor: questionável)'
];
const locations = [
'Deserto de Mojave - Anywhere',
'Monument Valley - Canyon #47',
'Remote (Qualquer Penhasco)',
'Hybrid (Escritório + Deserto)',
'Fábrica ACME - Los Angeles/Toontown Border',
'Remote (Com vista para crateras)'
];
const levels = ['Junior', 'Pleno', 'Senior', 'Especialista', 'Traumatizado'];
for (let i = 0; i < 69; i++) {
const template = acmeJobTemplates[i];
const level = levels[i % levels.length];
const workMode = workModes[i % 3];
const location = locations[i % locations.length];
const title = `${level} ${template.title}`;
const salaryMin = template.salaryRange[0];
const salaryMax = template.salaryRange[1];
// Select random benefits
const selectedBenefits = [];
for (let b = 0; b < 4; b++) {
selectedBenefits.push(benefits[(i + b) % benefits.length]);
}
await pool.query(`
INSERT INTO jobs (company_id, created_by, title, description,
salary_min, salary_max, salary_type, employment_type, working_hours,
location, requirements, benefits, visa_support, language_level, status, work_mode)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16)
`, [
acmeCompanyId,
seedUserId,
title,
`🏭 ACME Corporation está contratando!\n\n${template.desc}\n\nRequisitos:\n- ${template.skills.join('\n- ')}\n- Tolerância a explosões\n- Resistência a quedas de grandes alturas\n- Habilidade de não olhar para baixo\n- Experiência em sobreviver\n\n⚠️ AVISO: ACME Corporation não se responsabiliza por acidentes envolvendo foguetes, bigornas, TNT, buracos pintados, ou Papa-Léguas.\n\n"Se você consegue ler este anúncio, você já é mais qualificado que nosso único cliente." - RH ACME`,
salaryMin,
salaryMax,
'monthly',
i % 3 === 0 ? 'full-time' : (i % 3 === 1 ? 'contract' : 'part-time'),
workMode === 'remote' ? 'Flexible (Explosões acontecem 24/7)' : '9:00-18:00 (ou até a próxima explosão)',
location,
JSON.stringify(template.skills),
JSON.stringify(selectedBenefits),
i % 5 === 0, // 20% offer visa support
'beginner',
'open',
workMode
]);
}
console.log(' ✓ 69 vagas ACME criadas com sucesso');
console.log(' 🎯 Tipos de vaga: Dev, Design, Data, Infra, Liderança, Easter Eggs');
console.log(' 💀 Disclaimer: Nenhum Coiote foi ferido na criação deste seeder (mentira)');
} catch (error) {
console.error(' ❌ Erro ao criar ACME Corp:', error.message);
throw error;
}
}
// Create a user for Wile E. Coyote
export async function seedWileECoyote() {
console.log('🐺 Criando usuário Wile E. Coyote...');
try {
const bcrypt = await import('bcrypt');
const hash = await bcrypt.default.hash('MeepMeep@123', 10);
await pool.query(`
INSERT INTO users (identifier, password_hash, role, full_name, email, city, state, bio, title)
VALUES ($1, $2, 'recruiter', $3, $4, $5, $6, $7, $8)
ON CONFLICT (identifier) DO UPDATE SET
full_name = EXCLUDED.full_name,
bio = EXCLUDED.bio
`, [
'wile_e_coyote',
hash,
'Wile E. Coyote',
'wile@acme.corp',
'Monument Valley',
'AZ',
'Super Gênio autoproclamado. 75 anos de experiência em perseguição de aves corredoras. Especialista em produtos ACME. Taxa de sucesso: confidencial.',
'HR Manager & Chief Failure Officer'
]);
console.log(' ✓ Wile E. Coyote criado (login: wile_e_coyote / senha: MeepMeep@123)');
} catch (error) {
console.error(' ❌ Erro ao criar Wile E. Coyote:', error.message);
}
}