Files
romfast-website/efactura-generator/index.html
Claude Agent 3a5076d7cd sync efactura-generator -> 0.9-beta-15
- Header reorganizat cu meniu Acțiuni (overflow dropdown)
- Buton nou PDF ANAF (transformare oficială XML->PDF prin API ANAF)
- Fix endpoint ANAF: validează default + ruta publică fără auth
2026-05-05 13:58:30 +00:00

306 lines
18 KiB
HTML

<!DOCTYPE html>
<html lang="ro">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Editor Factură Electronică</title>
<link rel="preconnect" href="https://fonts.bunny.net">
<link href="https://fonts.bunny.net/css?family=geist:400,500,600,700|geist-mono:400,500,600&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/pikaday/1.8.0/css/pikaday.min.css">
<link rel="stylesheet" href="./styles/main.css">
<link rel="shortcut icon" href="./favicon.ico" type="image/x-icon" />
</head>
<body>
<div class="container">
<div class="header">
<div>
<h1>Editor eFactura</h1>
<div class="app-author">Romfast SRL</div>
</div>
<div class="button-group">
<input type="file" id="fileInput" class="file-input" accept=".xml,.zip,application/zip,application/x-zip-compressed" multiple>
<button onclick="document.getElementById('fileInput').click()" class="button">Alege Fișier XML / ZIP</button>
<button onclick="window.openNewInvoiceModal()" class="button" title="Factură nouă cu numerotare automată">Factură Nouă</button>
<button onclick="handleStorno()" class="button button-danger">Stornează</button>
<button onclick="saveXML()" class="button button-secondary">Salvează XML</button>
<div class="actions-menu-wrapper">
<button id="btnActionsMenu" type="button" class="button button-secondary" aria-haspopup="menu" aria-expanded="false" aria-controls="actionsMenu">Acțiuni <span class="actions-menu-chevron" aria-hidden="true"></span></button>
<div id="actionsMenu" class="actions-menu" role="menu" aria-labelledby="btnActionsMenu" hidden>
<button type="button" role="menuitem" class="actions-menu-item" data-action="print" data-template="standard">Printează — Standard</button>
<button type="button" role="menuitem" class="actions-menu-item" data-action="print" data-template="compact">Printează — Compact</button>
<div class="actions-menu-divider" role="separator"></div>
<button id="btnDownloadPDF" type="button" role="menuitem" class="actions-menu-item" data-action="downloadPdf">Descarcă PDF</button>
<div class="actions-menu-anaf" hidden>
<button id="btnPdfAnaf" type="button" role="menuitem" class="actions-menu-item is-success" data-action="pdfAnaf" title="PDF oficial generat de ANAF din XML (necesită receiver.php)">PDF ANAF</button>
<button id="btnValidateAnaf" type="button" role="menuitem" class="actions-menu-item is-success" data-action="validateAnaf" title="Validare prin API ANAF (necesită receiver.php)">Validare ANAF</button>
</div>
</div>
</div>
</div>
</div>
<form id="invoiceForm">
<!-- Details Grid -->
<div class="details-grid">
<!-- Invoice Details -->
<div class="form-section invoice-details">
<h2 class="section-title">Detalii Factură</h2>
<div class="compact-grid">
<div class="form-group">
<label class="form-label">Număr Factură</label>
<input type="text" class="form-input mono" name="invoiceNumber" style="text-align:left">
</div>
<div class="form-group">
<label class="form-label">Tip Factură</label>
<select class="form-input" name="invoiceTypeCode">
<option value="380">380 — Factură comercială</option>
<option value="381">381 — Notă de credit</option>
<option value="384">384 — Factură corectată</option>
<option value="389">389 — Autofactură</option>
</select>
</div>
<div class="form-group">
<label class="form-label">Data Emiterii</label>
<div class="date-input-container">
<input type="text" class="form-input date-input num" name="issueDate" placeholder="dd.mm.yyyy" maxlength="10" pattern="\d{2}.\d{2}.\d{4}">
<button type="button" class="calendar-button" tabindex="-1">📅</button>
</div>
</div>
<div class="form-group">
<label class="form-label">Data Scadentă</label>
<div class="date-input-container">
<input type="text" class="form-input date-input num" name="dueDate" placeholder="dd.mm.yyyy" maxlength="10" pattern="\d{2}.\d{2}.\d{4}">
<button type="button" class="calendar-button" tabindex="-1">📅</button>
</div>
</div>
<div class="form-group">
<label class="form-label">Monedă Factură</label>
<input type="text" class="form-input mono" name="documentCurrencyCode" value="RON" maxlength="3" style="text-align:left">
</div>
<div class="form-group">
<label class="form-label">Monedă TVA (opțional)</label>
<input type="text" class="form-input mono" name="taxCurrencyCode" maxlength="3" style="text-align:left">
</div>
<div class="form-group">
<label class="form-label">Factură Referită (nr.)</label>
<input type="text" class="form-input mono" name="billingRefId" placeholder="Nr. factură originală" style="text-align:left">
</div>
<div class="form-group">
<label class="form-label">Data Factură Referită</label>
<div class="date-input-container">
<input type="text" class="form-input date-input num" name="billingRefDate" placeholder="dd.mm.yyyy" maxlength="10" pattern="\d{2}.\d{2}.\d{4}">
<button type="button" class="calendar-button" tabindex="-1">📅</button>
</div>
</div>
</div>
</div>
<!-- Supplier Details -->
<div class="form-section party-details">
<h2 class="section-title">
Detalii Furnizor
<span class="card-actions" id="supplierProfileActions">
<button type="button" class="button button-secondary button-small"
id="btnSaveProfile" onclick="window.saveSupplierProfile()">Salvează profil</button>
<button type="button" class="button button-secondary button-small"
id="btnUseProfile" onclick="window.useSupplierProfile()">Folosește profil</button>
<button type="button" class="button button-secondary button-small"
id="btnDeleteProfile" onclick="window.deleteSupplierProfile()">Șterge profil</button>
</span>
</h2>
<div class="compact-grid">
<div class="form-group">
<label class="form-label">Nume</label>
<input type="text" class="form-input" name="supplierName">
</div>
<div class="form-group">
<label class="form-label">Cod TVA</label>
<div class="input-with-action">
<input type="text" class="form-input mono" name="supplierVAT" style="text-align:left">
<button type="button" id="btnLookupSupplierCif" class="button button-secondary button-small anaf-cif-btn" style="display:none" onclick="window.lookupCif('supplier')" title="Caută date firmă din ANAF">Caută</button>
</div>
</div>
<div class="form-group">
<label class="form-label">Nr. înregistrare</label>
<input type="text" class="form-input mono" name="supplierCompanyId" style="text-align:left">
</div>
<div class="form-group">
<label class="form-label">Adresă</label>
<input type="text" class="form-input" name="supplierAddress">
</div>
<div class="form-group">
<label class="form-label">Oraș</label>
<input type="text" class="form-input" name="supplierCity">
</div>
<div class="form-group">
<label class="form-label">Județ</label>
<input type="text" class="form-input" name="supplierCountrySubentity">
</div>
<div class="form-group">
<label class="form-label">Țară</label>
<input type="text" class="form-input" name="supplierCountry">
</div>
<div class="form-group">
<label class="form-label">Telefon</label>
<input type="tel" class="form-input mono" name="supplierPhone" pattern="[0-9]*" style="text-align:left">
</div>
<div class="form-group">
<label class="form-label">Persoană Contact</label>
<input type="text" class="form-input" name="supplierContactName">
</div>
<div class="form-group">
<label class="form-label">Email</label>
<input type="email" class="form-input" name="supplierEmail">
</div>
</div>
</div>
<!-- Customer Details -->
<div class="form-section party-details">
<h2 class="section-title">Detalii Client</h2>
<div class="compact-grid">
<div class="form-group">
<label class="form-label">Nume</label>
<input type="text" class="form-input" name="customerName">
</div>
<div class="form-group">
<label class="form-label">Cod TVA</label>
<div class="input-with-action">
<input type="text" class="form-input mono" name="customerVAT" style="text-align:left">
<button type="button" id="btnLookupCustomerCif" class="button button-secondary button-small anaf-cif-btn" style="display:none" onclick="window.lookupCif('customer')" title="Caută date firmă din ANAF">Caută</button>
</div>
</div>
<div class="form-group">
<label class="form-label">Nr. înregistrare</label>
<input type="text" class="form-input mono" name="customerCompanyId" style="text-align:left">
</div>
<div class="form-group">
<label class="form-label">Adresă</label>
<input type="text" class="form-input" name="customerAddress">
</div>
<div class="form-group">
<label class="form-label">Oraș</label>
<input type="text" class="form-input" name="customerCity">
</div>
<div class="form-group">
<label class="form-label">Județ</label>
<input type="text" class="form-input" name="customerCountrySubentity">
</div>
<div class="form-group">
<label class="form-label">Țară</label>
<input type="text" class="form-input" name="customerCountry">
</div>
<div class="form-group">
<label class="form-label">Telefon</label>
<input type="tel" class="form-input mono" name="customerPhone" pattern="[0-9]*" style="text-align:left">
</div>
<div class="form-group">
<label class="form-label">Persoană Contact</label>
<input type="text" class="form-input" name="customerContactName">
</div>
<div class="form-group">
<label class="form-label">Email</label>
<input type="email" class="form-input" name="customerEmail">
</div>
</div>
</div>
</div>
<!-- Note field -->
<div class="form-section">
<h2 class="section-title">Text Adițional</h2>
<div class="form-group">
<textarea class="form-input note-input" name="invoiceNote" rows="4" maxlength="900"></textarea>
<div class="note-counter">0/900 caractere</div>
</div>
</div>
<!-- Payment Means (A5) -->
<div class="form-section" id="paymentMeansSection">
<h2 class="section-title">
Modalități de Plată
<button type="button" class="button button-small" onclick="window.addPaymentMeansRow()">+ Adaugă</button>
</h2>
<div id="paymentMeansRows"></div>
</div>
<!-- Allowances and Charges -->
<div class="allowance-charges" id="allowanceCharges">
<h2 class="section-title">
Reduceri și Taxe Suplimentare
<button type="button" class="button button-small" onclick="addAllowanceCharge()">
Adaugă Reducere/Taxă
</button>
</h2>
</div>
<!-- Line Items -->
<div class="line-items" id="lineItems">
<h2 class="section-title">
Articole Factură
<button type="button" class="button button-small" onclick="addLineItem()">
Adaugă Articol
</button>
</h2>
</div>
<!-- Totals Section -->
<div class="totals">
<div class="total-row">
<span>Subtotal:</span>
<span id="subtotal" class="editable-total">0.00</span>
</div>
<div class="total-row">
<span>Total Reduceri:</span>
<span id="totalAllowances" class="editable-total">0.00</span>
</div>
<div class="total-row">
<span>Total Taxe:</span>
<span id="totalCharges" class="editable-total">0.00</span>
</div>
<div class="total-row">
<span>Valoare Netă:</span>
<span id="netAmount" class="editable-total">0.00</span>
</div>
<!-- VAT Breakdown -->
<div id="vatBreakdown">
<h3 class="section-title">Defalcare TVA</h3>
<div id="vatBreakdownRows"></div>
<button type="button" class="button button-small" onclick="window.addVATRate()">
Adaugă Cotă TVA
</button>
<div class="vat-total-group">
<div class="total-row">
<span>Total TVA:</span>
<span id="vat" class="editable-total">0.00</span>
</div>
</div>
</div>
<div class="total-row total-row-final">
<span>Total:</span>
<span class="total-with-badge">
<span id="total" class="editable-total">0.00</span>
<span id="total-badge" class="badge"></span>
</span>
</div>
<div class="total-row">
<button type="button" class="button" onclick="refreshTotals()">Recalculează Totaluri</button>
</div>
</div>
</form>
<footer class="app-footer">
<span id="app-version">v0.9-beta-15</span>
<a href="https://www.romfast.ro">www.romfast.ro</a>
</footer>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pikaday/1.8.0/pikaday.min.js"></script>
<script type="module" src="./js/script.js"></script>
</body>
</html>