Files
app/dist/assets/InvoiceCreate-C7cM8-ZE.js
Simon 308941449e fix: tabulka roli a bank. uctu - admin-table-wrapper -> admin-table-responsive
- Settings.jsx: pridany admin-card-body + admin-table-responsive
- CompanySettings.jsx: admin-table-wrapper -> admin-table-responsive
- zadny admin-table-wrapper v JSX nezbyva

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 11:29:10 +01:00

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 ye,u as fe,F as _,A as G,g as P,c as w,_ as xe}from"./index-CnEy_BDh.js";import{j as e,m as O}from"./vendor-animation-0s3FMHwK.js";import{g as be,i as je,r,L as ve}from"./vendor-react-BVs3cwbi.js";import{F as ke}from"./Forbidden-D25jV3Oq.js";import{u as ge,a as L,b as Ne,D as we,r as Se,c as Ce,S as De,v as Ae,d as Ie,e as Pe,K as Oe,T as Ee,P as ze}from"./useSortableList-CgbuKaxB.js";import"./vendor-utils-Dyr8OjFr.js";const Te=r.lazy(()=>xe(()=>import("./RichEditor-Bfur5pi6.js"),__vite__mapDeps([0,1,2,3]))),S="/api/admin",Re=[{value:21,label:"21%"},{value:12,label:"12%"},{value:0,label:"0%"}];let Z=0;const Q=()=>({_key:`inv-${++Z}`,description:"",quantity:1,unit:"ks",unit_price:0,vat_rate:21});function Me(){const X=be(),[ee]=je(),C=ye(),{hasPermission:te,user:ae}=fe(),E=ee.get("fromOrder"),y=E&&/^\d+$/.test(E)?E:null,[i,d]=r.useState({customer_id:null,customer_name:"",order_id:y?Number(y):null,issue_date:new Date().toISOString().split("T")[0],due_date:new Date(Date.now()+14*864e5).toISOString().split("T")[0],tax_date:new Date().toISOString().split("T")[0],currency:"CZK",apply_vat:1,vat_rate:21,payment_method:"Příkazem",constant_symbol:"0308",issued_by:ae?.fullName||"",notes:"",bank_account_id:"",bank_name:"",bank_swift:"",bank_iban:"",bank_account:""}),[q,se]=r.useState([]),[j,H]=r.useState(14),[u,f]=r.useState([Q()]),[x,v]=r.useState({}),[B,M]=r.useState(!1),[ne,ie]=r.useState(!0),[D,K]=r.useState(""),[z,re]=r.useState([]),[k,V]=r.useState(""),[T,A]=r.useState(!1),g="boha_invoice_draft",I=!y,[R,F]=r.useState(null),U=r.useRef({form:i,items:u,dueDays:14}),oe=r.useRef(!1);r.useEffect(()=>{if(I)try{const t=localStorage.getItem(g);if(!t)return;const a=JSON.parse(t);if(!a||typeof a!="object"||!a.form||!Array.isArray(a.items)){localStorage.removeItem(g);return}const{form:n,items:o,savedAt:c}=a;d(s=>({...s,customer_id:n.customer_id??s.customer_id,customer_name:n.customer_name??s.customer_name,currency:n.currency??s.currency,apply_vat:n.apply_vat??s.apply_vat,payment_method:n.payment_method??s.payment_method,constant_symbol:n.constant_symbol??s.constant_symbol,issued_by:s.issued_by,notes:n.notes??s.notes,issue_date:n.issue_date??s.issue_date,due_date:n.due_date??s.due_date,tax_date:n.tax_date??s.tax_date,bank_account_id:n.bank_account_id??s.bank_account_id,bank_name:n.bank_name??s.bank_name,bank_swift:n.bank_swift??s.bank_swift,bank_iban:n.bank_iban??s.bank_iban,bank_account:n.bank_account??s.bank_account})),o.length>0&&f(o.map(s=>({...s,_key:s._key||`inv-${++Z}`}))),a.due_days&&H(Number(a.due_days)),oe.current=!0,c&&F(new Date(c))}catch{try{localStorage.removeItem(g)}catch{}}},[I]),r.useEffect(()=>{U.current={form:i,items:u,dueDays:j}},[i,u,j]),r.useEffect(()=>{if(!I)return;const t=setTimeout(()=>{try{const{form:a,items:n,dueDays:o}=U.current,{bank_name:c,bank_swift:s,bank_iban:l,bank_account:h,...p}=a,m=new Date().toISOString();localStorage.setItem(g,JSON.stringify({form:p,items:n,due_days:o,savedAt:m})),F(new Date(m))}catch{}},500);return()=>clearTimeout(t)},[i,u,I]);const ce=r.useCallback(()=>{try{localStorage.removeItem(g)}catch{}F(null)},[]),J=r.useMemo(()=>R?R.toLocaleTimeString("cs-CZ",{hour:"2-digit",minute:"2-digit"}):null,[R]);r.useEffect(()=>{(async()=>{try{const a=[w(`${S}/invoices.php?action=next_number`),w(`${S}/customers.php`),w(`${S}/bank-accounts.php`)];y&&a.push(w(`${S}/invoices.php?action=order_data&id=${y}`));const n=await Promise.all(a),o=n[0];if(o.ok){const l=await o.json();l.success&&K(l.data.number)}const c=n[1];if(c.ok){const l=await c.json();l.success&&re(l.data.customers)}const s=n[2];if(s.ok){const l=await s.json();if(l.success&&Array.isArray(l.data)){se(l.data);const h=l.data.find(p=>p.is_default);d(p=>{const m=p.bank_account_id,b=(m?l.data.find(_e=>String(_e.id)===String(m)):null)||h;return b?{...p,bank_account_id:b.id,bank_name:b.bank_name||"",bank_swift:b.bic||"",bank_iban:b.iban||"",bank_account:b.account_number||""}:p})}}if(y&&n[3]?.ok){const l=await n[3].json();if(l.success){const h=l.data,p=Number(h.vat_rate)||21;d(m=>({...m,customer_id:h.customer_id,customer_name:h.customer_name||"",order_id:h.id,currency:h.currency||"CZK",apply_vat:Number(h.apply_vat)||0,vat_rate:p})),h.items?.length>0&&f(h.items.map(m=>({_key:`inv-${++Z}`,description:m.description||"",quantity:Number(m.quantity)||1,unit:m.unit||"",unit_price:Number(m.unit_price)||0,vat_rate:p})))}}}catch{C.error("Chyba při načítání dat")}finally{ie(!1)}})()},[y]),r.useEffect(()=>{if(!i.issue_date)return;const t=new Date(i.issue_date);t.setDate(t.getDate()+j),d(a=>({...a,due_date:t.toISOString().split("T")[0]}))},[i.issue_date,j]);const W=r.useMemo(()=>{if(!k)return z;const t=k.toLowerCase();return z.filter(a=>(a.name||"").toLowerCase().includes(t)||(a.company_id||"").includes(k)||(a.city||"").toLowerCase().includes(t))},[z,k]);r.useEffect(()=>{const t=()=>A(!1);if(T)return document.addEventListener("click",t),()=>document.removeEventListener("click",t)},[T]);const le=t=>{const a=q.find(n=>n.id===Number(t));d(a?n=>({...n,bank_account_id:a.id,bank_name:a.bank_name||"",bank_swift:a.bic||"",bank_iban:a.iban||"",bank_account:a.account_number||""}):n=>({...n,bank_account_id:"",bank_name:"",bank_swift:"",bank_iban:"",bank_account:""}))},de=t=>{d(a=>({...a,customer_id:t.id,customer_name:t.name})),v(a=>({...a,customer_id:void 0})),V(""),A(!1)},N=(t,a,n)=>{f(o=>o.map((c,s)=>s===t?{...c,[a]:n}:c))},ue=()=>f(t=>[...t,Q()]),me=t=>{u.length<=1||f(a=>a.filter((n,o)=>o!==t))},he=ge(L(ze,{activationConstraint:{distance:5}}),L(Ee,{activationConstraint:{delay:200,tolerance:5}}),L(Oe)),{handleDragEnd:pe}=Ne(f,"_key"),$=r.useMemo(()=>{let t=0;const a={};u.forEach(o=>{const c=(Number(o.quantity)||0)*(Number(o.unit_price)||0);if(t+=c,i.apply_vat){const s=Number(o.vat_rate)||0;a[s]||(a[s]=0),a[s]+=c*s/100}});const n=Object.values(a).reduce((o,c)=>o+c,0);return{subtotal:t,vatByRate:a,totalVat:n,total:t+n}},[u,i.apply_vat]),Y=async t=>{t.preventDefault();const a={};if(i.customer_id||(a.customer_id="Vyberte zákazníka"),i.issue_date||(a.issue_date="Zadejte datum"),i.tax_date||(a.tax_date="Zadejte datum"),i.bank_account_id||(a.bank_account_id="Vyberte bankovní účet"),(u.length===0||u.every(n=>!n.description.trim()))&&(a.items="Přidejte alespoň jednu položku"),v(a),!(Object.keys(a).length>0)){M(!0);try{const o=await(await w(`${S}/invoices.php`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...i,invoice_number:D,items:u.filter(c=>c.description.trim()).map((c,s)=>({...c,position:s}))})})).json();o.success?(ce(),C.success(o.message||"Faktura byla vytvořena"),X(`/invoices/${o.data.invoice_id}`)):C.error(o.error||"Nepodařilo se vytvořit fakturu")}catch{C.error("Chyba připojení")}finally{M(!1)}}};return te("invoices.create")?ne?e.jsxs("div",{className:"admin-skeleton",style:{padding:0,gap:"1.5rem"},children:[e.jsx("div",{className:"admin-skeleton-row",style:{justifyContent:"space-between"},children:e.jsx("div",{className:"admin-skeleton-line h-8",style:{width:"200px"}})}),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.jsxs("div",{children:[e.jsxs(O.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(ve,{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.jsxs("div",{children:[e.jsxs("h1",{className:"admin-page-title",children:["Nová faktura ",D&&e.jsxs("span",{className:"text-tertiary",children:["(",D,")"]})]}),y?e.jsx("p",{className:"admin-page-subtitle",children:"Z objednávky"}):J&&e.jsxs("div",{className:"offers-draft-indicator",children:[e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",children:e.jsx("polyline",{points:"20 6 9 17 4 12"})}),"Koncept uložen ",J]})]})]}),e.jsx("div",{className:"admin-page-actions",children:e.jsx("button",{onClick:Y,className:"admin-btn admin-btn-primary",disabled:B,children:B?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"admin-spinner admin-spinner-sm"}),"Ukládání..."]}):"Uložit"})})]}),e.jsxs("form",{onSubmit:Y,children:[e.jsxs(O.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:"Základní údaje"}),e.jsxs("div",{className:"admin-form",children:[e.jsxs("div",{className:"offers-form-row-3",children:[e.jsx(_,{label:"Číslo faktury",children:e.jsx("input",{type:"text",value:D,onChange:t=>K(t.target.value),className:"admin-form-input"})}),e.jsx(_,{label:"Odběratel",error:x.customer_id,required:!0,children:i.customer_id?e.jsxs("div",{className:"offers-customer-selected",children:[e.jsx("span",{children:i.customer_name}),e.jsx("button",{type:"button",onClick:()=>d(t=>({...t,customer_id:null,customer_name:""})),className:"admin-btn-icon",title:"Odebrat zákazníka",children:e.jsxs("svg",{width:"14",height:"14",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"})]})})]}):e.jsxs("div",{className:"offers-customer-select",onClick:t=>t.stopPropagation(),children:[e.jsx("input",{type:"text",value:k,onChange:t=>{V(t.target.value),A(!0)},onFocus:()=>A(!0),className:"admin-form-input",placeholder:"Hledat zákazníka (název, IČ, město)...",autoComplete:"off"}),T&&e.jsx("div",{className:"offers-customer-dropdown",children:W.length===0?e.jsx("div",{className:"offers-customer-dropdown-empty",children:"Žádní zákazníci"}):W.slice(0,10).map(t=>e.jsxs("div",{className:"offers-customer-dropdown-item",onMouseDown:()=>de(t),children:[e.jsx("div",{children:t.name}),(t.company_id||t.city)&&e.jsxs("div",{children:[t.company_id&&`IČ: ${t.company_id}`,t.city&&` · ${t.city}`]})]},t.id))})]})}),e.jsx(_,{label:"Vystavil",children:e.jsx("input",{type:"text",value:i.issued_by,className:"admin-form-input",readOnly:!0,style:{backgroundColor:"var(--bg-secondary)",cursor:"default"}})})]}),e.jsxs("div",{className:"admin-form-row",children:[e.jsx(_,{label:"Datum vystavení",error:x.issue_date,required:!0,children:e.jsx(G,{mode:"date",value:i.issue_date,onChange:t=>{d(a=>({...a,issue_date:t})),v(a=>({...a,issue_date:void 0}))}})}),e.jsxs(_,{label:"Splatnost (dny)",children:[e.jsx("select",{value:j,onChange:t=>H(Number(t.target.value)),className:"admin-form-select",children:Array.from({length:60},(t,a)=>a+1).map(t=>e.jsx("option",{value:t,children:t},t))}),i.due_date&&e.jsxs("span",{className:"text-tertiary",style:{fontSize:"0.75rem",marginTop:"0.25rem"},children:["Splatnost: ",new Date(i.due_date).toLocaleDateString("cs-CZ")]})]}),e.jsx(_,{label:"DÚZP",error:x.tax_date,required:!0,children:e.jsx(G,{mode:"date",value:i.tax_date,onChange:t=>{d(a=>({...a,tax_date:t})),v(a=>({...a,tax_date:void 0}))}})})]}),e.jsxs("div",{className:"offers-form-row-3",children:[e.jsx(_,{label:"Forma úhrady",children:e.jsxs("select",{value:i.payment_method,onChange:t=>d(a=>({...a,payment_method:t.target.value})),className:"admin-form-select",children:[e.jsx("option",{value:"Příkazem",children:"Příkazem"}),e.jsx("option",{value:"Hotově",children:"Hotově"}),e.jsx("option",{value:"Dobírka",children:"Dobírka"})]})}),e.jsx(_,{label:"Měna",children:e.jsxs("select",{value:i.currency,onChange:t=>d(a=>({...a,currency:t.target.value})),className:"admin-form-select",children:[e.jsx("option",{value:"CZK",children:"CZK (Kč)"}),e.jsx("option",{value:"EUR",children:"EUR (€)"}),e.jsx("option",{value:"USD",children:"USD ($)"})]})}),e.jsx(_,{label:"DPH",children:e.jsx("div",{className:"flex-row-gap",children:e.jsxs("label",{className:"admin-form-checkbox",style:{whiteSpace:"nowrap"},children:[e.jsx("input",{type:"checkbox",checked:!!i.apply_vat,onChange:t=>d(a=>({...a,apply_vat:t.target.checked?1:0}))}),e.jsx("span",{children:"Uplatnit DPH"})]})})})]}),e.jsx(_,{label:"Bankovní účet",error:x.bank_account_id,required:!0,children:e.jsxs("select",{value:i.bank_account_id,onChange:t=>{le(t.target.value),v(a=>({...a,bank_account_id:void 0}))},className:"admin-form-select",children:[e.jsx("option",{value:"",children:"— Vyberte účet —"}),q.map(t=>e.jsxs("option",{value:t.id,children:[t.account_name,t.account_number?` (${t.account_number})`:"",t.is_default?" ★":""]},t.id))]})})]})]}),e.jsxs(O.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.jsxs("div",{children:[e.jsx("h3",{className:"admin-card-title",style:{margin:0},children:"Položky"}),x.items&&e.jsx("span",{className:"admin-form-error",children:x.items})]}),e.jsx("button",{type:"button",onClick:ue,className:"admin-btn admin-btn-primary admin-btn-sm",children:"+ Přidat položku"})]}),e.jsx("div",{className:"offers-items-table",children:e.jsx(we,{sensors:he,collisionDetection:Ce,modifiers:[Se],onDragEnd:pe,children:e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{style:{width:"2rem"}}),e.jsx("th",{style:{width:"2rem",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"}),i.apply_vat?e.jsx("th",{style:{width:"5rem",textAlign:"center"},children:"DPH"}):null,e.jsx("th",{style:{width:"8rem",textAlign:"right"},children:"Celkem"}),e.jsx("th",{style:{width:"2.5rem"}})]})}),e.jsx(De,{items:u.map(t=>String(t._key)),strategy:Ae,children:e.jsx("tbody",{children:u.map((t,a)=>{const n=(Number(t.quantity)||0)*(Number(t.unit_price)||0);return e.jsx(Ie,{id:String(t._key),children:({attributes:o,listeners:c})=>e.jsxs(e.Fragment,{children:[e.jsx("td",{style:{width:"2rem"},children:e.jsx(Pe,{listeners:c,attributes:o})}),e.jsx("td",{className:"text-tertiary text-center fw-500",children:a+1}),e.jsx("td",{children:e.jsx("input",{type:"text",value:t.description,onChange:s=>N(a,"description",s.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:s=>N(a,"quantity",s.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:s=>N(a,"unit",s.target.value),className:"admin-form-input",placeholder:"ks",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:s=>N(a,"unit_price",s.target.value),className:"admin-form-input",step:"any",style:{textAlign:"right",height:"2.25rem",padding:"0.375rem 0.5rem"}})}),i.apply_vat?e.jsx("td",{children:e.jsx("select",{value:t.vat_rate,onChange:s=>N(a,"vat_rate",Number(s.target.value)),className:"admin-form-input",style:{textAlign:"center",height:"2.25rem",padding:"0.375rem 0.5rem"},children:Re.map(s=>e.jsx("option",{value:s.value,children:s.label},s.value))})}):null,e.jsx("td",{style:{textAlign:"right",fontWeight:600,whiteSpace:"nowrap"},children:P(n,i.currency)}),e.jsx("td",{children:u.length>1&&e.jsx("button",{type:"button",onClick:()=>me(a),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.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:P($.subtotal,i.currency)})]}),i.apply_vat&&Object.entries($.vatByRate).map(([t,a])=>e.jsxs("div",{className:"offers-totals-row",children:[e.jsxs("span",{children:["DPH ",t,"%:"]}),e.jsx("span",{children:P(a,i.currency)})]},t)),e.jsxs("div",{className:"offers-totals-row offers-totals-total",children:[e.jsx("span",{children:"Celkem k úhradě:"}),e.jsx("span",{children:P($.total,i.currency)})]})]})]}),e.jsxs(O.div,{className:"offers-editor-section",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.4,delay:.25},children:[e.jsx("h3",{className:"admin-card-title",children:"Veřejné poznámky na faktuře"}),e.jsx(r.Suspense,{fallback:e.jsx("div",{className:"admin-form-input",style:{minHeight:120}}),children:e.jsx(Te,{value:i.notes,onChange:t=>d(a=>({...a,notes:t})),placeholder:"Poznámky zobrazené na faktuře...",minHeight:"120px"})})]})]})]}):e.jsx(ke,{})}export{Me as default};