- deploy.ps1, iis-web.config: Windows Server deployment scripts - api/app/routers/sync.py, dashboard.py: router updates - api/app/services/import_service.py, sync_service.py: service updates - api/app/static/css/style.css, js/*.js: UI updates - api/database-scripts/08_PACK_FACTURARE.pck: Oracle package - .gitignore: add .gittoken - CLAUDE.md, agent configs: documentation updates Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
102 lines
4.4 KiB
JavaScript
102 lines
4.4 KiB
JavaScript
let settAcTimeout = null;
|
|
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
loadSettings();
|
|
wireAutocomplete('settTransportCodmat', 'settTransportAc');
|
|
wireAutocomplete('settDiscountCodmat', 'settDiscountAc');
|
|
});
|
|
|
|
async function loadSettings() {
|
|
try {
|
|
const res = await fetch('/api/settings');
|
|
const data = await res.json();
|
|
const el = (id) => document.getElementById(id);
|
|
if (el('settTransportCodmat')) el('settTransportCodmat').value = data.transport_codmat || '';
|
|
if (el('settTransportVat')) el('settTransportVat').value = data.transport_vat || '21';
|
|
if (el('settTransportIdPol')) el('settTransportIdPol').value = data.transport_id_pol || '';
|
|
if (el('settDiscountCodmat')) el('settDiscountCodmat').value = data.discount_codmat || '';
|
|
if (el('settDiscountVat')) el('settDiscountVat').value = data.discount_vat || '19';
|
|
if (el('settDiscountIdPol')) el('settDiscountIdPol').value = data.discount_id_pol || '';
|
|
if (el('settIdPol')) el('settIdPol').value = data.id_pol || '';
|
|
if (el('settIdSectie')) el('settIdSectie').value = data.id_sectie || '';
|
|
} catch (err) {
|
|
console.error('loadSettings error:', err);
|
|
}
|
|
}
|
|
|
|
async function saveSettings() {
|
|
const el = (id) => document.getElementById(id);
|
|
const payload = {
|
|
transport_codmat: el('settTransportCodmat')?.value?.trim() || '',
|
|
transport_vat: el('settTransportVat')?.value || '21',
|
|
transport_id_pol: el('settTransportIdPol')?.value?.trim() || '',
|
|
discount_codmat: el('settDiscountCodmat')?.value?.trim() || '',
|
|
discount_vat: el('settDiscountVat')?.value || '19',
|
|
discount_id_pol: el('settDiscountIdPol')?.value?.trim() || '',
|
|
id_pol: el('settIdPol')?.value?.trim() || '',
|
|
id_sectie: el('settIdSectie')?.value?.trim() || '',
|
|
};
|
|
try {
|
|
const res = await fetch('/api/settings', {
|
|
method: 'PUT',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(payload)
|
|
});
|
|
const data = await res.json();
|
|
const resultEl = document.getElementById('settSaveResult');
|
|
if (data.success) {
|
|
if (resultEl) { resultEl.textContent = 'Salvat!'; resultEl.style.color = '#16a34a'; }
|
|
setTimeout(() => { if (resultEl) resultEl.textContent = ''; }, 3000);
|
|
} else {
|
|
if (resultEl) { resultEl.textContent = 'Eroare: ' + JSON.stringify(data); resultEl.style.color = '#dc2626'; }
|
|
}
|
|
} catch (err) {
|
|
const resultEl = document.getElementById('settSaveResult');
|
|
if (resultEl) { resultEl.textContent = 'Eroare: ' + err.message; resultEl.style.color = '#dc2626'; }
|
|
}
|
|
}
|
|
|
|
function wireAutocomplete(inputId, dropdownId) {
|
|
const input = document.getElementById(inputId);
|
|
const dropdown = document.getElementById(dropdownId);
|
|
if (!input || !dropdown) return;
|
|
|
|
input.addEventListener('input', () => {
|
|
clearTimeout(settAcTimeout);
|
|
settAcTimeout = setTimeout(async () => {
|
|
const q = input.value.trim();
|
|
if (q.length < 2) { dropdown.classList.add('d-none'); return; }
|
|
try {
|
|
const res = await fetch(`/api/articles/search?q=${encodeURIComponent(q)}`);
|
|
const data = await res.json();
|
|
if (!data.results || data.results.length === 0) { dropdown.classList.add('d-none'); return; }
|
|
dropdown.innerHTML = data.results.map(r =>
|
|
`<div class="autocomplete-item" onmousedown="settSelectArticle('${inputId}', '${dropdownId}', '${escHtml(r.codmat)}')">
|
|
<span class="codmat">${escHtml(r.codmat)}</span> — <span class="denumire">${escHtml(r.denumire)}</span>
|
|
</div>`
|
|
).join('');
|
|
dropdown.classList.remove('d-none');
|
|
} catch { dropdown.classList.add('d-none'); }
|
|
}, 250);
|
|
});
|
|
|
|
input.addEventListener('blur', () => {
|
|
setTimeout(() => dropdown.classList.add('d-none'), 200);
|
|
});
|
|
}
|
|
|
|
function settSelectArticle(inputId, dropdownId, codmat) {
|
|
document.getElementById(inputId).value = codmat;
|
|
document.getElementById(dropdownId).classList.add('d-none');
|
|
}
|
|
|
|
function escHtml(s) {
|
|
if (s == null) return '';
|
|
return String(s)
|
|
.replace(/&/g, '&')
|
|
.replace(/</g, '<')
|
|
.replace(/>/g, '>')
|
|
.replace(/"/g, '"')
|
|
.replace(/'/g, ''');
|
|
}
|