feat: melhorias em emails, traduções e página de pricing

This commit is contained in:
marco 2025-12-19 18:23:06 +01:00
parent b14ff0ab89
commit d1ab280997
11 changed files with 503 additions and 355 deletions

52
DKIM_DNS_ATUALIZADO.txt Normal file
View File

@ -0,0 +1,52 @@
═══════════════════════════════════════════════════════════════════════════
⚠️ AÇÃO URGENTE: ATUALIZAR REGISTRO DKIM NO DNS
═══════════════════════════════════════════════════════════════════════════
O DKIM atual no DNS está DESATUALIZADO! Por isso emails vão para spam.
REGISTRO ATUAL (ERRADO - remover):
Nome: default._domainkey.cnxifly.com
Valor: v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1A8I6ZHyZ0PYdOjB2BSQbH8q6WOJ2dO2zHiIn/bolAGl5ITo5hfn3Zv2fpHBMzcWbDITugSQFuQ3XJeF6oBNdWVvBqnEvI8pCJWzzhZ8Oj9rU+mEPOhIcmmDU6kHCTOFWFxgxbLd2es34rmts06xpF7nI4mWuJq8VVtkrqT0UkZNjjZrNO9KXfdTzV3pP0IEZA+KJlYqVDwnALL62z6GT9xAQi2eytoRSXbTzGDC4+kNXE3v2zMB5+CY9CbH3LZ7SFoJUQJCTf43zc4ea+nWsE/Y2DR5ky2hSwOh7FRJ2nXV07N2VlLu9LekZl08q9G49mwEY6ORT0aShL7RYsNTKQIDAQAB
═══════════════════════════════════════════════════════════════════════════
NOVO REGISTRO (CORRETO - adicionar):
Nome: default._domainkey.cnxifly.com
Tipo: TXT
Valor (copiar em UMA ÚNICA LINHA):
v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyeq8zM0lP2+9kPqH4E9B64rl1nhhga4aCgErcSLNpTWSOpYPxOzWAEsnwVGz/gJGyXiwix+RGN/jxks61nzmik4MslvdxmMABmZ1ERtAoqmO7noThf3LLJbMqYFaGKgYRCpetSZDpQZARlRdzmCTnNVgYsex4gMry4sJocIKbePec8kY3Ps1d4f0LZAp0jH0FufX3V842P8j/96VOdX2U1v8OrnqQWtqteajfMCa/lguHEyYM2ZtV+g4VZZKJgk3UoqwDV3JKwBoxxi17SoedjoXtsNEwaXFPTuOrNOQAqe2iHgMR9949YXbAHxoUA9TOaByOXp9ZmVzmUMfRLk5LwIDAQAB
TTL: 3600
═══════════════════════════════════════════════════════════════════════════
PASSOS PARA ATUALIZAR:
1. Acesse o painel DNS (UI-DNS ou onde gerencia cnxifly.com)
2. Localize o registro: default._domainkey.cnxifly.com
3. EDITE (não delete e crie novo) o valor para o novo acima
4. Salve as alterações
5. Aguarde 5-10 minutos para propagação
TESTAR APÓS ATUALIZAÇÃO:
opendkim-testkey -d cnxifly.com -s default -vvv
Deve retornar: "key OK"
═══════════════════════════════════════════════════════════════════════════
CAUSA DO PROBLEMA:
- Servidor foi reinstalado/reconfigurado em 7 de dezembro
- Nova chave DKIM foi gerada, mas DNS não foi atualizado
- Emails assinados com chave nova, mas DNS tem chave antiga
- Servidores destinatários (iCloud, Gmail) rejeitam como spam
IMPACTO:
- Emails de ativação não chegam (vão para spam/lixeira)
- Emails de notificação são bloqueados
- Reputação do domínio está comprometida
URGÊNCIA: ALTA - Atualizar imediatamente!
═══════════════════════════════════════════════════════════════════════════

View File

