Unified id_articol selection logic in Python (resolve_codmat_ids) and PL/SQL (resolve_id_articol): filters sters=0 AND inactiv=0, prefers article with stock in configured gestiune, falls back to MAX(id_articol). Eliminates mismatch where Python and PL/SQL could pick different id_articol for the same CODMAT, causing ORA-20000 price-not-found errors. - Add resolve_codmat_ids helper in validation_service.py (single batch query) - Refactor validate_skus/validate_prices/ensure_prices to use it - Add resolve_id_articol function in PL/SQL package body - Add p_id_gestiune parameter to importa_comanda (spec + body) - Add /api/settings/gestiuni endpoint and id_gestiune setting - Add gestiune dropdown in settings UI Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
157 lines
7.0 KiB
HTML
157 lines
7.0 KiB
HTML
{% extends "base.html" %}
|
|
{% block title %}Setari - GoMag Import{% endblock %}
|
|
{% block nav_settings %}active{% endblock %}
|
|
|
|
{% block content %}
|
|
<h4 class="mb-3">Setari</h4>
|
|
|
|
<div class="row g-3 mb-3">
|
|
<!-- GoMag API card -->
|
|
<div class="col-md-6">
|
|
<div class="card h-100">
|
|
<div class="card-header py-2 px-3 fw-semibold">GoMag API</div>
|
|
<div class="card-body py-2 px-3">
|
|
<div class="mb-2">
|
|
<label class="form-label mb-0 small">API Key</label>
|
|
<input type="text" class="form-control form-control-sm" id="settGomagApiKey" placeholder="4c5e46...">
|
|
</div>
|
|
<div class="mb-2">
|
|
<label class="form-label mb-0 small">Shop URL</label>
|
|
<input type="text" class="form-control form-control-sm" id="settGomagApiShop" placeholder="https://coffeepoint.ro">
|
|
</div>
|
|
<div class="row g-2">
|
|
<div class="col-6">
|
|
<label class="form-label mb-0 small">Zile înapoi</label>
|
|
<input type="number" class="form-control form-control-sm" id="settGomagDaysBack" value="7" min="1">
|
|
</div>
|
|
<div class="col-6">
|
|
<label class="form-label mb-0 small">Limită/pagină</label>
|
|
<input type="number" class="form-control form-control-sm" id="settGomagLimit" value="100" min="1">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Import ROA card -->
|
|
<div class="col-md-6">
|
|
<div class="card h-100">
|
|
<div class="card-header py-2 px-3 fw-semibold">Import ROA</div>
|
|
<div class="card-body py-2 px-3">
|
|
<div class="mb-2">
|
|
<label class="form-label mb-0 small">Gestiune (ID_GESTIUNE)</label>
|
|
<select class="form-select form-select-sm" id="settIdGestiune">
|
|
<option value="">— orice gestiune —</option>
|
|
</select>
|
|
</div>
|
|
<div class="mb-2">
|
|
<label class="form-label mb-0 small">Secție (ID_SECTIE)</label>
|
|
<select class="form-select form-select-sm" id="settIdSectie">
|
|
<option value="">— selectează secție —</option>
|
|
</select>
|
|
</div>
|
|
<div class="mb-2">
|
|
<label class="form-label mb-0 small">Politică de Preț (ID_POL)</label>
|
|
<select class="form-select form-select-sm" id="settIdPol">
|
|
<option value="">— selectează politică —</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row g-3 mb-3">
|
|
<!-- Transport card -->
|
|
<div class="col-md-6">
|
|
<div class="card h-100">
|
|
<div class="card-header py-2 px-3 fw-semibold">Transport</div>
|
|
<div class="card-body py-2 px-3">
|
|
<div class="mb-2">
|
|
<label class="form-label mb-0 small">CODMAT Transport</label>
|
|
<div class="position-relative">
|
|
<input type="text" class="form-control form-control-sm" id="settTransportCodmat" placeholder="ex: TRANSPORT" autocomplete="off">
|
|
<div class="autocomplete-dropdown d-none" id="settTransportAc"></div>
|
|
</div>
|
|
</div>
|
|
<div class="row g-2">
|
|
<div class="col-6">
|
|
<label class="form-label mb-0 small">TVA Transport (%)</label>
|
|
<select class="form-select form-select-sm" id="settTransportVat">
|
|
<option value="5">5%</option>
|
|
<option value="9">9%</option>
|
|
<option value="19">19%</option>
|
|
<option value="21" selected>21%</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-6">
|
|
<label class="form-label mb-0 small">Politică Transport</label>
|
|
<select class="form-select form-select-sm" id="settTransportIdPol">
|
|
<option value="">— implicită —</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Discount card -->
|
|
<div class="col-md-6">
|
|
<div class="card h-100">
|
|
<div class="card-header py-2 px-3 fw-semibold">Discount</div>
|
|
<div class="card-body py-2 px-3">
|
|
<div class="mb-2">
|
|
<label class="form-label mb-0 small">CODMAT Discount</label>
|
|
<div class="position-relative">
|
|
<input type="text" class="form-control form-control-sm" id="settDiscountCodmat" placeholder="ex: DISCOUNT" autocomplete="off">
|
|
<div class="autocomplete-dropdown d-none" id="settDiscountAc"></div>
|
|
</div>
|
|
</div>
|
|
<div class="row g-2">
|
|
<div class="col-6">
|
|
<label class="form-label mb-0 small">TVA Discount (fallback %)</label>
|
|
<select class="form-select form-select-sm" id="settDiscountVat">
|
|
<option value="5">5%</option>
|
|
<option value="9">9%</option>
|
|
<option value="19" selected>19%</option>
|
|
<option value="21">21%</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-6">
|
|
<label class="form-label mb-0 small">Politică Discount</label>
|
|
<select class="form-select form-select-sm" id="settDiscountIdPol">
|
|
<option value="">— implicită —</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row g-3 mb-3">
|
|
<div class="col-md-6">
|
|
<div class="card h-100">
|
|
<div class="card-header py-2 px-3 fw-semibold">Dashboard</div>
|
|
<div class="card-body py-2 px-3">
|
|
<div class="mb-2">
|
|
<label class="form-label mb-0 small">Interval polling (secunde)</label>
|
|
<input type="number" class="form-control form-control-sm" id="settDashPollSeconds" value="5" min="1" max="300">
|
|
<div class="form-text" style="font-size:0.75rem">Cât de des verifică dashboard-ul starea sync-ului (implicit 5s)</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="mb-3">
|
|
<button class="btn btn-primary btn-sm" onclick="saveSettings()">Salvează Setările</button>
|
|
<span id="settSaveResult" class="ms-2 small"></span>
|
|
</div>
|
|
|
|
{% endblock %}
|
|
|
|
{% block scripts %}
|
|
<script src="{{ request.scope.get('root_path', '') }}/static/js/settings.js?v=4"></script>
|
|
{% endblock %}
|