File manager - Edit - /home/webtrixia/.trash/invoice-doc.html.6
Back
<!DOCTYPE html> <html lang="bg"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Документ — Webtrixia</title> <link href="https://fonts.googleapis.com/css2?family=Sora:wght@300;400;500;600;700&family=DM+Mono:wght@400;500&display=swap" rel="stylesheet"> <style> :root{--green:#1aa64c;--dark:#12131a;--tx:#1a1a2e;--tx2:#4a4a6a;--tx3:#8888aa;--brd:#e3e1f0;--bg:#eef0fb} *{margin:0;padding:0;box-sizing:border-box} body{font-family:'Sora',sans-serif;background:var(--bg);min-height:100vh;padding:26px 16px;color:var(--tx)} .toolbar{max-width:820px;margin:0 auto 14px;display:flex;justify-content:flex-end;gap:8px} .tbtn{padding:9px 16px;border-radius:9px;border:none;cursor:pointer;font-family:'Sora',sans-serif;font-size:12.5px;font-weight:600} .tbtn.p{background:var(--green);color:#fff} .tbtn.s{background:#fff;color:var(--tx2);border:1px solid var(--brd)} .page{max-width:820px;margin:0 auto;background:#fff;border-radius:16px;overflow:hidden;box-shadow:0 4px 40px rgba(20,20,40,.08)} .head{display:flex;justify-content:space-between;align-items:flex-start;padding:34px 42px 20px} .logo{font-size:22px;font-weight:700;color:var(--green);letter-spacing:-.5px} .supplier{text-align:right;font-size:12px;line-height:1.7;color:var(--tx2)} .supplier b{color:var(--tx);font-size:13px} .badge-row{display:flex;justify-content:space-between;align-items:center;padding:0 42px 20px} .orig{border:1px solid var(--brd);border-radius:8px;padding:7px 16px;font-size:12px;font-weight:600;color:var(--tx3);letter-spacing:.05em} .recipient{text-align:right;font-size:12px;line-height:1.7;color:var(--tx2)} .recipient b{color:var(--tx);font-size:13px} .titlebar{display:flex;justify-content:space-between;align-items:flex-end;padding:6px 42px 22px;border-bottom:1px solid var(--brd)} .tt{} .tt .lbl{font-size:10px;letter-spacing:.15em;text-transform:uppercase;color:var(--tx3)} .tt .num{font-size:22px;font-weight:700;color:var(--green);margin:2px 0 10px} .dates{font-size:12px;color:var(--tx2);line-height:1.9} .dates b{color:var(--tx)} .amountbox{background:var(--green);color:#fff;border-radius:14px;padding:18px 26px;text-align:right;min-width:210px} .amountbox .big{font-size:34px;font-weight:700} table.items{width:100%;border-collapse:collapse;margin:22px 0;font-size:12.5px} table.items th{text-align:left;padding:9px 8px;color:var(--tx3);font-weight:600;border-bottom:2px solid var(--brd);font-size:11px;text-transform:uppercase;letter-spacing:.04em} table.items td{padding:11px 8px;border-bottom:1px solid var(--brd)} table.items th:nth-child(2),table.items td:nth-child(2), table.items th:nth-child(3),table.items td:nth-child(3), table.items th:nth-child(4),table.items td:nth-child(4), table.items th:nth-child(5),table.items td:nth-child(5){text-align:right} .bottom{display:flex;justify-content:space-between;padding:0 42px 34px;gap:20px;flex-wrap:wrap} .pay{font-size:12px;line-height:1.9;color:var(--tx2);max-width:340px} .pay b{color:var(--tx)} .words{font-size:12px;color:var(--tx2);margin-top:14px} .totals{font-size:12.5px;line-height:2;text-align:right;min-width:220px} .totals .grand{font-size:15px;font-weight:700;color:var(--green)} .sign{display:flex;justify-content:space-between;padding:20px 42px 36px;font-size:12px;color:var(--tx2)} .itembox{padding:0 42px} *{-webkit-print-color-adjust:exact;print-color-adjust:exact;color-adjust:exact} @page{size:A4;margin:12mm 10mm} @media print{ html,body{background:#fff;padding:0;margin:0} .toolbar{display:none} .page{box-shadow:none;border-radius:0;max-width:100%;margin:0} table.items tr{page-break-inside:avoid} .bottom,.sign{page-break-inside:avoid} .amountbox{background:var(--green)!important;color:#fff!important} } </style> </head> <body> <div class="toolbar"> <button class="tbtn s" onclick="history.back()">← Назад</button> <button class="tbtn p" onclick="window.print()">🖨️ Печат / PDF</button> </div> <div class="page" id="page">Зарежда…</div> <script> 'use strict'; var API=(function(){ var saved=localStorage.getItem('wt_api'); if(saved)return saved; var base=window.location.origin+window.location.pathname.replace(/invoice-doc\.html$/,'').replace(/\/$/,''); return base+'/api.php'; })(); var params=new URLSearchParams(location.search); var docId=params.get('id'); var TYPE_LABEL={proforma:'Проформа фактура',invoice:'Фактура',credit_note:'Кредитно известие',debit_note:'Дебитно известие',offer:'Оферта',quote:'Оферта'}; // ── Bulgarian number-to-words ── var ones=['', 'един', 'два', 'три', 'четири', 'пет', 'шест', 'седем', 'осем', 'девет']; var onesFem=['', 'една', 'две', 'три', 'четири', 'пет', 'шест', 'седем', 'осем', 'девет']; var teens=['десет','единадесет','дванадесет','тринадесет','четиринадесет','петнадесет','шестнадесет','седемнадесет','осемнадесет','деветнадесет']; var tens=['','','двадесет','тридесет','четиридесет','петдесет','шестдесет','седемдесет','осемдесет','деветдесет']; var hundreds=['','сто','двеста','триста','четиристотин','петстотин','шестстотин','седемстотин','осемстотин','деветстотин']; function threeDigits(n,fem){ n=n%1000; var h=Math.floor(n/100), r=n%100; var parts=[]; if(h) parts.push(hundreds[h]); if(r>=10&&r<20){ parts.push(teens[r-10]); } else{ var t=Math.floor(r/10), o=r%10; if(t) parts.push(tens[t]); if(o) parts.push((fem?onesFem:ones)[o]); } if(parts.length===0) return ''; if(parts.length===1) return parts[0]; return parts.slice(0,-1).join(' ')+' и '+parts[parts.length-1]; } function numToWords(n){ n=Math.floor(n); if(n===0) return 'нула'; var parts=[]; var millions=Math.floor(n/1000000); var thousands=Math.floor((n%1000000)/1000); var rest=n%1000; if(millions) parts.push(threeDigits(millions,false)+' '+(millions===1?'милион':'милиона')); if(thousands) parts.push(thousands===1?'хиляда':threeDigits(thousands,true)+' хиляди'); if(rest) parts.push(threeDigits(rest,false)); return parts.join(' '); } function amountWords(total,currency){ var whole=Math.floor(total); var cents=Math.round((total-whole)*100); var curWhole = currency==='BGN' ? (whole===1?'лев':'лева') : (whole===1?'евро':'евро'); var curCents = currency==='BGN' ? 'стотинки' : 'цента'; var w=numToWords(whole); w=w.charAt(0).toUpperCase()+w.slice(1); var out=w+' '+curWhole; if(cents>0) out+=' и '+numToWords(cents)+' '+curCents; return out; } function fmtDate(s){ if(!s)return '—'; var d=new Date(s+'T00:00:00'); return String(d.getDate()).padStart(2,'0')+'.'+String(d.getMonth()+1).padStart(2,'0')+'.'+d.getFullYear(); } function money(n,cur){ return (parseFloat(n||0)).toFixed(2)+' '+(cur||'EUR'); } async function load(){ try{ var r=await fetch(API+'?action=document_full&id='+encodeURIComponent(docId)); var j=await r.json(); if(!j.ok){ document.getElementById('page').innerHTML='<div style="padding:40px">Документът не е намерен.</div>'; return; } render(j.data.document, j.data.company); }catch(e){ document.getElementById('page').innerHTML='<div style="padding:40px">Грешка при зареждане.</div>'; } } function render(d,comp){ comp=comp||{}; var snap=d.client_snapshot||{}; var items=d.items||[]; var label=TYPE_LABEL[d.type]||'Документ'; var symbol = d.currency==='BGN' ? 'лв.' : '€'; var html=''; html+='<div class="head"><div class="logo">WEBTRIXIA</div>'; html+='<div class="supplier"><div style="font-size:10px;letter-spacing:.15em;text-transform:uppercase;color:#aaa">Доставчик</div>'; html+='<b>'+(comp.name||'')+'</b><br>'+(comp.address||'')+'<br>'+(comp.city||'')+'<br>'+(comp.country||'България')+ '<br>ЕИК/Булстат: '+(comp.eik||'')+'<br>ДДС №: '+(comp.vat_number||'')+'<br>МОЛ: '+(comp.mol||'')+'</div></div>'; html+='<div class="badge-row"><div class="orig">ОРИГИНАЛ</div>'; html+='<div class="recipient"><div style="font-size:10px;letter-spacing:.15em;text-transform:uppercase;color:#aaa">Получател</div>'; html+='<b>'+(snap.company||snap.name||'—')+'</b><br>'+(snap.address||'')+'<br>'+(snap.city||'')+ '<br>ЕИК/Булстат: '+(snap.eik||'—')+(snap.vat_number?'<br>ДДС №: '+snap.vat_number:'')+(snap.mol?'<br>МОЛ: '+snap.mol:'')+'</div></div>'; html+='<div class="titlebar"><div class="tt"><div class="lbl">'+label+'</div><div class="num">№ '+d.full_number+'</div>'+ '<div class="dates">Дата на издаване: <b>'+fmtDate(d.issue_date)+'</b><br>Данъчно събитие: <b>'+fmtDate(d.tax_date)+'</b>'+ (d.due_date?'<br>Падеж: <b>'+fmtDate(d.due_date)+'</b>':'')+'</div></div>'; html+='<div class="amountbox"><div style="font-size:10px;letter-spacing:.1em;opacity:.85">ОБЩО ЗА ПЛАЩАНЕ</div><div class="big">'+ parseFloat(d.total||0).toFixed(2)+' '+symbol+'</div></div></div>'; html+='<div class="itembox"><table class="items"><thead><tr><th>Артикул</th><th>Кол.</th><th>Мярка</th><th>Ед. цена</th><th>Стойност</th></tr></thead><tbody>'; items.forEach((it,i)=>{ var line=(parseFloat(it.qty||0)*parseFloat(it.price||0)); html+='<tr><td>'+(i+1)+'. '+(it.name||'')+'</td><td>'+parseFloat(it.qty||0).toFixed(2)+'</td><td>'+(it.unit||'бр.')+ '</td><td>'+money(it.price,d.currency)+'</td><td>'+money(line,d.currency)+'</td></tr>'; }); html+='</tbody></table></div>'; html+='<div class="bottom"><div class="pay">'; html+='<div class="words"><b>Словом:</b><br>'+amountWords(d.total,d.currency)+'</div>'; html+='<div style="margin-top:14px"><b>Начин на плащане:</b> по банков път<br>Банка: '+(comp.bank_name||'')+ '<br>IBAN: '+(comp.iban||'')+'<br>BIC/SWIFT: '+(comp.bic||'')+'</div>'; if(d.notes) html+='<div style="margin-top:14px"><b>Бележки:</b><br>'+d.notes+'</div>'; html+='</div>'; html+='<div class="totals">Данъчна основа: '+money(d.subtotal,d.currency)+'<br>Процент ДДС: '+parseFloat(d.vat_percent||0)+'%<br>'+ 'Начислен ДДС: '+money(d.vat_amount,d.currency)+'<br><span class="grand">Сума за плащане: '+money(d.total,d.currency)+'</span></div>'; html+='</div>'; html+='<div class="sign"><div>Получател: '+(snap.mol||'________________')+'</div><div>Съставил: '+(comp.mol||'________________')+'</div></div>'; document.getElementById('page').innerHTML=html; document.title=label+' № '+d.full_number+' — Webtrixia'; } load(); </script> </body> </html>
| ver. 1.4 |
Github
|
.
| PHP 8.2.31 | Generation time: 0 |
proxy
|
phpinfo
|
Settings