@ -31,7 +31,11 @@ public function requestDeletionCode(Request $request)
Cache::put($cacheKey, $code, now()->addMinutes(10));
// Enviar email
Mail::to($user->email)->send(new AccountDeletionConfirmation($code, $user->name));
Mail::to($user->email)->send(new AccountDeletionConfirmation(
$code,
$user->name,
$user->locale ?? $user->language ?? 'pt-BR'
));
return response()->json([
'success' => true,
@ -55,33 +59,20 @@ public function exportBackup(Request $request)
try {
$user = Auth::user();
// Coletar todos os dados do usuário
// Coletar todos os dados do usuário (apenas relações existentes)
$backup = [
'version' => '1.0',
'exported_at' => now()->toISOString(),
'user' => [
'name' => $user->name,
'email' => $user->email,
'locale' => $user->locale ?? $user->language ?? 'pt-BR',
],
'accounts' => $user->accounts()->with('currency')->get(),
'asset_accounts' => $user->assetAccounts()->with('assetType')->get(),
'categories' => $user->categories()->get(),
'cost_centers' => $user->costCenters()->with('keywords')->where('is_system', false)->get(),
'credit_cards' => $user->creditCards()->with('account')->get(),
'liability_accounts' => $user->liabilityAccounts()->get(),
'budgets' => $user->budgets()->with(['category', 'subcategory'])->get(),
'goals' => $user->goals()->get(),
'investments' => $user->investments()->with(['assetAccount', 'investmentType', 'priceHistories'])->get(),
'transactions' => $user->transactions()
->with([
'account',
'category',
'subcategory',
'costCenter',
'creditCard',
'liabilityAccount'
])
->get(),
'accounts' => $user->accounts()->get()->makeHidden(['user']),
'categories' => $user->categories()->get()->makeHidden(['user']),
'budgets' => $user->budgets()->get()->makeHidden(['user']),
'transactions' => $user->transactions()->get()->makeHidden(['user']),
'goals' => $user->goals()->get()->makeHidden(['user']),
];
// Gerar nome do arquivo
@ -89,7 +80,13 @@ public function exportBackup(Request $request)
// Salvar temporariamente
$filePath = 'backups/' . $fileName;
Storage::disk('local')->put($filePath, json_encode($backup, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
$jsonData = json_encode($backup, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
if ($jsonData === false) {
throw new \Exception('Erro ao serializar dados: ' . json_last_error_msg());
}
Storage::disk('local')->put($filePath, $jsonData);
// Retornar URL para download
return response()->json([
@ -100,10 +97,16 @@ public function exportBackup(Request $request)
'expires_in' => '24 horas'
]);
} catch (\Exception $e) {
\Log::error('Export backup error', [
'user_id' => Auth::id(),
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString()
]);
return response()->json([
'success' => false,
'message' => 'Erro ao criar backup',
'error' => $e->getMessage()
'error' => config('app.debug') ? $e->getMessage() : 'Erro interno'
], 500);
}
}

View File

@ -10,25 +10,17 @@
class PlanController extends Controller
{
/**
* List all plans for pricing page (including coming soon)
* List all plans for pricing page
*/
public function index(): JsonResponse
{
// Get active plans
$activePlans = Plan::active()->ordered()->get();
// Get coming soon plans (inactive but should be displayed)
$comingSoonPlans = Plan::where('is_active', false)
->whereIn('slug', ['business'])
->ordered()
->get();
$allPlans = $activePlans->merge($comingSoonPlans);
// Get only active plans
$plans = Plan::active()->ordered()->get();
return response()->json([
'success' => true,
'data' => [
'plans' => $allPlans->map(function ($plan) {
'plans' => $plans->map(function ($plan) {
return [
'id' => $plan->id,
'slug' => $plan->slug,

View File

@ -14,14 +14,16 @@ class AccountDeletionConfirmation extends Mailable
public $code;
public $userName;
public $userLocale;
/**
* Create a new message instance.
*/
public function __construct($code, $userName)
public function __construct($code, $userName, $userLocale = 'pt-BR')
{
$this->code = $code;
$this->userName = $userName;
$this->userLocale = $userLocale;
}
/**

View File

@ -1,150 +1,185 @@
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Código de Confirmação</title>
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-color: #f4f4f4;
margin: 0;
padding: 0;
}
.container {
max-width: 600px;
margin: 40px auto;
background-color: #ffffff;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
.header {
background: linear-gradient(135deg, #dc3545 0%, #c82333 100%);
color: white;
padding: 30px;
text-align: center;
}
.header h1 {
margin: 0;
font-size: 24px;
}
.content {
padding: 40px 30px;
}
.warning-box {
background-color: #fff3cd;
border-left: 4px solid #ffc107;
padding: 15px;
margin: 20px 0;
border-radius: 4px;
}
.warning-box strong {
color: #856404;
}
.code-box {
background-color: #f8f9fa;
border: 2px solid #dc3545;
border-radius: 8px;
padding: 20px;
text-align: center;
margin: 30px 0;
}
.code {
font-size: 36px;
font-weight: bold;
color: #dc3545;
letter-spacing: 8px;
margin: 10px 0;
}
.info-text {
color: #6c757d;
font-size: 14px;
line-height: 1.6;
}
.footer {
background-color: #f8f9fa;
padding: 20px;
text-align: center;
color: #6c757d;
font-size: 12px;
}
.danger-list {
background-color: #f8d7da;
border-left: 4px solid #dc3545;
padding: 15px;
margin: 20px 0;
border-radius: 4px;
}
.danger-list ul {
margin: 10px 0;
padding-left: 20px;
}
.danger-list li {
color: #721c24;
margin: 5px 0;
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>⚠️ EXCLUSÃO PERMANENTE DE CONTA</h1>
@extends('emails.layouts.base')
@php $locale = $userLocale ?? 'pt-BR'; @endphp
@section('title')
@if($locale === 'pt-BR')
Confirmação de Eliminação de Conta
@elseif($locale === 'en')
Account Deletion Confirmation
@else
Confirmación de Eliminación de Cuenta
@endif
@endsection
@section('content')
@if($locale === 'pt-BR')
{{-- Portuguese (Brazil) --}}
<p class="greeting">Olá, {{ $userName }}</p>
<div class="status-card danger" style="text-align: center; padding: 40px 30px;">
<div style="font-size: 48px; margin-bottom: 20px;">🔐</div>
<p class="status-title" style="margin-bottom: 15px;">CÓDIGO DE CONFIRMAÇÃO</p>
<div style="background: rgba(255, 255, 255, 0.2); border-radius: 12px; padding: 20px; margin: 20px 0;">
<div style="font-size: 48px; font-weight: bold; letter-spacing: 8px; font-family: 'Courier New', monospace;">
{{ $code }}
</div>
</div>
<p style="font-size: 14px; opacity: 0.9; margin: 0;">
Válido por 10 minutos
</p>
</div>
<div class="status-card warning">
<p class="status-title" style="color: #78350f; margin-bottom: 12px;">⚠️ ATENÇÃO - AÇÃO IRREVERSÍVEL</p>
<p style="color: #78350f; margin: 0;">
Esta ação <strong>NÃO pode ser desfeita</strong>. Uma vez confirmada, todos os seus dados serão
permanentemente deletados dos nossos servidores sem possibilidade de recuperação.
</p>
</div>
<div class="content">
<p>Olá, <strong>{{ $userName }}</strong></p>
<p><strong>🗑️ Serão deletados permanentemente:</strong></p>
<ul class="info-list">
<li>Todas as transações</li>
<li>Todas as contas bancárias e de ativos</li>
<li>Todos os cartões de crédito e contas de passivos</li>
<li>Orçamentos e categorias personalizadas</li>
<li>Centros de custo e palavras-chave</li>
<li>Objetivos financeiros</li>
<li>Investimentos e histórico de preços</li>
<li>Configurações e preferências</li>
<li>Sua conta de usuário</li>
</ul>
</div>
<p class="info-text">
Você solicitou a exclusão <strong>PERMANENTE E IRREVERSÍVEL</strong> de sua conta no WebMoney.
</p>
<div class="warning-box">
<strong>⚠️ ATENÇÃO:</strong> Esta ação NÃO pode ser desfeita. Uma vez confirmada, todos os seus dados serão permanentemente deletados dos nossos servidores sem possibilidade de recuperação.
</div>
<div class="danger-list">
<strong>🗑️ Serão deletados permanentemente:</strong>
<ul>
<li>Todas as transações</li>
<li>Todas as contas bancárias e de ativos</li>
<li>Todos os cartões de crédito e contas de passivos</li>
<li>Orçamentos e categorias personalizadas</li>
<li>Centros de custo e palavras-chave</li>
<li>Objetivos financeiros</li>
<li>Investimentos e histórico de preços</li>
<li>Configurações e preferências</li>
<li>Sua conta de usuário</li>
</ul>
</div>
<p class="info-text">
Para confirmar esta ação, utilize o código abaixo:
</p>
<div class="code-box">
<div style="font-size: 14px; color: #6c757d; margin-bottom: 10px;">
SEU CÓDIGO DE CONFIRMAÇÃO
</div>
<div class="code">{{ $code }}</div>
<div style="font-size: 12px; color: #6c757d; margin-top: 10px;">
Válido por 10 minutos
</div>
</div>
<p class="info-text">
<strong>Não foi você?</strong> Se você não solicitou esta exclusão, ignore este email e sua conta permanecerá intacta. Recomendamos alterar sua senha imediatamente por segurança.
</p>
<p class="info-text">
<strong>Quer fazer backup?</strong> Antes de confirmar a exclusão, você pode exportar todos os seus dados para um arquivo JSON e importá-los posteriormente em uma nova conta.
<div class="status-card info">
<p class="status-title" style="margin-bottom: 10px;">🔒 Não foi você?</p>
<p style="margin: 0;">
Se você não solicitou esta exclusão, ignore este email e sua conta permanecerá intacta.
Recomendamos alterar sua senha imediatamente por segurança.
</p>
</div>
<div class="footer">
<p>Este é um email automático do <strong>WebMoney</strong></p>
<p>Por favor, não responda a este email.</p>
<div class="status-card info">
<p class="status-title" style="margin-bottom: 10px;">💾 Quer fazer backup?</p>
<p style="margin: 0;">
Antes de confirmar a exclusão, você pode exportar todos os seus dados para um arquivo JSON
e importá-los posteriormente em uma nova conta.
</p>
</div>
</div>
</body>
</html>
@elseif($locale === 'en')
{{-- English --}}
<p class="greeting">Hello, {{ $userName }}</p>
<div class="status-card danger" style="text-align: center; padding: 40px 30px;">
<div style="font-size: 48px; margin-bottom: 20px;">🔐</div>
<p class="status-title" style="margin-bottom: 15px;">CONFIRMATION CODE</p>
<div style="background: rgba(255, 255, 255, 0.2); border-radius: 12px; padding: 20px; margin: 20px 0;">
<div style="font-size: 48px; font-weight: bold; letter-spacing: 8px; font-family: 'Courier New', monospace;">
{{ $code }}
</div>
</div>
<p style="font-size: 14px; opacity: 0.9; margin: 0;">
Valid for 10 minutes
</p>
</div>
<div class="status-card warning">
<p class="status-title" style="color: #78350f; margin-bottom: 12px;">⚠️ WARNING - IRREVERSIBLE ACTION</p>
<p style="color: #78350f; margin: 0;">
This action <strong>CANNOT be undone</strong>. Once confirmed, all your data will be
permanently deleted from our servers with no possibility of recovery.
</p>
</div>
<div class="content">
<p><strong>🗑️ Will be permanently deleted:</strong></p>
<ul class="info-list">
<li>All transactions</li>
<li>All bank accounts and asset accounts</li>
<li>All credit cards and liability accounts</li>
<li>Custom budgets and categories</li>
<li>Cost centers and keywords</li>
<li>Financial goals</li>
<li>Investments and price history</li>
<li>Settings and preferences</li>
<li>Your user account</li>
</ul>
</div>
<div class="status-card info">
<p class="status-title" style="margin-bottom: 10px;">🔒 Wasn't you?</p>
<p style="margin: 0;">
If you did not request this deletion, ignore this email and your account will remain intact.
We recommend changing your password immediately for security.
</p>
</div>
<div class="status-card info">
<p class="status-title" style="margin-bottom: 10px;">💾 Want to backup?</p>
<p style="margin: 0;">
Before confirming the deletion, you can export all your data to a JSON file
and import it later into a new account.
</p>
</div>
@else
{{-- Spanish --}}
<p class="greeting">Hola, {{ $userName }}</p>
<div class="status-card danger" style="text-align: center; padding: 40px 30px;">
<div style="font-size: 48px; margin-bottom: 20px;">🔐</div>
<p class="status-title" style="margin-bottom: 15px;">CÓDIGO DE CONFIRMACIÓN</p>
<div style="background: rgba(255, 255, 255, 0.2); border-radius: 12px; padding: 20px; margin: 20px 0;">
<div style="font-size: 48px; font-weight: bold; letter-spacing: 8px; font-family: 'Courier New', monospace;">
{{ $code }}
</div>
</div>
<p style="font-size: 14px; opacity: 0.9; margin: 0;">
Válido por 10 minutos
</p>
</div>
<div class="status-card warning">
<p class="status-title" style="color: #78350f; margin-bottom: 12px;">⚠️ ATENCIÓN - ACCIÓN IRREVERSIBLE</p>
<p style="color: #78350f; margin: 0;">
Esta acción <strong>NO se puede deshacer</strong>. Una vez confirmada, todos tus datos serán
eliminados permanentemente de nuestros servidores sin posibilidad de recuperación.
</p>
</div>
<div class="content">
<p><strong>🗑️ Serán eliminados permanentemente:</strong></p>
<ul class="info-list">
<li>Todas las transacciones</li>
<li>Todas las cuentas bancarias y de activos</li>
<li>Todas las tarjetas de crédito y cuentas de pasivos</li>
<li>Presupuestos y categorías personalizadas</li>
<li>Centros de costo y palabras clave</li>
<li>Objetivos financieros</li>
<li>Inversiones e historial de precios</li>
<li>Configuraciones y preferencias</li>
<li>Tu cuenta de usuario</li>
</ul>
</div>
<div class="status-card info">
<p class="status-title" style="margin-bottom: 10px;">🔒 ¿No fuiste ?</p>
<p style="margin: 0;">
Si no solicitaste esta eliminación, ignora este email y tu cuenta permanecerá intacta.
Recomendamos cambiar tu contraseña inmediatamente por seguridad.
</p>
</div>
<div class="status-card info">
<p class="status-title" style="margin-bottom: 10px;">💾 ¿Quieres hacer backup?</p>
<p style="margin: 0;">
Antes de confirmar la eliminación, puedes exportar todos tus datos a un archivo JSON
e importarlos posteriormente en una nueva cuenta.
</p>
</div>
@endif
@endsection

View File

@ -1,160 +1,48 @@
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Oferta Especial de Retenção</title>
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-color: #f4f4f4;
margin: 0;
padding: 0;
}
.container {
max-width: 600px;
margin: 40px auto;
background-color: #ffffff;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
.header {
background: linear-gradient(135deg, #10b981 0%, #059669 100%);
color: white;
padding: 40px 30px;
text-align: center;
}
.header h1 {
margin: 0;
font-size: 28px;
font-weight: bold;
}
.header .emoji {
font-size: 48px;
display: block;
margin-bottom: 10px;
}
.content {
padding: 40px 30px;
}
.highlight-box {
background: linear-gradient(135deg, #10b981 0%, #059669 100%);
color: white;
border-radius: 12px;
padding: 30px;
text-align: center;
margin: 30px 0;
box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3);
}
.highlight-box .number {
font-size: 72px;
font-weight: bold;
line-height: 1;
margin: 10px 0;
}
.highlight-box .text {
font-size: 24px;
font-weight: bold;
margin-top: 10px;
}
.benefit-list {
background-color: #f0fdf4;
border-left: 4px solid #10b981;
padding: 20px;
margin: 25px 0;
border-radius: 4px;
}
.benefit-list ul {
margin: 10px 0;
padding-left: 25px;
}
.benefit-list li {
color: #065f46;
margin: 10px 0;
font-size: 15px;
}
.emotional-message {
background-color: #fef3c7;
border-left: 4px solid #f59e0b;
padding: 20px;
margin: 25px 0;
border-radius: 4px;
}
.emotional-message p {
color: #78350f;
margin: 0;
line-height: 1.6;
}
.cta-box {
text-align: center;
margin: 30px 0;
padding: 20px;
background-color: #f8f9fa;
border-radius: 8px;
}
.cta-box .date {
font-size: 18px;
color: #059669;
font-weight: bold;
margin-top: 15px;
}
.footer {
background-color: #f8f9fa;
padding: 20px;
text-align: center;
color: #6c757d;
font-size: 12px;
}
.divider {
height: 1px;
background-color: #e5e7eb;
margin: 30px 0;
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<span class="emoji">🎉</span>
<h1>OFERTA EXCLUSIVA PARA VOCÊ!</h1>
</div>
@extends('emails.layouts.base')
@php $locale = $userLocale ?? 'pt-BR'; @endphp
@section('title')
@if($locale === 'pt-BR')
Oferta Especial de Retenção
@elseif($locale === 'en')
Special Retention Offer
@else
Oferta Especial de Retención
@endif
@endsection
@section('content')
@if($locale === 'pt-BR')
{{-- Portuguese (Brazil) --}}
<p class="greeting">Olá, {{ $user->name }} 🎉</p>
<div class="content">
<p style="font-size: 16px; color: #374151; line-height: 1.6;">
Olá, <strong>{{ $user->name }}</strong>
</p>
<p>Entendemos que o preço pode ser uma preocupação, e <strong>queremos mantê-lo conosco</strong>! Por isso, temos uma oferta especial para você:</p>
<p style="font-size: 16px; color: #374151; line-height: 1.6;">
Entendemos que o preço pode ser uma preocupação, e <strong>queremos mantê-lo conosco</strong>!
Por isso, temos uma oferta especial para você:
</p>
<div class="highlight-box">
<div style="font-size: 18px; margin-bottom: 10px;"> OFERTA ÚNICA </div>
<div class="number">{{ $freeMonths }}</div>
<div class="text">MESES GRÁTIS</div>
<div style="font-size: 16px; margin-top: 15px; opacity: 0.9;">
Sem custos, sem compromisso!
</div>
<div class="status-card success" style="background: linear-gradient(135deg, #10b981 0%, #059669 100%); border: none; text-align: center; padding: 40px 30px;">
<div style="color: white; font-size: 18px; margin-bottom: 10px;"> OFERTA ÚNICA </div>
<div style="color: white; font-size: 72px; font-weight: bold; line-height: 1; margin: 10px 0;">{{ $freeMonths }}</div>
<div style="color: white; font-size: 24px; font-weight: bold; margin-top: 10px;">MESES GRÁTIS</div>
<div style="color: white; font-size: 16px; margin-top: 15px; opacity: 0.9;">Sem custos, sem compromisso!</div>
</div>
<div class="emotional-message">
<p style="font-weight: bold; margin-bottom: 10px;">💙 Você é importante para nós!</p>
<p>
<div class="status-card warning">
<p class="status-title" style="color: #78350f; margin-bottom: 12px;">💙 Você é importante para nós!</p>
<p style="color: #78350f;">
Sabemos que as coisas podem estar apertadas financeiramente. Esta oferta especial de
<strong>{{ $freeMonths }} meses grátis</strong> é nossa forma de dizer:
<em>"Queremos você aqui com a gente!"</em>
</p>
<p style="margin-top: 10px;">
<p style="color: #78350f; margin-top: 12px;">
Durante este período, você terá acesso completo a todos os recursos premium do WebMoney,
sem pagar nada. É tempo suficiente para as coisas melhorarem! 🌟
</p>
</div>
<div class="benefit-list">
<strong style="color: #065f46; font-size: 16px;">O que você continua tendo GRÁTIS:</strong>
<ul>
<div class="status-card success">
<p class="status-title" style="color: #065f46; margin-bottom: 16px;">O que você continua tendo GRÁTIS:</p>
<ul class="info-list" style="color: #065f46;">
<li>📊 Controle completo de todas as suas contas</li>
<li>💳 Gestão ilimitada de cartões de crédito</li>
<li>📈 Orçamentos e metas financeiras</li>
@ -165,45 +53,153 @@
</ul>
</div>
<div class="divider"></div>
<div class="cta-box">
<p style="font-size: 18px; color: #374151; font-weight: bold; margin: 0 0 15px 0;">
Oferta Aplicada!
</p>
<p style="font-size: 15px; color: #6b7280; margin: 0;">
<div class="status-card info" style="text-align: center; padding: 30px;">
<p class="status-title" style="margin-bottom: 15px;"> Oferta Aplicada!</p>
<p style="margin-bottom: 20px;">
Sua assinatura foi estendida automaticamente por {{ $freeMonths }} meses.<br>
Continue aproveitando todos os recursos premium sem custo!
</p>
<div class="date">
<p style="font-size: 18px; color: #059669; font-weight: bold; margin: 0;">
Sua próxima cobrança será em:<br>
<strong>{{ \Carbon\Carbon::parse($offerEndDate)->format('d/m/Y') }}</strong>
</div>
<strong style="font-size: 20px;">{{ \Carbon\Carbon::parse($offerEndDate)->format('d/m/Y') }}</strong>
</p>
</div>
<div style="background-color: #eff6ff; border-left: 4px solid #3b82f6; padding: 20px; border-radius: 4px; margin-top: 25px;">
<p style="color: #1e40af; margin: 0; font-size: 14px;">
<div class="status-card info">
<p style="margin: 0; font-size: 14px;">
<strong>📌 Importante:</strong> Esta oferta é exclusiva e pode ser usada apenas uma vez.
Após os {{ $freeMonths }} meses, sua assinatura voltará ao valor normal. Você pode cancelar
a qualquer momento antes disso, sem nenhum custo.
</p>
</div>
<p style="font-size: 16px; color: #374151; line-height: 1.6; margin-top: 30px;">
Muito obrigado por escolher o <strong>WebMoney</strong>! Estamos aqui para ajudá-lo a alcançar
seus objetivos financeiros. 💚
</p>
<p style="font-size: 14px; color: #6b7280; margin-top: 25px;">
Com carinho,<br>
<strong style="color: #374151;">Equipe WebMoney</strong>
</p>
<p>Muito obrigado por escolher o <strong>WebMoney</strong>! Estamos aqui para ajudá-lo a alcançar seus objetivos financeiros. 💚</p>
</div>
<div class="footer">
<p>Este é um email automático do <strong>WebMoney</strong></p>
<p>Por favor, não responda a este email.</p>
@elseif($locale === 'en')
{{-- English --}}
<p class="greeting">Hello, {{ $user->name }} 🎉</p>
<div class="content">
<p>We understand that price can be a concern, and <strong>we want to keep you with us</strong>! That's why we have a special offer just for you:</p>
<div class="status-card success" style="background: linear-gradient(135deg, #10b981 0%, #059669 100%); border: none; text-align: center; padding: 40px 30px;">
<div style="color: white; font-size: 18px; margin-bottom: 10px;"> EXCLUSIVE OFFER </div>
<div style="color: white; font-size: 72px; font-weight: bold; line-height: 1; margin: 10px 0;">{{ $freeMonths }}</div>
<div style="color: white; font-size: 24px; font-weight: bold; margin-top: 10px;">FREE MONTHS</div>
<div style="color: white; font-size: 16px; margin-top: 15px; opacity: 0.9;">No cost, no commitment!</div>
</div>
<div class="status-card warning">
<p class="status-title" style="color: #78350f; margin-bottom: 12px;">💙 You are important to us!</p>
<p style="color: #78350f;">
We know things can be financially tight. This special offer of
<strong>{{ $freeMonths }} free months</strong> is our way of saying:
<em>"We want you here with us!"</em>
</p>
<p style="color: #78350f; margin-top: 12px;">
During this period, you will have full access to all WebMoney premium features,
at no cost. It's enough time for things to get better! 🌟
</p>
</div>
<div class="status-card success">
<p class="status-title" style="color: #065f46; margin-bottom: 16px;">What you continue to have FREE:</p>
<ul class="info-list" style="color: #065f46;">
<li>📊 Complete control of all your accounts</li>
<li>💳 Unlimited credit card management</li>
<li>📈 Budgets and financial goals</li>
<li>📱 Automatic statement import</li>
<li>🎯 Smart transaction categorization</li>
<li>📋 Detailed reports and insights</li>
<li>☁️ Automatic cloud backup</li>
</ul>
</div>
<div class="status-card info" style="text-align: center; padding: 30px;">
<p class="status-title" style="margin-bottom: 15px;"> Offer Already Applied!</p>
<p style="margin-bottom: 20px;">
Your subscription has been automatically extended for {{ $freeMonths }} months.<br>
Continue enjoying all premium features at no cost!
</p>
<p style="font-size: 18px; color: #059669; font-weight: bold; margin: 0;">
Your next charge will be on:<br>
<strong style="font-size: 20px;">{{ \Carbon\Carbon::parse($offerEndDate)->format('m/d/Y') }}</strong>
</p>
</div>
<div class="status-card info">
<p style="margin: 0; font-size: 14px;">
<strong>📌 Important:</strong> This offer is exclusive and can only be used once.
After the {{ $freeMonths }} months, your subscription will return to the regular price. You can cancel
at any time before that, at no cost.
</p>
</div>
<p>Thank you very much for choosing <strong>WebMoney</strong>! We are here to help you achieve your financial goals. 💚</p>
</div>
</div>
</body>
</html>
@else
{{-- Spanish --}}
<p class="greeting">Hola, {{ $user->name }} 🎉</p>
<div class="content">
<p>Entendemos que el precio puede ser una preocupación, y <strong>¡queremos que sigas con nosotros</strong>! Por eso, tenemos una oferta especial solo para ti:</p>
<div class="status-card success" style="background: linear-gradient(135deg, #10b981 0%, #059669 100%); border: none; text-align: center; padding: 40px 30px;">
<div style="color: white; font-size: 18px; margin-bottom: 10px;"> OFERTA ÚNICA </div>
<div style="color: white; font-size: 72px; font-weight: bold; line-height: 1; margin: 10px 0;">{{ $freeMonths }}</div>
<div style="color: white; font-size: 24px; font-weight: bold; margin-top: 10px;">MESES GRATIS</div>
<div style="color: white; font-size: 16px; margin-top: 15px; opacity: 0.9;">¡Sin costos, sin compromiso!</div>
</div>
<div class="status-card warning">
<p class="status-title" style="color: #78350f; margin-bottom: 12px;">💙 ¡Eres importante para nosotros!</p>
<p style="color: #78350f;">
Sabemos que las cosas pueden estar ajustadas financieramente. Esta oferta especial de
<strong>{{ $freeMonths }} meses gratis</strong> es nuestra forma de decir:
<em>"¡Te queremos aquí con nosotros!"</em>
</p>
<p style="color: #78350f; margin-top: 12px;">
Durante este período, tendrás acceso completo a todas las funciones premium de WebMoney,
sin pagar nada. ¡Es tiempo suficiente para que las cosas mejoren! 🌟
</p>
</div>
<div class="status-card success">
<p class="status-title" style="color: #065f46; margin-bottom: 16px;">Lo que sigues teniendo GRATIS:</p>
<ul class="info-list" style="color: #065f46;">
<li>📊 Control completo de todas tus cuentas</li>
<li>💳 Gestión ilimitada de tarjetas de crédito</li>
<li>📈 Presupuestos y metas financieras</li>
<li>📱 Importación automática de extractos</li>
<li>🎯 Categorización inteligente de transacciones</li>
<li>📋 Reportes detallados e insights</li>
<li>☁️ Backup automático en la nube</li>
</ul>
</div>
<div class="status-card info" style="text-align: center; padding: 30px;">
<p class="status-title" style="margin-bottom: 15px;"> ¡Oferta Ya Aplicada!</p>
<p style="margin-bottom: 20px;">
Tu suscripción ha sido extendida automáticamente por {{ $freeMonths }} meses.<br>
¡Sigue disfrutando de todas las funciones premium sin costo!
</p>
<p style="font-size: 18px; color: #059669; font-weight: bold; margin: 0;">
Tu próximo cargo será el:<br>
<strong style="font-size: 20px;">{{ \Carbon\Carbon::parse($offerEndDate)->format('d/m/Y') }}</strong>
</p>
</div>
<div class="status-card info">
<p style="margin: 0; font-size: 14px;">
<strong>📌 Importante:</strong> Esta oferta es exclusiva y solo puede usarse una vez.
Después de los {{ $freeMonths }} meses, tu suscripción volverá al precio normal. Puedes cancelar
en cualquier momento antes de eso, sin ningún costo.
</p>
</div>
<p>¡Muchas gracias por elegir <strong>WebMoney</strong>! Estamos aquí para ayudarte a alcanzar tus objetivos financieros. 💚</p>
</div>
@endif
@endsection

View File

@ -33,7 +33,7 @@
<tr>
<td style="padding: 12px; background: rgba(255,255,255,0.1); border-radius: 4px;">
<span style="color: #94a3b8; font-size: 11px; text-transform: uppercase; letter-spacing: 0.5px;">Palavra-passe</span><br>
<span style="color: #ffffff; font-size: 16px; font-weight: 600; font-family: monospace;">{{ $password }}</span>
<span style="color: #ffffff; font-size: 16px; font-weight: 600; font-family: monospace;">{{ $temporaryPassword }}</span>
</td>
</tr>
</table>
@ -88,7 +88,7 @@
<tr>
<td style="padding: 12px; background: rgba(255,255,255,0.1); border-radius: 4px;">
<span style="color: #94a3b8; font-size: 11px; text-transform: uppercase; letter-spacing: 0.5px;">Password</span><br>
<span style="color: #ffffff; font-size: 16px; font-weight: 600; font-family: monospace;">{{ $password }}</span>
<span style="color: #ffffff; font-size: 16px; font-weight: 600; font-family: monospace;">{{ $temporaryPassword }}</span>
</td>
</tr>
</table>
@ -143,7 +143,7 @@
<tr>
<td style="padding: 12px; background: rgba(255,255,255,0.1); border-radius: 4px;">
<span style="color: #94a3b8; font-size: 11px; text-transform: uppercase; letter-spacing: 0.5px;">Contraseña</span><br>
<span style="color: #ffffff; font-size: 16px; font-weight: 600; font-family: monospace;">{{ $password }}</span>
<span style="color: #ffffff; font-size: 16px; font-weight: 600; font-family: monospace;">{{ $temporaryPassword }}</span>
</td>
</tr>
</table>

View File

@ -2228,6 +2228,28 @@
"paypalSecure": "Secure payment with PayPal",
"comingSoon": "Coming Soon",
"forPymes": "Tools for SMEs",
"planNames": {
"Básico": "Basic",
"Pro Mensual": "Pro Monthly",
"Pro Anual": "Pro Annual",
"Business": "Business"
},
"planFeatures": {
"1 cuenta bancaria": "1 bank account",
"10 categorías": "10 categories",
"100 subcategorías": "100 subcategories",
"1.000 transacciones": "1,000 transactions",
"Cuentas ilimitadas": "Unlimited accounts",
"Categorías ilimitadas": "Unlimited categories",
"Transacciones ilimitadas": "Unlimited transactions",
"Reportes avanzados": "Advanced reports",
"Múltiples usuarios": "Multiple users",
"Facturación integrada": "Integrated billing",
"Gestión de flujo de caja": "Cash flow management",
"Control de presupuesto": "Budget control",
"Módulo de negocios": "Business module",
"Soporte prioritario": "Priority support"
},
"features": {
"multiUsers": "Multiple users",
"integratedBilling": "Integrated billing",

View File

@ -2220,6 +2220,28 @@
"paypalSecure": "Pago seguro con PayPal",
"comingSoon": "Próximamente",
"forPymes": "Herramientas para PyMEs",
"planNames": {
"Básico": "Básico",
"Pro Mensual": "Pro Mensual",
"Pro Anual": "Pro Anual",
"Business": "Business"
},
"planFeatures": {
"1 cuenta bancaria": "1 cuenta bancaria",
"10 categorías": "10 categorías",
"100 subcategorías": "100 subcategorías",
"1.000 transacciones": "1.000 transacciones",
"Cuentas ilimitadas": "Cuentas ilimitadas",
"Categorías ilimitadas": "Categorías ilimitadas",
"Transacciones ilimitadas": "Transacciones ilimitadas",
"Reportes avanzados": "Reportes avanzados",
"Múltiples usuarios": "Múltiples usuarios",
"Facturación integrada": "Facturación integrada",
"Gestión de flujo de caja": "Gestión de flujo de caja",
"Control de presupuesto": "Control de presupuesto",
"Módulo de negocios": "Módulo de negocios",
"Soporte prioritario": "Soporte prioritario"
},
"features": {
"multiUsers": "Múltiples usuarios",
"integratedBilling": "Facturación integrada",

View File

@ -2238,6 +2238,28 @@
"paypalSecure": "Pagamento seguro com PayPal",
"comingSoon": "Em Breve",
"forPymes": "Ferramentas para PMEs",
"planNames": {
"Básico": "Básico",
"Pro Mensual": "Pro Mensal",
"Pro Anual": "Pro Anual",
"Business": "Negócios"
},
"planFeatures": {
"1 cuenta bancaria": "1 conta bancária",
"10 categorías": "10 categorias",
"100 subcategorías": "100 subcategorias",
"1.000 transacciones": "1.000 transações",
"Cuentas ilimitadas": "Contas ilimitadas",
"Categorías ilimitadas": "Categorias ilimitadas",
"Transacciones ilimitadas": "Transações ilimitadas",
"Reportes avanzados": "Relatórios avançados",
"Múltiples usuarios": "Múltiplos usuários",
"Facturación integrada": "Faturamento integrado",
"Gestión de flujo de caja": "Gestão de fluxo de caixa",
"Control de presupuesto": "Controle de orçamento",
"Módulo de negocios": "Módulo de negócios",
"Soporte prioritario": "Suporte prioritário"
},
"features": {
"multiUsers": "Múltiplos usuários",
"integratedBilling": "Faturamento integrado",

View File

@ -123,7 +123,9 @@ export default function Pricing() {
<div className="card-body d-flex flex-column">
{/* Plan Name */}
<h3 className="card-title text-center mb-3">{plan.name}</h3>
<h3 className="card-title text-center mb-3">
{t(`pricing.planNames.${plan.name}`, plan.name)}
</h3>
{/* Price */}
<div className="text-center mb-4">
@ -170,7 +172,7 @@ export default function Pricing() {
{plan.features?.map((feature, idx) => (
<li key={idx} className="mb-2">
<i className="bi bi-check-circle-fill text-success me-2"></i>
{feature}
{t(`pricing.planFeatures.${feature}`, feature)}
</li>
))}
</ul>