From 74d12ec78ed0409ad67fec24b05120189d29515c Mon Sep 17 00:00:00 2001 From: ewandor Date: Fri, 17 Feb 2023 19:46:22 +0100 Subject: [PATCH] Draft for contract printing --- back/Dockerfile | 4 +- back/app/contract/__init__.py | 2 +- back/app/contract/models.py | 12 ++ back/app/contract/print/__init__.py | 96 ++++++++++++ .../app/contract/print/templates/content.html | 30 ++++ back/app/contract/print/templates/footer.html | 12 ++ .../contract/print/templates/frontpage.html | 48 ++++++ back/app/contract/print/templates/print.html | 69 +++++++++ back/app/contract/print/templates/styles.css | 139 ++++++++++++++++++ back/app/entity/models.py | 1 + back/app/template/models.py | 9 ++ back/requirements.txt | 4 +- front/Dockerfile | 2 +- front/app/src/assets/SCHLBKB.TTF | Bin 168756 -> 0 bytes front/app/src/assets/logotransparent.png | Bin 0 -> 41813 bytes front/app/src/assets/tampon.png | Bin 0 -> 293468 bytes front/app/src/assets/watermark.png | Bin 0 -> 237742 bytes 17 files changed, 424 insertions(+), 4 deletions(-) create mode 100644 back/app/contract/print/__init__.py create mode 100644 back/app/contract/print/templates/content.html create mode 100644 back/app/contract/print/templates/footer.html create mode 100644 back/app/contract/print/templates/frontpage.html create mode 100644 back/app/contract/print/templates/print.html create mode 100644 back/app/contract/print/templates/styles.css delete mode 100644 front/app/src/assets/SCHLBKB.TTF create mode 100644 front/app/src/assets/logotransparent.png create mode 100644 front/app/src/assets/tampon.png create mode 100644 front/app/src/assets/watermark.png diff --git a/back/Dockerfile b/back/Dockerfile index f43f98d6..b1d70e26 100644 --- a/back/Dockerfile +++ b/back/Dockerfile @@ -1,6 +1,8 @@ FROM python:3.10 -# make the 'app' folder the current working directory +RUN apt update && apt install -y xfonts-base xfonts-75dpi python3-pip python3-cffi python3-brotli libpango-1.0-0 libpangoft2-1.0-0 \ + && rm -rf /var/lib/apt/lists/* + WORKDIR /code # copy both 'package.json' and 'package-lock.json' (if available) diff --git a/back/app/contract/__init__.py b/back/app/contract/__init__.py index 944807a6..a386e75f 100644 --- a/back/app/contract/__init__.py +++ b/back/app/contract/__init__.py @@ -1,7 +1,7 @@ from fastapi import APIRouter from .routes_draft import draft_router -from .routes_print import print_router +from .print import print_router contract_router = APIRouter() diff --git a/back/app/contract/models.py b/back/app/contract/models.py index cfc78bc8..495b7c31 100644 --- a/back/app/contract/models.py +++ b/back/app/contract/models.py @@ -1,3 +1,4 @@ +import datetime from typing import List, Literal from enum import Enum @@ -28,6 +29,15 @@ class Party(BaseModel): } ) part: str + representative_id: str = Field( + foreignKey={ + "reference": { + "resource": "entity", + "schema": "Entity", + } + }, + default="" + ) class ProvisionGenuine(BaseModel): @@ -64,3 +74,5 @@ class ContractDraft(CrudDocument): format="dictionary", ) status: ContractDraftStatus = Field(default=ContractDraftStatus.draft) + location: str = "" + date: datetime.date = datetime.date(1970, 1, 1) diff --git a/back/app/contract/print/__init__.py b/back/app/contract/print/__init__.py new file mode 100644 index 00000000..c16f4969 --- /dev/null +++ b/back/app/contract/print/__init__.py @@ -0,0 +1,96 @@ +from fastapi import APIRouter +from fastapi.responses import HTMLResponse, FileResponse +from fastapi.templating import Jinja2Templates + +from weasyprint import HTML, CSS +from weasyprint.text.fonts import FontConfiguration + +from pathlib import Path + +from app.entity.models import Entity +from app.template.models import ProvisionTemplate +from ..schemas import ContractDraft + + +async def build_model(model): + parties = [] + for p in model.parties: + party = { + "entity": await Entity.get(p.entity_id), + "part": p.part + } + if p.representative_id: + party['representative'] = await Entity.get(p.representative_id) + + parties.append(party) + + + model.parties = parties + + provisions = [] + for p in model.provisions: + if p.provision.type == "template": + provisions.append(await ProvisionTemplate.get(p.provision.provision_template_id)) + else: + provisions.append(p.provision) + model.provisions = provisions + + model.location = "Toulouse" + model.date = "01/01/1970" + return model + + +BASE_PATH = Path(__file__).resolve().parent + +print_router = APIRouter() + + +templates = Jinja2Templates(directory=str(BASE_PATH / "templates")) + + +async def render_print(host, draft, lawyer): + template = templates.get_template("print.html") + return template.render({ + "draft": draft, + "lawyer": lawyer, + "static_host": host + }) + + +async def render_css(host, draft): + template = templates.get_template("styles.css") + return template.render({ + "draft": draft, + "static_host": host + }) + + +@print_router.get("/", response_class=HTMLResponse) +async def create() -> str: + draft = await build_model(await ContractDraft.get("63e92534aafed8b509f229c4")) + lawyer = { + "firstname": "Nathaniel", + "lastname": "Toshi", + } + + return await render_print('localhost', draft, lawyer) + + +@print_router.get("/pdf", response_class=FileResponse) +async def create_pdf() -> str: + draft = await build_model(await ContractDraft.get("63e92534aafed8b509f229c4")) + lawyer = { + "firstname": "Nathaniel", + "lastname": "Toshi", + } + + font_config = FontConfiguration() + html = HTML(string=await render_print('nginx', draft, lawyer)) + css = CSS(string=await render_css('nginx', draft), font_config=font_config) + + html.write_pdf('out.pdf', stylesheets=[css], font_config=font_config) + + return FileResponse( + "out.pdf", + media_type="application/pdf", + filename=draft.name) diff --git a/back/app/contract/print/templates/content.html b/back/app/contract/print/templates/content.html new file mode 100644 index 00000000..c7fdff47 --- /dev/null +++ b/back/app/contract/print/templates/content.html @@ -0,0 +1,30 @@ + + + + + +
+

