fix(address+ui): remove TIER 2 reuse, typed diff badges, false positive reduction
- Remove TIER 2 address lookup (county+city without street) from PL/SQL — creates new address when street differs instead of reusing wrong one - Replace generic "N diferente" badge with typed micro-badges (CUI, Denumire, TVA, Adr. livr., Adr. fact., Preturi) with red/amber semantic colors - Extend addrMatch() regex to strip full Romanian address words (STRADA, NUMAR, BLOC, COMUNA, SAT, MUNICIPIUL, etc.) — fixes "Strada X" vs "X" false positives - Extend normalize_company_name() for II, PFA, INTREPRINDERE INDIVIDUALA legal forms - Persist address_mismatch to SQLite so "Dif." filter includes address-only diffs - Add red/amber indicator dots to desktop table and mobile list rows - 12 unit tests for normalization and server-side address matching Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -856,7 +856,7 @@ function addrMatch(gomag, roa) {
|
||||
function norm(s) {
|
||||
return (s || '').normalize('NFD').replace(/[\u0300-\u036f]/g, '')
|
||||
.toUpperCase()
|
||||
.replace(/\b(STR|NR|BL|SC|AP|ET|ETAJ|APART)\b/g, '')
|
||||
.replace(/\b(STR|STRADA|NR|NUMAR|NUMARUL|BL|BLOC|SC|SCARA|AP|APART|APARTAMENT|ET|ETAJ|COM|COMUNA|SAT|MUN|MUNICIPIUL|JUD|JUDETUL|CARTIER|PARTER|SECTOR|ORAS)\b/g, '')
|
||||
.replace(/[^A-Z0-9]/g, '');
|
||||
}
|
||||
const gStreet = norm(gomag.address || gomag.strada || '');
|
||||
@@ -1013,22 +1013,25 @@ function _renderHeaderInfo(order) {
|
||||
|
||||
addressLines.innerHTML = html;
|
||||
|
||||
// Diff summary badge in modal header
|
||||
let diffCount = 0;
|
||||
if (isPJ && pi.anaf_denumire_mismatch) diffCount++;
|
||||
if (order.price_check && order.price_check.mismatches > 0) diffCount += order.price_check.mismatches;
|
||||
if (addr) {
|
||||
if (addr.livrare_roa && !addrMatch(addr.livrare_gomag, addr.livrare_roa)) diffCount++;
|
||||
if (addr.facturare_roa && !addrMatch(addr.facturare_gomag, addr.facturare_roa)) diffCount++;
|
||||
}
|
||||
// Typed diff badges in modal header
|
||||
const orderNumEl = document.getElementById('detailOrderNumber');
|
||||
if (orderNumEl && diffCount > 0) {
|
||||
const existing = orderNumEl.querySelector('.diff-badge');
|
||||
if (existing) existing.remove();
|
||||
const badge = document.createElement('span');
|
||||
badge.className = 'diff-badge badge ms-2';
|
||||
badge.style.cssText = 'background:var(--warning-light);color:var(--warning-text);font-size:11px;vertical-align:middle';
|
||||
badge.textContent = diffCount + ' diferente';
|
||||
orderNumEl.parentNode.insertBefore(badge, orderNumEl.nextSibling);
|
||||
if (orderNumEl) {
|
||||
orderNumEl.parentNode.querySelectorAll('.diff-badge').forEach(b => b.remove());
|
||||
const badges = [];
|
||||
if (isPJ && pi.anaf_cod_fiscal_adjusted) badges.push({label:'CUI', cls:'diff-badge-anaf', aria:'CUI ajustat conform ANAF'});
|
||||
if (isPJ && pi.anaf_denumire_mismatch) badges.push({label:'Denumire', cls:'diff-badge-anaf', aria:'Denumire diferita fata de ANAF'});
|
||||
if (isPJ && pi.anaf_platitor_tva === 0) badges.push({label:'TVA', cls:'diff-badge-anaf', aria:'Neplatitor TVA conform ANAF'});
|
||||
if (addr && addr.livrare_roa && !addrMatch(addr.livrare_gomag, addr.livrare_roa)) badges.push({label:'Adr. livr.', cls:'diff-badge-info', aria:'Adresa livrare diferita'});
|
||||
if (addr && addr.facturare_roa && !addrMatch(addr.facturare_gomag, addr.facturare_roa)) badges.push({label:'Adr. fact.', cls:'diff-badge-info', aria:'Adresa facturare diferita'});
|
||||
if (order.price_check && order.price_check.mismatches > 0) badges.push({label:'Preturi (' + order.price_check.mismatches + ')', cls:'diff-badge-info', aria:'Preturi diferite: ' + order.price_check.mismatches});
|
||||
let insertAfter = orderNumEl;
|
||||
badges.forEach(b => {
|
||||
const el = document.createElement('span');
|
||||
el.className = 'diff-badge ' + b.cls;
|
||||
el.setAttribute('aria-label', b.aria);
|
||||
el.textContent = b.label;
|
||||
insertAfter.parentNode.insertBefore(el, insertAfter.nextSibling);
|
||||
insertAfter = el;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user