make a contrat template

This commit is contained in:
Marshal
2026-07-09 21:13:07 +00:00
parent e4429592d3
commit 3443b79644
26 changed files with 3243 additions and 41 deletions

View File

@@ -0,0 +1,23 @@
{{#each dynamicArticles}}
<section class="article">
<h2 class="article-heading"><span class="article-no">Article {{number}}</span><span class="article-name">{{title}}</span></h2>
{{#if paragraph}}
<p class="article-paragraph">{{paragraph}}</p>
{{else}}
<ol class="clauses">
{{#each clauses}}
<li>
{{text}}
{{#if bullets.length}}
<ul class="clause-bullets">
{{#each bullets}}
<li>{{this}}</li>
{{/each}}
</ul>
{{/if}}
</li>
{{/each}}
</ol>
{{/if}}
</section>
{{/each}}

View File

@@ -4,11 +4,11 @@
body {
margin: 0;
background: #f5f7fb;
color: #111827;
background: #f3f8f5;
color: #16241d;
font-family: "Times New Roman", Times, serif;
font-size: 10.5pt;
line-height: 1.48;
line-height: 1.5;
}
.contract {
@@ -21,25 +21,28 @@
h1, h2, h3, p { margin-top: 0; }
h1 {
color: #0f2742;
font-size: 18pt;
line-height: 1.25;
color: #0a3d2e;
font-size: 17pt;
letter-spacing: 0.02em;
line-height: 1.3;
margin-bottom: 10px;
text-align: center;
text-transform: uppercase;
}
h2 {
border-bottom: 1.5px solid #1e3a5f;
color: #1e3a5f;
font-size: 12pt;
letter-spacing: 0.03em;
margin: 18px 0 10px;
border-bottom: 1.5px solid #1b9e7a;
color: #0e5b45;
font-family: Arial, sans-serif;
font-size: 11.5pt;
letter-spacing: 0.04em;
margin: 20px 0 10px;
padding-bottom: 5px;
text-transform: uppercase;
}
h3 {
color: #0f2742;
font-size: 10.8pt;
color: #0a3d2e;
font-family: Arial, sans-serif;
font-size: 10.5pt;
margin: 12px 0 6px;
}
p { margin-bottom: 8px; }
@@ -52,16 +55,17 @@
page-break-inside: avoid;
}
/* ── Brand header ─────────────────────────────────────────────────────── */
.brand-row {
align-items: center;
border-bottom: 3px solid #1e3a5f;
border-bottom: 3px double #1b9e7a;
display: flex;
gap: 14px;
padding-bottom: 14px;
}
.logo-mark {
align-items: center;
background: #1e3a5f;
background: linear-gradient(135deg, #0e5b45 0%, #1b9e7a 100%);
border-radius: 8px;
color: #fff;
display: flex;
@@ -74,7 +78,7 @@
width: 72px;
}
.kicker {
color: #1e3a5f;
color: #0e5b45;
font-family: Arial, sans-serif;
font-size: 10pt;
font-weight: 700;
@@ -83,36 +87,74 @@
text-transform: uppercase;
}
.muted {
color: #6b7280;
color: #5c6f66;
font-family: Arial, sans-serif;
font-size: 9pt;
margin: 0;
}
.muted-note {
color: #5c6f66;
font-size: 9.5pt;
}
/* ── Cover page ───────────────────────────────────────────────────────── */
.cover {
display: flex;
flex-direction: column;
min-height: 255mm;
position: relative;
}
.cover-title {
margin: 54mm 0 34mm;
margin: 34mm 0 22mm;
text-align: center;
}
.cover-rule {
background: #1b9e7a;
height: 2px;
margin: 14px auto;
width: 46mm;
}
.document-label {
color: #6b7280;
color: #1b9e7a;
font-family: Arial, sans-serif;
font-size: 10pt;
font-size: 11pt;
font-weight: 700;
letter-spacing: 0.12em;
margin-bottom: 10px;
letter-spacing: 0.18em;
margin-bottom: 6px;
text-transform: uppercase;
}
.cover-for,
.cover-between {
color: #5c6f66;
font-family: Arial, sans-serif;
font-size: 9.5pt;
font-style: italic;
margin: 10px 0 6px;
}
.cover-party {
color: #0a3d2e;
font-family: Arial, sans-serif;
font-size: 12pt;
font-weight: 700;
margin: 4px 0;
}
.summary-line {
color: #374151;
color: #38493f;
font-family: Arial, sans-serif;
font-size: 9.5pt;
margin-top: 12px;
}
.cover-year {
color: #0e5b45;
font-family: Arial, sans-serif;
font-size: 13pt;
font-weight: 700;
letter-spacing: 0.1em;
margin-top: auto;
text-align: right;
}
/* ── Tables ───────────────────────────────────────────────────────────── */
table {
border-collapse: collapse;
width: 100%;
@@ -129,7 +171,7 @@
.details-table td,
.schedule th,
.schedule td {
border: 1px solid #cbd5e1;
border: 1px solid #c9e4d9;
padding: 7px 8px;
text-align: left;
vertical-align: top;
@@ -137,35 +179,46 @@
.meta-grid th,
.details-table th,
.schedule th {
background: #eef4fb;
color: #1e3a5f;
background: #e9f6f0;
color: #0e5b45;
font-family: Arial, sans-serif;
font-size: 8.5pt;
text-transform: uppercase;
}
.schedule tbody tr:nth-child(even) td { background: #f8fafc; }
.schedule tbody tr:nth-child(even) td { background: #f5faf8; }
.total-row td {
background: #e8f0f8 !important;
color: #0f2742;
background: #ddf2e9 !important;
color: #0a3d2e;
font-weight: 700;
}
/* ── Parties ──────────────────────────────────────────────────────────── */
.lead {
color: #374151;
color: #38493f;
font-size: 10.5pt;
}
.between-label {
color: #0e5b45;
font-family: Arial, sans-serif;
font-size: 9.5pt;
font-weight: 700;
letter-spacing: 0.08em;
margin: 10px 0 4px;
text-transform: uppercase;
}
.party-grid {
display: grid;
gap: 12px;
grid-template-columns: 1fr 1fr;
margin-top: 12px;
}
.party-card {
border: 1px solid #cbd5e1;
border: 1px solid #c9e4d9;
border-radius: 8px;
padding: 12px;
}
.party-card h3 {
background: #1e3a5f;
background: #0e5b45;
border-radius: 5px;
color: #fff;
font-family: Arial, sans-serif;
@@ -175,7 +228,7 @@
text-transform: uppercase;
}
.party-name {
color: #0f2742;
color: #0a3d2e;
font-weight: 700;
margin-bottom: 8px;
}
@@ -185,7 +238,7 @@
margin: 0;
}
dt {
color: #475569;
color: #47594f;
font-family: Arial, sans-serif;
font-size: 8.5pt;
font-weight: 700;
@@ -196,6 +249,81 @@
padding: 2px 0;
}
/* ── Recitals ─────────────────────────────────────────────────────────── */
.whereas-label {
color: #0e5b45;
font-family: Arial, sans-serif;
font-size: 9pt;
font-weight: 700;
letter-spacing: 0.06em;
text-transform: uppercase;
}
.now-therefore {
color: #0a3d2e;
font-weight: 700;
margin-top: 10px;
}
/* ── Dynamic articles ─────────────────────────────────────────────────── */
.article-heading {
align-items: baseline;
display: flex;
gap: 10px;
}
.article-no {
color: #1b9e7a;
font-family: Arial, sans-serif;
font-size: 9.5pt;
font-weight: 700;
letter-spacing: 0.06em;
text-transform: uppercase;
white-space: nowrap;
}
.article-name { color: #0e5b45; }
.article-paragraph { margin: 4px 0 0; }
ol.clauses {
counter-reset: clause;
list-style: none;
margin: 6px 0 0;
padding-left: 0;
}
ol.clauses > li {
counter-increment: clause;
margin-bottom: 6px;
padding-left: 24px;
position: relative;
text-align: justify;
}
ol.clauses > li::before {
color: #0e5b45;
content: counter(clause) ".";
font-family: Arial, sans-serif;
font-size: 9.5pt;
font-weight: 700;
left: 0;
position: absolute;
top: 1px;
}
ul.clause-bullets {
margin: 5px 0 2px;
padding-left: 16px;
}
ul.clause-bullets > li {
list-style: none;
margin-bottom: 3px;
padding-left: 12px;
position: relative;
}
ul.clause-bullets > li::before {
color: #1b9e7a;
content: "▪";
font-size: 8pt;
left: 0;
position: absolute;
top: 1px;
}
/* ── Signatures ───────────────────────────────────────────────────────── */
.signatures {
display: grid;
gap: 18px;
@@ -204,13 +332,13 @@
page-break-inside: avoid;
}
.sig-block {
border: 1.5px solid #1e3a5f;
border: 1.5px solid #1b9e7a;
border-radius: 8px;
min-height: 96mm;
padding: 12px;
}
.sig-title {
color: #1e3a5f;
color: #0e5b45;
font-family: Arial, sans-serif;
font-size: 9pt;
font-weight: 700;
@@ -219,7 +347,7 @@
}
.sig-image-box {
align-items: center;
border: 1px dashed #94a3b8;
border: 1px dashed #7fbfa9;
display: flex;
height: 28mm;
justify-content: center;
@@ -231,21 +359,40 @@
max-width: 70mm;
}
.sig-placeholder {
color: #94a3b8;
color: #7fbfa9;
font-family: Arial, sans-serif;
font-size: 8.5pt;
}
.sig-line {
border-top: 1px solid #111827;
border-top: 1px solid #16241d;
margin-top: 16px;
padding-top: 5px;
}
.sig-meta {
color: #475569;
color: #47594f;
font-size: 9pt;
margin: 4px 0;
}
/* ── Witnesses ────────────────────────────────────────────────────────── */
.witnesses { margin-top: 20px; }
.witness-table {
font-size: 9.5pt;
margin-top: 6px;
}
.witness-table th,
.witness-table td {
border-bottom: 1px solid #c9e4d9;
padding: 9px 8px;
text-align: left;
}
.witness-table th {
color: #0e5b45;
font-family: Arial, sans-serif;
font-size: 8.5pt;
text-transform: uppercase;
}
@media print {
body { background: #fff; }
.contract {

View File

@@ -0,0 +1,184 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>{{dynamicDocumentTitle}}{{reference}}</title>
{{> styles}}
</head>
<body>
<main class="contract">
{{!-- ─────────────────────────── Cover page ─────────────────────────── --}}
<section class="cover page-section">
<div class="brand-row">
<div class="logo-mark">EDR</div>
<div>
<p class="kicker">Ethio-Djibouti Standard Gauge Railway Share Company</p>
<p class="muted">Freight Transport Services</p>
</div>
</div>
<div class="cover-title">
<p class="document-label">Contract Agreement</p>
<div class="cover-rule"></div>
<p class="cover-for">for</p>
<h1>{{dynamicDocumentTitle}}</h1>
<p class="cover-between">between</p>
<p class="cover-party">Ethio-Djibouti Standard Gauge Railway Share Company</p>
<p class="cover-between">and</p>
<p class="cover-party">{{client.companyName}}</p>
<div class="cover-rule"></div>
</div>
<table class="meta-grid">
<tr>
<th>Contract Ref No.</th>
<td>{{reference}}</td>
<th>Contract Date</th>
<td>{{contractDate}}</td>
</tr>
<tr>
<th>Trade Direction</th>
<td>{{schedule.tradeDirection}}</td>
<th>Freight Type</th>
<td>{{schedule.freightType}}</td>
</tr>
</table>
<p class="cover-year">{{contractYear}}</p>
</section>
{{!-- ──────────────────────────── Preamble ──────────────────────────── --}}
<section class="page-section">
<h2>Parties to the Agreement</h2>
<p class="lead">
This Contract Agreement is made on <strong>{{contractDate}}</strong>.
</p>
<p class="between-label">Between</p>
<p>
<strong>Ethio-Djibouti Standard Gauge Railway Share Company (EDR)</strong>, a share company
incorporated under the laws of the Federal Democratic Republic of Ethiopia (FDRE), having its
principal place of business at {{provider.address}} (hereinafter referred to as the
<strong>"Service Provider"</strong>);
</p>
<p class="between-label">And</p>
<p>
<strong>{{client.companyName}}</strong>, an organization incorporated under the laws of the
Federal Democratic Republic of Ethiopia (FDRE), having its principal place of business at
{{client.companyAddress}} (hereinafter referred to as the <strong>"Client"</strong>).
</p>
<div class="party-grid">
<div class="party-card">
<h3>Service Provider</h3>
<p class="party-name">{{provider.name}}</p>
<dl>
<dt>Address</dt><dd>{{provider.address}}</dd>
<dt>Phone</dt><dd>{{provider.phone}}</dd>
<dt>Email</dt><dd>{{provider.email}}</dd>
<dt>TIN</dt><dd>{{provider.tinNumber}}</dd>
</dl>
</div>
<div class="party-card">
<h3>Client</h3>
<p class="party-name">{{client.companyName}}</p>
<dl>
<dt>Address</dt><dd>{{client.companyAddress}}</dd>
<dt>Location</dt><dd>{{client.companyLocation}}</dd>
<dt>Phone</dt><dd>{{client.phone}}</dd>
<dt>Email</dt><dd>{{client.email}}</dd>
<dt>TIN</dt><dd>{{client.tinNumber}}</dd>
<dt>VAT</dt><dd>{{client.vatNumber}}</dd>
<dt>Business license</dt><dd>{{client.businessLicense}}</dd>
</dl>
</div>
</div>
</section>
{{#if dynamicWhereas.length}}
<section class="page-section">
<h2>Recitals</h2>
{{#each dynamicWhereas}}
<p><span class="whereas-label">Whereas</span> {{this}}</p>
{{/each}}
<p class="now-therefore">Now, therefore, the parties agree as follows:</p>
</section>
{{/if}}
{{!-- ──────────────────────── Dynamic articles ──────────────────────── --}}
{{> dynamic_articles}}
{{!-- ─────────────────── Commercial schedule (annex) ─────────────────── --}}
<section class="page-section annex">
<h2>Annex A — Commercial Schedule</h2>
<table class="details-table">
<tbody>
<tr>
<th>Route</th>
<td>{{schedule.originLabel}}{{schedule.destinationLabel}}</td>
<th>Service type</th>
<td>{{schedule.serviceType}}</td>
</tr>
<tr>
<th>Cargo</th>
<td>{{schedule.cargoDescription}}</td>
<th>Hazardous cargo</th>
<td>{{schedule.hazardousLabel}}</td>
</tr>
<tr>
<th>Equipment return</th>
<td>{{schedule.equipmentReturn}}</td>
<th>Payment currency</th>
<td>{{paymentArticle}}</td>
</tr>
</tbody>
</table>
{{#if pricing.unitRates.length}}
<h3>Agreed Unit Rates</h3>
<p class="muted-note">
The rates below are the frozen unit prices applicable to this contract. Quantities and resulting
totals are determined per shipment at booking time.
</p>
<table class="schedule">
<thead>
<tr><th>Item</th><th>Unit price</th></tr>
</thead>
<tbody>
{{#each pricing.unitRates}}
<tr>
<td>{{label}}</td>
<td>{{currency}} {{unitPrice}} / {{unit}}</td>
</tr>
{{/each}}
</tbody>
</table>
{{/if}}
</section>
{{!-- ────────────────────────── Signatures ───────────────────────────── --}}
<section class="page-section">
<h2>Execution</h2>
<p>
In witness whereof, the parties hereto have caused this contract to be signed in their respective
names as of the day and year first above written. The signatories confirm that they are fully
authorized to sign and execute this Contract Agreement.
</p>
{{> signatures_block}}
<div class="witnesses">
<p class="sig-title">Witnesses</p>
<table class="witness-table">
<thead>
<tr><th></th><th>Name</th><th>Signature</th><th>Date</th></tr>
</thead>
<tbody>
<tr><td>1.</td><td></td><td></td><td></td></tr>
<tr><td>2.</td><td></td><td></td><td></td></tr>
</tbody>
</table>
</div>
</section>
</main>
</body>
</html>