diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index 7390adeb6..d8e180c6a 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -365,7 +365,7 @@ The auth system uses a simple, extensible approach: ┌──────────────────────────────────────────────────────────────┐ │ USER TYPES │ ├──────────────────────────────────────────────────────────────┤ -│ Regular Users │ Staff (@revamp-it.ch email) │ +│ Regular Users │ Staff (promoted by a super admin) │ │ - No roles needed │ - is_staff: true │ │ - Create content │ - staff_permissions: string[] │ │ - Content needs │ - Access admin dashboard │ @@ -384,11 +384,15 @@ The auth system uses a simple, extensible approach: ```typescript import { isStaffEmail, isSuperAdmin } from '@/lib/permissions'; -// Anyone with @revamp-it.ch email is staff -isStaffEmail('user@revamp-it.ch') // true +// Staff status is the `is_staff` DB column, granted explicitly by a super +// admin (PATCH /api/admin/users/[id]/permissions) or the HR hire flow. +// It is NEVER derived from the e-mail domain — anyone may register. +// `isStaffEmail` is COSMETIC ONLY (picks the welcome-email template). -// Super admins have full access to sensitive sections -isSuperAdmin('andreas@revamp-it.ch') // true +// Super admins have full access to sensitive sections. The DB +// (`users.is_super_admin`) is the SSOT; SUPER_ADMIN_EMAILS is a +// bootstrap floor holding only the owner, so evig can't lock itself out. +isSuperAdmin('georgy.butaev@revamp-it.ch') // true ``` ### Permission Checking @@ -443,7 +447,7 @@ session.user = { id: string, email: string, name: string | null, - isStaff: boolean, // true for @revamp-it.ch emails + isStaff: boolean, // from the is_staff DB column (admin-granted) staffPermissions: string[], // ['dashboard', 'products', ...] or ['*'] } ``` diff --git a/docs/legal/GRUENDUNGSPROTOKOLL.md b/docs/legal/GRUENDUNGSPROTOKOLL.md new file mode 100644 index 000000000..05aa51c03 --- /dev/null +++ b/docs/legal/GRUENDUNGSPROTOKOLL.md @@ -0,0 +1,108 @@ +# Protokoll der Gründungsversammlung des Vereins evig + +> **VORLAGE.** Vor der Versammlung mit den tatsächlichen Angaben ausfüllen. Nach +> der Versammlung **original handschriftlich** unterzeichnen durch die vorsitzende +> Person **und** die protokollführende Person (Merkblatt Handelsregisteramt +> Kanton Zürich). Mindestens **zwei Gründerinnen bzw. Gründer** sind erforderlich. + +--- + +**Ort:** Zürich + +**Datum / Zeit:** ______________________ + +**Vorsitz:** ______________________ + +**Protokoll:** ______________________ + +--- + +## Anwesende Gründerinnen und Gründer + +| Name, Vorname | Geburtsjahr | Wohnort | Unterschrift | +|---|---|---|---| +| | | | | +| | | | | +| | | | | + +--- + +## Traktanden + +### 1. Eröffnung und Feststellung der Beschlussfähigkeit + +Die vorsitzende Person eröffnet die Versammlung und stellt fest, dass die +anwesenden Personen den Verein zu gründen beabsichtigen und dass die +Voraussetzungen von Art. 60 ff. ZGB erfüllt sind. + +### 2. Gründungsbeschluss + +> **Beschluss:** Die Anwesenden beschliessen einstimmig die Gründung des Vereins +> **evig** mit Sitz in Zürich. + +### 3. Genehmigung der Statuten + +Die Statuten werden abschnittsweise verlesen und beraten. + +> **Beschluss:** Die vorliegenden Statuten werden einstimmig genehmigt. Sie treten +> mit sofortiger Wirkung in Kraft. + +### 4. Wahl des Vorstands + +> **Beschluss:** In den Vorstand werden für eine Amtsdauer von zwei Jahren +> einstimmig gewählt: + +| Name, Vorname | Funktion | +|---|---| +| | Präsidium | +| | Kassier / Kassierin | +| | Aktuariat | + +Die Gewählten nehmen die Wahl an (Wahlannahme, siehe auch separate +Wahlannahmeerklärungen). + +### 5. Zeichnungsberechtigung + +> **Beschluss:** Der Verein wird durch **Kollektivunterschrift zu zweien** von +> Mitgliedern des Vorstands rechtsverbindlich verpflichtet (Art. 11 der Statuten). + +### 6. Revisionsstelle + +> **Beschluss:** Auf die Bestellung einer Revisionsstelle wird verzichtet, da die +> Voraussetzungen einer Revisionspflicht nach Art. 69b ZGB nicht erfüllt sind. + +### 7. Mitgliederbeitrag + +> **Beschluss:** Der jährliche Mitgliederbeitrag wird festgelegt auf +> CHF ____________ für natürliche Personen und CHF ____________ für juristische +> Personen. + +### 8. Geschäftsjahr + +> **Beschluss:** Das erste Geschäftsjahr dauert vom Gründungsdatum bis zum +> 31. Dezember ____________. + +### 9. Weitere Beschlüsse + +> **Beschluss:** Der Vorstand wird beauftragt und ermächtigt: +> a) ein Bankkonto auf den Namen des Vereins zu eröffnen; +> b) beim Kantonalen Steueramt Zürich ein Gesuch um Steuerbefreiung wegen +> Gemeinnützigkeit zu stellen, sobald die erste Jahresrechnung vorliegt; +> c) die wirtschaftliche Tätigkeit des Vereins buchhalterisch als eigenständigen +> Betrieb zu führen, damit eine spätere Ausgliederung möglich bleibt; +> d) die Statuten, die Zusammensetzung des Vorstands sowie Jahresbericht und +> Jahresrechnung zu veröffentlichen (Art. 14 der Statuten). + +### 10. Verschiedenes + +______________________________________________________________________ + +--- + +Schluss der Versammlung: ____________ Uhr + +
+ +_____________________________      _____________________________ + +Die vorsitzende Person             Die protokollführende Person diff --git a/docs/legal/README.md b/docs/legal/README.md new file mode 100644 index 000000000..4d64ddc1d --- /dev/null +++ b/docs/legal/README.md @@ -0,0 +1,139 @@ +# evig — Gründungsunterlagen + +Draft founding documents for **evig** as a Swiss `Verein` with seat in Zürich. + +| File | What it is | +|---|---| +| `STATUTEN.md` | The statutes — drafted for tax exemption on first submission | +| `GRUENDUNGSPROTOKOLL.md` | Minutes template for the founding assembly | + +> ⚠️ **Drafts, not legal advice.** Have a Treuhandstelle or a lawyer review them +> before the founding assembly. Two items still need confirming — see +> [Open items](#open-items). + +--- + +## The strategy these documents encode + +**A gemeinnütziger Verein that runs its marketplaces as a means to its purpose, +with the commercial arm designed to be spun out into a GmbH later.** + +Why gemeinnützig rather than a commercial Verein: + +- What tax exemption costs is the right to **extract** profit. A Verein cannot + distribute profit to anyone regardless of tax status — so that freedom cannot + be used. The exemption is close to free. +- A commercial Verein runs a `kaufmännisches Gewerbe`, which makes + **Handelsregister entry mandatory** (Art. 61 Abs. 2 ZGB, Art. 90 HRegV). + Gemeinnützig keeps registration optional. +- Grants are the channel that brings money in. Most Swiss foundations require + recognised gemeinnützigkeit. +- Tax: 0% versus roughly 4.25% federal (Art. 71 DBG) plus 4% ZH simple rate + (§ 76 StG) before Steuerfuss multipliers. + +**The marketplaces are compatible.** Trading is permitted where it is +`von untergeordneter Bedeutung` and `höchstens Mittel zum Zweck` +(ESTV-Kreisschreiben Nr. 12). A marketplace that makes quality refurbished +hardware reachable *is* the purpose executing, not a side business funding it. +Revamp-IT ran exactly this model as a registered gemeinnütziger Verein; Caritas, +HEKS and the SRK all run retail operations while gemeinnützig. + +The distinction to hold on to: **given or subsidised is charitable; sold at +market to maximise margin is commercial.** Keep the Zweck idealistic in every +public statement, and be as effective as you like in execution. + +--- + +## Founding checklist + +1. **Find at least one co-founder with settled status (B / C / Swiss).** + This single step resolves four separate problems: bank KYC, Handelsregister + identity, Rechtsdomizil, and board independence for any future compensation + decision. It is the practical bottleneck, not a formality. +2. Fill in `STATUTEN.md` and `GRUENDUNGSPROTOKOLL.md`. +3. Hold the founding assembly (minimum **two** founders). +4. Sign **in original handwriting**: statutes by a board member; minutes by the + chair *and* the minute-taker. Election acceptance may be recorded in the + minutes itself — no separate declarations needed. +5. Open the bank account (see below). +6. Run the first financial year. **Keep the commercial activity as its own cost + centre from the first invoice** — a self-contained Betrieb can later be + transferred to a GmbH as a restructuring rather than a taxable asset sale. +7. At year end: apply for tax exemption with statutes, founding minutes, the + first Jahresrechnung and an activity description. + +**Skip the Handelsregister for now.** Entry is voluntary unless the Verein runs a +kaufmännisches Gewerbe, is revisionspflichtig (Art. 69b ZGB: 2 of CHF 10m balance +sheet / CHF 20m turnover / 50 FTE, two years running), or collects assets abroad +above CHF 100k. + +--- + +## Bank account + +A Verein can open an account **without** Handelsregister entry. Bring: + +- current statutes +- signed founding minutes (most banks: not older than 12 months) +- list of signatories +- official ID for each board member + +Candidates: **Alternative Bank Schweiz** (mission fit), ZKB, Raiffeisen. Apply to +two in parallel. + +**Nothing ever flows through a private account.** evig's money belongs to evig as +a separate legal person. This is a precondition for grants and for the tax +exemption, not a formality. + +--- + +## Honesty boundary + +Until the Steueramt's Verfügung actually exists: + +- no `Spendenbescheinigungen` +- no claim of recognised gemeinnützigkeit +- no UID + +`src/config/org.ts` → `ORG.legalForm` is the SSOT for this claim and currently +reads `in Gründung`. It stays that way until the Verfügung arrives. + +--- + +## Tripwires to watch + +| Trigger | Consequence | +|---|---| +| Profit > CHF 5,000 | Federal profit tax (Art. 71 DBG). Mitgliederbeiträge are not profit (Art. 66 Abs. 1 DBG) | +| Profit > CHF 10,000 / capital > CHF 100,000 | ZH cantonal + municipal tax (§ 76 Abs. 2, § 82 Abs. 2 StG) | +| Turnover > CHF 250,000 | MWST registration — the raised threshold for gemeinnützige Institutionen (Art. 10 Abs. 2 lit. c MWSTG); CHF 100,000 otherwise | +| Turnover > CHF 500,000 | Full double-entry accounting (OR 957) | +| `kaufmännisches Gewerbe` | Handelsregister entry becomes mandatory — qualitative, no threshold | + +When trading starts to dominate, that is the signal to spin out the GmbH. Art. 4 +of the statutes already permits holding the participation without amendment. + +--- + +## Open items + +1. **Is the Zurich `Branchenregelung` still in force?** It restricts work permits + for Ausweis-N holders to listed sectors. Software and NPO management are not + among them; `Entsorgung / Abfallwirtschaft` is. Source is an AWA factsheet + dated 01.01.2017 and the office was reorganised in 2023 — verify before + relying on it. → Amt für Wirtschaft, `ab@vd.zh.ch`, +41 43 259 49 49. +2. **Does the Handelsregister accept an Ausweis N under Art. 24a HRegV?** SEM + states the N `ist kein Nachweis für die Identität des Inhabers/der Inhaberin`. + → Ask the Handelsregisteramt Kanton Zürich before filing anything. + +Free advice: Rechtsberatungsstelle für Asylsuchende / Freiplatzaktion Zürich +(asylum side); vitamin B (Verein mechanics). + +--- + +## Sources + +- Merkblätter Handelsregisteramt Kanton Zürich — Neueintragung / Eintragungspflicht eines Vereins +- ESTV Kreisschreiben Nr. 12 vom 08.07.1994 (Steuerbefreiung) +- Kanton Zürich, ZStB 61.1 — Steuerbefreiung wegen Gemeinnützigkeit (Praxis ab 01.02.2024) +- Art. 60–79 ZGB · Art. 66, 71 DBG · § 61, 76, 82 StG ZH · Art. 10 MWSTG · OR 957 diff --git a/docs/legal/STATUTEN.md b/docs/legal/STATUTEN.md new file mode 100644 index 000000000..a16f568f7 --- /dev/null +++ b/docs/legal/STATUTEN.md @@ -0,0 +1,232 @@ +# Statuten des Vereins evig + +> **ENTWURF — noch nicht beschlossen.** Diese Statuten sind so formuliert, dass +> das Gesuch um Steuerbefreiung wegen Gemeinnützigkeit beim Kantonalen Steueramt +> Zürich (§ 61 lit. g StG, ESTV-Kreisschreiben Nr. 12) beim ersten Anlauf gestellt +> werden kann, und dass eine spätere Ausgliederung des kommerziellen Betriebs in +> eine GmbH **keine Statutenänderung** erfordert. +> +> Vor der Gründungsversammlung durch eine Treuhandstelle oder eine Anwältin bzw. +> einen Anwalt prüfen lassen. Offene Abklärungen siehe `README.md`. + +--- + +## I. Name, Sitz und Dauer + +### Art. 1 Name und Sitz + +1. Unter dem Namen **evig** besteht ein Verein im Sinne von Art. 60 ff. des + Schweizerischen Zivilgesetzbuches (ZGB). +2. Der Sitz des Vereins ist in Zürich. +3. Die Dauer des Vereins ist unbeschränkt. + +--- + +## II. Zweck und Mittel + +### Art. 2 Zweck + +1. Der Verein bezweckt, Menschen den Zugang zu leistungsfähiger + Informationstechnologie und zu digitaler Bildung zu ermöglichen — unabhängig + von ihren finanziellen Mitteln. +2. Er verfolgt diesen Zweck insbesondere durch: + a) die Prüfung, Instandsetzung und Weitergabe gebrauchter Geräte, damit diese + möglichst lange im Gebrauch bleiben (Kreislaufwirtschaft); + b) Reparatur-, Beratungs- und Unterstützungsangebote für Hard- und Software; + c) Bildungsangebote zur digitalen Teilhabe; + d) die Entwicklung und unentgeltliche Veröffentlichung quelloffener Software + sowie von Forschungsergebnissen als öffentlich zugängliches Gut; + e) Angebote, die Menschen mit erschwertem Zugang zum Arbeitsmarkt eine + sinnvolle Tätigkeit ermöglichen. +3. Der Verein ist gemeinnützig und sowohl konfessionell als auch politisch + neutral. **Er verfolgt keinen Erwerbszweck und erstrebt keinen Gewinn.** +4. Eine wirtschaftliche Tätigkeit ist zulässig, soweit sie der Erfüllung des + Zwecks dient und diesem untergeordnet bleibt. **Sie ist Mittel zum Zweck und + nie Selbstzweck.** +5. Die Tätigkeit des Vereins richtet sich an die Allgemeinheit und nicht bloss an + seine Mitglieder. + +### Art. 3 Mittel + +1. Zur Verfolgung seines Zwecks verfügt der Verein über: + a) Mitgliederbeiträge; + b) Zuwendungen, Spenden, Legate und Erbschaften; + c) Beiträge der öffentlichen Hand sowie von Stiftungen; + d) Erträge aus zweckgebundenen Tätigkeiten und Leistungen; + e) Erträge aus dem Vereinsvermögen. +2. Allfällige Überschüsse verbleiben vollumfänglich beim Verein und werden + ausschliesslich für den Zweck nach Art. 2 verwendet. Eine Ausschüttung an + Mitglieder oder Dritte ist ausgeschlossen. +3. Das Vereinsvermögen ist dem Zweck ausschliesslich und unwiderruflich gewidmet. + +### Art. 4 Beteiligungen + +1. Der Verein kann sich zur Erfüllung seines Zwecks an juristischen Personen + beteiligen oder solche gründen. +2. Solche Beteiligungen werden als Vermögensanlage gehalten und bleiben dem Zweck + untergeordnet. **Der Verein nimmt in den betreffenden Unternehmen keine + Geschäftsführung wahr.** +3. Erträge aus Beteiligungen fliessen vollumfänglich dem Zweck des Vereins zu. + +--- + +## III. Mitgliedschaft + +### Art. 5 Erwerb der Mitgliedschaft + +1. Mitglied werden können natürliche und juristische Personen, die den Zweck des + Vereins unterstützen. +2. Über die Aufnahme entscheidet der Vorstand. Eine Ablehnung muss nicht + begründet werden. + +### Art. 6 Erlöschen der Mitgliedschaft + +1. Die Mitgliedschaft erlischt: + a) bei natürlichen Personen durch Tod, bei juristischen Personen durch + Auflösung; + b) durch schriftlichen Austritt auf Ende eines Geschäftsjahres unter + Einhaltung einer Frist von einem Monat; + c) durch Ausschluss. +2. Der Vorstand kann ein Mitglied ausschliessen, das den Zweck des Vereins + schädigt oder seinen Verpflichtungen trotz Mahnung nicht nachkommt. Das + betroffene Mitglied kann den Entscheid innert 30 Tagen an die + Generalversammlung weiterziehen. +3. Ausgetretene oder ausgeschlossene Mitglieder haben keinen Anspruch auf das + Vereinsvermögen. + +### Art. 7 Beiträge und Haftung + +1. Die Generalversammlung legt den jährlichen Mitgliederbeitrag fest. +2. **Für die Verbindlichkeiten des Vereins haftet ausschliesslich das + Vereinsvermögen. Eine persönliche Haftung der Mitglieder sowie jede + Nachschusspflicht sind ausgeschlossen** (Art. 75a ZGB). + +--- + +## IV. Organe + +### Art. 8 Organe + +Die Organe des Vereins sind: +a) die Generalversammlung; +b) der Vorstand; +c) die Revisionsstelle, sofern eine solche bestellt wird. + +### Art. 9 Generalversammlung + +1. Die Generalversammlung ist das oberste Organ des Vereins. Sie wird jährlich + einmal ordentlich einberufen, unter Angabe der Traktanden und mit einer Frist + von mindestens 20 Tagen. +2. Ihr stehen unübertragbar folgende Befugnisse zu: + a) Genehmigung des Jahresberichts und der Jahresrechnung; + b) Entlastung des Vorstands; + c) Wahl und Abberufung der Mitglieder des Vorstands sowie einer allfälligen + Revisionsstelle; + d) Festlegung des Mitgliederbeitrags; + e) Beschluss über Entschädigungen an Organmitglieder (Art. 12); + f) Änderung der Statuten; + g) Auflösung des Vereins. +3. Jedes Mitglied hat eine Stimme. Beschlüsse werden mit der einfachen Mehrheit + der abgegebenen Stimmen gefasst; bei Stimmengleichheit entscheidet die + vorsitzende Person. +4. Eine ausserordentliche Generalversammlung wird einberufen auf Beschluss des + Vorstands oder auf schriftliches Verlangen von mindestens einem Fünftel der + Mitglieder. +5. Beschlüsse können auch auf schriftlichem oder elektronischem Weg gefasst + werden, sofern kein Mitglied die mündliche Beratung verlangt. + +### Art. 10 Vorstand + +1. **Der Vorstand besteht aus mindestens zwei Mitgliedern.** Er konstituiert sich + selbst. +2. **Wird eine Anstellung oder eine Entschädigung eines Vorstandsmitglieds + beschlossen, muss der Vorstand aus mindestens drei Mitgliedern bestehen.** +3. Die Amtsdauer beträgt zwei Jahre; Wiederwahl ist möglich. +4. Dem Vorstand stehen alle Befugnisse zu, die nicht ausdrücklich einem anderen + Organ vorbehalten sind. Er führt die laufenden Geschäfte und vertritt den + Verein nach aussen. +5. Der Vorstand ist beschlussfähig, wenn die Mehrheit seiner Mitglieder anwesend + ist. Über die Verhandlungen und Beschlüsse wird ein Protokoll geführt. + +### Art. 11 Zeichnungsberechtigung + +Der Verein wird durch **Kollektivunterschrift zu zweien** von Mitgliedern des +Vorstands rechtsverbindlich verpflichtet. + +### Art. 12 Entschädigung und Ausstand + +1. Die Mitglieder des Vorstands üben ihr Amt grundsätzlich ehrenamtlich aus. +2. **Effektive Auslagen werden gegen Beleg ersetzt. Pauschalspesen sind + ausgeschlossen.** +3. Für tatsächlich geleistete Arbeit kann eine angemessene Entschädigung + ausgerichtet werden. Sie wird von der Generalversammlung festgelegt. +4. **Betrifft ein Geschäft die persönlichen Interessen eines Mitglieds eines + Organs — insbesondere seine Anstellung oder Entschädigung — so tritt dieses in + den Ausstand. Es nimmt weder an der Beratung noch an der Beschlussfassung + teil. Der Ausstand wird protokolliert.** +5. Entschädigungen an Organmitglieder werden im Jahresbericht offengelegt. + +### Art. 13 Revisionsstelle + +1. Die Generalversammlung kann eine Revisionsstelle bestellen. +2. Sind die gesetzlichen Voraussetzungen einer Revisionspflicht erfüllt (Art. 69b + ZGB), bestellt die Generalversammlung eine Revisionsstelle nach den + massgebenden Vorschriften. + +--- + +## V. Transparenz + +### Art. 14 Offenlegung + +1. Der Verein veröffentlicht seine Statuten, die Zusammensetzung des Vorstands + sowie jährlich den Jahresbericht und die Jahresrechnung. +2. Die Veröffentlichung erfolgt in einer Form, welche spätere Änderungen + nachvollziehbar macht. +3. **Solange der Verein nicht rechtskräftig von der Steuer befreit ist, stellt er + keine Spendenbescheinigungen aus und macht keine Angaben, die eine anerkannte + Gemeinnützigkeit behaupten.** + +--- + +## VI. Schlussbestimmungen + +### Art. 15 Geschäftsjahr + +Das Geschäftsjahr entspricht dem Kalenderjahr. Das erste Geschäftsjahr endet am +31. Dezember des Gründungsjahres. + +### Art. 16 Statutenänderung + +Änderungen dieser Statuten bedürfen der Zustimmung von zwei Dritteln der an der +Generalversammlung abgegebenen Stimmen. Änderungen von Art. 2 (Zweck) und Art. 17 +(Vermögensanfall) werden dem Kantonalen Steueramt gemeldet. + +### Art. 17 Auflösung und Vermögensanfall + +1. Die Auflösung des Vereins bedarf der Zustimmung von zwei Dritteln der an der + Generalversammlung abgegebenen Stimmen. +2. **Bei Auflösung des Vereins fällt das Vermögen an eine andere von der Steuer + befreite juristische Person mit Sitz in der Schweiz, welche einen gleichen + oder ähnlichen Zweck verfolgt.** +3. **Die Rückerstattung von Einlagen an Mitglieder sowie jede andere Verteilung + des Vermögens an die Mitglieder ist ausgeschlossen.** + +### Art. 18 Inkrafttreten + +Diese Statuten wurden an der Gründungsversammlung vom ______________________ +in Zürich beschlossen und sind seither in Kraft. + +--- + +Für den Vorstand: + +
+ +_____________________________      _____________________________ + +Name, Funktion                         Name, Funktion + +> Die Statuten sind mit dem Genehmigungsdatum zu versehen und durch ein Mitglied +> des Vorstands **original handschriftlich** zu unterzeichnen (Merkblatt +> Handelsregisteramt Kanton Zürich). diff --git a/messages/de.json b/messages/de.json index de6c1f068..84cfaa376 100644 --- a/messages/de.json +++ b/messages/de.json @@ -4631,7 +4631,8 @@ "title": "Zahlen & Fakten", "moreLink": "Detaillierte Wirkungszahlen ansehen", "detailLink": "Detaillierte Wirkungszahlen ansehen", - "co2Link": "CO₂-Berechnung & Quellen" + "co2Link": "CO₂-Berechnung & Quellen", + "statutenLink": "Statuten lesen" }, "howWeWork": { "title": "Wie wir arbeiten", @@ -9021,5 +9022,118 @@ "footer": { "legal": "evig — «ewig» — ist ein gemeinnütziger Verein in Gründung in Zürich, Schweiz. Wir beanspruchen keinen anerkannten gemeinnützigen Status und stellen keine steuerlich abzugsfähigen Spendenbescheinigungen aus, solange der Verein nicht eingetragen und kantonal anerkannt ist. Alles auf dieser Seite ist das, worauf wir hinarbeiten — als Absicht formuliert, nicht als Leistungsausweis, den wir noch nicht verdient haben." } + }, + "statuten": { + "meta": { + "title": "Statuten", + "description": "Die Statuten von {orgName} — vollständig öffentlich, in allen Sprachen, mit nachvollziehbarer Änderungsgeschichte." + }, + "hero": { + "title": "Statuten", + "subtitle": "Die Grundordnung von {orgName} — offen einsehbar, bevor sie beschlossen ist." + }, + "draft": { + "title": "Entwurf — noch nicht beschlossen", + "body": "{orgName} ist in Gründung. Diese Statuten sind ein Entwurf und wurden noch von keiner Gründungsversammlung beschlossen. Sie begründen noch keinen Verein und keine Rechte. Wir veröffentlichen sie trotzdem — weil man eine Grundordnung lesen können sollte, bevor sie beschlossen wird, und nicht erst danach." + }, + "adopted": { + "title": "Beschlossen", + "body": "Diese Statuten wurden an der Gründungsversammlung vom {adoptedOn} beschlossen und sind seither in Kraft." + }, + "authoritative": { + "title": "Massgebend ist die deutsche Fassung", + "body": "Diese Übersetzung dient dem Verständnis. Rechtlich verbindlich ist ausschliesslich die deutsche Fassung." + }, + "source": { + "title": "Herkunft dieses Dokuments", + "body": "Diese Statuten liegen im öffentlichen Quellcode-Repository von {orgName}. Jede Änderung ist dort als einzelne, datierte Revision nachvollziehbar — auch rückwirkend.", + "cta": "Quelltext und Änderungsgeschichte ansehen" + }, + "toc": { + "title": "Inhalt" + }, + "articleLabel": "Art. {num}", + "sections": { + "name": "Name, Sitz und Dauer", + "zweck": "Zweck und Mittel", + "mitgliedschaft": "Mitgliedschaft", + "organe": "Organe", + "transparenz": "Transparenz", + "schluss": "Schlussbestimmungen" + }, + "articles": { + "name-sitz": { + "title": "Name und Sitz", + "body": "Unter dem Namen {orgName} besteht ein Verein im Sinne von Art. 60 ff. des Schweizerischen Zivilgesetzbuches (ZGB).\n\nDer Sitz des Vereins ist in Zürich.\n\nDie Dauer des Vereins ist unbeschränkt." + }, + "zweck": { + "title": "Zweck", + "body": "Der Verein bezweckt, Menschen den Zugang zu leistungsfähiger Informationstechnologie und zu digitaler Bildung zu ermöglichen — unabhängig von ihren finanziellen Mitteln.\n\nEr verfolgt diesen Zweck insbesondere durch:\n\na) die Prüfung, Instandsetzung und Weitergabe gebrauchter Geräte, damit diese möglichst lange im Gebrauch bleiben (Kreislaufwirtschaft);\nb) Reparatur-, Beratungs- und Unterstützungsangebote für Hard- und Software;\nc) Bildungsangebote zur digitalen Teilhabe;\nd) die Entwicklung und unentgeltliche Veröffentlichung quelloffener Software sowie von Forschungsergebnissen als öffentlich zugängliches Gut;\ne) Angebote, die Menschen mit erschwertem Zugang zum Arbeitsmarkt eine sinnvolle Tätigkeit ermöglichen.\n\nDer Verein ist gemeinnützig und sowohl konfessionell als auch politisch neutral. Er verfolgt keinen Erwerbszweck und erstrebt keinen Gewinn.\n\nEine wirtschaftliche Tätigkeit ist zulässig, soweit sie der Erfüllung des Zwecks dient und diesem untergeordnet bleibt. Sie ist Mittel zum Zweck und nie Selbstzweck.\n\nDie Tätigkeit des Vereins richtet sich an die Allgemeinheit und nicht bloss an seine Mitglieder." + }, + "mittel": { + "title": "Mittel", + "body": "Zur Verfolgung seines Zwecks verfügt der Verein über:\n\na) Mitgliederbeiträge;\nb) Zuwendungen, Spenden, Legate und Erbschaften;\nc) Beiträge der öffentlichen Hand sowie von Stiftungen;\nd) Erträge aus zweckgebundenen Tätigkeiten und Leistungen;\ne) Erträge aus dem Vereinsvermögen.\n\nAllfällige Überschüsse verbleiben vollumfänglich beim Verein und werden ausschliesslich für den Zweck nach Art. 2 verwendet. Eine Ausschüttung an Mitglieder oder Dritte ist ausgeschlossen.\n\nDas Vereinsvermögen ist dem Zweck ausschliesslich und unwiderruflich gewidmet." + }, + "beteiligungen": { + "title": "Beteiligungen", + "body": "Der Verein kann sich zur Erfüllung seines Zwecks an juristischen Personen beteiligen oder solche gründen.\n\nSolche Beteiligungen werden als Vermögensanlage gehalten und bleiben dem Zweck untergeordnet. Der Verein nimmt in den betreffenden Unternehmen keine Geschäftsführung wahr.\n\nErträge aus Beteiligungen fliessen vollumfänglich dem Zweck des Vereins zu." + }, + "erwerb": { + "title": "Erwerb der Mitgliedschaft", + "body": "Mitglied werden können natürliche und juristische Personen, die den Zweck des Vereins unterstützen.\n\nÜber die Aufnahme entscheidet der Vorstand. Eine Ablehnung muss nicht begründet werden." + }, + "erloeschen": { + "title": "Erlöschen der Mitgliedschaft", + "body": "Die Mitgliedschaft erlischt:\n\na) bei natürlichen Personen durch Tod, bei juristischen Personen durch Auflösung;\nb) durch schriftlichen Austritt auf Ende eines Geschäftsjahres unter Einhaltung einer Frist von einem Monat;\nc) durch Ausschluss.\n\nDer Vorstand kann ein Mitglied ausschliessen, das den Zweck des Vereins schädigt oder seinen Verpflichtungen trotz Mahnung nicht nachkommt. Das betroffene Mitglied kann den Entscheid innert 30 Tagen an die Generalversammlung weiterziehen.\n\nAusgetretene oder ausgeschlossene Mitglieder haben keinen Anspruch auf das Vereinsvermögen." + }, + "beitraege-haftung": { + "title": "Beiträge und Haftung", + "body": "Die Generalversammlung legt den jährlichen Mitgliederbeitrag fest.\n\nFür die Verbindlichkeiten des Vereins haftet ausschliesslich das Vereinsvermögen. Eine persönliche Haftung der Mitglieder sowie jede Nachschusspflicht sind ausgeschlossen (Art. 75a ZGB)." + }, + "organe": { + "title": "Organe", + "body": "Die Organe des Vereins sind:\n\na) die Generalversammlung;\nb) der Vorstand;\nc) die Revisionsstelle, sofern eine solche bestellt wird." + }, + "generalversammlung": { + "title": "Generalversammlung", + "body": "Die Generalversammlung ist das oberste Organ des Vereins. Sie wird jährlich einmal ordentlich einberufen, unter Angabe der Traktanden und mit einer Frist von mindestens 20 Tagen.\n\nIhr stehen unübertragbar folgende Befugnisse zu:\n\na) Genehmigung des Jahresberichts und der Jahresrechnung;\nb) Entlastung des Vorstands;\nc) Wahl und Abberufung der Mitglieder des Vorstands sowie einer allfälligen Revisionsstelle;\nd) Festlegung des Mitgliederbeitrags;\ne) Beschluss über Entschädigungen an Organmitglieder (Art. 12);\nf) Änderung der Statuten;\ng) Auflösung des Vereins.\n\nJedes Mitglied hat eine Stimme. Beschlüsse werden mit der einfachen Mehrheit der abgegebenen Stimmen gefasst; bei Stimmengleichheit entscheidet die vorsitzende Person.\n\nEine ausserordentliche Generalversammlung wird einberufen auf Beschluss des Vorstands oder auf schriftliches Verlangen von mindestens einem Fünftel der Mitglieder.\n\nBeschlüsse können auch auf schriftlichem oder elektronischem Weg gefasst werden, sofern kein Mitglied die mündliche Beratung verlangt." + }, + "vorstand": { + "title": "Vorstand", + "body": "Der Vorstand besteht aus mindestens zwei Mitgliedern. Er konstituiert sich selbst.\n\nWird eine Anstellung oder eine Entschädigung eines Vorstandsmitglieds beschlossen, muss der Vorstand aus mindestens drei Mitgliedern bestehen.\n\nDie Amtsdauer beträgt zwei Jahre; Wiederwahl ist möglich.\n\nDem Vorstand stehen alle Befugnisse zu, die nicht ausdrücklich einem anderen Organ vorbehalten sind. Er führt die laufenden Geschäfte und vertritt den Verein nach aussen.\n\nDer Vorstand ist beschlussfähig, wenn die Mehrheit seiner Mitglieder anwesend ist. Über die Verhandlungen und Beschlüsse wird ein Protokoll geführt." + }, + "zeichnungsberechtigung": { + "title": "Zeichnungsberechtigung", + "body": "Der Verein wird durch Kollektivunterschrift zu zweien von Mitgliedern des Vorstands rechtsverbindlich verpflichtet." + }, + "entschaedigung": { + "title": "Entschädigung und Ausstand", + "body": "Die Mitglieder des Vorstands üben ihr Amt grundsätzlich ehrenamtlich aus.\n\nEffektive Auslagen werden gegen Beleg ersetzt. Pauschalspesen sind ausgeschlossen.\n\nFür tatsächlich geleistete Arbeit kann eine angemessene Entschädigung ausgerichtet werden. Sie wird von der Generalversammlung festgelegt.\n\nBetrifft ein Geschäft die persönlichen Interessen eines Mitglieds eines Organs — insbesondere seine Anstellung oder Entschädigung — so tritt dieses in den Ausstand. Es nimmt weder an der Beratung noch an der Beschlussfassung teil. Der Ausstand wird protokolliert.\n\nEntschädigungen an Organmitglieder werden im Jahresbericht offengelegt." + }, + "revisionsstelle": { + "title": "Revisionsstelle", + "body": "Die Generalversammlung kann eine Revisionsstelle bestellen.\n\nSind die gesetzlichen Voraussetzungen einer Revisionspflicht erfüllt (Art. 69b ZGB), bestellt die Generalversammlung eine Revisionsstelle nach den massgebenden Vorschriften." + }, + "offenlegung": { + "title": "Offenlegung", + "body": "Der Verein veröffentlicht seine Statuten, die Zusammensetzung des Vorstands sowie jährlich den Jahresbericht und die Jahresrechnung.\n\nDie Veröffentlichung erfolgt in einer Form, welche spätere Änderungen nachvollziehbar macht.\n\nSolange der Verein nicht rechtskräftig von der Steuer befreit ist, stellt er keine Spendenbescheinigungen aus und macht keine Angaben, die eine anerkannte Gemeinnützigkeit behaupten." + }, + "geschaeftsjahr": { + "title": "Geschäftsjahr", + "body": "Das Geschäftsjahr entspricht dem Kalenderjahr. Das erste Geschäftsjahr endet am 31. Dezember des Gründungsjahres." + }, + "statutenaenderung": { + "title": "Statutenänderung", + "body": "Änderungen dieser Statuten bedürfen der Zustimmung von zwei Dritteln der an der Generalversammlung abgegebenen Stimmen. Änderungen von Art. 2 (Zweck) und Art. 17 (Vermögensanfall) werden dem Kantonalen Steueramt gemeldet." + }, + "aufloesung": { + "title": "Auflösung und Vermögensanfall", + "body": "Die Auflösung des Vereins bedarf der Zustimmung von zwei Dritteln der an der Generalversammlung abgegebenen Stimmen.\n\nBei Auflösung des Vereins fällt das Vermögen an eine andere von der Steuer befreite juristische Person mit Sitz in der Schweiz, welche einen gleichen oder ähnlichen Zweck verfolgt.\n\nDie Rückerstattung von Einlagen an Mitglieder sowie jede andere Verteilung des Vermögens an die Mitglieder ist ausgeschlossen." + }, + "inkrafttreten": { + "title": "Inkrafttreten", + "body": "Diese Statuten wurden an der Gründungsversammlung beschlossen und sind seither in Kraft." + } + } } } diff --git a/messages/en.json b/messages/en.json index 46e1e8864..30039b97e 100644 --- a/messages/en.json +++ b/messages/en.json @@ -4865,7 +4865,8 @@ "title": "Facts & Figures", "moreLink": "View detailed impact figures", "detailLink": "View detailed impact figures", - "co2Link": "CO₂ calculation & sources" + "co2Link": "CO₂ calculation & sources", + "statutenLink": "Read the statutes" }, "howWeWork": { "title": "How We Work", @@ -9004,5 +9005,118 @@ "footer": { "legal": "evig — eternal — is a non-profit association (Verein) in formation in Zürich, Switzerland. We do not claim recognised charitable status or issue tax-deductible donation receipts until the association is registered and canton-recognised. Everything on this page is what we are building toward — stated as intent, not a track record we have not yet earned." } + }, + "statuten": { + "meta": { + "title": "Statutes", + "description": "The statutes of {orgName} — fully public, in every language, with a traceable history of changes." + }, + "hero": { + "title": "Statutes", + "subtitle": "The constitution of {orgName} — open to read before it is adopted." + }, + "draft": { + "title": "Draft — not yet adopted", + "body": "{orgName} is being founded. These statutes are a draft and have not yet been adopted by any founding assembly. They do not yet establish an association or any rights. We publish them anyway — because a constitution should be readable before it is adopted, not only afterwards." + }, + "adopted": { + "title": "Adopted", + "body": "These statutes were adopted at the founding assembly of {adoptedOn} and have been in force since." + }, + "authoritative": { + "title": "The German version is authoritative", + "body": "This translation is provided for understanding. Only the German version is legally binding." + }, + "source": { + "title": "Where this document comes from", + "body": "These statutes live in the public source-code repository of {orgName}. Every change is traceable there as a single dated revision — retroactively as well.", + "cta": "View source and change history" + }, + "toc": { + "title": "Contents" + }, + "articleLabel": "Art. {num}", + "sections": { + "name": "Name, registered office and duration", + "zweck": "Purpose and resources", + "mitgliedschaft": "Membership", + "organe": "Bodies", + "transparenz": "Transparency", + "schluss": "Final provisions" + }, + "articles": { + "name-sitz": { + "title": "Name and registered office", + "body": "Under the name {orgName} there exists an association within the meaning of Art. 60 ff. of the Swiss Civil Code (ZGB).\n\nThe registered office of the association is in Zurich.\n\nThe duration of the association is unlimited." + }, + "zweck": { + "title": "Purpose", + "body": "The purpose of the association is to give people access to capable information technology and to digital education — regardless of their financial means.\n\nIt pursues this purpose in particular through:\n\na) testing, repairing and passing on used devices so that they stay in use for as long as possible (circular economy);\nb) repair, advisory and support services for hardware and software;\nc) educational offerings for digital participation;\nd) the development and free publication of open-source software and of research results as a publicly accessible good;\ne) offerings that give people with restricted access to the labour market a meaningful occupation.\n\nThe association is charitable and neutral in both religious and political terms. It does not pursue commercial ends and does not seek profit.\n\nEconomic activity is permitted insofar as it serves the fulfilment of the purpose and remains subordinate to it. It is a means to the purpose and never an end in itself.\n\nThe activity of the association is directed at the general public and not merely at its members." + }, + "mittel": { + "title": "Resources", + "body": "To pursue its purpose, the association has at its disposal:\n\na) membership fees;\nb) contributions, donations, legacies and inheritances;\nc) grants from public authorities and from foundations;\nd) income from purpose-related activities and services;\ne) income from the association's assets.\n\nAny surplus remains entirely with the association and is used exclusively for the purpose set out in Art. 2. Any distribution to members or third parties is excluded.\n\nThe assets of the association are dedicated exclusively and irrevocably to its purpose." + }, + "beteiligungen": { + "title": "Participations", + "body": "In order to fulfil its purpose, the association may hold participations in legal entities or establish such entities.\n\nSuch participations are held as an investment of assets and remain subordinate to the purpose. The association does not exercise management in the companies concerned.\n\nIncome from participations accrues entirely to the purpose of the association." + }, + "erwerb": { + "title": "Acquisition of membership", + "body": "Natural persons and legal entities that support the purpose of the association may become members.\n\nThe board decides on admission. A rejection does not have to be justified." + }, + "erloeschen": { + "title": "Termination of membership", + "body": "Membership ends:\n\na) for natural persons upon death, for legal entities upon dissolution;\nb) by written resignation at the end of a financial year, subject to one month's notice;\nc) by exclusion.\n\nThe board may exclude a member who harms the purpose of the association or who fails to meet their obligations despite a reminder. The member concerned may refer the decision to the general assembly within 30 days.\n\nMembers who have resigned or been excluded have no claim to the assets of the association." + }, + "beitraege-haftung": { + "title": "Fees and liability", + "body": "The general assembly sets the annual membership fee.\n\nOnly the assets of the association are liable for its obligations. Any personal liability of the members and any obligation to make additional contributions are excluded (Art. 75a ZGB)." + }, + "organe": { + "title": "Bodies", + "body": "The bodies of the association are:\n\na) the general assembly;\nb) the board;\nc) the auditors, if any are appointed." + }, + "generalversammlung": { + "title": "General assembly", + "body": "The general assembly is the supreme body of the association. It is convened once a year in ordinary session, stating the agenda and with at least 20 days' notice.\n\nThe following non-transferable powers are vested in it:\n\na) approval of the annual report and the annual accounts;\nb) discharge of the board;\nc) election and removal of the members of the board and of any auditors;\nd) setting the membership fee;\ne) resolutions on compensation paid to members of the bodies (Art. 12);\nf) amendment of the statutes;\ng) dissolution of the association.\n\nEach member has one vote. Resolutions are passed by a simple majority of the votes cast; in the event of a tie, the chair casts the deciding vote.\n\nAn extraordinary general assembly is convened by resolution of the board or at the written request of at least one fifth of the members.\n\nResolutions may also be passed in writing or electronically, provided that no member requests an oral deliberation." + }, + "vorstand": { + "title": "Board", + "body": "The board consists of at least two members. It constitutes itself.\n\nIf the employment or the compensation of a board member is resolved upon, the board must consist of at least three members.\n\nThe term of office is two years; re-election is possible.\n\nThe board holds all powers that are not expressly reserved to another body. It conducts the day-to-day business and represents the association externally.\n\nThe board has a quorum when the majority of its members are present. Minutes are kept of the deliberations and resolutions." + }, + "zeichnungsberechtigung": { + "title": "Signatory authority", + "body": "The association is legally bound by the joint signature of two members of the board." + }, + "entschaedigung": { + "title": "Compensation and abstention", + "body": "The members of the board hold their office on a voluntary basis as a matter of principle.\n\nActual expenses are reimbursed against receipts. Lump-sum expense allowances are excluded.\n\nAppropriate compensation may be paid for work actually performed. It is determined by the general assembly.\n\nWhere a matter concerns the personal interests of a member of a body — in particular their employment or compensation — that member abstains. They take part neither in the deliberation nor in the decision. The abstention is recorded in the minutes.\n\nCompensation paid to members of the bodies is disclosed in the annual report." + }, + "revisionsstelle": { + "title": "Auditors", + "body": "The general assembly may appoint auditors.\n\nIf the legal conditions for a statutory audit are met (Art. 69b ZGB), the general assembly appoints auditors in accordance with the applicable provisions." + }, + "offenlegung": { + "title": "Disclosure", + "body": "The association publishes its statutes, the composition of its board and, annually, the annual report and the annual accounts.\n\nPublication takes a form that makes subsequent changes traceable.\n\nAs long as the association is not legally exempt from taxation, it issues no donation receipts and makes no statements claiming recognised charitable status." + }, + "geschaeftsjahr": { + "title": "Financial year", + "body": "The financial year corresponds to the calendar year. The first financial year ends on 31 December of the year of foundation." + }, + "statutenaenderung": { + "title": "Amendment of the statutes", + "body": "Amendments to these statutes require the approval of two thirds of the votes cast at the general assembly. Amendments to Art. 2 (purpose) and Art. 17 (allocation of assets) are reported to the cantonal tax authority." + }, + "aufloesung": { + "title": "Dissolution and allocation of assets", + "body": "The dissolution of the association requires the approval of two thirds of the votes cast at the general assembly.\n\nUpon dissolution of the association, its assets pass to another tax-exempt legal entity domiciled in Switzerland that pursues the same or a similar purpose.\n\nThe repayment of contributions to members and any other distribution of the assets to the members are excluded." + }, + "inkrafttreten": { + "title": "Entry into force", + "body": "These statutes were adopted at the founding assembly and have been in force since." + } + } } } diff --git a/messages/es.json b/messages/es.json index 5c153d69d..953a6e8bf 100644 --- a/messages/es.json +++ b/messages/es.json @@ -732,7 +732,8 @@ "title": "Datos y cifras", "moreLink": "Ver cifras de impacto detalladas", "detailLink": "Ver cifras de impacto detalladas", - "co2Link": "Cálculo de CO₂ y fuentes" + "co2Link": "Cálculo de CO₂ y fuentes", + "statutenLink": "Leer los estatutos" }, "howWeWork": { "title": "Cómo trabajamos", @@ -8899,5 +8900,118 @@ "source": "Ver código fuente", "license": "Licencia {license}" } + }, + "statuten": { + "meta": { + "title": "Estatutos", + "description": "Los estatutos de {orgName} — íntegramente públicos, en todos los idiomas, con un historial de cambios verificable." + }, + "hero": { + "title": "Estatutos", + "subtitle": "El ordenamiento fundamental de {orgName} — consultable antes de ser aprobado." + }, + "draft": { + "title": "Borrador — aún no aprobado", + "body": "{orgName} está en proceso de constitución. Estos estatutos son un borrador y todavía no han sido aprobados por ninguna asamblea constitutiva. Aún no fundan una asociación ni derecho alguno. Los publicamos de todos modos — porque un ordenamiento fundamental debería poder leerse antes de ser aprobado, y no solo después." + }, + "adopted": { + "title": "Aprobados", + "body": "Estos estatutos fueron aprobados en la asamblea constitutiva del {adoptedOn} y están en vigor desde entonces." + }, + "authoritative": { + "title": "La versión alemana es la vinculante", + "body": "Esta traducción sirve para facilitar la comprensión. Jurídicamente vinculante es únicamente la versión alemana." + }, + "source": { + "title": "Procedencia de este documento", + "body": "Estos estatutos se encuentran en el repositorio público de código fuente de {orgName}. Cada modificación es allí verificable como una revisión fechada e individual — también de forma retroactiva.", + "cta": "Ver el código fuente y el historial de cambios" + }, + "toc": { + "title": "Contenido" + }, + "articleLabel": "Art. {num}", + "sections": { + "name": "Nombre, domicilio y duración", + "zweck": "Fin y medios", + "mitgliedschaft": "Condición de socio", + "organe": "Órganos", + "transparenz": "Transparencia", + "schluss": "Disposiciones finales" + }, + "articles": { + "name-sitz": { + "title": "Nombre y domicilio", + "body": "Bajo el nombre {orgName} existe una asociación en el sentido de los art. 60 y ss. del Código Civil suizo (CC).\n\nEl domicilio de la asociación se encuentra en Zúrich.\n\nLa duración de la asociación es ilimitada." + }, + "zweck": { + "title": "Fin", + "body": "La asociación tiene por fin permitir a las personas el acceso a tecnologías de la información de calidad y a la formación digital — con independencia de sus medios económicos.\n\nPersigue este fin en particular mediante:\n\na) la comprobación, reparación y entrega de aparatos usados, para que permanezcan en uso el mayor tiempo posible (economía circular);\nb) ofertas de reparación, asesoramiento y apoyo para hardware y software;\nc) ofertas formativas para la participación digital;\nd) el desarrollo y la publicación gratuita de software de código abierto así como de resultados de investigación como bien de acceso público;\ne) ofertas que permitan a personas con acceso difícil al mercado laboral desempeñar una actividad con sentido.\n\nLa asociación es de utilidad pública y neutral tanto en lo confesional como en lo político. No persigue fines lucrativos ni aspira a obtener beneficios.\n\nUna actividad económica es admisible en la medida en que sirva al cumplimiento del fin y le permanezca subordinada. Es un medio para el fin y nunca un fin en sí misma.\n\nLa actividad de la asociación se dirige a la colectividad y no únicamente a sus socios." + }, + "mittel": { + "title": "Medios", + "body": "Para perseguir su fin, la asociación dispone de:\n\na) cuotas de los socios;\nb) aportaciones, donaciones, legados y herencias;\nc) contribuciones de las administraciones públicas y de fundaciones;\nd) ingresos de actividades y prestaciones vinculadas al fin;\ne) ingresos del patrimonio de la asociación.\n\nLos eventuales excedentes quedan íntegramente en la asociación y se destinan exclusivamente al fin previsto en el art. 2. Queda excluido cualquier reparto entre socios o terceros.\n\nEl patrimonio de la asociación está destinado de forma exclusiva e irrevocable a su fin." + }, + "beteiligungen": { + "title": "Participaciones", + "body": "Para el cumplimiento de su fin, la asociación puede participar en personas jurídicas o constituirlas.\n\nTales participaciones se mantienen como inversión patrimonial y permanecen subordinadas al fin. La asociación no asume la dirección de las empresas correspondientes.\n\nLos rendimientos de las participaciones se destinan íntegramente al fin de la asociación." + }, + "erwerb": { + "title": "Adquisición de la condición de socio", + "body": "Pueden ser socios las personas físicas y jurídicas que apoyen el fin de la asociación.\n\nSobre la admisión decide la junta directiva. Una denegación no debe motivarse." + }, + "erloeschen": { + "title": "Pérdida de la condición de socio", + "body": "La condición de socio se extingue:\n\na) en las personas físicas por fallecimiento, en las personas jurídicas por disolución;\nb) por baja escrita al final de un ejercicio, con un preaviso de un mes;\nc) por exclusión.\n\nLa junta directiva puede excluir a un socio que perjudique el fin de la asociación o que, pese a requerimiento, no cumpla sus obligaciones. El socio afectado puede recurrir la decisión ante la asamblea general en un plazo de 30 días.\n\nLos socios que hayan causado baja o hayan sido excluidos no tienen derecho alguno sobre el patrimonio de la asociación." + }, + "beitraege-haftung": { + "title": "Cuotas y responsabilidad", + "body": "La asamblea general fija la cuota anual de los socios.\n\nDe las obligaciones de la asociación responde exclusivamente su patrimonio. Queda excluida toda responsabilidad personal de los socios así como cualquier obligación de aportación suplementaria (art. 75a CC)." + }, + "organe": { + "title": "Órganos", + "body": "Los órganos de la asociación son:\n\na) la asamblea general;\nb) la junta directiva;\nc) el órgano de revisión, en caso de que se designe uno." + }, + "generalversammlung": { + "title": "Asamblea general", + "body": "La asamblea general es el órgano supremo de la asociación. Se convoca una vez al año en sesión ordinaria, indicando el orden del día y con un plazo mínimo de 20 días.\n\nLe corresponden de forma indelegable las siguientes competencias:\n\na) la aprobación de la memoria anual y de las cuentas anuales;\nb) la aprobación de la gestión de la junta directiva;\nc) la elección y el cese de los miembros de la junta directiva así como de un eventual órgano de revisión;\nd) la fijación de la cuota de socio;\ne) la decisión sobre las retribuciones a los miembros de los órganos (art. 12);\nf) la modificación de los estatutos;\ng) la disolución de la asociación.\n\nCada socio dispone de un voto. Los acuerdos se adoptan por mayoría simple de los votos emitidos; en caso de empate decide la persona que preside.\n\nSe convoca una asamblea general extraordinaria por acuerdo de la junta directiva o a solicitud escrita de al menos una quinta parte de los socios.\n\nLos acuerdos pueden adoptarse también por vía escrita o electrónica, siempre que ningún socio solicite una deliberación oral." + }, + "vorstand": { + "title": "Junta directiva", + "body": "La junta directiva se compone de al menos dos miembros. Se constituye por sí misma.\n\nSi se acuerda la contratación o la retribución de un miembro de la junta directiva, esta deberá estar compuesta por al menos tres miembros.\n\nLa duración del mandato es de dos años; la reelección es posible.\n\nA la junta directiva le corresponden todas las competencias que no estén expresamente reservadas a otro órgano. Gestiona los asuntos corrientes y representa a la asociación frente a terceros.\n\nLa junta directiva puede adoptar acuerdos cuando esté presente la mayoría de sus miembros. De las deliberaciones y los acuerdos se levanta acta." + }, + "zeichnungsberechtigung": { + "title": "Derecho de firma", + "body": "La asociación queda obligada de forma jurídicamente vinculante mediante la firma colectiva de dos miembros de la junta directiva." + }, + "entschaedigung": { + "title": "Retribución y abstención", + "body": "Los miembros de la junta directiva ejercen su cargo, por principio, de forma honorífica.\n\nLos gastos efectivos se reembolsan contra justificante. Quedan excluidas las dietas a tanto alzado.\n\nPor el trabajo efectivamente prestado puede abonarse una retribución adecuada. Esta la fija la asamblea general.\n\nCuando un asunto afecte a los intereses personales de un miembro de un órgano — en particular su contratación o su retribución — este se abstiene. No participa ni en la deliberación ni en la adopción del acuerdo. La abstención se hace constar en acta.\n\nLas retribuciones a los miembros de los órganos se hacen públicas en la memoria anual." + }, + "revisionsstelle": { + "title": "Órgano de revisión", + "body": "La asamblea general puede designar un órgano de revisión.\n\nSi se cumplen los requisitos legales de una obligación de revisión (art. 69b CC), la asamblea general designa un órgano de revisión conforme a las disposiciones aplicables." + }, + "offenlegung": { + "title": "Publicidad", + "body": "La asociación publica sus estatutos, la composición de su junta directiva y, anualmente, la memoria anual y las cuentas anuales.\n\nLa publicación se realiza en una forma que hace verificables las modificaciones posteriores.\n\nMientras la asociación no esté exenta de impuestos por resolución firme, no expide certificados de donación ni realiza indicaciones que afirmen una utilidad pública reconocida." + }, + "geschaeftsjahr": { + "title": "Ejercicio", + "body": "El ejercicio coincide con el año natural. El primer ejercicio finaliza el 31 de diciembre del año de constitución." + }, + "statutenaenderung": { + "title": "Modificación de los estatutos", + "body": "Las modificaciones de estos estatutos requieren la aprobación de dos tercios de los votos emitidos en la asamblea general. Las modificaciones del art. 2 (fin) y del art. 17 (destino del patrimonio) se comunican a la administración tributaria cantonal." + }, + "aufloesung": { + "title": "Disolución y destino del patrimonio", + "body": "La disolución de la asociación requiere la aprobación de dos tercios de los votos emitidos en la asamblea general.\n\nEn caso de disolución de la asociación, el patrimonio pasa a otra persona jurídica exenta de impuestos con domicilio en Suiza que persiga un fin igual o similar.\n\nQuedan excluidos la devolución de aportaciones a los socios así como cualquier otro reparto del patrimonio entre los socios." + }, + "inkrafttreten": { + "title": "Entrada en vigor", + "body": "Estos estatutos fueron aprobados en la asamblea constitutiva y están en vigor desde entonces." + } + } } } diff --git a/messages/fr.json b/messages/fr.json index 92e4a43b6..6bf7c9075 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -4918,7 +4918,8 @@ "title": "Chiffres & faits", "moreLink": "Voir les chiffres d'impact détaillés", "detailLink": "Voir les chiffres d'impact détaillés", - "co2Link": "Calcul CO₂ & sources" + "co2Link": "Calcul CO₂ & sources", + "statutenLink": "Lire les statuts" }, "howWeWork": { "title": "Comment nous travaillons", @@ -8901,5 +8902,118 @@ "source": "Voir le code source", "license": "Licence {license}" } + }, + "statuten": { + "meta": { + "title": "Statuts", + "description": "Les statuts de {orgName} — entièrement publics, dans toutes les langues, avec un historique des modifications vérifiable." + }, + "hero": { + "title": "Statuts", + "subtitle": "La charte fondatrice de {orgName} — consultable avant même son adoption." + }, + "draft": { + "title": "Projet — pas encore adopté", + "body": "{orgName} est en cours de fondation. Ces statuts sont un projet et n'ont encore été adoptés par aucune assemblée constitutive. Ils ne fondent encore ni association ni droits. Nous les publions malgré tout — parce qu'une charte fondatrice devrait pouvoir être lue avant son adoption, et non seulement après." + }, + "adopted": { + "title": "Adoptés", + "body": "Ces statuts ont été adoptés lors de l'assemblée constitutive du {adoptedOn} et sont en vigueur depuis lors." + }, + "authoritative": { + "title": "La version allemande fait foi", + "body": "Cette traduction sert à la compréhension. Seule la version allemande est juridiquement contraignante." + }, + "source": { + "title": "Origine de ce document", + "body": "Ces statuts se trouvent dans le dépôt de code source public de {orgName}. Chaque modification y est vérifiable sous la forme d'une révision datée — rétroactivement aussi.", + "cta": "Consulter le code source et l'historique des modifications" + }, + "toc": { + "title": "Sommaire" + }, + "articleLabel": "Art. {num}", + "sections": { + "name": "Nom, siège et durée", + "zweck": "But et ressources", + "mitgliedschaft": "Sociétariat", + "organe": "Organes", + "transparenz": "Transparence", + "schluss": "Dispositions finales" + }, + "articles": { + "name-sitz": { + "title": "Nom et siège", + "body": "Sous le nom {orgName} est constituée une association au sens des art. 60 et suivants du Code civil suisse (CC).\n\nLe siège de l'association est à Zurich.\n\nLa durée de l'association est illimitée." + }, + "zweck": { + "title": "But", + "body": "L'association a pour but de permettre aux personnes d'accéder à des technologies de l'information performantes et à la formation numérique — indépendamment de leurs moyens financiers.\n\nElle poursuit ce but notamment par :\n\na) le contrôle, la remise en état et la transmission d'appareils d'occasion, afin qu'ils restent utilisés le plus longtemps possible (économie circulaire) ;\nb) des offres de réparation, de conseil et de soutien pour le matériel et les logiciels ;\nc) des offres de formation favorisant la participation numérique ;\nd) le développement et la publication gratuite de logiciels libres ainsi que de résultats de recherche, en tant que bien accessible au public ;\ne) des offres permettant à des personnes ayant un accès difficile au marché du travail d'exercer une activité utile.\n\nL'association est d'utilité publique et neutre sur les plans confessionnel et politique. Elle ne poursuit aucun but lucratif et ne recherche aucun bénéfice.\n\nUne activité économique est admise dans la mesure où elle sert la réalisation du but et lui reste subordonnée. Elle est un moyen au service du but et jamais une fin en soi.\n\nL'activité de l'association s'adresse à la collectivité et non pas uniquement à ses membres." + }, + "mittel": { + "title": "Ressources", + "body": "Pour poursuivre son but, l'association dispose :\n\na) des cotisations des membres ;\nb) de libéralités, dons, legs et successions ;\nc) de contributions des pouvoirs publics et de fondations ;\nd) de produits d'activités et de prestations liées au but ;\ne) de produits de la fortune de l'association.\n\nD'éventuels excédents restent intégralement acquis à l'association et sont utilisés exclusivement pour le but défini à l'art. 2. Toute distribution aux membres ou à des tiers est exclue.\n\nLa fortune de l'association est affectée exclusivement et irrévocablement à son but." + }, + "beteiligungen": { + "title": "Participations", + "body": "Pour réaliser son but, l'association peut prendre des participations dans des personnes morales ou en constituer.\n\nDe telles participations sont détenues à titre de placement de fortune et restent subordonnées au but. L'association n'exerce aucune direction dans les entreprises concernées.\n\nLes revenus des participations reviennent intégralement au but de l'association." + }, + "erwerb": { + "title": "Acquisition du sociétariat", + "body": "Peuvent devenir membres les personnes physiques et morales qui soutiennent le but de l'association.\n\nLe comité statue sur l'admission. Un refus n'a pas à être motivé." + }, + "erloeschen": { + "title": "Perte du sociétariat", + "body": "Le sociétariat prend fin :\n\na) pour les personnes physiques par le décès, pour les personnes morales par la dissolution ;\nb) par démission écrite pour la fin d'un exercice, moyennant un préavis d'un mois ;\nc) par exclusion.\n\nLe comité peut exclure un membre qui porte atteinte au but de l'association ou qui, malgré rappel, ne remplit pas ses obligations. Le membre concerné peut porter la décision devant l'assemblée générale dans un délai de 30 jours.\n\nLes membres démissionnaires ou exclus n'ont aucun droit sur la fortune de l'association." + }, + "beitraege-haftung": { + "title": "Cotisations et responsabilité", + "body": "L'assemblée générale fixe la cotisation annuelle des membres.\n\nSeule la fortune de l'association répond de ses engagements. Toute responsabilité personnelle des membres ainsi que toute obligation de versement supplémentaire sont exclues (art. 75a CC)." + }, + "organe": { + "title": "Organes", + "body": "Les organes de l'association sont :\n\na) l'assemblée générale ;\nb) le comité ;\nc) l'organe de révision, si un tel organe est désigné." + }, + "generalversammlung": { + "title": "Assemblée générale", + "body": "L'assemblée générale est l'organe suprême de l'association. Elle est convoquée une fois par an en séance ordinaire, avec indication de l'ordre du jour et un délai d'au moins 20 jours.\n\nLes attributions intransmissibles suivantes lui reviennent :\n\na) l'approbation du rapport annuel et des comptes annuels ;\nb) la décharge du comité ;\nc) l'élection et la révocation des membres du comité ainsi que d'un éventuel organe de révision ;\nd) la fixation de la cotisation des membres ;\ne) la décision sur les indemnités versées aux membres des organes (art. 12) ;\nf) la modification des statuts ;\ng) la dissolution de l'association.\n\nChaque membre dispose d'une voix. Les décisions sont prises à la majorité simple des voix exprimées ; en cas d'égalité, la voix de la personne qui préside est prépondérante.\n\nUne assemblée générale extraordinaire est convoquée sur décision du comité ou sur demande écrite d'un cinquième au moins des membres.\n\nLes décisions peuvent également être prises par voie écrite ou électronique, pour autant qu'aucun membre ne demande une délibération orale." + }, + "vorstand": { + "title": "Comité", + "body": "Le comité se compose d'au moins deux membres. Il se constitue lui-même.\n\nSi l'engagement ou l'indemnisation d'un membre du comité est décidé, le comité doit compter au moins trois membres.\n\nLa durée du mandat est de deux ans ; la réélection est possible.\n\nLe comité dispose de toutes les compétences qui ne sont pas expressément réservées à un autre organe. Il gère les affaires courantes et représente l'association vis-à-vis de l'extérieur.\n\nLe comité délibère valablement lorsque la majorité de ses membres est présente. Un procès-verbal des délibérations et des décisions est tenu." + }, + "zeichnungsberechtigung": { + "title": "Droit de signature", + "body": "L'association est valablement engagée par la signature collective à deux de membres du comité." + }, + "entschaedigung": { + "title": "Indemnisation et récusation", + "body": "Les membres du comité exercent leur charge en principe à titre bénévole.\n\nLes frais effectifs sont remboursés sur présentation de justificatifs. Les indemnités forfaitaires sont exclues.\n\nUne indemnité appropriée peut être versée pour le travail effectivement fourni. Elle est fixée par l'assemblée générale.\n\nLorsqu'une affaire touche aux intérêts personnels d'un membre d'un organe — en particulier son engagement ou son indemnisation — ce membre se récuse. Il ne participe ni à la délibération ni à la décision. La récusation est consignée au procès-verbal.\n\nLes indemnités versées aux membres des organes sont divulguées dans le rapport annuel." + }, + "revisionsstelle": { + "title": "Organe de révision", + "body": "L'assemblée générale peut désigner un organe de révision.\n\nSi les conditions légales d'une obligation de révision sont remplies (art. 69b CC), l'assemblée générale désigne un organe de révision conformément aux prescriptions applicables." + }, + "offenlegung": { + "title": "Publicité", + "body": "L'association publie ses statuts, la composition de son comité ainsi que, chaque année, le rapport annuel et les comptes annuels.\n\nLa publication se fait sous une forme qui rend les modifications ultérieures vérifiables.\n\nTant que l'association n'est pas exonérée d'impôt par une décision entrée en force, elle n'établit aucune attestation de don et ne fait aucune indication prétendant à une utilité publique reconnue." + }, + "geschaeftsjahr": { + "title": "Exercice", + "body": "L'exercice correspond à l'année civile. Le premier exercice se termine le 31 décembre de l'année de fondation." + }, + "statutenaenderung": { + "title": "Modification des statuts", + "body": "Les modifications des présents statuts requièrent l'approbation des deux tiers des voix exprimées à l'assemblée générale. Les modifications de l'art. 2 (but) et de l'art. 17 (dévolution de la fortune) sont annoncées à l'administration fiscale cantonale." + }, + "aufloesung": { + "title": "Dissolution et dévolution de la fortune", + "body": "La dissolution de l'association requiert l'approbation des deux tiers des voix exprimées à l'assemblée générale.\n\nEn cas de dissolution de l'association, la fortune revient à une autre personne morale exonérée d'impôt ayant son siège en Suisse et poursuivant un but identique ou analogue.\n\nLe remboursement des apports aux membres ainsi que toute autre répartition de la fortune entre les membres sont exclus." + }, + "inkrafttreten": { + "title": "Entrée en vigueur", + "body": "Les présents statuts ont été adoptés lors de l'assemblée constitutive et sont en vigueur depuis lors." + } + } } } diff --git a/messages/it.json b/messages/it.json index bd29d4d39..23522ed26 100644 --- a/messages/it.json +++ b/messages/it.json @@ -732,7 +732,8 @@ "title": "Numeri e fatti", "moreLink": "Vedi i dati di impatto dettagliati", "detailLink": "Visualizza i dati dettagliati sull'impatto", - "co2Link": "Calcolo CO₂ e fonti" + "co2Link": "Calcolo CO₂ e fonti", + "statutenLink": "Leggere lo statuto" }, "howWeWork": { "title": "Come lavoriamo", @@ -8899,5 +8900,118 @@ "source": "Vedi il codice sorgente", "license": "Licenza {license}" } + }, + "statuten": { + "meta": { + "title": "Statuto", + "description": "Lo statuto di {orgName} — interamente pubblico, in tutte le lingue, con una cronologia delle modifiche verificabile." + }, + "hero": { + "title": "Statuto", + "subtitle": "L'ordinamento fondamentale di {orgName} — consultabile prima ancora di essere approvato." + }, + "draft": { + "title": "Bozza — non ancora approvata", + "body": "{orgName} è in fase di costituzione. Questo statuto è una bozza e non è ancora stato approvato da alcuna assemblea costitutiva. Non fonda ancora né un'associazione né diritti. Lo pubblichiamo comunque — perché un ordinamento fondamentale dovrebbe poter essere letto prima di essere approvato, e non soltanto dopo." + }, + "adopted": { + "title": "Approvato", + "body": "Questo statuto è stato approvato dall'assemblea costitutiva del {adoptedOn} ed è da allora in vigore." + }, + "authoritative": { + "title": "Fa fede la versione tedesca", + "body": "Questa traduzione serve alla comprensione. Giuridicamente vincolante è unicamente la versione tedesca." + }, + "source": { + "title": "Provenienza di questo documento", + "body": "Questo statuto si trova nel repository pubblico del codice sorgente di {orgName}. Ogni modifica è lì verificabile come singola revisione datata — anche retroattivamente.", + "cta": "Consultare il codice sorgente e la cronologia delle modifiche" + }, + "toc": { + "title": "Indice" + }, + "articleLabel": "Art. {num}", + "sections": { + "name": "Nome, sede e durata", + "zweck": "Scopo e mezzi", + "mitgliedschaft": "Qualità di socio", + "organe": "Organi", + "transparenz": "Trasparenza", + "schluss": "Disposizioni finali" + }, + "articles": { + "name-sitz": { + "title": "Nome e sede", + "body": "Sotto il nome {orgName} esiste un'associazione ai sensi degli art. 60 segg. del Codice civile svizzero (CC).\n\nLa sede dell'associazione è a Zurigo.\n\nLa durata dell'associazione è illimitata." + }, + "zweck": { + "title": "Scopo", + "body": "L'associazione ha lo scopo di consentire alle persone l'accesso a tecnologie dell'informazione performanti e alla formazione digitale — indipendentemente dai loro mezzi finanziari.\n\nPersegue questo scopo in particolare mediante:\n\na) la verifica, la riparazione e la cessione di apparecchi usati, affinché restino in uso il più a lungo possibile (economia circolare);\nb) offerte di riparazione, consulenza e supporto per hardware e software;\nc) offerte formative per la partecipazione digitale;\nd) lo sviluppo e la pubblicazione gratuita di software open source nonché di risultati di ricerca quale bene accessibile al pubblico;\ne) offerte che permettono a persone con accesso difficoltoso al mercato del lavoro di svolgere un'attività significativa.\n\nL'associazione è di pubblica utilità e neutrale sia sul piano confessionale sia su quello politico. Non persegue scopi di lucro e non mira a realizzare utili.\n\nUn'attività economica è ammessa nella misura in cui serve all'adempimento dello scopo e gli resta subordinata. È un mezzo per lo scopo e mai un fine in sé.\n\nL'attività dell'associazione è rivolta alla collettività e non soltanto ai suoi soci." + }, + "mittel": { + "title": "Mezzi", + "body": "Per perseguire il proprio scopo l'associazione dispone di:\n\na) quote sociali;\nb) elargizioni, donazioni, legati ed eredità;\nc) contributi dell'ente pubblico e di fondazioni;\nd) proventi da attività e prestazioni vincolate allo scopo;\ne) proventi dal patrimonio dell'associazione.\n\nEventuali eccedenze restano integralmente all'associazione e sono impiegate esclusivamente per lo scopo di cui all'art. 2. Ogni distribuzione ai soci o a terzi è esclusa.\n\nIl patrimonio dell'associazione è destinato in modo esclusivo e irrevocabile al suo scopo." + }, + "beteiligungen": { + "title": "Partecipazioni", + "body": "Per l'adempimento del proprio scopo l'associazione può assumere partecipazioni in persone giuridiche o costituirne.\n\nTali partecipazioni sono detenute quale investimento patrimoniale e restano subordinate allo scopo. L'associazione non assume la direzione nelle imprese interessate.\n\nI proventi delle partecipazioni affluiscono integralmente allo scopo dell'associazione." + }, + "erwerb": { + "title": "Acquisizione della qualità di socio", + "body": "Possono diventare soci le persone fisiche e giuridiche che sostengono lo scopo dell'associazione.\n\nSull'ammissione decide il comitato. Un rifiuto non deve essere motivato." + }, + "erloeschen": { + "title": "Estinzione della qualità di socio", + "body": "La qualità di socio si estingue:\n\na) per le persone fisiche con la morte, per le persone giuridiche con lo scioglimento;\nb) per dimissioni scritte alla fine di un esercizio, con un preavviso di un mese;\nc) per esclusione.\n\nIl comitato può escludere un socio che danneggia lo scopo dell'associazione o che, nonostante diffida, non adempie ai propri obblighi. Il socio interessato può deferire la decisione all'assemblea generale entro 30 giorni.\n\nI soci dimissionari o esclusi non hanno alcun diritto sul patrimonio dell'associazione." + }, + "beitraege-haftung": { + "title": "Quote e responsabilità", + "body": "L'assemblea generale stabilisce la quota sociale annuale.\n\nPer gli impegni dell'associazione risponde esclusivamente il patrimonio sociale. Ogni responsabilità personale dei soci nonché ogni obbligo di versamento suppletivo sono esclusi (art. 75a CC)." + }, + "organe": { + "title": "Organi", + "body": "Gli organi dell'associazione sono:\n\na) l'assemblea generale;\nb) il comitato;\nc) l'ufficio di revisione, se ne viene designato uno." + }, + "generalversammlung": { + "title": "Assemblea generale", + "body": "L'assemblea generale è l'organo supremo dell'associazione. È convocata in seduta ordinaria una volta all'anno, con indicazione dell'ordine del giorno e con un termine di almeno 20 giorni.\n\nLe spettano le seguenti competenze intrasmissibili:\n\na) l'approvazione del rapporto annuale e del conto annuale;\nb) il discarico al comitato;\nc) l'elezione e la revoca dei membri del comitato nonché di un eventuale ufficio di revisione;\nd) la determinazione della quota sociale;\ne) la decisione sulle indennità ai membri degli organi (art. 12);\nf) la modifica dello statuto;\ng) lo scioglimento dell'associazione.\n\nOgni socio dispone di un voto. Le decisioni sono prese a maggioranza semplice dei voti espressi; in caso di parità decide la persona che presiede.\n\nUn'assemblea generale straordinaria è convocata su decisione del comitato o su richiesta scritta di almeno un quinto dei soci.\n\nLe decisioni possono essere prese anche per via scritta o elettronica, purché nessun socio chieda una deliberazione orale." + }, + "vorstand": { + "title": "Comitato", + "body": "Il comitato si compone di almeno due membri. Si costituisce autonomamente.\n\nSe viene deciso l'assunzione o l'indennizzo di un membro del comitato, il comitato deve constare di almeno tre membri.\n\nLa durata del mandato è di due anni; la rielezione è possibile.\n\nAl comitato spettano tutte le competenze che non sono espressamente riservate a un altro organo. Gestisce gli affari correnti e rappresenta l'associazione verso l'esterno.\n\nIl comitato delibera validamente quando è presente la maggioranza dei suoi membri. Delle deliberazioni e delle decisioni è tenuto un verbale." + }, + "zeichnungsberechtigung": { + "title": "Diritto di firma", + "body": "L'associazione è validamente impegnata dalla firma collettiva a due di membri del comitato." + }, + "entschaedigung": { + "title": "Indennità e ricusazione", + "body": "I membri del comitato esercitano la loro carica di principio a titolo onorifico.\n\nLe spese effettive sono rimborsate contro giustificativo. Le indennità forfettarie sono escluse.\n\nPer il lavoro effettivamente prestato può essere versata un'indennità adeguata. Essa è stabilita dall'assemblea generale.\n\nSe un affare concerne gli interessi personali di un membro di un organo — in particolare la sua assunzione o la sua indennità — questi si ricusa. Non partecipa né alla deliberazione né alla decisione. La ricusazione è messa a verbale.\n\nLe indennità ai membri degli organi sono rese note nel rapporto annuale." + }, + "revisionsstelle": { + "title": "Ufficio di revisione", + "body": "L'assemblea generale può designare un ufficio di revisione.\n\nSe sono adempiute le condizioni legali di un obbligo di revisione (art. 69b CC), l'assemblea generale designa un ufficio di revisione secondo le prescrizioni applicabili." + }, + "offenlegung": { + "title": "Pubblicità", + "body": "L'associazione pubblica il proprio statuto, la composizione del comitato nonché, annualmente, il rapporto annuale e il conto annuale.\n\nLa pubblicazione avviene in una forma che rende verificabili le modifiche successive.\n\nFinché l'associazione non è esentata dalle imposte con decisione cresciuta in giudicato, non rilascia attestazioni di donazione e non fornisce indicazioni che affermino una pubblica utilità riconosciuta." + }, + "geschaeftsjahr": { + "title": "Esercizio", + "body": "L'esercizio corrisponde all'anno civile. Il primo esercizio termina il 31 dicembre dell'anno di costituzione." + }, + "statutenaenderung": { + "title": "Modifica dello statuto", + "body": "Le modifiche del presente statuto richiedono l'approvazione di due terzi dei voti espressi in assemblea generale. Le modifiche dell'art. 2 (scopo) e dell'art. 17 (devoluzione del patrimonio) sono comunicate all'amministrazione cantonale delle contribuzioni." + }, + "aufloesung": { + "title": "Scioglimento e devoluzione del patrimonio", + "body": "Lo scioglimento dell'associazione richiede l'approvazione di due terzi dei voti espressi in assemblea generale.\n\nIn caso di scioglimento dell'associazione il patrimonio è devoluto a un'altra persona giuridica esente da imposte con sede in Svizzera che persegue uno scopo uguale o analogo.\n\nLa restituzione dei conferimenti ai soci nonché ogni altra ripartizione del patrimonio fra i soci sono escluse." + }, + "inkrafttreten": { + "title": "Entrata in vigore", + "body": "Il presente statuto è stato approvato dall'assemblea costitutiva ed è da allora in vigore." + } + } } } diff --git a/messages/ja.json b/messages/ja.json index 7e1f4eeb1..7dff620fc 100644 --- a/messages/ja.json +++ b/messages/ja.json @@ -732,7 +732,8 @@ "title": "Facts & Figures", "moreLink": "詳細な影響データを見る", "detailLink": "View detailed impact figures", - "co2Link": "CO₂の計算と出典" + "co2Link": "CO₂の計算と出典", + "statutenLink": "定款を読む" }, "howWeWork": { "title": "How We Work", @@ -8899,5 +8900,118 @@ "source": "ソースを見る", "license": "{license} ライセンス" } + }, + "statuten": { + "meta": { + "title": "定款", + "description": "{orgName} の定款 — 全言語で完全に公開し、変更履歴を追跡できる形で掲載しています。" + }, + "hero": { + "title": "定款", + "subtitle": "{orgName} の基本規程 — 議決される前から公開しています。" + }, + "draft": { + "title": "草案 — まだ議決されていません", + "body": "{orgName} は設立準備中です。この定款は草案であり、設立総会でまだ議決されていません。したがって、法人も権利も生じていません。それでも公開するのは、基本規程は議決された後ではなく、議決される前に読めるべきだと考えるからです。" + }, + "adopted": { + "title": "議決済み", + "body": "この定款は {adoptedOn} の設立総会で議決され、以後効力を有しています。" + }, + "authoritative": { + "title": "基準となるのはドイツ語版です", + "body": "この翻訳は理解を助けるためのものです。法的な拘束力を持つのはドイツ語版のみです。" + }, + "source": { + "title": "この文書の出所", + "body": "この定款は {orgName} の公開ソースコードリポジトリに置かれています。すべての変更は、日付の付いた個別のリビジョンとして — さかのぼっても — 追跡できます。", + "cta": "ソースと変更履歴を見る" + }, + "toc": { + "title": "目次" + }, + "articleLabel": "第{num}条", + "sections": { + "name": "名称、所在地および存続期間", + "zweck": "目的および財源", + "mitgliedschaft": "会員", + "organe": "機関", + "transparenz": "透明性", + "schluss": "最終規定" + }, + "articles": { + "name-sitz": { + "title": "名称および所在地", + "body": "{orgName} の名称のもとに、スイス民法典(ZGB)第60条以下にいう社団を設立する。\n\n本会の所在地はチューリッヒとする。\n\n本会の存続期間は無期限とする。" + }, + "zweck": { + "title": "目的", + "body": "本会は、経済的な事情にかかわらず、人々が高性能な情報技術とデジタル教育にアクセスできるようにすることを目的とする。\n\n本会は、とりわけ次の手段によりこの目的を追求する。\n\na) 中古機器をできるだけ長く使い続けられるようにするための検査、修理および譲渡(循環型経済)\nb) ハードウェアおよびソフトウェアに関する修理、相談および支援の提供\nc) デジタル参加のための教育の提供\nd) オープンソースソフトウェアおよび研究成果を、公共に開かれた財として開発し無償で公開すること\ne) 労働市場へのアクセスが困難な人々に意味のある活動の機会を与える取り組み\n\n本会は公益を目的とし、宗教的にも政治的にも中立である。営利を目的とせず、利益の獲得を目指さない。\n\n経済活動は、目的の達成に資し、かつ目的に従属する限りにおいて認められる。それは目的のための手段であり、決して自己目的ではない。\n\n本会の活動は、会員のみならず社会一般に向けられる。" + }, + "mittel": { + "title": "財源", + "body": "本会は、目的の追求のため次の財源を有する。\n\na) 会費\nb) 寄付、贈与、遺贈および相続\nc) 公的機関および財団からの助成\nd) 目的に即した活動および役務からの収入\ne) 本会財産からの収入\n\n剰余が生じた場合は、その全額が本会に留保され、専ら第2条の目的のために使用される。会員または第三者への分配は認められない。\n\n本会の財産は、その目的に専属的かつ撤回不能に充てられる。" + }, + "beteiligungen": { + "title": "出資・持分", + "body": "本会は、目的の達成のため法人に出資し、または法人を設立することができる。\n\nかかる持分は財産運用として保有され、目的に従属するものとする。本会は当該企業の業務執行を行わない。\n\n持分から生じる収益は、その全額が本会の目的に充てられる。" + }, + "erwerb": { + "title": "会員資格の取得", + "body": "本会の目的を支持する自然人および法人は、会員となることができる。\n\n入会については理事会が決定する。拒否について理由を示す必要はない。" + }, + "erloeschen": { + "title": "会員資格の喪失", + "body": "会員資格は次の場合に消滅する。\n\na) 自然人にあっては死亡により、法人にあっては解散により\nb) 1か月の予告期間を守った、事業年度末をもってする書面による退会により\nc) 除名により\n\n理事会は、本会の目的を害し、または督促にもかかわらず義務を履行しない会員を除名することができる。当該会員は、30日以内に総会へこの決定の再審を求めることができる。\n\n退会しまたは除名された会員は、本会財産に対していかなる請求権も有しない。" + }, + "beitraege-haftung": { + "title": "会費および責任", + "body": "総会は年会費を定める。\n\n本会の債務については、本会財産のみが責任を負う。会員の個人的責任および追加拠出義務はいずれも排除される(ZGB第75a条)。" + }, + "organe": { + "title": "機関", + "body": "本会の機関は次のとおりとする。\n\na) 総会\nb) 理事会\nc) 監査機関(設置される場合)" + }, + "generalversammlung": { + "title": "総会", + "body": "総会は本会の最高機関である。定時総会は年1回、議題を示し、少なくとも20日の期間をおいて招集される。\n\n総会は、次の事項について委任できない権限を有する。\n\na) 年次報告書および年次計算書類の承認\nb) 理事会の責任解除\nc) 理事会構成員および監査機関を置く場合はその選任および解任\nd) 会費の決定\ne) 機関構成員への報酬に関する決議(第12条)\nf) 定款の変更\ng) 本会の解散\n\n各会員は1個の議決権を有する。決議は投じられた票の単純多数で成立する。可否同数の場合は議長が決する。\n\n臨時総会は、理事会の決議により、または会員の5分の1以上の書面による請求により招集される。\n\n決議は、いずれの会員も口頭による審議を求めない限り、書面または電子的方法によっても行うことができる。" + }, + "vorstand": { + "title": "理事会", + "body": "理事会は2名以上の構成員からなる。理事会は自ら構成を定める。\n\n理事会構成員の雇用または報酬が決議される場合、理事会は3名以上で構成されなければならない。\n\n任期は2年とし、再任を妨げない。\n\n理事会は、他の機関に明示的に留保されていないすべての権限を有する。日常業務を執行し、対外的に本会を代表する。\n\n理事会は、構成員の過半数が出席するときに決議することができる。審議および決議については議事録を作成する。" + }, + "zeichnungsberechtigung": { + "title": "署名権", + "body": "本会は、理事会構成員2名の共同署名によって法的に義務を負う。" + }, + "entschaedigung": { + "title": "報酬および回避", + "body": "理事会構成員は、原則として無報酬でその職務を行う。\n\n実費は証憑と引換えに償還される。定額の経費支給は認められない。\n\n実際に提供された労務に対しては、相当な報酬を支払うことができる。その額は総会が定める。\n\n案件が機関構成員の個人的利益(とりわけその雇用または報酬)に関わる場合、当該構成員は回避する。その者は審議にも決議にも加わらない。回避は議事録に記載する。\n\n機関構成員への報酬は年次報告書において開示される。" + }, + "revisionsstelle": { + "title": "監査機関", + "body": "総会は監査機関を設置することができる。\n\n法律上の監査義務の要件が満たされる場合(ZGB第69b条)、総会は適用される規定に従って監査機関を設置する。" + }, + "offenlegung": { + "title": "情報開示", + "body": "本会は、定款、理事会の構成、ならびに毎年の年次報告書および年次計算書類を公開する。\n\n公開は、後の変更を追跡できる形式で行う。\n\n本会が確定的に免税とされていない間は、寄付証明書を発行せず、公益性が承認されていると主張する表示も行わない。" + }, + "geschaeftsjahr": { + "title": "事業年度", + "body": "事業年度は暦年とする。最初の事業年度は設立年の12月31日に終了する。" + }, + "statutenaenderung": { + "title": "定款の変更", + "body": "本定款の変更には、総会で投じられた票の3分の2の同意を要する。第2条(目的)および第17条(残余財産の帰属)の変更は、州税務当局に届け出る。" + }, + "aufloesung": { + "title": "解散および残余財産の帰属", + "body": "本会の解散には、総会で投じられた票の3分の2の同意を要する。\n\n本会が解散した場合、その財産は、同一または類似の目的を追求する、スイスに所在する他の免税法人に帰属する。\n\n会員への出資の払戻しその他会員への財産の分配は、いずれも認められない。" + }, + "inkrafttreten": { + "title": "施行", + "body": "本定款は設立総会において議決され、以後効力を有する。" + } + } } } diff --git a/messages/ko.json b/messages/ko.json index d13c1e357..18b4b9f0c 100644 --- a/messages/ko.json +++ b/messages/ko.json @@ -732,7 +732,8 @@ "title": "Facts & Figures", "moreLink": "상세 영향 수치 보기", "detailLink": "View detailed impact figures", - "co2Link": "CO₂ 계산 및 출처" + "co2Link": "CO₂ 계산 및 출처", + "statutenLink": "정관 읽기" }, "howWeWork": { "title": "How We Work", @@ -8899,5 +8900,118 @@ "source": "소스 보기", "license": "{license} 라이선스" } + }, + "statuten": { + "meta": { + "title": "정관", + "description": "{orgName}의 정관 — 모든 언어로 전면 공개되며, 변경 이력을 추적할 수 있습니다." + }, + "hero": { + "title": "정관", + "subtitle": "{orgName}의 기본 규정 — 의결되기 전부터 공개합니다." + }, + "draft": { + "title": "초안 — 아직 의결되지 않음", + "body": "{orgName}은 설립 준비 중입니다. 이 정관은 초안이며 아직 어떤 창립총회에서도 의결되지 않았습니다. 따라서 아직 법인도 권리도 성립하지 않았습니다. 그럼에도 공개하는 이유는, 기본 규정은 의결된 뒤가 아니라 의결되기 전에 읽을 수 있어야 한다고 보기 때문입니다." + }, + "adopted": { + "title": "의결됨", + "body": "이 정관은 {adoptedOn} 창립총회에서 의결되었으며 그 이후 효력을 가집니다." + }, + "authoritative": { + "title": "독일어본이 기준입니다", + "body": "이 번역은 이해를 돕기 위한 것입니다. 법적 구속력을 갖는 것은 오직 독일어본입니다." + }, + "source": { + "title": "이 문서의 출처", + "body": "이 정관은 {orgName}의 공개 소스코드 저장소에 보관되어 있습니다. 모든 변경은 날짜가 기록된 개별 리비전으로 — 소급해서도 — 추적할 수 있습니다.", + "cta": "소스와 변경 이력 보기" + }, + "toc": { + "title": "목차" + }, + "articleLabel": "제{num}조", + "sections": { + "name": "명칭, 소재지 및 존속기간", + "zweck": "목적 및 재원", + "mitgliedschaft": "회원", + "organe": "기관", + "transparenz": "투명성", + "schluss": "부칙" + }, + "articles": { + "name-sitz": { + "title": "명칭 및 소재지", + "body": "{orgName}이라는 명칭으로 스위스 민법(ZGB) 제60조 이하에서 정하는 사단을 둔다.\n\n본회의 소재지는 취리히로 한다.\n\n본회의 존속기간은 제한하지 아니한다." + }, + "zweck": { + "title": "목적", + "body": "본회는 재정 형편과 무관하게 사람들이 성능 있는 정보기술과 디지털 교육에 접근할 수 있도록 하는 것을 목적으로 한다.\n\n본회는 특히 다음의 방법으로 이 목적을 추구한다.\n\na) 중고 기기가 가능한 한 오래 사용될 수 있도록 점검·수리하고 인계하는 일(순환경제)\nb) 하드웨어 및 소프트웨어에 대한 수리·상담·지원의 제공\nc) 디지털 참여를 위한 교육의 제공\nd) 오픈소스 소프트웨어 및 연구 성과를 공공에 열린 자산으로 개발하고 무상으로 공개하는 일\ne) 노동시장 접근이 어려운 사람들에게 의미 있는 활동의 기회를 제공하는 일\n\n본회는 공익을 목적으로 하며 종교적으로도 정치적으로도 중립이다. 영리를 목적으로 하지 아니하며 이익을 추구하지 아니한다.\n\n경제활동은 목적의 달성에 기여하고 목적에 종속되는 범위에서 허용된다. 그것은 목적을 위한 수단일 뿐 결코 그 자체가 목적이 아니다.\n\n본회의 활동은 회원에게만이 아니라 사회 일반을 향한다." + }, + "mittel": { + "title": "재원", + "body": "본회는 목적의 추구를 위하여 다음의 재원을 가진다.\n\na) 회비\nb) 기부, 증여, 유증 및 상속\nc) 공공기관 및 재단의 지원금\nd) 목적에 부합하는 활동 및 용역에서 발생하는 수입\ne) 본회 재산에서 발생하는 수입\n\n잉여가 발생하는 경우 그 전액은 본회에 유보되며 오로지 제2조의 목적을 위하여 사용된다. 회원 또는 제3자에 대한 분배는 허용되지 아니한다.\n\n본회의 재산은 그 목적에 배타적이고 철회 불가능하게 귀속된다." + }, + "beteiligungen": { + "title": "출자 및 지분", + "body": "본회는 목적의 달성을 위하여 법인에 출자하거나 법인을 설립할 수 있다.\n\n그러한 지분은 재산 운용으로서 보유되며 목적에 종속된다. 본회는 해당 기업의 업무집행을 맡지 아니한다.\n\n지분에서 발생하는 수익은 전액 본회의 목적에 사용된다." + }, + "erwerb": { + "title": "회원자격의 취득", + "body": "본회의 목적을 지지하는 자연인 및 법인은 회원이 될 수 있다.\n\n입회는 이사회가 결정한다. 거부에 대하여 이유를 밝힐 필요는 없다." + }, + "erloeschen": { + "title": "회원자격의 상실", + "body": "회원자격은 다음의 경우에 소멸한다.\n\na) 자연인은 사망으로, 법인은 해산으로\nb) 1개월의 기간을 두고 회계연도 말일자로 하는 서면 탈퇴로\nc) 제명으로\n\n이사회는 본회의 목적을 해하거나 최고에도 불구하고 의무를 이행하지 아니하는 회원을 제명할 수 있다. 해당 회원은 30일 이내에 그 결정을 총회에 회부할 수 있다.\n\n탈퇴하거나 제명된 회원은 본회 재산에 대하여 어떠한 청구권도 가지지 아니한다." + }, + "beitraege-haftung": { + "title": "회비 및 책임", + "body": "총회는 연회비를 정한다.\n\n본회의 채무에 대하여는 본회의 재산만이 책임을 진다. 회원의 개인적 책임 및 추가출자의무는 배제된다(ZGB 제75a조)." + }, + "organe": { + "title": "기관", + "body": "본회의 기관은 다음과 같다.\n\na) 총회\nb) 이사회\nc) 감사기관(설치하는 경우)" + }, + "generalversammlung": { + "title": "총회", + "body": "총회는 본회의 최고기관이다. 정기총회는 매년 1회, 안건을 명시하여 최소 20일의 기간을 두고 소집한다.\n\n총회는 다음 사항에 관하여 위임할 수 없는 권한을 가진다.\n\na) 연차보고서 및 연차결산의 승인\nb) 이사회에 대한 책임해제\nc) 이사회 구성원 및 감사기관을 두는 경우 그 선임과 해임\nd) 회비의 결정\ne) 기관 구성원에 대한 보수에 관한 의결(제12조)\nf) 정관의 변경\ng) 본회의 해산\n\n각 회원은 1개의 의결권을 가진다. 결의는 투표된 표의 단순 과반수로 성립하며, 가부동수인 경우 의장이 결정한다.\n\n임시총회는 이사회의 결의로 또는 회원 5분의 1 이상의 서면 요구로 소집한다.\n\n어느 회원도 구두 심의를 요구하지 아니하는 한, 결의는 서면 또는 전자적 방법으로도 할 수 있다." + }, + "vorstand": { + "title": "이사회", + "body": "이사회는 2인 이상의 구성원으로 한다. 이사회는 스스로 그 구성을 정한다.\n\n이사회 구성원의 고용 또는 보수가 의결되는 경우, 이사회는 3인 이상으로 구성되어야 한다.\n\n임기는 2년으로 하며, 연임할 수 있다.\n\n이사회는 다른 기관에 명시적으로 유보되지 아니한 모든 권한을 가진다. 일상업무를 집행하고 대외적으로 본회를 대표한다.\n\n이사회는 구성원의 과반수가 출석한 때에 의결할 수 있다. 심의와 결의에 관하여는 의사록을 작성한다." + }, + "zeichnungsberechtigung": { + "title": "서명권", + "body": "본회는 이사회 구성원 2인의 공동서명으로 법적 구속력 있는 의무를 부담한다." + }, + "entschaedigung": { + "title": "보수 및 회피", + "body": "이사회 구성원은 원칙적으로 무보수로 그 직무를 수행한다.\n\n실제 지출은 증빙에 따라 상환한다. 정액 실비지급은 허용되지 아니한다.\n\n실제로 제공된 노무에 대하여는 상당한 보수를 지급할 수 있다. 그 액수는 총회가 정한다.\n\n안건이 기관 구성원의 개인적 이해관계 — 특히 그의 고용 또는 보수 — 에 관계되는 경우 해당 구성원은 회피한다. 그는 심의에도 의결에도 참여하지 아니한다. 회피 사실은 의사록에 기재한다.\n\n기관 구성원에 대한 보수는 연차보고서에서 공개한다." + }, + "revisionsstelle": { + "title": "감사기관", + "body": "총회는 감사기관을 설치할 수 있다.\n\n법정 감사의무의 요건이 충족되는 경우(ZGB 제69b조), 총회는 해당 규정에 따라 감사기관을 설치한다." + }, + "offenlegung": { + "title": "정보공개", + "body": "본회는 정관, 이사회의 구성, 그리고 매년 연차보고서와 연차결산을 공개한다.\n\n공개는 이후의 변경을 추적할 수 있는 형태로 이루어진다.\n\n본회가 확정적으로 면세를 인정받기 전까지는 기부금 영수증을 발행하지 아니하며, 공익성이 인정되었다고 주장하는 표시도 하지 아니한다." + }, + "geschaeftsjahr": { + "title": "회계연도", + "body": "회계연도는 역년으로 한다. 최초의 회계연도는 설립 연도의 12월 31일에 종료한다." + }, + "statutenaenderung": { + "title": "정관의 변경", + "body": "본 정관의 변경에는 총회에서 투표된 표의 3분의 2의 동의를 요한다. 제2조(목적) 및 제17조(잔여재산의 귀속)의 변경은 주(칸톤) 세무당국에 신고한다." + }, + "aufloesung": { + "title": "해산 및 잔여재산의 귀속", + "body": "본회의 해산에는 총회에서 투표된 표의 3분의 2의 동의를 요한다.\n\n본회가 해산하는 경우 그 재산은 동일하거나 유사한 목적을 추구하는, 스위스에 소재하는 다른 면세 법인에 귀속한다.\n\n회원에 대한 출자의 반환 및 그 밖에 회원에 대한 재산의 분배는 허용되지 아니한다." + }, + "inkrafttreten": { + "title": "시행", + "body": "본 정관은 창립총회에서 의결되었으며 그 이후 효력을 가진다." + } + } } } diff --git a/messages/ru.json b/messages/ru.json index d10381470..30cb30891 100644 --- a/messages/ru.json +++ b/messages/ru.json @@ -4605,7 +4605,8 @@ "title": "Цифры и факты", "moreLink": "Посмотреть подробные показатели влияния", "detailLink": "Посмотреть подробные показатели влияния", - "co2Link": "Расчёт CO₂ и источники" + "co2Link": "Расчёт CO₂ и источники", + "statutenLink": "Читать устав" }, "howWeWork": { "title": "Как мы работаем", @@ -8893,5 +8894,118 @@ "source": "Посмотреть исходный код", "license": "Лицензия {license}" } + }, + "statuten": { + "meta": { + "title": "Устав", + "description": "Устав {orgName} — полностью открытый, на всех языках, с прослеживаемой историей изменений." + }, + "hero": { + "title": "Устав", + "subtitle": "Основной документ {orgName} — открыт для чтения ещё до того, как будет принят." + }, + "draft": { + "title": "Проект — ещё не принят", + "body": "{orgName} находится в стадии учреждения. Этот устав является проектом и пока не принят ни одним учредительным собранием. Он ещё не создаёт ни объединения, ни каких-либо прав. Мы публикуем его всё равно — потому что основной документ должно быть можно прочитать до его принятия, а не только после." + }, + "adopted": { + "title": "Принят", + "body": "Настоящий устав был принят на учредительном собрании {adoptedOn} и с тех пор действует." + }, + "authoritative": { + "title": "Определяющей является немецкая редакция", + "body": "Этот перевод служит для понимания. Юридически обязательной является исключительно немецкая редакция." + }, + "source": { + "title": "Происхождение документа", + "body": "Этот устав находится в публичном репозитории исходного кода {orgName}. Каждое изменение прослеживается там как отдельная датированная ревизия — в том числе задним числом.", + "cta": "Посмотреть исходный текст и историю изменений" + }, + "toc": { + "title": "Содержание" + }, + "articleLabel": "Ст. {num}", + "sections": { + "name": "Наименование, местонахождение и срок", + "zweck": "Цель и средства", + "mitgliedschaft": "Членство", + "organe": "Органы", + "transparenz": "Прозрачность", + "schluss": "Заключительные положения" + }, + "articles": { + "name-sitz": { + "title": "Наименование и местонахождение", + "body": "Под наименованием {orgName} существует объединение в смысле ст. 60 и след. Швейцарского гражданского кодекса (ZGB).\n\nМестонахождение объединения — Цюрих.\n\nСрок деятельности объединения не ограничен." + }, + "zweck": { + "title": "Цель", + "body": "Целью объединения является обеспечение людям доступа к производительным информационным технологиям и к цифровому образованию — независимо от их финансовых возможностей.\n\nОно преследует эту цель, в частности, посредством:\n\na) проверки, восстановления и передачи бывших в употреблении устройств, чтобы они как можно дольше оставались в использовании (циркулярная экономика);\nb) предложений по ремонту, консультированию и поддержке аппаратного и программного обеспечения;\nc) образовательных предложений для цифрового участия;\nd) разработки и безвозмездной публикации программного обеспечения с открытым исходным кодом, а также результатов исследований как общедоступного блага;\ne) предложений, дающих людям с затруднённым доступом к рынку труда возможность осмысленной деятельности.\n\nОбъединение является общественно полезным и нейтральным как в конфессиональном, так и в политическом отношении. Оно не преследует коммерческих целей и не стремится к прибыли.\n\nХозяйственная деятельность допустима постольку, поскольку она служит достижению цели и остаётся ей подчинённой. Она является средством достижения цели и никогда самоцелью.\n\nДеятельность объединения обращена к обществу в целом, а не только к его членам." + }, + "mittel": { + "title": "Средства", + "body": "Для достижения своей цели объединение располагает:\n\na) членскими взносами;\nb) пожертвованиями, дарениями, завещательными отказами и наследством;\nc) взносами государственных органов, а также фондов;\nd) доходами от целевой деятельности и услуг;\ne) доходами от имущества объединения.\n\nВозможные излишки полностью остаются у объединения и используются исключительно для цели согласно ст. 2. Распределение среди членов или третьих лиц исключено.\n\nИмущество объединения посвящено его цели исключительно и безотзывно." + }, + "beteiligungen": { + "title": "Участия", + "body": "Для достижения своей цели объединение может участвовать в юридических лицах или учреждать их.\n\nТакие участия удерживаются как вложение имущества и остаются подчинёнными цели. Объединение не осуществляет руководство соответствующими предприятиями.\n\nДоходы от участий полностью направляются на цель объединения." + }, + "erwerb": { + "title": "Приобретение членства", + "body": "Членами могут стать физические и юридические лица, поддерживающие цель объединения.\n\nО приёме решает правление. Отказ не требует обоснования." + }, + "erloeschen": { + "title": "Прекращение членства", + "body": "Членство прекращается:\n\na) у физических лиц — со смертью, у юридических лиц — с ликвидацией;\nb) письменным выходом на конец хозяйственного года с соблюдением месячного срока;\nc) исключением.\n\nПравление может исключить члена, который наносит ущерб цели объединения или, несмотря на напоминание, не выполняет свои обязанности. Затронутый член может обжаловать решение перед общим собранием в течение 30 дней.\n\nВышедшие или исключённые члены не имеют прав на имущество объединения." + }, + "beitraege-haftung": { + "title": "Взносы и ответственность", + "body": "Общее собрание устанавливает годовой членский взнос.\n\nПо обязательствам объединения отвечает исключительно его имущество. Личная ответственность членов, а также любая обязанность доплаты исключены (ст. 75a ZGB)." + }, + "organe": { + "title": "Органы", + "body": "Органами объединения являются:\n\na) общее собрание;\nb) правление;\nc) ревизионный орган, если таковой назначается." + }, + "generalversammlung": { + "title": "Общее собрание", + "body": "Общее собрание является высшим органом объединения. Оно созывается один раз в год в очередном порядке, с указанием повестки дня и со сроком не менее 20 дней.\n\nК его непередаваемой компетенции относятся:\n\na) утверждение годового отчёта и годовой отчётности;\nb) освобождение правления от ответственности;\nc) избрание и отзыв членов правления, а также возможного ревизионного органа;\nd) установление членского взноса;\ne) решение о вознаграждениях членам органов (ст. 12);\nf) изменение устава;\ng) роспуск объединения.\n\nКаждый член имеет один голос. Решения принимаются простым большинством поданных голосов; при равенстве голосов решает председательствующий.\n\nВнеочередное общее собрание созывается по решению правления или по письменному требованию не менее одной пятой членов.\n\nРешения могут приниматься также письменно или электронным путём, если ни один член не потребует устного обсуждения." + }, + "vorstand": { + "title": "Правление", + "body": "Правление состоит не менее чем из двух членов. Оно конституируется самостоятельно.\n\nЕсли принимается решение о трудоустройстве или вознаграждении члена правления, правление должно состоять не менее чем из трёх членов.\n\nСрок полномочий составляет два года; переизбрание возможно.\n\nПравлению принадлежат все полномочия, которые прямо не отнесены к компетенции другого органа. Оно ведёт текущие дела и представляет объединение вовне.\n\nПравление правомочно принимать решения, если присутствует большинство его членов. О ходе обсуждения и о решениях ведётся протокол." + }, + "zeichnungsberechtigung": { + "title": "Право подписи", + "body": "Объединение принимает на себя юридически обязывающие обязательства коллективной подписью двух членов правления." + }, + "entschaedigung": { + "title": "Вознаграждение и самоотвод", + "body": "Члены правления исполняют свои обязанности принципиально на общественных началах.\n\nФактические расходы возмещаются по документам. Паушальные компенсации расходов исключены.\n\nЗа фактически выполненную работу может выплачиваться соразмерное вознаграждение. Оно устанавливается общим собранием.\n\nЕсли вопрос затрагивает личные интересы члена органа — в частности его трудоустройство или вознаграждение — он заявляет самоотвод. Он не участвует ни в обсуждении, ни в принятии решения. Самоотвод заносится в протокол.\n\nВознаграждения членам органов раскрываются в годовом отчёте." + }, + "revisionsstelle": { + "title": "Ревизионный орган", + "body": "Общее собрание может назначить ревизионный орган.\n\nЕсли выполнены законные условия обязательной ревизии (ст. 69b ZGB), общее собрание назначает ревизионный орган в соответствии с применимыми предписаниями." + }, + "offenlegung": { + "title": "Раскрытие информации", + "body": "Объединение публикует свой устав, состав правления, а также ежегодно годовой отчёт и годовую отчётность.\n\nПубликация осуществляется в форме, которая делает последующие изменения прослеживаемыми.\n\nПока объединение не освобождено от налогов вступившим в силу решением, оно не выдаёт справок о пожертвованиях и не делает заявлений, утверждающих признанную общественную полезность." + }, + "geschaeftsjahr": { + "title": "Хозяйственный год", + "body": "Хозяйственный год соответствует календарному году. Первый хозяйственный год заканчивается 31 декабря года учреждения." + }, + "statutenaenderung": { + "title": "Изменение устава", + "body": "Изменения настоящего устава требуют согласия двух третей поданных на общем собрании голосов. Изменения ст. 2 (цель) и ст. 17 (переход имущества) сообщаются кантональному налоговому управлению." + }, + "aufloesung": { + "title": "Роспуск и переход имущества", + "body": "Роспуск объединения требует согласия двух третей поданных на общем собрании голосов.\n\nПри роспуске объединения имущество переходит к другому освобождённому от налогов юридическому лицу с местонахождением в Швейцарии, которое преследует такую же или схожую цель.\n\nВозврат вкладов членам, а также любое иное распределение имущества среди членов исключены." + }, + "inkrafttreten": { + "title": "Вступление в силу", + "body": "Настоящий устав был принят на учредительном собрании и с тех пор действует." + } + } } } diff --git a/src/app/[locale]/transparenz/page.tsx b/src/app/[locale]/transparenz/page.tsx index fbd06e1d1..2c7b1ed8f 100644 --- a/src/app/[locale]/transparenz/page.tsx +++ b/src/app/[locale]/transparenz/page.tsx @@ -82,6 +82,12 @@ export default async function TransparenzPage({ params }: TransparenzPageProps) > {t('stats.co2Link')} + + {t('stats.statutenLink')} + diff --git a/src/app/[locale]/transparenz/statuten/page.tsx b/src/app/[locale]/transparenz/statuten/page.tsx new file mode 100644 index 000000000..53280ff93 --- /dev/null +++ b/src/app/[locale]/transparenz/statuten/page.tsx @@ -0,0 +1,208 @@ +// SSR only — lucide-react in server component scope causes React-null in certain Turbopack SSG bundles +export const dynamic = 'force-dynamic' + +import type { Metadata } from 'next' +import { getTranslations } from 'next-intl/server' +import { ScrollText, AlertTriangle, Languages, GitCommitHorizontal, ExternalLink } from 'lucide-react' + +import { PageHero } from '@/components/layout/PageHero' +import { Section } from '@/components/layout/Section' +import Heading from '@/components/ui/Heading' +import { Card } from '@/components/ui/card' +import { IconBadge } from '@/components/ui/IconBadge' +import { StatutenBody } from '@/components/legal/StatutenBody' +import { ORG } from '@/config/org' +import { + STATUTEN_SECTIONS, + STATUTEN_STATUS, + STATUTEN_SOURCE_URL, + STATUTEN_AUTHORITATIVE_LOCALE, + getStatutenArticlesBySection, + getStatutenAnchor, +} from '@/config/statuten' + +interface PageProps { + params: Promise<{ locale: string }> +} + +export async function generateMetadata({ params }: PageProps): Promise { + const { locale } = await params + const t = await getTranslations({ locale, namespace: 'statuten' }) + const title = `${t('meta.title')} | ${ORG.name}` + const description = t('meta.description', { orgName: ORG.name }) + + return { + title: { absolute: title }, + description, + openGraph: { + title, + description, + type: 'article', + url: `${ORG.website}/transparenz/statuten`, + siteName: ORG.name, + }, + } +} + +export default async function StatutenPage({ params }: PageProps) { + const { locale } = await params + const t = await getTranslations({ locale, namespace: 'statuten' }) + + const isDraft = STATUTEN_STATUS.state === 'draft' + const isTranslation = locale !== STATUTEN_AUTHORITATIVE_LOCALE + + return ( +
+ + +
+
+ {/* Adoption state. The association is not founded yet — never let the + document read as though it already governs an existing one. */} + +
+
+
+ + {/* The German wording is the legally binding one; everything else is + a reading aid. Say so on every translated locale. */} + {isTranslation && ( + +
+
+
+ )} +
+
+ + {/* Table of contents */} +
+
+ + {t('toc.title')} + +
    + {STATUTEN_SECTIONS.map(section => ( +
  1. +

    + {section.numeral}. {t(`sections.${section.id}` as never)} +

    + +
  2. + ))} +
