import {useUiText} from './UiLanguage'; import {useEffect,useRef,useState} from 'react'; import {request,downloadBusinessFile} from './api'; import {Modal} from './FormElements'; type Field={label:string;value:string}; type ArticleTable={columns:{label:string;type:string}[];rows:{id:number;cells:string[]}[]}; type Picture={key:string;name:string}; type Evidence={pricePending?:boolean;summary:Field[];services:{id:number;center:string;name:string;price:number|null}[];serviceTotal:number|null;toll?:number|null;totalWithToll?:number|null;serviceBasis:string;partial:boolean;stations:{label?:string;articles?:ArticleTable;id:number;sequence:number;fields:Field[];signature:string;photos:Picture[];warnings:string[]}[];warnings:string[];canPdf:boolean;revision:string}; type Image={name:string;mime:string;data:string}; const money=(n:number|null|undefined)=>n==null?"–":n.toLocaleString('de-DE',{style:'currency',currency:'EUR'}); function Fields({values}:{values:Field[]}){return
{values.map((f,i)=>
{f.label}
{f.value}
)}
;} export function CustomerOrderEvidence({job}:{job:number}){ const uiText=useUiText(); const base=`/customer-portal/orders/${job}`,[data,setData]=useState(null),[error,setError]=useState(''),[image,setImage]=useState(null),[imageError,setImageError]=useState(''),[busy,setBusy]=useState(false),[pdf,setPdf]=useState(false);const loadingImage=useRef(null); useEffect(()=>{const c=new AbortController();setData(null);setError('');request(base+'/evidence',{signal:c.signal}).then(d=>{if(!c.signal.aborted)setData(d);}).catch(e=>{if(!c.signal.aborted)setError(e.message);});return()=>{c.abort();loadingImage.current?.abort();};},[base]); async function photo(station:number,p:Picture){if(busy)return;const c=new AbortController();loadingImage.current=c;setBusy(true);setImage(null);setImageError('');try{const i=await request(`${base}/stations/${station}/photos/${p.key}`,{signal:c.signal});if(!c.signal.aborted)setImage(i);}catch(e){if(!c.signal.aborted)setImageError((e as Error).message);}finally{if(!c.signal.aborted)setBusy(false);}} return

Auftragsdaten und Abliefernachweise

{error&&

{error}

}{!data&&!error&&

Nachweise werden geladen …

}{data&&<>{data.warnings.map((w,i)=>

{w}

)}

Leistungen · {data.serviceBasis}

{data.services.length?<>
{data.services.map(s=>)}
{uiText("Kostenstelle")}{uiText("Leistung")}{uiText("Betrag")}
{s.center}{s.name}{data.pricePending?'Preis in Prüfung':money(s.price)}

Leistungssumme: {data.pricePending?'Preis in Prüfung':money(data.serviceTotal)}{data.partial?' · freigegebene Kostenstellen':''}

:

Keine Leistungen für Ihre freigegebenen Kostenstellen vorhanden.

}{data.toll!=null&&

Maut: {money(data.toll)} · Gesamt einschließlich Maut: {data.pricePending?'Preis in Prüfung':money(data.totalWithToll??data.serviceTotal)}{data.partial?' · freigegebene Kostenstellen':''}

}{data.stations.map(s=>

Nachweise · {s.label??`Station ${s.sequence}`}

{s.articles&&s.articles.rows.length>0&&
{s.articles.columns.map((c,i)=>)}{s.articles.rows.map(r=>{r.cells.map((v,i)=>)})}
Artikel · {s.label??`Station ${s.sequence}`}
{c.label}
{s.articles!.columns[i].type==='money'&&v!==''?money(Number(v)):v}
}{s.warnings.map((w,i)=>

{w}

)}{s.signature&&
Unterschrift · {s.label??`Station ${s.sequence}`}
{`Unterschrift
}
{s.photos.map(p=>)}
{!s.signature&&!s.fields.length&&!s.photos.length&&!s.warnings.length&&

Keine zusätzlichen Nachweise gespeichert.

}
)}{busy&&

Stationsfoto wird geladen …

}{imageError&&

{imageError}

}{image&&
{image.name}
Stationsfoto herunterladen
}{data.canPdf&&
}{pdf&&setPdf(false)}/>}}
; } function CustomerOrderPdf({job,revision,onClose}:{job:number;revision:string;onClose:()=>void}){ const uiText=useUiText(); const [page,setPage]=useState(0),[preview,setPreview]=useState<{page:number;pages:number;png:string}|null>(null),[error,setError]=useState(''),[busy,setBusy]=useState(false),[loading,setLoading]=useState(false);const base=`/customer-portal/orders/${job}`; useEffect(()=>{const c=new AbortController();setPreview(null);setError('');setLoading(true);request<{page:number;pages:number;png:string}>(`${base}/pdf-page?`+new URLSearchParams({revision,page:String(page)}),{signal:c.signal}).then(p=>{if(!c.signal.aborted)setPreview(p);}).catch(e=>{if(!c.signal.aborted)setError(e.message);}).finally(()=>{if(!c.signal.aborted)setLoading(false);});return()=>c.abort();},[base,revision,page]); async function download(){if(busy||!preview)return;setBusy(true);setError('');try{await downloadBusinessFile(`${base}/pdf?`+new URLSearchParams({revision}),undefined,`Auftrag-${job}.pdf`,'GET');}catch(e){setError((e as Error).message);}finally{setBusy(false);}} return {if(!busy)onClose();}}>
{error&&

{error}

}{loading&&

PDF-Vorschau wird erstellt …

}{preview&&<>

Seite {preview.page+1} / {preview.pages}

{`Auftragsbeleg}
; }