project_python_v6/templates/expense_form.html
2026-04-21 09:26:47 +05:00

118 lines
7.4 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{% 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 %}