+
+
+ + {/* The statutes themselves */} +
+
+ {STATUTEN_SECTIONS.map(section => ( +
+ + {section.numeral}.{' '} + {t(`sections.${section.id}` as never)} + + +
+ {getStatutenArticlesBySection(section.id).map(article => ( +
+ + + {t('articleLabel', { num: article.num })} + {' '} + {t(`articles.${article.id}.title` as never)} + + +
+ ))} +
+
+ ))} +
+
+ + {/* Provenance — Art. 14 promises changes stay traceable; this is how. */} +
+
+ +
+ +
+ + {t('source.title')} + +

+ {t('source.body', { orgName: ORG.name })} +

+ + {t('source.cta')} + +
+
+
+
+
+
+ ) +} diff --git a/src/app/sitemap.ts b/src/app/sitemap.ts index 55061d251..ad964d394 100644 --- a/src/app/sitemap.ts +++ b/src/app/sitemap.ts @@ -55,6 +55,7 @@ const STATIC_PAGES: Array<{ path: string; priority: number; changeFrequency: Met { path: '/contact', priority: 0.6, changeFrequency: 'monthly' }, { path: '/faq', priority: 0.6, changeFrequency: 'monthly' }, { path: R.transparenz, priority: 0.5, changeFrequency: 'monthly' }, + { path: R.transparenzStatuten, priority: 0.5, changeFrequency: 'yearly' }, { path: '/about', priority: 0.6, changeFrequency: 'monthly' }, { path: R.vision, priority: 0.7, changeFrequency: 'monthly' }, { path: R.projects, priority: 0.6, changeFrequency: 'monthly' }, diff --git a/src/components/legal/StatutenBody.tsx b/src/components/legal/StatutenBody.tsx new file mode 100644 index 000000000..9690556d5 --- /dev/null +++ b/src/components/legal/StatutenBody.tsx @@ -0,0 +1,44 @@ +import { parseStatutenBody, numberParagraphs } from '@/lib/legal/statuten-body' + +interface StatutenBodyProps { + /** Raw article body from the `statuten` message namespace. */ + body: string +} + +/** + * Renders one statute article: numbered paragraphs with lettered sub-lists. + * Numbering is generated, never taken from the translated string, so every + * locale shows identical article structure. + */ +export function StatutenBody({ body }: StatutenBodyProps) { + const blocks = numberParagraphs(parseStatutenBody(body)) + + return ( +
+ {blocks.map(({ block, number }, index) => + block.kind === 'list' ? ( +
    + {block.items.map((item, itemIndex) => ( +
  1. + {item} +
  2. + ))} +
+ ) : ( +

+ + {block.text} +

+ ) + )} +
+ ) +} diff --git a/src/config/routes.ts b/src/config/routes.ts index 34536d0fb..6adf00658 100644 --- a/src/config/routes.ts +++ b/src/config/routes.ts @@ -145,6 +145,7 @@ export const ROUTES = { transparenz: '/transparenz', transparenzKennzahlen: '/transparenz/kennzahlen', transparenzCo2: '/transparenz/co2', + transparenzStatuten: '/transparenz/statuten', mitgliedWerden: '/mitglied-werden', careers: '/karriere', careerPosting: (slug: string) => `/karriere/${slug}`, diff --git a/src/config/statuten.ts b/src/config/statuten.ts new file mode 100644 index 000000000..2c17834ef --- /dev/null +++ b/src/config/statuten.ts @@ -0,0 +1,95 @@ +/** + * Statuten — STRUCTURE SSOT + * + * Owns the ordering, numbering and grouping of the articles. The prose lives + * in `messages/.json` under the `statuten` namespace, keyed by the ids + * below — never in arrays, so a missing translation falls back per-key to the + * canonical German instead of dropping a whole block (see src/i18n/request.ts). + * + * Adding an article = one entry here + its `title`/`body` strings. Numbering, + * the table of contents, and the anchors all follow automatically. + * + * The GERMAN text is the legally authoritative version; every other locale is + * a reading aid. `STATUTEN_AUTHORITATIVE_LOCALE` is the SSOT for that claim. + */ + +/** The locale whose wording is legally binding. */ +export const STATUTEN_AUTHORITATIVE_LOCALE = 'de' as const + +/** + * Adoption state. evig is `in Gründung` — these statutes are a DRAFT and have + * NOT been adopted by a founding assembly. Flip to 'adopted' together with + * `adoptedOn` on the day the Gründungsversammlung resolves them, and only then. + * Until that happens the page renders an unmistakable draft banner. + */ +export const STATUTEN_STATUS: { + state: 'draft' | 'adopted' + /** ISO date of the founding assembly. Null while `state` is 'draft'. */ + adoptedOn: string | null +} = { + state: 'draft', + adoptedOn: null, +} + +/** Public source of the document, so anyone can diff every revision. */ +export const STATUTEN_SOURCE_URL = + 'https://github.com/maonakamoto/evig/blob/main/docs/legal/STATUTEN.md' + +export interface StatutenSection { + id: string + /** Roman numeral as printed in the document. */ + numeral: string +} + +export interface StatutenArticle { + id: string + /** Article number as printed ("Art. 1"). */ + num: number + /** Owning section id. */ + section: string +} + +export const STATUTEN_SECTIONS = [ + { id: 'name', numeral: 'I' }, + { id: 'zweck', numeral: 'II' }, + { id: 'mitgliedschaft', numeral: 'III' }, + { id: 'organe', numeral: 'IV' }, + { id: 'transparenz', numeral: 'V' }, + { id: 'schluss', numeral: 'VI' }, +] as const satisfies readonly StatutenSection[] + +export const STATUTEN_ARTICLES = [ + { id: 'name-sitz', num: 1, section: 'name' }, + { id: 'zweck', num: 2, section: 'zweck' }, + { id: 'mittel', num: 3, section: 'zweck' }, + { id: 'beteiligungen', num: 4, section: 'zweck' }, + { id: 'erwerb', num: 5, section: 'mitgliedschaft' }, + { id: 'erloeschen', num: 6, section: 'mitgliedschaft' }, + { id: 'beitraege-haftung', num: 7, section: 'mitgliedschaft' }, + { id: 'organe', num: 8, section: 'organe' }, + { id: 'generalversammlung', num: 9, section: 'organe' }, + { id: 'vorstand', num: 10, section: 'organe' }, + { id: 'zeichnungsberechtigung', num: 11, section: 'organe' }, + { id: 'entschaedigung', num: 12, section: 'organe' }, + { id: 'revisionsstelle', num: 13, section: 'organe' }, + { id: 'offenlegung', num: 14, section: 'transparenz' }, + { id: 'geschaeftsjahr', num: 15, section: 'schluss' }, + { id: 'statutenaenderung', num: 16, section: 'schluss' }, + { id: 'aufloesung', num: 17, section: 'schluss' }, + { id: 'inkrafttreten', num: 18, section: 'schluss' }, +] as const satisfies readonly StatutenArticle[] + +export type StatutenSectionId = (typeof STATUTEN_SECTIONS)[number]['id'] +export type StatutenArticleId = (typeof STATUTEN_ARTICLES)[number]['id'] + +/** Articles of one section, in document order. */ +export function getStatutenArticlesBySection( + sectionId: string +): readonly StatutenArticle[] { + return STATUTEN_ARTICLES.filter(article => article.section === sectionId) +} + +/** Stable anchor for deep-linking a single article. */ +export function getStatutenAnchor(article: StatutenArticle): string { + return `art-${article.num}` +} diff --git a/src/lib/__tests__/permissions.test.ts b/src/lib/__tests__/permissions.test.ts index 60e86e00c..47a1cfee9 100644 --- a/src/lib/__tests__/permissions.test.ts +++ b/src/lib/__tests__/permissions.test.ts @@ -72,7 +72,7 @@ describe('isStaffEmail', () => { describe('isSuperAdmin', () => { it('returns true for a known super admin email', () => { - expect(isSuperAdmin('andreas@revamp-it.ch')).toBe(true) + expect(isSuperAdmin('georgy.butaev@revamp-it.ch')).toBe(true) }) it('returns false for a regular staff email', () => { @@ -88,7 +88,7 @@ describe('isSuperAdmin', () => { }) it('isSuperAdminFromDb=false does not override email check', () => { - expect(isSuperAdmin('andreas@revamp-it.ch', false)).toBe(true) + expect(isSuperAdmin('georgy.butaev@revamp-it.ch', false)).toBe(true) }) it('all SUPER_ADMIN_EMAILS entries return true', () => { @@ -104,7 +104,7 @@ describe('isSuperAdmin', () => { describe('canAccessSection', () => { const superAdmin: StaffUser = { - email: 'andreas@revamp-it.ch', + email: 'georgy.butaev@revamp-it.ch', is_staff: true, staff_permissions: [], } @@ -191,7 +191,7 @@ describe('canAccessSensitive', () => { }) it('super admin can access sensitive', () => { - expect(canAccessSensitive({ email: 'andreas@revamp-it.ch', is_staff: true, staff_permissions: [] })).toBe(true) + expect(canAccessSensitive({ email: 'georgy.butaev@revamp-it.ch', is_staff: true, staff_permissions: [] })).toBe(true) }) it('wildcard permission grants sensitive access', () => { @@ -221,7 +221,7 @@ describe('getAccessibleSections', () => { }) it('super admin gets all admin sections', () => { - const sections = getAccessibleSections({ email: 'andreas@revamp-it.ch', is_staff: true, staff_permissions: [] }) + const sections = getAccessibleSections({ email: 'georgy.butaev@revamp-it.ch', is_staff: true, staff_permissions: [] }) // Should include all ADMIN_SECTION_IDS from mock expect(sections.length).toBeGreaterThan(0) expect(sections).toContain('dashboard') @@ -252,7 +252,7 @@ describe('getAccessibleSections', () => { describe('getInitialStaffPermissions', () => { it('returns ["*"] for super admins', () => { - expect(getInitialStaffPermissions('andreas@revamp-it.ch')).toEqual(['*']) + expect(getInitialStaffPermissions('georgy.butaev@revamp-it.ch')).toEqual(['*']) }) it('returns non-sensitive sections for regular staff', () => { diff --git a/src/lib/auth/__tests__/permissions.test.ts b/src/lib/auth/__tests__/permissions.test.ts index 98c8c4167..c9462c6fe 100644 --- a/src/lib/auth/__tests__/permissions.test.ts +++ b/src/lib/auth/__tests__/permissions.test.ts @@ -41,7 +41,7 @@ import type { StaffUser } from '@/lib/permissions' describe('isStaffEmail', () => { it('returns true for @revamp-it.ch emails', () => { expect(isStaffEmail('user@revamp-it.ch')).toBe(true) - expect(isStaffEmail('andreas@revamp-it.ch')).toBe(true) + expect(isStaffEmail('georgy.butaev@revamp-it.ch')).toBe(true) }) it('is case-insensitive', () => { @@ -72,12 +72,21 @@ describe('isStaffEmail', () => { describe('isSuperAdmin', () => { it('returns true for known super admin emails', () => { - expect(isSuperAdmin('andreas@revamp-it.ch')).toBe(true) - expect(isSuperAdmin('georgy@revamp-it.ch')).toBe(true) + expect(isSuperAdmin('georgy.butaev@revamp-it.ch')).toBe(true) + }) + + // Regression guard: evig separated from Revamp-IT on 2026-07-24. Their + // super admins must never regain access to evig's sensitive sections by + // e-mail alone. Never re-add these to SUPER_ADMIN_EMAILS. + it('denies the removed Revamp-IT super admins', () => { + expect(isSuperAdmin('andreas@revamp-it.ch')).toBe(false) + expect(isSuperAdmin('veronica@revamp-it.ch')).toBe(false) + expect(isSuperAdmin('daniel@revamp-it.ch')).toBe(false) + expect(isSuperAdmin('georgy@revamp-it.ch')).toBe(false) }) it('is case-insensitive', () => { - expect(isSuperAdmin('ANDREAS@REVAMP-IT.CH')).toBe(true) + expect(isSuperAdmin('GEORGY.BUTAEV@REVAMP-IT.CH')).toBe(true) }) it('returns true when isSuperAdminFromDb flag is true', () => { @@ -100,7 +109,7 @@ describe('isSuperAdmin', () => { describe('canAccessSection', () => { const superAdmin: StaffUser = { - email: 'andreas@revamp-it.ch', + email: 'georgy.butaev@revamp-it.ch', is_staff: true, staff_permissions: ['dashboard'], } @@ -179,7 +188,7 @@ describe('canAccessSection', () => { describe('canAccessSensitive', () => { it('returns true for super admins', () => { const superAdmin: StaffUser = { - email: 'andreas@revamp-it.ch', + email: 'georgy.butaev@revamp-it.ch', is_staff: true, staff_permissions: [], } @@ -229,7 +238,7 @@ describe('canAccessSensitive', () => { describe('getAccessibleSections', () => { it('returns all sections for super admin', () => { const superAdmin: StaffUser = { - email: 'andreas@revamp-it.ch', + email: 'georgy.butaev@revamp-it.ch', is_staff: true, staff_permissions: [], } @@ -270,7 +279,7 @@ describe('getAccessibleSections', () => { describe('getInitialStaffPermissions', () => { it('returns wildcard for super admins', () => { - expect(getInitialStaffPermissions('andreas@revamp-it.ch')).toEqual(['*']) + expect(getInitialStaffPermissions('georgy.butaev@revamp-it.ch')).toEqual(['*']) }) it('returns default permissions for regular staff', () => { @@ -289,7 +298,12 @@ describe('getInitialStaffPermissions', () => { describe('auth constants', () => { it('has correct staff domain', () => { - expect(STAFF_EMAIL_DOMAIN).toBe('revamp-it.ch') + expect(STAFF_EMAIL_DOMAIN).toBe('evig.ch') + }) + + // Layer B: legacy Revamp-IT logins must keep working until infra cutover. + it('still recognises legacy Revamp-IT addresses', () => { + expect(isStaffEmail('georgy.butaev@revamp-it.ch')).toBe(true) }) it('has super admin emails defined', () => { diff --git a/src/lib/legal/statuten-body.ts b/src/lib/legal/statuten-body.ts new file mode 100644 index 000000000..d6d8f5e6c --- /dev/null +++ b/src/lib/legal/statuten-body.ts @@ -0,0 +1,56 @@ +/** + * Parses a statute article body into renderable blocks. + * + * The prose lives in `messages/.json` as one string per article, so + * translators work on a whole coherent article rather than disconnected + * fragments. Blocks are separated by a blank line; a block whose every line is + * a lettered item (`a) …`) becomes a list. + * + * Markers are STRIPPED and re-generated by the renderer, so paragraph numbers + * and list letters stay identical across locales no matter how a translator + * wrote them. + */ + +export type StatutenBlock = + | { kind: 'paragraph'; text: string } + | { kind: 'list'; items: string[] } + +/** `a) text` — the leading marker of a lettered sub-item. */ +const LIST_ITEM = /^[a-z]\)\s+/ + +export function parseStatutenBody(body: string): StatutenBlock[] { + return body + .split('\n\n') + .map(block => block.trim()) + .filter(Boolean) + .map(block => { + const lines = block + .split('\n') + .map(line => line.trim()) + .filter(Boolean) + + if (lines.length > 0 && lines.every(line => LIST_ITEM.test(line))) { + return { kind: 'list', items: lines.map(line => line.replace(LIST_ITEM, '')) } + } + + // A paragraph may be soft-wrapped across lines; join it back into one. + return { kind: 'paragraph', text: lines.join(' ') } + }) +} + +/** + * Legal paragraph numbering counts only paragraphs — interleaved lists belong + * to the paragraph that introduces them and must not consume a number. + */ +export function numberParagraphs( + blocks: readonly StatutenBlock[] +): Array<{ block: StatutenBlock; number: number | null }> { + let counter = 0 + return blocks.map(block => { + if (block.kind === 'paragraph') { + counter += 1 + return { block, number: counter } + } + return { block, number: null } + }) +} diff --git a/src/lib/permissions.ts b/src/lib/permissions.ts index c550c21d8..9fe695c76 100644 --- a/src/lib/permissions.ts +++ b/src/lib/permissions.ts @@ -1,16 +1,22 @@ /** - * RevampIT Simplified Permission System + * evig Simplified Permission System * * This replaces the complex 15+ role system with a simple approach: * - Regular users: No roles, just create content that needs approval - * - Staff (@revamp-it.ch): Access to admin with granular permissions + * - Staff: `is_staff` in the DB, granted explicitly by a super admin + * (PATCH /api/admin/users/[id]/permissions) or the HR hire flow. + * + * Staff status is NEVER derived from the e-mail domain. Anyone may register; + * a super admin decides who becomes staff. `isStaffEmail` below is cosmetic + * only (it picks which welcome-email copy to send) — see `src/auth.ts`. * * SSOT: Section definitions come from @/config/sections.ts * KISS, DRY principles applied. * - * Last Updated: 2026-01-26 + * Last Updated: 2026-08-05 */ +import { ORG } from '@/config/org' import { SECTIONS, ADMIN_SECTION_IDS, @@ -51,11 +57,18 @@ export type AdminSection = SectionId // STAFF EMAIL DOMAIN // ============================================================================= -export const STAFF_EMAIL_DOMAIN = 'revamp-it.ch' -export const LEGACY_STAFF_EMAIL_DOMAINS = ['revampit.ch'] as const +/** + * evig's own mail domain (SSOT: org.ts). Layer B — the legacy Revamp-IT + * domains stay listed until the infra cutover, because existing accounts + * (including the owner's) still log in with them. + */ +export const STAFF_EMAIL_DOMAIN = ORG.emailDomain +export const LEGACY_STAFF_EMAIL_DOMAINS = ['revamp-it.ch', 'revampit.ch'] as const /** - * Check if an email belongs to staff + * COSMETIC ONLY — picks the welcome-email template at registration. + * This grants NOTHING. Staff access comes from the `is_staff` DB column, + * set by a super admin. Never use this as an authorization check. */ export function isStaffEmail(email: string | null | undefined): boolean { if (!email) return false @@ -71,16 +84,23 @@ export function isStaffEmail(email: string | null | undefined): boolean { // ============================================================================= /** - * Super admins have full access to all sections including sensitive ones. - * This is a simple allowlist of email addresses. + * BOOTSTRAP ALLOWLIST — the owner, so the platform can never be locked out + * of its own admin (e.g. if `is_super_admin` is cleared by a bad migration). + * + * The DATABASE (`users.is_super_admin`) is the SSOT for super-admin status; + * this list is a floor, not the roster. Grant super admin to anyone else via + * PATCH /api/admin/users/[id]/permissions — never by editing this array. + * + * evig separated from Revamp-IT on 2026-07-24. The Revamp-IT super admins + * (andreas@, veronica@, daniel@) were removed on 2026-08-05: they held full + * access to evig's sensitive sections (users, finances, settings) purely by + * e-mail, bypassing the DB — and the demotion guard below made them + * un-removable through the UI. + * + * Layer B: the owner's login is still `@revamp-it.ch` (see .claude/CLAUDE.md). + * Add the evig address here at infra cutover, do not swap it before. */ -export const SUPER_ADMIN_EMAILS = [ - 'andreas@revamp-it.ch', - 'veronica@revamp-it.ch', - 'daniel@revamp-it.ch', - 'georgy@revamp-it.ch', - 'georgy.butaev@revamp-it.ch', -] as const +export const SUPER_ADMIN_EMAILS = ['georgy.butaev@revamp-it.ch'] as const /** * Check if a user is a super admin @@ -137,11 +157,13 @@ export function canAccessSection( section: AdminSection ): boolean { if (!user) return false - if (!user.is_staff) return false - // Super admins always have full access + // Super admins always have full access — checked BEFORE the is_staff gate so + // that a cleared `is_staff` flag can never lock the owner out of admin. if (isSuperAdmin(user.email, user.is_super_admin)) return true + if (!user.is_staff) return false + // Personal staff tools (own Zeiterfassung, …) are open to every staff // member — permission narrowing never removes someone's own tools. if (STAFF_UNIVERSAL_SECTION_IDS.includes(section)) return true @@ -171,8 +193,8 @@ export function canAccessSection( */ export function canAccessSensitive(user: StaffUser | null | undefined): boolean { if (!user) return false - if (!user.is_staff) return false if (isSuperAdmin(user.email, user.is_super_admin)) return true + if (!user.is_staff) return false if (user.staff_permissions.includes('*')) return true // Check if they have permission for any sensitive section @@ -205,12 +227,13 @@ export function toStaffUser(sessionUser: { export function getAccessibleSections( user: StaffUser | null | undefined ): AdminSection[] { - if (!user || !user.is_staff) return [] + if (!user) return [] - // Super admins or wildcard = all sections - if (isSuperAdmin(user.email, user.is_super_admin) || user.staff_permissions.includes('*')) { - return ADMIN_SECTION_IDS - } + // Super admins or wildcard = all sections. Super admin is checked before the + // is_staff gate for the same lockout reason as canAccessSection. + if (isSuperAdmin(user.email, user.is_super_admin)) return ADMIN_SECTION_IDS + if (!user.is_staff) return [] + if (user.staff_permissions.includes('*')) return ADMIN_SECTION_IDS // Filter to permitted sections, checking aliases for backward compat. // Personal staff tools (alwaysForStaff) are included for every staff member.