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')