feat: cookie policy & consent banner per Moldova law 195/2024

- Settings page: new "Politica Cookie" section — toggle banner on/off,
  editable RO/RU policy text (defaults to full 14-section template)
- Public route GET /cookie-policy → CookiePolicyController returns
  locale-aware full policy page with tenant branding
- Cookie banner partial (Alpine.js, localStorage) shown on tracking and
  landing pages; Accept/Reject stores consent, banner dismisses
- Translation keys added to lang/ro/portal.php and lang/ru/portal.php
- Alpine.js (CDN) added to tracking and landing pages

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-09-16 17:52:23 +00:00
parent 753e81d292
commit 68f58cbcdc
9 changed files with 591 additions and 0 deletions
+30
View File
@@ -83,6 +83,9 @@ class Settings extends Page
'ai_model_claude' => data_get($settings, 'ai.models.claude', \App\Services\Ai\AiAssistantService::MODEL_DEFAULTS['claude']), 'ai_model_claude' => data_get($settings, 'ai.models.claude', \App\Services\Ai\AiAssistantService::MODEL_DEFAULTS['claude']),
'ai_model_gpt' => data_get($settings, 'ai.models.gpt', \App\Services\Ai\AiAssistantService::MODEL_DEFAULTS['gpt']), 'ai_model_gpt' => data_get($settings, 'ai.models.gpt', \App\Services\Ai\AiAssistantService::MODEL_DEFAULTS['gpt']),
'ai_model_gemini' => data_get($settings, 'ai.models.gemini', \App\Services\Ai\AiAssistantService::MODEL_DEFAULTS['gemini']), 'ai_model_gemini' => data_get($settings, 'ai.models.gemini', \App\Services\Ai\AiAssistantService::MODEL_DEFAULTS['gemini']),
'cookie_banner_enabled' => data_get($settings, 'cookie.banner_enabled', true),
'cookie_policy_ro' => data_get($settings, 'cookie.policy_ro', ''),
'cookie_policy_ru' => data_get($settings, 'cookie.policy_ru', ''),
]); ]);
} }
@@ -289,6 +292,28 @@ class Settings extends Page
->options(\App\Services\Ai\AiAssistantService::MODEL_OPTIONS['gemini']) ->options(\App\Services\Ai\AiAssistantService::MODEL_OPTIONS['gemini'])
->default(\App\Services\Ai\AiAssistantService::MODEL_DEFAULTS['gemini']), ->default(\App\Services\Ai\AiAssistantService::MODEL_DEFAULTS['gemini']),
]), ]),
Schemas\Components\Section::make(__('Politica Cookie'))
->description(__('Text afișat clienților conform Legii nr. 195/2024 (Moldova). Lasă gol pentru a folosi textul implicit. Folosiți [site], [email], [phone] ca variabile dinamice.'))
->columns(1)
->schema([
Forms\Components\Toggle::make('cookie_banner_enabled')
->label(__('Afișează banner cookie pe paginile publice'))
->helperText(__('Banner apare la prima vizită și poate fi acceptat/refuzat. Consimțământul se stochează în browser.'))
->default(true)
->columnSpanFull(),
Forms\Components\Textarea::make('cookie_policy_ro')
->label(__('Text politică cookie (RO)'))
->rows(15)
->placeholder(__('Lasă gol pentru textul implicit conform Legii 195/2024...'))
->helperText(__('Disponibil la /cookie-policy. Variabile: [site], [email], [phone]'))
->columnSpanFull(),
Forms\Components\Textarea::make('cookie_policy_ru')
->label(__('Text politică cookie (RU)'))
->rows(15)
->placeholder(__('Оставьте пустым для использования текста по умолчанию...'))
->helperText(__('Variabile: [site], [email], [phone]'))
->columnSpanFull(),
]),
]) ])
->statePath('data'); ->statePath('data');
} }
@@ -353,6 +378,11 @@ class Settings extends Page
'gemini' => $data['ai_model_gemini'] ?? \App\Services\Ai\AiAssistantService::MODEL_DEFAULTS['gemini'], 'gemini' => $data['ai_model_gemini'] ?? \App\Services\Ai\AiAssistantService::MODEL_DEFAULTS['gemini'],
], ],
], ],
'cookie' => [
'banner_enabled' => (bool) ($data['cookie_banner_enabled'] ?? true),
'policy_ro' => trim((string) ($data['cookie_policy_ro'] ?? '')) ?: null,
'policy_ru' => trim((string) ($data['cookie_policy_ru'] ?? '')) ?: null,
],
]), ]),
]); ]);
@@ -0,0 +1,381 @@
<?php
namespace App\Http\Controllers;
use App\Tenancy\TenantManager;
use Illuminate\Http\Request;
class CookiePolicyController extends Controller
{
public function show(Request $request)
{
$tenant = app(TenantManager::class)->current();
$settings = (array) ($tenant?->settings ?? []);
$locale = session('locale', data_get($settings, 'language', 'ro'));
$policyKey = $locale === 'ru' ? 'policy_ru' : 'policy_ro';
$rawText = data_get($settings, "cookie.{$policyKey}")
?: ($locale === 'ru' ? self::defaultRu() : self::defaultRo());
$policyText = $this->replacePlaceholders($rawText, $tenant);
return view('public.cookie-policy', [
'tenant' => $tenant,
'policyText' => $policyText,
'locale' => $locale,
'themeColor' => data_get($settings, 'theme_color', '#3B82F6'),
'logoUrl' => method_exists($tenant ?? new \stdClass, 'getLogoUrl') ? $tenant?->getLogoUrl() : null,
]);
}
private function replacePlaceholders(string $text, $tenant): string
{
return str_replace(
['[site]', '[email]', '[phone]'],
[request()->getHost(), $tenant?->email ?? '', $tenant?->phone ?? ''],
$text
);
}
public static function defaultRo(): string
{
return <<<'EOT'
POLITICA DE UTILIZARE A FIȘIERELOR COOKIE
1. DISPOZIȚII GENERALE
1.1. Prezenta Politică de utilizare a fișierelor cookie (denumită în continuare – „Politica cookie") reglementează modul de utilizare a fișierelor cookie și a tehnologiilor similare pe site-ul web [site] (denumit în continuare – „Site-ul").
1.2. Politica cookie se aplică în conformitate cu legislația aplicabilă a Republicii Moldova, inclusiv prevederile Legii nr. 195/2024 privind protecția datelor cu caracter personal, Legii nr. 284/2004 privind comerțul electronic și ale altor acte normative aplicabile care reglementează prelucrarea datelor cu caracter personal și utilizarea tehnologiilor de stocare sau accesare a informațiilor pe dispozitivele utilizatorilor.
1.3. Prin utilizarea Site-ului, Utilizatorul poate primi informații privind utilizarea fișierelor cookie prin intermediul unei notificări corespunzătoare sau al mecanismului de gestionare a fișierelor cookie disponibil pe Site.
1.4. Fișierele cookie a căror utilizare este necesară pentru funcționarea tehnică a Site-ului sau pentru furnizarea serviciului solicitat de Utilizator pot fi utilizate fără obținerea unui consimțământ separat al Utilizatorului, în cazurile prevăzute de legislația aplicabilă.
1.5. Utilizarea fișierelor cookie care nu sunt strict necesare, inclusiv a fișierelor cookie analitice și de marketing, se efectuează în baza unui temei juridic corespunzător, inclusiv a consimțământului Utilizatorului, în cazul în care un astfel de consimțământ este impus de legislația aplicabilă.
2. CE SUNT FIȘIERELE COOKIE
2.1. Un fișier cookie reprezintă un fișier text de dimensiuni reduse, care conține anumite informații și care este stocat pe computerul, dispozitivul mobil sau un alt dispozitiv al Utilizatorului la accesarea unui site web.
2.2. Fișierele cookie permit site-ului web să recunoască dispozitivul Utilizatorului, să păstreze anumite setări și să asigure funcționarea corespunzătoare a anumitor funcții ale Site-ului.
2.3. Fișierele cookie pot fi utilizate atât de Site, cât și de terți ale căror servicii sunt utilizate pe Site.
2.4. Fișierele cookie nu sunt, în sine, viruși și, de regulă, nu conțin software care poate fi executat în mod autonom pe dispozitivul Utilizatorului.
2.5. În funcție de tipul și scopul acestora, fișierele cookie pot conține informații care nu permit identificarea directă a Utilizatorului, însă, în anumite cazuri, informațiile asociate fișierelor cookie pot fi considerate date cu caracter personal în conformitate cu legislația aplicabilă.
3. CATEGORIILE FIȘIERELOR COOKIE
3.1. În funcție de perioada de stocare, fișierele cookie pot fi:
– fișiere cookie de sesiune, care sunt utilizate pe durata sesiunii curente de accesare a Site-ului și, de regulă, sunt șterse după închiderea browserului;
– fișiere cookie persistente, care sunt păstrate pe dispozitivul Utilizatorului pentru o anumită perioadă de timp sau până la momentul ștergerii acestora de către Utilizator.
3.2. În funcție de origine, fișierele cookie pot fi:
– fișiere cookie proprii, care sunt instalate direct de Site;
– fișiere cookie ale terților, care sunt instalate de terți sau de serviciile acestora utilizate pe Site.
3.3. În funcție de scop, Site-ul poate utiliza următoarele categorii de fișiere cookie:
– fișiere cookie strict necesare sau tehnice;
– fișiere cookie funcționale;
– fișiere cookie analitice sau statistice;
– fișiere cookie de marketing sau publicitare.
4. FIȘIERE COOKIE STRICT NECESARE
4.1. Fișierele cookie strict necesare sunt necesare pentru asigurarea funcționării corecte și sigure a Site-ului și a funcțiilor sale principale.
4.2. Astfel de fișiere cookie pot fi utilizate, în special, pentru:
– asigurarea funcționării corecte a Site-ului;
– asigurarea securității Site-ului;
– păstrarea informațiilor necesare pentru funcționarea anumitor funcții;
– gestionarea sesiunii Utilizatorului;
– asigurarea accesului la anumite funcții ale contului personal sau ale contului de utilizator.
4.3. Dezactivarea fișierelor cookie strict necesare poate duce la imposibilitatea utilizării anumitor funcții ale Site-ului sau la funcționarea necorespunzătoare a Site-ului.
5. FIȘIERE COOKIE FUNCȚIONALE
5.1. Fișierele cookie funcționale permit Site-ului să rețină alegerile și setările Utilizatorului în scopul asigurării unei utilizări mai confortabile a Site-ului.
5.2. Astfel de fișiere cookie pot fi utilizate, în special, pentru păstrarea:
– limbii selectate;
– setărilor de afișare a Site-ului;
– anumitor preferințe ale Utilizatorului;
– altor setări necesare pentru îmbunătățirea experienței de utilizare.
5.3. Utilizarea fișierelor cookie funcționale se efectuează în conformitate cu cerințele aplicabile ale legislației și cu setările fișierelor cookie selectate de Utilizator.
6. FIȘIERE COOKIE ANALITICE ȘI STATISTICE
6.1. Fișierele cookie analitice și statistice sunt utilizate pentru obținerea de informații privind modul în care Utilizatorii interacționează cu Site-ul.
6.2. Astfel de fișiere cookie pot fi utilizate pentru analiza:
– numărului de vizite pe Site;
– paginilor vizitate;
– surselor din care Utilizatorii accesează Site-ul;
– duratei vizitei;
– interacțiunii Utilizatorilor cu anumite funcții ale Site-ului.
6.3. Informațiile analitice obținute sunt utilizate pentru analiza traficului, îmbunătățirea structurii, funcționalității și conținutului Site-ului, precum și pentru îmbunătățirea calității serviciilor oferite Utilizatorilor.
6.4. Site-ul poate utiliza servicii analitice furnizate de terți, inclusiv Google Analytics, în conformitate cu condițiile serviciilor respective și cu legislația aplicabilă.
6.5. Fișierele cookie analitice sunt utilizate în baza unui temei juridic corespunzător, inclusiv a consimțământului Utilizatorului, în cazul în care un astfel de consimțământ este impus de legislație.
7. FIȘIERE COOKIE DE MARKETING ȘI PUBLICITARE
7.1. Fișierele cookie de marketing și publicitare pot fi utilizate pentru analiza intereselor Utilizatorului, evaluarea eficienței campaniilor publicitare și furnizarea unor reclame care pot fi mai relevante pentru interesele Utilizatorului.
7.2. Astfel de fișiere cookie pot fi utilizate atât de Site, cât și de terți care furnizează servicii de publicitate sau analiză.
7.3. Fișierele cookie de marketing și publicitare pot fi utilizate numai în baza unui temei juridic corespunzător, inclusiv a consimțământului Utilizatorului, în cazul în care un astfel de consimțământ este impus de legislația aplicabilă.
7.4. Utilizatorul are dreptul să modifice în orice moment setările selectate anterior și să își retragă consimțământul privind utilizarea categoriilor corespunzătoare de fișiere cookie.
8. FIȘIERE COOKIE ALE TERȚILOR
8.1. Site-ul poate utiliza servicii furnizate de terți care, în cadrul prestării serviciilor respective, pot instala propriile fișiere cookie sau pot accesa informațiile conținute în astfel de fișiere.
8.2. Astfel de servicii pot include servicii analitice, publicitare, tehnice și alte servicii necesare pentru funcționarea și dezvoltarea Site-ului.
8.3. Utilizarea fișierelor cookie ale terților se efectuează în conformitate cu condițiile stabilite de terții respectivi și cu legislația aplicabilă.
8.4. Operatorul nu exercită un control direct asupra tuturor tehnologiilor și fișierelor cookie utilizate de terți independenți. Utilizatorului i se recomandă să consulte politicile de confidențialitate și politicile cookie ale serviciilor respective.
9. CONSIMȚĂMÂNTUL PRIVIND UTILIZAREA FIȘIERELOR COOKIE
9.1. La prima vizitare a Site-ului, Utilizatorului i se poate oferi posibilitatea de a consulta informațiile privind utilizarea fișierelor cookie și de a selecta setările corespunzătoare.
9.2. Utilizatorul își poate exprima consimțământul pentru utilizarea anumitor categorii de fișiere cookie care nu sunt strict necesare pentru funcționarea Site-ului.
9.3. Consimțământul Utilizatorului trebuie să fie liber exprimat, informat și exprimat printr-o acțiune activă corespunzătoare, în cazul în care această formă de consimțământ este impusă de legislația aplicabilă.
9.4. Lipsa consimțământului pentru utilizarea fișierelor cookie opționale nu trebuie să împiedice Utilizatorul să utilizeze funcțiile principale ale Site-ului, cu excepția cazurilor în care o anumită funcție necesită în mod obiectiv utilizarea tehnologiilor corespunzătoare.
9.5. Utilizatorul are dreptul să își modifice în orice moment setările sau să își retragă consimțământul acordat anterior, prin intermediul mecanismului de gestionare a fișierelor cookie disponibil pe Site, în cazul în care un astfel de mecanism este prevăzut, precum și prin intermediul setărilor browserului.
10. GESTIONAREA FIȘIERELOR COOKIE
10.1. Utilizatorul poate gestiona în mod independent utilizarea fișierelor cookie prin intermediul setărilor browserului său de internet.
10.2. În funcție de browserul utilizat, Utilizatorul poate:
– permite utilizarea tuturor fișierelor cookie;
– limita utilizarea anumitor fișiere cookie;
– bloca utilizarea fișierelor cookie;
– șterge fișierele cookie salvate anterior;
– configura ștergerea automată a fișierelor cookie după încheierea sesiunii de utilizare a browserului.
10.3. Setările pentru gestionarea fișierelor cookie sunt, de regulă, disponibile în secțiunile „Setări", „Opțiuni", „Confidențialitate" sau în secțiuni similare ale browserului de internet utilizat.
10.4. Limitarea sau dezactivarea completă a fișierelor cookie poate afecta funcționalitatea Site-ului și poate determina funcționarea necorespunzătoare sau indisponibilitatea anumitor funcții ori servicii.
11. PERIOADA DE STOCARE A FIȘIERELOR COOKIE
11.1. Perioada de stocare a fișierelor cookie depinde de tipul, scopul și parametrii tehnici ai acestora.
11.2. Fișierele cookie de sesiune sunt, de regulă, șterse după încheierea sesiunii de utilizare sau după închiderea browserului.
11.3. Fișierele cookie persistente sunt păstrate pe durata stabilită pentru fișierul cookie respectiv sau până la momentul ștergerii acestora de către Utilizator prin intermediul setărilor browserului sau al unui alt mecanism de gestionare disponibil.
11.4. Operatorul urmărește să utilizeze fișierele cookie numai pe perioada necesară pentru atingerea scopurilor pentru care acestea sunt utilizate, ținând cont de cerințele legislației aplicabile.
12. SECURITATEA ȘI CONFIDENȚIALITATEA
12.1. Fișierele cookie nu sunt programe și nu pot executa în mod autonom cod software pe dispozitivul Utilizatorului.
12.2. În anumite cazuri, informațiile asociate fișierelor cookie pot fi utilizate împreună cu alte date și pot intra sub incidența legislației privind protecția datelor cu caracter personal.
12.3. În cazul prelucrării datelor cu caracter personal asociate utilizării fișierelor cookie, Operatorul întreprinde măsurile organizatorice și tehnice corespunzătoare pentru asigurarea securității acestor date, în conformitate cu legislația aplicabilă.
12.4. Utilizatorului i se recomandă să utilizeze versiuni actualizate ale browserelor și software-ului, precum și mijloacele disponibile pentru protecția dispozitivului și a conexiunii la internet.
13. MODIFICĂRI ALE POLITICII COOKIE
13.1. Operatorul are dreptul să modifice prezenta Politică cookie în legătură cu modificările legislației, tehnologiilor utilizate, funcționalității Site-ului sau modului de prelucrare a datelor.
13.2. Versiunea actualizată a Politicii cookie este publicată pe Site.
13.3. Modificările intră în vigoare din momentul publicării versiunii actualizate pe Site, cu excepția cazului în care un alt termen este prevăzut de versiunea în vigoare a Politicii cookie sau de legislația aplicabilă.
14. DATE DE CONTACT
14.1. Pentru aspecte legate de utilizarea fișierelor cookie, prelucrarea datelor cu caracter personal sau prezenta Politică cookie, Utilizatorul poate contacta operatorul Site-ului la următoarele date de contact:
Email: [email]
Telefon: [phone]
EOT;
}
public static function defaultRu(): string
{
return <<<'EOT'
ПОЛИТИКА ИСПОЛЬЗОВАНИЯ COOKIE-ФАЙЛОВ
1. ОБЩИЕ ПОЛОЖЕНИЯ
1.1. Настоящая Политика использования cookie-файлов (далее – «Политика cookie») регулирует порядок использования cookie-файлов и аналогичных технологий на веб-сайте [site] (далее – «Сайт»).
1.2. Политика cookie применяется в соответствии с применимым законодательством Республики Молдова, включая положения Закона № 195/2024 о защите персональных данных, Закона № 284/2004 об электронной торговле и иных применимых нормативных актов, регулирующих обработку персональных данных и использование технологий хранения или доступа к информации на устройствах пользователей.
1.3. Используя Сайт, Пользователь может получать информацию об использовании cookie-файлов через соответствующее уведомление или механизм управления cookie-файлами, размещённый на Сайте.
1.4. Cookie-файлы, обработка которых является необходимой для технического функционирования Сайта или предоставления запрошенной Пользователем услуги, могут использоваться без получения отдельного согласия Пользователя в случаях, предусмотренных применимым законодательством.
1.5. Использование cookie-файлов, не являющихся строго необходимыми, включая аналитические и маркетинговые cookie-файлы, осуществляется при наличии соответствующего правового основания, в том числе согласия Пользователя, если такое согласие требуется применимым законодательством.
2. ЧТО ТАКОЕ COOKIE-ФАЙЛЫ
2.1. Cookie-файл представляет собой небольшой текстовый файл, содержащий определённую информацию, который сохраняется на компьютере, мобильном устройстве или ином устройстве Пользователя при посещении веб-сайта.
2.2. Cookie-файлы позволяют веб-сайту распознавать устройство Пользователя, сохранять отдельные настройки и обеспечивать корректное функционирование определённых функций Сайта.
2.3. Cookie-файлы могут использоваться как самим Сайтом, так и третьими лицами, услуги которых используются на Сайте.
2.4. Cookie-файлы сами по себе не являются вирусами и, как правило, не содержат программного обеспечения, которое может самостоятельно выполняться на устройстве Пользователя.
2.5. В зависимости от типа и назначения cookie-файлы могут содержать информацию, которая прямо не идентифицирует Пользователя, однако в определённых случаях информация, связанная с cookie-файлами, может рассматриваться как персональные данные в соответствии с применимым законодательством.
3. КАТЕГОРИИ COOKIE-ФАЙЛОВ
3.1. В зависимости от срока хранения cookie-файлы могут быть:
– сессионными cookie-файлами, которые используются в течение текущего сеанса посещения Сайта и, как правило, удаляются после закрытия браузера;
– постоянными cookie-файлами, которые сохраняются на устройстве Пользователя в течение определённого периода времени или до момента их удаления Пользователем.
3.2. В зависимости от происхождения cookie-файлы могут быть:
– собственными cookie-файлами, которые устанавливаются непосредственно Сайтом;
– сторонними cookie-файлами, которые устанавливаются третьими лицами или их сервисами, используемыми на Сайте.
3.3. В зависимости от назначения Сайт может использовать следующие категории cookie-файлов:
– строго необходимые или технические cookie-файлы;
– функциональные cookie-файлы;
– аналитические или статистические cookie-файлы;
– маркетинговые или рекламные cookie-файлы.
4. СТРОГО НЕОБХОДИМЫЕ COOKIE-ФАЙЛЫ
4.1. Строго необходимые cookie-файлы требуются для обеспечения корректного и безопасного функционирования Сайта и его основных функций.
4.2. Такие cookie-файлы могут использоваться, в частности, для:
– обеспечения корректной работы Сайта;
– обеспечения безопасности Сайта;
– сохранения информации, необходимой для работы отдельных функций;
– управления сеансом Пользователя;
– обеспечения доступа к отдельным функциям личного кабинета или учётной записи.
4.3. Отключение строго необходимых cookie-файлов может привести к невозможности использования отдельных функций Сайта или к некорректной работе Сайта.
5. ФУНКЦИОНАЛЬНЫЕ COOKIE-ФАЙЛЫ
5.1. Функциональные cookie-файлы позволяют Сайту запоминать выбор и настройки Пользователя с целью обеспечения более удобного использования Сайта.
5.2. Такие cookie-файлы могут использоваться, в частности, для сохранения:
– выбранного языка;
– настроек отображения Сайта;
– отдельных пользовательских предпочтений;
– иных настроек, необходимых для улучшения пользовательского опыта.
5.3. Использование функциональных cookie-файлов осуществляется в соответствии с применимыми требованиями законодательства и выбранными Пользователем настройками cookie-файлов.
6. АНАЛИТИЧЕСКИЕ И СТАТИСТИЧЕСКИЕ COOKIE-ФАЙЛЫ
6.1. Аналитические и статистические cookie-файлы используются для получения информации о том, каким образом Пользователи взаимодействуют с Сайтом.
6.2. Такие cookie-файлы могут использоваться для анализа:
– количества посещений Сайта;
– посещаемых страниц;
– источников перехода на Сайт;
– продолжительности посещения;
– взаимодействия Пользователей с отдельными функциями Сайта.
6.3. Полученная аналитическая информация используется для анализа посещаемости, улучшения структуры, функциональности и содержания Сайта, а также для повышения качества предоставляемых Пользователям услуг.
6.4. Сайт может использовать аналитические сервисы третьих лиц, включая Google Analytics, в соответствии с условиями соответствующих сервисов и применимым законодательством.
6.5. Аналитические cookie-файлы используются при наличии соответствующего правового основания, включая согласие Пользователя, если такое согласие требуется законодательством.
7. МАРКЕТИНГОВЫЕ И РЕКЛАМНЫЕ COOKIE-ФАЙЛЫ
7.1. Маркетинговые и рекламные cookie-файлы могут использоваться для анализа интересов Пользователя, оценки эффективности рекламных кампаний и предоставления рекламы, которая может быть более релевантной интересам Пользователя.
7.2. Такие cookie-файлы могут использоваться как Сайтом, так и третьими лицами, предоставляющими рекламные или аналитические услуги.
7.3. Маркетинговые и рекламные cookie-файлы могут использоваться только при наличии соответствующего правового основания, включая согласие Пользователя, если такое согласие требуется применимым законодательством.
7.4. Пользователь вправе в любое время изменить ранее выбранные настройки и отозвать согласие на использование соответствующих категорий cookie-файлов.
8. СТОРОННИЕ COOKIE-ФАЙЛЫ
8.1. Сайт может использовать сервисы третьих лиц, которые в рамках предоставления своих услуг могут устанавливать собственные cookie-файлы или получать доступ к информации, содержащейся в таких файлах.
8.2. К таким сервисам могут относиться аналитические, рекламные, технические и иные сервисы, необходимые для функционирования и развития Сайта.
8.3. Использование сторонних cookie-файлов осуществляется в соответствии с условиями соответствующих третьих лиц и применимым законодательством.
8.4. Оператор не осуществляет непосредственный контроль над всеми технологиями и cookie-файлами, используемыми независимыми третьими лицами. Пользователю рекомендуется ознакомиться с политиками конфиденциальности и cookie-политиками соответствующих сервисов.
9. СОГЛАСИЕ НА ИСПОЛЬЗОВАНИЕ COOKIE-ФАЙЛОВ
9.1. При первом посещении Сайта Пользователю может быть предоставлена возможность ознакомиться с информацией об использовании cookie-файлов и выбрать соответствующие настройки.
9.2. Пользователь может предоставить согласие на использование отдельных категорий cookie-файлов, которые не являются строго необходимыми для функционирования Сайта.
9.3. Согласие Пользователя должно быть добровольным, информированным и выраженным посредством соответствующего активного действия, если такая форма согласия требуется применимым законодательством.
9.4. Отсутствие согласия на использование необязательных cookie-файлов не должно препятствовать Пользователю использовать основные функции Сайта, за исключением случаев, когда определённая функция объективно требует использования соответствующих технологий.
9.5. Пользователь вправе в любое время изменить свои настройки или отозвать ранее предоставленное согласие посредством доступного на Сайте механизма управления cookie-файлами, если такой механизм предусмотрен, а также посредством настроек браузера.
10. УПРАВЛЕНИЕ COOKIE-ФАЙЛАМИ
10.1. Пользователь может самостоятельно управлять использованием cookie-файлов посредством настроек своего интернет-браузера.
10.2. В зависимости от используемого браузера Пользователь может:
– разрешить использование всех cookie-файлов;
– ограничить использование определённых cookie-файлов;
– заблокировать использование cookie-файлов;
– удалить ранее сохранённые cookie-файлы;
– настроить автоматическое удаление cookie-файлов после завершения сеанса работы браузера.
10.3. Настройки управления cookie-файлами обычно доступны в разделах «Настройки», «Параметры», «Конфиденциальность» или аналогичных разделах используемого интернет-браузера.
10.4. Ограничение или полное отключение cookie-файлов может повлиять на функциональность Сайта и привести к тому, что отдельные функции или сервисы будут работать некорректно либо станут недоступными.
11. СРОК ХРАНЕНИЯ COOKIE-ФАЙЛОВ
11.1. Срок хранения cookie-файлов зависит от их типа, назначения и технических параметров.
11.2. Сессионные cookie-файлы, как правило, удаляются после завершения сеанса работы или закрытия браузера.
11.3. Постоянные cookie-файлы хранятся в течение срока, установленного для соответствующего cookie-файла, либо до момента их удаления Пользователем посредством настроек браузера или иного доступного механизма управления.
11.4. Оператор стремится использовать cookie-файлы только в течение периода, необходимого для достижения целей, для которых они используются, с учётом требований применимого законодательства.
12. БЕЗОПАСНОСТЬ И КОНФИДЕНЦИАЛЬНОСТЬ
12.1. Cookie-файлы не являются программами и не могут самостоятельно запускать программный код на устройстве Пользователя.
12.2. В отдельных случаях информация, связанная с cookie-файлами, может использоваться совместно с другими данными и подпадать под действие законодательства о защите персональных данных.
12.3. В случае обработки персональных данных, связанных с использованием cookie-файлов, Оператор принимает соответствующие организационные и технические меры для обеспечения безопасности таких данных в соответствии с применимым законодательством.
12.4. Пользователю рекомендуется использовать актуальные версии браузеров и программного обеспечения, а также применять доступные средства защиты устройства и интернет-соединения.
13. ИЗМЕНЕНИЯ В ПОЛИТИКЕ COOKIE-ФАЙЛОВ
13.1. Оператор вправе вносить изменения в настоящую Политику cookie в связи с изменениями законодательства, используемых технологий, функциональности Сайта или порядка обработки данных.
13.2. Актуальная редакция Политики cookie размещается на Сайте.
13.3. Изменения вступают в силу с момента публикации обновлённой редакции на Сайте, если иной срок не предусмотрен действующей редакцией Политики cookie или применимым законодательством.
14. КОНТАКТНАЯ ИНФОРМАЦИЯ
14.1. По вопросам, связанным с использованием cookie-файлов, обработкой персональных данных или настоящей Политикой cookie, Пользователь может обратиться к оператору сайта по следующим контактным данным:
Email: [email]
Телефон: [phone]
EOT;
}
}
+10
View File
@@ -153,4 +153,14 @@ return [
'reset_title' => 'Setează o parolă nouă', 'reset_title' => 'Setează o parolă nouă',
'reset_button' => 'Setează parola', 'reset_button' => 'Setează parola',
], ],
'cookie' => [
'policy_title' => 'Politica de utilizare a fișierelor cookie',
'back' => 'Înapoi',
'banner_title' => 'Utilizăm fișiere cookie',
'banner_body' => 'Folosim module cookie pentru funcționarea site-ului și îmbunătățirea experienței. Cookies strict necesare sunt utilizate fără consimțământ (Legea nr. 195/2024).',
'read_policy' => 'Politica cookie',
'accept' => 'Acceptă toate',
'reject' => 'Doar esențiale',
],
]; ];
+10
View File
@@ -153,4 +153,14 @@ return [
'reset_title' => 'Задать новый пароль', 'reset_title' => 'Задать новый пароль',
'reset_button' => 'Установить пароль', 'reset_button' => 'Установить пароль',
], ],
'cookie' => [
'policy_title' => 'Политика использования cookie-файлов',
'back' => 'Назад',
'banner_title' => 'Мы используем cookie',
'banner_body' => 'Мы используем cookie-файлы для работы сайта и улучшения вашего опыта. Строго необходимые cookie используются без согласия (Закон № 195/2024).',
'read_policy' => 'Политика cookie',
'accept' => 'Принять все',
'reject' => 'Только необходимые',
],
]; ];
@@ -0,0 +1,90 @@
{{-- Cookie consent banner — localStorage-based, shown once per browser --}}
@php
$bannerEnabled = data_get($tenant->settings ?? [], 'cookie.banner_enabled', true);
@endphp
@if ($bannerEnabled)
<div
x-data="{
show: false,
init() {
if (!localStorage.getItem('cookie_consent')) {
this.show = true;
}
},
accept() {
localStorage.setItem('cookie_consent', 'accepted');
this.show = false;
},
reject() {
localStorage.setItem('cookie_consent', 'essential_only');
this.show = false;
}
}"
x-show="show"
x-cloak
x-transition:enter="transition ease-out duration-300"
x-transition:enter-start="opacity-0 translate-y-4"
x-transition:enter-end="opacity-100 translate-y-0"
x-transition:leave="transition ease-in duration-200"
x-transition:leave-start="opacity-100 translate-y-0"
x-transition:leave-end="opacity-0 translate-y-4"
style="
position: fixed;
bottom: 0;
left: 0;
right: 0;
z-index: 9999;
background: #1f2937;
color: #f9fafb;
padding: 16px 20px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
flex-wrap: wrap;
box-shadow: 0 -4px 20px rgba(0,0,0,.25);
font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
font-size: 13px;
line-height: 1.5;
"
>
<div style="flex:1;min-width:200px;">
<span style="font-weight:600;margin-right:6px;">🍪 {{ __('portal.cookie.banner_title') }}</span>
{{ __('portal.cookie.banner_body') }}
<a href="{{ route('cookie.policy') }}" style="color:#93c5fd;text-decoration:underline;margin-left:4px;" target="_blank" rel="noopener">
{{ __('portal.cookie.read_policy') }}
</a>
</div>
<div style="display:flex;gap:8px;flex-shrink:0;flex-wrap:wrap;">
<button
@click="reject()"
style="
padding: 8px 16px;
border: 1px solid #6b7280;
border-radius: 6px;
background: transparent;
color: #d1d5db;
cursor: pointer;
font-size: 13px;
font-weight: 500;
white-space: nowrap;
"
>{{ __('portal.cookie.reject') }}</button>
<button
@click="accept()"
style="
padding: 8px 20px;
border: none;
border-radius: 6px;
background: {{ $themeColor ?? '#3B82F6' }};
color: #fff;
cursor: pointer;
font-size: 13px;
font-weight: 600;
white-space: nowrap;
"
>{{ __('portal.cookie.accept') }}</button>
</div>
</div>
@endif
@@ -0,0 +1,55 @@
<!DOCTYPE html>
<html lang="{{ $locale }}">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>{{ __('portal.cookie.policy_title') }} — {{ $tenant?->display_name ?? $tenant?->name ?? config('app.name') }}</title>
@if ($faviconUrl ?? null)
<link rel="icon" href="{{ $faviconUrl }}">
@endif
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; color: #1f2937; background: #f3f4f6; line-height: 1.6; }
header { background: {{ $themeColor }}; color: #fff; padding: 28px 16px; text-align: center; }
header img { max-height: 48px; margin-bottom: 10px; display: block; margin-inline: auto; }
header h1 { font-size: 20px; font-weight: 700; }
.wrap { max-width: 760px; margin: 0 auto; padding: 24px 16px 64px; }
.card { background: #fff; border-radius: 12px; padding: 28px 24px; margin-top: 16px; box-shadow: 0 1px 3px rgba(0,0,0,.05); }
.card h2 { font-size: 15px; font-weight: 700; margin-bottom: 12px; color: {{ $themeColor }}; letter-spacing: .02em; }
.policy-text { font-size: 14px; white-space: pre-wrap; color: #374151; line-height: 1.7; }
.back-link { display: inline-flex; align-items: center; gap: 6px; color: {{ $themeColor }}; text-decoration: none; font-size: 14px; font-weight: 500; margin-bottom: 8px; }
.back-link:hover { opacity: .8; }
footer { text-align: center; padding: 24px 16px; color: #9ca3af; font-size: 12px; }
@media (prefers-color-scheme: dark) {
body { background: #0f172a; color: #e5e7eb; }
.card { background: #1e293b; box-shadow: none; }
.policy-text { color: #cbd5e1; }
footer { color: #64748b; }
}
</style>
</head>
<body>
<header>
@if ($logoUrl ?? null)
<img src="{{ $logoUrl }}" alt="">
@endif
<h1>{{ $tenant?->display_name ?? $tenant?->name }}</h1>
</header>
<div class="wrap">
<a href="{{ url()->previous('/') }}" class="back-link">
<svg width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" viewBox="0 0 24 24">
<path stroke-linecap="round" d="M15 19l-7-7 7-7"/>
</svg>
{{ __('portal.cookie.back') }}
</a>
<div class="card">
<h2>{{ __('portal.cookie.policy_title') }}</h2>
<p class="policy-text">{{ $policyText }}</p>
</div>
<footer>{{ __('portal.common.powered_by') }}</footer>
</div>
</body>
</html>
+6
View File
@@ -48,7 +48,9 @@
footer { background: #1f2937; color: #9ca3af; padding: 24px; text-align: center; font-size: 13px; } footer { background: #1f2937; color: #9ca3af; padding: 24px; text-align: center; font-size: 13px; }
footer a { color: #d1d5db; text-decoration: none; } footer a { color: #d1d5db; text-decoration: none; }
[x-cloak] { display: none !important; }
</style> </style>
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
</head> </head>
<body> <body>
@@ -116,5 +118,9 @@
© {{ date('Y') }} {{ $name }} · powered by AutoCRM © {{ date('Y') }} {{ $name }} · powered by AutoCRM
</footer> </footer>
@php
$tenant = app(\App\Tenancy\TenantManager::class)->current();
@endphp
@include('partials.cookie-banner')
</body> </body>
</html> </html>
+5
View File
@@ -67,6 +67,7 @@
.totals .amt { font-size: 22px; font-weight: 700; color: {{ $themeColor }}; } .totals .amt { font-size: 22px; font-weight: 700; color: {{ $themeColor }}; }
footer { text-align: center; padding: 24px 16px; color: #9ca3af; font-size: 12px; } footer { text-align: center; padding: 24px 16px; color: #9ca3af; font-size: 12px; }
[x-cloak] { display: none !important; }
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
body { background: #0f172a; color: #e5e7eb; } body { background: #0f172a; color: #e5e7eb; }
.card { background: #1e293b; box-shadow: none; } .card { background: #1e293b; box-shadow: none; }
@@ -80,6 +81,7 @@
footer { color: #64748b; } footer { color: #64748b; }
} }
</style> </style>
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
</head> </head>
<body> <body>
<header style="position:relative;"> <header style="position:relative;">
@@ -228,5 +230,8 @@
{{ __('portal.common.powered_by') }} {{ __('portal.common.powered_by') }}
</footer> </footer>
</div> </div>
@php $themeColor = $tenant->settings['theme_color'] ?? '#3B82F6'; @endphp
@include('partials.cookie-banner')
</body> </body>
</html> </html>
+4
View File
@@ -185,6 +185,10 @@ Route::controller(\App\Http\Controllers\ShopAuthController::class)->prefix('shop
Route::post('/password/reset', 'resetPassword')->name('shop.password.update')->middleware('throttle:5,1,shop-pw-reset'); Route::post('/password/reset', 'resetPassword')->name('shop.password.update')->middleware('throttle:5,1,shop-pw-reset');
}); });
// ─── Cookie policy (public, tenant-scoped via subdomain) ────────────
Route::get('/cookie-policy', [\App\Http\Controllers\CookiePolicyController::class, 'show'])
->name('cookie.policy');
// ─── Public WO tracking (no auth, tenant-scoped via subdomain) ────── // ─── Public WO tracking (no auth, tenant-scoped via subdomain) ──────
Route::get('/t/{token}', [\App\Http\Controllers\TrackingController::class, 'show']) Route::get('/t/{token}', [\App\Http\Controllers\TrackingController::class, 'show'])
->where('token', '[A-Za-z0-9]{16,32}') ->where('token', '[A-Za-z0-9]{16,32}')