From f2bca340f9711523f0b19c3fe7afabb87f6e9511 Mon Sep 17 00:00:00 2001 From: Marco Costa Date: Wed, 7 Oct 2026 21:30:40 -0300 Subject: [PATCH] feat: add legal document acceptance and standard project files generation Implement legal document acceptance tracking requiring users to accept terms of service and privacy policy before continuing to use the system. Add automatic generation of standard project files (LICENSE, README.md, RULES.md, cookies.html, termos-de-uso.html, privacidade.html) with download functionality. Enhance prompt building with detailed Portuguese instructions and system requirements. Update seeders with comprehensive legal content and standard files configuration for all prompt templates. --- .../Legal/LegalDocumentController.php | 44 +- .../PromptProject/PromptProjectController.php | 54 +- .../PromptTemplateController.php | 5 + app/Services/PromptProjectService.php | 494 +++++++++++++++++- database/seeders/DatabaseSeeder.php | 1 + database/seeders/LegalDocumentSeeder.php | 190 ++++--- database/seeders/PromptTemplateSeeder.php | 36 ++ .../views/legal/documents/show.blade.php | 13 + .../views/prompt-projects/create.blade.php | 8 + .../views/prompt-projects/show.blade.php | 45 ++ .../views/prompt-templates/create.blade.php | 38 +- .../views/prompt-templates/edit.blade.php | 21 +- routes/web.php | 9 + 13 files changed, 883 insertions(+), 75 deletions(-) diff --git a/app/Http/Controllers/Legal/LegalDocumentController.php b/app/Http/Controllers/Legal/LegalDocumentController.php index 3c79bc2..355fcdc 100755 --- a/app/Http/Controllers/Legal/LegalDocumentController.php +++ b/app/Http/Controllers/Legal/LegalDocumentController.php @@ -6,9 +6,12 @@ namespace App\Http\Controllers\Legal; use App\Http\Controllers\Controller; use App\Models\LegalDocument; +use App\Models\UserDocumentAcceptance; +use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Validation\Rule; +use Illuminate\View\View; class LegalDocumentController extends Controller { @@ -76,10 +79,47 @@ class LegalDocumentController extends Controller /** * Display the legal document page. */ - public function show(string $type) + public function show(string $type): View|RedirectResponse { $document = LegalDocument::where('type', $type)->latest('version')->firstOrFail(); - return view('legal.documents.show', compact('document')); + $pendingAcceptance = false; + if (Auth::check() && Auth::user()->role !== 'superadmin') { + $accepted = UserDocumentAcceptance::where('user_id', Auth::id()) + ->where('legal_document_id', $document->id) + ->exists(); + + if (!$accepted) { + $pendingAcceptance = true; + } + } + + return view('legal.documents.show', compact('document', 'pendingAcceptance')); + } + + /** + * Accept a legal document. + */ + public function accept(string $type): RedirectResponse + { + $document = LegalDocument::where('type', $type)->latest('version')->firstOrFail(); + + if (Auth::check()) { + UserDocumentAcceptance::updateOrCreate( + [ + 'user_id' => Auth::id(), + 'legal_document_id' => $document->id, + ], + [ + 'document_version' => $document->version, + 'ip_address' => request()->ip(), + 'user_agent' => request()->userAgent(), + 'accepted_at' => now(), + ] + ); + } + + return redirect()->route('dashboard') + ->with('success', 'Documento aceito com sucesso.'); } } diff --git a/app/Http/Controllers/PromptProject/PromptProjectController.php b/app/Http/Controllers/PromptProject/PromptProjectController.php index babac97..8d9883e 100755 --- a/app/Http/Controllers/PromptProject/PromptProjectController.php +++ b/app/Http/Controllers/PromptProject/PromptProjectController.php @@ -7,8 +7,12 @@ namespace App\Http\Controllers\PromptProject; use App\Http\Controllers\Controller; use App\Http\Requests\PromptProject\StorePromptProjectRequest; use App\Http\Requests\PromptProject\UpdatePromptProjectRequest; +use App\Models\AiModel; use App\Models\AiProvider; +use App\Models\PromptGeneration; +use App\Models\PromptProject; use App\Services\PromptProjectService; +use Illuminate\Http\JsonResponse; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; @@ -62,24 +66,26 @@ class PromptProjectController extends Controller /** * Display the specified resource. */ - public function show(\App\Models\PromptProject $promptProject): View + public function show(PromptProject $promptProject): View { $this->authorize('view', $promptProject); - $providerModels = \App\Models\AiModel::where('provider_id', $promptProject->provider_id) + $providerModels = AiModel::where('provider_id', $promptProject->provider_id) ->where('is_active', true) ->get(); $models = $providerModels->isNotEmpty() ? $providerModels - : \App\Models\AiModel::where('is_active', true)->get(); + : AiModel::where('is_active', true)->get(); - $generations = \App\Models\PromptGeneration::where('project_id', $promptProject->id) + $generations = PromptGeneration::where('project_id', $promptProject->id) ->latest() ->take(5) ->get(); - return view('prompt-projects.show', compact('promptProject', 'models', 'generations')); + $standardFiles = $this->promptProjectService->getStandardFiles($promptProject); + + return view('prompt-projects.show', compact('promptProject', 'models', 'generations', 'standardFiles')); } /** @@ -123,7 +129,7 @@ class PromptProjectController extends Controller /** * Generate prompt for the specified project. */ - public function generate(\App\Models\PromptProject $promptProject, Request $request): RedirectResponse + public function generate(PromptProject $promptProject, Request $request): RedirectResponse { $this->authorize('update', $promptProject); @@ -137,7 +143,7 @@ class PromptProjectController extends Controller $model = $customModel; } } else { - $model = \App\Models\AiModel::where('slug', $modelSlug) + $model = AiModel::where('slug', $modelSlug) ->where('is_active', true) ->first(); } @@ -152,7 +158,7 @@ class PromptProjectController extends Controller /** * Get built prompt for the specified project. */ - public function getPrompt(\App\Models\PromptProject $promptProject): \Illuminate\Http\JsonResponse + public function getPrompt(PromptProject $promptProject): JsonResponse { $this->authorize('view', $promptProject); @@ -160,4 +166,36 @@ class PromptProjectController extends Controller return response()->json(['prompt' => $prompt]); } + + /** + * Get standard files for the specified project. + */ + public function getStandardFiles(PromptProject $promptProject): JsonResponse + { + $this->authorize('view', $promptProject); + + $files = $this->promptProjectService->getStandardFiles($promptProject); + + return response()->json($files); + } + + /** + * Download a standard file for the specified project. + */ + public function downloadFile(PromptProject $promptProject, string $filename) + { + $this->authorize('view', $promptProject); + + $files = $this->promptProjectService->getStandardFiles($promptProject); + + if (!isset($files[$filename])) { + abort(404); + } + + $content = $files[$filename]; + + return response()->streamDownload(function () use ($content) { + echo $content; + }, $filename); + } } diff --git a/app/Http/Controllers/PromptTemplate/PromptTemplateController.php b/app/Http/Controllers/PromptTemplate/PromptTemplateController.php index d307bed..e0277cc 100755 --- a/app/Http/Controllers/PromptTemplate/PromptTemplateController.php +++ b/app/Http/Controllers/PromptTemplate/PromptTemplateController.php @@ -58,6 +58,10 @@ class PromptTemplateController extends Controller $data['template_data'] = json_decode($data['template_data'], true); } + if (!isset($data['template_data']['standard_files'])) { + $data['template_data']['standard_files'] = true; + } + $this->promptTemplateService->store($data); return redirect()->route('prompt-templates.index') @@ -131,6 +135,7 @@ class PromptTemplateController extends Controller 'variables' => $data['variables'] ?? '', 'temperature' => $data['temperature'] ?? 0.7, 'max_tokens' => $data['max_tokens'] ?? 1024, + 'standard_files' => $data['standard_files'] ?? true, ]; } diff --git a/app/Services/PromptProjectService.php b/app/Services/PromptProjectService.php index c51245a..ca25a34 100755 --- a/app/Services/PromptProjectService.php +++ b/app/Services/PromptProjectService.php @@ -202,7 +202,10 @@ class PromptProjectService { $parts = []; - $parts[] = "You are an expert prompt engineering assistant. Your task is to generate a high-quality, optimized prompt based on the specifications provided below."; + $companyName = $project->company_name ?? $project->title; + + $parts[] = "Generate a complete, ready-to-use prompt in Portuguese that another AI or developer can follow to build the project described below. The generated prompt must be self-contained and include ALL specifications, design requirements, technical constraints, and code standards needed to build the project from scratch."; + $parts[] = "IMPORTANT: Your output must be ONLY the prompt text in Portuguese. Do NOT include this instruction, do NOT wrap in markdown, do NOT add explanations — just output the prompt itself."; if ($project->company_name) { $parts[] = "Company Name: " . $project->company_name; @@ -264,8 +267,495 @@ class PromptProjectService $parts[] = "Variables: " . json_encode($project->variables, JSON_PRETTY_PRINT); } - $parts[] = "Generate the optimized prompt now. Return ONLY the prompt, without explanations, introductions, or additional text."; + $parts[] = "SYSTEM REQUIREMENTS (ALWAYS apply to every project):"; + $parts[] = "- Fully responsive design (mobile-first, all screen sizes including smartphones)"; + $parts[] = "- Use only MIT-licensed or permissive open-source icons, images, and dependencies that are safe for commercial use"; + $parts[] = "- All password fields must include a toggle button (eye icon) to show/hide the password"; + $parts[] = "- Complete SEO optimization: semantic HTML5, meta tags (title, description, keywords, OG tags for social media), structured data (JSON-LD), sitemap, robots.txt, aria labels, alt text on images, canonical URL, mobile-friendly validation"; + + $parts[] = "Generate the optimized prompt now. Return ONLY the prompt text, without explanations, introductions, or additional text."; return implode("\n\n", $parts); } + + /** + * Generate LICENSE file content for the project. + */ + public function generateLicenseContent(PromptProject $project): string + { + $year = date('Y'); + $company = $project->company_name ?? $project->title; + + return <<company_name ?? $project->title; + $description = $project->objective ?? 'Sistema profissional'; + $activities = $project->company_business_activities ?? ''; + $services = $project->company_services_products ?? ''; + + $readme = "# {$company}\n\n"; + $readme .= "## 📋 Descrição\n\n{$description}\n\n"; + + if ($activities) { + $readme .= "## 🏢 Atividades\n\n{$activities}\n\n"; + } + + if ($services) { + $readme .= "## 🛠️ Serviços e Produtos\n\n{$services}\n\n"; + } + + $readme .= "## 🚀 Tecnologias\n\n"; + $readme .= "- HTML5 / CSS3 / JavaScript\n"; + $readme .= "- Bootstrap 5\n"; + $readme .= "- Font Awesome / Bootstrap Icons\n"; + $readme .= "- Responsive Design\n\n"; + + $readme .= "## 📦 Instalação\n\n```bash\n"; + $readme .= "# Clone o repositório\ngit clone https://github.com/seu-usuario/{$this->slugify($company)}.git\n\n"; + $readme .= "# Acesse o diretório\ncd {$this->slugify($company)}\n"; + $readme .= "```\n\n"; + + $readme .= "## ⚙️ Configuração\n\n"; + $readme .= "1. Configure as variáveis de ambiente necessárias\n"; + $readme .= "2. Ajuste as credenciais de banco de dados no arquivo de configuração\n"; + $readme .= "3. Execute as migrações (se aplicável)\n\n"; + + $readme .= "## 🎯 Funcionalidades\n\n"; + $readme .= "- Interface responsiva e moderna\n"; + $readme .= "- Design otimizado para todos os dispositivos\n"; + $readme .= "- Componentes reutilizáveis\n"; + $readme .= "- Performance otimizada\n\n"; + + if ($project->company_website) { + $readme .= "## 🌐 Website\n\n[{$project->company_website}]({$project->company_website})\n\n"; + } + + $readme .= "## 📄 Licença\n\nEste projeto está licenciado sob a Licença MIT.\n\n"; + $readme .= "## 📞 Contato\n\n"; + + if ($project->company_whatsapp) { + $readme .= "- WhatsApp: {$project->company_whatsapp}\n"; + } + if ($project->company_social_media) { + $readme .= "- Redes Sociais: {$project->company_social_media}\n"; + } + + return $readme; + } + + /** + * Generate RULES.md content for the project. + */ + public function generateRulesContent(PromptProject $project): string + { + $company = $project->company_name ?? $project->title; + + $rules = "# Regras de Desenvolvimento - {$company}\n\n"; + $rules .= "## 📐 Padrões de Código\n\n"; + $rules .= "- Seguir PSR-12 (PHP) / Airbnb Style Guide (JavaScript)\n"; + $rules .= "- Usar type hints em todos os métodos e parâmetros\n"; + $rules .= "- Strict typing habilitado (declare(strict_types=1))\n"; + $rules .= "- PHPDoc comments em métodos públicos\n"; + $rules .= "- Sem uso de `var`, usar `private/protected/public`\n\n"; + + $rules .= "## 🏗️ Arquitetura\n\n"; + $rules .= "- Seguir princípios SOLID\n"; + $rules .= "- MVC Pattern com Service Layer\n"; + $rules .= "- Repository Pattern para abstração de dados\n"; + $rules .= "- Injeção de dependências\n\n"; + + $rules .= "## 🔒 Segurança\n\n"; + $rules .= "- CSRF em todos os formulários\n"; + $rules .= "- XSS: usar escaping automático, evitar `{!! !!}`\n"; + $rules .= "- SQL Injection: usar ORM ou Query Builder com bindings\n"; + $rules .= "- Mass Assignment: usar \$fillable ou \$guarded\n"; + $rules .= "- Senhas: hash com bcrypt\n"; + $rules .= "- Rate Limiting em formulários públicos\n\n"; + + $rules .= "## 🎨 Frontend\n\n"; + $rules .= "- Bootstrap 5 com Bootstrap Icons\n"; + $rules .= "- Design responsivo (mobile-first)\n"; + $rules .= "- Breadcrumbs em todas as páginas\n"; + $rules .= "- Sem CSS ou JS inline\n"; + $rules .= "- Modern, clean design\n\n"; + + $rules .= "## 🧪 Testes\n\n"; + $rules .= "- Testes unitários para Models e Services\n"; + $rules .= "- Testes de feature para CRUD\n"; + $rules .= "- Cobertura mínima de 80%\n\n"; + + $rules .= "## 🚫 Práticas Proibidas\n\n"; + $rules .= "- `dd()`, `dump()`, `var_dump()` em produção\n"; + $rules .= "- Comentários `TODO`, `FIXME`, `XXX`\n"; + $rules .= "- URLs ou caminhos hardcoded\n"; + $rules .= "- Magic numbers (definir constantes)\n"; + $rules .= "- Código comentado\n\n"; + + $rules .= "## ⚡ Performance\n\n"; + $rules .= "- Eager load relacionamentos (N+1 prevention)\n"; + $rules .= "- Indexar foreign keys no banco\n"; + $rules .= "- Cache de queries pesadas\n"; + $rules .= "- Paginar datasets grandes\n"; + $rules .= "- Otimizar assets (compressão, minificação)\n\n"; + + $rules .= "## 📖 Documentação\n\n"; + $rules .= "- README.md com instruções de instalação e uso\n"; + $rules .= "- Documentação técnica em markdown\n"; + $rules .= "- CHANGELOG.md para versionamento\n"; + + return $rules; + } + + /** + * Generate cookies.html content (cookie consent banner in compliance with LGPD). + */ + public function generateCookieConsentContent(PromptProject $project): string + { + $company = $project->company_name ?? $project->title; + + return << + + + + +Política de Cookies - {$company} + + + + + + + + + + + + +EOT; + } + + /** + * Generate termos-de-uso.html content (Terms of Service compliant with Brazilian legislation). + */ + public function generateTermsContent(PromptProject $project): string + { + $company = $project->company_name ?? $project->title; + $year = date('Y'); + $activities = $project->company_business_activities ?? 'servicos de tecnologia'; + + return << + + + + +Termos de Uso - {$company} + + + + +

Termos de Uso - {$company}

+

Versao: 1.0 | Data: {$year}

+ +

1. Aceitacao dos Termos

+

Ao acessar e utilizar os servicos da {$company}, voce concorda em cumprir integralmente estes Termos de Uso. Caso nao concorde com qualquer disposicao deste documento, voce nao deve utilizar nossos servicos.

+ +

2. Descricao do Servico

+

A {$company} oferece {$activities}. Este documento estabelece as condicoes gerais de uso dos servicos disponibilizados.

+ +

3. Definicoes

+
    +
  • Plataforma: sistema, site ou aplicativo fornecido pela {$company}
  • +
  • Usuario: pessoa fisica ou juridica que utiliza a plataforma
  • +
  • Conteudo: qualquer informacao, dado ou material inserido na plataforma
  • +
  • LGPD: Lei Geral de Protecao de Dados Pessoais (Lei no 13.709/2018)
  • +
+ +

4. Cadastro e Conta de Usuario

+

4.1. Para utilizar a plataforma, o usuario deve criar uma conta fornecendo informacoes precisas e atualizadas.

+

4.2. O usuario e integralmente responsavel pela confidencialidade de suas credenciais de acesso.

+

4.3. O usuario compromete-se a notificar imediatamente qualquer uso nao autorizado de sua conta.

+ +

5. Obrigacoes do Usuario

+

5.1. Utilizar a plataforma em conformidade com as leis brasileiras.

+

5.2. Nao realizar atividades que possam comprometer a seguranca da plataforma.

+

5.3. Nao inserir conteudo ilegal, ofensivo ou que viole direitos de terceiros.

+ +

6. Propriedade Intelectual

+

6.1. Todo o conteudo e funcionalidades da plataforma sao de propriedade da {$company}.

+

6.2. O conteudo gerado pelo usuario e de propriedade do usuario.

+

6.3. E proibida a engenharia reversa, descompilacao ou tentativa de extrair o codigo fonte.

+ +

7. Limitacao de Responsabilidade

+

7.1. A plataforma e fornecida "como esta", sem garantias de disponibilidade continua.

+

7.2. A {$company} nao se responsabiliza por danos decorrentes do uso ou da impossibilidade de uso da plataforma.

+ +

8. Privacidade e Protecao de Dados

+

8.1. O tratamento de dados pessoais segue integralmente a LGPD (Lei no 13.709/2018).

+

8.2. Os dados coletados sao utilizados exclusivamente para as finalidades descritas na Politica de Privacidade.

+

8.3. O usuario pode exercer seus direitos de titular de dados a qualquer momento.

+ +

9. Disposicoes Gerais

+

9.1. Estes termos podem ser alterados a qualquer momento, mediante comunicacao previa aos usuarios.

+

9.2. O uso continuado apos alteracoes constitui aceitacao dos novos termos.

+

9.3. Foro: Comarca de Sao Paulo/SP para eventuais controversias.

+ +

10. Contato

+

Para esclarecimentos sobre estes termos, entre em contato atraves dos canais oficiais da {$company}.

+ +
+

© {$year} {$company}. Todos os direitos reservados.

+
+ + + +EOT; + } + + /** + * Generate privacidade.html content (Privacy Policy compliant with LGPD). + */ + public function generatePrivacyContent(PromptProject $project): string + { + $company = $project->company_name ?? $project->title; + $year = date('Y'); + + return << + + + + +Politica de Privacidade - {$company} + + + + +

Politica de Privacidade - {$company} (LGPD)

+

Versao: 1.0 | Data: {$year}

+ +

1. Informacoes Gerais

+

Esta Politica de Privacidade descreve como a {$company} coleta, utiliza, armazena e protege os dados pessoais dos usuarios, em conformidade com a Lei Geral de Protecao de Dados Pessoais (LGPD - Lei no 13.709/2018).

+ +

2. Titular do Tratamento

+

{$company}

+

E-mail de contato disponivel no site oficial.

+ +

3. Dados Pessoais Coletados

+

3.1. Dados fornecidos pelo usuario:

+
    +
  • Nome completo
  • +
  • Endereco de e-mail
  • +
  • Senha de acesso (armazenada com criptografia)
  • +
  • Informacoes de contato, quando fornecidas
  • +
+

3.2. Dados coletados automaticamente:

+
    +
  • Endereco IP
  • +
  • Agente do navegador (user agent)
  • +
  • Preferencias de cookies
  • +
  • Dados de uso da plataforma
  • +
  • Data e hora das interacoes
  • +
+ +

4. Finalidades do Tratamento

+
    +
  • Autenticacao e autorizacao de acesso
  • +
  • Prestacao dos servicos contratados
  • +
  • Comunicacoes sobre o servico
  • +
  • Seguranca e prevencao de fraudes
  • +
  • Cumprimento de obrigacoes legais
  • +
  • Melhoria continua dos servicos
  • +
+ +

5. Bases Legais para o Tratamento (LGPD - Art. 7o)

+
    +
  • Consentimento do titular (Art. 7o, I)
  • +
  • Execucao de contrato (Art. 7o, V)
  • +
  • Cumprimento de obrigacao legal (Art. 7o, II)
  • +
  • Legitimo interesse (Art. 7o, IX)
  • +
+ +

6. Compartilhamento de Dados

+

6.1. Seus dados nao sao compartilhados com terceiros, exceto quando necessario para a prestacao dos servicos ou quando exigido por lei.

+

6.2. Nao vendemos dados pessoais a terceiros.

+ +

7. Armazenamento e Seguranca

+

7.1. Os dados sao armazenados em servidores seguros com acesso restrito.

+

7.2. Adotamos medidas tecnicas e organizacionais para proteger os dados contra acesso nao autorizado.

+

7.3. O periodo de armazenamento e o necessario para cumprir as finalidades descritas nesta politica.

+ +

8. Direitos do Titular (LGPD - Art. 18)

+

O titular dos dados tem direito a:

+
    +
  • Confirmar a existencia de tratamento
  • +
  • Acessar seus dados pessoais
  • +
  • Corrigir dados incompletos ou desatualizados
  • +
  • Solicitar a eliminacao de dados desnecessarios
  • +
  • Solicitar a portabilidade dos dados
  • +
  • Revogar o consentimento a qualquer momento
  • +
+ +

9. Cookies

+

9.1. Utilizamos cookies necessarios para o funcionamento da plataforma.

+

9.2. Cookies opcionais (estatisticas, marketing, preferencias) dependem do seu consentimento.

+

9.3. Voce pode gerenciar suas preferencias de cookies atraves do banner de cookies.

+ +

10. Consentimento

+

Ao utilizar a plataforma, voce declara ter lido e compreendido esta Politica de Privacidade e autoriza o tratamento de seus dados conforme aqui descrito.

+ +

11. Alteracoes

+

Esta politica pode ser atualizada periodicamente. Alteracoes significativas serao comunicadas aos usuarios.

+ +

12. Contato e DPO

+

Para exercer seus direitos ou esclarecer duvidas sobre privacidade, entre em contato atraves dos canais oficiais da {$company}.

+

Prazo de resposta: ate 15 dias uteis (LGPD - Art. 19).

+ +
+

© {$year} {$company}. Todos os direitos reservados.

+
+ + + +EOT; + } + + /** + * Get all standard files with their contents for the project. + * + * @return array + */ + public function getStandardFiles(PromptProject $project): array + { + return [ + 'LICENSE' => $this->generateLicenseContent($project), + 'README.md' => $this->generateReadmeContent($project), + 'RULES.md' => $this->generateRulesContent($project), + 'cookies.html' => $this->generateCookieConsentContent($project), + 'termos-de-uso.html' => $this->generateTermsContent($project), + 'privacidade.html' => $this->generatePrivacyContent($project), + ]; + } + + /** + * Convert text to a URL-friendly slug. + */ + private function slugify(string $text): string + { + $text = preg_replace('/[^a-zA-Z0-9-]/', '-', $text); + $text = preg_replace('/-+/', '-', $text); + $text = trim($text, '-'); + + return strtolower($text); + } } diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index e8fead6..4be0d0e 100755 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -15,6 +15,7 @@ class DatabaseSeeder extends Seeder UserSeeder::class, AiProviderSeeder::class, PromptTemplateSeeder::class, + LegalDocumentSeeder::class, TutorialSeeder::class, ]); } diff --git a/database/seeders/LegalDocumentSeeder.php b/database/seeders/LegalDocumentSeeder.php index 354e04d..c18b0dc 100755 --- a/database/seeders/LegalDocumentSeeder.php +++ b/database/seeders/LegalDocumentSeeder.php @@ -18,90 +18,158 @@ class LegalDocumentSeeder extends Seeder $superadmin = User::where('role', 'superadmin')->first(); $termsContent = << 'terms-of-service', - 'title' => 'Termos de Uso', - 'content' => $termsContent, - 'version' => '1.0', - 'published_by' => $superadmin?->id, - 'published_at' => now(), - ]); + LegalDocument::updateOrCreate( + ['type' => 'terms-of-service'], + [ + 'title' => 'Termos de Uso', + 'content' => $termsContent, + 'version' => '1.0', + 'published_by' => $superadmin?->id, + 'published_at' => now(), + ] + ); - LegalDocument::create([ - 'type' => 'privacy-policy', - 'title' => 'Política de Privacidade', - 'content' => $privacyContent, - 'version' => '1.0', - 'published_by' => $superadmin?->id, - 'published_at' => now(), - ]); + LegalDocument::updateOrCreate( + ['type' => 'privacy-policy'], + [ + 'title' => 'Política de Privacidade', + 'content' => $privacyContent, + 'version' => '1.0', + 'published_by' => $superadmin?->id, + 'published_at' => now(), + ] + ); } -} +} \ No newline at end of file diff --git a/database/seeders/PromptTemplateSeeder.php b/database/seeders/PromptTemplateSeeder.php index 205f18a..e6e3a0c 100755 --- a/database/seeders/PromptTemplateSeeder.php +++ b/database/seeders/PromptTemplateSeeder.php @@ -29,6 +29,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_empresa, slogan, telefone, email, endereco, linkedin_url', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -48,6 +49,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_produto, slogan, trial_dias, preco_inicial, url_signup', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -67,6 +69,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_produto, preco, desconto, url_checkout', 'temperature' => 0.8, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -86,6 +89,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_evento, data, local, url_inscricao, valor', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -105,6 +109,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'titulo_ebook, autor, numero_paginas, url_download', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -124,6 +129,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_curso, instrutor, carga_horaria, preco, url_matricula', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -143,6 +149,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_app, slogan, url_ios, url_android, categoria', 'temperature' => 0.8, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -162,6 +169,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_agencia, especialidades, url_portfolio, telefone, email', 'temperature' => 0.8, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -181,6 +189,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_restaurante, cozinha, telefone, endereco, url_reserva', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -200,6 +209,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_imobiliaria, cidade, telefone, email, url_portfolio', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -219,6 +229,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_clinica, servicos, telefone, endereco, url_agendamento', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -238,6 +249,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_escola, cursos, telefone, email, url_matricula', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -257,6 +269,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_empresa, slogan, missao, telefone, email, endereco', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -276,6 +289,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome, profissao, email, linkedin, github, url_portfolio', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -295,6 +309,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome, profissao, estilo, url_portfolio, instagram', 'temperature' => 0.9, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -314,6 +329,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_autor, categoria_principal, url_newsletter', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -333,6 +349,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_loja, categoria, moeda, url_checkout', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -352,6 +369,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_sistema, modulo_principal, url_app', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -371,6 +389,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_sistema, metricas, periodo', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -390,6 +409,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_restaurante, categoria, telefone, url_cardapio', 'temperature' => 0.8, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -409,6 +429,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_modulo, entidade, nome_tabela', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -428,6 +449,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_recurso, nome_modelo, campos_customizados', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -447,6 +469,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_modulo, entidade, campos_filtros', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -466,6 +489,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_projeto, tema, modulo_principal', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -485,6 +509,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_app, tema_cores, modulo_principal', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -504,6 +529,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_app, tema_cores, modulo_principal', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -523,6 +549,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_projeto, database_url, modulo_principal', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -542,6 +569,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_modulo, entidade, campos_customizados', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -561,6 +589,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_modulo, entidade, campos_customizados', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -580,6 +609,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_projeto, modulo_principal, entidades', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -599,6 +629,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_modulo, entidade, nome_tabela, provedores_ia, permissoes', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -618,6 +649,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_api, roles, provedor_ia', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -637,6 +669,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_sistema, servicos, broker_mensagens', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -656,6 +689,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_bot, provedor_ia, modelo, contexto', 'temperature' => 0.8, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -675,6 +709,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_plataforma, integracoes, acoes', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], @@ -694,6 +729,7 @@ class PromptTemplateSeeder extends Seeder 'variables' => 'nome_servico, apis_origem, api_destino', 'temperature' => 0.7, 'max_tokens' => 4096, + 'standard_files' => true, ], 'is_public' => true, ], diff --git a/resources/views/legal/documents/show.blade.php b/resources/views/legal/documents/show.blade.php index 458bb26..4772214 100755 --- a/resources/views/legal/documents/show.blade.php +++ b/resources/views/legal/documents/show.blade.php @@ -23,6 +23,19 @@ + @if($pendingAcceptance ?? false) +
+
+ + Para continuar utilizando o sistema, você precisa aceitar esta versão dos {{ $document->type === 'terms-of-service' ? 'Termos de Uso' : 'Política de Privacidade' }}. +
+
+ @csrf + +
+ @endif @endsection diff --git a/resources/views/prompt-projects/create.blade.php b/resources/views/prompt-projects/create.blade.php index 299edc6..8b60eaa 100755 --- a/resources/views/prompt-projects/create.blade.php +++ b/resources/views/prompt-projects/create.blade.php @@ -342,6 +342,14 @@ document.getElementById('variables').value = template.variables || ''; document.getElementById('temperature').value = template.temperature ?? 0.7; document.getElementById('max_tokens').value = template.max_tokens ?? 1024; + + if (template.standard_files !== false) { + const stdFilesNote = "\n\n---\nNOTA: Os arquivos padrao (LICENSE, README.md, RULES.md, cookies.html, termos-de-uso.html, privacidade.html) serao gerados automaticamente pelo sistema apos a geracao do prompt. NAO os inclua na sua resposta."; + const constraintsEl = document.getElementById('constraints'); + if (constraintsEl && !constraintsEl.value.includes('Arquivos padrao')) { + constraintsEl.value = constraintsEl.value.trim() + stdFilesNote; + } + } } else { const fields = ['title', 'objective', 'context', 'persona', 'tone', 'constraints', 'output_format', 'examples', 'variables', 'temperature', 'max_tokens']; fields.forEach(field => { diff --git a/resources/views/prompt-projects/show.blade.php b/resources/views/prompt-projects/show.blade.php index e412ae0..e66e99a 100755 --- a/resources/views/prompt-projects/show.blade.php +++ b/resources/views/prompt-projects/show.blade.php @@ -173,6 +173,51 @@ @endif +
+
+
Arquivos Padrão do Projeto
+ LICENSE · README.md · RULES.md · LGPD +
+
+
+ + Estes arquivos são gerados automaticamente com base nos dados do projeto e devem ser incluídos no repositório. +
+ +
+ @foreach($standardFiles as $filename => $content) +
+
+ {{ $filename }} — {{ str_word_count($content) }} palavras +
+ + Download + + +
+
+ +
+ @endforeach +
+
+
+ @section('scripts')