Aggiunge allegati operativi al Codice Etico #28
1380
src/data/allegati-codice-etico.ts
Normal file
1380
src/data/allegati-codice-etico.ts
Normal file
File diff suppressed because it is too large
Load Diff
@ -2,7 +2,72 @@
|
|||||||
* Codice etico — riferimenti a prodotti e domini **separati in dati**:
|
* Codice etico — riferimenti a prodotti e domini **separati in dati**:
|
||||||
* aggiungere una riga a `productLines` e, se serve, un `ConformityBlock` in
|
* aggiungere una riga a `productLines` e, se serve, un `ConformityBlock` in
|
||||||
* `codiceEticoConformityBlocks` senza riscrivere la pagina intera.
|
* `codiceEticoConformityBlocks` senza riscrivere la pagina intera.
|
||||||
|
*
|
||||||
|
* ═══════════════════════════════════════════════════════════════════════════
|
||||||
|
* CONFIGURAZIONE SOCIETARIA — compilare per rendere effettivo il documento.
|
||||||
|
* ═══════════════════════════════════════════════════════════════════════════
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dati societari da personalizzare.
|
||||||
|
* Una volta compilati, il Codice Etico è formalmente effettivo.
|
||||||
|
*/
|
||||||
|
export const companyConfig = {
|
||||||
|
/** Ragione sociale ufficiale (se diversa dal marchio NexStudio) */
|
||||||
|
officialName: 'NexStudio',
|
||||||
|
/** Sede legale */
|
||||||
|
headquarters: 'Bangkok, Thailandia',
|
||||||
|
/** Partita IVA / codice fiscale thailandese */
|
||||||
|
taxId: '[DA INSERIRE]',
|
||||||
|
/** Numero registrazione società */
|
||||||
|
registrationNumber: '[DA INSERIRE]',
|
||||||
|
|
||||||
|
/** Approvatore del Codice Etico */
|
||||||
|
approver: {
|
||||||
|
/** Organo che approva (es. "Amministratore Delegato") */
|
||||||
|
role: '[DA INSERIRE — es. Amministratore Delegato]',
|
||||||
|
/** Nome e cognome del firmatario */
|
||||||
|
fullName: '[DA INSERIRE]',
|
||||||
|
/** Data di approvazione effettiva */
|
||||||
|
approvalDate: '[DA INSERIRE — es. 21 aprile 2026]',
|
||||||
|
},
|
||||||
|
|
||||||
|
/** Responsabile aggiornamenti del Codice */
|
||||||
|
updateOwner: {
|
||||||
|
role: 'Legal & Compliance, con supporto di DPO e CISO',
|
||||||
|
},
|
||||||
|
|
||||||
|
/** Governance — nomi dei ruoli chiave */
|
||||||
|
roles: {
|
||||||
|
ceo: '[DA INSERIRE]',
|
||||||
|
cto: '[DA INSERIRE]',
|
||||||
|
ciso: '[DA INSERIRE]',
|
||||||
|
dpo: '[DA INSERIRE]',
|
||||||
|
legal: '[DA INSERIRE]',
|
||||||
|
hr: '[DA INSERIRE]',
|
||||||
|
ethicsCommittee: '[DA INSERIRE o "non ancora costituito"]',
|
||||||
|
},
|
||||||
|
|
||||||
|
/** Contatti email */
|
||||||
|
contacts: {
|
||||||
|
privacy: 'privacy@nexstudio.com',
|
||||||
|
security: 'security@nexstudio.com',
|
||||||
|
ethics: 'ethics@nexstudio.com',
|
||||||
|
legal: 'legal@nexstudio.com',
|
||||||
|
hr: 'hr@nexstudio.com',
|
||||||
|
},
|
||||||
|
|
||||||
|
/** Audit e revisione */
|
||||||
|
review: {
|
||||||
|
/** Frequenza revisione del Codice */
|
||||||
|
frequency: 'minimo annuale o a fronte di mutamenti rilevanti',
|
||||||
|
/** Data ultima revisione */
|
||||||
|
lastReviewDate: '[DA INSERIRE]',
|
||||||
|
/** Data prossima revisione prevista */
|
||||||
|
nextReviewDate: '[DA INSERIRE]',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
export const codiceEtico = {
|
export const codiceEtico = {
|
||||||
productLines: [
|
productLines: [
|
||||||
{ id: 'platform' as const, name: 'Piattaforme e servizi SaaS' },
|
{ id: 'platform' as const, name: 'Piattaforme e servizi SaaS' },
|
||||||
|
|||||||
109
src/pages/allegati.astro
Normal file
109
src/pages/allegati.astro
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
---
|
||||||
|
import SubpageLayout from '../layouts/SubpageLayout.astro';
|
||||||
|
import { getAllegatiCodiceEtico } from '../data/allegati-codice-etico';
|
||||||
|
|
||||||
|
const path = Astro.url.pathname;
|
||||||
|
const localeMatch = path.match(/^\/(en|th)(\/|$)/);
|
||||||
|
const currentLocale = (localeMatch?.[1] ?? 'it') as 'it' | 'en' | 'th';
|
||||||
|
const a = getAllegatiCodiceEtico(currentLocale);
|
||||||
|
const { page, allegati } = a;
|
||||||
|
|
||||||
|
const link = 'text-sky-400/90 underline-offset-2 hover:text-sky-300 hover:underline';
|
||||||
|
|
||||||
|
const isLabeledFields = (item: unknown): item is { label: string; fields: string[] } =>
|
||||||
|
typeof item === 'object' && item !== null && 'label' in item && 'fields' in item;
|
||||||
|
|
||||||
|
const isLabeledText = (item: unknown): item is { label: string; text: string } =>
|
||||||
|
typeof item === 'object' && item !== null && 'label' in item && 'text' in item;
|
||||||
|
---
|
||||||
|
|
||||||
|
<SubpageLayout
|
||||||
|
title={page.title}
|
||||||
|
description={page.description}
|
||||||
|
heading={page.heading}
|
||||||
|
lead={page.lead}
|
||||||
|
>
|
||||||
|
<p class="mb-8 text-sm">
|
||||||
|
<a class={link} href={`/${currentLocale === 'it' ? '' : currentLocale + '/'}codice-etico`}>
|
||||||
|
{page.backLabel}
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="space-y-16">
|
||||||
|
{
|
||||||
|
allegati.map((allegato) => (
|
||||||
|
<section id={allegato.id} class="scroll-mt-8">
|
||||||
|
<h2 class="border-b border-nx-border pb-2 text-xl font-bold text-nx-fg">
|
||||||
|
{allegato.heading}
|
||||||
|
</h2>
|
||||||
|
<p class="mt-1 text-sm text-nx-muted">{allegato.description}</p>
|
||||||
|
|
||||||
|
{allegato.intro ? (
|
||||||
|
<p class="mt-4 text-sm italic text-nx-muted/90">{allegato.intro}</p>
|
||||||
|
) : null}
|
||||||
|
|
||||||
|
<div class="mt-6 space-y-6">
|
||||||
|
{
|
||||||
|
allegato.sections.map((section) => (
|
||||||
|
<div>
|
||||||
|
{section.title ? (
|
||||||
|
<h3 class="mb-3 text-base font-semibold text-nx-fg">{section.title}</h3>
|
||||||
|
) : null}
|
||||||
|
{section.intro ? (
|
||||||
|
<p class="mb-3 text-sm text-nx-muted">{section.intro}</p>
|
||||||
|
) : null}
|
||||||
|
|
||||||
|
{Array.isArray(section.content) ? (
|
||||||
|
section.content.length > 0 && typeof section.content[0] === 'string' ? (
|
||||||
|
<ul class="list-disc space-y-1.5 pl-5 text-sm leading-relaxed sm:text-base">
|
||||||
|
{(section.content as string[]).map((item) => (
|
||||||
|
<li>{item}</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
) : section.content.length > 0 && isLabeledFields(section.content[0]) ? (
|
||||||
|
<dl class="space-y-3">
|
||||||
|
{(section.content as { label: string; fields: string[] }[]).map((item) => (
|
||||||
|
<div class="border-l-2 border-nx-border pl-4">
|
||||||
|
<dt class="text-sm font-medium text-nx-fg">{item.label}</dt>
|
||||||
|
<dd class="mt-0.5 font-mono text-sm text-nx-muted">
|
||||||
|
{item.fields.join(' | ')}
|
||||||
|
</dd>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</dl>
|
||||||
|
) : section.content.length > 0 && isLabeledText(section.content[0]) ? (
|
||||||
|
<dl class="space-y-3">
|
||||||
|
{(section.content as { label: string; text: string }[]).map((item) => (
|
||||||
|
<div class="border-l-2 border-nx-border pl-4">
|
||||||
|
<dt class="text-sm font-semibold text-nx-fg">{item.label}</dt>
|
||||||
|
<dd class="mt-0.5 text-sm leading-relaxed text-nx-muted">{item.text}</dd>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</dl>
|
||||||
|
) : (
|
||||||
|
<p class="text-sm text-nx-muted">{String(section.content)}</p>
|
||||||
|
)
|
||||||
|
) : (
|
||||||
|
<p class="text-sm leading-relaxed sm:text-base">{String(section.content)}</p>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{section.note ? (
|
||||||
|
<p class="mt-3 border-l-2 border-sky-500/30 pl-4 text-sm leading-relaxed text-nx-muted">
|
||||||
|
{section.note}
|
||||||
|
</p>
|
||||||
|
) : null}
|
||||||
|
</div>
|
||||||
|
))
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{allegato.footer ? (
|
||||||
|
<p class="mt-8 border-t border-nx-border pt-4 text-sm text-nx-fg">
|
||||||
|
{allegato.footer}
|
||||||
|
</p>
|
||||||
|
) : null}
|
||||||
|
</section>
|
||||||
|
))
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</SubpageLayout>
|
||||||
@ -458,6 +458,11 @@ const link = 'text-sky-400/90 underline-offset-2 hover:text-sky-300 hover:underl
|
|||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h2 id="allegati">18. Allegati e moduli (inclusi)</h2>
|
<h2 id="allegati">18. Allegati e moduli (inclusi)</h2>
|
||||||
|
<p class="mb-4 text-sm">
|
||||||
|
<a class={link} href="/allegati">
|
||||||
|
Scarica e consulta tutti i template operativi nella pagina dedicata →
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Dichiarazione personale di adesione al Codice (da firmare in onboarding).</li>
|
<li>Dichiarazione personale di adesione al Codice (da firmare in onboarding).</li>
|
||||||
<li>Template NDA e clausole minime per fornitori e sub-processori.</li>
|
<li>Template NDA e clausole minime per fornitori e sub-processori.</li>
|
||||||
|
|||||||
5
src/pages/en/allegati.astro
Normal file
5
src/pages/en/allegati.astro
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
import Page from '../allegati.astro';
|
||||||
|
---
|
||||||
|
|
||||||
|
<Page />
|
||||||
5
src/pages/th/allegati.astro
Normal file
5
src/pages/th/allegati.astro
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
import Page from '../allegati.astro';
|
||||||
|
---
|
||||||
|
|
||||||
|
<Page />
|
||||||
Reference in New Issue
Block a user