Conditions générales & particulières

+ + {% for provision in draft.provisions %} +
+

Article {{loop.index}} - {{ provision.title|safe }}

+

{{ provision.body|safe }}

+
+ {% endfor %} + + +
+ + \ No newline at end of file diff --git a/back/app/contract/print/templates/footer.html b/back/app/contract/print/templates/footer.html new file mode 100644 index 00000000..109e120f --- /dev/null +++ b/back/app/contract/print/templates/footer.html @@ -0,0 +1,12 @@ + + + + + + + +
+ + \ No newline at end of file diff --git a/back/app/contract/print/templates/frontpage.html b/back/app/contract/print/templates/frontpage.html new file mode 100644 index 00000000..4aecf4f4 --- /dev/null +++ b/back/app/contract/print/templates/frontpage.html @@ -0,0 +1,48 @@ + + + + + +
+
+ + + +
Cooper, Hillman & Toshi LLP
6834 Innocence Boulevard
LOS SANTOS - SA
consulting@cht.law.com
+
+

{{ draft.title|upper }}

+
+

Introduction

+

Le {{ draft.date }} à {{ draft.location}}

+

Entre les soussignés :

+ {% for party in draft.parties %} +
+ {% if not loop.first %} +

ET

+ {% endif %} +

+ {% if party.entity.entity_data.type == "corporation" %} + {{ party.entity.entity_data.title }} société de {{ party.entity.entity_data.activity }} enregistrée auprès du gouvernement de San Andreas et domiciliée au {{ party.entity.address }}{% if party.representative %}, représentée par {{ party.representative.entity_data.firstname }} {{ party.representative.entity_data.middlenames }} {{ party.representative.entity_data.lastname }}{% endif %} + {% elif party.entity.entity_data.type == "individual" %} + {{ party.entity.entity_data.firstname }} {{ party.entity.entity_data.middlenames }} {{ party.entity.entity_data.lastname }} + {% if party.entity.entity_data.day_of_birth %} né le {{ party.entity.entity_data.day_of_birth.strftime('%d/%m/%Y') }} {% if true %} à {{ party.entity.entity_data.place_of_birth }}{% endif %},{% endif %} + {% if party.entity.address %} résidant à {{ party.entity.address }}, {% endif %} + {% elif party.entity.entity_data.type == "institution" %} + + {% endif %} +

