import { PrismaClient } from '@prisma/client' import bcrypt from 'bcryptjs' const prisma = new PrismaClient() async function main() { console.log('🌱 Seeding database...') // ── Users ── const passwordHash = await bcrypt.hash('123456', 10) const admin = await prisma.user.upsert({ where: { email: 'admin@juridico.ai' }, update: {}, create: { name: 'Admin Sistema', email: 'admin@juridico.ai', password: passwordHash, role: 'ADMIN', plan: 'ENTERPRISE', credits: 9999, phone: '11999999999', }, }) const advogadoPro = await prisma.user.upsert({ where: { email: 'maria@advocacia.com' }, update: {}, create: { name: 'Maria Silva', email: 'maria@advocacia.com', password: passwordHash, role: 'ADVOGADO', plan: 'PRO', oabNumber: '123456', oabState: 'SP', credits: 100, phone: '11988888888', }, }) const advogadoFree = await prisma.user.upsert({ where: { email: 'joao@email.com' }, update: {}, create: { name: 'João Santos', email: 'joao@email.com', password: passwordHash, role: 'ADVOGADO', plan: 'FREE', oabNumber: '654321', oabState: 'RJ', credits: 5, phone: '21977777777', }, }) console.log('✅ Users created:', admin.name, advogadoPro.name, advogadoFree.name) // ── Subscriptions ── await prisma.subscription.createMany({ data: [ { userId: admin.id, plan: 'ENTERPRISE', status: 'ACTIVE' }, { userId: advogadoPro.id, plan: 'PRO', status: 'ACTIVE', stripeId: 'sub_mock_pro_001' }, { userId: advogadoFree.id, plan: 'FREE', status: 'ACTIVE' }, ], }) // ── Templates ── const templates = await Promise.all([ prisma.template.create({ data: { name: 'Petição Inicial Cível', description: 'Modelo de petição inicial para ações cíveis com fundamentação completa', type: 'PETICAO_INICIAL', area: 'CIVIL', prompt: 'Elabore uma petição inicial cível com os seguintes dados: {{fatos}}. Inclua fundamentação jurídica com base no CPC e CC, pedidos e valor da causa.', isPublic: true, userId: admin.id, }, }), prisma.template.create({ data: { name: 'Contestação Trabalhista', description: 'Modelo de contestação para reclamações trabalhistas', type: 'CONTESTACAO', area: 'TRABALHISTA', prompt: 'Elabore uma contestação trabalhista para a reclamação: {{fatos}}. Inclua preliminares, mérito e impugnação aos pedidos com base na CLT.', isPublic: true, userId: admin.id, }, }), prisma.template.create({ data: { name: 'Recurso de Apelação', description: 'Modelo de recurso de apelação com razões recursais', type: 'APELACAO', area: 'CIVIL', prompt: 'Elabore um recurso de apelação com base na sentença: {{sentenca}}. Apresente razões recursais, error in judicando/procedendo e pedido de reforma.', isPublic: true, userId: admin.id, }, }), prisma.template.create({ data: { name: 'Contrato de Prestação de Serviços', description: 'Modelo de contrato de prestação de serviços advocatícios', type: 'CONTRATO', area: 'CIVIL', prompt: 'Elabore um contrato de prestação de serviços entre {{contratante}} e {{contratado}}. Escopo: {{escopo}}. Valor: {{valor}}. Inclua cláusulas de confidencialidade, rescisão e foro.', isPublic: true, userId: admin.id, }, }), prisma.template.create({ data: { name: 'Habeas Corpus', description: 'Modelo de habeas corpus preventivo ou liberatório', type: 'HABEAS_CORPUS', area: 'PENAL', prompt: 'Elabore um habeas corpus {{tipo}} em favor de {{paciente}}, contra ato de {{autoridade_coatora}}. Fatos: {{fatos}}. Fundamente no art. 5º, LXVIII da CF e arts. 647-667 do CPP.', isPublic: true, userId: admin.id, }, }), ]) console.log('✅ Templates created:', templates.length) // ── Jurisprudências ── const jurisprudencias = await Promise.all([ prisma.jurisprudencia.create({ data: { tribunal: 'STF', numero: 'RE 1.322.076/SP', ementa: 'RECURSO EXTRAORDINÁRIO. DIREITO DO CONSUMIDOR. RESPONSABILIDADE CIVIL. DANO MORAL. INSCRIÇÃO INDEVIDA EM CADASTRO DE INADIMPLENTES. A inscrição indevida do nome do consumidor em cadastros de proteção ao crédito configura dano moral in re ipsa, dispensando a comprovação do prejuízo efetivo. Recurso extraordinário não provido.', data: '2024-03-15', area: 'CONSUMIDOR', relator: 'Min. Luís Roberto Barroso', orgaoJulgador: 'Primeira Turma', tags: JSON.stringify(['dano moral', 'consumidor', 'cadastro inadimplentes', 'SPC', 'Serasa']), }, }), prisma.jurisprudencia.create({ data: { tribunal: 'STJ', numero: 'REsp 2.045.123/RJ', ementa: 'RECURSO ESPECIAL. DIREITO CIVIL. RESPONSABILIDADE CIVIL. ACIDENTE DE TRÂNSITO. DANOS MATERIAIS E MORAIS. QUANTUM INDENIZATÓRIO. Revisão do valor da indenização por danos morais quando se mostrar irrisório ou excessivo. Manutenção do quantum fixado pelo Tribunal de origem dentro dos parâmetros de razoabilidade.', data: '2024-05-20', area: 'CIVIL', relator: 'Min. Nancy Andrighi', orgaoJulgador: 'Terceira Turma', tags: JSON.stringify(['acidente trânsito', 'dano moral', 'dano material', 'quantum indenizatório']), }, }), prisma.jurisprudencia.create({ data: { tribunal: 'STF', numero: 'ADI 6.341/DF', ementa: 'AÇÃO DIRETA DE INCONSTITUCIONALIDADE. DIREITO ADMINISTRATIVO. COMPETÊNCIA CONCORRENTE. ESTADOS E MUNICÍPIOS. MEDIDAS SANITÁRIAS. Reconhecimento da competência concorrente de estados e municípios para adoção de medidas restritivas durante emergência sanitária. Interpretação conforme à Constituição.', data: '2024-01-10', area: 'ADMINISTRATIVO', relator: 'Min. Marco Aurélio', orgaoJulgador: 'Tribunal Pleno', tags: JSON.stringify(['competência concorrente', 'saúde pública', 'federalismo', 'autonomia']), }, }), prisma.jurisprudencia.create({ data: { tribunal: 'STJ', numero: 'RHC 163.334/SC', ementa: 'RECURSO EM HABEAS CORPUS. DIREITO PENAL. FURTO. PRINCÍPIO DA INSIGNIFICÂNCIA. CRIME DE BAGATELA. Aplicação do princípio da insignificância ao furto de bem avaliado em valor inferior a 10% do salário mínimo. Atipicidade material da conduta. Recurso provido.', data: '2024-04-18', area: 'PENAL', relator: 'Min. Sebastião Reis Júnior', orgaoJulgador: 'Sexta Turma', tags: JSON.stringify(['furto', 'insignificância', 'bagatela', 'atipicidade']), }, }), prisma.jurisprudencia.create({ data: { tribunal: 'STF', numero: 'ARE 1.121.633/GO', ementa: 'AGRAVO EM RECURSO EXTRAORDINÁRIO. DIREITO DO TRABALHO. TERCEIRIZAÇÃO. ATIVIDADE-FIM. LICITUDE. É lícita a terceirização ou qualquer outra forma de divisão do trabalho entre pessoas jurídicas distintas, independentemente do objeto social das empresas envolvidas, mantida a responsabilidade subsidiária da empresa contratante. Tema 725 de repercussão geral.', data: '2024-02-28', area: 'TRABALHISTA', relator: 'Min. Gilmar Mendes', orgaoJulgador: 'Tribunal Pleno', tags: JSON.stringify(['terceirização', 'atividade-fim', 'responsabilidade subsidiária', 'tema 725']), }, }), prisma.jurisprudencia.create({ data: { tribunal: 'STJ', numero: 'REsp 1.869.043/SP', ementa: 'RECURSO ESPECIAL. DIREITO TRIBUTÁRIO. ICMS. BASE DE CÁLCULO. EXCLUSÃO DO PIS E COFINS. Em consonância com o entendimento firmado pelo STF no Tema 69, o ICMS a ser excluído da base de cálculo do PIS e da COFINS é o destacado na nota fiscal. Recurso especial não provido.', data: '2024-06-05', area: 'TRIBUTARIO', relator: 'Min. Herman Benjamin', orgaoJulgador: 'Segunda Turma', tags: JSON.stringify(['ICMS', 'PIS', 'COFINS', 'base de cálculo', 'tema 69']), }, }), prisma.jurisprudencia.create({ data: { tribunal: 'STF', numero: 'RE 898.060/SC', ementa: 'RECURSO EXTRAORDINÁRIO. DIREITO DE FAMÍLIA. PATERNIDADE SOCIOAFETIVA. MULTIPARENTALIDADE. A paternidade socioafetiva, declarada ou não em registro público, não impede o reconhecimento do vínculo de filiação concomitante baseado na origem biológica, com os efeitos jurídicos próprios. Tema 622.', data: '2024-03-22', area: 'FAMILIA', relator: 'Min. Luiz Fux', orgaoJulgador: 'Tribunal Pleno', tags: JSON.stringify(['paternidade socioafetiva', 'multiparentalidade', 'filiação', 'tema 622']), }, }), prisma.jurisprudencia.create({ data: { tribunal: 'STJ', numero: 'REsp 1.951.532/RS', ementa: 'RECURSO ESPECIAL. DIREITO EMPRESARIAL. RECUPERAÇÃO JUDICIAL. PLANO DE RECUPERAÇÃO. CRAM DOWN. Possibilidade de aprovação do plano de recuperação judicial pelo juiz mesmo sem a concordância de todas as classes de credores, desde que preenchidos os requisitos do art. 58, §1º da Lei 11.101/2005.', data: '2024-07-12', area: 'EMPRESARIAL', relator: 'Min. Ricardo Villas Bôas Cueva', orgaoJulgador: 'Terceira Turma', tags: JSON.stringify(['recuperação judicial', 'cram down', 'plano recuperação', 'credores']), }, }), prisma.jurisprudencia.create({ data: { tribunal: 'STF', numero: 'HC 124.306/RJ', ementa: 'HABEAS CORPUS. DIREITO PENAL. ABORTO. INTERRUPÇÃO VOLUNTÁRIA DA GESTAÇÃO. PRIMEIRO TRIMESTRE. É preciso conferir interpretação conforme a Constituição aos arts. 124 a 126 do Código Penal para excluir do seu âmbito de incidência a interrupção voluntária da gestação efetivada no primeiro trimestre.', data: '2024-08-01', area: 'PENAL', relator: 'Min. Luís Roberto Barroso', orgaoJulgador: 'Primeira Turma', tags: JSON.stringify(['aborto', 'primeiro trimestre', 'interpretação conforme', 'direitos fundamentais']), }, }), prisma.jurisprudencia.create({ data: { tribunal: 'STJ', numero: 'REsp 1.733.013/PR', ementa: 'RECURSO ESPECIAL. DIREITO DO CONSUMIDOR. COMÉRCIO ELETRÔNICO. RESPONSABILIDADE DO MARKETPLACE. A plataforma digital que intermedia a venda de produtos responde solidariamente pelos vícios e defeitos dos produtos comercializados por terceiros em seu ambiente virtual, nos termos do CDC.', data: '2024-09-10', area: 'CONSUMIDOR', relator: 'Min. Paulo de Tarso Sanseverino', orgaoJulgador: 'Terceira Turma', tags: JSON.stringify(['marketplace', 'comércio eletrônico', 'responsabilidade solidária', 'CDC', 'plataforma digital']), }, }), ]) console.log('✅ Jurisprudências created:', jurisprudencias.length) // ── Sample Documents ── const documents = await Promise.all([ prisma.document.create({ data: { userId: advogadoPro.id, type: 'PETICAO_INICIAL', title: 'Petição Inicial - Ação de Indenização por Danos Morais', prompt: 'Elaborar petição inicial para ação de indenização por danos morais decorrente de inscrição indevida no SPC', content: 'EXCELENTÍSSIMO SENHOR DOUTOR JUIZ DE DIREITO DA ___ VARA CÍVEL DA COMARCA DE SÃO PAULO/SP\n\nMARIA DA SILVA, brasileira, solteira, professora, portadora do RG nº 12.345.678-9 e CPF nº 123.456.789-00, residente e domiciliada na Rua das Flores, nº 100, Jardim Primavera, São Paulo/SP, CEP 01234-567, vem, respeitosamente, à presença de Vossa Excelência, por intermédio de seus procuradores que esta subscrevem, propor a presente AÇÃO DE INDENIZAÇÃO POR DANOS MORAIS em face de BANCO XYZ S/A...\n\n[Documento completo gerado pela IA]', wordCount: 2500, status: 'COMPLETED', area: 'CONSUMIDOR', tokens: 3200, cost: 0.032, }, }), prisma.document.create({ data: { userId: advogadoPro.id, type: 'CONTESTACAO', title: 'Contestação - Reclamação Trabalhista', prompt: 'Elaborar contestação para reclamação trabalhista sobre horas extras e adicional noturno', content: 'EXCELENTÍSSIMO SENHOR DOUTOR JUIZ DO TRABALHO DA ___ VARA DO TRABALHO DE SÃO PAULO/SP\n\nProcesso nº 0001234-56.2024.5.02.0001\n\nEMPRESA ABC LTDA, pessoa jurídica de direito privado, inscrita no CNPJ sob nº 12.345.678/0001-90, com sede na Avenida Paulista, nº 1000, São Paulo/SP, vem, respeitosamente, apresentar CONTESTAÇÃO à reclamação trabalhista movida por JOÃO CARLOS SOUZA...\n\n[Documento completo gerado pela IA]', wordCount: 3100, status: 'COMPLETED', area: 'TRABALHISTA', tokens: 4100, cost: 0.041, }, }), prisma.document.create({ data: { userId: advogadoFree.id, type: 'CONTRATO', title: 'Contrato de Honorários Advocatícios', prompt: 'Elaborar contrato de honorários para consultoria jurídica empresarial mensal', content: 'CONTRATO DE PRESTAÇÃO DE SERVIÇOS ADVOCATÍCIOS\n\nPelo presente instrumento particular, de um lado EMPRESA DELTA COMÉRCIO LTDA como CONTRATANTE e de outro a DRA. JOÃO SANTOS - OAB/RJ 654321 como CONTRATADO...\n\n[Documento completo gerado pela IA]', wordCount: 1800, status: 'COMPLETED', area: 'EMPRESARIAL', tokens: 2200, cost: 0.022, }, }), ]) console.log('✅ Documents created:', documents.length) // ── Sample Chat ── const chat = await prisma.chat.create({ data: { userId: advogadoPro.id, title: 'Dúvida sobre prescrição em ação de cobrança', messages: { create: [ { role: 'USER', content: 'Qual o prazo prescricional para ação de cobrança de dívida por contrato verbal?', tokens: 25, }, { role: 'ASSISTANT', content: 'O prazo prescricional para ação de cobrança de dívida originada de contrato verbal é de **10 anos**, conforme o art. 205 do Código Civil de 2002, que estabelece o prazo prescricional genérico. Contudo, se houver documento escrito (como um título de crédito), o prazo pode ser diferente:\n\n- **Cheque:** 6 meses (art. 59, Lei 7.357/85)\n- **Nota promissória:** 3 anos (art. 70, LUG)\n- **Duplicata:** 3 anos (art. 18, Lei 5.474/68)\n\nImportante: O prazo começa a contar da data do vencimento da dívida (art. 199, CC).', tokens: 180, }, ], }, }, }) console.log('✅ Chat created:', chat.title) // ── Usage Logs ── await prisma.usageLog.createMany({ data: [ { userId: advogadoPro.id, type: 'DOCUMENT', tokens: 3200, cost: 0.032 }, { userId: advogadoPro.id, type: 'DOCUMENT', tokens: 4100, cost: 0.041 }, { userId: advogadoPro.id, type: 'CHAT', tokens: 205, cost: 0.002 }, { userId: advogadoFree.id, type: 'DOCUMENT', tokens: 2200, cost: 0.022 }, { userId: advogadoPro.id, type: 'JURISPRUDENCIA', tokens: 150, cost: 0.001 }, ], }) console.log('✅ Usage logs created') // ── API Keys ── await prisma.apiKey.create({ data: { key: 'jur_live_sk_' + 'a'.repeat(32), name: 'API Principal', userId: advogadoPro.id, active: true, }, }) console.log('✅ API keys created') console.log('\n🎉 Seed completed successfully!') console.log('\n📋 Login credentials (all passwords: 123456):') console.log(' Admin: admin@juridico.ai') console.log(' Pro: maria@advocacia.com') console.log(' Free: joao@email.com') } main() .then(async () => { await prisma.$disconnect() }) .catch(async (e) => { console.error(e) await prisma.$disconnect() process.exit(1) })