diff --git a/### shiftflow/templates/shiftflow/steel_grades_catalog.html django b/### shiftflow/templates/shiftflow/steel_grades_catalog.html django
new file mode 100644
index 0000000..9cc4010
--- /dev/null
+++ b/### shiftflow/templates/shiftflow/steel_grades_catalog.html django
@@ -0,0 +1,129 @@
+{% extends 'base.html' %}
+
+{% block content %}
+
- {% for it in items %}
+ {% for wi in workitems %}
- {{ it.date|date:"d.m.Y" }}
- {{ it.task.deal.number }}
- {{ it.task.drawing_name }}
- {{ it.quantity_plan }}
+ {{ wi.date|date:"d.m.Y" }}
+ {{ wi.deal.number }}
+ {{ wi.entity.drawing_number|default:"—" }} {{ wi.entity.name }}
+ {{ wi.remaining }}
-
+
- Полностью
- Частично
-
-
+ Полностью
+ Частично
+
+
diff --git a/shiftflow/templates/shiftflow/closing_workitems.html b/shiftflow/templates/shiftflow/closing_workitems.html
new file mode 100644
index 0000000..2aa39ce
--- /dev/null
+++ b/shiftflow/templates/shiftflow/closing_workitems.html
@@ -0,0 +1,78 @@
+{% extends 'base.html' %}
+
+{% block content %}
+
+
+
+
+
+
+
+
+
+ {% for wi in workitems %}
+
+
+ {{ wi.deal.number }}
+
+
+
+ {{ wi.entity.get_entity_type_display }}
+
+
+ {% if wi.operation %}{{ wi.operation.name }}{% else %}{{ wi.stage|default:"—" }}{% endif %}
+
+
+ {% if wi.machine %}{{ wi.machine.name }}{% elif wi.workshop %}{{ wi.workshop.name }}{% else %}—{% endif %}
+
+ {{ wi.quantity_plan }}
+ {{ wi.quantity_done }}
+
+ {{ wi.remaining }}
+
+
+
+ Закрыть
+
+
+
+ {% empty %}
+
+ Нет активных сменных заданий.
+
+ {% endfor %}
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/shiftflow/templates/shiftflow/customer_deals.html b/shiftflow/templates/shiftflow/customer_deals.html
index aeabf0a..c01ad6e 100644
--- a/shiftflow/templates/shiftflow/customer_deals.html
+++ b/shiftflow/templates/shiftflow/customer_deals.html
@@ -86,6 +86,10 @@
Завершена
+
+ Срок отгрузки
+
+
Описание
@@ -112,6 +116,7 @@ document.addEventListener('DOMContentLoaded', function () {
const dealNumber = document.getElementById('dealNumber');
const dealStatus = document.getElementById('dealStatus');
const dealDescription = document.getElementById('dealDescription');
+ const dealDueDate = document.getElementById('dealDueDate');
const dealSaveBtn = document.getElementById('dealSaveBtn');
function getCookie(name) {
@@ -139,6 +144,7 @@ document.addEventListener('DOMContentLoaded', function () {
dealModal.addEventListener('show.bs.modal', function () {
if (dealNumber) dealNumber.value = '';
if (dealDescription) dealDescription.value = '';
+ if (dealDueDate) dealDueDate.value = '';
if (dealStatus) dealStatus.value = 'work';
});
}
@@ -150,6 +156,7 @@ document.addEventListener('DOMContentLoaded', function () {
status: dealStatus ? dealStatus.value : 'work',
company_id: '{{ company.id }}',
description: (dealDescription ? dealDescription.value : ''),
+ due_date: dealDueDate ? dealDueDate.value : '',
};
await postForm('{% url "deal_upsert" %}', payload);
window.location.reload();
diff --git a/shiftflow/templates/shiftflow/directories.html b/shiftflow/templates/shiftflow/directories.html
new file mode 100644
index 0000000..5ac91ca
--- /dev/null
+++ b/shiftflow/templates/shiftflow/directories.html
@@ -0,0 +1,36 @@
+{% extends 'base.html' %}
+
+{% block content %}
+
+{% endblock %}
\ No newline at end of file
diff --git a/shiftflow/templates/shiftflow/legacy_closing.html b/shiftflow/templates/shiftflow/legacy_closing.html
new file mode 100644
index 0000000..38aea9e
--- /dev/null
+++ b/shiftflow/templates/shiftflow/legacy_closing.html
@@ -0,0 +1,291 @@
+{% extends 'base.html' %}
+
+{% block content %}
+
+
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/shiftflow/templates/shiftflow/legacy_registry.html b/shiftflow/templates/shiftflow/legacy_registry.html
new file mode 100644
index 0000000..3778994
--- /dev/null
+++ b/shiftflow/templates/shiftflow/legacy_registry.html
@@ -0,0 +1,21 @@
+{% extends 'base.html' %}
+
+{% block content %}
+{% include 'shiftflow/partials/_filter.html' %}
+
+
+
+
+ {% include 'shiftflow/partials/_items_table.html' with items=items %}
+
+{% endblock %}
\ No newline at end of file
diff --git a/shiftflow/templates/shiftflow/legacy_writeoffs.html b/shiftflow/templates/shiftflow/legacy_writeoffs.html
new file mode 100644
index 0000000..ab993d2
--- /dev/null
+++ b/shiftflow/templates/shiftflow/legacy_writeoffs.html
@@ -0,0 +1,173 @@
+{% extends 'base.html' %}
+
+{% block content %}
+
+
+
+
+
+
+ {% for card in report_cards %}
+
+
+
+ {{ card.report.date|date:"d.m.Y" }} — {{ card.report.machine }} — {{ card.report.operator }}
+ #{{ card.report.id }}
+
+
+
+
+
+
Списано
+ {% if card.report.consumptions.all %}
+
+ {% for c in card.report.consumptions.all %}
+ {% if c.stock_item_id and c.stock_item.material_id %}
+
+ {{ c.stock_item.material.full_name|default:c.stock_item.material.name }}
+ ({% if c.stock_item.current_length and c.stock_item.current_width %}{{ c.stock_item.current_length|floatformat:"-g" }}×{{ c.stock_item.current_width|floatformat:"-g" }}{% elif c.stock_item.current_length %}{{ c.stock_item.current_length|floatformat:"-g" }}{% else %}—{% endif %})
+ {{ c.quantity|floatformat:"-g" }} шт
+
+ {% elif c.material_id %}
+ {{ c.material }} {{ c.quantity|floatformat:"-g" }} шт
+ {% else %}
+ — {{ c.quantity|floatformat:"-g" }} шт
+ {% endif %}
+ {% endfor %}
+
+ {% else %}
+
—
+ {% endif %}
+
+
+
+
Произведено
+ {% if card.produced %}
+
+ {% for k,v in card.produced.items %}
+ {{ k }}: {{ v }} шт
+ {% endfor %}
+
+ {% else %}
+
—
+ {% endif %}
+
+
+
+
Остаток ДО
+ {% if card.report.remnants.all %}
+
+ {% for r in card.report.remnants.all %}
+
+ {{ r.material.full_name|default:r.material.name|default:r.material }}
+ ({% if r.current_length and r.current_width %}{{ r.current_length|floatformat:"-g" }}×{{ r.current_width|floatformat:"-g" }}{% elif r.current_length %}{{ r.current_length|floatformat:"-g" }}{% else %}—{% endif %})
+ {{ r.quantity|floatformat:"-g" }} шт
+
+ {% endfor %}
+
+ {% else %}
+
—
+ {% endif %}
+
+
+
+ {% empty %}
+
За выбранный период отчётов нет.
+ {% endfor %}
+
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/shiftflow/templates/shiftflow/locations_catalog.html b/shiftflow/templates/shiftflow/locations_catalog.html
new file mode 100644
index 0000000..47b76c5
--- /dev/null
+++ b/shiftflow/templates/shiftflow/locations_catalog.html
@@ -0,0 +1,72 @@
+{% extends 'base.html' %}
+
+{% block content %}
+
+
+
+ {% if can_edit %}
+
+ {% endif %}
+
+
+
+
+
+
+
+ {% for l in locations %}
+
+ {{ forloop.counter }}
+
+
+ {% if can_edit %}
+
+
+
+ {% if can_edit %}
+ Сохранить
+
+ {% else %}
+ —
+ {% endif %}
+
+
+ {% empty %}
+ Складов нет.
+ {% endfor %}
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/shiftflow/templates/shiftflow/machines_catalog.html b/shiftflow/templates/shiftflow/machines_catalog.html
new file mode 100644
index 0000000..9cd9db0
--- /dev/null
+++ b/shiftflow/templates/shiftflow/machines_catalog.html
@@ -0,0 +1,158 @@
+{% extends 'base.html' %}
+
+{% block content %}
+
+
+
+
+ {% if can_edit %}
+
+ {% else %}
+
+
+
Цех
+
{{ workshop.name }}
+
+
+
Склад цеха
+
{{ workshop.location.name|default:"—" }}
+
+
+ {% endif %}
+
+
+
+
+
+
+
+
+ {% for m in machines %}
+
+ {{ forloop.counter }}
+ {{ m.id }}
+
+
+ {% if can_edit %}
+
+
+
+ {% if can_edit %}
+
+ {% for k, v in machine_types %}
+ {{ v }}
+ {% endfor %}
+
+ {% else %}
+ {{ m.get_machine_type_display }}
+ {% endif %}
+
+
+
+ {% if can_edit %}
+
+ Сохранить
+
+
+
+ {% else %}
+ —
+ {% endif %}
+
+
+ {% empty %}
+ Постов нет.
+ {% endfor %}
+
+
+
+
+
+{% if can_edit %}
+
+{% endif %}
+{% endblock %}
\ No newline at end of file
diff --git a/shiftflow/templates/shiftflow/material_categories_catalog.html b/shiftflow/templates/shiftflow/material_categories_catalog.html
new file mode 100644
index 0000000..5d5cbda
--- /dev/null
+++ b/shiftflow/templates/shiftflow/material_categories_catalog.html
@@ -0,0 +1,149 @@
+{% extends 'base.html' %}
+
+{% block content %}
+
+
+
+
+
+
+
+
+
+ {% for c in categories %}
+
+ {{ c.name }}
+ {{ c.gost_standard|default:"—" }}
+ {{ c.get_form_factor_display }}
+
+ {% empty %}
+ Нет данных
+ {% endfor %}
+
+
+
+
+
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/shiftflow/templates/shiftflow/materials_catalog.html b/shiftflow/templates/shiftflow/materials_catalog.html
new file mode 100644
index 0000000..e5a2b18
--- /dev/null
+++ b/shiftflow/templates/shiftflow/materials_catalog.html
@@ -0,0 +1,179 @@
+{% extends 'base.html' %}
+
+{% block content %}
+
+
+
+
+
+
+
+
+
+ {% for r in rows %}
+
+ {{ r.m.category.name }}
+ {{ r.m.steel_grade.name|default:"—" }}
+ {{ r.m.name }}
+ {{ r.m.full_name }}
+
+ {% if r.m.mass_per_unit %}
+ {{ r.m.mass_per_unit|floatformat:"-g" }} {{ r.unit }}
+ {% else %}
+ —
+ {% endif %}
+
+
+ {% empty %}
+ Нет данных
+ {% endfor %}
+
+
+
+
+
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/shiftflow/templates/shiftflow/partials/_filter.html b/shiftflow/templates/shiftflow/partials/_filter.html
index 27f7a33..60a9b31 100644
--- a/shiftflow/templates/shiftflow/partials/_filter.html
+++ b/shiftflow/templates/shiftflow/partials/_filter.html
@@ -25,6 +25,9 @@
В работе
+
+
Недодел
+
Завершено
{% else %}
@@ -32,29 +35,14 @@
В работе
-
Недодел
+
Недодел
Завершено
-
- {% if user_role in 'admin,technologist' %}
-
-
Импорт
- {% endif %}
{% endif %}
- {% if user_role in 'admin,technologist,clerk' %}
-
- Учёт 1С:
-
- Все
- Учтено
- Ожидает
-
-
- {% endif %}
С:
@@ -95,8 +83,7 @@
const data = {
statuses: Array.from(form.querySelectorAll('input[name="statuses"]:checked')).map(i=>i.value),
m_ids: Array.from(form.querySelectorAll('input[name="m_ids"]:checked')).map(i=>i.value),
- start_date: s ? s.value : '',
- is_synced: (form.querySelector('select[name="is_synced"]')||{}).value || ''
+ start_date: s ? s.value : ''
};
try { localStorage.setItem('registry_filters', JSON.stringify(data)); } catch(_){}
}
@@ -122,8 +109,6 @@
}
if (s) s.value = data.start_date || weekAgo;
if (e) e.value = today;
- const sel = form.querySelector('select[name="is_synced"]');
- if (sel && data.is_synced !== undefined) sel.value = data.is_synced;
const filtered = form.querySelector('input[name="filtered"]');
if (filtered) filtered.value = '1';
form.submit();
diff --git a/shiftflow/templates/shiftflow/partials/_workitems_table.html b/shiftflow/templates/shiftflow/partials/_workitems_table.html
new file mode 100644
index 0000000..8aaa12e
--- /dev/null
+++ b/shiftflow/templates/shiftflow/partials/_workitems_table.html
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+ {% for wi in workitems %}
+
+ {{ wi.date|date:"d.m.y" }}
+ {{ wi.deal.number|default:"-" }}
+
+ {% if wi.machine %}
+ {{ wi.workshop.name|default:"—" }}/{{ wi.machine.name }}
+ {% elif wi.workshop %}
+ {{ wi.workshop.name }}
+ {% else %}
+ —
+ {% endif %}
+
+
+ {{ wi.entity.drawing_number|default:"—" }} {{ wi.entity.name }}
+
+
+ {% if wi.entity.planned_material %}
+ {{ wi.entity.planned_material.full_name|default:wi.entity.planned_material.name }}
+ {% else %}
+ —
+ {% endif %}
+
+
+ {% if wi.entity.dxf_file %}
+
+
+
+ {% endif %}
+ {% if wi.entity.pdf_main %}
+
+
+
+ {% endif %}
+
+
+
+
+
+ {{ wi.quantity_plan }} /
+ {{ wi.quantity_done }}
+
+
+ {% if wi.status == 'done' %}
+ {{ wi.get_status_display }}
+ {% elif wi.status == 'leftover' %}
+ {{ wi.get_status_display }}
+ {% else %}
+ {{ wi.get_status_display }}
+ {% endif %}
+
+
+ {% empty %}
+ Записей WorkItem нет
+ {% endfor %}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/shiftflow/templates/shiftflow/partials_workitems_table.html b/shiftflow/templates/shiftflow/partials_workitems_table.html
new file mode 100644
index 0000000..e69de29
diff --git a/shiftflow/templates/shiftflow/planning.html b/shiftflow/templates/shiftflow/planning.html
index ef2e9c4..57b20d4 100644
--- a/shiftflow/templates/shiftflow/planning.html
+++ b/shiftflow/templates/shiftflow/planning.html
@@ -88,6 +88,10 @@
Создать
+
+ Срок отгрузки
+
+
Описание
@@ -157,6 +161,7 @@ document.addEventListener('DOMContentLoaded', function () {
const dealStatus = document.getElementById('dealStatus');
const dealCompany = document.getElementById('dealCompany');
const dealDescription = document.getElementById('dealDescription');
+ const dealDueDate = document.getElementById('dealDueDate');
const dealSaveBtn = document.getElementById('dealSaveBtn');
const openCompanyModalBtn = document.getElementById('openCompanyModalBtn');
@@ -234,6 +239,7 @@ document.addEventListener('DOMContentLoaded', function () {
dealId.value = '';
dealNumber.value = '';
dealDescription.value = '';
+ if (dealDueDate) dealDueDate.value = '';
if (dealStatus) dealStatus.value = 'work';
if (dealCompany) dealCompany.value = '';
});
@@ -268,6 +274,7 @@ document.addEventListener('DOMContentLoaded', function () {
status: dealStatus ? dealStatus.value : 'work',
company_id: dealCompany.value,
description: dealDescription.value,
+ due_date: dealDueDate ? dealDueDate.value : '',
};
await postForm('{% url "deal_upsert" %}', payload);
window.location.reload();
diff --git a/shiftflow/templates/shiftflow/planning_deal.html b/shiftflow/templates/shiftflow/planning_deal.html
index 1961ac1..9949438 100644
--- a/shiftflow/templates/shiftflow/planning_deal.html
+++ b/shiftflow/templates/shiftflow/planning_deal.html
@@ -17,126 +17,752 @@
{{ deal.get_status_display }}
+
+ {% if deal.status == 'lead' and user_role in 'admin,prod_head,technologist,master,clerk' %}
+
+ {% endif %}
+
Назад
+ {% if user_role in 'admin,prod_head,technologist,master' %}
+
+ {% endif %}
{% if user_role in 'admin,technologist' %}
-
- Добавить деталь
-
+
+ Добавить задание
+
{% endif %}
-
-
-
-
-
-
- {% for t in tasks %}
-
- {{ t.drawing_name|default:"Б/ч" }}
- {{ t.material.full_name|default:t.material.name }}
- {{ t.size_value }}
-
-
-
-
- {{ t.quantity_ordered }} /
- {{ t.done_qty }} /
- {{ t.planned_qty }}
-
- {{ t.remaining_qty }}
-
- {% if t.drawing_file %}
-
-
-
- {% endif %}
- {% if t.extra_drawing %}
-
-
-
- {% endif %}
-
-
- {% if user_role in 'admin,technologist' %}
-
- В план
-
- {% endif %}
-
-
- {% empty %}
- Деталей не найдено
- {% endfor %}
-
-
+
+
+
+
+
+
+
+
+
+
+
+ {% for it in deal_items %}
+
+
+ {{ it.entity.drawing_number|default:"—" }} {{ it.entity.name }}
+ {{ it.entity.get_entity_type_display }}
+
+
+
+
+
+ {{ it.quantity }} /
+ {{ it.done_qty }} /
+ {{ it.planned_qty }}
+
+ {{ it.remaining_qty }}
+
+ {% if user_role in 'admin,technologist' %}
+
+ В производство
+
+ {% else %}
+ В производство
+ {% endif %}
+
+
+ {% empty %}
+ Пока нет позиций
+ {% endfor %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {% for b in delivery_batches %}
+
+ {{ b.due_date|date:"d.m.Y" }}
+
+ {{ b.name|default:"—" }}
+ {% if b.is_default %}
+ по умолчанию
+ {% endif %}
+
+
+ {{ b.total_started }} / {{ b.total_qty }} (осталось {{ b.total_remaining }})
+
+
+
+ {% if b.items_list %}
+
+
+
+
+
+
+ {% for bi in b.items_list %}
+
+ {{ bi.entity.get_entity_type_display }}
+ {{ bi.entity.drawing_number|default:"—" }}
+ {{ bi.entity.name }}
+ {{ bi.quantity }}
+ {{ bi.started_qty }}
+ {{ bi.remaining_to_start }}
+
+
+
+
+ {% if user_role in 'admin,technologist' and not b.is_default %}
+ Добавить
+
+ {% endif %}
+
+
+ {% endfor %}
+
+
+
+ {% else %}
+ Пусто
+ {% endif %}
+
+
+ {% if user_role in 'admin,technologist' and not b.is_default %}
+ Добавить
+
+ {% endif %}
+
+
+ {% empty %}
+ Партий пока нет
+ {% endfor %}
+
+
+
+
+
+
+ {% for g in workshop_task_groups %}
+
+
+
+
+
+
+
+
+ {% for t in g.tasks %}
+
+
+
+ {% if t.entity %}
+ {{ t.entity.drawing_number|default:"—" }} {{ t.entity.name }}
+ {% else %}
+ {{ t.drawing_name|default:"Б/ч" }}
+ {% endif %}
+
+
+ {% if t.material %}{{ t.material.full_name|default:t.material.name }}{% else %}—{% endif %}
+
+
+ {{ t.current_operation_name|default:"—" }}
+
+
+
+
+ {{ t.quantity_ordered }} /
+ {{ t.done_qty }} /
+ {{ t.planned_qty }}
+
+ {{ t.remaining_qty }}
+
+ {% if t.drawing_file %}
+
+
+
+ {% endif %}
+ {% if t.extra_drawing %}
+
+
+
+ {% endif %}
+
+
+ {% if user_role in 'admin,technologist' %}
+ {% if t.current_operation_id and t.entity_id %}
+
+ В смену
+
+ {% else %}
+ В смену
+ {% endif %}
+ {% endif %}
+
+
+ {% empty %}
+ Задач нет
+ {% endfor %}
+
+
+
+
+ {% empty %}
+
Задач нет
+ {% endfor %}
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-{% endblock %}
\ No newline at end of file
+{% endblock %}
diff --git a/shiftflow/templates/shiftflow/planning_stages.html b/shiftflow/templates/shiftflow/planning_stages.html
new file mode 100644
index 0000000..8ed0b81
--- /dev/null
+++ b/shiftflow/templates/shiftflow/planning_stages.html
@@ -0,0 +1,86 @@
+{% extends 'base.html' %}
+
+{% block content %}
+
+
+
+
+ {% for c in deal_cards %}
+
+
+
+
+
+
+
+
+
+ {% for r in c.rows %}
+
+ {{ r.entity }}
+ {{ r.need }}
+ {% for cell in r.op_cells %}
+
+ {% if cell.has %}
+ {{ cell.done }}/{{ r.need }}
+
+ {% else %}
+ —
+ {% endif %}
+
+ {% endfor %}
+
+ {{ r.ready }}/{{ r.need }}
+
+
+
+ {{ r.shipped }}/{{ r.need }}
+
+
+
+ {% endfor %}
+
+
+
+
+ {% empty %}
+
Нет сделок по выбранным фильтрам.
+ {% endfor %}
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/shiftflow/templates/shiftflow/procurement_dashboard.html b/shiftflow/templates/shiftflow/procurement_dashboard.html
new file mode 100644
index 0000000..6bc9e56
--- /dev/null
+++ b/shiftflow/templates/shiftflow/procurement_dashboard.html
@@ -0,0 +1,218 @@
+{% extends 'base.html' %}
+
+{% block content %}
+
+
+
+
+
+
+
+
+
+
+ {% for r in requirements %}
+
+
+ {{ r.component_label }}
+
+
+ {% if r.type == 'raw' %}Сырьё{% elif r.type == 'purchased' %}Покупное{% elif r.type == 'casting' %}Литьё{% elif r.type == 'outsourced' %}Аутсорс{% else %}—{% endif %}
+
+
+ {{ r.required_qty }}{% if r.kind == 'raw' %} {{ r.unit }}{% endif %}
+
+
+ {% if r.deals and r.deals|length > 0 %}
+ {% for dn in r.deals|slice:":3" %}
+ {{ dn }}
+ {% endfor %}
+ {% if r.deals|length > 3 %}
+ …
+ {% endif %}
+ {% else %}
+ —
+ {% endif %}
+
+
+ {% if r.status == 'to_order' %}
+ К заказу
+ {% elif r.status == 'ordered' %}
+ Заказано
+ {% else %}
+ Закрыто
+ {% endif %}
+
+
+ {% if can_edit and not grouped and r.kind == 'component' %}
+ {% if r.status == 'to_order' %}
+
+ {% elif r.status == 'ordered' %}
+ +
+ {% else %}
+ —
+ {% endif %}
+ {% else %}
+ —
+ {% endif %}
+
+
+ {% empty %}
+ Потребностей не найдено
+ {% endfor %}
+
+
+
+
+
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/shiftflow/templates/shiftflow/procurement_print.html b/shiftflow/templates/shiftflow/procurement_print.html
new file mode 100644
index 0000000..ea4c595
--- /dev/null
+++ b/shiftflow/templates/shiftflow/procurement_print.html
@@ -0,0 +1,70 @@
+
+
+
+
+
Список к закупке
+
+
+
+
+ Распечатать
+ Закрыть
+
+
+
Список к закупке от {% now "d.m.Y" %}
+
+ {% for type_key, items in print_data.items %}
+
+ {% for code, label in type_labels.items %}
+ {% if code == type_key %}{{ label }}{% endif %}
+ {% endfor %}
+
+
+
+
+ № п/п
+ Сделка(и)
+ Наименование
+ Кол-во, шт
+ Отметки
+
+
+
+ {% for item in items %}
+
+ {{ forloop.counter }}
+
+ {% if item.deals %}
+ {{ item.deals|join:", " }}
+ {% else %}
+ -
+ {% endif %}
+
+ {{ item.component_label }}
+ {{ item.required_qty }}
+
+
+ {% endfor %}
+
+
+ {% empty %}
+
Нет данных для печати по выбранным фильтрам.
+ {% endfor %}
+
+
+
\ No newline at end of file
diff --git a/shiftflow/templates/shiftflow/product_detail.html b/shiftflow/templates/shiftflow/product_detail.html
index 90dbb3d..70886b4 100644
--- a/shiftflow/templates/shiftflow/product_detail.html
+++ b/shiftflow/templates/shiftflow/product_detail.html
@@ -4,6 +4,18 @@