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.
This commit is contained in:
@@ -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,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,495 @@ 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[] = "- 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>© {$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>© {$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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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',
|
[
|
||||||
'content' => $termsContent,
|
'title' => 'Termos de Uso',
|
||||||
'version' => '1.0',
|
'content' => $termsContent,
|
||||||
'published_by' => $superadmin?->id,
|
'version' => '1.0',
|
||||||
'published_at' => now(),
|
'published_by' => $superadmin?->id,
|
||||||
]);
|
'published_at' => now(),
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
LegalDocument::create([
|
LegalDocument::updateOrCreate(
|
||||||
'type' => 'privacy-policy',
|
['type' => 'privacy-policy'],
|
||||||
'title' => 'Política de Privacidade',
|
[
|
||||||
'content' => $privacyContent,
|
'title' => 'Política de Privacidade',
|
||||||
'version' => '1.0',
|
'content' => $privacyContent,
|
||||||
'published_by' => $superadmin?->id,
|
'version' => '1.0',
|
||||||
'published_at' => now(),
|
'published_by' => $superadmin?->id,
|
||||||
]);
|
'published_at' => now(),
|
||||||
|
]
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -29,6 +29,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -48,6 +49,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -67,6 +69,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -86,6 +89,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -105,6 +109,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -124,6 +129,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -143,6 +149,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -162,6 +169,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -181,6 +189,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -200,6 +209,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -219,6 +229,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -238,6 +249,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -257,6 +269,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -276,6 +289,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -295,6 +309,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -314,6 +329,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -333,6 +349,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -352,6 +369,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -371,6 +389,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -390,6 +409,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -409,6 +429,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -428,6 +449,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -447,6 +469,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -466,6 +489,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -485,6 +509,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -504,6 +529,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -523,6 +549,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -542,6 +569,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -561,6 +589,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -580,6 +609,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -599,6 +629,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -618,6 +649,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -637,6 +669,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -656,6 +689,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -675,6 +709,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
@@ -694,6 +729,7 @@ class PromptTemplateSeeder extends Seeder
|
|||||||
'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,
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -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: Os arquivos padrao (LICENSE, README.md, RULES.md, cookies.html, termos-de-uso.html, privacidade.html) serao gerados automaticamente pelo sistema apos a geracao do prompt. NAO os inclua na sua resposta.";
|
||||||
|
const constraintsEl = document.getElementById('constraints');
|
||||||
|
if (constraintsEl && !constraintsEl.value.includes('Arquivos padrao')) {
|
||||||
|
constraintsEl.value = constraintsEl.value.trim() + stdFilesNote;
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} 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' : '' }}>
|
||||||
@@ -48,4 +84,4 @@
|
|||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@endsection
|
@endsection
|
||||||
@@ -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>
|
||||||
@@ -49,4 +68,4 @@
|
|||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@endsection
|
@endsection
|
||||||
@@ -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');
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user