Files
probo/pkg/docgen/processing_activities_template.html
Émile Ré 6600f415b7 Allow logo to take doc width
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-02 18:44:54 +04:00

537 lines
21 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Processing Activities Export</title>
<style>
@page {
size: A4;
margin: 2.5cm;
@bottom-right {
content: "Page " counter(page) " of " counter(pages);
font-family: Arial, sans-serif;
font-size: 9pt;
color: #666;
}
}
body {
font-family: Arial, sans-serif;
font-size: 7.5pt;
line-height: 1.4;
color: #333;
margin: 0;
padding: 0;
background: white;
}
/* Cover page */
.cover-page {
page-break-after: always;
}
.company-header {
margin-bottom: 30px;
page-break-after: avoid;
}
.company-logo {
max-height: 50px;
max-width: 100%;
height: auto;
width: auto;
display: block;
}
.company-name {
font-size: 16pt;
color: #1a1a1a;
margin-top: 10px;
font-weight: 600;
}
.export-title {
font-size: 22pt;
font-weight: normal;
color: #1a1a1a;
margin: 0 0 25px 0;
text-align: left;
}
.document-meta {
margin: 0 0 30px 0;
font-size: 9pt;
}
.meta-table {
width: 100%;
border-collapse: collapse;
border: 1px solid #333;
}
.meta-table td {
padding: 6px 8px;
border: 1px solid #333;
vertical-align: middle;
}
.meta-table td:first-child {
font-weight: 600;
width: 25%;
background: #f8f8f8;
color: #333;
}
.classification {
font-weight: bold;
text-transform: uppercase;
}
.purpose-section {
margin: 30px 0;
page-break-after: avoid;
}
.purpose-title {
font-size: 15pt;
font-weight: bold;
color: #000;
margin: 0 0 15px 0;
page-break-after: avoid;
}
.purpose-text {
font-size: 10pt;
color: #333;
line-height: 1.5;
text-align: justify;
}
/* Activity page */
.activity-page {
page-break-before: always;
page-break-after: always;
}
.activity-page:last-child {
page-break-after: auto;
}
.activity-title {
font-size: 15pt;
font-weight: bold;
color: #000;
margin: 0 0 15px 0;
page-break-after: avoid;
}
.activity-section {
margin-bottom: 8px;
page-break-inside: avoid;
}
.activity-section-title {
font-size: 10pt;
font-weight: bold;
color: #333;
margin: 12px 0 6px 0;
page-break-after: avoid;
page-break-inside: avoid;
}
.activity-field {
margin-bottom: 8px;
page-break-inside: avoid;
}
.activity-field-label {
font-weight: 600;
color: #333;
margin-bottom: 3px;
font-size: 7.5pt;
}
.activity-field-value {
color: #000;
font-size: 7.5pt;
line-height: 1.4;
}
.empty-value {
color: #999;
font-style: italic;
}
.activity-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
margin-bottom: 10px;
}
.activity-grid-3 {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 10px;
margin-bottom: 10px;
}
/* Annex page */
.annex-page {
page-break-before: always;
}
.annex-title {
font-size: 15pt;
font-weight: bold;
color: #000;
margin: 0 0 15px 0;
page-break-after: avoid;
}
.annex-section {
margin-bottom: 20px;
}
.annex-section-title {
font-size: 13pt;
font-weight: bold;
color: #000;
margin: 15px 0 10px 0;
}
.annex-subsection-title {
font-size: 10pt;
font-weight: bold;
color: #333;
margin: 12px 0 8px 0;
}
.annex-enum-list {
margin: 10px 0;
padding-left: 20px;
}
.annex-enum-item {
margin-bottom: 8px;
font-size: 10pt;
line-height: 1.5;
}
.annex-enum-name {
font-weight: 600;
color: #333;
}
.annex-enum-description {
color: #000;
margin-left: 5px;
}
@media print {
body {
background: white;
}
}
</style>
</head>
<body>
<div class="cover-page">
<div class="company-header">
{{- if .CompanyHorizontalLogoBase64}}
{{imgTag .CompanyHorizontalLogoBase64 "Company Logo" "company-logo"}}
{{- else}}
<div class="company-name">{{.CompanyName}}</div>
{{- end}}
</div>
<h1 class="export-title">Processing Activities</h1>
<div class="document-meta">
<table class="meta-table">
<tr>
<td>Classification</td>
<td>
<span class="classification">CONFIDENTIAL</span>
</td>
</tr>
<tr>
<td>Version</td>
<td>{{.Version}}</td>
</tr>
<tr>
<td>Published</td>
<td>{{.PublishedAt.Format "January 2, 2006"}}</td>
</tr>
</table>
</div>
<div class="purpose-section">
<div class="purpose-title">1. Purpose</div>
<div class="purpose-text">
This document provides a comprehensive overview of all processing activities within the organization.
It serves as a record of personal data processing operations, documenting the purposes, legal bases,
data categories, and associated safeguards for each activity.
</div>
</div>
</div>
{{- range $index, $activity := .Activities}}
<div class="activity-page">
{{if eq $index 0}}
<h1 class="annex-title">2. Records</h1>
{{end}}
<h1 class="annex-section-title">2.{{add $index 1}} {{$activity.Name}}</h1>
<div class="activity-section">
<div class="activity-section-title">2.{{add $index 1}}.1 General Information</div>
<div class="activity-field">
<div class="activity-field-label">Purpose</div>
<div class="activity-field-value">{{if .Purpose}}{{.Purpose}}{{else}}<span class="empty-value">Not specified</span>{{end}}</div>
</div>
<div class="activity-grid">
<div class="activity-field">
<div class="activity-field-label">Role</div>
<div class="activity-field-value">{{.Role | formatRole}}</div>
</div>
</div>
</div>
<div class="activity-section">
<div class="activity-section-title">2.{{add $index 1}}.2 Data Categories</div>
<div class="activity-grid-3">
<div class="activity-field">
<div class="activity-field-label">Data Subject Category</div>
<div class="activity-field-value">{{if .DataSubjectCategory}}{{.DataSubjectCategory}}{{else}}<span class="empty-value">Not specified</span>{{end}}</div>
</div>
<div class="activity-field">
<div class="activity-field-label">Personal Data Category</div>
<div class="activity-field-value">{{if .PersonalDataCategory}}{{.PersonalDataCategory}}{{else}}<span class="empty-value">Not specified</span>{{end}}</div>
</div>
<div class="activity-field">
<div class="activity-field-label">Special/Criminal Data</div>
<div class="activity-field-value">{{.SpecialOrCriminalData | formatSpecialOrCriminalData}}</div>
</div>
</div>
</div>
<div class="activity-section">
<div class="activity-section-title">2.{{add $index 1}}.3 Legal Basis</div>
<div class="activity-grid">
<div class="activity-field">
<div class="activity-field-label">Lawful Basis</div>
<div class="activity-field-value">{{.LawfulBasis | formatLawfulBasis}}</div>
</div>
<div class="activity-field">
<div class="activity-field-label">Consent Evidence Link</div>
<div class="activity-field-value">{{if .ConsentEvidenceLink}}{{.ConsentEvidenceLink}}{{else}}<span class="empty-value">Not specified</span>{{end}}</div>
</div>
</div>
</div>
<div class="activity-section">
<div class="activity-section-title">2.{{add $index 1}}.4 Data Sharing & Transfers</div>
<div class="activity-grid">
<div class="activity-field">
<div class="activity-field-label">Recipients</div>
<div class="activity-field-value">{{if .Recipients}}{{.Recipients}}{{else}}<span class="empty-value">Not specified</span>{{end}}</div>
</div>
<div class="activity-field">
<div class="activity-field-label">Location</div>
<div class="activity-field-value">{{if .Location}}{{.Location}}{{else}}<span class="empty-value">Not specified</span>{{end}}</div>
</div>
<div class="activity-field">
<div class="activity-field-label">International Transfers</div>
<div class="activity-field-value">{{if .InternationalTransfers}}Yes{{else}}No{{end}}</div>
</div>
<div class="activity-field">
<div class="activity-field-label">Transfer Safeguards</div>
<div class="activity-field-value">{{if .TransferSafeguards}}{{.TransferSafeguards | formatTransferSafeguard}}{{else}}<span class="empty-value">Not specified</span>{{end}}</div>
</div>
</div>
</div>
<div class="activity-section">
<div class="activity-section-title">2.{{add $index 1}}.5 Retention & Security</div>
<div class="activity-grid">
<div class="activity-field">
<div class="activity-field-label">Retention Period</div>
<div class="activity-field-value">{{if .RetentionPeriod}}{{.RetentionPeriod}}{{else}}<span class="empty-value">Not specified</span>{{end}}</div>
</div>
</div>
<div class="activity-field">
<div class="activity-field-label">Security Measures</div>
<div class="activity-field-value">{{if .SecurityMeasures}}{{.SecurityMeasures}}{{else}}<span class="empty-value">Not specified</span>{{end}}</div>
</div>
</div>
<div class="activity-section">
<div class="activity-section-title">2.{{add $index 1}}.6 Assessments & Reviews</div>
<div class="activity-grid">
<div class="activity-field">
<div class="activity-field-label">DPIA Needed</div>
<div class="activity-field-value">{{.DataProtectionImpactAssessmentNeeded | formatDPIANeeded}}</div>
</div>
<div class="activity-field">
<div class="activity-field-label">TIA Needed</div>
<div class="activity-field-value">{{.TransferImpactAssessmentNeeded | formatTIANeeded}}</div>
</div>
<div class="activity-field">
<div class="activity-field-label">Last Review Date</div>
<div class="activity-field-value">{{if .LastReviewDate}}{{.LastReviewDate.Format "January 2, 2006"}}{{else}}<span class="empty-value">Not specified</span>{{end}}</div>
</div>
<div class="activity-field">
<div class="activity-field-label">Next Review Date</div>
<div class="activity-field-value">{{if .NextReviewDate}}{{.NextReviewDate.Format "January 2, 2006"}}{{else}}<span class="empty-value">Not specified</span>{{end}}</div>
</div>
</div>
</div>
<div class="activity-section">
<div class="activity-section-title">2.{{add $index 1}}.7 Responsible Parties</div>
<div class="activity-grid">
<div class="activity-field">
<div class="activity-field-label">Data Protection Officer</div>
<div class="activity-field-value">{{if .DataProtectionOfficerFullName}}{{.DataProtectionOfficerFullName}}{{else}}<span class="empty-value">Not assigned</span>{{end}}</div>
</div>
<div class="activity-field">
<div class="activity-field-label">Vendors</div>
<div class="activity-field-value">{{if .Vendors}}{{.Vendors}}{{else}}<span class="empty-value">None</span>{{end}}</div>
</div>
</div>
</div>
</div>
{{- end}}
<div class="annex-page">
<h1 class="annex-title">3. Annexes</h1>
<div class="annex-section">
<div class="annex-section-title">3.1 Lexicon</div>
</div>
<div class="annex-section">
<div class="annex-subsection-title">Role</div>
<ul class="annex-enum-list">
<li class="annex-enum-item">
<span class="annex-enum-name">Controller:</span>
<span class="annex-enum-description">The entity that determines the purposes and means of processing personal data.</span>
</li>
<li class="annex-enum-item">
<span class="annex-enum-name">Processor:</span>
<span class="annex-enum-description">The entity that processes personal data on behalf of the controller.</span>
</li>
</ul>
</div>
<div class="annex-section">
<div class="annex-subsection-title">Lawful Basis</div>
<ul class="annex-enum-list">
<li class="annex-enum-item">
<span class="annex-enum-name">Consent:</span>
<span class="annex-enum-description">The data subject has given consent to the processing of their personal data.</span>
</li>
<li class="annex-enum-item">
<span class="annex-enum-name">Contractual Necessity:</span>
<span class="annex-enum-description">Processing is necessary for the performance of a contract to which the data subject is party.</span>
</li>
<li class="annex-enum-item">
<span class="annex-enum-name">Legal Obligation:</span>
<span class="annex-enum-description">Processing is necessary for compliance with a legal obligation to which the controller is subject.</span>
</li>
<li class="annex-enum-item">
<span class="annex-enum-name">Legitimate Interest:</span>
<span class="annex-enum-description">Processing is necessary for the purposes of the legitimate interests pursued by the controller or a third party.</span>
</li>
<li class="annex-enum-item">
<span class="annex-enum-name">Public Task:</span>
<span class="annex-enum-description">Processing is necessary for the performance of a task carried out in the public interest or in the exercise of official authority.</span>
</li>
<li class="annex-enum-item">
<span class="annex-enum-name">Vital Interests:</span>
<span class="annex-enum-description">Processing is necessary to protect the vital interests of the data subject or of another natural person.</span>
</li>
</ul>
</div>
<div class="annex-section">
<div class="annex-subsection-title">Special/Criminal Data</div>
<ul class="annex-enum-list">
<li class="annex-enum-item">
<span class="annex-enum-name">Yes:</span>
<span class="annex-enum-description">The processing activity involves special categories of personal data or data relating to criminal convictions and offences.</span>
</li>
<li class="annex-enum-item">
<span class="annex-enum-name">No:</span>
<span class="annex-enum-description">The processing activity does not involve special categories of personal data or data relating to criminal convictions and offences.</span>
</li>
<li class="annex-enum-item">
<span class="annex-enum-name">Possible:</span>
<span class="annex-enum-description">The processing activity may involve special categories of personal data or data relating to criminal convictions and offences.</span>
</li>
</ul>
</div>
<div class="annex-section">
<div class="annex-subsection-title">Transfer Safeguards</div>
<ul class="annex-enum-list">
<li class="annex-enum-item">
<span class="annex-enum-name">Standard Contractual Clauses:</span>
<span class="annex-enum-description">Standard contractual clauses approved by the European Commission are used to ensure adequate protection for international transfers.</span>
</li>
<li class="annex-enum-item">
<span class="annex-enum-name">Binding Corporate Rules:</span>
<span class="annex-enum-description">Binding corporate rules approved by a supervisory authority are used to ensure adequate protection for international transfers.</span>
</li>
<li class="annex-enum-item">
<span class="annex-enum-name">Adequacy Decision:</span>
<span class="annex-enum-description">The European Commission has determined that the third country ensures an adequate level of protection.</span>
</li>
<li class="annex-enum-item">
<span class="annex-enum-name">Derogations:</span>
<span class="annex-enum-description">A derogation under Article 49 of the GDPR is used for the international transfer.</span>
</li>
<li class="annex-enum-item">
<span class="annex-enum-name">Codes of Conduct:</span>
<span class="annex-enum-description">An approved code of conduct together with binding and enforceable commitments is used to ensure adequate protection.</span>
</li>
<li class="annex-enum-item">
<span class="annex-enum-name">Certification Mechanisms:</span>
<span class="annex-enum-description">An approved certification mechanism together with binding and enforceable commitments is used to ensure adequate protection.</span>
</li>
</ul>
</div>
<div class="annex-section">
<div class="annex-subsection-title">DPIA Needed</div>
<ul class="annex-enum-list">
<li class="annex-enum-item">
<span class="annex-enum-name">Yes:</span>
<span class="annex-enum-description">A Data Protection Impact Assessment is required for this processing activity.</span>
</li>
<li class="annex-enum-item">
<span class="annex-enum-name">No:</span>
<span class="annex-enum-description">A Data Protection Impact Assessment is not required for this processing activity.</span>
</li>
</ul>
</div>
<div class="annex-section">
<div class="annex-subsection-title">TIA Needed</div>
<ul class="annex-enum-list">
<li class="annex-enum-item">
<span class="annex-enum-name">Yes:</span>
<span class="annex-enum-description">A Transfer Impact Assessment is required for this processing activity.</span>
</li>
<li class="annex-enum-item">
<span class="annex-enum-name">No:</span>
<span class="annex-enum-description">A Transfer Impact Assessment is not required for this processing activity.</span>
</li>
</ul>
</div>
</div>
</body>
</html>