corecteaza acest cod sa ruleze: <!DOCTYPE html> <h...
Erstellt am: 10. September 2025
Erstellt am: 10. September 2025
corecteaza acest cod sa ruleze: <!DOCTYPE html>
<html lang="ro"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title>Aplicație Executor Judecătoresc – Modernizată Zenic</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/mammoth/1.4.2/mammoth.browser.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/[email protected]/papaparse.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js"></script> <style> :root { --bg: #0f1724; --panel: #0b1220; --muted: #94a3b8; --accent: #0ea5a0; --card: #071017; --glass: rgba(255,255,255,0.03); } html, body { margin: 0; height: 100%; font-family: Inter, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; background: linear-gradient(180deg, #071024 0%, #081525 60%); color: #e6eef7; } .app { display: flex; height: 100vh; gap: 18px; padding: 18px; box-sizing: border-box; } /* Sidebar */ .sidebar { width: 280px; background: linear-gradient(180deg, var(--glass), rgba(255,255,255,0.02)); border-radius: 12px; padding: 18px; box-shadow: 0 6px 18px rgba(2,6,23,0.6); display: flex; flex-direction: column; } .brand { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; color: #fff; } .logo { width: 46px; height: 46px; border-radius: 8px; background: linear-gradient(135deg, var(--accent), #06b6d4); display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 1.25rem; } .nav { display: flex; flex-direction: column; gap: 6px; flex-grow: 1; } .nav button { background: transparent; border: none; color: var(--muted); text-align: left; padding: 10px 12px; border-radius: 8px; cursor: pointer; font-size: 15px; transition: background-color 0.3s, color 0.3s; } .nav button:hover { background: var(--glass); color: #fff; } .nav button.active { background: var(--glass); color: #fff; font-weight: 600; } .small { font-size: 12px; color: var(--muted); } /* Main */ .main { flex: 1; display: flex; flex-direction: column; } .topbar { display: flex; align-items: center; justify-content: space-between; padding: 10px 14px; border-radius: 10px; background: linear-gradient(90deg, rgba(255,255,255,0.02), rgba(255,255,255,0.01)); box-shadow: 0 6px 14px rgba(2,6,23,0.45); color: #fff; } .content { margin-top: 14px; overflow: auto; padding: 18px; background: linear-gradient(180deg, rgba(255,255,255,0.01), transparent); border-radius: 12px; flex-grow: 1; } h2 { margin: 0 0 12px 0; color: #fff; } fieldset { border: 1px solid rgba(255,255,255,0.04); padding: 12px; border-radius: 8px; margin-bottom: 12px; } label { display: block; font-size: 13px; color: var(--muted); margin-bottom: 6px; } input[type=text], input[type=number], textarea, select { width: 100%; padding: 8px; border-radius: 8px; border: 1px solid rgba(255,255,255,0.04); background: transparent; color: #e6eef7; font-size: 14px; box-sizing: border-box; } input::placeholder, textarea::placeholder { color: var(--muted); } textarea { resize: vertical; } .row { display: flex; gap: 12px; flex-wrap: wrap; } .col { flex: 1; min-width: 280px; } .btn { padding: 9px 12px; border-radius: 8px; border: 0; cursor: pointer; font-weight: 600; font-size: 14px; } .btn.primary { background: var(--accent); color: #042023; transition: background-color 0.3s; } .btn.primary:hover { background: #059fa6; } .btn.ghost { background: transparent; border: 1px solid rgba(255,255,255,0.04); color: #cfe7ef; transition: background-color 0.3s, color 0.3s; } .btn.ghost:hover { background: var(--glass); color: #fff; } .cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 12px; } .card { background: linear-gradient(180deg, rgba(255,255,255,0.015), rgba(255,255,255,0.01)); padding: 12px; border-radius: 8px; box-sizing: border-box; } table { width: 100%; border-collapse: collapse; color: #e6eef7; } th, td { padding: 8px; border-bottom: 1px dashed rgba(255,255,255,0.03); text-align: left; } .muted { color: var(--muted); } /* Modal */ .modal-backdrop { position: fixed; inset: 0; background: rgba(2,6,23,0.6); display: none; align-items: center; justify-content: center; padding: 18px; z-index: 1000; } .modal { background: linear-gradient(180deg, #03111b, #061522); padding: 18px; border-radius: 10px; max-width: 880px; width: 100%; box-shadow: 0 12px 40px rgba(2,6,23,0.6); color: #e6eef7; } .flex { display: flex; gap: 10px; } .chips { display: flex; flex-wrap: wrap; gap: 6px; } .chip { background: rgba(255,255,255,0.03); padding: 6px 8px; border-radius: 999px; font-size: 12px; } footer.small { margin-top: 12px; color: var(--muted); text-align: center; } /* Scrollbar for containers */ .content::-webkit-scrollbar, .sidebar::-webkit-scrollbar, #angajatoriContainer::-webkit-scrollbar, #banciListContainer::-webkit-scrollbar { width: 8px; } .content::-webkit-scrollbar-thumb, .sidebar::-webkit-scrollbar-thumb, #angajatoriContainer::-webkit-scrollbar-thumb, #banciListContainer::-webkit-scrollbar-thumb { background-color: rgba(14,165,160,0.4); border-radius: 4px; } </style> </head> <body> <div class="app"> <aside class="sidebar" role="navigation" aria-label="Meniu principal"> <div class="brand" aria-label="Logo și titlu aplicație"> <div class="logo" aria-hidden="true">EJ</div> <div> <strong>Executor</strong> <div class="small">Zenic / Executor-it style</div> </div> </div> <nav class="nav"> <button id="nav-dosar" class="active" onclick="show('dosar')" aria-current="page">Dosar & Părți</button> <button id="nav-titlu" onclick="show('titlu')">Titlu executoriu</button> <button id="nav-finance" onclick="show('finance')">Calcul financiar</button> <button id="nav-fisa" onclick="show('fisa')">Fișă de calcul</button> <button id="nav-terti" onclick="show('terti')">Terți popriți</button> <button id="nav-bunuri" onclick="show('bunuri')">Bunuri</button> <button id="nav-gen" onclick="show('generate')">Generează doc.</button> </nav> <div style="margin-top:12px;font-size:13px;color:var(--muted)">Versiune: <strong>modernizată</strong></div> </aside> <main class="main"> <div class="topbar" role="region" aria-label="Bară superioară"> <div> <strong id="pageTitle">Dosar & Părți</strong> <div class="small">Păstrăm funcționalitățile originale, îmbunătățim UX-ul</div> </div> <div class="flex"> <button class="btn ghost" onclick="incarcaXML()" aria-label="Încarcă date din fișier XML">Încarcă XML</button> <button class="btn primary" onclick="salveazaXML()" aria-label="Salvează date în fișier XML">Salvează XML</button> </div> </div> <section class="content" id="content" role="main"> <!-- Dosar & Părți --> <div id="view-dosar"> <h2>Dosar & Părți</h2> <div class="row" role="form"> <div class="col card"> <label for="numarDosar">Număr dosar</label> <input id="numarDosar" type="text" aria-required="true" /> <label for="dataDosar">Data dosar</label> <input id="dataDosar" type="text" placeholder="zz/ll/aaaa" aria-required="true" /> <fieldset> <legend>Creditori</legend> <div id="creditoriContainer" aria-live="polite"></div> <div style="margin-top:8px"><button class="btn primary" onclick="adaugaCreditor()">Adaugă creditor</button></div> </fieldset> </div> <div class="col card"> <label>Debitori</label> <div id="debitoriContainer" aria-live="polite"></div> <div style="margin-top:8px"><button class="btn primary" onclick="adaugaDebitor()">Adaugă debitor</button></div> <fieldset style="margin-top:12px"> <legend>Acțiuni dosar</legend> <div class="row"> <button class="btn ghost" onclick="calcFisa()">Calculează fișa</button> <button class="btn ghost" onclick="resetAll()">Resetează</button> </div> </fieldset> </div> </div> </div></main> </div> <!-- Modal pentru bunuri --> <div class="modal-backdrop" id="modalBackdrop" role="dialog" aria-modal="true" aria-labelledby="modalTitle"> <div class="modal"> <h3 id="modalTitle">Adaugă Bun</h3> <div class="row"> <div class="col"> <label for="m-type">Tip</label> <select id="m-type"> <option value="mobil">Bun mobil</option> <option value="imobil">Bun imobil</option> </select> <label for="m-cat">Categorie</label> <input id="m-cat" type="text" placeholder="ex: autoturism, apartament, teren"> <label for="m-val">Valoare estimată</label> <input id="m-val" type="number" placeholder="ex: 8500"> </div> <div class="col"> <label for="m-jur">Stare juridică</label> <select id="m-jur"> <option value="liber">Liber de sarcini</option> <option value="ipotecat">Ipotecat</option> <option value="sechestrat">Sechestrat</option> <option value="inchiriat">Închiriat</option> </select> <label for="m-desc">Descriere detaliată</label> <textarea id="m-desc" rows="3" placeholder="Pentru autovehicule: marcă, model, VIN; pentru imobile: adresă, CF, nr. cadastral..."></textarea> </div> </div> <div style="margin-top:12px; text-align:right;"> <button class="btn ghost" onclick="closeModal()">Anulează</button> <button class="btn primary" onclick="saveItem()">Salvează</button> </div> </div> </div> <script> // Funcții și variabile din aplicația furnizată let nrCreditor = 0, nrDebitor = 0, nrAngajator = 0; let angajatori = []; let banci = []; let items = []; let selectedId = null; let selectedAngajator = null; let selectedBanci = new Set(); // Funcții create din codul încărcat, ajustate pentru noua structură function createLabel(text) { const l = document.createElement('label'); l.textContent = text; return l; } function createInput(id, type = "text") { const inp = document.createElement('input'); inp.id = id; inp.type = type; if (type === "number") inp.value = 0; return inp; } function createSelect(id, options, onchange) { const select = document.createElement('select'); select.id = id; options.forEach(opt => { const option = document.createElement('option'); option.value = opt; option.textContent = opt; select.appendChild(option); }); if (onchange) select.onchange = () => onchange(select); return select; } function updateLabels(sel) { const part = sel.closest('.part'); const tip = sel.value; if (!part) return; if (tip === 'Persoană fizică') { part.querySelector('.lblNume').textContent = 'Nume și prenume'; part.querySelector('.lblCNP').textContent = 'C.N.P.'; part.querySelector('.lblDomiciliu').textContent = 'Domiciliu'; } else { part.querySelector('.lblNume').textContent = 'Denumire'; part.querySelector('.lblCNP').textContent = 'Cod fiscal'; part.querySelector('.lblDomiciliu').textContent = 'Sediu'; } } function adaugaCreditor() { nrCreditor++; const container = document.getElementById('creditoriContainer'); const div = document.createElement('div'); div.className = 'part'; div.dataset.index = nrCreditor; div.appendChild(createLabel('Tip creditor')); const sel = createSelect('creditorTip' + nrCreditor, ['Persoană fizică', 'Persoană juridică'], updateLabels); div.appendChild(sel); div.appendChild(createLabel('Nume și prenume', 'lblNume')); div.appendChild(createInput('creditorNume' + nrCreditor)); div.appendChild(createLabel('C.N.P.', 'lblCNP')); div.appendChild(createInput('creditorCNP' + nrCreditor)); div.appendChild(createLabel('Domiciliu', 'lblDomiciliu')); div.appendChild(createInput('creditorDomiciliu' + nrCreditor)); div.appendChild(createLabel('Județ')); div.appendChild(createInput('creditorJudet' + nrCreditor)); div.appendChild(createLabel('Cod poștal')); div.appendChild(createInput('creditorCodPostal' + nrCreditor)); div.appendChild(createLabel('Telefon')); div.appendChild(createInput('creditorTelefon' + nrCreditor)); div.appendChild(createLabel('E-mail')); div.appendChild(createInput('creditorEmail' + nrCreditor)); if (nrCreditor > 1) { const btnSterge = document.createElement('button'); btnSterge.className = 'btn ghost'; btnSterge.textContent = 'Șterge creditor'; btnSterge.onclick = () => { if (container.children.length > 1) container.removeChild(div); else alert('Trebuie să existe cel puțin un creditor'); }; div.appendChild(btnSterge); } container.appendChild(div); updateLabels(sel); } function adaugaDebitor() { nrDebitor++; const container = document.getElementById('debitoriContainer'); const div = document.createElement('div'); div.className = 'part'; div.dataset.index = nrDebitor; div.appendChild(createLabel('Tip debitor')); const sel = createSelect('debitorTip' + nrDebitor, ['Persoană fizică', 'Persoană juridică'], updateLabels); div.appendChild(sel); div.appendChild(createLabel('Nume și prenume', 'lblNume')); div.appendChild(createInput('debitorNume' + nrDebitor)); div.appendChild(createLabel('C.N.P.', 'lblCNP')); div.appendChild(createInput('debitorCNP' + nrDebitor)); div.appendChild(createLabel('Domiciliu', 'lblDomiciliu')); div.appendChild(createInput('debitorDomiciliu' + nrDebitor)); div.appendChild(createLabel('Județ')); div.appendChild(createInput('debitorJudet' + nrDebitor)); div.appendChild(createLabel('Cod poștal')); div.appendChild(createInput('debitorCodPostal' + nrDebitor)); div.appendChild(createLabel('Telefon')); div.appendChild(createInput('debitorTelefon' + nrDebitor)); div.appendChild(createLabel('E-mail')); div.appendChild(createInput('debitorEmail' + nrDebitor)); if (nrDebitor > 1) { const btnSterge = document.createElement('button'); btnSterge.className = 'btn ghost'; btnSterge.textContent = 'Șterge debitor'; btnSterge.onclick = () => { if (container.children.length > 1) container.removeChild(div); else alert('Trebuie să existe cel puțin un debitor'); }; div.appendChild(btnSterge); } container.appendChild(div); updateLabels(sel); } // Alte funcții: show, calcFisa, updateTotal, updateOnorariuAndProcent, etc. (din codul furnizat de dvs) function show(view) { document.querySelectorAll('[id^="view-"]').forEach(el => el.style.display = 'none'); document.getElementById('view-' + view).style.display = 'block'; document.querySelectorAll('.nav button').forEach(b => b.classList.remove('active')); let navId = 'nav-' + (view === 'generate' ? 'gen' : view); if(document.getElementById(navId)){ document.getElementById(navId).classList.add('active'); } const titles = { dosar: 'Dosar & Părți', titlu: 'Titlu executoriu', finance: 'Calcul financiar', fisa: 'Fișă de calcul', terti: 'Terți popriți', bunuri: 'Bunuri', generate: 'Generează doc.' }; document.getElementById('pageTitle').textContent = titles[view] || ''; } // Inițializări la încărcarea paginii window.addEventListener('DOMContentLoaded', () => { adaugaCreditor(); adaugaDebitor(); // Inițializări angajatori, banci, bunuri, date dosar, total etc. setDataDosarToToday(); updateTotal(); show('dosar'); }); // Alte funcții complexe din codul dvs. (salvare/incarcare XML, import CSV, generare adrese, etc.) păstrate neschimbate: function calcFisa() { const numarDosar = document.getElementById("numarDosar").value.trim(); const dataDosar = document.getElementById("dataDosar").value.trim() || "Nedefinită"; const instanta = document.getElementById("incheiereInstanta").value.trim(); let numeCreditor = "Nedefinit"; const containerCred = document.getElementById("creditoriContainer"); if (containerCred.children.length > 0) { const inp = containerCred.children[0].querySelector('input[id^="creditorNume"]'); if (inp) numeCreditor = inp.value.trim() || "Nedefinit"; } let numeDebitor = "Nedefinit"; const containerDeb = document.getElementById("debitoriContainer"); if (containerDeb.children.length > 0) { const inp = containerDeb.children[0].querySelector('input[id^="debitorNume"]'); if (inp) numeDebitor = inp.value.trim() || "Nedefinit"; } const infoGen = `1. Informații generale:\nNumăr dosar: ${numarDosar}\nData înregistrării: ${dataDosar}\nInstanță: ${instanta}`; const parti = `2. Părți implicate:\nCreditor: ${numeCreditor}\nDebitor: ${numeDebitor}`; document.getElementById("infoGenerale").textContent = infoGen; document.getElementById("partiImplicate").textContent = parti; const dp = parseFloat(document.getElementById("debitPrincipal").value) || 0; const taxa = parseFloat(document.getElementById("taxaTimbru").value) || 0; const dob = parseFloat(document.getElementById("dobanzi").value) || 0; const pen = parseFloat(document.getElementById("penalitati").value) || 0; const chex = parseFloat(document.getElementById("cheltuieliExecutare").value) || 0; const chea = parseFloat(document.getElementById("cheltuieliAvocat").value) || 0; const chej = parseFloat(document.getElementById("cheltuieliJudecata").value) || 0; const inf = parseFloat(document.getElementById("inflatie").value) || 0; const total = dp + taxa + dob + pen + chex + chea + chej + inf; document.getElementById("fisaDebitPrincipal").textContent = dp.toFixed(2); document.getElementById("fisaTaxaTimbru").textContent = taxa.toFixed(2); document.getElementById("fisaDobanzi").textContent = dob.toFixed(2); document.getElementById("fisaPenalizati").textContent = pen.toFixed(2); document.getElementById("fisaCheltuieliExec").textContent = chex.toFixed(2); document.getElementById("fisaCheltuieliAvocat").textContent = chea.toFixed(2); document.getElementById("fisaCheltuieliJudecata").textContent = chej.toFixed(2); document.getElementById("fisaInflatie").textContent = inf.toFixed(2); document.getElementById("fisaTotal").textContent = total.toFixed(2); document.getElementById("fisaCalculTable").style.display = "table"; } function updateTotal() { const dp = parseFloat(document.getElementById("debitPrincipal").value) || 0; const taxa = parseFloat(document.getElementById("taxaTimbru").value) || 0; const dob = parseFloat(document.getElementById("dobanzi").value) || 0; const pen = parseFloat(document.getElementById("penalitati").value) || 0; const chex = parseFloat(document.getElementById("cheltuieliExecutare").value) || 0; const chea = parseFloat(document.getElementById("cheltuieliAvocat").value) || 0; const chej = parseFloat(document.getElementById("cheltuieliJudecata").value) || 0; const inf = parseFloat(document.getElementById("inflatie").value) || 0; const total = dp + taxa + dob + pen + chex + chea + chej + inf; document.getElementById("totalDebit").value = total.toFixed(2); updateOnorariuAndProcent(); } function updateOnorariuAndProcent() { const total = parseFloat(document.getElementById("totalDebit").value) || 0; const avans = parseFloat(document.getElementById("onorariuAvans").value) || 0; let onorariuProcentual = 0; if (total > 0 && total <= 50000) { onorariuProcentual = total * 0.10; } else if (total > 50000 && total <= 80000) { onorariuProcentual = 5000 + (total - 50000) * 0.03; } else if (total > 80000 && total <= 100000) { onorariuProcentual = 5900 + (total - 80000) * 0.02; } else if (total > 100000) { onorariuProcentual = 6300 + (total - 100000) * 0.01; } onorariuProcentual -= avans; if (onorariuProcentual < 0) onorariuProcentual = 0; document.getElementById("onorariuPctFix").value = onorariuProcentual.toFixed(2); const procentExecutor = total > 0 ? (avans / total) * 100 : 0; document.getElementById("procentExecutor").value = procentExecutor.toFixed(2); } function salveazaXML() { try { const xmlDoc = document.implementation.createDocument(null, "date", null); const root = xmlDoc.documentElement; for (let pagina = 1; pagina <= 6; pagina++) { const tab = document.getElementById("pagina" + pagina); if (!tab) continue; const pageNode = xmlDoc.createElement("pagina"); pageNode.setAttribute("id", "pagina" + pagina); if (pagina === 5) { // Pagina 5 trebuie să salvăm și băncile bifate explicit const banciContainer = document.getElementById("banciListContainer"); const checkboxes = banciContainer.querySelectorAll('input[type=checkbox]'); const banciNode = xmlDoc.createElement("banciPoprite"); checkboxes.forEach((chk) => { if (chk.checked) { const bancaNode = xmlDoc.createElement("banca"); bancaNode.textContent = chk.value; banciNode.appendChild(bancaNode); } }); pageNode.appendChild(banciNode); } const inputs = tab.querySelectorAll("input, select, textarea"); inputs.forEach((inp) => { if (pagina === 5 && inp.type === "checkbox") return; const field = xmlDoc.createElement("field"); field.setAttribute("id", inp.id); field.textContent = inp.value; pageNode.appendChild(field); }); root.appendChild(pageNode); } const serializer = new XMLSerializer(); const xmlStr = serializer.serializeToString(xmlDoc); const blob = new Blob([xmlStr], { type: "text/xml" }); const a = document.createElement("a"); a.href = URL.createObjectURL(blob); a.download = "executor_data.xml"; a.click(); } catch (e) { alert("Eroare la salvarea XML: " + e.message); } } function incarcaXML() { const input = document.createElement("input"); input.type = "file"; input.accept = ".xml"; input.onchange = function (e) { const file = e.target.files[0]; if (!file) return; const reader = new FileReader(); reader.onload = function (evt) { try { const parser = new DOMParser(); const xmlDoc = parser.parseFromString(evt.target.result, "application/xml"); const paginaNodes = xmlDoc.getElementsByTagName("pagina"); for (let i = 0; i < paginaNodes.length; i++) { const paginaNode = paginaNodes[i]; const paginaId = paginaNode.getAttribute("id"); if (!paginaId) continue; if (!["pagina1", "pagina2", "pagina3", "pagina4", "pagina5", "pagina6"].includes(paginaId)) continue; const tab = document.getElementById(paginaId); if (!tab) continue; if (paginaId === "pagina1") { document.getElementById("creditoriContainer").innerHTML = ""; document.getElementById("debitoriContainer").innerHTML = ""; nrCreditor = 0; nrDebitor = 0; } if (paginaId === "pagina5") { document.getElementById("angajatoriContainer").innerHTML = ""; nrAngajator = 0; const banciContainer = document.getElementById("banciListContainer"); if (banciContainer) { const allChk = banciContainer.querySelectorAll('input[type=checkbox]'); allChk.forEach((chk) => (chk.checked = false)); } } if (paginaId === "pagina5") { const banciPopriteNodes = paginaNode.getElementsByTagName("banciPoprite"); if (banciPopriteNodes.length > 0) { const banciPopriteNode = banciPopriteNodes[0]; const banciNod = banciPopriteNode.getElementsByTagName("banca"); const banciContainer = document.getElementById("banciListContainer"); for (let k = 0; k < banciNod.length; k++) { const val = banciNod[k].textContent; const chk = Array.from(banciContainer.querySelectorAll('input[type=checkbox]')).find( (ch) => ch.value === val ); if (chk) chk.checked = true; } } } const fields = paginaNode.getElementsByTagName("field"); Array.from(fields).forEach(function (field) { const id = field.getAttribute("id"); const val = field.textContent || ""; let inp = tab.querySelector(`#${id}`); if (!inp) inp = document.querySelector(`#${id}`); if (paginaId === "pagina1") { if (id.startsWith("creditorTip")) { adaugaCreditor(); const lastIdx = nrCreditor; document.getElementById(`creditorTip${lastIdx}`).value = val; } else if ( id.startsWith("creditorNume") || id.startsWith("creditorCNP") || id.startsWith("creditorDomiciliu") || id.startsWith("creditorJudet") || id.startsWith("creditorCodPostal") || id.startsWith("creditorTelefon") || id.startsWith("creditorEmail") ) { if (document.getElementById(id)) document.getElementById(id).value = val; } else if (id.startsWith("debitorTip")) { adaugaDebitor(); const lastIdx = nrDebitor; document.getElementById(`debitorTip${lastIdx}`).value = val; } else if ( id.startsWith("debitorNume") || id.startsWith("debitorCNP") || id.startsWith("debitorDomiciliu") || id.startsWith("debitorJudet") || id.startsWith("debitorCodPostal") || id.startsWith("debitorTelefon") || id.startsWith("debitorEmail") ) { if (document.getElementById(id)) document.getElementById(id).value = val; } else if (inp) { inp.value = val; } } else if (paginaId === "pagina5") { if ( id.startsWith("angajatorDenumire") || id.startsWith("angajatorCodFiscal") || id.startsWith("angajatorRegistru") || id.startsWith("angajatorJudet") || id.startsWith("angajatorCodPostal") || id.startsWith("angajatorTelefon") || id.startsWith("angajatorEmail") ) { let idx = parseInt(id.match(/\d+$/)[0]); while (nrAngajator < idx) { adaugaAngajator(); } document.getElementById(id).value = val; } else if (inp) { inp.value = val; } } else { if (inp) { inp.value = val; if (inp.tagName.toLowerCase() === "select") { inp.dispatchEvent(new Event("change", { bubbles: true })); } if (typeof inp.oninput === "function") { inp.oninput(); } } } }); } updateTotal(); updateBanciPopririDisplay(); } catch (err) { alert("Eroare la procesarea fișierului XML: " + err.message); } }; reader.readAsText(file); }; input.click(); } function importaAngajatori() { const input = document.createElement("input"); input.type = "file"; input.accept = ".csv,text/csv"; input.onchange = function (e) { const file = e.target.files[0]; if (!file) return; const debitoriContainer = document.getElementById("debitoriContainer"); const cnpDebitori = []; for (let i = 1; i <= nrDebitor; i++) { const cnpElem = document.getElementById(`debitorCNP${i}`); if (cnpElem && cnpElem.value) cnpDebitori.push(cnpElem.value.replace(/[^0-9]/g, "")); } Papa.parse(file, { header: true, skipEmptyLines: true, complete: function (results) { const data = results.data; let alertaData = null; const azi = new Date(); let angajatoriGasiti = 0; data.forEach((row) => { const rawCnp = row["CNP"] || ""; const rawCui = row["CuiAngajator"] || ""; const rawDenumire = row["Denumire"] || ""; const rawDomFiscal = row["DomFiscal"] || ""; const rawAnRap = row["AnRaportare"] || ""; const rawLunaRap = row["LunaRaportare"] || ""; const cnp = cleanCsvValue(rawCnp); const cuiAngajator = cleanCsvValue(rawCui); const denumire = cleanCsvValue(rawDenumire); const domFiscal = cleanCsvValue(rawDomFiscal); const anRap = cleanCsvValue(rawAnRap); const lunaRap = cleanCsvValue(rawLunaRap); if (!cnp || !denumire) return; if (!cnpDebitori.includes(cnp)) return; let exista = false; for (let i = 1; i <= nrAngajator; i++) { const cnpExist = document.getElementById(`angajatorCNP${i}`); if (cnpExist && cnpExist.value === cnp) { exista = true; break; } } if (exista) return; angajatoriGasiti++; let judet = ""; if (domFiscal) { let domCurat = domFiscal; if (domCurat.toUpperCase().startsWith("JUD.")) { domCurat = domCurat.substring(4).trim(); } const virgulita = domCurat.indexOf(","); if (virgulita > 0) { judet = domCurat.substring(0, virgulita).trim(); } else { const spatiu = domCurat.indexOf(" "); if (spatiu > 0) judet = domCurat.substring(0, spatiu).trim(); else judet = domCurat.trim(); } } nrAngajator++; const container = document.getElementById("angajatoriContainer"); const div = document.createElement("div"); div.className = "part"; div.dataset.index = nrAngajator; div.appendChild(createLabel("C.N.P.")); let cnpInp = createInput(`angajatorCNP${nrAngajator}`); cnpInp.value = cnp; div.appendChild(cnpInp); div.appendChild(createLabel("Denumire")); let denumInp = createInput(`angajatorDenumire${nrAngajator}`); denumInp.value = denumire; div.appendChild(denumInp); div.appendChild(createLabel("Cod fiscal")); let cuiInp = createInput(`angajatorCodFiscal${nrAngajator}`); cuiInp.value = cuiAngajator; div.appendChild(cuiInp); div.appendChild(createLabel("Sediu")); let regInp = createInput(`angajatorRegistru${nrAngajator}`); regInp.value = domFiscal; div.appendChild(regInp); div.appendChild(createLabel("Județ")); let judInp = createInput(`angajatorJudet${nrAngajator}`); judInp.value = judet; div.appendChild(judInp); div.appendChild(createLabel("Telefon")); div.appendChild(createInput(`angajatorTelefon${nrAngajator}`)); div.appendChild(createLabel("E-mail")); div.appendChild(createInput(`angajatorEmail${nrAngajator}`)); if (nrAngajator > 1) { const btnSterge = document.createElement("button"); btnSterge.type = "button"; btnSterge.className = "btn ghost"; btnSterge.textContent = "Șterge angajator"; btnSterge.onclick = () => { if (container.children.length > 1) container.removeChild(div); else alert("Trebuie să existe cel puțin un angajator"); }; div.appendChild(btnSterge); } container.appendChild(div); if (anRap && lunaRap) { const dataRap = new Date(anRap, parseInt(lunaRap) - 1, 1); const treiLuniInMilis = 1000 * 60 * 60 * 24 * 30 * 3; if (azi - dataRap > treiLuniInMilis) { if (!alertaData || dataRap > alertaData) alertaData = dataRap; } } }); let alertaDiv = document.getElementById("angajatoriImportAlert"); if (!alertaDiv) { alertaDiv = document.createElement("div"); alertaDiv.id = "angajatoriImportAlert"; alertaDiv.style.color = "red"; alertaDiv.style.marginTop = "10px"; document .querySelector('#angajatori button.btn.primary[onclick="importaAngajatori()"]') .after(alertaDiv); } if (angajatoriGasiti === 0) { alertaDiv.textContent = "Nu au fost găsite date!"; } else { if (alertaData) { const zi = String(alertaData.getDate()).padStart(2, "0"); const luna = String(alertaData.getMonth() + 1).padStart(2, "0"); const an = alertaData.getFullYear(); alertaDiv.textContent = `Au trecut mai mult de 3 luni de la data ultimei declarații, respectiv: ${zi}.${luna}.${an}`; } else { alertaDiv.textContent = ""; } } }, error: function (err) { alert("Eroare la citirea fișierului CSV: " + err.message); }, }); }; input.click(); } function importaBanci() { const input = document.createElement("input"); input.type = "file"; input.accept = ".csv,text/csv"; input.onchange = function (e) { const file = e.target.files[0]; if (!file) return; Papa.parse(file, { header: true, skipEmptyLines: true, delimiter: ";", complete: function (results) { const dataRaw = results.data; banci = []; dataRaw.forEach((r, idx) => { const den = r["DenumireBanca"] || r["Denumire"] || r["BANK"] || r["Denumire banca"] || ""; const addr = r["Adresa"] || r["Address"] || ""; const id = Date.now() + idx; banci.push({ id, name: den, addr: addr, contact: r["Email"] || "" }); }); renderBanci(); alert(banci.length + " bancă(ri) importată(e)"); }, error: function (err) { alert("Eroare la citirea fișierului CSV: " + err.message); }, }); }; input.click(); } function renderAngajatori() { const q = document.getElementById("searchAngajatori").value.toLowerCase(); const container = document.getElementById("angajatoriContainer"); container.innerHTML = ""; angajatori.forEach((a) => { if ( q && !(a.name || "").toLowerCase().includes(q) && !(a.cui && a.cui.toLowerCase().includes(q)) && !(a.addr && a.addr.toLowerCase().includes(q)) ) return; const div = document.createElement("div"); div.textContent = a.name + (a.cui ? " (" + a.cui + ")" : ""); div.style.padding = "6px 8px"; div.style.borderBottom = "1px solid #ccc"; div.style.cursor = "pointer"; div.onclick = () => { selectedAngajator = a; selectedBanci.clear(); updateBanciPopririDisplay(); alert("Angajator selectat: " + a.name); }; container.appendChild(div); }); } function renderBanci() { const q = document.getElementById("searchBanci").value.toLowerCase(); const container = document.getElementById("banciListContainer"); container.innerHTML = ""; banci.forEach((b) => { if ( q && !(b.name || "").toLowerCase().includes(q) && !(b.addr && b.addr.toLowerCase().includes(q)) ) return; const div = document.createElement("div"); div.style.display = "flex"; div.style.alignItems = "center"; div.style.borderBottom = "1px solid #ccc"; div.style.padding = "6px 8px"; const cb = document.createElement("input"); cb.type = "checkbox"; cb.checked = selectedBanci.has(b.id); cb.style.marginRight = "10px"; cb.onchange = () => { if (cb.checked) selectedBanci.add(b.id); else selectedBanci.delete(b.id); updateBanciPopririDisplay(); }; const label = document.createElement("span"); label.textContent = b.name + (b.addr ? " - " + b.addr : ""); div.appendChild(cb); div.appendChild(label); container.appendChild(div); }); updateBanciPopririDisplay(); } function updateBanciPopririDisplay() { const display = document.getElementById("banciPopririDisplay"); if (selectedBanci.size === 0) { display.textContent = "Selectați una sau mai multe bănci pentru a vedea adresa de poprire"; return; } let text = `Adresa poprire pentru ${selectedBanci.size} bancă/banți:\n\n`; Array.from(selectedBanci).forEach((id, i) => { const banca = banci.find((b) => b.id === id); if (banca) { text += `${i + 1}. Către: ${banca.name}\n Adresa: ${banca.addr}\n\n`; } }); display.textContent = text; } function genereazaAdresaPoprire() { if (selectedAngajator) { alert(`Adresă poprire pentru angajator:\nCătre: ${selectedAngajator.name}\nAdresa: ${selectedAngajator.addr || ""}`); } else if (selectedBanci.size > 0) { let text = `Adresă poprire - multiple bănci:\n\n`; Array.from(selectedBanci).forEach((id, i) => { const b = banci.find((x) => x.id === id); if (b) text += `${i + 1}. Către: ${b.name}\n Adresa: ${b.addr || ""}\n\n`; }); alert(text); } else alert("Selectați un angajator sau cel puțin o bancă."); } // Export CSV pentru terți (angajatori / bănci) în funcție de selecție function exportaCSV() { let csv = ''; if (selectedAngajator) { csv = `"${selectedAngajator.name}","${selectedAngajator.cui}","${selectedAngajator.addr}","${selectedAngajator.contact}"\n`; } else if (selectedBanci.size > 0) { csv = Array.from(selectedBanci) .map((id) => { const b = banci.find((x) => x.id === id); return b ? `"${b.name}","${b.cui}","${b.addr}","${b.contact}"` : ''; }) .join('\n') + '\n'; } else { alert('Selectați un angajator sau una sau mai multe bănci pentru export.'); return; } const blob = new Blob([csv], { type: 'text/csv' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'export.csv'; a.click(); URL.revokeObjectURL(url); } // Simulare trimitere email pentru selecția curentă (angajator / bănci) function trimiteEmail() { if (selectedAngajator) { alert(`Email trimis către: ${selectedAngajator.contact || 'necunoscut'}`); } else if (selectedBanci.size > 0) { const emails = Array.from(selectedBanci) .map((id) => { const b = banci.find((x) => x.id === id); return b && b.contact ? b.contact : null; }) .filter((e) => e); alert(`Email trimis către: ${emails.length ? emails.join(', ') : 'necunoscut'}`); } else { alert('Selectați un angajator sau cel puțin o bancă pentru a trimite email.'); } } // Gestionare bunuri mobile și imobile – inițializare, afișare, adăugare, editare, ștergere, export JSON // Items array și selectedId declare deja global // Funcții initializeSection, renderTable, selectItem, openModal, closeModal, saveItem, removeItem, exportJSON, downloadItem, generatePV au fost deja definite conform codului anterior // Export JSON pentru toate bunurile (mobile + imobile) function exportJSONAll() { const blob = new Blob([JSON.stringify(items, null, 2)], { type: 'application/json' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'bunuri_toate.json'; a.click(); URL.revokeObjectURL(url); } // Funcții suplimentare pentru docx import și export PDF async function exportDocxToPdf() { const element = document.getElementById('docxContent'); if (!element) { alert('Nu există conținut de exportat.'); return; } const tempContainer = document.createElement('div'); // Adaugă antet specific executoriu const header = document.createElement('div'); header.style.textAlign = 'center'; header.style.marginBottom = '5px'; header.innerHTML = ` <div style="display:flex; align-items:center; gap:15px;"> <img src="https://i.imgur.com/Rq4cSCA.png" style="width:80px; height:auto;" /> <div style="flex:1; text-align:center; font-family:Arial,sans-serif; font-weight:bold;"> Camera Executorilor Judecătorești de pe lângă Curtea de Apel Târgu-Mureș<br/> BIROUL EXECUTORULUI JUDECĂTORESC<br/> PETER ISTVAN </div> </div> <hr style="border:1px solid #000; margin:4px 0;" /> <div style="font-size:10px; font-family:Arial,sans-serif; line-height:1.4;"> 535500 Gheorgheni, Bld. Lacu Roșu, bl.5/B/1, jud. Harghita, tel/fax 0266-361267.<br/> C.I.F. 27142880, cont de consemnare: RO56 BRDE 210S V427 6571 2100 – B.R.D. Agenția Gheorgheni.<br/> e-mail: <a href="mailto:[email protected]">[email protected]</a> </div> `; tempContainer.appendChild(header); const clonedContent = element.cloneNode(true); clonedContent.style.marginTop = '15px'; clonedContent.style.border = 'none'; clonedContent.style.maxHeight = 'none'; clonedContent.style.overflow = 'visible'; clonedContent.style.whiteSpace = 'pre-wrap'; clonedContent.style.wordWrap = 'break-word'; clonedContent.style.boxSizing = 'border-box'; clonedContent.style.width = '170mm'; clonedContent.style.margin = '0'; tempContainer.appendChild(clonedContent); const opt = { margin: [20, 30, 20, 10], filename: 'document_executor.pdf', image: { type: 'jpeg', quality: 0.98 }, html2canvas: { scale: 2, useCORS: true, scrollY: -window.scrollY }, jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait', putOnlyUsedFonts: true }, }; await html2pdf().set(opt).from(tempContainer).save(); } function resetDocx() { const contentDiv = document.getElementById('docxContent'); if (contentDiv) contentDiv.innerHTML = ''; const fileInput = document.getElementById('docxFile'); if (fileInput) fileInput.value = ''; } } </script> </body> </html>text<!-- Secțiunile pentru celelalte pagini --> <div id="view-titlu" style="display:none"> <h2>Titlu executoriu</h2> <div class="cards"> <div class="card"> <label for="titluExecutoriu">Titluri</label> <textarea id="titluExecutoriu" rows="4"></textarea> <label for="anexeTitluExecutoriu">Anexe</label> <textarea id="anexeTitluExecutoriu" rows="3"></textarea> </div> <div class="card"> <label for="incheiereNr">Număr încheiere/incuviințare</label> <input id="incheiereNr" type="text" /> <label for="incheiereData">Data încheiere/incuviințare</label> <input id="incheiereData" type="text" /> <label for="incheiereInstanta">Instanța emitentă</label> <input id="incheiereInstanta" type="text" /> </div> </div> </div> <div id="view-finance" style="display:none"> <h2>Calcul financiar</h2> <div class="row"> <div class="col card"> <label for="debitPrincipal">Debit principal</label> <input id="debitPrincipal" type="number" value="0" oninput="updateTotal()"> <label for="taxaTimbru">Taxă timbru</label> <input id="taxaTimbru" type="number" value="0" oninput="updateTotal()"> <label for="dobanzi">Dobânzi</label> <input id="dobanzi" type="number" value="0" oninput="updateTotal()"> <label for="penalitati">Penalități</label> <input id="penalitati" type="number" value="0" oninput="updateTotal()"> </div> <div class="col card"> <label for="cheltuieliExecutare">Cheltuieli executare</label> <input id="cheltuieliExecutare" type="number" value="0" oninput="updateTotal()"> <label for="cheltuieliAvocat">Cheltuieli avocat</label> <input id="cheltuieliAvocat" type="number" value="0" oninput="updateTotal()"> <label for="inflatie">Inflație</label> <input id="inflatie" type="number" value="0" oninput="updateTotal()"> <label for="totalDebit">Total (calculat)</label> <input id="totalDebit" readonly> </div> </div> <div style="margin-top:12px" class="card"> <label for="onorariuAvans">Onorariu avans</label> <input id="onorariuAvans" type="number" value="0" oninput="updateOnorariuAndProcent()"> <label for="onorariuPctFix">Onorariu procentual fix (calculat)</label> <input id="onorariuPctFix" readonly> <label for="procentExecutor">Procent executor</label> <input id="procentExecutor" readonly> </div> </div> <div id="view-fisa" style="display:none"> <h2>Fișă de calcul</h2> <div id="fisaCalc" class="card" style="overflow:auto"> <table id="fisaCalculTable" style="width: 100%; border-collapse: collapse;"> <thead> <tr> <th>Tip</th> <th>Valoare</th> </tr> </thead> <tbody> <tr><td>Debit principal</td><td id="fisaDebitPrincipal">0.00</td></tr> <tr><td>Taxă timbru</td><td id="fisaTaxaTimbru">0.00</td></tr> <tr><td>Dobânzi</td><td id="fisaDobanzi">0.00</td></tr> <tr><td>Penalități</td><td id="fisaPenalizati">0.00</td></tr> <tr><td>Cheltuieli executare</td><td id="fisaCheltuieliExec">0.00</td></tr> <tr><td>Cheltuieli avocat</td><td id="fisaCheltuieliAvocat">0.00</td></tr> <tr><td>Inflație</td><td id="fisaInflatie">0.00</td></tr> <tr><th>Total</th><th id="fisaTotal">0.00</th></tr> </tbody> </table> <div id="infoGenerale" style="margin-top:8px; font-weight: bold;"></div> <div id="partiImplicate" style="margin-top:8px; font-weight: bold;"></div> <button class="btn primary" style="margin-top: 12px;" onclick="calcFisa()">Calculează</button> </div> </div> <div id="view-terti" style="display:none"> <h2>Terți popriți</h2> <div class="row"> <div class="col card" style="font-family: Arial, sans-serif;"> <h3>Angajatori</h3> <input id="searchAngajatori" type="text" placeholder="Caută angajator..." style="width:100%; max-width:400px; padding:8px; margin-bottom:12px; border-radius:6px; border:1px solid #ccc;" oninput="renderAngajatori()" aria-label="Caută angajator"> <div id="angajatoriContainer" style="border:1px solid #888; padding:10px; max-height:320px; overflow-y:auto; border-radius:8px; background:#f8fafc;" aria-live="polite" aria-relevant="additions"></div> <div style="margin-top:8px"> <button class="btn primary" onclick="adaugaAngajator()">Adaugă</button> <button class="btn ghost" onclick="importaAngajatori()">Import CSV</button> </div> </div> <div class="col card" style="font-family: Arial, sans-serif;"> <h3>Bănci</h3> <input id="searchBanci" type="text" placeholder="Caută bancă..." style="width:100%; max-width:400px; padding:8px; margin-bottom:12px; border-radius:6px; border:1px solid #ccc;" oninput="renderBanci()" aria-label="Caută bancă"> <div id="banciListContainer" style="max-height:320px; overflow-y:auto; border:1px solid #888; padding:6px; border-radius:8px; background:#f8fafc;" aria-live="polite" aria-relevant="additions"></div> <div style="margin-top:8px"> <button class="btn primary" onclick="importaBanci()">Import CSV</button> <button class="btn ghost" onclick="genereazaAdresaPoprire()">Generează adresă</button> </div> <div id="banciPopririDisplay" style="margin-top:20px; padding:12px; background:#e0e7ff; border-radius:8px; font-family: monospace; white-space: pre-wrap; min-height: 100px;"></div> </div> </div> <div style="margin-top:24px; display: flex; gap: 12px; flex-wrap: wrap;"> <button class="btn primary" onclick="genereazaAdresaPoprire()">Generează adresă poprire</button> <button class="btn ghost" onclick="exportaCSV()">Export CSV</button> <button class="btn ghost" onclick="trimiteEmail()">Trimite email</button> </div> </div> <div id="view-bunuri" style="display:none"> <h2>Bunuri</h2> <div class="row"> <div class="col card"> <div id="mobile"></div> <div id="imobile"></div> <div style="margin-top:8px"> <button class="btn primary" onclick="openModal('add')">Adaugă bun</button> <button class="btn ghost" onclick="exportJSONAll()">Export JSON</button> </div> <div style="margin-top:8px"> <small class="muted">Listează bunurile mobile și imobile. Configurație modernă inspirată din zenic/executor-it.</small> </div> </div> <aside class="card" style="max-width:360px"> <h4>Detalii bun</h4> <div><label>Tip</label><div id="d-tip">—</div></div> <div><label>Categoria</label><div id="d-cat">—</div></div> <div><label>Descriere</label><div id="d-desc">—</div></div> <div><label>Valoare</label><div id="d-val">—</div></div> <div><label>Stare juridică</label><div id="d-jur">—</div></div> <div style="margin-top:8px"> <button class="btn ghost" onclick="generatePV()">Generează PV</button> <button class="btn ghost" onclick="downloadItem()">Descarcă</button> </div> </aside> </div> </div> <div id="view-generate" style="display:none"> <h2>Generează documente</h2> <div class="card"> <label for="docxFile">Încarcă .docx pentru conversie</label> <input type="file" id="docxFile" accept=".docx" aria-label="Încarcă fișier DOCX" /> <div id="docxContent" style="margin-top:12px; background:rgba(255,255,255,0.02); padding:10px; border-radius:8px; min-height:120px;"></div> <div style="margin-top:10px" class="flex"> <button class="btn primary" onclick="exportDocxToPdf()">Exportă PDF</button> <button class="btn ghost" onclick="resetDocx()">Șterge text</button> </div> </div> </div> </section> <footer class="small" role="contentinfo"> Created from uploaded app (am păstrat și extins funcționalitățile) </footer>