Compare commits

...
5 Commits
Author SHA1 Message Date
marcocosta10000 52a494de3d feat(ai): add xiaomi/mimo-v2.6-flash to AI models catalog 2026-10-07 23:51:05 -03:00
marcocosta10000 d87c7a769f feat(ai): update OpenRouter AI models catalog
Refresh available models for OpenRouter provider, adding DeepSeek v4
variants, Minimax models, and removing deprecated entries. Updated token
limits for new DeepSeek models to 8192.
2026-10-07 23:04:51 -03:00
marcocosta10000 ab6df785c4 feat(pdf): add DomPDF integration and ebook download feature
Integrate barryvdh/laravel-dompdf package for PDF generation with
custom configuration. Add authenticated ebook download route and view.
Update footer to display ebook download link for logged-in users.
2026-10-07 22:28:01 -03:00
marcocosta10000 d1e8abe428 refactor(prompts): enforce multi-file project structure and remove line constraints
Remove maximum line count restrictions from prompt templates and enhance
the prompt building service to require complete multi-file project outputs.
Update generated prompts to explicitly instruct creation of standard legal
documents (LICENSE, README.md, RULES.md, cookies.html, termos-de-uso.html,
privacidade.html) with full content from scratch. Modify UI text to reflect
the new multi-file requirements.
2026-10-07 22:06:35 -03:00
marcocosta10000 f2bca340f9 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.
2026-10-07 21:30:40 -03:00
23 changed files with 1990 additions and 127 deletions
Binary file not shown.
Binary file not shown.
@@ -6,9 +6,12 @@ namespace App\Http\Controllers\Legal;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\LegalDocument; use App\Models\LegalDocument;
use App\Models\UserDocumentAcceptance;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\Rule; use Illuminate\Validation\Rule;
use Illuminate\View\View;
class LegalDocumentController extends Controller class LegalDocumentController extends Controller
{ {
@@ -76,10 +79,47 @@ class LegalDocumentController extends Controller
/** /**
* Display the legal document page. * 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(); $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.');
} }
} }
@@ -7,8 +7,12 @@ namespace App\Http\Controllers\PromptProject;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests\PromptProject\StorePromptProjectRequest; use App\Http\Requests\PromptProject\StorePromptProjectRequest;
use App\Http\Requests\PromptProject\UpdatePromptProjectRequest; use App\Http\Requests\PromptProject\UpdatePromptProjectRequest;
use App\Models\AiModel;
use App\Models\AiProvider; use App\Models\AiProvider;
use App\Models\PromptGeneration;
use App\Models\PromptProject;
use App\Services\PromptProjectService; use App\Services\PromptProjectService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
@@ -62,24 +66,26 @@ class PromptProjectController extends Controller
/** /**
* Display the specified resource. * Display the specified resource.
*/ */
public function show(\App\Models\PromptProject $promptProject): View public function show(PromptProject $promptProject): View
{ {
$this->authorize('view', $promptProject); $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) ->where('is_active', true)
->get(); ->get();
$models = $providerModels->isNotEmpty() $models = $providerModels->isNotEmpty()
? $providerModels ? $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() ->latest()
->take(5) ->take(5)
->get(); ->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. * 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); $this->authorize('update', $promptProject);
@@ -137,7 +143,7 @@ class PromptProjectController extends Controller
$model = $customModel; $model = $customModel;
} }
} else { } else {
$model = \App\Models\AiModel::where('slug', $modelSlug) $model = AiModel::where('slug', $modelSlug)
->where('is_active', true) ->where('is_active', true)
->first(); ->first();
} }
@@ -152,7 +158,7 @@ class PromptProjectController extends Controller
/** /**
* Get built prompt for the specified project. * 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); $this->authorize('view', $promptProject);
@@ -160,4 +166,36 @@ class PromptProjectController extends Controller
return response()->json(['prompt' => $prompt]); 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);
}
} }
@@ -58,6 +58,10 @@ class PromptTemplateController extends Controller
$data['template_data'] = json_decode($data['template_data'], true); $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); $this->promptTemplateService->store($data);
return redirect()->route('prompt-templates.index') return redirect()->route('prompt-templates.index')
@@ -131,6 +135,7 @@ class PromptTemplateController extends Controller
'variables' => $data['variables'] ?? '', 'variables' => $data['variables'] ?? '',
'temperature' => $data['temperature'] ?? 0.7, 'temperature' => $data['temperature'] ?? 0.7,
'max_tokens' => $data['max_tokens'] ?? 1024, 'max_tokens' => $data['max_tokens'] ?? 1024,
'standard_files' => $data['standard_files'] ?? true,
]; ];
} }
+495 -2
View File
@@ -202,7 +202,10 @@ class PromptProjectService
{ {
$parts = []; $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) { if ($project->company_name) {
$parts[] = "Company Name: " . $project->company_name; $parts[] = "Company Name: " . $project->company_name;
@@ -264,8 +267,498 @@ class PromptProjectService
$parts[] = "Variables: " . json_encode($project->variables, JSON_PRETTY_PRINT); $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[] = "- The generated prompt must produce a COMPLETE MULTI-FILE PROJECT structure (not a single file). Generate separate files organized in a proper project folder structure";
$parts[] = "- The prompt MUST instruct to create EACH of the following standard files FROM SCRATCH with COMPLETE content (not just descriptions): LICENSE (MIT with company name and year), README.md (full documentation in Portuguese), RULES.md (coding rules in Portuguese), cookies.html (complete LGPD cookie banner page with HTML/CSS/JS), termos-de-uso.html (complete Terms of Service page), privacidade.html (complete Privacy Policy page compliant with LGPD)";
$parts[] = "- Do NOT just describe what the files should contain — the generated prompt must explicitly tell the developer/AI to CREATE each file with full, ready-to-use content";
$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); 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 <<<EOT
MIT License
Copyright (c) {$year} {$company}
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
EOT;
}
/**
* Generate README.md content for the project.
*/
public function generateReadmeContent(PromptProject $project): string
{
$company = $project->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 <<<EOT
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Política de Cookies - {$company}</title>
<style>
.cookie-banner{position:fixed;bottom:0;left:0;right:0;background:#fff;border-top:2px solid #4e73df;padding:1.5rem;box-shadow:0 -4px 20px rgba(0,0,0,0.15);z-index:9999;animation:slideUp 0.4s ease-out}
.cookie-banner .container{max-width:1100px;margin:0 auto}
.cookie-banner h6{color:#1a1a2e;font-weight:700;margin-bottom:0.5rem}
.cookie-banner p{font-size:0.9rem;color:#6c757d;margin-bottom:1rem;line-height:1.6}
.cookie-banner .btn-group{display:flex;flex-wrap:wrap;gap:0.5rem}
.cookie-banner .btn{padding:0.5rem 1.25rem;border-radius:8px;font-weight:500;font-size:0.9rem;cursor:pointer;border:none;transition:all 0.2s}
.cookie-banner .btn-accept{background:#4e73df;color:#fff}
.cookie-banner .btn-accept:hover{background:#224abe}
.cookie-banner .btn-reject{background:#6c757d;color:#fff}
.cookie-banner .btn-reject:hover{background:#5a6268}
.cookie-banner .btn-customize{background:#f8f9fc;color:#333;border:1px solid #dee2e6}
.cookie-modal{display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.5);z-index:10000;align-items:center;justify-content:center}
.cookie-modal.active{display:flex}
.cookie-modal .modal-content{background:#fff;border-radius:16px;padding:2rem;max-width:500px;width:90%;max-height:80vh;overflow-y:auto}
.cookie-modal h5{font-weight:700;margin-bottom:1rem}
.cookie-modal .cookie-category{padding:1rem;border-radius:8px;margin-bottom:0.75rem;border:1px solid #e9ecef}
.cookie-modal .cookie-category label{font-weight:600;display:flex;align-items:center;gap:0.5rem}
.cookie-modal .cookie-category p{margin:0.25rem 0 0 1.5rem;font-size:0.85rem;color:#6c757d}
.cookie-modal .btn-save{background:#4e73df;color:#fff;padding:0.5rem 1.5rem;border-radius:8px;border:none;cursor:pointer}
.cookie-modal .btn-cancel{background:#f8f9fc;color:#333;padding:0.5rem 1.5rem;border-radius:8px;border:1px solid #dee2e6;cursor:pointer}
@keyframes slideUp{from{transform:translateY(100%);opacity:0}to{transform:translateY(0);opacity:1}}
@media(max-width:576px){.cookie-banner .btn-group{flex-direction:column}}
</style>
</head>
<body>
<div id="cookieBanner" class="cookie-banner">
<div class="container">
<h6>Cookies e Privacidade</h6>
<p>Utilizamos cookies para melhorar sua experiencia, analisar trafego e personalizar conteudo. Ao continuar navegando, voce concorda com nossa Politica de Privacidade.</p>
<div class="btn-group">
<button class="btn btn-customize" onclick="openCookieModal()">Personalizar</button>
<button class="btn btn-reject" onclick="rejectCookies()">Recusar</button>
<button class="btn btn-accept" onclick="acceptAllCookies()">Aceitar Todos</button>
</div>
</div>
</div>
<div id="cookieModal" class="cookie-modal">
<div class="modal-content">
<h5>Personalizar Cookies</h5>
<p style="color:#6c757d;font-size:0.9rem;margin-bottom:1.5rem">Selecione os tipos de cookies que voce autoriza:</p>
<div class="cookie-category">
<label><input type="checkbox" checked disabled> Necessarios</label>
<p>Essenciais para o funcionamento do site.</p>
</div>
<div class="cookie-category">
<label><input type="checkbox" id="ckStatistics" checked> Estatisticas</label>
<p>Nos ajudam a entender como o site e utilizado.</p>
</div>
<div class="cookie-category">
<label><input type="checkbox" id="ckMarketing" checked> Marketing</label>
<p>Utilizados para exibir anuncios relevantes.</p>
</div>
<div class="cookie-category">
<label><input type="checkbox" id="ckPreferences" checked> Preferencias</label>
<p>Armazenam suas configuracoes e preferencias.</p>
</div>
<div style="display:flex;justify-content:flex-end;gap:0.5rem;margin-top:1rem">
<button class="btn-cancel" onclick="closeCookieModal()">Cancelar</button>
<button class="btn-save" onclick="saveCookiePreferences()">Salvar Preferencias</button>
</div>
</div>
</div>
<script>
function getCookie(name){const match=document.cookie.match(new RegExp('(^| )'+name+'=([^;]+)'));return match?match[2]:null}
function setCookie(name,value,days){const d=new Date();d.setTime(d.getTime()+days*86400000);document.cookie=name+'='+value+';expires='+d.toUTCString()+';path=/'}
if(!getCookie('cookieConsent')){document.getElementById('cookieBanner').style.display='block'}
function acceptAllCookies(){setCookie('cookieConsent',JSON.stringify({necessary:true,statistics:true,marketing:true,preferences:true}),365);document.getElementById('cookieBanner').style.display='none'}
function rejectCookies(){setCookie('cookieConsent',JSON.stringify({necessary:true,statistics:false,marketing:false,preferences:false}),365);document.getElementById('cookieBanner').style.display='none'}
function openCookieModal(){document.getElementById('cookieModal').classList.add('active')}
function closeCookieModal(){document.getElementById('cookieModal').classList.remove('active')}
function saveCookiePreferences(){const consents={necessary:true,statistics:document.getElementById('ckStatistics').checked,marketing:document.getElementById('ckMarketing').checked,preferences:document.getElementById('ckPreferences').checked};setCookie('cookieConsent',JSON.stringify(consents),365);document.getElementById('cookieBanner').style.display='none';closeCookieModal()}
</script>
</body>
</html>
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 <<<EOT
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Termos de Uso - {$company}</title>
<style>
body{font-family:Arial,sans-serif;line-height:1.8;color:#333;max-width:900px;margin:0 auto;padding:2rem}
h1{color:#1a1a2e;font-size:1.8rem;border-bottom:2px solid #4e73df;padding-bottom:0.5rem}
h2{color:#2c3e50;font-size:1.3rem;margin-top:2rem}
p{margin-bottom:1rem;text-align:justify}
ul{margin-bottom:1rem;padding-left:2rem}
footer{margin-top:3rem;padding-top:1rem;border-top:1px solid #dee2e6;font-size:0.85rem;color:#6c757d}
</style>
</head>
<body>
<h1>Termos de Uso - {$company}</h1>
<p><strong>Versao:</strong> 1.0 | <strong>Data:</strong> {$year}</p>
<h2>1. Aceitacao dos Termos</h2>
<p>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.</p>
<h2>2. Descricao do Servico</h2>
<p>A {$company} oferece {$activities}. Este documento estabelece as condicoes gerais de uso dos servicos disponibilizados.</p>
<h2>3. Definicoes</h2>
<ul>
<li><strong>Plataforma:</strong> sistema, site ou aplicativo fornecido pela {$company}</li>
<li><strong>Usuario:</strong> pessoa fisica ou juridica que utiliza a plataforma</li>
<li><strong>Conteudo:</strong> qualquer informacao, dado ou material inserido na plataforma</li>
<li><strong>LGPD:</strong> Lei Geral de Protecao de Dados Pessoais (Lei no 13.709/2018)</li>
</ul>
<h2>4. Cadastro e Conta de Usuario</h2>
<p>4.1. Para utilizar a plataforma, o usuario deve criar uma conta fornecendo informacoes precisas e atualizadas.</p>
<p>4.2. O usuario e integralmente responsavel pela confidencialidade de suas credenciais de acesso.</p>
<p>4.3. O usuario compromete-se a notificar imediatamente qualquer uso nao autorizado de sua conta.</p>
<h2>5. Obrigacoes do Usuario</h2>
<p>5.1. Utilizar a plataforma em conformidade com as leis brasileiras.</p>
<p>5.2. Nao realizar atividades que possam comprometer a seguranca da plataforma.</p>
<p>5.3. Nao inserir conteudo ilegal, ofensivo ou que viole direitos de terceiros.</p>
<h2>6. Propriedade Intelectual</h2>
<p>6.1. Todo o conteudo e funcionalidades da plataforma sao de propriedade da {$company}.</p>
<p>6.2. O conteudo gerado pelo usuario e de propriedade do usuario.</p>
<p>6.3. E proibida a engenharia reversa, descompilacao ou tentativa de extrair o codigo fonte.</p>
<h2>7. Limitacao de Responsabilidade</h2>
<p>7.1. A plataforma e fornecida "como esta", sem garantias de disponibilidade continua.</p>
<p>7.2. A {$company} nao se responsabiliza por danos decorrentes do uso ou da impossibilidade de uso da plataforma.</p>
<h2>8. Privacidade e Protecao de Dados</h2>
<p>8.1. O tratamento de dados pessoais segue integralmente a LGPD (Lei no 13.709/2018).</p>
<p>8.2. Os dados coletados sao utilizados exclusivamente para as finalidades descritas na Politica de Privacidade.</p>
<p>8.3. O usuario pode exercer seus direitos de titular de dados a qualquer momento.</p>
<h2>9. Disposicoes Gerais</h2>
<p>9.1. Estes termos podem ser alterados a qualquer momento, mediante comunicacao previa aos usuarios.</p>
<p>9.2. O uso continuado apos alteracoes constitui aceitacao dos novos termos.</p>
<p>9.3. Foro: Comarca de Sao Paulo/SP para eventuais controversias.</p>
<h2>10. Contato</h2>
<p>Para esclarecimentos sobre estes termos, entre em contato atraves dos canais oficiais da {$company}.</p>
<footer>
<p>&copy; {$year} {$company}. Todos os direitos reservados.</p>
</footer>
</body>
</html>
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 <<<EOT
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Politica de Privacidade - {$company}</title>
<style>
body{font-family:Arial,sans-serif;line-height:1.8;color:#333;max-width:900px;margin:0 auto;padding:2rem}
h1{color:#1a1a2e;font-size:1.8rem;border-bottom:2px solid #4e73df;padding-bottom:0.5rem}
h2{color:#2c3e50;font-size:1.3rem;margin-top:2rem}
p{margin-bottom:1rem;text-align:justify}
ul{margin-bottom:1rem;padding-left:2rem}
footer{margin-top:3rem;padding-top:1rem;border-top:1px solid #dee2e6;font-size:0.85rem;color:#6c757d}
</style>
</head>
<body>
<h1>Politica de Privacidade - {$company} (LGPD)</h1>
<p><strong>Versao:</strong> 1.0 | <strong>Data:</strong> {$year}</p>
<h2>1. Informacoes Gerais</h2>
<p>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).</p>
<h2>2. Titular do Tratamento</h2>
<p>{$company}</p>
<p>E-mail de contato disponivel no site oficial.</p>
<h2>3. Dados Pessoais Coletados</h2>
<p><strong>3.1. Dados fornecidos pelo usuario:</strong></p>
<ul>
<li>Nome completo</li>
<li>Endereco de e-mail</li>
<li>Senha de acesso (armazenada com criptografia)</li>
<li>Informacoes de contato, quando fornecidas</li>
</ul>
<p><strong>3.2. Dados coletados automaticamente:</strong></p>
<ul>
<li>Endereco IP</li>
<li>Agente do navegador (user agent)</li>
<li>Preferencias de cookies</li>
<li>Dados de uso da plataforma</li>
<li>Data e hora das interacoes</li>
</ul>
<h2>4. Finalidades do Tratamento</h2>
<ul>
<li>Autenticacao e autorizacao de acesso</li>
<li>Prestacao dos servicos contratados</li>
<li>Comunicacoes sobre o servico</li>
<li>Seguranca e prevencao de fraudes</li>
<li>Cumprimento de obrigacoes legais</li>
<li>Melhoria continua dos servicos</li>
</ul>
<h2>5. Bases Legais para o Tratamento (LGPD - Art. 7o)</h2>
<ul>
<li>Consentimento do titular (Art. 7o, I)</li>
<li>Execucao de contrato (Art. 7o, V)</li>
<li>Cumprimento de obrigacao legal (Art. 7o, II)</li>
<li>Legitimo interesse (Art. 7o, IX)</li>
</ul>
<h2>6. Compartilhamento de Dados</h2>
<p>6.1. Seus dados nao sao compartilhados com terceiros, exceto quando necessario para a prestacao dos servicos ou quando exigido por lei.</p>
<p>6.2. Nao vendemos dados pessoais a terceiros.</p>
<h2>7. Armazenamento e Seguranca</h2>
<p>7.1. Os dados sao armazenados em servidores seguros com acesso restrito.</p>
<p>7.2. Adotamos medidas tecnicas e organizacionais para proteger os dados contra acesso nao autorizado.</p>
<p>7.3. O periodo de armazenamento e o necessario para cumprir as finalidades descritas nesta politica.</p>
<h2>8. Direitos do Titular (LGPD - Art. 18)</h2>
<p>O titular dos dados tem direito a:</p>
<ul>
<li>Confirmar a existencia de tratamento</li>
<li>Acessar seus dados pessoais</li>
<li>Corrigir dados incompletos ou desatualizados</li>
<li>Solicitar a eliminacao de dados desnecessarios</li>
<li>Solicitar a portabilidade dos dados</li>
<li>Revogar o consentimento a qualquer momento</li>
</ul>
<h2>9. Cookies</h2>
<p>9.1. Utilizamos cookies necessarios para o funcionamento da plataforma.</p>
<p>9.2. Cookies opcionais (estatisticas, marketing, preferencias) dependem do seu consentimento.</p>
<p>9.3. Voce pode gerenciar suas preferencias de cookies atraves do banner de cookies.</p>
<h2>10. Consentimento</h2>
<p>Ao utilizar a plataforma, voce declara ter lido e compreendido esta Politica de Privacidade e autoriza o tratamento de seus dados conforme aqui descrito.</p>
<h2>11. Alteracoes</h2>
<p>Esta politica pode ser atualizada periodicamente. Alteracoes significativas serao comunicadas aos usuarios.</p>
<h2>12. Contato e DPO</h2>
<p>Para exercer seus direitos ou esclarecer duvidas sobre privacidade, entre em contato atraves dos canais oficiais da {$company}.</p>
<p>Prazo de resposta: ate 15 dias uteis (LGPD - Art. 19).</p>
<footer>
<p>&copy; {$year} {$company}. Todos os direitos reservados.</p>
</footer>
</body>
</html>
EOT;
}
/**
* Get all standard files with their contents for the project.
*
* @return array<string, string>
*/
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);
}
} }
+1
View File
@@ -5,4 +5,5 @@ use App\Providers\AppServiceProvider;
return [ return [
App\Providers\AppServiceProvider::class, App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class, App\Providers\AuthServiceProvider::class,
Barryvdh\DomPDF\ServiceProvider::class,
]; ];
+2 -2
View File
@@ -7,9 +7,9 @@
"license": "MIT", "license": "MIT",
"require": { "require": {
"php": "^8.3", "php": "^8.3",
"barryvdh/laravel-dompdf": "^3.1",
"laravel/framework": "^13.8", "laravel/framework": "^13.8",
"laravel/tinker": "^3.0", "laravel/tinker": "^3.0"
"barryvdh/laravel-dompdf": "^3.0"
}, },
"require-dev": { "require-dev": {
"fakerphp/faker": "^1.23", "fakerphp/faker": "^1.23",
Generated
+378 -1
View File
@@ -4,8 +4,85 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "16e72b11427154de902612c561b9c304", "content-hash": "2a63f5b976767b68f7e581743095bd53",
"packages": [ "packages": [
{
"name": "barryvdh/laravel-dompdf",
"version": "v3.1.2",
"source": {
"type": "git",
"url": "https://github.com/barryvdh/laravel-dompdf.git",
"reference": "ee3b72b19ccdf57d0243116ecb2b90261344dedc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/barryvdh/laravel-dompdf/zipball/ee3b72b19ccdf57d0243116ecb2b90261344dedc",
"reference": "ee3b72b19ccdf57d0243116ecb2b90261344dedc",
"shasum": ""
},
"require": {
"dompdf/dompdf": "^3.0",
"illuminate/support": "^9|^10|^11|^12|^13.0",
"php": "^8.1"
},
"require-dev": {
"larastan/larastan": "^2.7|^3.0",
"orchestra/testbench": "^7|^8|^9.16|^10|^11.0",
"phpro/grumphp": "^2.5",
"squizlabs/php_codesniffer": "^3.5"
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"PDF": "Barryvdh\\DomPDF\\Facade\\Pdf",
"Pdf": "Barryvdh\\DomPDF\\Facade\\Pdf"
},
"providers": [
"Barryvdh\\DomPDF\\ServiceProvider"
]
},
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"autoload": {
"psr-4": {
"Barryvdh\\DomPDF\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Barry vd. Heuvel",
"email": "barryvdh@gmail.com"
}
],
"description": "A DOMPDF Wrapper for Laravel",
"keywords": [
"dompdf",
"laravel",
"pdf"
],
"support": {
"issues": "https://github.com/barryvdh/laravel-dompdf/issues",
"source": "https://github.com/barryvdh/laravel-dompdf/tree/v3.1.2"
},
"funding": [
{
"url": "https://fruitcake.nl",
"type": "custom"
},
{
"url": "https://github.com/barryvdh",
"type": "github"
}
],
"time": "2026-02-21T08:51:10+00:00"
},
{ {
"name": "brick/math", "name": "brick/math",
"version": "0.18.0", "version": "0.18.0",
@@ -376,6 +453,161 @@
], ],
"time": "2024-02-05T11:56:58+00:00" "time": "2024-02-05T11:56:58+00:00"
}, },
{
"name": "dompdf/dompdf",
"version": "v3.1.6",
"source": {
"type": "git",
"url": "https://github.com/dompdf/dompdf.git",
"reference": "6d4b4eb8500f7a786da8868ba463a71b725a4005"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/dompdf/dompdf/zipball/6d4b4eb8500f7a786da8868ba463a71b725a4005",
"reference": "6d4b4eb8500f7a786da8868ba463a71b725a4005",
"shasum": ""
},
"require": {
"dompdf/php-font-lib": "^1.0.0",
"dompdf/php-svg-lib": "^1.0.0",
"ext-dom": "*",
"ext-mbstring": "*",
"masterminds/html5": "^2.0",
"php": "^7.1 || ^8.0"
},
"require-dev": {
"ext-gd": "*",
"ext-json": "*",
"ext-zip": "*",
"mockery/mockery": "^1.3",
"phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11",
"squizlabs/php_codesniffer": "^3.5",
"symfony/process": "^4.4 || ^5.4 || ^6.2 || ^7.0"
},
"suggest": {
"ext-gd": "Needed to process images",
"ext-gmagick": "Improves image processing performance",
"ext-imagick": "Improves image processing performance",
"ext-zlib": "Needed for pdf stream compression"
},
"type": "library",
"autoload": {
"psr-4": {
"Dompdf\\": "src/"
},
"classmap": [
"lib/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL-2.1"
],
"authors": [
{
"name": "The Dompdf Community",
"homepage": "https://github.com/dompdf/dompdf/blob/master/AUTHORS.md"
}
],
"description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter",
"homepage": "https://github.com/dompdf/dompdf",
"support": {
"issues": "https://github.com/dompdf/dompdf/issues",
"source": "https://github.com/dompdf/dompdf/tree/v3.1.6"
},
"time": "2026-07-20T12:29:38+00:00"
},
{
"name": "dompdf/php-font-lib",
"version": "1.0.2",
"source": {
"type": "git",
"url": "https://github.com/dompdf/php-font-lib.git",
"reference": "a6e9a688a2a80016ac080b97be73d3e10c444c9a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/a6e9a688a2a80016ac080b97be73d3e10c444c9a",
"reference": "a6e9a688a2a80016ac080b97be73d3e10c444c9a",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"php": "^7.1 || ^8.0"
},
"require-dev": {
"phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11 || ^12"
},
"type": "library",
"autoload": {
"psr-4": {
"FontLib\\": "src/FontLib"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL-2.1-or-later"
],
"authors": [
{
"name": "The FontLib Community",
"homepage": "https://github.com/dompdf/php-font-lib/blob/master/AUTHORS.md"
}
],
"description": "A library to read, parse, export and make subsets of different types of font files.",
"homepage": "https://github.com/dompdf/php-font-lib",
"support": {
"issues": "https://github.com/dompdf/php-font-lib/issues",
"source": "https://github.com/dompdf/php-font-lib/tree/1.0.2"
},
"time": "2026-01-20T14:10:26+00:00"
},
{
"name": "dompdf/php-svg-lib",
"version": "1.0.2",
"source": {
"type": "git",
"url": "https://github.com/dompdf/php-svg-lib.git",
"reference": "8259ffb930817e72b1ff1caef5d226501f3dfeb1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/8259ffb930817e72b1ff1caef5d226501f3dfeb1",
"reference": "8259ffb930817e72b1ff1caef5d226501f3dfeb1",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"php": "^7.1 || ^8.0",
"sabberworm/php-css-parser": "^8.4 || ^9.0"
},
"require-dev": {
"phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11"
},
"type": "library",
"autoload": {
"psr-4": {
"Svg\\": "src/Svg"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL-3.0-or-later"
],
"authors": [
{
"name": "The SvgLib Community",
"homepage": "https://github.com/dompdf/php-svg-lib/blob/master/AUTHORS.md"
}
],
"description": "A library to read, parse and export to PDF SVG files.",
"homepage": "https://github.com/dompdf/php-svg-lib",
"support": {
"issues": "https://github.com/dompdf/php-svg-lib/issues",
"source": "https://github.com/dompdf/php-svg-lib/tree/1.0.2"
},
"time": "2026-01-02T16:01:13+00:00"
},
{ {
"name": "dragonmantank/cron-expression", "name": "dragonmantank/cron-expression",
"version": "v3.6.0", "version": "v3.6.0",
@@ -2032,6 +2264,73 @@
], ],
"time": "2026-03-08T20:05:35+00:00" "time": "2026-03-08T20:05:35+00:00"
}, },
{
"name": "masterminds/html5",
"version": "2.11.0",
"source": {
"type": "git",
"url": "https://github.com/Masterminds/html5-php.git",
"reference": "a1e7a2f88ee13635d86fc61cfbdf2306a76ddfc7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Masterminds/html5-php/zipball/a1e7a2f88ee13635d86fc61cfbdf2306a76ddfc7",
"reference": "a1e7a2f88ee13635d86fc61cfbdf2306a76ddfc7",
"shasum": ""
},
"require": {
"ext-dom": "*",
"php": ">=7.4"
},
"require-dev": {
"phpunit/phpunit": "^6 || ^7 || ^8 || ^9 || ^10"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.7-dev"
}
},
"autoload": {
"psr-4": {
"Masterminds\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Matt Butcher",
"email": "technosophos@gmail.com"
},
{
"name": "Matt Farina",
"email": "matt@mattfarina.com"
},
{
"name": "Asmir Mustafic",
"email": "goetas@gmail.com"
}
],
"description": "An HTML5 parser and serializer.",
"homepage": "http://masterminds.github.io/html5-php",
"keywords": [
"HTML5",
"dom",
"html",
"parser",
"querypath",
"serializer",
"xml"
],
"support": {
"issues": "https://github.com/Masterminds/html5-php/issues",
"source": "https://github.com/Masterminds/html5-php/tree/2.11.0"
},
"time": "2026-08-18T06:18:41+00:00"
},
{ {
"name": "monolog/monolog", "name": "monolog/monolog",
"version": "3.10.0", "version": "3.10.0",
@@ -3306,6 +3605,84 @@
}, },
"time": "2026-06-18T03:57:49+00:00" "time": "2026-06-18T03:57:49+00:00"
}, },
{
"name": "sabberworm/php-css-parser",
"version": "v9.5.0",
"source": {
"type": "git",
"url": "https://github.com/MyIntervals/PHP-CSS-Parser.git",
"reference": "f284e63b6e891e0c28631e54ba06c3ed102a9ef3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/f284e63b6e891e0c28631e54ba06c3ed102a9ef3",
"reference": "f284e63b6e891e0c28631e54ba06c3ed102a9ef3",
"shasum": ""
},
"require": {
"ext-iconv": "*",
"php": "^7.2.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0 || ~8.6.0"
},
"require-dev": {
"php-parallel-lint/php-parallel-lint": "1.4.0",
"phpstan/extension-installer": "1.4.3",
"phpstan/phpstan": "1.12.33 || 2.2.9",
"phpstan/phpstan-phpunit": "1.4.2 || 2.0.18",
"phpstan/phpstan-strict-rules": "1.6.2 || 2.0.12",
"phpunit/phpunit": "8.5.54",
"rawr/phpunit-data-provider": "3.3.1",
"rector/rector": "1.2.10 || 2.6.2",
"rector/type-perfect": "1.0.0 || 2.1.4",
"squizlabs/php_codesniffer": "4.0.4"
},
"suggest": {
"ext-mbstring": "for parsing UTF-8 CSS"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "9.6.x-dev"
}
},
"autoload": {
"files": [
"src/Rule/Rule.php",
"src/RuleSet/RuleContainer.php"
],
"psr-4": {
"Sabberworm\\CSS\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Raphael Schweikert"
},
{
"name": "Oliver Klee",
"email": "github@oliverklee.de"
},
{
"name": "Jake Hotson",
"email": "jake.github@qzdesign.co.uk"
}
],
"description": "Parser for CSS Files written in PHP",
"homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser",
"keywords": [
"css",
"parser",
"stylesheet"
],
"support": {
"issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues",
"source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v9.5.0"
},
"time": "2026-09-20T15:02:00+00:00"
},
{ {
"name": "symfony/clock", "name": "symfony/clock",
"version": "v7.4.8", "version": "v7.4.8",
+301
View File
@@ -0,0 +1,301 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Settings
|--------------------------------------------------------------------------
|
| Set some default values. It is possible to add all defines that can be set
| in dompdf_config.inc.php. You can also override the entire config file.
|
*/
'show_warnings' => false, // Throw an Exception on warnings from dompdf
'public_path' => null, // Override the public path if needed
/*
* Dejavu Sans font is missing glyphs for converted entities, turn it off if you need to show € and £.
*/
'convert_entities' => true,
'options' => [
/**
* The location of the DOMPDF font directory
*
* The location of the directory where DOMPDF will store fonts and font metrics
* Note: This directory must exist and be writable by the webserver process.
* *Please note the trailing slash.*
*
* Notes regarding fonts:
* Additional .afm font metrics can be added by executing load_font.php from command line.
*
* Only the original "Base 14 fonts" are present on all pdf viewers. Additional fonts must
* be embedded in the pdf file or the PDF may not display correctly. This can significantly
* increase file size unless font subsetting is enabled. Before embedding a font please
* review your rights under the font license.
*
* Any font specification in the source HTML is translated to the closest font available
* in the font directory.
*
* The pdf standard "Base 14 fonts" are:
* Courier, Courier-Bold, Courier-BoldOblique, Courier-Oblique,
* Helvetica, Helvetica-Bold, Helvetica-BoldOblique, Helvetica-Oblique,
* Times-Roman, Times-Bold, Times-BoldItalic, Times-Italic,
* Symbol, ZapfDingbats.
*/
'font_dir' => storage_path('fonts'), // advised by dompdf (https://github.com/dompdf/dompdf/pull/782)
/**
* The location of the DOMPDF font cache directory
*
* This directory contains the cached font metrics for the fonts used by DOMPDF.
* This directory can be the same as DOMPDF_FONT_DIR
*
* Note: This directory must exist and be writable by the webserver process.
*/
'font_cache' => storage_path('fonts'),
/**
* The location of a temporary directory.
*
* The directory specified must be writeable by the webserver process.
* The temporary directory is required to download remote images and when
* using the PDFLib back end.
*/
'temp_dir' => sys_get_temp_dir(),
/**
* ==== IMPORTANT ====
*
* dompdf's "chroot": Prevents dompdf from accessing system files or other
* files on the webserver. All local files opened by dompdf must be in a
* subdirectory of this directory. DO NOT set it to '/' since this could
* allow an attacker to use dompdf to read any files on the server. This
* should be an absolute path.
* This is only checked on command line call by dompdf.php, but not by
* direct class use like:
* $dompdf = new DOMPDF(); $dompdf->load_html($htmldata); $dompdf->render(); $pdfdata = $dompdf->output();
*/
'chroot' => realpath(base_path()),
/**
* Protocol whitelist
*
* Protocols and PHP wrappers allowed in URIs, and the validation rules
* that determine if a resouce may be loaded. Full support is not guaranteed
* for the protocols/wrappers specified
* by this array.
*
* @var array
*/
'allowed_protocols' => [
'data://' => ['rules' => []],
'file://' => ['rules' => []],
'http://' => ['rules' => []],
'https://' => ['rules' => []],
],
/**
* Operational artifact (log files, temporary files) path validation
*/
'artifactPathValidation' => null,
/**
* @var string
*/
'log_output_file' => null,
/**
* Whether to enable font subsetting or not.
*/
'enable_font_subsetting' => false,
/**
* The PDF rendering backend to use
*
* Valid settings are 'PDFLib', 'CPDF' (the bundled R&OS PDF class), 'GD' and
* 'auto'. 'auto' will look for PDFLib and use it if found, or if not it will
* fall back on CPDF. 'GD' renders PDFs to graphic files.
* {@link * Canvas_Factory} ultimately determines which rendering class to
* instantiate based on this setting.
*
* Both PDFLib & CPDF rendering backends provide sufficient rendering
* capabilities for dompdf, however additional features (e.g. object,
* image and font support, etc.) differ between backends. Please see
* {@link PDFLib_Adapter} for more information on the PDFLib backend
* and {@link CPDF_Adapter} and lib/class.pdf.php for more information
* on CPDF. Also see the documentation for each backend at the links
* below.
*
* The GD rendering backend is a little different than PDFLib and
* CPDF. Several features of CPDF and PDFLib are not supported or do
* not make any sense when creating image files. For example,
* multiple pages are not supported, nor are PDF 'objects'. Have a
* look at {@link GD_Adapter} for more information. GD support is
* experimental, so use it at your own risk.
*
* @link http://www.pdflib.com
* @link http://www.ros.co.nz/pdf
* @link http://www.php.net/image
*/
'pdf_backend' => 'CPDF',
/**
* html target media view which should be rendered into pdf.
* List of types and parsing rules for future extensions:
* http://www.w3.org/TR/REC-html40/types.html
* screen, tty, tv, projection, handheld, print, braille, aural, all
* Note: aural is deprecated in CSS 2.1 because it is replaced by speech in CSS 3.
* Note, even though the generated pdf file is intended for print output,
* the desired content might be different (e.g. screen or projection view of html file).
* Therefore allow specification of content here.
*/
'default_media_type' => 'screen',
/**
* The default paper size.
*
* North America standard is "letter"; other countries generally "a4"
*
* @see CPDF_Adapter::PAPER_SIZES for valid sizes ('letter', 'legal', 'A4', etc.)
*/
'default_paper_size' => 'a4',
/**
* The default paper orientation.
*
* The orientation of the page (portrait or landscape).
*
* @var string
*/
'default_paper_orientation' => 'portrait',
/**
* The default font family
*
* Used if no suitable fonts can be found. This must exist in the font folder.
*
* @var string
*/
'default_font' => 'serif',
/**
* Image DPI setting
*
* This setting determines the default DPI setting for images and fonts. The
* DPI may be overridden for inline images by explictly setting the
* image's width & height style attributes (i.e. if the image's native
* width is 600 pixels and you specify the image's width as 72 points,
* the image will have a DPI of 600 in the rendered PDF. The DPI of
* background images can not be overridden and is controlled entirely
* via this parameter.
*
* For the purposes of DOMPDF, pixels per inch (PPI) = dots per inch (DPI).
* If a size in html is given as px (or without unit as image size),
* this tells the corresponding size in pt.
* This adjusts the relative sizes to be similar to the rendering of the
* html page in a reference browser.
*
* In pdf, always 1 pt = 1/72 inch
*
* Rendering resolution of various browsers in px per inch:
* Windows Firefox and Internet Explorer:
* SystemControl->Display properties->FontResolution: Default:96, largefonts:120, custom:?
* Linux Firefox:
* about:config *resolution: Default:96
* (xorg screen dimension in mm and Desktop font dpi settings are ignored)
*
* Take care about extra font/image zoom factor of browser.
*
* In images, <img> size in pixel attribute, img css style, are overriding
* the real image dimension in px for rendering.
*
* @var int
*/
'dpi' => 96,
/**
* Enable embedded PHP
*
* If this setting is set to true then DOMPDF will automatically evaluate embedded PHP contained
* within <script type="text/php"> ... </script> tags.
*
* ==== IMPORTANT ==== Enabling this for documents you do not trust (e.g. arbitrary remote html pages)
* is a security risk.
* Embedded scripts are run with the same level of system access available to dompdf.
* Set this option to false (recommended) if you wish to process untrusted documents.
* This setting may increase the risk of system exploit.
* Do not change this settings without understanding the consequences.
* Additional documentation is available on the dompdf wiki at:
* https://github.com/dompdf/dompdf/wiki
*
* @var bool
*/
'enable_php' => false,
/**
* Enable inline JavaScript
*
* If this setting is set to true then DOMPDF will automatically insert JavaScript code contained
* within <script type="text/javascript"> ... </script> tags as written into the PDF.
* NOTE: This is PDF-based JavaScript to be executed by the PDF viewer,
* not browser-based JavaScript executed by Dompdf.
*
* @var bool
*/
'enable_javascript' => true,
/**
* Enable remote file access
*
* If this setting is set to true, DOMPDF will access remote sites for
* images and CSS files as required.
*
* ==== IMPORTANT ====
* This can be a security risk, in particular in combination with isPhpEnabled and
* allowing remote html code to be passed to $dompdf = new DOMPDF(); $dompdf->load_html(...);
* This allows anonymous users to download legally doubtful internet content which on
* tracing back appears to being downloaded by your server, or allows malicious php code
* in remote html pages to be executed by your server with your account privileges.
*
* This setting may increase the risk of system exploit. Do not change
* this settings without understanding the consequences. Additional
* documentation is available on the dompdf wiki at:
* https://github.com/dompdf/dompdf/wiki
*
* @var bool
*/
'enable_remote' => false,
/**
* List of allowed remote hosts
*
* Each value of the array must be a valid hostname.
*
* This will be used to filter which resources can be loaded in combination with
* isRemoteEnabled. If enable_remote is FALSE, then this will have no effect.
*
* Leave to NULL to allow any remote host.
*
* @var array|null
*/
'allowed_remote_hosts' => null,
/**
* A ratio applied to the fonts height to be more like browsers' line height
*/
'font_height_ratio' => 1.1,
/**
* Use the HTML5 Lib parser
*
* @deprecated This feature is now always on in dompdf 2.x
*
* @var bool
*/
'enable_html5_parser' => true,
],
];
+29 -12
View File
@@ -61,25 +61,42 @@ class AiProviderSeeder extends Seeder
{ {
$models = [ $models = [
'openrouter' => [ 'openrouter' => [
['name' => 'inclusionai/ling-2.6-flash', 'slug' => 'inclusionai/ling-2.6-flash', 'max_tokens' => 4096], ['name' => 'apodex/apodex-1.1-mini:free', 'slug' => 'apodex/apodex-1.1-mini:free', 'max_tokens' => 4096],
['name' => 'inclusionai/ling-3.0-tiny:free', 'slug' => 'inclusionai/ling-3.0-tiny:free', 'max_tokens' => 4096],
['name' => 'poolside/laguna-s-2.1:free', 'slug' => 'poolside/laguna-s-2.1:free', 'max_tokens' => 4096],
['name' => 'poolside/laguna-xs-2.1:free', 'slug' => 'poolside/laguna-xs-2.1:free', 'max_tokens' => 4096],
['name' => 'cohere/north-mini-code:free', 'slug' => 'cohere/north-mini-code:free', 'max_tokens' => 4096], ['name' => 'cohere/north-mini-code:free', 'slug' => 'cohere/north-mini-code:free', 'max_tokens' => 4096],
['name' => 'nvidia/nemotron-3.5-content-safety:free', 'slug' => 'nvidia/nemotron-3.5-content-safety:free', 'max_tokens' => 4096], ['name' => 'deepseek/deepseek-v4-flash', 'slug' => 'deepseek/deepseek-v4-flash', 'max_tokens' => 8192],
['name' => 'nvidia/nemotron-3-ultra-550b-a55b:free', 'slug' => 'nvidia/nemotron-3-ultra-550b-a55b:free', 'max_tokens' => 4096], ['name' => 'deepseek/deepseek-v4-flash-0731:free', 'slug' => 'deepseek/deepseek-v4-flash-0731:free', 'max_tokens' => 8192],
['name' => 'nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free', 'slug' => 'nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free', 'max_tokens' => 4096], ['name' => 'deepseek/deepseek-v4.1-flash', 'slug' => 'deepseek/deepseek-v4.1-flash', 'max_tokens' => 8192],
['name' => 'dots-studio/dots-3-note-preview:free', 'slug' => 'dots-studio/dots-3-note-preview:free', 'max_tokens' => 4096],
['name' => 'google/gemma-4-26b-a4b-it:free', 'slug' => 'google/gemma-4-26b-a4b-it:free', 'max_tokens' => 4096], ['name' => 'google/gemma-4-26b-a4b-it:free', 'slug' => 'google/gemma-4-26b-a4b-it:free', 'max_tokens' => 4096],
['name' => 'google/gemma-4-31b-it:free', 'slug' => 'google/gemma-4-31b-it:free', 'max_tokens' => 4096], ['name' => 'google/gemma-4-31b-it:free', 'slug' => 'google/gemma-4-31b-it:free', 'max_tokens' => 4096],
['name' => 'google/lyria-3-pro-preview', 'slug' => 'google/lyria-3-pro-preview', 'max_tokens' => 4096], ['name' => 'inclusionai/ling-3.0-flash-sante:free', 'slug' => 'inclusionai/ling-3.0-flash-sante:free', 'max_tokens' => 4096],
['name' => 'google/lyria-3-clip-preview', 'slug' => 'google/lyria-3-clip-preview', 'max_tokens' => 4096], ['name' => 'inclusionai/ling-3.0-flash-vl:free', 'slug' => 'inclusionai/ling-3.0-flash-vl:free', 'max_tokens' => 4096],
['name' => 'nvidia/nemotron-3-super-120b-a12b:free', 'slug' => 'nvidia/nemotron-3-super-120b-a12b:free', 'max_tokens' => 4096], ['name' => 'liquid/lfm-2.5-2.6b:free', 'slug' => 'liquid/lfm-2.5-2.6b:free', 'max_tokens' => 4096],
['name' => 'openrouter/free', 'slug' => 'openrouter/free', 'max_tokens' => 4096], ['name' => 'minimax/minimax-m2', 'slug' => 'minimax/minimax-m2', 'max_tokens' => 8192],
['name' => 'minimax/minimax-m3', 'slug' => 'minimax/minimax-m3', 'max_tokens' => 8192],
['name' => 'nvidia/nemotron-3-nano-30b-a3b:free', 'slug' => 'nvidia/nemotron-3-nano-30b-a3b:free', 'max_tokens' => 4096], ['name' => 'nvidia/nemotron-3-nano-30b-a3b:free', 'slug' => 'nvidia/nemotron-3-nano-30b-a3b:free', 'max_tokens' => 4096],
['name' => 'nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free', 'slug' => 'nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free', 'max_tokens' => 4096],
['name' => 'nvidia/nemotron-3-super-120b-a12b:free', 'slug' => 'nvidia/nemotron-3-super-120b-a12b:free', 'max_tokens' => 4096],
['name' => 'nvidia/nemotron-3-ultra-550b-a55b:free', 'slug' => 'nvidia/nemotron-3-ultra-550b-a55b:free', 'max_tokens' => 4096],
['name' => 'nvidia/nemotron-3.5-content-safety:free', 'slug' => 'nvidia/nemotron-3.5-content-safety:free', 'max_tokens' => 4096],
['name' => 'nvidia/nemotron-3.5-lightning:free', 'slug' => 'nvidia/nemotron-3.5-lightning:free', 'max_tokens' => 4096],
['name' => 'nvidia/nemotron-nano-12b-v2-vl:free', 'slug' => 'nvidia/nemotron-nano-12b-v2-vl:free', 'max_tokens' => 4096], ['name' => 'nvidia/nemotron-nano-12b-v2-vl:free', 'slug' => 'nvidia/nemotron-nano-12b-v2-vl:free', 'max_tokens' => 4096],
['name' => 'nvidia/nemotron-nano-9b-v2:free', 'slug' => 'nvidia/nemotron-nano-9b-v2:free', 'max_tokens' => 4096], ['name' => 'nvidia/nemotron-nano-9b-v2:free', 'slug' => 'nvidia/nemotron-nano-9b-v2:free', 'max_tokens' => 4096],
['name' => 'openai/gpt-oss-20b:free', 'slug' => 'openai/gpt-oss-20b:free', 'max_tokens' => 4096], ['name' => 'openai/gpt-oss-20b:free', 'slug' => 'openai/gpt-oss-20b:free', 'max_tokens' => 4096],
['name' => 'deepseek/deepseek-v4-flash', 'slug' => 'deepseek/deepseek-v4-flash', 'max_tokens' => 8192], ['name' => 'openrouter/free', 'slug' => 'openrouter/free', 'max_tokens' => 4096],
['name' => 'poolside/laguna-m.1', 'slug' => 'poolside/laguna-m.1', 'max_tokens' => 4096],
['name' => 'poolside/laguna-m.1:free', 'slug' => 'poolside/laguna-m.1:free', 'max_tokens' => 4096],
['name' => 'poolside/laguna-s-2.1:free', 'slug' => 'poolside/laguna-s-2.1:free', 'max_tokens' => 4096],
['name' => 'poolside/laguna-xs-2.1:free', 'slug' => 'poolside/laguna-xs-2.1:free', 'max_tokens' => 4096],
['name' => 'qwen/qwen3-coder-next', 'slug' => 'qwen/qwen3-coder-next', 'max_tokens' => 8192],
['name' => 'qwen/qwen3.7-flash:free', 'slug' => 'qwen/qwen3.7-flash:free', 'max_tokens' => 4096],
['name' => 'qwen/qwen3.8-27b:free', 'slug' => 'qwen/qwen3.8-27b:free', 'max_tokens' => 8192],
['name' => 'qwen/qwen3.8-flash', 'slug' => 'qwen/qwen3.8-flash', 'max_tokens' => 4096],
['name' => 'thinkingmachines/inkling:free', 'slug' => 'thinkingmachines/inkling:free', 'max_tokens' => 4096],
['name' => 'thinkingmachines/inkling-small:free', 'slug' => 'thinkingmachines/inkling-small:free', 'max_tokens' => 4096],
['name' => 'xiaomi/mimo-v2.5', 'slug' => 'xiaomi/mimo-v2.5', 'max_tokens' => 4096],
['name' => 'xiaomi/mimo-v2.6-flash', 'slug' => 'xiaomi/mimo-v2.6-flash', 'max_tokens' => 4096],
['name' => 'z-ai/glm-5.3-flash', 'slug' => 'z-ai/glm-5.3-flash', 'max_tokens' => 4096],
], ],
'stepfun' => [ 'stepfun' => [
['name' => 'step-3.5-flash', 'slug' => 'step-3.5-flash', 'max_tokens' => 8192], ['name' => 'step-3.5-flash', 'slug' => 'step-3.5-flash', 'max_tokens' => 8192],
+1
View File
@@ -15,6 +15,7 @@ class DatabaseSeeder extends Seeder
UserSeeder::class, UserSeeder::class,
AiProviderSeeder::class, AiProviderSeeder::class,
PromptTemplateSeeder::class, PromptTemplateSeeder::class,
LegalDocumentSeeder::class,
TutorialSeeder::class, TutorialSeeder::class,
]); ]);
} }
+118 -50
View File
@@ -18,90 +18,158 @@ class LegalDocumentSeeder extends Seeder
$superadmin = User::where('role', 'superadmin')->first(); $superadmin = User::where('role', 'superadmin')->first();
$termsContent = <<<EOT $termsContent = <<<EOT
TERMOS DE USO TERMOS DE USO - GPrompt
1. Aceitação dos Termos 1. ACEITAÇÃO DOS TERMOS
Ao acessar e utilizar o sistema GPrompt, você concorda em cumprir estes Termos de Uso. Ao acessar e utilizar o sistema GPrompt, você concorda em cumprir integralmente estes Termos de Uso. Caso não concorde com qualquer disposição deste documento, você não deve utilizar o sistema.
2. Descrição do Serviço 2. DEFINIÇÕES
O GPrompt é um sistema de geração de prompts para inteligência artificial. - Sistema: GPrompt, plataforma de geração de prompts para inteligência artificial
- Usuário: pessoa física ou jurídica que utiliza o sistema
- Conteúdo: qualquer informação, dado ou material inserido ou gerado pelo sistema
- LGPD: Lei Geral de Proteção de Dados Pessoais (Lei nº 13.709/2018)
3. Conta de Usuário 3. DESCRIÇÃO DO SERVIÇO
Você é responsável por manter a confidencialidade de sua conta e senha. O GPrompt é um sistema de geração de prompts para inteligência artificial, permitindo a criação, gestão e otimização de prompts estruturados com suporte a múltiplos provedores de IA.
4. Conduta do Usuário 4. CADASTRO E CONTA DE USUÁRIO
Você concorda em utilizar o sistema de acordo com as leis aplicáveis. 4.1. Para utilizar o sistema, o usuário deve criar uma conta fornecendo informações precisas e atualizadas.
4.2. O usuário é integralmente responsável pela confidencialidade de suas credenciais de acesso.
4.3. O usuário compromete-se a notificar imediatamente qualquer uso não autorizado de sua conta.
4.4. O acesso de usuários não aprovados depende de autorização prévia do administrador.
5. Propriedade Intelectual 5. OBRIGAÇÕES DO USUÁRIO
Todo o conteúdo e funcionalidades são de propriedade da Syspanel. 5.1. Utilizar o sistema em conformidade com as leis brasileiras.
5.2. Não realizar atividades que possam comprometer a segurança do sistema.
5.3. Não inserir conteúdo ilegal, ofensivo ou que viole direitos de terceiros.
5.4. Não reproduzir, distribuir ou modificar o sistema sem autorização.
6. Limitação de Responsabilidade 6. PROPRIEDADE INTELECTUAL
O sistema é fornecido "como está", sem garantias. 6.1. O sistema GPrompt e todos os seus componentes são propriedade da Syspanel.
6.2. O conteúdo gerado pelo usuário através do sistema é de propriedade do usuário.
6.3. É proibida a engenharia reversa, descompilação ou tentativa de extrair o código fonte.
7. Modificações 7. LIMITAÇÃO DE RESPONSABILIDADE
Estes termos podem ser alterados a qualquer momento. 7.1. O sistema é fornecido "como está", sem garantias de disponibilidade contínua.
7.2. A Syspanel não se responsabiliza por danos decorrentes do uso ou da impossibilidade de uso do sistema.
7.3. A Syspanel não se responsabiliza pelo conteúdo gerado pela inteligência artificial através do sistema.
8. Lei Aplicável 8. PRIVACIDADE E PROTEÇÃO DE DADOS
Estes termos são regidos pelas leis brasileiras. 8.1. O tratamento de dados pessoais segue integralmente a LGPD.
8.2. Os dados coletados são utilizados exclusivamente para as finalidades descritas na Política de Privacidade.
8.3. O usuário pode exercer seus direitos de titular de dados a qualquer momento.
9. DISPOSIÇÕES GERAIS
9.1. Estes termos podem ser alterados a qualquer momento, mediante comunicação aos usuários.
9.2. O uso continuado após alterações constitui aceitação dos novos termos.
9.3. Foro: Comarca de São Paulo/SP para eventuais controvérsias.
10. CONTATO
Para esclarecimentos sobre estes termos, entre em contato: contato@syspanel.com.br
EOT; EOT;
$privacyContent = <<<EOT $privacyContent = <<<EOT
POLÍTICA DE PRIVACIDADE POLÍTICA DE PRIVACIDADE - GPrompt (LGPD)
1. Informações Gerais 1. INFORMAÇÕES GERAIS
Esta Política de Privacidade descreve como o GPrompt coleta e utiliza dados pessoais. Esta Política de Privacidade descreve como o GPrompt coleta, utiliza, armazena e protege os dados pessoais dos usuários, em conformidade com a Lei Geral de Proteção de Dados Pessoais (Lei nº 13.709/2018).
2. Dados Coletados 2. TITULAR DO TRATAMENTO
- Nome e e-mail Syspanel
- Senha (armazenada de forma segura) CNPJ: XX.XXX.XXX/XXXX-XX
- Dados de uso do sistema E-mail: contato@syspanel.com.br
3. DADOS PESSOAIS COLETADOS
3.1. Dados fornecidos pelo usuário:
- Nome completo
- Endereço de e-mail
- Senha de acesso (armazenada com criptografia hash - bcrypt)
- Dados da empresa (nome, endereço, WhatsApp, website, redes sociais)
3.2. Dados coletados automaticamente:
- Endereço IP - Endereço IP
- Agente do navegador (user agent)
- Preferências de cookies
- Dados de uso do sistema
- Data e hora das interações
3. Finalidade da Coleta 4. FINALIDADES DO TRATAMENTO
- Autenticação e acesso ao sistema - Autenticação e autorização de acesso ao sistema
- Geração de prompts com IA - Geração e otimização de prompts com IA
- Histórico de gerações e projetos
- Comunicações sobre o serviço - Comunicações sobre o serviço
- Segurança e prevenção de fraudes - Segurança e prevenção de fraudes
- Cumprimento de obrigações legais
- Melhoria contínua do sistema
4. Base Legal 5. BASES LEGAIS PARA O TRATAMENTO (LGPD - Art. 7º)
- Consentimento do usuário - Consentimento do titular (Art. 7º, I)
- Execução de contrato - Execução de contrato (Art. 7º, V)
- Cumprimento de obrigação legal - Cumprimento de obrigação legal ou regulatória (Art. 7º, II)
- Legítimo interesse - Legítimo interesse (Art. 7º, IX)
5. Compartilhamento 6. COMPARTILHAMENTO DE DADOS
Seus dados não são compartilhados com terceiros, exceto quando exigido por lei. 6.1. Seus dados não são compartilhados com terceiros, exceto:
- Provedores de IA selecionados para geração de prompts (conforme sua escolha)
- Autoridades legais, quando exigido por lei
- Serviços de infraestrutura (hospedagem, banco de dados)
6. Armazenamento 6.2. Não vendemos dados pessoais a terceiros.
Os dados são armazenados em servidores seguros durante o tempo necessário.
7. Direitos do Titular 7. ARMAZENAMENTO E SEGURANÇA
- Acesso aos dados 7.1. Os dados são armazenados em servidores seguros com acesso restrito.
- Correção de informações 7.2. Adotamos medidas técnicas e organizacionais para proteger os dados contra acesso não autorizado.
- Exclusão da conta 7.3. O período de armazenamento é o necessário para cumprir as finalidades descritas nesta política.
- Portabilidade 7.4. Dados de usuários inativos podem ser removidos após 12 meses.
- Revogação do consentimento
8. Contato 8. DIREITOS DO TITULAR (LGPD - Art. 18)
Para exercer seus direitos, entre em contato: contato@syspanel.com.br O titular dos dados tem direito a:
- Confirmar a existência de tratamento
- Acessar seus dados pessoais
- Corrigir dados incompletos, inexatos ou desatualizados
- Solicitar a anonimização, bloqueio ou eliminação de dados desnecessários
- Solicitar a portabilidade dos dados
- Revogar o consentimento a qualquer momento
- Solicitar a exclusão dos dados tratados com base no consentimento
- Ser informado sobre compartilhamento com entidades públicas e privadas
9. COOKIES
9.1. Utilizamos cookies necessários para o funcionamento do sistema.
9.2. Cookies opcionais (estatísticas, marketing, preferências) dependem do seu consentimento.
9.3. Você pode gerenciar suas preferências de cookies através do banner de cookies.
10. CONSENTIMENTO
Ao utilizar o sistema, você declara ter lido e compreendido esta Política de Privacidade e autoriza o tratamento de seus dados conforme aqui descrito.
11. ALTERAÇÕES
Esta política pode ser atualizada periodicamente. Alterações significativas serão comunicadas aos usuários.
12. CONTATO E DPO
Para exercer seus direitos ou esclarecer dúvidas sobre privacidade:
E-mail: contato@syspanel.com.br
Prazo de resposta: até 15 dias úteis (LGPD - Art. 19)
EOT; EOT;
LegalDocument::create([ LegalDocument::updateOrCreate(
'type' => 'terms-of-service', ['type' => 'terms-of-service'],
[
'title' => 'Termos de Uso', 'title' => 'Termos de Uso',
'content' => $termsContent, 'content' => $termsContent,
'version' => '1.0', 'version' => '1.0',
'published_by' => $superadmin?->id, 'published_by' => $superadmin?->id,
'published_at' => now(), 'published_at' => now(),
]); ]
);
LegalDocument::create([ LegalDocument::updateOrCreate(
'type' => 'privacy-policy', ['type' => 'privacy-policy'],
[
'title' => 'Política de Privacidade', 'title' => 'Política de Privacidade',
'content' => $privacyContent, 'content' => $privacyContent,
'version' => '1.0', 'version' => '1.0',
'published_by' => $superadmin?->id, 'published_by' => $superadmin?->id,
'published_at' => now(), 'published_at' => now(),
]); ]
);
} }
} }
+72 -36
View File
@@ -23,12 +23,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'A empresa atende pequenas e médias empresas com soluções de tecnologia. A landing page deve transmitir confiança, inovação e credibilidade, com design moderno e responsivo.', 'context' => 'A empresa atende pequenas e médias empresas com soluções de tecnologia. A landing page deve transmitir confiança, inovação e credibilidade, com design moderno e responsivo.',
'persona' => 'Você é um especialista em UI/UX e Frontend com foco em conversão. Domina HTML5, CSS3, JavaScript, Bootstrap 5 e práticas de SEO.', 'persona' => 'Você é um especialista em UI/UX e Frontend com foco em conversão. Domina HTML5, CSS3, JavaScript, Bootstrap 5 e práticas de SEO.',
'tone' => 'Profissional, tecnológico, confiável e moderno. Linguagem acessível mas sofisticada.', 'tone' => 'Profissional, tecnológico, confiável e moderno. Linguagem acessível mas sofisticada.',
'constraints' => "- HTML5 semântico e acessível.\n- CSS responsivo mobile-first.\n- Máximo de 800 linhas.\n- SEO otimizado.\n- Sem dependências externas além de Bootstrap 5 e Bootstrap Icons.\n- Animações suaves com CSS.", 'constraints' => "- HTML5 semântico e acessível.\n- CSS responsivo mobile-first.\n- SEO otimizado.\n- Sem dependências externas além de Bootstrap 5 e Bootstrap Icons.\n- Animações suaves com CSS.",
'output_format' => 'Código HTML completo em arquivo único com CSS embutido e JavaScript mínimo para interações.', 'output_format' => 'Código HTML completo em arquivo único com CSS embutido e JavaScript mínimo para interações.',
'examples' => "Hero section com headline, subtítulo, CTA.\nCards de serviços.\nDepoimentos.\nFormulário de contato.\nFooter completo.", 'examples' => "Hero section com headline, subtítulo, CTA.\nCards de serviços.\nDepoimentos.\nFormulário de contato.\nFooter completo.",
'variables' => 'nome_empresa, slogan, telefone, email, endereco, linkedin_url', 'variables' => 'nome_empresa, slogan, telefone, email, endereco, linkedin_url',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -42,12 +43,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'SaaS B2B ou B2C com modelo de assinatura. Precisa convencer visitantes a experimentar ou assinar o produto.', 'context' => 'SaaS B2B ou B2C com modelo de assinatura. Precisa convencer visitantes a experimentar ou assinar o produto.',
'persona' => 'Especialista em Growth-Driven Design e CRO (Conversion Rate Optimization) para SaaS.', 'persona' => 'Especialista em Growth-Driven Design e CRO (Conversion Rate Optimization) para SaaS.',
'tone' => 'Moderno, direto, orientado a resultados. Linguagem clara e orientada a benefícios.', 'tone' => 'Moderno, direto, orientado a resultados. Linguagem clara e orientada a benefícios.',
'constraints' => "- Foco em conversão e captura de leads.\n- Design moderno com animações.\n- Responsivo.\n- SEO otimizado.\n- Máximo de 900 linhas.", 'constraints' => "- Foco em conversão e captura de leads.\n- Design moderno com animações.\n- Responsivo.\n- SEO otimizado.",
'output_format' => 'HTML completo com seções: Hero, Features, Pricing, FAQ, CTA final, Footer.', 'output_format' => 'HTML completo com seções: Hero, Features, Pricing, FAQ, CTA final, Footer.',
'examples' => 'Hero com trial grátis, grid de funcionalidades, tabela de preços com destaque no plano recomendado.', 'examples' => 'Hero com trial grátis, grid de funcionalidades, tabela de preços com destaque no plano recomendado.',
'variables' => 'nome_produto, slogan, trial_dias, preco_inicial, url_signup', 'variables' => 'nome_produto, slogan, trial_dias, preco_inicial, url_signup',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -61,12 +63,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Produto digital voltado para criadores de conteúdo, desenvolvedores ou profissionais de marketing.', 'context' => 'Produto digital voltado para criadores de conteúdo, desenvolvedores ou profissionais de marketing.',
'persona' => 'Especialista em lançamentos digitais e páginas de alta conversão.', 'persona' => 'Especialista em lançamentos digitais e páginas de alta conversão.',
'tone' => 'Persuasivo, entusiasta e confiável.', 'tone' => 'Persuasivo, entusiasta e confiável.',
'constraints' => "- Foco em conversão.\n- Design moderno.\n- Responsivo.\n- Máximo de 800 linhas.", 'constraints' => "- Foco em conversão.\n- Design moderno.\n- Responsivo.",
'output_format' => 'HTML completo com seções: Hero, Problema/Solução, Benefícios, Prova social, Oferta, FAQ, CTA.', 'output_format' => 'HTML completo com seções: Hero, Problema/Solução, Benefícios, Prova social, Oferta, FAQ, CTA.',
'examples' => 'Hero com vídeo ou imagem, seção de benefícios com ícones, depoimentos, contador de oferta.', 'examples' => 'Hero com vídeo ou imagem, seção de benefícios com ícones, depoimentos, contador de oferta.',
'variables' => 'nome_produto, preco, desconto, url_checkout', 'variables' => 'nome_produto, preco, desconto, url_checkout',
'temperature' => 0.8, 'temperature' => 0.8,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -80,12 +83,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Evento corporativo, conferência, workshop ou webinar. Público de 100 a 5000 participantes.', 'context' => 'Evento corporativo, conferência, workshop ou webinar. Público de 100 a 5000 participantes.',
'persona' => 'Especialista em eventos e experiência do usuário para inscrições.', 'persona' => 'Especialista em eventos e experiência do usuário para inscrições.',
'tone' => 'Animado, profissional, informativo.', 'tone' => 'Animado, profissional, informativo.',
'constraints' => "- Design impactante.\n- Informações claras.\n- Formulário de inscrição.\n- Responsivo.\n- Máximo de 700 linhas.", 'constraints' => "- Design impactante.\n- Informações claras.\n- Formulário de inscrição.\n- Responsivo.",
'output_format' => 'HTML completo com seções: Hero, Sobre, Programação, Palestrantes, Inscrição, Local/Online, Footer.', 'output_format' => 'HTML completo com seções: Hero, Sobre, Programação, Palestrantes, Inscrição, Local/Online, Footer.',
'examples' => 'Hero com contador regressivo, cards de palestrantes, timeline do evento, mapa ou link de transmissão.', 'examples' => 'Hero com contador regressivo, cards de palestrantes, timeline do evento, mapa ou link de transmissão.',
'variables' => 'nome_evento, data, local, url_inscricao, valor', 'variables' => 'nome_evento, data, local, url_inscricao, valor',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -99,12 +103,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Marketing de conteúdo para nutrição de leads. O material é oferecido em troca de e-mail.', 'context' => 'Marketing de conteúdo para nutrição de leads. O material é oferecido em troca de e-mail.',
'persona' => 'Especialista em marketing de conteúdo e inbound marketing.', 'persona' => 'Especialista em marketing de conteúdo e inbound marketing.',
'tone' => 'Educativo, confiável, persuasivo.', 'tone' => 'Educativo, confiável, persuasivo.',
'constraints' => "- Foco em captura de leads.\n- Design clean.\n- Responsivo.\n- Máximo de 600 linhas.", 'constraints' => "- Foco em captura de leads.\n- Design clean.\n- Responsivo.",
'output_format' => 'HTML completo com seções: Hero, O que você vai aprender, Sobre o autor, Formulário de captura, Footer.', 'output_format' => 'HTML completo com seções: Hero, O que você vai aprender, Sobre o autor, Formulário de captura, Footer.',
'examples' => 'Hero com capa do e-book, bullets de benefícios, formulário simples (nome + email), CTA destacado.', 'examples' => 'Hero com capa do e-book, bullets de benefícios, formulário simples (nome + email), CTA destacado.',
'variables' => 'titulo_ebook, autor, numero_paginas, url_download', 'variables' => 'titulo_ebook, autor, numero_paginas, url_download',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -118,12 +123,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Curso online de desenvolvimento web, marketing digital, design ou área tech. Público iniciante a intermediário.', 'context' => 'Curso online de desenvolvimento web, marketing digital, design ou área tech. Público iniciante a intermediário.',
'persona' => 'Especialista em educação a distância e páginas de venda de cursos.', 'persona' => 'Especialista em educação a distância e páginas de venda de cursos.',
'tone' => 'Motivador, educativo, confiável.', 'tone' => 'Motivador, educativo, confiável.',
'constraints' => "- Foco em conversão.\n- Design moderno.\n- Responsivo.\n- Máximo de 900 linhas.", 'constraints' => "- Foco em conversão.\n- Design moderno.\n- Responsivo.",
'output_format' => 'HTML completo com seções: Hero, Para quem é, Conteúdo programático, Instrutor, Depoimentos, Garantia, Preço, FAQ, CTA.', 'output_format' => 'HTML completo com seções: Hero, Para quem é, Conteúdo programático, Instrutor, Depoimentos, Garantia, Preço, FAQ, CTA.',
'examples' => 'Hero com vídeo de apresentação, accordion de módulos, selo de garantia, depoimentos em vídeo.', 'examples' => 'Hero com vídeo de apresentação, accordion de módulos, selo de garantia, depoimentos em vídeo.',
'variables' => 'nome_curso, instrutor, carga_horaria, preco, url_matricula', 'variables' => 'nome_curso, instrutor, carga_horaria, preco, url_matricula',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -137,12 +143,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'App de produtividade, finanças, saúde ou social. Disponível para iOS e Android.', 'context' => 'App de produtividade, finanças, saúde ou social. Disponível para iOS e Android.',
'persona' => 'Especialista em mobile apps e ASO (App Store Optimization).', 'persona' => 'Especialista em mobile apps e ASO (App Store Optimization).',
'tone' => 'Moderno, dinâmico, fresco.', 'tone' => 'Moderno, dinâmico, fresco.',
'constraints' => "- Design moderno com mockups.\n- Responsivo.\n- Links para App Store e Google Play.\n- Máximo de 800 linhas.", 'constraints' => "- Design moderno com mockups.\n- Responsivo.\n- Links para App Store e Google Play.",
'output_format' => 'HTML completo com seções: Hero, Funcionalidades, Telas, Reviews, Download, FAQ, Footer.', 'output_format' => 'HTML completo com seções: Hero, Funcionalidades, Telas, Reviews, Download, FAQ, Footer.',
'examples' => 'Hero com phone mockup, grid de funcionalidades com ícones, badges de avaliação, botões de download.', 'examples' => 'Hero com phone mockup, grid de funcionalidades com ícones, badges de avaliação, botões de download.',
'variables' => 'nome_app, slogan, url_ios, url_android, categoria', 'variables' => 'nome_app, slogan, url_ios, url_android, categoria',
'temperature' => 0.8, 'temperature' => 0.8,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -156,12 +163,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Agência digital que oferece serviços de branding, design, desenvolvimento e marketing. Atende startups e PMEs.', 'context' => 'Agência digital que oferece serviços de branding, design, desenvolvimento e marketing. Atende startups e PMEs.',
'persona' => 'Especialista em branding e experiência digital para agências.', 'persona' => 'Especialista em branding e experiência digital para agências.',
'tone' => 'Criativo, profissional, ousado.', 'tone' => 'Criativo, profissional, ousado.',
'constraints' => "- Design impactante.\n- Portfólio em destaque.\n- Responsivo.\n- Máximo de 900 linhas.", 'constraints' => "- Design impactante.\n- Portfólio em destaque.\n- Responsivo.",
'output_format' => 'HTML completo com seções: Hero, Serviços, Portfólio, Processo, Clientes, Depoimentos, Contato, Footer.', 'output_format' => 'HTML completo com seções: Hero, Serviços, Portfólio, Processo, Clientes, Depoimentos, Contato, Footer.',
'examples' => 'Hero com vídeo background, grid de projetos, logos de clientes, formulário de orçamento.', 'examples' => 'Hero com vídeo background, grid de projetos, logos de clientes, formulário de orçamento.',
'variables' => 'nome_agencia, especialidades, url_portfolio, telefone, email', 'variables' => 'nome_agencia, especialidades, url_portfolio, telefone, email',
'temperature' => 0.8, 'temperature' => 0.8,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -175,12 +183,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Restaurante de culinária contemporânea, com ambiente acolhedor e delivery.', 'context' => 'Restaurante de culinária contemporânea, com ambiente acolhedor e delivery.',
'persona' => 'Especialista em design para gastronomia e experiência do usuário.', 'persona' => 'Especialista em design para gastronomia e experiência do usuário.',
'tone' => 'Acolhedor, sofisticado, saboroso.', 'tone' => 'Acolhedor, sofisticado, saboroso.',
'constraints' => "- Design elegante.\n- Cardápio visual.\n- Sistema de reservas.\n- Responsivo.\n- Máximo de 700 linhas.", 'constraints' => "- Design elegante.\n- Cardápio visual.\n- Sistema de reservas.\n- Responsivo.",
'output_format' => 'HTML completo com seções: Hero, Sobre, Cardápio, Reservas, Depoimentos, Localização, Footer.', 'output_format' => 'HTML completo com seções: Hero, Sobre, Cardápio, Reservas, Depoimentos, Localização, Footer.',
'examples' => 'Hero com imagem do ambiente, cards de pratos com fotos, mapa integrado, botão de reserva.', 'examples' => 'Hero com imagem do ambiente, cards de pratos com fotos, mapa integrado, botão de reserva.',
'variables' => 'nome_restaurante, cozinha, telefone, endereco, url_reserva', 'variables' => 'nome_restaurante, cozinha, telefone, endereco, url_reserva',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -194,12 +203,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Imobiliária que vende e aluga imóveis residenciais e comerciais. Atua em grandes cidades.', 'context' => 'Imobiliária que vende e aluga imóveis residenciais e comerciais. Atua em grandes cidades.',
'persona' => 'Especialista em imóveis e experiência do usuário para vendas.', 'persona' => 'Especialista em imóveis e experiência do usuário para vendas.',
'tone' => 'Sofisticado, confiável, aspiracional.', 'tone' => 'Sofisticado, confiável, aspiracional.',
'constraints' => "- Design premium.\n- Galeria de imagens.\n- Filtros de busca.\n- Responsivo.\n- Máximo de 800 linhas.", 'constraints' => "- Design premium.\n- Galeria de imagens.\n- Filtros de busca.\n- Responsivo.",
'output_format' => 'HTML completo com seções: Hero, Busca, Destaques, Sobre, Contato, Footer.', 'output_format' => 'HTML completo com seções: Hero, Busca, Destaques, Sobre, Contato, Footer.',
'examples' => 'Hero com slider de imóveis, cards com fotos e preços, mapa de localização, formulário de contato.', 'examples' => 'Hero com slider de imóveis, cards com fotos e preços, mapa de localização, formulário de contato.',
'variables' => 'nome_imobiliaria, cidade, telefone, email, url_portfolio', 'variables' => 'nome_imobiliaria, cidade, telefone, email, url_portfolio',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -213,12 +223,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Clínica de fisioterapia, academia boutique ou spa urbano. Público preocupado com saúde e bem-estar.', 'context' => 'Clínica de fisioterapia, academia boutique ou spa urbano. Público preocupado com saúde e bem-estar.',
'persona' => 'Especialista em saúde digital e experiência do usuário para clínicas.', 'persona' => 'Especialista em saúde digital e experiência do usuário para clínicas.',
'tone' => 'Acolhedor, profissional, saudável.', 'tone' => 'Acolhedor, profissional, saudável.',
'constraints' => "- Design clean e acolhedor.\n- Sistema de agendamento.\n- Responsivo.\n- Máximo de 700 linhas.", 'constraints' => "- Design clean e acolhedor.\n- Sistema de agendamento.\n- Responsivo.",
'output_format' => 'HTML completo com seções: Hero, Serviços, Profissionais, Depoimentos, Agendamento, Localização, Footer.', 'output_format' => 'HTML completo com seções: Hero, Serviços, Profissionais, Depoimentos, Agendamento, Localização, Footer.',
'examples' => 'Hero com imagem relaxante, cards de serviços, equipe com fotos, botão de agendamento WhatsApp.', 'examples' => 'Hero com imagem relaxante, cards de serviços, equipe com fotos, botão de agendamento WhatsApp.',
'variables' => 'nome_clinica, servicos, telefone, endereco, url_agendamento', 'variables' => 'nome_clinica, servicos, telefone, endereco, url_agendamento',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -232,12 +243,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Faculdade, curso técnico ou escola de idiomas. Público jovem e adultos em busca de qualificação.', 'context' => 'Faculdade, curso técnico ou escola de idiomas. Público jovem e adultos em busca de qualificação.',
'persona' => 'Especialista em educação e experiência do usuário para instituições de ensino.', 'persona' => 'Especialista em educação e experiência do usuário para instituições de ensino.',
'tone' => 'Institucional, inspirador, educativo.', 'tone' => 'Institucional, inspirador, educativo.',
'constraints' => "- Design institucional.\n- Informações claras.\n- Responsivo.\n- Máximo de 800 linhas.", 'constraints' => "- Design institucional.\n- Informações claras.\n- Responsivo.",
'output_format' => 'HTML completo com seções: Hero, Cursos, Diferenciais, Infraestrutura, Depoimentos, Matrícula, Footer.', 'output_format' => 'HTML completo com seções: Hero, Cursos, Diferenciais, Infraestrutura, Depoimentos, Matrícula, Footer.',
'examples' => 'Hero com campus, cards de cursos, galeria de fotos, formulário de matrícula.', 'examples' => 'Hero com campus, cards de cursos, galeria de fotos, formulário de matrícula.',
'variables' => 'nome_escola, cursos, telefone, email, url_matricula', 'variables' => 'nome_escola, cursos, telefone, email, url_matricula',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -251,12 +263,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Empresa consolidada que precisa de presença digital profissional. Pode ser indústria, comércio ou serviços.', 'context' => 'Empresa consolidada que precisa de presença digital profissional. Pode ser indústria, comércio ou serviços.',
'persona' => 'Especialista em sites institucionais e identidade digital.', 'persona' => 'Especialista em sites institucionais e identidade digital.',
'tone' => 'Institucional, profissional, confiável.', 'tone' => 'Institucional, profissional, confiável.',
'constraints' => "- HTML5 semântico.\n- Múltiplas seções.\n- SEO otimizado.\n- Responsivo.\n- Máximo de 1000 linhas.", 'constraints' => "- HTML5 semântico.\n- Múltiplas seções.\n- SEO otimizado.\n- Responsivo.",
'output_format' => 'HTML completo com seções: Header, Hero, Sobre, Serviços, Cases, Equipe, Contato, Footer.', 'output_format' => 'HTML completo com seções: Header, Hero, Sobre, Serviços, Cases, Equipe, Contato, Footer.',
'examples' => 'Header fixo, hero com imagem institucional, grid de serviços, timeline da empresa, formulário de contato.', 'examples' => 'Header fixo, hero com imagem institucional, grid de serviços, timeline da empresa, formulário de contato.',
'variables' => 'nome_empresa, slogan, missao, telefone, email, endereco', 'variables' => 'nome_empresa, slogan, missao, telefone, email, endereco',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -270,12 +283,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Profissional de tecnologia ou design que quer showcase de projetos e experiência.', 'context' => 'Profissional de tecnologia ou design que quer showcase de projetos e experiência.',
'persona' => 'Especialista em portfolios e experiência do usuário para profissionais.', 'persona' => 'Especialista em portfolios e experiência do usuário para profissionais.',
'tone' => 'Minimalista, moderno, profissional.', 'tone' => 'Minimalista, moderno, profissional.',
'constraints' => "- Design clean.\n- Foco nos projetos.\n- Responsivo.\n- Máximo de 700 linhas.", 'constraints' => "- Design clean.\n- Foco nos projetos.\n- Responsivo.",
'output_format' => 'HTML completo com seções: Hero, Sobre, Experiência, Projetos, Skills, Contato, Footer.', 'output_format' => 'HTML completo com seções: Hero, Sobre, Experiência, Projetos, Skills, Contato, Footer.',
'examples' => 'Hero com foto, timeline de experiência, grid de projetos com screenshots, lista de skills.', 'examples' => 'Hero com foto, timeline de experiência, grid de projetos com screenshots, lista de skills.',
'variables' => 'nome, profissao, email, linkedin, github, url_portfolio', 'variables' => 'nome, profissao, email, linkedin, github, url_portfolio',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -289,12 +303,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Profissional criativo que precisa de um site impactante e visualmente marcante.', 'context' => 'Profissional criativo que precisa de um site impactante e visualmente marcante.',
'persona' => 'Especialista em design criativo e experiência visual imersiva.', 'persona' => 'Especialista em design criativo e experiência visual imersiva.',
'tone' => 'Criativo, ousado, artístico.', 'tone' => 'Criativo, ousado, artístico.',
'constraints' => "- Design criativo e impactante.\n- Galeria de imagens.\n- Animações suaves.\n- Responsivo.\n- Máximo de 800 linhas.", 'constraints' => "- Design criativo e impactante.\n- Galeria de imagens.\n- Animações suaves.\n- Responsivo.",
'output_format' => 'HTML completo com seções: Hero, Galeria, Sobre, Processo, Contato, Footer.', 'output_format' => 'HTML completo com seções: Hero, Galeria, Sobre, Processo, Contato, Footer.',
'examples' => 'Hero com animação, grid masonry de trabalhos, lightbox de imagens, formulário de contato minimalista.', 'examples' => 'Hero com animação, grid masonry de trabalhos, lightbox de imagens, formulário de contato minimalista.',
'variables' => 'nome, profissao, estilo, url_portfolio, instagram', 'variables' => 'nome, profissao, estilo, url_portfolio, instagram',
'temperature' => 0.9, 'temperature' => 0.9,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -308,12 +323,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Blog de tecnologia, lifestyle ou produtividade. Conteúdo em português.', 'context' => 'Blog de tecnologia, lifestyle ou produtividade. Conteúdo em português.',
'persona' => 'Especialista em UX para blogs e conteúdo.', 'persona' => 'Especialista em UX para blogs e conteúdo.',
'tone' => 'Acessível, envolvente, informativo.', 'tone' => 'Acessível, envolvente, informativo.',
'constraints' => "- Design legível.\n- Layout de blog.\n- Responsivo.\n- Máximo de 900 linhas.", 'constraints' => "- Design legível.\n- Layout de blog.\n- Responsivo.",
'output_format' => 'HTML completo com seções: Header, Hero, Lista de posts, Sidebar, Newsletter, Footer.', 'output_format' => 'HTML completo com seções: Header, Hero, Lista de posts, Sidebar, Newsletter, Footer.',
'examples' => 'Lista de posts com thumbnails, sidebar com categorias, formulário de newsletter, paginação.', 'examples' => 'Lista de posts com thumbnails, sidebar com categorias, formulário de newsletter, paginação.',
'variables' => 'nome_autor, categoria_principal, url_newsletter', 'variables' => 'nome_autor, categoria_principal, url_newsletter',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -327,12 +343,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Loja de roupas, eletrônicos ou produtos artesanais. Catálogo com até 20 produtos.', 'context' => 'Loja de roupas, eletrônicos ou produtos artesanais. Catálogo com até 20 produtos.',
'persona' => 'Especialista em e-commerce e experiência de compra online.', 'persona' => 'Especialista em e-commerce e experiência de compra online.',
'tone' => 'Comercial, confiável, envolvente.', 'tone' => 'Comercial, confiável, envolvente.',
'constraints' => "- Design moderno.\n- Catálogo de produtos.\n- Carrinho funcional.\n- Responsivo.\n- Máximo de 1200 linhas.", 'constraints' => "- Design moderno.\n- Catálogo de produtos.\n- Carrinho funcional.\n- Responsivo.",
'output_format' => 'HTML completo com seções: Header, Hero, Catálogo, Carrinho, Checkout, Footer.', 'output_format' => 'HTML completo com seções: Header, Hero, Catálogo, Carrinho, Checkout, Footer.',
'examples' => 'Grid de produtos, filtros, carrinho lateral, formulário de checkout, badges de desconto.', 'examples' => 'Grid de produtos, filtros, carrinho lateral, formulário de checkout, badges de desconto.',
'variables' => 'nome_loja, categoria, moeda, url_checkout', 'variables' => 'nome_loja, categoria, moeda, url_checkout',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -346,12 +363,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Sistema de gestão de projetos, CRM ou ferramenta de produtividade para equipes.', 'context' => 'Sistema de gestão de projetos, CRM ou ferramenta de produtividade para equipes.',
'persona' => 'Especialista em UX para aplicativos web e dashboards.', 'persona' => 'Especialista em UX para aplicativos web e dashboards.',
'tone' => 'Profissional, limpo, eficiente.', 'tone' => 'Profissional, limpo, eficiente.',
'constraints' => "- Interface limpa.\n- Dashboard com gráficos.\n- Responsivo.\n- Máximo de 1000 linhas.", 'constraints' => "- Interface limpa.\n- Dashboard com gráficos.\n- Responsivo.",
'output_format' => 'HTML completo com seções: Login, Dashboard, Sidebar, Tabelas, Forms, Perfil.', 'output_format' => 'HTML completo com seções: Login, Dashboard, Sidebar, Tabelas, Forms, Perfil.',
'examples' => 'Sidebar de navegação, cards de métricas, tabela de dados, gráficos com Chart.js.', 'examples' => 'Sidebar de navegação, cards de métricas, tabela de dados, gráficos com Chart.js.',
'variables' => 'nome_sistema, modulo_principal, url_app', 'variables' => 'nome_sistema, modulo_principal, url_app',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -365,12 +383,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Painel de administração para gerenciar usuários, conteúdo e configurações.', 'context' => 'Painel de administração para gerenciar usuários, conteúdo e configurações.',
'persona' => 'Especialista em painéis administrativos e data visualization.', 'persona' => 'Especialista em painéis administrativos e data visualization.',
'tone' => 'Profissional, limpo, informativo.', 'tone' => 'Profissional, limpo, informativo.',
'constraints' => "- Design clean.\n- Gráficos interativos.\n- Tabelas responsivas.\n- Máximo de 900 linhas.", 'constraints' => "- Design clean.\n- Gráficos interativos.\n- Tabelas responsivas.",
'output_format' => 'HTML completo com seções: Sidebar, Header, Cards de métricas, Gráficos, Tabela, Footer.', 'output_format' => 'HTML completo com seções: Sidebar, Header, Cards de métricas, Gráficos, Tabela, Footer.',
'examples' => 'Cards de KPIs, gráfico de linha com Chart.js, tabela de usuários, filtros de data.', 'examples' => 'Cards de KPIs, gráfico de linha com Chart.js, tabela de usuários, filtros de data.',
'variables' => 'nome_sistema, metricas, periodo', 'variables' => 'nome_sistema, metricas, periodo',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -384,12 +403,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Restaurante, lanchonete ou pizzaria que oferece delivery. Integração com WhatsApp ou iFood.', 'context' => 'Restaurante, lanchonete ou pizzaria que oferece delivery. Integração com WhatsApp ou iFood.',
'persona' => 'Especialista em delivery e experiência de pedido online.', 'persona' => 'Especialista em delivery e experiência de pedido online.',
'tone' => 'Descontraído, saboroso, rápido.', 'tone' => 'Descontraído, saboroso, rápido.',
'constraints' => "- Cardápio visual.\n- Botão de pedido.\n- Responsivo.\n- Máximo de 700 linhas.", 'constraints' => "- Cardápio visual.\n- Botão de pedido.\n- Responsivo.",
'output_format' => 'HTML completo com seções: Hero, Cardápio, Destaques, Avaliações, Pedido, Footer.', 'output_format' => 'HTML completo com seções: Hero, Cardápio, Destaques, Avaliações, Pedido, Footer.',
'examples' => 'Hero com imagem de comida, cards de categorias, botão de pedido WhatsApp, avaliações.', 'examples' => 'Hero com imagem de comida, cards de categorias, botão de pedido WhatsApp, avaliações.',
'variables' => 'nome_restaurante, categoria, telefone, url_cardapio', 'variables' => 'nome_restaurante, categoria, telefone, url_cardapio',
'temperature' => 0.8, 'temperature' => 0.8,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -403,12 +423,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Projeto fullstack PHP com Laravel 13, seguindo PSR-12, strict types, policies e validações robustas. Banco MySQL/MariaDB.', 'context' => 'Projeto fullstack PHP com Laravel 13, seguindo PSR-12, strict types, policies e validações robustas. Banco MySQL/MariaDB.',
'persona' => 'Você é um arquiteto de software especializado em Laravel, com profundo conhecimento de PHP 8.3, Eloquent ORM, Filament, Livewire e boas práticas.', 'persona' => 'Você é um arquiteto de software especializado em Laravel, com profundo conhecimento de PHP 8.3, Eloquent ORM, Filament, Livewire e boas práticas.',
'tone' => 'Técnico, estruturado, didático.', 'tone' => 'Técnico, estruturado, didático.',
'constraints' => "- PHP 8.3 com strict_types.\n- PSR-12 compliance.\n- Migrations, seeders e factories.\n- Validações com Form Requests.\n- Policies e Gates para autorização.\n- Máximo de 2500 linhas de código.", 'constraints' => "- PHP 8.3 com strict_types.\n- PSR-12 compliance.\n- Migrations, seeders e factories.\n- Validações com Form Requests.\n- Policies e Gates para autorização.",
'output_format' => 'Código completo: migration, model, controller, request, view Blade, routes, seeder e factory.', 'output_format' => 'Código completo: migration, model, controller, request, view Blade, routes, seeder e factory.',
'examples' => 'CRUD completo de Produtos com relacionamentos e upload de imagem.', 'examples' => 'CRUD completo de Produtos com relacionamentos e upload de imagem.',
'variables' => 'nome_modulo, entidade, nome_tabela', 'variables' => 'nome_modulo, entidade, nome_tabela',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -422,12 +443,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Projeto de API REST estruturada com Slim 4, usando containers DI, middlewares, validação e documentação OpenAPI.', 'context' => 'Projeto de API REST estruturada com Slim 4, usando containers DI, middlewares, validação e documentação OpenAPI.',
'persona' => 'Você é um backend specialist especializado em PHP, APIs REST e arquitetura hexagonal.', 'persona' => 'Você é um backend specialist especializado em PHP, APIs REST e arquitetura hexagonal.',
'tone' => 'Técnico, limpo, escalável.', 'tone' => 'Técnico, limpo, escalável.',
'constraints' => "- PHP 8.3 com strict_types.\n- Slim 4 com rotas agrupadas.\n- Middlewares de autenticação, CORS e rate limiting.\n- Eloquent ORM para banco de dados.\n- Documentação Swagger/OpenAPI.\n- Máximo de 2000 linhas.", 'constraints' => "- PHP 8.3 com strict_types.\n- Slim 4 com rotas agrupadas.\n- Middlewares de autenticação, CORS e rate limiting.\n- Eloquent ORM para banco de dados.\n- Documentação Swagger/OpenAPI.",
'output_format' => 'Código completo: index.php, rotas, controllers, middlewares, modelos Eloquent, migrations.', 'output_format' => 'Código completo: index.php, rotas, controllers, middlewares, modelos Eloquent, migrations.',
'examples' => 'CRUD de usuários com autenticação JWT e rate limiting.', 'examples' => 'CRUD de usuários com autenticação JWT e rate limiting.',
'variables' => 'nome_recurso, nome_modelo, campos_customizados', 'variables' => 'nome_recurso, nome_modelo, campos_customizados',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -441,12 +463,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Projeto Laravel 13 focado em API com autenticação via token, versionamento de rotas, rate limiting e documentação com Scribe.', 'context' => 'Projeto Laravel 13 focado em API com autenticação via token, versionamento de rotas, rate limiting e documentação com Scribe.',
'persona' => 'Especialista em Laravel APIs com foco em performance, segurança e boas práticas.', 'persona' => 'Especialista em Laravel APIs com foco em performance, segurança e boas práticas.',
'tone' => 'Técnico, robusto, seguro.', 'tone' => 'Técnico, robusto, seguro.',
'constraints' => "- Laravel 13 + Sanctum.\n- API Resources para transformação de dados.\n- Form Requests para validação.\n- Testes Feature e Unit.\n- Máximo de 2500 linhas.", 'constraints' => "- Laravel 13 + Sanctum.\n- API Resources para transformação de dados.\n- Form Requests para validação.\n- Testes Feature e Unit.",
'output_format' => 'Migration, Model, Controller, API Resource, Request, Routes, Testes.', 'output_format' => 'Migration, Model, Controller, API Resource, Request, Routes, Testes.',
'examples' => 'CRUD de Produtos com imagens, paginação e filtros.', 'examples' => 'CRUD de Produtos com imagens, paginação e filtros.',
'variables' => 'nome_modulo, entidade, campos_filtros', 'variables' => 'nome_modulo, entidade, campos_filtros',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -460,12 +483,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Projeto Slim 4 com estrutura MVC, templates Twig, Flash messages e CSRF protection.', 'context' => 'Projeto Slim 4 com estrutura MVC, templates Twig, Flash messages e CSRF protection.',
'persona' => 'Especialista em micro-frameworks PHP e arquitetura limpa.', 'persona' => 'Especialista em micro-frameworks PHP e arquitetura limpa.',
'tone' => 'Didático, organizado, prático.', 'tone' => 'Didático, organizado, prático.',
'constraints' => "- PHP 8.3.\n- Slim 4 com DI container.\n- Twig para views.\n- Middlewares de sessão e CSRF.\n- Máximo de 2000 linhas.", 'constraints' => "- PHP 8.3.\n- Slim 4 com DI container.\n- Twig para views.\n- Middlewares de sessão e CSRF.",
'output_format' => 'Arquivos: index.php, rotas, controllers, views Twig, middlewares, migrations.', 'output_format' => 'Arquivos: index.php, rotas, controllers, views Twig, middlewares, migrations.',
'examples' => 'Blog simples com autenticação e CRUD de posts.', 'examples' => 'Blog simples com autenticação e CRUD de posts.',
'variables' => 'nome_projeto, tema, modulo_principal', 'variables' => 'nome_projeto, tema, modulo_principal',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -479,12 +503,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Projeto frontend moderno com Vue 3 Composition API, TypeScript opcional, estado global com Pinia e requisições HTTP.', 'context' => 'Projeto frontend moderno com Vue 3 Composition API, TypeScript opcional, estado global com Pinia e requisições HTTP.',
'persona' => 'Especialista em Vue.js e arquitetura frontend moderna.', 'persona' => 'Especialista em Vue.js e arquitetura frontend moderna.',
'tone' => 'Moderno, componentizado, reutilizável.', 'tone' => 'Moderno, componentizado, reutilizável.',
'constraints' => "- Vue 3 com Composition API.\n- Vite como bundler.\n- Pinia para estado global.\n- Vue Router para navegação.\n- Axios para HTTP.\n- Máximo de 2500 linhas.", 'constraints' => "- Vue 3 com Composition API.\n- Vite como bundler.\n- Pinia para estado global.\n- Vue Router para navegação.\n- Axios para HTTP.",
'output_format' => 'Estrutura completa: src/components, src/views, src/stores, src/router, src/services.', 'output_format' => 'Estrutura completa: src/components, src/views, src/stores, src/router, src/services.',
'examples' => 'Dashboard com sidebar, gráficos, tabela de dados e formulários.', 'examples' => 'Dashboard com sidebar, gráficos, tabela de dados e formulários.',
'variables' => 'nome_app, tema_cores, modulo_principal', 'variables' => 'nome_app, tema_cores, modulo_principal',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -498,12 +523,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Projeto React moderno com hooks, componentização, estado global e integração com APIs.', 'context' => 'Projeto React moderno com hooks, componentização, estado global e integração com APIs.',
'persona' => 'Especialista em React e ecossistema JavaScript moderno.', 'persona' => 'Especialista em React e ecossistema JavaScript moderno.',
'tone' => 'Moderno, performático, escalável.', 'tone' => 'Moderno, performático, escalável.',
'constraints' => "- React 18+ com hooks.\n- Vite.\n- Redux Toolkit para estado.\n- React Router v6.\n- Axios para HTTP.\n- Máximo de 2500 linhas.", 'constraints' => "- React 18+ com hooks.\n- Vite.\n- Redux Toolkit para estado.\n- React Router v6.\n- Axios para HTTP.",
'output_format' => 'Estrutura completa: src/components, src/pages, src/store, src/router, src/services.', 'output_format' => 'Estrutura completa: src/components, src/pages, src/store, src/router, src/services.',
'examples' => 'Dashboard com gráficos, tabela paginada e formulários.', 'examples' => 'Dashboard com gráficos, tabela paginada e formulários.',
'variables' => 'nome_app, tema_cores, modulo_principal', 'variables' => 'nome_app, tema_cores, modulo_principal',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -517,12 +543,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Projeto fullstack React com Next.js 14, usando App Router, Server Actions, middleware de autenticação e Prisma com PostgreSQL.', 'context' => 'Projeto fullstack React com Next.js 14, usando App Router, Server Actions, middleware de autenticação e Prisma com PostgreSQL.',
'persona' => 'Especialista em Next.js, React Server Components e fullstack TypeScript.', 'persona' => 'Especialista em Next.js, React Server Components e fullstack TypeScript.',
'tone' => 'Moderno, performático, type-safe.', 'tone' => 'Moderno, performático, type-safe.',
'constraints' => "- Next.js 14+.\n- App Router com Server Components.\n- Tailwind CSS.\n- Prisma ORM.\n- Autenticação com NextAuth.js.\n- Máximo de 3000 linhas.", 'constraints' => "- Next.js 14+.\n- App Router com Server Components.\n- Tailwind CSS.\n- Prisma ORM.\n- Autenticação com NextAuth.js.",
'output_format' => 'Estrutura completa: app/, components/, lib/, prisma/, middleware.ts.', 'output_format' => 'Estrutura completa: app/, components/, lib/, prisma/, middleware.ts.',
'examples' => 'Blog com CMS, autenticação e painel admin.', 'examples' => 'Blog com CMS, autenticação e painel admin.',
'variables' => 'nome_projeto, database_url, modulo_principal', 'variables' => 'nome_projeto, database_url, modulo_principal',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -536,12 +563,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Projeto backend Node.js com estrutura em camadas (controllers, services, repositories), validação com Zod e testes.', 'context' => 'Projeto backend Node.js com estrutura em camadas (controllers, services, repositories), validação com Zod e testes.',
'persona' => 'Especialista em Node.js, TypeScript e arquitetura backend escalável.', 'persona' => 'Especialista em Node.js, TypeScript e arquitetura backend escalável.',
'tone' => 'Técnico, estruturado, type-safe.', 'tone' => 'Técnico, estruturado, type-safe.',
'constraints' => "- Node.js + TypeScript.\n- Express com middlewares.\n- Prisma ORM.\n- Zod para validação.\n- JWT para autenticação.\n- Máximo de 2500 linhas.", 'constraints' => "- Node.js + TypeScript.\n- Express com middlewares.\n- Prisma ORM.\n- Zod para validação.\n- JWT para autenticação.",
'output_format' => 'Estrutura completa: src/controllers, src/services, src/repositories, src/middlewares, prisma/schema.', 'output_format' => 'Estrutura completa: src/controllers, src/services, src/repositories, src/middlewares, prisma/schema.',
'examples' => 'CRUD de usuários com validação, hash de senha e refresh token.', 'examples' => 'CRUD de usuários com validação, hash de senha e refresh token.',
'variables' => 'nome_modulo, entidade, campos_customizados', 'variables' => 'nome_modulo, entidade, campos_customizados',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -555,12 +583,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Projeto Python com FastAPI, banco PostgreSQL, validação automática, documentação interativa e testes.', 'context' => 'Projeto Python com FastAPI, banco PostgreSQL, validação automática, documentação interativa e testes.',
'persona' => 'Especialista em Python, FastAPI e arquitetura de microsserviços.', 'persona' => 'Especialista em Python, FastAPI e arquitetura de microsserviços.',
'tone' => 'Técnico, limpo, performático.', 'tone' => 'Técnico, limpo, performático.',
'constraints' => "- Python 3.11+.\n- FastAPI com Pydantic v2.\n- SQLAlchemy 2.0 ORM.\n- Autenticação OAuth2 com JWT.\n- Testes com pytest.\n- Máximo de 2500 linhas.", 'constraints' => "- Python 3.11+.\n- FastAPI com Pydantic v2.\n- SQLAlchemy 2.0 ORM.\n- Autenticação OAuth2 com JWT.\n- Testes com pytest.",
'output_format' => 'Estrutura completa: main.py, routers, models, schemas, dependencies, tests.', 'output_format' => 'Estrutura completa: main.py, routers, models, schemas, dependencies, tests.',
'examples' => 'CRUD de produtos com upload de imagens e cache com Redis.', 'examples' => 'CRUD de produtos com upload de imagens e cache com Redis.',
'variables' => 'nome_modulo, entidade, campos_customizados', 'variables' => 'nome_modulo, entidade, campos_customizados',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -574,12 +603,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Projeto fullstack separado: backend Laravel 13 com API REST e frontend Vue 3 consumindo a API. Comunicação via axios e Sanctum.', 'context' => 'Projeto fullstack separado: backend Laravel 13 com API REST e frontend Vue 3 consumindo a API. Comunicação via axios e Sanctum.',
'persona' => 'Arquiteto fullstack especializado em Laravel e Vue.js.', 'persona' => 'Arquiteto fullstack especializado em Laravel e Vue.js.',
'tone' => 'Integrado, moderno, seguro.', 'tone' => 'Integrado, moderno, seguro.',
'constraints' => "- Laravel 13 + Sanctum.\n- Vue 3 com Composition API.\n- Axios para requisições.\n- CORS configurado.\n- Validações em ambos os lados.\n- Máximo de 3000 linhas.", 'constraints' => "- Laravel 13 + Sanctum.\n- Vue 3 com Composition API.\n- Axios para requisições.\n- CORS configurado.\n- Validações em ambos os lados.",
'output_format' => 'Código completo backend (routes, controllers, models) + frontend (components, stores, router).', 'output_format' => 'Código completo backend (routes, controllers, models) + frontend (components, stores, router).',
'examples' => 'Sistema de gestão de tarefas com autenticação e drag-and-drop.', 'examples' => 'Sistema de gestão de tarefas com autenticação e drag-and-drop.',
'variables' => 'nome_projeto, modulo_principal, entidades', 'variables' => 'nome_projeto, modulo_principal, entidades',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -593,12 +623,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Projeto Laravel 13 com stack moderna: frontend com Tailwind CSS 4, Blade e Vue.js 3; backend com Laravel Reverb para tempo real, Sanctum para API auth, Spatie Permission para RBAC.', 'context' => 'Projeto Laravel 13 com stack moderna: frontend com Tailwind CSS 4, Blade e Vue.js 3; backend com Laravel Reverb para tempo real, Sanctum para API auth, Spatie Permission para RBAC.',
'persona' => 'Você é um arquiteto fullstack sênior especializado em Laravel 13, PHP 8.3, Tailwind CSS 4, Vue.js 3 e integrações de IA multi-provider.', 'persona' => 'Você é um arquiteto fullstack sênior especializado em Laravel 13, PHP 8.3, Tailwind CSS 4, Vue.js 3 e integrações de IA multi-provider.',
'tone' => 'Técnico, estruturado, moderno e objetivo. Segue rigorosamente PSR-12 e strict_types.', 'tone' => 'Técnico, estruturado, moderno e objetivo. Segue rigorosamente PSR-12 e strict_types.',
'constraints' => "- PHP 8.3 com strict_types e declare(strict_types=1).\n- PSR-12 compliance com Laravel Pint.\n- Eloquent ORM com relacionamentos e mutators.\n- Policies e Gates para toda autorização.\n- Form Requests para validação.\n- Integração multi-provider de IA via service container.\n- Laravel Reverb para eventos em tempo real.\n- Sanctum para autenticação API.\n- Spatie Permission para RBAC.\n- Mews Captcha (math) para formulários públicos.\n- ApexCharts no frontend via Vue.js 3.\n- Máximo de 4000 linhas de código.", 'constraints' => "- PHP 8.3 com strict_types e declare(strict_types=1).\n- PSR-12 compliance com Laravel Pint.\n- Eloquent ORM com relacionamentos e mutators.\n- Policies e Gates para toda autorização.\n- Form Requests para validação.\n- Integração multi-provider de IA via service container.\n- Laravel Reverb para eventos em tempo real.\n- Sanctum para autenticação API.\n- Spatie Permission para RBAC.\n- Mews Captcha (math) para formulários públicos.\n- ApexCharts no frontend via Vue.js 3.",
'output_format' => 'Código completo: migration, model, controller, request, policy, service, view Blade, Vue.js 3 component, routes, seeder, factory e testes Feature/Unit.', 'output_format' => 'Código completo: migration, model, controller, request, policy, service, view Blade, Vue.js 3 component, routes, seeder, factory e testes Feature/Unit.',
'examples' => 'Dashboard com ApexCharts mostrando métricas de gerações de prompt por provedor de IA, formulário de criação com Mews Captcha.', 'examples' => 'Dashboard com ApexCharts mostrando métricas de gerações de prompt por provedor de IA, formulário de criação com Mews Captcha.',
'variables' => 'nome_modulo, entidade, nome_tabela, provedores_ia, permissoes', 'variables' => 'nome_modulo, entidade, nome_tabela, provedores_ia, permissoes',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -612,12 +643,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'API RESTful com sistema de autenticação robusto, múltiplos roles (admin, user, manager), proteção de rotas e refresh token automático.', 'context' => 'API RESTful com sistema de autenticação robusto, múltiplos roles (admin, user, manager), proteção de rotas e refresh token automático.',
'persona' => 'Especialista em segurança de APIs e autenticação stateless.', 'persona' => 'Especialista em segurança de APIs e autenticação stateless.',
'tone' => 'Seguro, robusto, documentado.', 'tone' => 'Seguro, robusto, documentado.',
'constraints' => "- JWT com access e refresh tokens.\n- Roles e permissões.\n- Middleware de autenticação.\n- Rate limiting.\n- Máximo de 2000 linhas.", 'constraints' => "- JWT com access e refresh tokens.\n- Roles e permissões.\n- Middleware de autenticação.\n- Rate limiting.",
'output_format' => 'Estrutura completa: auth controller, middleware, JWT service, rotas protegidas.', 'output_format' => 'Estrutura completa: auth controller, middleware, JWT service, rotas protegidas.',
'examples' => 'Login, registro, refresh token, esqueci senha, verificação de email.', 'examples' => 'Login, registro, refresh token, esqueci senha, verificação de email.',
'variables' => 'nome_api, roles, provedor_ia', 'variables' => 'nome_api, roles, provedor_ia',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -631,12 +663,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Sistema distribuído com múltiplos serviços (usuários, pagamentos, notificações), API Gateway, message broker e observabilidade.', 'context' => 'Sistema distribuído com múltiplos serviços (usuários, pagamentos, notificações), API Gateway, message broker e observabilidade.',
'persona' => 'Arquiteto de software especializado em microsserviços, DDD e cloud native.', 'persona' => 'Arquiteto de software especializado em microsserviços, DDD e cloud native.',
'tone' => 'Arquitetural, escalável, resiliente.', 'tone' => 'Arquitetural, escalável, resiliente.',
'constraints' => "- Docker + Docker Compose.\n- Comunicação via HTTP/gRPC.\n- Message broker (RabbitMQ/Kafka).\n- Monitoramento (Prometheus/Grafana).\n- Máximo de 3500 linhas.", 'constraints' => "- Docker + Docker Compose.\n- Comunicação via HTTP/gRPC.\n- Message broker (RabbitMQ/Kafka).\n- Monitoramento (Prometheus/Grafana).",
'output_format' => 'Dockerfiles, docker-compose, código dos serviços, gateway, migrations.', 'output_format' => 'Dockerfiles, docker-compose, código dos serviços, gateway, migrations.',
'examples' => 'E-commerce com serviços: usuários, produtos, pedidos, pagamentos, notificações.', 'examples' => 'E-commerce com serviços: usuários, produtos, pedidos, pagamentos, notificações.',
'variables' => 'nome_sistema, servicos, broker_mensagens', 'variables' => 'nome_sistema, servicos, broker_mensagens',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -650,12 +683,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Chatbot web ou WhatsApp com backend em PHP/Node.js, integração com modelos de linguagem, embeddings e vector database.', 'context' => 'Chatbot web ou WhatsApp com backend em PHP/Node.js, integração com modelos de linguagem, embeddings e vector database.',
'persona' => 'Especialista em IA generativa, LLMs e aplicações conversationais.', 'persona' => 'Especialista em IA generativa, LLMs e aplicações conversationais.',
'tone' => 'Inovador, inteligente, conversacional.', 'tone' => 'Inovador, inteligente, conversacional.',
'constraints' => "- Integração com pelo menos 1 provedor de IA.\n- Histórico de conversas.\n- Tratamento de contexto.\n- Interface web moderna.\n- Máximo de 2500 linhas.", 'constraints' => "- Integração com pelo menos 1 provedor de IA.\n- Histórico de conversas.\n- Tratamento de contexto.\n- Interface web moderna.",
'output_format' => 'Backend (API) + Frontend (chat interface) + integração IA.', 'output_format' => 'Backend (API) + Frontend (chat interface) + integração IA.',
'examples' => 'Chat de atendimento ao cliente com respostas contextuais.', 'examples' => 'Chat de atendimento ao cliente com respostas contextuais.',
'variables' => 'nome_bot, provedor_ia, modelo, contexto', 'variables' => 'nome_bot, provedor_ia, modelo, contexto',
'temperature' => 0.8, 'temperature' => 0.8,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -669,12 +703,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Plataforma de automação estilo Zapier/Make, onde usuários criam fluxos automáticos entre aplicativos.', 'context' => 'Plataforma de automação estilo Zapier/Make, onde usuários criam fluxos automáticos entre aplicativos.',
'persona' => 'Especialista em automação, integrações e arquitetura event-driven.', 'persona' => 'Especialista em automação, integrações e arquitetura event-driven.',
'tone' => 'Prático, modular, escalável.', 'tone' => 'Prático, modular, escalável.',
'constraints' => "- Interface visual de fluxos.\n- Triggers e actions.\n- Integrações webhook.\n- Logs e monitoramento.\n- Máximo de 3000 linhas.", 'constraints' => "- Interface visual de fluxos.\n- Triggers e actions.\n- Integrações webhook.\n- Logs e monitoramento.",
'output_format' => 'Backend API + Frontend editor de fluxos + webhooks.', 'output_format' => 'Backend API + Frontend editor de fluxos + webhooks.',
'examples' => 'Automação: quando chegar e-mail → extrair anexo → salvar no Drive → notificar Slack.', 'examples' => 'Automação: quando chegar e-mail → extrair anexo → salvar no Drive → notificar Slack.',
'variables' => 'nome_plataforma, integracoes, acoes', 'variables' => 'nome_plataforma, integracoes, acoes',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
@@ -688,12 +723,13 @@ class PromptTemplateSeeder extends Seeder
'context' => 'Serviço que consome múltiplas APIs (pagamentos, CRM, ERP) e centraliza dados em uma única interface.', 'context' => 'Serviço que consome múltiplas APIs (pagamentos, CRM, ERP) e centraliza dados em uma única interface.',
'persona' => 'Especialista em integrações, webhooks e APIs externas.', 'persona' => 'Especialista em integrações, webhooks e APIs externas.',
'tone' => 'Técnico, robusto, manutenível.', 'tone' => 'Técnico, robusto, manutenível.',
'constraints' => "- Tratamento de erros e retries.\n- Logs estruturados.\n- Cache.\n- Monitoramento.\n- Máximo de 2500 linhas.", 'constraints' => "- Tratamento de erros e retries.\n- Logs estruturados.\n- Cache.\n- Monitoramento.",
'output_format' => 'Serviço de integração + testes de integração + documentação.', 'output_format' => 'Serviço de integração + testes de integração + documentação.',
'examples' => 'Syncronização entre ERP e plataforma de e-commerce.', 'examples' => 'Syncronização entre ERP e plataforma de e-commerce.',
'variables' => 'nome_servico, apis_origem, api_destino', 'variables' => 'nome_servico, apis_origem, api_destino',
'temperature' => 0.7, 'temperature' => 0.7,
'max_tokens' => 4096, 'max_tokens' => 4096,
'standard_files' => true,
], ],
'is_public' => true, 'is_public' => true,
], ],
Binary file not shown.
@@ -7,7 +7,10 @@
<div class="col-md-6 text-center text-md-end"> <div class="col-md-6 text-center text-md-end">
<a href="{{ route('legal.document.show', 'terms-of-service') }}" class="text-white text-decoration-none small me-3">@lang('footer.terms_of_service')</a> <a href="{{ route('legal.document.show', 'terms-of-service') }}" class="text-white text-decoration-none small me-3">@lang('footer.terms_of_service')</a>
<a href="{{ route('legal.document.show', 'privacy-policy') }}" class="text-white text-decoration-none small me-3">@lang('footer.privacy_policy')</a> <a href="{{ route('legal.document.show', 'privacy-policy') }}" class="text-white text-decoration-none small me-3">@lang('footer.privacy_policy')</a>
<a href="javascript:void(0)" onclick="cookieConsent.showPreferences()" class="text-white text-decoration-none small">@lang('footer.cookie_preferences')</a> <a href="javascript:void(0)" onclick="cookieConsent.showPreferences()" class="text-white text-decoration-none small me-3">@lang('footer.cookie_preferences')</a>
@auth
<a href="{{ route('ebook.download') }}" class="text-white text-decoration-none small"><i class="bi bi-file-pdf me-1"></i>Ebook</a>
@endauth
</div> </div>
</div> </div>
</div> </div>
+345
View File
@@ -0,0 +1,345 @@
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<title>GPrompt - Ebook para Desenvolvedores</title>
<style>
body { font-family: 'DejaVu Sans', sans-serif; color: #333; line-height: 1.6; font-size: 10pt; margin: 20px; }
h1 { font-size: 18pt; color: #4e73df; border-bottom: 2px solid #4e73df; padding-bottom: 5px; margin-top: 20px; }
h2 { font-size: 13pt; color: #2c3e50; margin-top: 15px; }
h3 { font-size: 11pt; color: #555; margin-top: 12px; }
p { margin-bottom: 8px; text-align: justify; }
ul, ol { margin-bottom: 8px; padding-left: 18px; }
li { margin-bottom: 3px; }
.cover { text-align: center; padding-top: 100px; }
.cover h1 { font-size: 28pt; border: none; }
.cover h2 { font-size: 14pt; color: #666; font-weight: normal; }
.cover p { font-size: 11pt; color: #888; text-align: center; }
.page-break { page-break-before: always; }
.box { border: 1px solid #4e73df; padding: 10px; margin: 10px 0; background: #f8f9fc; }
.box h3 { color: #4e73df; margin-top: 0; }
.alert { border: 1px solid #1cc88a; padding: 10px; margin: 10px 0; background: #f0fdf4; }
.alert h3 { color: #1cc88a; margin-top: 0; }
.warning { border: 1px solid #e74a3b; padding: 10px; margin: 10px 0; background: #fff5f5; }
.warning h3 { color: #e74a3b; margin-top: 0; }
table { width: 100%; border-collapse: collapse; margin: 10px 0; font-size: 9pt; }
th { background: #4e73df; color: #fff; padding: 5px; text-align: left; }
td { padding: 5px; border-bottom: 1px solid #ddd; }
code { font-family: 'DejaVu Sans Mono', monospace; font-size: 8pt; background: #f4f4f4; padding: 1px 3px; }
pre { background: #f4f4f4; padding: 8px; font-size: 8pt; font-family: 'DejaVu Sans Mono', monospace; border-left: 3px solid #4e73df; }
.toc li { padding: 3px 0; }
.cover .badge { background: #4e73df; color: #fff; padding: 5px 15px; border-radius: 3px; font-size: 10pt; }
.footer { text-align: center; color: #999; font-size: 7pt; margin-top: 20px; padding-top: 10px; border-top: 1px solid #eee; }
</style>
</head>
<body>
<div class="cover">
<h1>GPrompt</h1>
<h2>Sistema de Geração de Prompts Inteligentes</h2>
<br>
<p><strong>Ebook para Desenvolvedores</strong></p>
<p>Crie sites, landing pages e aplicativos com a potência da IA</p>
<br><br>
<p>Versão 1.0 — Outubro 2026</p>
</div>
<div class="page-break"></div>
<h1>Sumário</h1>
<ul class="toc">
<li>1. O que é o GPrompt?</li>
<li>2. Conceitos Fundamentais</li>
<li>3. Primeiros Passos</li>
<li>4. Templates de Projeto</li>
<li>5. Arquivos Padrão (LGPD)</li>
<li>6. Requisitos de Sistema</li>
<li>7. Provedores de IA</li>
<li>8. Casos de Uso Práticos</li>
<li>9. Boas Práticas</li>
<li>10. Conclusão</li>
</ul>
<div class="page-break"></div>
<h1>1. O que é o GPrompt?</h1>
<p>O GPrompt é um sistema web completo para geração de prompts inteligentes destinados à criação de sites, landing pages, aplicativos e sistemas web. Ele foi projetado para desenvolvedores que desejam acelerar seu fluxo de trabalho utilizando Inteligência Artificial, mantendo total controle sobre o resultado final.</p>
<div class="alert">
<h3>Para quem este ebook foi feito</h3>
<p>Desenvolvedores front-end e full-stack, designers que codam, agências digitais, freelancers e qualquer profissional que crie sites, landing pages ou aplicativos web e queira usar IA para aumentar sua produtividade.</p>
</div>
<p>Diferente de ferramentas genéricas de IA, o GPrompt entende o contexto brasileiro: templates em português, conformidade com a LGPD (Lei Geral de Proteção de Dados), termos de uso e política de privacidade adequados à legislação brasileira, e geração automática de arquivos essenciais como LICENSE, README.md e RULES.md.</p>
<h2>Principais Diferenciais</h2>
<ul>
<li>36 templates prontos para diversos tipos de projeto (landing pages, sistemas SaaS, APIs, e-commerce, blogs, dashboards)</li>
<li>Múltiplos provedores de IA: OpenRouter, StepFun e Llama.cpp local</li>
<li>Arquivos padrão automáticos: LICENSE, README.md, RULES.md, banner de cookies LGPD, termos de uso e política de privacidade</li>
<li>Requisitos de sistema embutidos: design responsivo, SEO completo, dependências com licença MIT, toggle de senha</li>
<li>Geração multi-arquivo: o prompt gerado instrui a criação de projetos completos com estrutura de pastas organizada</li>
</ul>
<div class="page-break"></div>
<h1>2. Conceitos Fundamentais</h1>
<h2>2.1 O que é Prompt Engineering?</h2>
<p>Prompt Engineering é a arte e a ciência de criar instruções precisas para Inteligências Artificiais. Um prompt bem elaborado produz resultados muito superiores a um prompt genérico. O GPrompt automatiza exatamente este processo: ele pega suas especificações e constrói o prompt ideal para cada tipo de projeto.</p>
<h2>2.2 Como o GPrompt Funciona</h2>
<div class="box">
<h3>Fluxo de Trabalho</h3>
<ol>
<li>Crie um Projeto: Defina o objetivo, contexto, persona, tom, restrições e formato de saída</li>
<li>Escolha um Template: Selecione entre 36 templates pré-configurados ou crie o seu próprio</li>
<li>Selecione o Provedor/Modelo de IA: OpenRouter, StepFun ou Llama.cpp local</li>
<li>Gere o Prompt: O sistema monta um prompt otimizado com todas as especificações</li>
<li>Use o Prompt: Copie o prompt gerado e utilize no VSCode, Cursor, ou qualquer ferramenta de IA</li>
<li>Obtenha o Projeto Completo: A IA cria todos os arquivos do projeto</li>
</ol>
</div>
<h2>2.3 A Arquitetura do Sistema</h2>
<table>
<tr><th>Componente</th><th>Função</th></tr>
<tr><td>Projetos de Prompt</td><td>Onde você define as especificações do seu projeto</td></tr>
<tr><td>Templates</td><td>Modelos pré-configurados para iniciar rapidamente</td></tr>
<tr><td>Provedores IA</td><td>Configuração dos serviços de IA (OpenRouter, StepFun, Llama.cpp)</td></tr>
<tr><td>Serviço de Geração</td><td>Monta o prompt otimizado e se comunica com a IA</td></tr>
<tr><td>Arquivos Padrão</td><td>Gera automaticamente LICENSE, README.md, RULES.md, documentos LGPD</td></tr>
<tr><td>Histórico</td><td>Mantém registro de todas as gerações realizadas</td></tr>
</table>
<div class="page-break"></div>
<h1>3. Primeiros Passos</h1>
<div class="alert">
<h3>Passo a Passo</h3>
<ol>
<li>Acesse o sistema e faça login com suas credenciais</li>
<li>No menu lateral, clique em "Projetos de Prompt"</li>
<li>Clique em "Novo Projeto"</li>
<li>Preencha os dados da empresa (nome, endereço, WhatsApp, website, redes sociais)</li>
<li>Defina o Objetivo do projeto</li>
<li>Forneça o Contexto</li>
<li>Defina a Persona</li>
<li>Escolha o Tom/Estilo</li>
<li>Adicione Restrições importantes</li>
<li>Defina o Formato de Saída</li>
<li>Selecione o Provedor de IA</li>
<li>Clique em "Salvar"</li>
</ol>
</div>
<h2>3.1 Usando Templates</h2>
<p>Os templates são a maneira mais rápida de começar. Ao criar um novo projeto, digite no campo "Modelo de Projeto" para buscar entre os 36 templates disponíveis.</p>
<table>
<tr><th>Categoria</th><th>Templates</th></tr>
<tr><td>Landing Pages</td><td>Corporativa, SaaS, Produto Digital, Evento, E-book, Curso Online, App Mobile, Agência, Restaurante, Imobiliária, Saúde, Educação, Delivery</td></tr>
<tr><td>Sites</td><td>Institucional, Portfolio Profissional, Portfolio Criativo, Blog Pessoal</td></tr>
<tr><td>Sistemas</td><td>E-commerce, Sistema SaaS, Dashboard Admin</td></tr>
<tr><td>Frameworks</td><td>Laravel + Blade, Slim Framework, Vue.js + Vite, React + Vite, Next.js, Node.js + Express, FastAPI + Python</td></tr>
<tr><td>Arquitetura</td><td>Microsserviços, API REST, JWT, Chatbot com IA, Automação de Workflow</td></tr>
</table>
<p>Ao selecionar um template, todos os campos do formulário são preenchidos automaticamente com as configurações ideais para aquele tipo de projeto.</p>
<div class="page-break"></div>
<h1>4. Templates de Projeto</h1>
<h2>4.1 Estrutura de um Template</h2>
<table>
<tr><th>Campo</th><th>Descrição</th></tr>
<tr><td>Title</td><td>Nome do template</td></tr>
<tr><td>Objective</td><td>Objetivo principal do projeto</td></tr>
<tr><td>Context</td><td>Contexto e informações de fundo</td></tr>
<tr><td>Persona</td><td>Papel que a IA deve assumir</td></tr>
<tr><td>Tone</td><td>Tom e estilo de comunicação</td></tr>
<tr><td>Constraints</td><td>Restrições técnicas e regras</td></tr>
<tr><td>Output Format</td><td>Formato esperado do resultado</td></tr>
<tr><td>Examples</td><td>Exemplos de entrada/saída</td></tr>
<tr><td>Variables</td><td>Variáveis dinâmicas do projeto</td></tr>
<tr><td>Temperature</td><td>Criatividade da IA (0.0 a 1.0)</td></tr>
<tr><td>Max Tokens</td><td>Limite de tokens na resposta</td></tr>
<tr><td>Standard Files</td><td>Se inclui arquivos padrão (true/false)</td></tr>
</table>
<h2>4.2 Criando seus Próprios Templates</h2>
<p>Desenvolvedores podem criar templates personalizados. Basta acessar "Templates" -> "Novo" e preencher os dados no formato JSON:</p>
<pre>{
"title": "Meu Template",
"objective": "Criar um sistema...",
"persona": "Especialista em...",
"constraints": "Restrições...",
"standard_files": true
}</pre>
<div class="warning">
<h3>Importante</h3>
<p>O campo <code>standard_files</code> controla se os arquivos padrão serão incluídos. Para a maioria dos projetos, mantenha como true.</p>
</div>
<div class="page-break"></div>
<h1>5. Arquivos Padrão</h1>
<p>Um dos grandes diferenciais do GPrompt é a geração automática de arquivos essenciais para qualquer projeto profissional. Estes arquivos são gerados em duas camadas:</p>
<ol>
<li>Pelo sistema: O GPrompt gera os arquivos na seção "Arquivos Padrão do Projeto"</li>
<li>Pela IA: O prompt gerado instrui a criação destes mesmos arquivos com conteúdo completo</li>
</ol>
<h2>5.1 Os 6 Arquivos Padrão</h2>
<table>
<tr><th>Arquivo</th><th>Conteúdo</th></tr>
<tr><td>LICENSE</td><td>Licença MIT com nome da empresa e ano</td></tr>
<tr><td>README.md</td><td>Documentação completa do projeto</td></tr>
<tr><td>RULES.md</td><td>Regras de desenvolvimento e padrões de código</td></tr>
<tr><td>cookies.html</td><td>Banner de cookies LGPD completo (Aceitar/Recusar/Personalizar)</td></tr>
<tr><td>termos-de-uso.html</td><td>Termos de Uso conforme legislação brasileira</td></tr>
<tr><td>privacidade.html</td><td>Política de Privacidade conforme LGPD (Lei 13.709/2018)</td></tr>
</table>
<h2>5.2 Conformidade com a LGPD</h2>
<p>A Lei Geral de Proteção de Dados (Lei 13.709/2018) exige que sites e aplicativos que coletam dados pessoais tenham:</p>
<ul>
<li>Política de Privacidade clara e acessível</li>
<li>Termos de Uso com as condições do serviço</li>
<li>Banner de Cookies com opção de aceitar, recusar ou personalizar</li>
<li>Canais de contato do DPO</li>
<li>Prazo de resposta de até 15 dias úteis (Art. 19)</li>
</ul>
<p>Todos estes requisitos são atendidos automaticamente pelos arquivos padrão do GPrompt.</p>
<div class="page-break"></div>
<h1>6. Requisitos de Sistema</h1>
<p>Todo projeto gerado pelo GPrompt inclui automaticamente requisitos de sistema que garantem qualidade e conformidade.</p>
<h2>6.1 Design Responsivo</h2>
<p>Mobile-first é a abordagem padrão. Todo projeto gerado é responsivo em todos os tamanhos de tela: smartphones (320px), tablets (768px), desktops (1024px) e telas grandes (1440px).</p>
<h2>6.2 Dependências com Licença MIT</h2>
<p>Todas as dependências devem ter licença MIT ou permissiva para segurança jurídica em projetos comerciais:</p>
<ul>
<li>Ícones: Bootstrap Icons, Font Awesome (gratuito)</li>
<li>Fontes: Google Fonts</li>
<li>Imagens: Unsplash, Pexels (domínio público)</li>
<li>Frameworks: Bootstrap 5 (MIT), Vue.js (MIT), React (MIT)</li>
</ul>
<h2>6.3 Campo de Senha com Toggle</h2>
<p>Todo campo de senha deve incluir um botão com ícone "olho" para mostrar/esconder a senha, seguindo as melhores práticas de UX.</p>
<h2>6.4 SEO Completo</h2>
<ul>
<li>HTML5 semântico</li>
<li>Meta tags: title, description, keywords, viewport</li>
<li>Open Graph: og:title, og:description, og:image</li>
<li>JSON-LD: dados estruturados</li>
<li>Sitemap.xml e Robots.txt</li>
<li>Acessibilidade: aria labels, alt text</li>
</ul>
<div class="page-break"></div>
<h1>7. Provedores de IA</h1>
<p>O GPrompt suporta múltiplos provedores de Inteligência Artificial:</p>
<h2>7.1 OpenRouter</h2>
<p>Gateway que unifica dezenas de modelos de IA em um único ponto de acesso. Modelos: deepseek/deepseek-v4-flash, nvidia/nemotron-3, openai/gpt, google/gemma. Configure a OPENROUTER_API_KEY no .env.</p>
<h2>7.2 StepFun</h2>
<p>Provedor com modelos de alta performance. Modelos: step-3.5-flash, step-3.7-flash. Configure a STEPFUN_API_KEY no .env.</p>
<h2>7.3 Llama.cpp (Local)</h2>
<p>Execute modelos de IA localmente, sem depender de serviços externos. Modelos: Qwen3-8B, Llama-3.2-3B. Configure LLAMACPP_BASE_URL no .env.</p>
<h2>7.4 Escolhendo o Modelo Ideal</h2>
<table>
<tr><th>Para gerar</th><th>Modelo recomendado</th></tr>
<tr><td>Landing Pages HTML/CSS</td><td>deepseek/deepseek-v4-flash</td></tr>
<tr><td>Documentação</td><td>nvidia/nemotron-3-super</td></tr>
<tr><td>Sistemas complexos</td><td>openrouter/free</td></tr>
<tr><td>Projetos offline</td><td>Llama.cpp local (Qwen3-8B)</td></tr>
</table>
<div class="page-break"></div>
<h1>8. Casos de Uso Práticos</h1>
<h2>8.1 Landing Page Corporativa</h2>
<p>Cenário: Uma empresa precisa de uma landing page profissional para divulgar serviços B2B.</p>
<p>Solução: Selecione o template "Landing Page Corporativa", preencha os dados da empresa, gere o prompt com deepseek/deepseek-v4-flash, e use o prompt no VSCode para receber o projeto completo com index.html, style.css, LICENSE, README.md, cookies.html e os demais arquivos padrão.</p>
<h2>8.2 Sistema SaaS com Laravel + Vue.js</h2>
<p>Cenário: Desenvolvimento de um sistema SaaS completo com backend Laravel e frontend Vue.js.</p>
<p>Solução: Selecione o template "Laravel 13 + Vue.js 3 Fullstack" e gere o prompt. O resultado conterá instruções para criar toda a estrutura do sistema.</p>
<h2>8.3 API RESTful com Autenticação JWT</h2>
<p>Cenário: Criação de uma API REST com autenticação JWT.</p>
<p>Solução: Selecione o template "API com Autenticação JWT". O prompt gerará instruções para controllers, middleware, testes, e docker-compose.</p>
<h2>8.4 Chatbot com IA</h2>
<p>Cenário: Implementação de um chatbot com integração a provedores de IA.</p>
<p>Solução: Selecione o template "Chatbot com IA". O prompt incluirá interface de chat, histórico, e integração com API de IA.</p>
<div class="page-break"></div>
<h1>9. Boas Práticas</h1>
<h2>9.1 Criando Prompts Eficientes</h2>
<ul>
<li>Seja específico: "Criar um sistema de gestão de tarefas" é melhor que "Criar um sistema"</li>
<li>Forneça contexto: Explique o público-alvo e o ambiente técnico</li>
<li>Defina restrições claras: Tecnologias, frameworks, limitações</li>
<li>Use exemplos: Mostre à IA o formato esperado do resultado</li>
<li>Ajuste a temperatura: 0.3 para código preciso, 0.7 para criatividade balanceada</li>
</ul>
<h2>9.2 Dicas para Diferentes Modelos</h2>
<table>
<tr><th>Modelo</th><th>Dica</th></tr>
<tr><td>deepseek/deepseek-v4-flash</td><td>Excelente para código HTML/CSS/JS</td></tr>
<tr><td>nvidia/nemotron-3-super</td><td>Ótimo para documentação e prompts longos</td></tr>
<tr><td>Llama.cpp local</td><td>Ideal para projetos sensíveis</td></tr>
<tr><td>openrouter/free</td><td>Roteia para o melhor modelo gratuito</td></tr>
</table>
<h2>9.3 Versionamento e Manutenção</h2>
<ul>
<li>Sempre inclua LICENSE, README.md e RULES.md no repositório</li>
<li>Mantenha os documentos LGPD atualizados</li>
<li>Revise periodicamente os templates</li>
<li>Use o histórico de gerações para referência</li>
</ul>
<div class="page-break"></div>
<h1>10. Conclusão</h1>
<p>O GPrompt representa uma nova forma de desenvolver projetos web, combinando a potência da Inteligência Artificial com a estruturação profissional que todo projeto merece.</p>
<div class="alert">
<h3>O que você ganha usando o GPrompt</h3>
<ul>
<li>Produtividade: Gere projetos completos em minutos</li>
<li>Qualidade: Prompts otimizados produzem resultados superiores</li>
<li>Conformidade: LGPD, termos de uso e privacidade sempre inclusos</li>
<li>Padronização: Todos os projetos seguem as mesmas boas práticas</li>
<li>Flexibilidade: Escolha o modelo de IA ideal para cada tarefa</li>
<li>Controle: Você decide cada aspecto do projeto através dos templates</li>
</ul>
</div>
<p>Comece hoje mesmo a transformar sua forma de desenvolver. Crie seu primeiro projeto no GPrompt e experimente a diferença de ter um sistema que entende suas necessidades.</p>
<div class="box">
<h3>Continue Aprendendo</h3>
<ul>
<li>Explore os 36 templates disponíveis</li>
<li>Crie seus próprios templates</li>
<li>Experimente diferentes provedores de IA</li>
<li>Compartilhe templates com sua equipe</li>
</ul>
</div>
<div class="footer">
<p>GPrompt — Sistema de Geração de Prompts Inteligentes</p>
<p>© 2026 Syspanel. Todos os direitos reservados.</p>
</div>
</body>
</html>
@@ -23,6 +23,19 @@
<div class="legal-content"> <div class="legal-content">
{!! nl2br(e($document->content)) !!} {!! nl2br(e($document->content)) !!}
</div> </div>
@if($pendingAcceptance ?? false)
<hr>
<div class="alert alert-info">
<i class="bi bi-info-circle me-2"></i>
Para continuar utilizando o sistema, você precisa aceitar esta versão dos {{ $document->type === 'terms-of-service' ? 'Termos de Uso' : 'Política de Privacidade' }}.
</div>
<form method="POST" action="{{ route('legal.document.accept', $document->type) }}">
@csrf
<button type="submit" class="btn btn-primary btn-lg w-100">
<i class="bi bi-check-circle me-2"></i> Aceitar {{ $document->type === 'terms-of-service' ? 'Termos de Uso' : 'Política de Privacidade' }}
</button>
</form>
@endif
</div> </div>
</div> </div>
@endsection @endsection
@@ -342,6 +342,14 @@
document.getElementById('variables').value = template.variables || ''; document.getElementById('variables').value = template.variables || '';
document.getElementById('temperature').value = template.temperature ?? 0.7; document.getElementById('temperature').value = template.temperature ?? 0.7;
document.getElementById('max_tokens').value = template.max_tokens ?? 1024; document.getElementById('max_tokens').value = template.max_tokens ?? 1024;
if (template.standard_files !== false) {
const stdFilesNote = "\n\n---\nNOTA: O projeto gerado deve conter MULTIPLOS ARQUIVOS em estrutura de pastas organizada. CRIE cada um dos seguintes arquivos padrao DO ZERO com conteudo completo e pronto para uso: LICENSE (MIT), README.md (documentacao completa), RULES.md (regras de codigo), cookies.html (banner LGPD completo com HTML/CSS/JS), termos-de-uso.html (Termos de Uso completos), privacidade.html (Politica de Privacidade LGPD completa). Nao apenas descreva o conteudo — gere o conteudo completo de cada arquivo.";
const constraintsEl = document.getElementById('constraints');
if (constraintsEl && !constraintsEl.value.includes('Arquivos padrao')) {
constraintsEl.value = constraintsEl.value.trim() + stdFilesNote;
}
}
} else { } else {
const fields = ['title', 'objective', 'context', 'persona', 'tone', 'constraints', 'output_format', 'examples', 'variables', 'temperature', 'max_tokens']; const fields = ['title', 'objective', 'context', 'persona', 'tone', 'constraints', 'output_format', 'examples', 'variables', 'temperature', 'max_tokens'];
fields.forEach(field => { fields.forEach(field => {
@@ -173,6 +173,51 @@
</div> </div>
@endif @endif
<div class="card shadow mb-4">
<div class="card-header py-3 d-flex justify-content-between align-items-center">
<h6 class="m-0 fw-bold text-primary">Arquivos Padrão do Projeto</h6>
<span class="badge bg-info">LICENSE · README.md · RULES.md · LGPD</span>
</div>
<div class="card-body">
<div class="alert alert-info small mb-3">
<i class="bi bi-info-circle me-1"></i>
Estes arquivos são gerados automaticamente com base nos dados do projeto e devem ser incluídos no repositório.
</div>
<ul class="nav nav-tabs mb-3" id="standardFilesTab" role="tablist">
@foreach($standardFiles as $filename => $content)
<li class="nav-item" role="presentation">
<button class="nav-link {{ $loop->first ? 'active' : '' }}"
id="file-{{ Str::slug($filename) }}-tab"
data-bs-toggle="tab"
data-bs-target="#file-{{ Str::slug($filename) }}"
type="button" role="tab">
<i class="bi bi-file-text me-1"></i>{{ $filename }}
</button>
</li>
@endforeach
</ul>
<div class="tab-content" id="standardFilesTabContent">
@foreach($standardFiles as $filename => $content)
<div class="tab-pane fade {{ $loop->first ? 'show active' : '' }}"
id="file-{{ Str::slug($filename) }}" role="tabpanel">
<div class="d-flex justify-content-between align-items-center mb-2">
<small class="text-muted">{{ $filename }} — {{ str_word_count($content) }} palavras</small>
<div>
<a href="{{ route('prompt-projects.download-file', [$promptProject, $filename]) }}" class="btn btn-sm btn-outline-primary me-1" download>
<i class="bi bi-download me-1"></i> Download
</a>
<button class="btn btn-sm btn-outline-secondary copy-btn" type="button" data-target="file-content-{{ Str::slug($filename) }}">
<i class="bi bi-clipboard me-1"></i> Copiar
</button>
</div>
</div>
<textarea class="form-control font-monospace small" id="file-content-{{ Str::slug($filename) }}" rows="15" readonly>{{ $content }}</textarea>
</div>
@endforeach
</div>
</div>
</div>
@section('scripts') @section('scripts')
<script> <script>
document.getElementById('model').addEventListener('change', function() { document.getElementById('model').addEventListener('change', function() {
@@ -34,10 +34,46 @@
<input type="text" class="form-control" id="category" name="category" value="{{ old('category') }}"> <input type="text" class="form-control" id="category" name="category" value="{{ old('category') }}">
@error('category') <div class="text-danger small">{{ $message }}</div> @enderror @error('category') <div class="text-danger small">{{ $message }}</div> @enderror
</div> </div>
<div class="card mb-3 border-info">
<div class="card-header bg-info bg-opacity-10 py-2">
<h6 class="mb-0 text-info"><i class="bi bi-file-earmark-text me-1"></i>Arquivos Padrão do Projeto</h6>
</div>
<div class="card-body">
<p class="small text-muted mb-2">Estes arquivos serao gerados automaticamente em todo projeto criado com este template, em conformidade com a legislacao brasileira (LGPD):</p>
<div class="row row-cols-2 row-cols-md-3 g-2">
<div class="col"><span class="badge bg-light text-dark border p-2 w-100 text-start"><i class="bi bi-file-text me-1 text-primary"></i>LICENSE</span></div>
<div class="col"><span class="badge bg-light text-dark border p-2 w-100 text-start"><i class="bi bi-file-text me-1 text-success"></i>README.md</span></div>
<div class="col"><span class="badge bg-light text-dark border p-2 w-100 text-start"><i class="bi bi-file-text me-1 text-warning"></i>RULES.md</span></div>
<div class="col"><span class="badge bg-light text-dark border p-2 w-100 text-start"><i class="bi bi-cookie me-1 text-info"></i>cookies.html</span></div>
<div class="col"><span class="badge bg-light text-dark border p-2 w-100 text-start"><i class="bi bi-shield-check me-1 text-secondary"></i>termos-de-uso.html</span></div>
<div class="col"><span class="badge bg-light text-dark border p-2 w-100 text-start"><i class="bi bi-lock me-1 text-danger"></i>privacidade.html</span></div>
</div>
</div>
</div>
<div class="mb-3"> <div class="mb-3">
<label for="template_data" class="form-label">Dados do Template (JSON)</label> <label for="template_data" class="form-label">Dados do Template (JSON)</label>
<textarea class="form-control font-monospace" id="template_data" name="template_data" rows="20" required>{{ old('template_data') }}</textarea> <textarea class="form-control font-monospace" id="template_data" name="template_data" rows="20" required>{{ old('template_data') }}</textarea>
@error('template_data') <div class="text-danger small">{{ $message }}</div> @enderror @error('template_data') <div class="text-danger small">{{ $message }}</div> @enderror
<div class="form-text small">
O campo <code>standard_files</code> (true/false) controla se os arquivos padrao serao incluidos.
Use o exemplo abaixo como referencia:
<pre class="mt-1 p-2 bg-light rounded small">{
"title": "Meu Template",
"objective": "Objetivo do projeto",
"context": "Contexto do projeto",
"persona": "Persona do assistente",
"tone": "Tom de comunicação",
"constraints": "Restrições e regras",
"output_format": "Formato de saída esperado",
"examples": "Exemplos de entrada/saída",
"variables": "var1, var2",
"temperature": 0.7,
"max_tokens": 4096,
"standard_files": true
}</pre>
</div>
</div> </div>
<div class="mb-3 form-check"> <div class="mb-3 form-check">
<input type="checkbox" class="form-check-input" id="is_public" name="is_public" value="1" {{ old('is_public', true) ? 'checked' : '' }}> <input type="checkbox" class="form-check-input" id="is_public" name="is_public" value="1" {{ old('is_public', true) ? 'checked' : '' }}>
@@ -35,6 +35,25 @@
<input type="text" class="form-control" id="category" name="category" value="{{ old('category', $promptTemplate->category) }}"> <input type="text" class="form-control" id="category" name="category" value="{{ old('category', $promptTemplate->category) }}">
@error('category') <div class="text-danger small">{{ $message }}</div> @enderror @error('category') <div class="text-danger small">{{ $message }}</div> @enderror
</div> </div>
<div class="card mb-3 border-info">
<div class="card-header bg-info bg-opacity-10 py-2">
<h6 class="mb-0 text-info"><i class="bi bi-file-earmark-text me-1"></i>Arquivos Padrão do Projeto</h6>
</div>
<div class="card-body">
<p class="small text-muted mb-2">Estes arquivos serao gerados automaticamente em todo projeto criado com este template, em conformidade com a LGPD:</p>
<div class="row row-cols-2 row-cols-md-3 g-2">
<div class="col"><span class="badge bg-light text-dark border p-2 w-100 text-start"><i class="bi bi-file-text me-1 text-primary"></i>LICENSE</span></div>
<div class="col"><span class="badge bg-light text-dark border p-2 w-100 text-start"><i class="bi bi-file-text me-1 text-success"></i>README.md</span></div>
<div class="col"><span class="badge bg-light text-dark border p-2 w-100 text-start"><i class="bi bi-file-text me-1 text-warning"></i>RULES.md</span></div>
<div class="col"><span class="badge bg-light text-dark border p-2 w-100 text-start"><i class="bi bi-cookie me-1 text-info"></i>cookies.html</span></div>
<div class="col"><span class="badge bg-light text-dark border p-2 w-100 text-start"><i class="bi bi-shield-check me-1 text-secondary"></i>termos-de-uso.html</span></div>
<div class="col"><span class="badge bg-light text-dark border p-2 w-100 text-start"><i class="bi bi-lock me-1 text-danger"></i>privacidade.html</span></div>
</div>
<p class="small text-muted mt-2 mb-0">Campo <code>standard_files</code> no JSON: <code>true</code> para incluir, <code>false</code> para desativar.</p>
</div>
</div>
<div class="mb-3"> <div class="mb-3">
<label for="template_data" class="form-label">Dados do Template (JSON)</label> <label for="template_data" class="form-label">Dados do Template (JSON)</label>
<textarea class="form-control font-monospace" id="template_data" name="template_data" rows="20" required>{{ old('template_data', json_encode($promptTemplate->template_data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)) }}</textarea> <textarea class="form-control font-monospace" id="template_data" name="template_data" rows="20" required>{{ old('template_data', json_encode($promptTemplate->template_data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)) }}</textarea>
+17
View File
@@ -58,6 +58,10 @@ Route::middleware(['auth', 'verified', 'user.approved', 'documents.accepted'])->
->name('prompt-projects.generate'); ->name('prompt-projects.generate');
Route::get('prompt-projects/{promptProject}/prompt', [PromptProjectController::class, 'getPrompt']) Route::get('prompt-projects/{promptProject}/prompt', [PromptProjectController::class, 'getPrompt'])
->name('prompt-projects.prompt'); ->name('prompt-projects.prompt');
Route::get('prompt-projects/{promptProject}/standard-files', [PromptProjectController::class, 'getStandardFiles'])
->name('prompt-projects.standard-files');
Route::get('prompt-projects/{promptProject}/standard-files/{filename}/download', [PromptProjectController::class, 'downloadFile'])
->name('prompt-projects.download-file');
Route::resource('prompt-generations', PromptGenerationController::class)->only(['index']); Route::resource('prompt-generations', PromptGenerationController::class)->only(['index']);
Route::delete('prompt-generations/{generation}', [PromptGenerationController::class, 'destroy']) Route::delete('prompt-generations/{generation}', [PromptGenerationController::class, 'destroy'])
->name('prompt-generations.destroy'); ->name('prompt-generations.destroy');
@@ -95,6 +99,11 @@ Route::get('legal/documents/{type}', [App\Http\Controllers\Legal\LegalDocumentCo
->where('type', 'terms-of-service|privacy-policy') ->where('type', 'terms-of-service|privacy-policy')
->name('legal.document.show'); ->name('legal.document.show');
Route::post('legal/documents/{type}/accept', [App\Http\Controllers\Legal\LegalDocumentController::class, 'accept'])
->where('type', 'terms-of-service|privacy-policy')
->middleware(['auth'])
->name('legal.document.accept');
Route::get('terms-of-service', function () { Route::get('terms-of-service', function () {
return redirect()->route('legal.document.show', 'terms-of-service'); return redirect()->route('legal.document.show', 'terms-of-service');
}); });
@@ -107,4 +116,12 @@ Route::post('/cookie-consent', [App\Http\Controllers\Legal\CookieConsentControll
->middleware(['web']) ->middleware(['web'])
->name('cookie.consent.store'); ->name('cookie.consent.store');
Route::get('ebook/download', function () {
$path = public_path('ebooks/GPrompt-Ebook-Desenvolvedores-v1.pdf');
if (!file_exists($path)) {
abort(404, 'Ebook não encontrado');
}
return response()->file($path, ['Content-Type' => 'application/pdf']);
})->name('ebook.download');
require __DIR__.'/auth.php'; require __DIR__.'/auth.php';