118 lines
7.4 KiB
HTML
118 lines
7.4 KiB
HTML
{% extends "base.html" %}
|
||
{% block title %}{% if action=='add' %}Новая расходная{% else %}Редактировать{% endif %} — Стройка{% endblock %}
|
||
{% block page_title %}{% if action=='add' %}Новая расходная накладная{% else %}Редактировать расходную #{{ order.id }}{% endif %}{% endblock %}
|
||
{% block topbar_actions %}<a href="{{ url_for('expense_list') }}" class="btn btn-secondary">← Назад</a>{% endblock %}
|
||
{% block content %}
|
||
<div class="form-card">
|
||
<form method="post">
|
||
<div class="form-grid">
|
||
<div class="form-group">
|
||
<label class="form-label">Номер накладной <span class="required">*</span></label>
|
||
<input type="text" name="number" class="form-input" required value="{{ order.number if order else '' }}" placeholder="РН-001">
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">Дата <span class="required">*</span></label>
|
||
<input type="date" name="order_date" class="form-input" required value="{{ today }}">
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">Тип материала <span class="required">*</span></label>
|
||
<select name="type_id" class="form-input" required>
|
||
<option value="">— выбрать —</option>
|
||
{% for t in types %}<option value="{{ t.id }}" {% if order and order.type_id==t.id %}selected{% endif %}>{{ t.name }}</option>{% endfor %}
|
||
</select>
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">Партнёр <span class="required">*</span></label>
|
||
<div style="display:flex;gap:0.5rem">
|
||
<select name="partner_id" class="form-input" required id="partner_sel">
|
||
<option value="">— выбрать —</option>
|
||
{% for p in partners %}<option value="{{ p.id }}" {% if order and order.partner_id==p.id %}selected{% endif %}>{{ p.name }}</option>{% endfor %}
|
||
</select>
|
||
<button type="button" class="btn btn-secondary btn-sm" onclick="showNewPartner()">+ Новый</button>
|
||
</div>
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">Материал <span class="required">*</span></label>
|
||
<select name="material_id" class="form-input" required id="material_sel">
|
||
<option value="">— выбрать —</option>
|
||
{% for m in materials %}<option value="{{ m.id }}" data-price="{{ m.price }}" data-unit="{{ m.unit }}" {% if order and order.material_id==m.id %}selected{% endif %}>{{ m.name }}</option>{% endfor %}
|
||
</select>
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">Количество <span class="required">*</span></label>
|
||
<input type="number" name="quantity" class="form-input" required step="0.01" min="0.01" id="qty_in" value="{{ order.quantity if order else 1 }}">
|
||
</div>
|
||
<div class="form-group">
|
||
<label class="form-label">Скидка, %</label>
|
||
<input type="number" name="discount" class="form-input" step="0.1" min="0" max="100" id="disc_in" value="{{ order.discount if order else 0 }}">
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Быстрое добавление партнёра -->
|
||
<div id="new_partner_block" style="display:none;margin-top:1rem;padding:1rem;border:1.5px dashed var(--border);border-radius:8px;background:var(--light-bg)">
|
||
<div style="font-size:0.72rem;font-weight:700;color:var(--text-mid);text-transform:uppercase;letter-spacing:0.06em;margin-bottom:0.8rem">Новый партнёр</div>
|
||
<div class="form-grid">
|
||
<div class="form-group"><label class="form-label">Название *</label><input type="text" id="np_name" class="form-input" placeholder="ООО «Компания»"></div>
|
||
<div class="form-group"><label class="form-label">Телефон</label><input type="text" id="np_phone" class="form-input"></div>
|
||
<div class="form-group"><label class="form-label">Email</label><input type="text" id="np_email" class="form-input"></div>
|
||
<div class="form-group"><label class="form-label">Адрес</label><input type="text" id="np_address" class="form-input"></div>
|
||
</div>
|
||
<div style="display:flex;gap:0.5rem;margin-top:0.8rem">
|
||
<button type="button" class="btn btn-primary btn-sm" onclick="saveNewPartner()">✓ Сохранить</button>
|
||
<button type="button" class="btn btn-secondary btn-sm" onclick="hideNewPartner()">Отмена</button>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="calc-preview">
|
||
<div class="calc-title">📊 Расчёт стоимости (расходная)</div>
|
||
<div class="calc-row"><span>Стоимость товара:</span><strong id="r_goods">0.00 ₽</strong></div>
|
||
<div class="calc-row"><span>Скидка:</span><strong id="r_disc" style="color:var(--error)">−0.00 ₽</strong></div>
|
||
<div class="calc-row total-row"><span>ИТОГО:</span><strong id="r_total">0.00 ₽</strong></div>
|
||
</div>
|
||
<div class="form-actions">
|
||
<button type="submit" class="btn btn-primary">💾 Сохранить</button>
|
||
<a href="{{ url_for('expense_list') }}" class="btn btn-secondary">Отмена</a>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
<script>
|
||
function calc(){
|
||
var mopt = document.getElementById('material_sel').options[document.getElementById('material_sel').selectedIndex];
|
||
var price = parseFloat(mopt.dataset.price) || 0;
|
||
var qty = parseFloat(document.getElementById('qty_in').value) || 0;
|
||
var disc = parseFloat(document.getElementById('disc_in').value) || 0;
|
||
var goods = price * qty;
|
||
var dsum = goods * (disc/100);
|
||
var total = Math.max(goods - dsum, 0);
|
||
document.getElementById('r_goods').textContent = goods.toFixed(2) + ' ₽';
|
||
document.getElementById('r_disc').textContent = '−' + dsum.toFixed(2) + ' ₽';
|
||
document.getElementById('r_total').textContent = total.toFixed(2) + ' ₽';
|
||
}
|
||
document.getElementById('material_sel').addEventListener('change', calc);
|
||
document.getElementById('qty_in').addEventListener('input', calc);
|
||
document.getElementById('disc_in').addEventListener('input', calc);
|
||
calc();
|
||
function showNewPartner(){ document.getElementById('new_partner_block').style.display='block'; }
|
||
function hideNewPartner(){ document.getElementById('new_partner_block').style.display='none'; }
|
||
function saveNewPartner(){
|
||
var name = document.getElementById('np_name').value.trim();
|
||
if(!name){ alert('Введите название'); return; }
|
||
var fd = new FormData();
|
||
fd.append('name', name);
|
||
fd.append('phone', document.getElementById('np_phone').value);
|
||
fd.append('email', document.getElementById('np_email').value);
|
||
fd.append('address', document.getElementById('np_address').value);
|
||
fetch('/partners/add?ajax=1',{method:'POST',body:fd})
|
||
.then(r=>r.json()).then(res=>{
|
||
var sel = document.getElementById('partner_sel');
|
||
sel.add(new Option(res.name, res.id, true, true));
|
||
hideNewPartner();
|
||
document.getElementById('np_name').value='';
|
||
document.getElementById('np_phone').value='';
|
||
document.getElementById('np_email').value='';
|
||
document.getElementById('np_address').value='';
|
||
}).catch(()=>alert('Ошибка'));
|
||
}
|
||
</script>
|
||
{% endblock %}
|