+

Ci-après dénommé {{ party.part|safe }}

+ {% if loop.first %} +

d'une part

+ {% endif %} +
+ {% endfor %} +

d'autre part

+

Sous la supervision légale de Maître {{ lawyer.firstname }} {{ lawyer.lastname }}

+

Il a été convenu l'exécution des prestations ci-dessous, conformément aux conditions générales et particulières ci-après:

+
+
+ + \ No newline at end of file diff --git a/back/app/contract/print/templates/print.html b/back/app/contract/print/templates/print.html new file mode 100644 index 00000000..697ac923 --- /dev/null +++ b/back/app/contract/print/templates/print.html @@ -0,0 +1,69 @@ + + + + + +
+
+ + + +
Cooper, Hillman & Toshi LLP
6834 Innocence Boulevard
LOS SANTOS - SA
consulting@cht.law.com
+

{{ draft.title|upper }}

+
+
+

Introduction

+

Le {{ draft.date }} à {{ draft.location}}

+

Entre les soussignés :

+ {% for party in draft.parties %} +
+ {% if not loop.first %} +

ET

+ {% endif %} +

+ {% if party.entity.entity_data.type == "corporation" %} + {{ party.entity.entity_data.title }} société de {{ party.entity.entity_data.activity }} enregistrée auprès du gouvernement de San Andreas et domiciliée au {{ party.entity.address }}{% if party.representative %}, représentée par {{ party.representative.entity_data.firstname }} {{ party.representative.entity_data.middlenames }} {{ party.representative.entity_data.lastname }}{% endif %} + {% elif party.entity.entity_data.type == "individual" %} + {{ party.entity.entity_data.firstname }} {{ party.entity.entity_data.middlenames }} {{ party.entity.entity_data.lastname }} + {% if party.entity.entity_data.day_of_birth %} né le {{ party.entity.entity_data.day_of_birth.strftime('%d/%m/%Y') }} {% if true %} à {{ party.entity.entity_data.place_of_birth }}{% endif %},{% endif %} + {% if party.entity.address %} résidant à {{ party.entity.address }}, {% endif %} + {% elif party.entity.entity_data.type == "institution" %} + + {% endif %} +

+

Ci-après dénommé {{ party.part|safe }}

+ {% if loop.first %} +

d'une part

+ {% endif %} +
+ {% endfor %} +

d'autre part

+

Sous la supervision légale de Maître {{ lawyer.firstname }} {{ lawyer.lastname }}

+

Il a été convenu l'exécution des prestations ci-dessous, conformément aux conditions générales et particulières ci-après:

+
+
+
+

Conditions générales & particulières

+ + {% for provision in draft.provisions %} +
+

Article {{loop.index}} - {{ provision.title|safe }}

+

{{ provision.body|safe }}

