All checks were successful
Deploy MES Core / deploy (push) Successful in 11s
219 lines
13 KiB
HTML
219 lines
13 KiB
HTML
{% extends 'base.html' %}
|
||
{% load l10n %}
|
||
|
||
{% block content %}
|
||
<div class="row justify-content-center">
|
||
<div class="col-lg-10 col-xl-8">
|
||
<div class="card shadow-sm border-secondary mb-4">
|
||
|
||
<div class="card-header border-secondary d-flex justify-content-between align-items-center py-3">
|
||
<h3 class="text-accent mb-0">
|
||
{% if user_role == 'operator' %}
|
||
<i class="bi bi-info-circle me-2"></i>{{ item.task.drawing_name|default:"Без названия" }}
|
||
{% else %}
|
||
<a href="{% url 'task_items' item.task.id %}" class="text-decoration-none text-reset">
|
||
<i class="bi bi-info-circle me-2"></i>{{ item.task.drawing_name|default:"Без названия" }}
|
||
</a>
|
||
{% endif %}
|
||
</h3>
|
||
{% if user_role == 'operator' %}
|
||
<span class="badge bg-secondary">Сделка № {{ item.task.deal.number }}</span>
|
||
{% else %}
|
||
<a href="{% url 'planning_deal' item.task.deal.id %}" class="text-decoration-none">
|
||
<span class="badge bg-secondary">Сделка № {{ item.task.deal.number }}</span>
|
||
</a>
|
||
{% endif %}
|
||
</div>
|
||
|
||
<form method="post" enctype="multipart/form-data" id="mainForm" class="card-body p-4">
|
||
{% csrf_token %}
|
||
<input type="hidden" name="next" value="{{ back_url }}">
|
||
|
||
{% if errors %}
|
||
<div class="alert alert-danger mb-4">
|
||
{% for e in errors %}
|
||
<div>{{ e }}</div>
|
||
{% endfor %}
|
||
</div>
|
||
{% endif %}
|
||
|
||
<div class="row g-3 mb-4 border-bottom border-secondary pb-3 text-body">
|
||
<div class="col-md-4">
|
||
<small class="text-muted d-block">Станок</small>
|
||
{% if user_role == 'master' %}
|
||
<select name="machine" class="form-select border-secondary">
|
||
{% for m in machines %}
|
||
<option value="{{ m.id }}" {% if item.machine.id == m.id %}selected{% endif %}>{{ m.name }}</option>
|
||
{% endfor %}
|
||
</select>
|
||
{% else %}
|
||
<strong>{{ item.machine.name }}</strong>
|
||
{% endif %}
|
||
</div>
|
||
<div class="col-md-4">
|
||
<small class="text-muted d-block">Материал</small>
|
||
<strong>{{ item.task.material.full_name|default:item.task.material.name }}</strong>
|
||
</div>
|
||
<div class="col-md-4">
|
||
<small class="text-muted d-block">План</small>
|
||
<strong class="text-info fs-5">{{ item.quantity_plan }} шт.</strong>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="row g-3 mb-4 border-bottom border-secondary pb-3 text-body">
|
||
<div class="col-md-6">
|
||
<small class="text-muted d-block">Размер детали</small>
|
||
<strong>{{ item.task.size_value|default:"-" }}</strong>
|
||
</div>
|
||
<div class="col-md-6">
|
||
<small class="text-muted d-block">Габариты заготовки</small>
|
||
<strong>{{ item.task.blank_dimensions|default:"—" }}</strong>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mb-4">
|
||
<div class="small text-muted mb-2">Превью</div>
|
||
<div class="row g-3">
|
||
<div class="col-md-8">
|
||
<div class="border border-secondary rounded p-2" style="height: 200px; overflow: hidden;">
|
||
{% if item.task.preview_image %}
|
||
<img src="{{ item.task.preview_image.url }}" alt="Превью DXF" style="max-width:100%; max-height:100%; object-fit:contain; display:block; margin:0 auto;">
|
||
{% else %}
|
||
<div style="width:100%; height:100%;"></div>
|
||
{% endif %}
|
||
</div>
|
||
</div>
|
||
<div class="col-md-4">
|
||
<div class="mb-3">
|
||
<div class="d-flex align-items-center gap-2 mb-2">
|
||
{% if item.task.drawing_file %}
|
||
<a href="{{ item.task.drawing_file.url }}" target="_blank" class="btn btn-sm btn-outline-info p-1" title="DXF/STEP">
|
||
<i class="bi bi-file-earmark-code"></i>
|
||
</a>
|
||
{% else %}
|
||
<span class="btn btn-sm btn-outline-secondary p-1 disabled" title="DXF/STEP">
|
||
<i class="bi bi-file-earmark-code"></i>
|
||
</span>
|
||
{% endif %}
|
||
<div class="small text-muted">DXF/STEP</div>
|
||
</div>
|
||
{% if user_role == 'admin' %}
|
||
<input type="file" name="drawing_file" class="form-control border-secondary" accept=".dxf,.iges,.igs,.step,.stp">
|
||
{% endif %}
|
||
</div>
|
||
|
||
<div>
|
||
<div class="d-flex align-items-center gap-2 mb-2">
|
||
{% if item.task.extra_drawing %}
|
||
<a href="{{ item.task.extra_drawing.url }}" target="_blank" class="btn btn-sm btn-outline-danger p-1" title="PDF">
|
||
<i class="bi bi-file-pdf"></i>
|
||
</a>
|
||
{% else %}
|
||
<span class="btn btn-sm btn-outline-secondary p-1 disabled" title="PDF">
|
||
<i class="bi bi-file-pdf"></i>
|
||
</span>
|
||
{% endif %}
|
||
<div class="small text-muted">PDF</div>
|
||
</div>
|
||
{% if user_role == 'admin' %}
|
||
<input type="file" name="extra_drawing" class="form-control border-secondary" accept="application/pdf">
|
||
{% endif %}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<input type="hidden" name="status" id="id_status" value="{{ item.status }}">
|
||
|
||
{% if user_role in 'operator,master' %}
|
||
{% if item.status == 'work' %}
|
||
<div class="bg-body-tertiary p-3 rounded border mb-4 text-center">
|
||
<div class="row g-3 text-start">
|
||
<div class="col-md-4">
|
||
<label class="small text-muted">Факт (шт)</label>
|
||
<input type="number" name="quantity_fact" id="id_quantity_fact" class="form-control border-secondary" value="{{ item.quantity_fact }}" max="{{ item.quantity_plan }}">
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
{% else %}
|
||
<div class="alert alert-success">Статус: {{ item.get_status_display }}. Сделано: {{ item.quantity_fact }} шт.</div>
|
||
<input type="hidden" name="quantity_fact" value="{{ item.quantity_fact }}">
|
||
{% endif %}
|
||
{% endif %}
|
||
|
||
{% if user_role in 'admin,technologist' %}
|
||
<div class="row g-3 mb-4">
|
||
<div class="col-md-4">
|
||
<label class="small text-muted">Дата смены</label>
|
||
<input type="date" name="date" class="form-control border-secondary" value="{{ item.date|date:'Y-m-d' }}">
|
||
</div>
|
||
<div class="col-md-4">
|
||
<label class="small text-muted">Станок</label>
|
||
<select name="machine" class="form-select border-secondary">
|
||
{% for m in machines %}
|
||
<option value="{{ m.id }}" {% if item.machine.id == m.id %}selected{% endif %}>{{ m.name }}</option>
|
||
{% endfor %}
|
||
</select>
|
||
</div>
|
||
<div class="col-md-4">
|
||
<label class="small text-muted">План на смену (шт)</label>
|
||
<input type="number" name="quantity_plan" class="form-control border-secondary" value="{{ item.quantity_plan }}">
|
||
</div>
|
||
|
||
<div class="col-md-6">
|
||
<label class="small text-muted">Статус задания</label>
|
||
<select name="status" class="form-select border-secondary">
|
||
{% for val, name in form.fields.status.choices %}
|
||
<option value="{{ val }}" {% if item.status == val %}selected{% endif %}>{{ name }}</option>
|
||
{% endfor %}
|
||
</select>
|
||
</div>
|
||
<div class="col-md-6">
|
||
<label class="small text-muted">Факт (шт)</label>
|
||
<input type="number" name="quantity_fact" class="form-control border-secondary" value="{{ item.quantity_fact }}">
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="form-check form-switch p-3 rounded border border-warning mb-4 bg-body-tertiary d-flex justify-content-between align-items-center">
|
||
<label class="form-check-label fw-bold ms-2" for="sync1c">Списано в 1С</label>
|
||
<input class="form-check-input ms-0" style="width: 3em; height: 1.5em;" type="checkbox" name="is_synced_1c" id="sync1c" {% if item.is_synced_1c %}checked{% endif %}>
|
||
</div>
|
||
{% endif %}
|
||
|
||
{% if user_role == 'clerk' %}
|
||
{% if item.status == 'done' or item.status == 'partial' %}
|
||
<div class="form-check form-switch p-3 rounded border border-warning mb-4 bg-body-tertiary d-flex justify-content-between align-items-center">
|
||
<label class="form-check-label fw-bold ms-2" for="sync1c">Списано в 1С</label>
|
||
<input class="form-check-input ms-0" style="width: 3em; height: 1.5em;" type="checkbox" name="is_synced_1c" id="sync1c" {% if item.is_synced_1c %}checked{% endif %}>
|
||
</div>
|
||
{% else %}
|
||
<div class="text-muted small mb-4"><i class="bi bi-info-circle me-1"></i>Списание будет доступно после закрытия.</div>
|
||
{% endif %}
|
||
<input type="hidden" name="quantity_fact" value="{{ item.quantity_fact }}">
|
||
{% endif %}
|
||
|
||
<div class="d-flex justify-content-between mt-4">
|
||
<a href="{{ back_url }}" class="btn btn-outline-secondary">Назад</a>
|
||
<div class="d-flex gap-2">
|
||
<input type="hidden" name="action" id="actionField" value="save">
|
||
{% if item.status == 'work' and user_role == 'admin' %}
|
||
<button type="submit" class="btn btn-success px-4" onclick="document.getElementById('actionField').value='close_done'">
|
||
<i class="bi bi-check-all me-2"></i>Выполнено
|
||
</button>
|
||
<button type="submit" class="btn btn-outline-warning px-4" onclick="document.getElementById('actionField').value='close_partial'">
|
||
Частично
|
||
</button>
|
||
{% endif %}
|
||
<button type="submit" class="btn btn-outline-accent px-4 fw-bold" onclick="document.getElementById('actionField').value='save'">
|
||
<i class="bi bi-save me-2"></i>Сохранить
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
{% endblock %} |