3 lines
17 KiB
JavaScript
3 lines
17 KiB
JavaScript
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/RichEditor-Bfur5pi6.js","assets/vendor-animation-0s3FMHwK.js","assets/vendor-react-BVs3cwbi.js","assets/RichEditor-7oN3-GhD.css"])))=>i.map(i=>d[i]);
|
|
import{a as re,u as le,F as d,e as w,g as f,C as U,c as x,_ as de}from"./index-fMsy8JiX.js";import{j as e,m as y,A as oe}from"./vendor-animation-0s3FMHwK.js";import{h as ce,g as me,r as i,L as B}from"./vendor-react-BVs3cwbi.js";import{F as he}from"./Forbidden-D25jV3Oq.js";import{a9 as ue}from"./vendor-utils-Dyr8OjFr.js";const pe=i.lazy(()=>de(()=>import("./RichEditor-Bfur5pi6.js"),__vite__mapDeps([0,1,2,3]))),j="/api/admin",W={issued:"Vystavena",paid:"Zaplacena",overdue:"Po splatnosti"},xe={issued:"admin-badge-invoice-issued",paid:"admin-badge-invoice-paid",overdue:"admin-badge-invoice-overdue"},Z={paid:"Zaplaceno"},ye={paid:"admin-btn admin-btn-primary"},je=[{value:21,label:"21%"},{value:12,label:"12%"},{value:0,label:"0%"}];function ke(){const{id:c}=ce(),r=re(),{hasPermission:h}=le(),_=me(),[q,H]=i.useState(!0),[a,J]=i.useState(null),[o,I]=i.useState(""),[b,g]=i.useState(!1),[$,D]=i.useState(null),[u,C]=i.useState({show:!1,status:null}),[F,O]=i.useState(!1),[K,S]=i.useState(!1),[G,A]=i.useState(!1),[Q,L]=i.useState(!1),[M,P]=i.useState(!1),[N,k]=i.useState([]),R=i.useRef(0),z=async()=>{try{const t=await x(`${j}/invoices.php?action=detail&id=${c}`);if(t.status===401)return;const s=await t.json();s.success?(J(s.data),I(s.data.notes||"")):(r.error(s.error||"Nepodařilo se načíst fakturu"),_("/invoices"))}catch{r.error("Chyba připojení"),_("/invoices")}finally{H(!1)}};i.useEffect(()=>{z()},[c]);const T=i.useMemo(()=>{if(!a?.items)return{subtotal:0,vatByRate:{},totalVat:0,total:0};let t=0;const s={};a.items.forEach(l=>{const m=(Number(l.quantity)||0)*(Number(l.unit_price)||0);if(t+=m,Number(a.apply_vat)){const p=Number(l.vat_rate)||0;s[p]||(s[p]=0),s[p]+=m*p/100}});const n=Object.values(s).reduce((l,m)=>l+m,0);return{subtotal:t,vatByRate:s,totalVat:n,total:t+n}},[a]);if(!h("invoices.view"))return e.jsx(he,{});const X=async()=>{if(u.status){D(u.status),C({show:!1,status:null});try{const s=await(await x(`${j}/invoices.php?id=${c}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({status:u.status})})).json();s.success?(r.success(s.message||"Stav byl změněn"),z()):r.error(s.error||"Nepodařilo se změnit stav")}catch{r.error("Chyba připojení")}finally{D(null)}}},Y=async()=>{g(!0);try{const s=await(await x(`${j}/invoices.php?id=${c}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({notes:o})})).json();s.success?r.success("Poznámky byly uloženy"):r.error(s.error||"Nepodařilo se uložit poznámky")}catch{r.error("Chyba připojení")}finally{g(!1)}},V=async(t="cs")=>{S(!1);const s=window.open("","_blank");O(!0);try{const n=await x(`${j}/invoices-pdf.php?id=${c}&lang=${encodeURIComponent(t)}`);if(!n.ok){s.close(),r.error("Nepodařilo se vygenerovat PDF");return}const l=await n.text();s.document.open(),s.document.write(l),s.document.close(),s.onload=()=>s.print()}catch{s.close(),r.error("Chyba připojení")}finally{O(!1)}},ee=()=>{k(a.items.map(t=>({_key:`ei-${++R.current}`,description:t.description||"",quantity:Number(t.quantity)||1,unit:t.unit||"",unit_price:Number(t.unit_price)||0,vat_rate:Number(t.vat_rate)||21}))),P(!0)},v=(t,s,n)=>{k(l=>l.map((m,p)=>p===t?{...m,[s]:n}:m))},te=()=>{k(t=>[...t,{_key:`ei-${++R.current}`,description:"",quantity:1,unit:"ks",unit_price:0,vat_rate:21}])},se=t=>{N.length<=1||k(s=>s.filter((n,l)=>l!==t))},ae=async()=>{g(!0);try{const s=await(await x(`${j}/invoices.php?id=${c}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({items:N.filter(n=>n.description.trim()).map((n,l)=>({...n,position:l}))})})).json();s.success?(r.success("Položky byly uloženy"),P(!1),z()):r.error(s.error||"Nepodařilo se uložit položky")}catch{r.error("Chyba připojení")}finally{g(!1)}},ne=async()=>{L(!0);try{const s=await(await x(`${j}/invoices.php?id=${c}`,{method:"DELETE"})).json();s.success?(r.success(s.message||"Faktura byla smazána"),_("/invoices")):r.error(s.error||"Nepodařilo se smazat fakturu")}catch{r.error("Chyba připojení")}finally{L(!1),A(!1)}};if(q)return e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsxs("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:[e.jsxs("div",{className:"flex-row-gap",children:[e.jsx("div",{className:"admin-skeleton-line",style:{width:"32px",height:"32px",borderRadius:"8px"}}),e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px"}})]}),e.jsxs("div",{className:"admin-skeleton-row gap-2",children:[e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100px",borderRadius:"8px"}}),e.jsx("div",{className:"admin-skeleton-line h-10",style:{width:"100px",borderRadius:"8px"}})]})]}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2,3].map(t=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"admin-skeleton-line w-1/4"}),e.jsx("div",{className:"admin-skeleton-line w-1/2"})]},t))})}),e.jsx("div",{className:"admin-card",children:e.jsx("div",{className:"admin-skeleton",style:{gap:"1.25rem"},children:[0,1,2].map(t=>e.jsxs("div",{className:"admin-skeleton-row",children:[e.jsx("div",{className:"flex-1",children:e.jsx("div",{className:"admin-skeleton-line w-full"})}),e.jsx("div",{className:"flex-1",children:e.jsx("div",{className:"admin-skeleton-line w-3/4"})}),e.jsx("div",{className:"flex-1",children:e.jsx("div",{className:"admin-skeleton-line w-1/2"})})]},t))})})]});if(!a)return null;const ie=a.status==="issued",E=a.status==="paid";return e.jsxs("div",{children:[e.jsxs(y.div,{className:"admin-page-header",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4},children:[e.jsxs("div",{className:"flex-row gap-4",children:[e.jsx(B,{to:"/invoices",className:"admin-btn-icon",title:"Zpět","aria-label":"Zpět",children:e.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:e.jsx("path",{d:"M19 12H5M12 19l-7-7 7-7"})})}),e.jsx("div",{children:e.jsxs("h1",{className:"admin-page-title flex-row-gap",children:["Faktura ",a.invoice_number,e.jsx("span",{className:`admin-badge ${xe[a.status]||""}`,children:W[a.status]||a.status})]})})]}),e.jsxs("div",{className:"admin-page-actions",children:[h("invoices.export")&&e.jsx("button",{onClick:()=>S(!0),className:"admin-btn admin-btn-secondary",disabled:F,children:F?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"PDF..."]}):e.jsxs(e.Fragment,{children:[e.jsxs("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),e.jsx("polyline",{points:"14 2 14 8 20 8"})]}),"PDF"]})}),h("invoices.edit")&&a.valid_transitions?.length>0&&a.valid_transitions.map(t=>e.jsx("button",{onClick:()=>C({show:!0,status:t}),className:ye[t]||"admin-btn admin-btn-secondary",disabled:$===t,children:$===t?e.jsx("div",{className:"admin-spinner",style:{width:14,height:14,borderWidth:2}}):Z[t]||t},t)),h("invoices.delete")&&e.jsx("button",{onClick:()=>A(!0),className:"admin-btn admin-btn-primary",children:"Smazat"})]})]}),e.jsxs(y.div,{className:"offers-editor-section",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.1},children:[e.jsx("h3",{className:"admin-card-title",children:"Informace"}),e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"offers-form-row-3 mb-2",children:[e.jsxs(d,{label:"Zákazník",children:[e.jsx("div",{className:"fw-500",children:a.customer_name||"—"}),a.customer&&e.jsxs("div",{className:"text-tertiary",style:{fontSize:"0.8rem",marginTop:"0.2rem"},children:[a.customer.company_id&&`IČ: ${a.customer.company_id}`,a.customer.vat_id&&` · DIČ: ${a.customer.vat_id}`]})]}),e.jsx(d,{label:"Objednávka",children:e.jsx("div",{children:a.order_id?e.jsx(B,{to:`/orders/${a.order_id}`,className:"link-accent",children:a.order_number}):"—"})}),e.jsx(d,{label:"Měna",children:e.jsx("div",{children:a.currency})})]}),e.jsxs("div",{className:"offers-form-row-3 mb-2",children:[e.jsx(d,{label:"Datum vystavení",children:e.jsx("div",{children:w(a.issue_date)})}),e.jsx(d,{label:"Datum splatnosti",children:e.jsx("div",{className:a.status==="overdue"?"text-danger fw-600":"",children:w(a.due_date)})}),e.jsx(d,{label:"DÚZP",children:e.jsx("div",{children:w(a.tax_date)})})]}),e.jsxs("div",{className:"offers-form-row-3",children:[e.jsx(d,{label:"Forma úhrady",children:e.jsx("div",{children:a.payment_method})}),e.jsx(d,{label:"Variabilní symbol",children:e.jsx("div",{children:a.invoice_number})}),e.jsx(d,{label:"Vystavil",children:e.jsx("div",{children:a.issued_by||"—"})})]}),a.paid_date&&e.jsx("div",{className:"admin-form-row mt-2",children:e.jsx(d,{label:"Datum úhrady",children:e.jsx("div",{style:{color:"var(--success)",fontWeight:500},children:w(a.paid_date)})})})]})]}),e.jsxs(y.div,{className:"offers-editor-section",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.2},children:[e.jsxs("div",{className:"flex-between mb-4",children:[e.jsx("h3",{className:"admin-card-title",style:{margin:0},children:"Položky"}),ie&&h("invoices.edit")&&(M?e.jsxs("div",{className:"flex-row gap-2",children:[e.jsx("button",{type:"button",onClick:te,className:"admin-btn admin-btn-secondary admin-btn-sm",children:"+ Přidat položku"}),e.jsx("button",{onClick:ae,className:"admin-btn admin-btn-primary admin-btn-sm",disabled:b,children:b?"Ukládání...":"Uložit položky"}),e.jsx("button",{onClick:()=>P(!1),className:"admin-btn admin-btn-secondary admin-btn-sm",children:"Zrušit"})]}):e.jsx("button",{onClick:ee,className:"admin-btn admin-btn-secondary admin-btn-sm",children:"Upravit položky"}))]}),M?e.jsx(e.Fragment,{children:e.jsx("div",{className:"offers-items-table",children:e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{style:{width:"2.5rem",textAlign:"center"},children:"#"}),e.jsx("th",{children:"Popis"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Množství"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Jednotka"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Jedn. cena"}),e.jsx("th",{style:{width:"5rem",textAlign:"center"},children:"%DPH"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"}})]})}),e.jsx("tbody",{children:N.map((t,s)=>e.jsxs("tr",{children:[e.jsx("td",{className:"text-tertiary",style:{textAlign:"center",fontWeight:500},children:s+1}),e.jsx("td",{children:e.jsx("input",{type:"text",value:t.description,onChange:n=>v(s,"description",n.target.value),className:"admin-form-input fw-500",placeholder:"Popis položky..."})}),e.jsx("td",{children:e.jsx("input",{type:"number",value:t.quantity,onChange:n=>v(s,"quantity",n.target.value),className:"admin-form-input",min:"0",step:"any",style:{textAlign:"center",height:"2.25rem",padding:"0.375rem 0.5rem"}})}),e.jsx("td",{children:e.jsx("input",{type:"text",value:t.unit,onChange:n=>v(s,"unit",n.target.value),className:"admin-form-input",style:{textAlign:"center",height:"2.25rem",padding:"0.375rem 0.5rem"}})}),e.jsx("td",{children:e.jsx("input",{type:"number",value:t.unit_price,onChange:n=>v(s,"unit_price",n.target.value),className:"admin-form-input",step:"any",style:{textAlign:"right",height:"2.25rem",padding:"0.375rem 0.5rem"}})}),e.jsx("td",{children:Number(a.apply_vat)?e.jsx("select",{value:t.vat_rate,onChange:n=>v(s,"vat_rate",Number(n.target.value)),className:"admin-form-input",style:{textAlign:"center",height:"2.25rem",padding:"0.375rem 0.5rem"},children:je.map(n=>e.jsx("option",{value:n.value,children:n.label},n.value))}):e.jsx("span",{className:"text-tertiary",style:{display:"block",textAlign:"center"},children:"0%"})}),e.jsx("td",{children:e.jsx("div",{style:{display:"flex",gap:"0.125rem",justifyContent:"center"},children:N.length>1&&e.jsx("button",{type:"button",onClick:()=>se(s),className:"admin-btn-icon danger",title:"Odebrat","aria-label":"Odebrat",children:e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),e.jsx("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})})})})]},t._key))})]})})}):e.jsx(e.Fragment,{children:a.items?.length>0?e.jsx("div",{className:"offers-items-table",children:e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{style:{width:"2.5rem",textAlign:"center"},children:"#"}),e.jsx("th",{children:"Popis"}),e.jsx("th",{style:{width:"5.5rem",textAlign:"center"},children:"Množství"}),e.jsx("th",{style:{width:"5rem",textAlign:"center"},children:"Jednotka"}),e.jsx("th",{style:{width:"8rem",textAlign:"right"},children:"Jedn. cena"}),e.jsx("th",{style:{width:"4rem",textAlign:"center"},children:"%DPH"}),e.jsx("th",{style:{width:"9rem",textAlign:"right"},children:"Celkem"})]})}),e.jsx("tbody",{children:a.items.map((t,s)=>{const n=(Number(t.quantity)||0)*(Number(t.unit_price)||0),l=Number(a.apply_vat)?n*(Number(t.vat_rate)||0)/100:0;return e.jsxs("tr",{children:[e.jsx("td",{className:"text-tertiary",style:{textAlign:"center",fontWeight:500},children:s+1}),e.jsx("td",{className:"fw-500",children:t.description||"—"}),e.jsxs("td",{style:{textAlign:"center"},children:[t.quantity," ",t.unit&&e.jsx("span",{className:"text-tertiary",children:t.unit})]}),e.jsx("td",{style:{textAlign:"center"},children:t.unit||"—"}),e.jsx("td",{className:"admin-mono text-right",children:f(t.unit_price,a.currency)}),e.jsxs("td",{style:{textAlign:"center"},children:[Number(a.apply_vat)?Number(t.vat_rate):0,"%"]}),e.jsx("td",{className:"admin-mono",style:{textAlign:"right",fontWeight:600},children:f(n+l,a.currency)})]},t.id||s)})})]})}):e.jsx("p",{className:"text-tertiary",children:"Žádné položky."})}),e.jsxs("div",{className:"offers-totals-summary",children:[e.jsxs("div",{className:"offers-totals-row",children:[e.jsx("span",{children:"Mezisoučet:"}),e.jsx("span",{children:f(T.subtotal,a.currency)})]}),Number(a.apply_vat)>0&&Object.entries(T.vatByRate).map(([t,s])=>e.jsxs("div",{className:"offers-totals-row",children:[e.jsxs("span",{children:["DPH ",t,"%:"]}),e.jsx("span",{children:f(s,a.currency)})]},t)),e.jsxs("div",{className:"offers-totals-row offers-totals-total",children:[e.jsx("span",{children:"Celkem k úhradě:"}),e.jsx("span",{children:f(T.total,a.currency)})]})]})]}),e.jsxs(y.div,{className:"offers-editor-section",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.3},children:[e.jsx("h3",{className:"admin-card-title",children:"Veřejné poznámky na faktuře"}),E&&o&&o.trim()&&o!=="<p><br></p>"&&e.jsx("div",{className:"ql-editor",style:{padding:0,minHeight:"auto"},dangerouslySetInnerHTML:{__html:ue.sanitize(o)}}),E&&(!o||!o.trim()||o==="<p><br></p>")&&e.jsx("p",{className:"text-tertiary",children:"Žádné poznámky."}),!E&&e.jsxs(e.Fragment,{children:[e.jsx(i.Suspense,{fallback:e.jsx("div",{className:"admin-form-input",style:{minHeight:120}}),children:e.jsx(pe,{value:o,onChange:t=>I(t),placeholder:"Poznámky zobrazené na faktuře...",minHeight:"120px"})}),h("invoices.edit")&&e.jsx("div",{className:"mt-2",children:e.jsx("button",{onClick:Y,className:"admin-btn admin-btn-secondary admin-btn-sm",disabled:b,children:b?"Ukládání...":"Uložit poznámky"})})]})]}),e.jsx(U,{isOpen:u.show,onClose:()=>C({show:!1,status:null}),onConfirm:X,title:"Změnit stav faktury",message:`Opravdu chcete změnit stav faktury "${a.invoice_number}" na "${W[u.status]}"?`,confirmText:Z[u.status]||"Potvrdit",cancelText:"Zrušit",type:"default"}),e.jsx(U,{isOpen:G,onClose:()=>A(!1),onConfirm:ne,title:"Smazat fakturu",message:`Opravdu chcete smazat fakturu "${a.invoice_number}"? Tato akce je nevratná.`,confirmText:"Smazat",cancelText:"Zrušit",type:"danger",loading:Q}),e.jsx(oe,{children:K&&e.jsxs(y.div,{className:"admin-modal-overlay",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:.2},children:[e.jsx("div",{className:"admin-modal-backdrop",onClick:()=>S(!1)}),e.jsxs(y.div,{className:"admin-modal admin-confirm-modal",role:"dialog","aria-modal":"true",initial:{opacity:0,scale:.95,y:20},animate:{opacity:1,scale:1,y:0},exit:{opacity:0,scale:.95,y:20},transition:{duration:.2},children:[e.jsxs("div",{className:"admin-modal-body admin-confirm-content",children:[e.jsx("div",{className:"admin-confirm-icon admin-confirm-icon-info",children:e.jsxs("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10z"}),e.jsx("path",{d:"M2 12h20"}),e.jsx("path",{d:"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"})]})}),e.jsx("h2",{className:"admin-confirm-title",children:"Jazyk faktury"}),e.jsx("p",{className:"admin-confirm-message",children:"V jakém jazyce chcete vygenerovat fakturu?"})]}),e.jsxs("div",{className:"admin-modal-footer",children:[e.jsx("button",{type:"button",onClick:()=>V("cs"),className:"admin-btn admin-btn-primary",children:"Čeština"}),e.jsx("button",{type:"button",onClick:()=>V("en"),className:"admin-btn admin-btn-primary",children:"English"})]})]})]})})]})}export{ke as default};
|