+
+ {% endfor %} + + +
+ + diff --git a/back/app/contract/print/templates/styles.css b/back/app/contract/print/templates/styles.css new file mode 100644 index 00000000..876ba814 --- /dev/null +++ b/back/app/contract/print/templates/styles.css @@ -0,0 +1,139 @@ + +@font-face { + font-family: 'Century Schoolbook'; + src: url('http://{{ static_host }}/assets/century-schoolbook/CenturySchoolbookRegular.ttf'); +} + +@font-face { + font-family: "Century Schoolbook"; + src: url("http://{{ static_host }}/assets/century-schoolbook/CenturySchoolbookBold.ttf"); + font-weight: bold; +} + +@font-face { + font-family: "Century Schoolbook"; + src: url("http://{{ static_host }}/assets/century-schoolbook/CenturySchoolbookItalic.ttf"); + font-style: italic; +} + +@font-face { + font-family: "Century Schoolbook"; + src: url("http://{{ static_host }}/assets/century-schoolbook/CenturySchoolbookBoldItalic.ttf"); + font-weight: bold; + font-style: italic; +} + +@page{ + size: a4 portrait; + margin: 2cm 2cm 2cm 2cm; + counter-increment: page; + @bottom-center { + content: "© Cooper, Hillman & Toshi LLC - {{ draft.name }} - Page " counter(page) "/" counter(pages); + font-size: 0.8em; + } + background: url('http://{{ static_host }}/assets/watermark.png') no-repeat; + background-size:contain; +} + +@page:first { + background: none; +} + +body { + font-size:1em; + width:17cm; + font-family: 'Century Schoolbook'; +} + +#front-page-header { + page-break-inside: avoid; +} + +#front-page-header table { + width: 100%; +} + +#top-logo { + width: 5cm; + width: 5cm; + border: solid 1px black; +} + +#office-info { + text-align: right; + vertical-align: middle; +} + +h1 { + background: black; + color: white; + text-align: center; + font-size: 2.6em; + padding: 13px 0; + margin: 50px 0; + font-weight: bold; +} + +h2 { + background: lightgrey; + font-size: 1.6em; + padding: 8px 0; + font-weight: bold; +} + +.intro { + page-break-inside: avoid; +} + +.party { + page-break-inside: avoid; +} + +.part { + text-align: right; +} + + +.content h2 { + page-break-before: always; +} + +.content h3 { + margin-top: 55px; + font-weight: bold; + font-size: 1.5em; + page-break-after: avoid; +} + +.content p { + page-break-inside: avoid; + text-indent: 2em; +} + +.provision { + page-break-inside: avoid; +} + +p { + text-align: justify; +} + +.footer { + margin-top: 30px; + page-break-inside: avoid; +} + +.mention { + margin: 0px; + font-size: 0.9em; +} + +.signatures { + width: 100%; +} + +.signatures td { + vertical-align: top; + text-align: center; + height: 3cm; +} \ No newline at end of file diff --git a/back/app/entity/models.py b/back/app/entity/models.py index 9e461beb..69967be9 100644 --- a/back/app/entity/models.py +++ b/back/app/entity/models.py @@ -20,6 +20,7 @@ class Individual(EntityType): lastname: Indexed(str) surnames: List[Indexed(str)] = [] day_of_birth: date + place_of_birth: str = "" @property diff --git a/back/app/template/models.py b/back/app/template/models.py index 00a05e20..8461b613 100644 --- a/back/app/template/models.py +++ b/back/app/template/models.py @@ -17,6 +17,15 @@ class PartyTemplate(BaseModel): default="" ) part: str + representative_id: str = Field( + foreignKey={ + "reference": { + "resource": "entity", + "schema": "Entity", + } + }, + default="" + ) def remove_html_tags(text): diff --git a/back/requirements.txt b/back/requirements.txt index f3c74a10..d32fc587 100644 --- a/back/requirements.txt +++ b/back/requirements.txt @@ -3,4 +3,6 @@ fastapi_users==10.2.1 fastapi_users_db_beanie==1.1.2 motor==3.1.1 fastapi-paginate==0.1.0 -uvicorn \ No newline at end of file +uvicorn +jinja2 +weasyprint diff --git a/front/Dockerfile b/front/Dockerfile index b2e4a86c..6ae2f635 100644 --- a/front/Dockerfile +++ b/front/Dockerfile @@ -21,4 +21,4 @@ RUN npm run build EXPOSE 4200 -CMD [ "npm", "run", "ng", "serve", "--", "--host", "0.0.0.0" ] +CMD [ "npm", "run", "ng", "serve", "--", "--host", "0.0.0.0", "--disable-host-check" ] diff --git a/front/app/src/assets/SCHLBKB.TTF b/front/app/src/assets/SCHLBKB.TTF deleted file mode 100644 index cc1bfea6a89ac0faae8c5e9a44585a972b8e9949..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168756 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