import {useUiText} from './UiLanguage'; import {useEffect,useState} from 'react'; import {request} from './api'; import {Modal} from './FormElements'; import type {Order} from './types'; type RunningOrder={id:number;at:string;status:number;longhaul:boolean;headquarters:string;canOpen:boolean;occupied:boolean;stations:{id:number;position:number;postalCode:string;completed:boolean}[]}; type Result={sid:string;total:number;page:number;pageSize:number;items:RunningOrder[]}; const time=(v:string|null|undefined)=>{if(!v)return '–';const date=new Date(v.replace(' ','T'));return Number.isNaN(date.getTime())?v:date.toLocaleString('de-DE',{dateStyle:'short',timeStyle:'short'});}; export function AssignmentOrders({job,vehicle,courier,sid,refresh}:{job:number;vehicle:number;courier:number;sid:string;refresh:number}){ const [open,setOpen]=useState(false),[page,setPage]=useState(1),[reload,setReload]=useState(0),[result,setResult]=useState(null),[error,setError]=useState(''),[loading,setLoading]=useState(false),[detail,setDetail]=useState(null); useEffect(()=>{setOpen(false);setPage(1);setResult(null);setDetail(null);},[job,vehicle,courier,refresh]); useEffect(()=>{if(!open)return;const c=new AbortController();setLoading(true);setResult(null);setError('');request(`/orders/${job}/courier-assignment/vehicles/${vehicle}/orders?courierId=${courier}&page=${page}`,{signal:c.signal}).then(r=>{if(!c.signal.aborted)setResult(r);}).catch(e=>{if(!c.signal.aborted)setError(e.message);}).finally(()=>{if(!c.signal.aborted)setLoading(false);});return()=>c.abort();},[job,vehicle,courier,refresh,open,page,reload]); return
{open&&
{loading&&

Aufträge und Stationsfolge werden geladen …

} {error&&

{error}

} {result&&<>

{result.total} laufende / vorgemerkte Aufträge

    {result.items.map(o=>
  • {o.canOpen?:Auftrag #{o.id}} {o.longhaul?'BWV · ':''}{o.headquarters}
    {time(o.at)} · {o.status===0?'Angeboten':'Angenommen'} · {o.occupied?'Belegt im Vorlauffenster':'Außerhalb des Vorlauffensters'}
      {o.stations.map(t=>
    1. {t.position}. {t.postalCode||'PLZ fehlt'}{t.completed&& ✓ erledigt}
    2. )}
    {!o.canOpen&&

    Auftrag einer anderen Niederlassung. Vollständige Details sind hier nicht freigegeben.

    }
  • )}
{!result.total&&

Derzeit keine weiteren laufenden Aufträge.

} {result.total>result.pageSize&&
Seite {page} / {Math.ceil(result.total/result.pageSize)}
} }
}{detail!==null&&setDetail(null)}/>}
; } function AssignmentOrderDetails({id,onClose}:{id:number;onClose:()=>void}){ const uiText=useUiText(); const [order,setOrder]=useState(null),[error,setError]=useState(''),[reload,setReload]=useState(0); useEffect(()=>{const c=new AbortController();setOrder(null);setError('');request(`/orders/${id}`,{signal:c.signal}).then(v=>{if(!c.signal.aborted)setOrder(v);}).catch(e=>{if(!c.signal.aborted)setError(e.message);});return()=>c.abort();},[id,reload]); return
{error?

{error}

:!order?

Auftrag wird geladen …

:<>

{order.legacyStatusLabel||order.status} · {order.service} · {order.vehicle}

{order.customerName||'Kunde nicht hinterlegt'} · {time(order.pickupAt)}
Referenz: {order.reference||'–'} · Kostenstelle: {order.costCenter||'–'}

{!!order.notes&&

{order.notes}

}
    {order.stops.map((s,i)=>
  1. {s.sequence}. {s.name} · {s.type==='PICKUP'?uiText("Abholung"):s.type==='DELIVERY'?'Zustellung':s.type==='BOTH'?'Abholung und Zustellung':'Station'}

    {s.street}
    {s.postalCode} {s.city}

    {(s.contact||s.phone)&&

    {s.contact} {s.phone}

    }{s.note&&

    {s.note}

    } {s.completedAt&&

    Erledigt: {time(s.completedAt)}{s.recipientName?` · ${s.recipientName}`:''}

    }
  2. )}
}
; }