refactor(price): remove price comparison UI and catalog sync
GoMag vs ROA price comparison generated too many false positives (kits, volume discounts, special prices). Removes comparison columns, dots, badges, catalog sync endpoints, and ~950 lines of dead code. Keeps WRITE path (sync_prices_from_order) for kit pricing. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -513,8 +513,6 @@ function diffDots(o, mobile) {
|
||||
d += `<span style="${s};background:var(--info)" title="Adresa diferita"></span>`;
|
||||
if (o.partner_mismatch===1)
|
||||
d += `<span style="${s};background:var(--warning)" title="Partener schimbat"></span>`;
|
||||
if (o.price_match===false)
|
||||
d += `<span style="${s};background:var(--error)" title="Pret GoMag > ROA"></span>`;
|
||||
return d;
|
||||
}
|
||||
|
||||
|
||||
@@ -10,8 +10,9 @@ document.addEventListener('DOMContentLoaded', async () => {
|
||||
// Kit pricing mode radio toggle
|
||||
document.querySelectorAll('input[name="kitPricingMode"]').forEach(r => {
|
||||
r.addEventListener('change', () => {
|
||||
const mode = document.querySelector('input[name="kitPricingMode"]:checked')?.value || '';
|
||||
document.getElementById('kitModeBFields').style.display =
|
||||
document.getElementById('kitModeSeparate').checked ? '' : 'none';
|
||||
(mode === 'separate_line' || mode === 'distributed') ? '' : 'none';
|
||||
});
|
||||
});
|
||||
|
||||
@@ -138,27 +139,12 @@ async function loadSettings() {
|
||||
document.querySelectorAll('input[name="kitPricingMode"]').forEach(r => {
|
||||
r.checked = r.value === kitMode;
|
||||
});
|
||||
document.getElementById('kitModeBFields').style.display = kitMode === 'separate_line' ? '' : 'none';
|
||||
document.getElementById('kitModeBFields').style.display = (kitMode === 'separate_line' || kitMode === 'distributed') ? '' : 'none';
|
||||
if (el('settKitDiscountCodmat')) el('settKitDiscountCodmat').value = data.kit_discount_codmat || '';
|
||||
if (el('settKitDiscountIdPol')) el('settKitDiscountIdPol').value = data.kit_discount_id_pol || '';
|
||||
|
||||
// Price sync
|
||||
if (el('settPriceSyncEnabled')) el('settPriceSyncEnabled').checked = data.price_sync_enabled !== "0";
|
||||
if (el('settCatalogSyncEnabled')) {
|
||||
el('settCatalogSyncEnabled').checked = data.catalog_sync_enabled === "1";
|
||||
document.getElementById('catalogSyncOptions').style.display = data.catalog_sync_enabled === "1" ? '' : 'none';
|
||||
}
|
||||
if (el('settPriceSyncSchedule')) el('settPriceSyncSchedule').value = data.price_sync_schedule || '';
|
||||
|
||||
// Load price sync status
|
||||
try {
|
||||
const psRes = await fetch('/api/price-sync/status');
|
||||
const psData = await psRes.json();
|
||||
const psEl = document.getElementById('settPriceSyncStatus');
|
||||
if (psEl && psData.last_run) {
|
||||
psEl.textContent = `Ultima: ${psData.last_run.finished_at || ''} — ${psData.last_run.updated || 0} actualizate din ${psData.last_run.matched || 0}`;
|
||||
}
|
||||
} catch {}
|
||||
} catch (err) {
|
||||
console.error('loadSettings error:', err);
|
||||
}
|
||||
@@ -187,9 +173,6 @@ async function saveSettings() {
|
||||
kit_discount_codmat: el('settKitDiscountCodmat')?.value?.trim() || '',
|
||||
kit_discount_id_pol: el('settKitDiscountIdPol')?.value?.trim() || '',
|
||||
price_sync_enabled: el('settPriceSyncEnabled')?.checked ? "1" : "0",
|
||||
catalog_sync_enabled: el('settCatalogSyncEnabled')?.checked ? "1" : "0",
|
||||
price_sync_schedule: el('settPriceSyncSchedule')?.value || '',
|
||||
gomag_products_url: '',
|
||||
};
|
||||
try {
|
||||
const res = await fetch('/api/settings', {
|
||||
@@ -211,40 +194,6 @@ async function saveSettings() {
|
||||
}
|
||||
}
|
||||
|
||||
async function startCatalogSync() {
|
||||
const btn = document.getElementById('btnCatalogSync');
|
||||
const status = document.getElementById('settPriceSyncStatus');
|
||||
btn.disabled = true;
|
||||
btn.innerHTML = '<span class="spinner-border spinner-border-sm"></span> Sincronizare...';
|
||||
try {
|
||||
const res = await fetch('/api/price-sync/start', { method: 'POST' });
|
||||
const data = await res.json();
|
||||
if (data.error) {
|
||||
status.innerHTML = `<span class="text-danger">${escHtml(data.error)}</span>`;
|
||||
btn.disabled = false;
|
||||
btn.textContent = 'Sincronizează acum';
|
||||
return;
|
||||
}
|
||||
// Poll status
|
||||
const pollInterval = setInterval(async () => {
|
||||
const sr = await fetch('/api/price-sync/status');
|
||||
const sd = await sr.json();
|
||||
if (sd.status === 'running') {
|
||||
status.textContent = sd.phase_text || 'Sincronizare în curs...';
|
||||
} else {
|
||||
clearInterval(pollInterval);
|
||||
btn.disabled = false;
|
||||
btn.textContent = 'Sincronizează acum';
|
||||
if (sd.last_run) status.textContent = `Ultima: ${sd.last_run.finished_at || ''} — ${sd.last_run.updated || 0} actualizate din ${sd.last_run.matched || 0}`;
|
||||
}
|
||||
}, 2000);
|
||||
} catch (err) {
|
||||
status.innerHTML = `<span class="text-danger">${escHtml(err.message)}</span>`;
|
||||
btn.disabled = false;
|
||||
btn.textContent = 'Sincronizează acum';
|
||||
}
|
||||
}
|
||||
|
||||
function wireAutocomplete(inputId, dropdownId) {
|
||||
const input = document.getElementById(inputId);
|
||||
const dropdown = document.getElementById(dropdownId);
|
||||
|
||||
@@ -615,10 +615,6 @@ async function renderOrderDetailModal(orderNumber, opts) {
|
||||
: `<code>${esc(item.codmat || '–')}</code>`;
|
||||
const valoare = (Number(item.price || 0) * Number(item.quantity || 0));
|
||||
const clickAttr = opts.onQuickMap ? `onclick="_sharedModalQuickMap('${esc(item.sku)}','${esc(item.product_name||'')}','${esc(orderNumber)}',${idx})"` : '';
|
||||
const priceInfo = { pret_roa: item.pret_roa, match: item.price_match };
|
||||
const priceMismatchHtml = priceInfo.match === false
|
||||
? `<div class="text-danger" style="font-size:0.7rem">ROA: ${fmtNum(priceInfo.pret_roa)} lei</div>`
|
||||
: '';
|
||||
return `<div class="dif-item">
|
||||
<div class="dif-row">
|
||||
<span class="dif-sku${opts.onQuickMap ? ' dif-codmat-link' : ''}" ${clickAttr}>${esc(item.sku)}</span>
|
||||
@@ -630,7 +626,6 @@ async function renderOrderDetailModal(orderNumber, opts) {
|
||||
<span class="dif-val">${fmtNum(valoare)} lei</span>
|
||||
<span class="dif-vat text-muted" style="font-size:0.75rem">TVA ${item.vat != null ? Number(item.vat) : '?'}</span>
|
||||
</div>
|
||||
${priceMismatchHtml}
|
||||
</div>`;
|
||||
}).join('');
|
||||
|
||||
@@ -684,32 +679,14 @@ async function renderOrderDetailModal(orderNumber, opts) {
|
||||
|
||||
let tableHtml = items.map((item, idx) => {
|
||||
const valoare = Number(item.price || 0) * Number(item.quantity || 0);
|
||||
const priceInfo = { pret_roa: item.pret_roa, match: item.price_match };
|
||||
const pretRoaHtml = priceInfo.pret_roa != null ? fmtNum(priceInfo.pret_roa) : '–';
|
||||
let matchDot, rowStyle;
|
||||
if (item.kit) {
|
||||
matchDot = '<span class="badge" style="background:var(--info-light);color:var(--info-text);font-size:10px;padding:2px 6px">Kit</span>';
|
||||
rowStyle = '';
|
||||
} else if (priceInfo.pret_roa == null && priceInfo.match == null) {
|
||||
matchDot = '<span class="dot dot-gray"></span>';
|
||||
rowStyle = '';
|
||||
} else if (priceInfo.match === false) {
|
||||
matchDot = '<span class="dot dot-red"></span>';
|
||||
rowStyle = ' style="background:var(--error-light)"';
|
||||
} else {
|
||||
matchDot = '<span class="dot dot-green"></span>';
|
||||
rowStyle = '';
|
||||
}
|
||||
return `<tr${rowStyle}>
|
||||
return `<tr>
|
||||
<td><code class="${opts.onQuickMap ? 'codmat-link' : ''}" ${clickAttrFn(item, idx)}>${esc(item.sku)}</code></td>
|
||||
<td>${esc(item.product_name || '-')}</td>
|
||||
<td>${renderCodmatCell(item)}</td>
|
||||
<td class="text-end">${item.quantity || 0}</td>
|
||||
<td class="text-end font-data">${item.price != null ? fmtNum(item.price) : '-'}</td>
|
||||
<td class="text-end font-data">${pretRoaHtml}</td>
|
||||
<td class="text-end">${item.vat != null ? Number(item.vat) : '-'}</td>
|
||||
<td class="text-end font-data">${fmtNum(valoare)}</td>
|
||||
<td class="text-center">${matchDot}</td>
|
||||
</tr>`;
|
||||
}).join('');
|
||||
|
||||
@@ -721,9 +698,7 @@ async function renderOrderDetailModal(orderNumber, opts) {
|
||||
<td></td><td class="text-muted">Transport</td>
|
||||
<td>${tCodmat ? '<code>' + esc(tCodmat) + '</code>' : ''}</td>
|
||||
<td class="text-end">1</td><td class="text-end font-data">${fmtNum(order.delivery_cost)}</td>
|
||||
<td></td>
|
||||
<td class="text-end">${tVat}</td><td class="text-end font-data">${fmtNum(order.delivery_cost)}</td>
|
||||
<td></td>
|
||||
</tr>`;
|
||||
}
|
||||
|
||||
@@ -739,9 +714,7 @@ async function renderOrderDetailModal(orderNumber, opts) {
|
||||
<td></td><td class="text-muted">Discount</td>
|
||||
<td>${dCodmat ? '<code>' + esc(dCodmat) + '</code>' : ''}</td>
|
||||
<td class="text-end">\u20131</td><td class="text-end font-data">${fmtNum(amt)}</td>
|
||||
<td></td>
|
||||
<td class="text-end">${Number(rate)}</td><td class="text-end font-data">\u2013${fmtNum(amt)}</td>
|
||||
<td></td>
|
||||
</tr>`;
|
||||
});
|
||||
} else {
|
||||
@@ -1053,7 +1026,6 @@ function _renderHeaderInfo(order) {
|
||||
}
|
||||
if (addr && addr.livrare_roa && !addrMatch(addr.livrare_gomag, addr.livrare_roa)) badges.push({label:'Adr. livr.', cls:'diff-badge-addr', aria:'Adresa livrare diferita'});
|
||||
if (addr && addr.facturare_roa && !addrMatch(addr.facturare_gomag, addr.facturare_roa)) badges.push({label:'Adr. fact.', cls:'diff-badge-addr', aria:'Adresa facturare diferita'});
|
||||
if (order.price_check && order.price_check.mismatches > 0) badges.push({label:'Preturi (' + order.price_check.mismatches + ')', cls:'diff-badge-price', aria:'Preturi diferite: ' + order.price_check.mismatches});
|
||||
if (pi && pi.partner_mismatch) badges.push({label:'Partener', cls:'diff-badge-anaf', aria:'Partener schimbat in GoMag'});
|
||||
let insertAfter = orderNumEl;
|
||||
badges.forEach(b => {
|
||||
|
||||
Reference in New Issue
Block a user