Files
ACORE/templates/pages/report-sign.html
T
lokses 03019898b0 reports: КЕП-подпись PDF отчётов; задачи: загрузка вложений.
Добавлена офлайн/EndUser-подпись «ознакомлен и принял в работу» для документов отчётов и файловые вложения к задачам через Nextcloud.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-06 21:13:28 +03:00

127 lines
9.0 KiB
HTML

{% load i18n %}
<div class="page-content" id="kep-sign-page"
data-doc-id="{{ document.pk }}"
data-prepare-url="{% url 'report_document_sign_prepare' document.pk %}"
data-complete-url="{% url 'report_document_sign_complete' document.pk %}">
<div style="margin-bottom:1rem;">
<a href="/reports/" hx-get="/reports/" hx-target="#main-content" hx-push-url="/reports/" hx-indicator="#loader"
style="font-size:0.8125rem; color:var(--color-muted-foreground); text-decoration:none;">← {% trans "Все отчёты" %}</a>
</div>
{% if sign_message %}
<div style="margin-bottom:1rem; padding:0.65rem 0.9rem; border-radius:0.5rem; background:color-mix(in srgb, #16a34a 12%, var(--color-card)); border:1px solid color-mix(in srgb, #16a34a 30%, var(--color-border)); font-size:0.8125rem;">{{ sign_message }}</div>
{% endif %}
{% if sign_error %}
<div style="margin-bottom:1rem; padding:0.65rem 0.9rem; border-radius:0.5rem; background:color-mix(in srgb, #dc2626 12%, var(--color-card)); border:1px solid color-mix(in srgb, #dc2626 30%, var(--color-border)); font-size:0.8125rem;">{{ sign_error }}</div>
{% endif %}
<div style="margin-bottom:1.25rem;">
<h1 style="font-size:1.25rem; font-weight:500; color:var(--color-foreground); margin:0;">{% trans "Подпись КЕП" %}</h1>
<p style="font-size:0.875rem; color:var(--color-muted-foreground); margin:0.35rem 0 0; max-width:40rem;">
{% trans "Ознакомлен и принял в работу" %} — {{ document.title }}
</p>
</div>
<div style="display:grid; grid-template-columns:1fr; gap:1rem; max-width:44rem;">
<div style="background:var(--color-card); border:1px solid var(--color-border); border-radius:0.75rem; padding:1.25rem;">
<h2 style="font-size:0.9375rem; font-weight:600; margin:0 0 0.75rem;">{% trans "Статус" %}</h2>
{% if kep_signature %}
<div style="font-size:0.875rem; color:var(--color-foreground);">
<span class="badge badge-success">{% trans "Подписано" %}</span>
<div style="margin-top:0.5rem; color:var(--color-muted-foreground); font-size:0.8125rem;">
{{ kep_signature.cert_subject|default:kep_signature.signer.get_full_name|default:"—" }}
· {{ kep_signature.signed_at|date:"d.m.Y H:i" }}
{% if kep_signature.cert_serial %}
· СН {{ kep_signature.cert_serial }}
{% endif %}
</div>
<a href="{% url 'report_document_signed_download' document.pk kep_signature.pk %}"
class="btn btn-secondary" style="margin-top:0.75rem; font-size:0.8125rem;">{% trans "Скачать подписанный PDF" %}</a>
</div>
{% else %}
<span class="badge badge-muted">{% trans "Не подписан" %}</span>
{% endif %}
</div>
<div style="background:var(--color-card); border:1px solid var(--color-border); border-radius:0.75rem; padding:1.25rem;">
<h2 style="font-size:0.9375rem; font-weight:600; margin:0 0 0.5rem;">{% trans "1. Скачайте PDF" %}</h2>
<p style="font-size:0.8125rem; color:var(--color-muted-foreground); margin:0 0 0.75rem; line-height:1.45;">
{% trans "Портал подготовит PDF для подписи. Ключ КЕП на сервер не передаётся." %}
</p>
<a href="{% url 'report_document_sign_prepare' document.pk %}"
class="btn btn-primary" style="font-size:0.8125rem;" id="kep-download-pdf"
data-kep-prepare>{% trans "Скачать PDF для подписи" %}</a>
<div id="kep-sha-line" style="margin-top:0.5rem; font-size:0.7rem; color:var(--color-muted-foreground); word-break:break-all;"></div>
</div>
<div style="background:var(--color-card); border:1px solid var(--color-border); border-radius:0.75rem; padding:1.25rem;" id="kep-browser-block">
<h2 style="font-size:0.9375rem; font-weight:600; margin:0 0 0.5rem;">{% trans "2. Подпись в браузере (ІІТ EndUser)" %}</h2>
<p style="font-size:0.8125rem; color:var(--color-muted-foreground); margin:0 0 0.75rem; line-height:1.45;">
{% trans "Если в системе установлены скрипты ІІТ EndUser (ключ ПриватБанка / файловый ключ / токен), можно подписать прямо здесь." %}
</p>
<div id="kep-enduser-status" style="font-size:0.8125rem; color:var(--color-muted-foreground); margin-bottom:0.75rem;">
{% trans "Библиотека EndUser не обнаружена — используйте офлайн-подпись ниже." %}
</div>
<button type="button" class="btn btn-secondary" id="kep-browser-sign" style="font-size:0.8125rem;" disabled>
{% trans "Подписать ключом в браузере" %}
</button>
</div>
<div style="background:var(--color-card); border:1px solid var(--color-border); border-radius:0.75rem; padding:1.25rem;">
<h2 style="font-size:0.9375rem; font-weight:600; margin:0 0 0.5rem;">{% trans "3. Офлайн: подписать и загрузить" %}</h2>
<ol style="margin:0 0 0.875rem; padding-left:1.25rem; font-size:0.8125rem; color:var(--color-muted-foreground); line-height:1.55;">
<li>{% trans "Откройте скачанный PDF в программе подписи (EUSignCP, «Підпис» ПриватБанка и т.п.)." %}</li>
<li>{% trans "Подпишите своим КЕП (PAdES — подпись внутри PDF)." %}</li>
<li>{% trans "Загрузите подписанный файл сюда." %}</li>
</ol>
<form method="post" action="{% url 'report_document_sign_complete' document.pk %}"
enctype="multipart/form-data" id="kep-offline-form"
style="display:flex; flex-direction:column; gap:0.65rem; margin:0;">
{% csrf_token %}
<input type="hidden" name="offline" value="1">
<input type="hidden" name="content_sha256" id="kep-content-sha" value="">
<label style="font-size:0.75rem; color:var(--color-muted-foreground);">
{% trans "Подписанный PDF" %}
<input type="file" name="file" required accept=".pdf,application/pdf"
style="display:block; margin-top:0.25rem; font-size:0.8125rem; max-width:100%;">
</label>
<label style="font-size:0.75rem; color:var(--color-muted-foreground);">
{% trans "ФИО из сертификата (если известно)" %}
<input type="text" name="cert_subject" class="input" maxlength="500"
placeholder="{% trans 'Например: Иванов Иван Иванович' %}"
style="margin-top:0.25rem; font-size:0.8125rem;">
</label>
<label style="font-size:0.75rem; color:var(--color-muted-foreground);">
{% trans "Серийный номер сертификата (необязательно)" %}
<input type="text" name="cert_serial" class="input" maxlength="120"
style="margin-top:0.25rem; font-size:0.8125rem;">
</label>
<button type="submit" class="btn btn-primary" style="font-size:0.8125rem; align-self:flex-start;">
{% trans "Загрузить подпись" %}
</button>
</form>
</div>
{% if kep_history %}
<div style="background:var(--color-card); border:1px solid var(--color-border); border-radius:0.75rem; padding:1.25rem;">
<h2 style="font-size:0.9375rem; font-weight:600; margin:0 0 0.75rem;">{% trans "История подписей" %}</h2>
<ul style="margin:0; padding:0; list-style:none; font-size:0.8125rem;">
{% for s in kep_history %}
<li style="padding:0.4rem 0; border-top:1px solid var(--color-border); display:flex; justify-content:space-between; gap:0.75rem; flex-wrap:wrap;">
<span>
{{ s.cert_subject|default:s.signer.get_full_name|default:"—" }}
<span style="color:var(--color-muted-foreground);">· {{ s.signed_at|date:"d.m.Y H:i" }}</span>
</span>
<a href="{% url 'report_document_signed_download' document.pk s.pk %}"
style="color:var(--color-primary); text-decoration:none;">{% trans "PDF" %}</a>
</li>
{% endfor %}
</ul>
</div>
{% endif %}
</div>
</div>
<script src="/static/assets/js/kep-sign.js"></script>