Parse delivery.total and discounts[] from GoMag JSON into new delivery_cost/discount_total fields. Add app_settings table for configuring transport/discount CODMAT codes. When configured, transport and discount are appended as extra articles in the Oracle import JSON. Reorder Total column in dashboard/logs tables and show transport/discount breakdown in order detail modals. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
227 lines
12 KiB
HTML
227 lines
12 KiB
HTML
{% extends "base.html" %}
|
|
{% block title %}Dashboard - GoMag Import{% endblock %}
|
|
{% block nav_dashboard %}active{% endblock %}
|
|
|
|
{% block content %}
|
|
<h4 class="mb-4">Panou de Comanda</h4>
|
|
|
|
<!-- Sync Card (unified two-row panel) -->
|
|
<div class="sync-card">
|
|
<!-- TOP ROW: Status + Controls -->
|
|
<div class="sync-card-controls">
|
|
<span id="syncStatusDot" class="sync-status-dot idle"></span>
|
|
<span id="syncStatusText" class="text-secondary">Inactiv</span>
|
|
<div class="d-flex align-items-center gap-2">
|
|
<label class="d-flex align-items-center gap-1 text-muted">
|
|
Auto:
|
|
<input type="checkbox" id="schedulerToggle" class="cursor-pointer" onchange="toggleScheduler()">
|
|
</label>
|
|
<select id="schedulerInterval" class="select-compact" onchange="updateSchedulerInterval()">
|
|
<option value="5">5 min</option>
|
|
<option value="10" selected>10 min</option>
|
|
<option value="30">30 min</option>
|
|
</select>
|
|
<button id="syncStartBtn" class="btn btn-sm btn-primary" onclick="startSync()">▶ Start Sync</button>
|
|
</div>
|
|
</div>
|
|
<div class="sync-card-divider"></div>
|
|
<!-- BOTTOM ROW: Last sync info (clickable → jurnal) -->
|
|
<div class="sync-card-info" id="lastSyncRow" role="button" tabindex="0" title="Ver jurnal sync">
|
|
<span id="lastSyncDate" class="fw-medium">—</span>
|
|
<span id="lastSyncDuration" class="text-muted">—</span>
|
|
<span id="lastSyncCounts">—</span>
|
|
<span id="lastSyncStatus">—</span>
|
|
<span class="ms-auto small text-muted">↗ jurnal</span>
|
|
</div>
|
|
<!-- LIVE PROGRESS (shown only when sync is running) -->
|
|
<div class="sync-card-progress" id="syncProgressArea" style="display:none;">
|
|
<span class="sync-live-dot"></span>
|
|
<span id="syncProgressText">Se proceseaza...</span>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Orders Table -->
|
|
<div class="card mb-4">
|
|
<div class="card-header">
|
|
<span>Comenzi</span>
|
|
</div>
|
|
<div class="card-body py-2 px-3">
|
|
<div class="filter-bar" id="ordersFilterBar">
|
|
<!-- Period dropdown -->
|
|
<select id="periodSelect" class="select-compact">
|
|
<option value="3">3 zile</option>
|
|
<option value="7" selected>7 zile</option>
|
|
<option value="30">30 zile</option>
|
|
<option value="90">3 luni</option>
|
|
<option value="0">Toate</option>
|
|
<option value="custom">Perioada personalizata...</option>
|
|
</select>
|
|
<!-- Custom date range (hidden until 'custom' selected) -->
|
|
<div class="period-custom-range" id="customRangeInputs">
|
|
<input type="date" id="periodStart" class="select-compact">
|
|
<span>—</span>
|
|
<input type="date" id="periodEnd" class="select-compact">
|
|
</div>
|
|
<!-- Status pills -->
|
|
<button class="filter-pill active d-none d-md-inline-flex" data-status="all">Toate <span class="filter-count fc-neutral" id="cntAll">0</span></button>
|
|
<button class="filter-pill d-none d-md-inline-flex" data-status="IMPORTED">Importat <span class="filter-count fc-green" id="cntImp">0</span></button>
|
|
<button class="filter-pill d-none d-md-inline-flex" data-status="SKIPPED">Omise <span class="filter-count fc-yellow" id="cntSkip">0</span></button>
|
|
<button class="filter-pill d-none d-md-inline-flex" data-status="ERROR">Erori <span class="filter-count fc-red" id="cntErr">0</span></button>
|
|
<button class="filter-pill d-none d-md-inline-flex" data-status="UNINVOICED">Nefact. <span class="filter-count fc-neutral" id="cntNef">0</span></button>
|
|
<!-- Search (integrated, end of row) -->
|
|
<input type="search" id="orderSearch" placeholder="Cauta..." class="search-input">
|
|
</div>
|
|
<div class="d-md-none mb-2" id="dashMobileSeg"></div>
|
|
</div>
|
|
<div id="dashPaginationTop" class="pag-strip"></div>
|
|
<div class="card-body p-0">
|
|
<div id="dashMobileList" class="mobile-list"></div>
|
|
<div class="table-responsive">
|
|
<table class="table table-hover mb-0">
|
|
<thead>
|
|
<tr>
|
|
<th class="sortable" onclick="dashSortBy('order_number')">Nr Comanda <span class="sort-icon" data-col="order_number"></span></th>
|
|
<th class="sortable" onclick="dashSortBy('order_date')">Data <span class="sort-icon" data-col="order_date"></span></th>
|
|
<th class="sortable" onclick="dashSortBy('customer_name')">Client <span class="sort-icon" data-col="customer_name"></span></th>
|
|
<th class="sortable" onclick="dashSortBy('items_count')">Art. <span class="sort-icon" data-col="items_count"></span></th>
|
|
<th class="text-end">Total</th>
|
|
<th class="sortable" onclick="dashSortBy('status')">Status Import <span class="sort-icon" data-col="status"></span></th>
|
|
<th>ID ROA</th>
|
|
<th>Factura</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody id="dashOrdersBody">
|
|
<tr><td colspan="8" class="text-center text-muted py-3">Se incarca...</td></tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
<div id="dashPagination" class="pag-strip pag-strip-bottom"></div>
|
|
</div>
|
|
|
|
<!-- Order Detail Modal -->
|
|
<div class="modal fade" id="orderDetailModal" tabindex="-1">
|
|
<div class="modal-dialog modal-lg">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title">Comanda <code id="detailOrderNumber"></code></h5>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
|
</div>
|
|
<div class="modal-body">
|
|
<div class="row mb-3">
|
|
<div class="col-md-6">
|
|
<small class="text-muted">Client:</small> <strong id="detailCustomer"></strong><br>
|
|
<small class="text-muted">Data comanda:</small> <span id="detailDate"></span><br>
|
|
<small class="text-muted">Status:</small> <span id="detailStatus"></span>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<small class="text-muted">ID Comanda ROA:</small> <span id="detailIdComanda">-</span><br>
|
|
<small class="text-muted">ID Partener:</small> <span id="detailIdPartener">-</span><br>
|
|
<small class="text-muted">ID Adr. Facturare:</small> <span id="detailIdAdresaFact">-</span><br>
|
|
<small class="text-muted">ID Adr. Livrare:</small> <span id="detailIdAdresaLivr">-</span>
|
|
</div>
|
|
</div>
|
|
<div class="d-flex justify-content-end gap-3 mb-2 flex-wrap" id="detailTotals">
|
|
<span><small class="text-muted">Valoare articole:</small> <strong id="detailItemsTotal">-</strong></span>
|
|
<span id="detailDeliveryWrap" style="display:none"><small class="text-muted">Transport:</small> <strong id="detailDeliveryCost">-</strong></span>
|
|
<span id="detailDiscountWrap" style="display:none"><small class="text-muted">Discount:</small> <strong id="detailDiscount">-</strong></span>
|
|
<span><small class="text-muted">Total comanda:</small> <strong id="detailOrderTotal">-</strong></span>
|
|
</div>
|
|
<div class="table-responsive d-none d-md-block">
|
|
<table class="table table-sm table-bordered mb-0">
|
|
<thead class="table-light">
|
|
<tr>
|
|
<th>SKU</th>
|
|
<th>Produs</th>
|
|
<th>Cant.</th>
|
|
<th>Pret</th>
|
|
<th>TVA</th>
|
|
<th>CODMAT</th>
|
|
<th>Status</th>
|
|
<th>Actiune</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody id="detailItemsBody">
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div class="d-md-none" id="detailItemsMobile"></div>
|
|
<div id="detailError" class="alert alert-danger mt-3" style="display:none;"></div>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Inchide</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Settings Card -->
|
|
<div class="card mb-4">
|
|
<div class="card-header d-flex align-items-center justify-content-between">
|
|
<span>Setari Import</span>
|
|
<button class="btn btn-sm btn-primary" onclick="saveAppSettings()">Salveaza</button>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="row g-3">
|
|
<div class="col-md-4">
|
|
<label class="form-label form-label-sm mb-1">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>
|
|
<small class="text-muted">Lasa gol pentru a nu adauga transport la import</small>
|
|
</div>
|
|
<div class="col-md-2">
|
|
<label class="form-label form-label-sm mb-1">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-md-4">
|
|
<label class="form-label form-label-sm mb-1">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>
|
|
<small class="text-muted">Lasa gol pentru a nu adauga discount la import</small>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Quick Map Modal (used from order detail) -->
|
|
<div class="modal fade" id="quickMapModal" tabindex="-1" data-bs-backdrop="static">
|
|
<div class="modal-dialog">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title">Mapeaza SKU: <code id="qmSku"></code></h5>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
|
</div>
|
|
<div class="modal-body">
|
|
<div class="mb-2">
|
|
<small class="text-muted">Produs web:</small> <strong id="qmProductName"></strong>
|
|
</div>
|
|
<div id="qmCodmatLines">
|
|
<!-- Dynamic CODMAT lines -->
|
|
</div>
|
|
<button type="button" class="btn btn-sm btn-outline-secondary mt-2" onclick="addQmCodmatLine()">
|
|
<i class="bi bi-plus"></i> Adauga CODMAT
|
|
</button>
|
|
<div id="qmPctWarning" class="text-danger mt-2" style="display:none;"></div>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Anuleaza</button>
|
|
<button type="button" class="btn btn-primary" onclick="saveQuickMapping()">Salveaza</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|
|
|
|
{% block scripts %}
|
|
<script src="/static/js/dashboard.js?v=7"></script>
|
|
{% endblock %}
|