PageSourceSearch

https://luxuryleasing.de/assets/Angebotserstellung-BB6m5WZq.js

js luxuryleasing.de collected 2026-10-08 07:12:45 UTC 29,946 bytes, 66 lines download raw bytes

1import{u as K,j as e}from"./query-vendor-DVmmQ-ki.js";import{v as Ie,B as F,L as Y}from"./index-DpP3iEYK.js";import{f as qe,r as d}from"./react-vendor-BURXZ51T.js";import{supabase as S}from"./client-BXzYhP5O.js";import{u as Re}from"./use-toast-j8LH5fHs.js";import{formatNumberWithSeparator as L,calculateListPrice as Pe,parseFormattedNumberString as G}from"./formUtils-CA2AULoA.js";import{C as P,b as H,c as M,a as z}from"./card-DwBoygcx.js";import{T as R}from"./textarea-DHmKlUYM.js";import{S as se}from"./sparkles-BT5dtObF.js";import{I as me}from"./info-XAdJRHNr.js";import{I as w}from"./input-Bx2apBJb.js";import{L as f}from"./label-CiQuxLS0.js";import{S as V,a as U,b as W,c as Z,d as Q}from"./select-u_D-otHI.js";import{T as He,a as Me,b as ze,c as Oe}from"./tooltip-Bh6NQA4e.js";import{P as Be}from"./plus-B0QqRDRs.js";import{T as Ke}from"./trash-2-B9W2MJEE.js";import{T as Ge,a as Ve,b as te,c as re}from"./tabs-CH4KCsyR.js";import{C as de}from"./copy-CJmodTUB.js";import{F as Ue}from"./file-down-BtxT1Zea.js";import{X as We}from"./x-CrVVxRiw.js";import"./radix-slot-BTvEbTmE.js";import"./supabase-DxfZiqN5.js";import"./ui-radix-LBOF5AHa.js";import"./check-Dwauox-g.js";function ue(t,n){const o=new Map;for(const _ of t){const g=_.down_payment||0;o.has(g)||o.set(g,[]),o.get(g).push(_)}const h=[...o.keys()].sort((_,g)=>_-g),m=_=>_.toLocaleString("de-DE",{minimumFractionDigits:2,maximumFractionDigits:2});return h.map(_=>{const g=o.get(_),C=_>0?`mit ${m(_)} € Anzahlung`:"ohne Anzahlung",b=n?`*LEASINGOPTIONEN (${C})*
2───────`:`LEASINGOPTIONEN (${C})
3────────────────────────────`,k=g.map(x=>n?`${x.term_months} Monate
4• Rate: ${m(x.rate)} € (netto: ${m(x.rate_net)} €)
5• RW: ${m(x.residual_eur)} € brutto (${x.residual_pct}%)`:`${x.term_months} Monate
6• Rate: ${m(x.rate)} € (netto: ${m(x.rate_net)} €)
7• Restwert: ${m(x.residual_eur)} € brutto (${x.residual_pct}%)`).join(`
8
9`);return`${b}
10${k}`}).join(`
11
12`)}function Ze(t){const n=`${t.make} ${t.model}${t.model_variant?" "+t.model_variant:""}`,o=t.first_registration||t.mileage_km||t.color_exterior||t.interior_desc?`FAHRZEUGDATEN
13────────────────────────────
14${t.first_registration?`Erstzulassung: ${t.first_registration}
15`:""}${t.mileage_km?`Kilometerstand: ${t.mileage_km.toLocaleString("de-DE")} km
16`:""}${t.color_exterior?`Farbe: ${t.color_exterior}
17`:""}${t.interior_desc?`Polster: ${t.interior_desc}
18`:""}
19`:"",h=t.equipment_highlights?`AUSSTATTUNGS-HIGHLIGHTS
20────────────────────────────
21${t.equipment_highlights}
22
23`:"";return`${n}
24
25${o}${h}PREISE
26────────────────────────────
27Kaufpreis netto: ${t.purchase_price_net.toLocaleString("de-DE",{minimumFractionDigits:2,maximumFractionDigits:2})} €
28Kaufpreis brutto: ${t.purchase_price_gross.toLocaleString("de-DE",{minimumFractionDigits:2,maximumFractionDigits:2})} €
29${t.broker_fee>0?`Vermittlungsprovision an LuxuryLeasing.de: ${t.broker_fee.toLocaleString("de-DE",{minimumFractionDigits:2,maximumFractionDigits:2})} €
30`:""}
31${ue(t.rates,!1)}
32
33Alle Werte inkl. MwSt.
34
35────────────────────────────
36Angebot freibleibend, Irrtümer und Zwischenverkauf vorbehalten.`}function Qe(t){const n=`${t.make} ${t.model}${t.model_variant?" "+t.model_variant:""}`,o=t.first_registration||t.mileage_km||t.color_exterior||t.interior_desc?`*FAHRZEUGDATEN*
37───────
38${t.first_registration?`Erstzulassung: ${t.first_registration}
39`:""}${t.mileage_km?`Kilometerstand: ${t.mileage_km.toLocaleString("de-DE")} km
40`:""}${t.color_exterior?`Farbe: ${t.color_exterior}
41`:""}${t.interior_desc?`Polster: ${t.interior_desc}
42`:""}
43`:"",h=t.equipment_highlights?`*AUSSTATTUNGS-HIGHLIGHTS*
44───────
45${t.equipment_highlights.split(`
46`).map(m=>`• ${m.trim()}`).filter(m=>m.length>2).join(`
47`)}
48
49`:"";return`*${n}*
50
51${o}${h}*PREISE*
52───────
53Kaufpreis netto: ${t.purchase_price_net.toLocaleString("de-DE",{minimumFractionDigits:2,maximumFractionDigits:2})} €
54Kaufpreis brutto: ${t.purchase_price_gross.toLocaleString("de-DE",{minimumFractionDigits:2,maximumFractionDigits:2})} €
55${t.broker_fee>0?`Vermittlungsprovision: ${t.broker_fee.toLocaleString("de-DE",{minimumFractionDigits:2,maximumFractionDigits:2})} €
56`:""}
57${ue(t.rates,!0)}
58
59_Alle Werte inkl. MwSt._
60
61_Angebot freibleibend, Irrtümer und Zwischenverkauf vorbehalten._`}function Ye(){qe();const{toast:t}=Re(),[n,o]=d.useState(""),[h,m]=d.useState(!1),[_,g]=d.useState(!1),[C,b]=d.useState(!1),[k,x]=d.useState(7),[N,$]=d.useState(""),[u,E]=d.useState(""),[a,ie]=d.useState("0"),[J,ae]=d.useState("0"),[X,ee]=d.useState(""),[T,O]=d.useState(""),[i,j]=d.useState({make:"",model:"",model_variant:"",first_registration:"",mileage_km:0,color_exterior:"",interior_desc:"",equipment:"",equipment_highlights:"",purchase_price_gross:0,purchase_price_net:0,down_payment:0,broker_fee:0,customer_name:"",customer_email:"",customer_phone:"",rates:[]}),[D,ne]=d.useState({term_months:48,residual_pct:70});d.useEffect(()=>{const r=setTimeout(()=>{const s={formData:i,originalPrice:N,askPrice:u,downPayment:a,brokerFee:J,mileage:X,equipmentHighlights:T,interestRate:k,currentRate:D,htmlInput:n};localStorage.setItem("offer-draft",JSON.stringify(s))},2e3);return()=>clearTimeout(r)},[i,N,u,a,J,X,T,k,D,n]),d.useEffect(()=>{const r=localStorage.getItem("offer-draft");if(r)try{const s=JSON.parse(r);j(s.formData||i),$(s.originalPrice||""),E(s.askPrice||""),ie(s.downPayment||"0"),ae(s.brokerFee||"0"),ee(s.mileage||""),O(s.equipmentHighlights||""),x(s.interestRate||7),ne(s.currentRate||{term_months:48,residual_pct:70}),o(s.htmlInput||""),t({title:"📝 Entwurf wiederhergestellt",description:"Ihr letztes Angebot wurde automatisch geladen."})}catch(s){console.error("Error loading draft:",s)}},[]);const he=d.useCallback(()=>{confirm("Möchten Sie den Entwurf wirklich verwerfen?")&&(localStorage.removeItem("offer-draft"),window.location.reload())},[]),{data:ge}=K({queryKey:["makes"],queryFn:async()=>{const{data:r}=await S.from("model_index").select("make").order("make");return[...new Set((r==null?void 0:r.map(s=>s.make))||[])]}}),{data:xe}=K({queryKey:["models",i.make],queryFn:async()=>{if(!i.make)return[];const{data:r}=await S.from("model_index").select("family").eq("make",i.make).order("family");return[...new Set((r==null?void 0:r.map(s=>s.family))||[])]},enabled:!!i.make}),{data:pe}=K({queryKey:["variants",i.make,i.model],queryFn:async()=>{if(!i.make||!i.model)return[];const{data:r}=await S.from("model_index").select("variant").eq("make",i.make).eq("family",i.model).order("variant");return[...new Set((r==null?void 0:r.map(s=>s.variant).filter(Boolean))||[])]},enabled:!!i.make&&!!i.model}),{data:_e}=K({queryKey:["oem-colors"],queryFn:async()=>{const{data:r}=await S.from("color_mappings").select("oem_color").order("oem_color");return[...new Set((r==null?void 0:r.map(s=>s.oem_color))||[])]}}),B=d.useCallback(()=>{const{purchase_price_gross:r,down_payment:s}=i,{term_months:p,residual_pct:v}=D;if(!r||r<=0)return null;const A=Math.round(r*v/100*100)/100,l=r-(s||0),c=Math.pow(1+k/100,1/12)-1,y=Math.pow(1+c,-p),I=A*y,q=l-I,Le=(1+c)*(1-y)/c,le=q/Le,oe=Math.round(le*100)/100,Te=Math.round(oe/1.19*100)/100,ce=Ie(le),Ae=Math.round(ce/1.19*100)/100;return{rate:ce,rate_net:Ae,rate_exact:oe,rate_net_exact:Te,residual_eur:A,financing_amount:l}},[i,D,k]),je=d.useCallback(async()=>{var r,s,p;if(!n||n.trim().length<100){t({title:"Ungültige Eingabe",description:"Bitte fügen Sie den vollständigen HTML-Quellcode der mobile.de Seite ein (mindestens 100 Zeichen).",variant:"destructive"});return}m(!0);try{const{data:v,error:A}=await S.functions.invoke("analyze-vehicle-data",{body:{html:n,mobileDeId:null}});if(A)throw A;if(!(v!=null&&v.success))throw new Error((v==null?void 0:v.error)||"Fehler bei der KI-Analyse");const l=v.analysis;if((r=l.model_match)!=null&&r.id&&l.model_match.confidence!=="low"){j(y=>({...y,make:l.data.make,model:l.data.model_family,model_variant:l.data.model_variant||""}));const c=`${l.data.make} ${l.data.model_family}${l.data.model_variant?" "+l.data.model_variant:""}`;t({title:"Modell gefunden",description:`${c} wurde automatisch ausgewählt.`})}else t({title:"Modell nicht gefunden",description:`"${l.data.make} ${l.data.model_family}" ist nicht in der Datenbank.`,variant:"destructive"});if((s=l.color_match)!=null&&s.oem_color?(j(c=>({...c,color_exterior:l.color_match.oem_color})),t({title:"✅ Farbe gefunden",description:`Außenfarbe "${l.color_match.oem_color}"`})):l.data.color_exterior_oem&&(j(c=>({...c,color_exterior:l.data.color_exterior_oem})),t({title:"⚠️ Farbe nicht gemappt",description:`"${l.data.color_exterior_oem}" wurde übernommen.`})),l.data.interior_desc&&j(c=>({...c,interior_desc:l.data.interior_desc})),l.data.first_registration&&j(c=>({...c,first_registration:l.data.first_registration})),l.data.mileage_km&&(ee(L(l.data.mileage_km.toString())),j(c=>({...c,mileage_km:l.data.mileage_km}))),l.data.price){const c=l.data.price;$(L(c.toString()));const y=Pe(c),I=L(y.toString());E(I),j(q=>({...q,purchase_price_gross:y,purchase_price_net:Math.round(y/1.19*100)/100})),t({title:"Preise berechnet",description:`Original: ${L(c.toString())} € → Unser VP: ${I} €`})}if(l.data.model_variant&&j(c=>({...c,model_variant:l.data.model_variant})),((p=l.data.spec_options)==null?void 0:p.length)>0){const c=l.data.spec_options.join(`
62`);j(y=>({...y,equipment:c})),t({title:"✅ Import erfolgreich",description:"Generiere Equipment Highlights..."});try{const{data:y,error:I}=await S.functions.invoke("generate-equipment-highlights",{body:{equipment:c}});!I&&y&&(O(y.highlights),j(q=>({...q,equipment_highlights:y.highlights})),t({title:"✨ Highlights generiert"}))}catch(y){console.error("Error auto-generating highlights:",y)}}else t({title:"✅ Import erfolgreich",description:"Fahrzeugdaten wurden analysiert."})}catch(v){console.error("HTML analysis error:",v),t({title:"Analyse fehlgeschlagen",description:v instanceof Error?v.message:"Unbekannter Fehler",variant:"destructive"})}finally{m(!1)}},[n,t]),fe=d.useCallback(()=>{const r=B();if(!r||r.rate<=0){t({title:"Fehler",description:"Bitte gültige Preise eingeben",variant:"destructive"});return}const s={term_months:D.term_months,residual_pct:D.residual_pct,residual_eur:r.residual_eur,rate:r.rate,rate_net:r.rate_net,down_payment:i.down_payment||0};j(p=>({...p,rates:[...p.rates||[],s]}))},[B,D,t]),ve=d.useCallback(r=>{j(s=>({...s,rates:(s.rates||[]).filter((p,v)=>v!==r)}))},[]),be=d.useCallback(async()=>
62{if(!i.equipment){t({title:"Keine Ausstattung",description:"Bitte zuerst Ausstattung eingeben.",variant:"destructive"});return}b(!0);try{const{data:r,error:s}=await S.functions.invoke("generate-equipment-highlights",{body:{equipment:i.equipment}});if(s)throw s;O(r.highlights),j(p=>({...p,equipment_highlights:r.highlights})),t({title:"✨ Highlights generiert"})}catch(r){console.error("Error generating highlights:",r),t({title:"Fehler",description:"Highlights konnten nicht generiert werden.",variant:"destructive"})}finally{b(!1)}},[i.equipment,t]),ke=d.useCallback(async()=>{var r;if(!i.make||!i.model||!i.purchase_price_gross||(((r=i.rates)==null?void 0:r.length)||0)===0){t({title:"Fehler",description:"Bitte alle Pflichtfelder ausfüllen und mindestens eine Rate hinzufügen",variant:"destructive"});return}g(!0);try{const{error:s}=await S.from("customer_offers").insert([{make:i.make,model:i.model,model_variant:i.model_variant||null,first_registration:i.first_registration||null,mileage_km:i.mileage_km||null,color_exterior:i.color_exterior||null,interior_desc:i.interior_desc||null,equipment:i.equipment||null,equipment_highlights:T||null,purchase_price_gross:i.purchase_price_gross,purchase_price_net:i.purchase_price_net,down_payment:i.down_payment||0,broker_fee:i.broker_fee||0,rates:i.rates||[],customer_name:i.customer_name||null,customer_email:i.customer_email||null,customer_phone:i.customer_phone||null,offer_type:"luxus"}]);if(s)throw s;t({title:"✅ Angebot gespeichert",description:"Das Angebot ist 30 Tage gültig."}),localStorage.removeItem("offer-draft")}catch(s){console.error("Save error:",s),t({title:"Fehler",description:s.message,variant:"destructive"})}finally{g(!1)}},[i,T,t]),ye=d.useCallback(async(r,s)=>{await navigator.clipboard.writeText(r),t({title:`${s==="email"?"E-Mail":"WhatsApp"}-Text kopiert`,description:"Der Text wurde in die Zwischenablage kopiert."})},[t]),we=d.useCallback(async()=>{var r;if(!i.make||!i.model||(((r=i.rates)==null?void 0:r.length)||0)===0){t({title:"Fehler",description:"Bitte Fahrzeugdaten und Raten eingeben",variant:"destructive"});return}g(!0);try{const{data:s,error:p}=await S.functions.invoke("generate-offer-pdf",{body:{offer:i}});if(p)throw p;const v=atob(s.pdf),A=new Blob([v],{type:"text/plain;charset=utf-8"}),l=URL.createObjectURL(A),c=document.createElement("a");c.href=l,c.download=`Angebot_${i.make}_${i.model}.txt`,document.body.appendChild(c),c.click(),document.body.removeChild(c),URL.revokeObjectURL(l),t({title:"Erfolg",description:"Angebot wurde heruntergeladen"})}catch(s){console.error("PDF error:",s),t({title:"Fehler",description:s.message,variant:"destructive"})}finally{g(!1)}},[i,t]),Ne=i.make?Ze({...i,equipment_highlights:T}):"",Se=i.make?Qe({...i,equipment_highlights:T}):"",Fe=B(),Ce=d.useCallback(r=>{E(L(r));const s=parseFloat(G(r));isNaN(s)||j(p=>({...p,purchase_price_gross:s,purchase_price_net:Math.round(s/1.19*100)/100}))},[]),$e=d.useCallback(r=>{ee(L(r));const s=parseInt(G(r))||0;j(p=>({...p,mileage_km:s}))},[]),Ee=d.useCallback(r=>{ie(L(r));const s=parseFloat(G(r))||0;j(p=>({...p,down_payment:s}))},[]),De=d.useCallback(r=>{ae(L(r));const s=parseFloat(G(r))||0;j(p=>({...p,broker_fee:s}))},[]);return{formData:i,setFormData:j,originalPrice:N,askPrice:u,downPayment:a,brokerFee:J,mileage:X,equipmentHighlights:T,setEquipmentHighlights:O,handleAskPriceChange:Ce,handleMileageChange:$e,handleDownPaymentChange:Ee,handleBrokerFeeChange:De,interestRate:k,setInterestRate:x,currentRate:D,setCurrentRate:ne,calculateRate:B,calc:Fe,addRate:fe,removeRate:ve,htmlInput:n,setHtmlInput:o,isImporting:h,analyzeHtml:je,isGeneratingHighlights:C,generateHighlights:be,makes:ge,models:xe,variants:pe,oemColors:_e,isLoading:_,saveOffer:ke,copyToClipboard:ye,downloadPDF:we,clearDraft:he,emailText:Ne,whatsappText:Se}}function Je({htmlInput:t,onHtmlInputChange:n,isImporting:o,onAnalyze:h}){return e.jsxs(P,{children:[e.jsx(H,{children:e.jsxs(M,{className:"flex items-center gap-2",children:[e.jsx(se,{className:"h-5 w-5"}),"Import von mobile.de (HTML-Quelltext)"]})}),e.jsxs(z,{className:"space-y-4",children:[e.jsx(R,{value:t,onChange:m=>n(m.target.value),placeholder:"HTML-Quellcode hier einfügen...",rows:10,disabled:o,className:"font-mono text-xs"}),e.jsx(F,{onClick:h,disabled:o||!t,className:"w-full",children:o?e.jsxs(e.Fragment,{children:[e.jsx(Y,{className:"h-4 w-4 animate-spin mr-2"}),"Analysiere mit KI..."]}):e.jsxs(e.Fragment,{children:[e.jsx(se,{className:"h-4 w-4 mr-2"}),"Fahrzeugdaten importieren & analysieren"]})}),e.jsxs("div",{className:"rounded-lg bg-background p-4 space-y-3 border",children:[e.jsxs("p",{className:"font-semibold flex items-center gap-2",children:[e.jsx(me,{className:"h-4 w-4"}),"So geht's:"]}),e.jsxs("ol",{className:"list-decimal list-inside space-y-2 text-sm",children:[e.jsxs("li",{children:[e.jsx("span",{className:"font-medium",children:"Mobile.de Seite öffnen"}),e.jsx("br",{}),e.jsx("span",{className:"text-muted-foreground text-xs",children:"z.B. https://suchen.mobile.de/fahrzeuge/details.html?id=440664097"})]}),e.jsxs("li",{children:[e.jsx("span",{className:"font-medium",children:"Seitenquelltext anzeigen"}),e.jsx("br",{}),e.jsxs("span",{className:"text-muted-foreground text-xs",children:["• Windows/Linux: ",e.jsx("kbd",{className:"px-1 py-0.5 bg-muted rounded",children:"Strg + U"}),e.jsx("br",{}),"• Mac: ",e.jsx("kbd",{className:"px-1 py-0.5 bg-muted rounded",children:"⌘ + Option + U"})]})]}),e.jsxs("li",{children:[e.jsx("span",{className:"font-medium",children:"Kompletten HTML-Code kopieren"}),e.jsx("br",{}),e.jsxs("span",{className:"text-muted-foreground text-xs",children:[e.jsx("kbd",{className:"px-1 py-0.5 bg-muted rounded",children:"Strg + A"})," (alles markieren) → ",e.jsx("kbd",{className:"px-1 py-0.5 bg-muted rounded",children:"Strg + C"})," (kopieren)"]})]}),e.jsx("li",{children:e.jsx("span",{className:"font-medium",children:"Hier einfügen und anal
62ysieren"})})]})]})]})]})}function Xe({formData:t,onFormDataChange:n,originalPrice:o,askPrice:h,mileage:m,equipmentHighlights:_,onAskPriceChange:g,onMileageChange:C,onEquipmentHighlightsChange:b,makes:k,models:x,variants:N,oemColors:$,isGeneratingHighlights:u,onGenerateHighlights:E}){return e.jsxs(e.Fragment,{children:[o&&e.jsxs("div",{className:"p-3 bg-blue-50 dark:bg-blue-950 border border-blue-200 dark:border-blue-800 rounded-lg",children:[e.jsxs("p",{className:"text-sm font-medium text-blue-900 dark:text-blue-100",children:["📊 Original-Preis (Mobile.de): ",o," €"]}),e.jsxs("p",{className:"text-xs text-blue-700 dark:text-blue-300 mt-1",children:["Unser Verkaufspreis: ",h," € (+3.000 € Marge, aufgerundet)"]})]}),e.jsxs(P,{children:[e.jsx(H,{children:e.jsx(M,{children:"Fahrzeugdaten"})}),e.jsxs(z,{className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx(f,{children:"Marke*"}),e.jsxs(V,{value:t.make,onValueChange:a=>n({...t,make:a,model:"",model_variant:""}),children:[e.jsx(U,{children:e.jsx(W,{placeholder:"Marke wählen"})}),e.jsx(Z,{children:k==null?void 0:k.map(a=>e.jsx(Q,{value:a,children:a},a))})]})]}),e.jsxs("div",{children:[e.jsx(f,{children:"Modell (Familie)*"}),e.jsxs(V,{value:t.model,onValueChange:a=>n({...t,model:a,model_variant:""}),children:[e.jsx(U,{children:e.jsx(W,{placeholder:"Modell wählen"})}),e.jsx(Z,{children:x==null?void 0:x.map(a=>e.jsx(Q,{value:a,children:a},a))})]})]})]}),e.jsxs("div",{children:[e.jsx(f,{children:"Variante (optional)"}),e.jsxs(V,{value:t.model_variant||"",onValueChange:a=>n({...t,model_variant:a}),children:[e.jsx(U,{children:e.jsx(W,{placeholder:N&&N.length>0?"z.B. Performante, Turbo, S...":"Keine Varianten verfügbar"})}),e.jsx(Z,{children:N&&N.length>0&&N.map(a=>e.jsx(Q,{value:a,children:a},a))})]})]}),e.jsxs("div",{children:[e.jsx(f,{children:"Unser Verkaufspreis (brutto) €*"}),e.jsx(w,{type:"text",value:h,onChange:a=>g(a.target.value),placeholder:"z.B. 253.000",required:!0}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"Wird beim Import automatisch berechnet (Original + 3.000 €)"})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx(f,{children:"Erstzulassung"}),e.jsx(w,{type:"text",value:t.first_registration||"",onChange:a=>n({...t,first_registration:a.target.value}),placeholder:"MM/YYYY"})]}),e.jsxs("div",{children:[e.jsx(f,{children:"Kilometerstand"}),e.jsx(w,{type:"text",value:m,onChange:a=>C(a.target.value),placeholder:"z.B. 25.000"})]})]}),e.jsxs("div",{children:[e.jsx(f,{children:"Farbe"}),e.jsxs(V,{value:t.color_exterior,onValueChange:a=>n({...t,color_exterior:a}),children:[e.jsx(U,{children:e.jsx(W,{placeholder:"Farbe wählen"})}),e.jsx(Z,{children:$==null?void 0:$.map(a=>e.jsx(Q,{value:a,children:a},a))})]})]}),e.jsxs("div",{children:[e.jsx(f,{children:"Polster / Interior"}),e.jsx(w,{type:"text",value:t.interior_desc||"",onChange:a=>n({...t,interior_desc:a.target.value}),placeholder:"z.B. Leder schwarz"})]}),e.jsxs("div",{children:[e.jsxs(f,{className:"flex items-center gap-2",children:["Ausstattung (vollständig, aus Händlerbeschreibung)",e.jsx(He,{children:e.jsxs(Me,{children:[e.jsx(ze,{children:e.jsx(me,{className:"h-4 w-4 text-muted-foreground"})}),e.jsx(Oe,{children:e.jsx("p",{className:"max-w-xs",children:"Nur relevante Sonderausstattungen aus der Händlerbeschreibung, KEINE Standard-Features wie ABS, Bluetooth, etc."})})]})})]}),e.jsx(R,{value:t.equipment||"",onChange:a=>n({...t,equipment:a.target.value}),placeholder:`Sportpaket Plus
63Carbon-Keramik-Bremsanlage
64Sportabgasanlage mit Klappensteuerung
65Akrapovic Auspuffanlage
6622 Zoll Leichtmetallfelgen`,rows:8}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"Diese Liste wird NICHT direkt im Angebot angezeigt. Nutzen Sie die Highlights-Funktion unten."})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(F,{onClick:E,disabled:u||!t.equipment,variant:"outline",size:"sm",type:"button",children:u?e.jsxs(e.Fragment,{children:[e.jsx(Y,{className:"h-4 w-4 animate-spin mr-2"}),"Generiere..."]}):e.jsxs(e.Fragment,{children:[e.jsx(se,{className:"h-4 w-4 mr-2"}),"Highlights manuell neu generieren (KI)"]})}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Wird automatisch nach Import generiert"})]}),e.jsxs("div",{children:[e.jsxs(f,{className:"flex items-center gap-2",children:["Ausstattungs-Highlights (für Angebot)",e.jsx("span",{className:"text-xs font-normal text-muted-foreground",children:"(3-5 wichtigste Features)"})]}
66),e.jsx(R,{value:_,onChange:a=>b(a.target.value),placeholder:"Wird automatisch generiert oder manuell eingeben...",rows:4}),e.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"Diese Highlights werden in E-Mail & WhatsApp angezeigt"})]})]})]})]})}function et({currentRate:t,onCurrentRateChange:n,downPayment:o,onDownPaymentChange:h,interestRate:m,onInterestRateChange:_,brokerFee:g,onBrokerFeeChange:C,calc:b,purchasePriceGross:k,rates:x,onAddRate:N,onRemoveRate:$}){return e.jsxs(P,{children:[e.jsx(H,{children:e.jsx(M,{children:"Leasingraten"})}),e.jsxs(z,{className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx(f,{children:"Laufzeit (Monate)"}),e.jsx(w,{type:"number",value:t.term_months,onChange:u=>n({...t,term_months:parseInt(u.target.value)})})]}),e.jsxs("div",{children:[e.jsx(f,{children:"Restwert %"}),e.jsx(w,{type:"number",value:t.residual_pct,onChange:u=>n({...t,residual_pct:parseFloat(u.target.value)})})]})]}),e.jsxs("div",{children:[e.jsx(f,{children:"Anzahlung €"}),e.jsx(w,{type:"text",value:o,onChange:u=>h(u.target.value),placeholder:"z.B. 20.000"})]}),e.jsxs("div",{children:[e.jsx(f,{children:"Zinssatz (% p.a.)"}),e.jsx(w,{type:"number",step:"0.1",value:m,onChange:u=>_(parseFloat(u.target.value)||7),placeholder:"7.0"})]}),e.jsxs("div",{children:[e.jsx(f,{children:"Vermittlungsprovision (brutto) €"}),e.jsx(w,{type:"text",value:g,onChange:u=>C(u.target.value),placeholder:"z.B. 3.000"})]}),k>0&&b&&e.jsxs("div",{className:"p-4 bg-muted/50 rounded-lg border space-y-3",children:[e.jsx("div",{className:"text-sm font-medium text-muted-foreground",children:"Berechnungsgrundlage:"}),e.jsxs("div",{className:"grid grid-cols-2 gap-1 text-sm",children:[e.jsx("div",{children:"Kaufpreis (brutto):"}),e.jsxs("div",{className:"font-medium text-right",children:[k.toLocaleString("de-DE",{minimumFractionDigits:2})," €"]}),e.jsx("div",{children:"Anzahlung:"}),e.jsxs("div",{className:"font-medium text-right",children:[(b.financing_amount!==k?k-b.financing_amount:0).toLocaleString("de-DE",{minimumFractionDigits:2})," €"]}),e.jsx("div",{children:"Finanzierungsbetrag:"}),e.jsxs("div",{className:"font-medium text-right",children:[b.financing_amount.toLocaleString("de-DE",{minimumFractionDigits:2})," €"]}),e.jsxs("div",{className:"border-t pt-1",children:["Restwert (",t.residual_pct,"%):"]}),e.jsxs("div",{className:"font-medium text-right border-t pt-1",children:[b.residual_eur.toLocaleString("de-DE",{minimumFractionDigits:2})," €"]})]}),e.jsxs("div",{className:"border-t pt-3 space-y-2",children:[e.jsx("div",{className:"text-sm font-medium text-muted-foreground",children:"Berechnete Rate:"}),e.jsxs("div",{className:"grid grid-cols-2 gap-1 text-sm",children:[e.jsx("div",{className:"text-muted-foreground",children:"Exakt (Kontrolle):"}),e.jsxs("div",{className:"text-right text-muted-foreground",children:[b.rate_exact.toLocaleString("de-DE",{minimumFractionDigits:2})," € brutto / ",b.rate_net_exact.toLocaleString("de-DE",{minimumFractionDigits:2})," € netto"]}),e.jsx("div",{className:"font-medium",children:"Gerundet (verwendet):"}),e.jsxs("div",{className:"font-medium text-right text-primary",children:[b.rate.toLocaleString("de-DE",{minimumFractionDigits:2})," € brutto / ",b.rate_net.toLocaleString("de-DE",{minimumFractionDigits:2})," € netto"]})]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Rundung auf nächste 50 €"})]})]}),e.jsxs(F,{onClick:N,className:"w-full",children:[e.jsx(Be,{className:"h-4 w-4 mr-2"}),"Rate hinzufügen"]}),x&&x.length>0&&e.jsxs("div",{className:"space-y-2",children:[e.jsx(f,{children:"Hinzugefügte Raten:"}),x.map((u,E)=>e.jsxs("div",{className:"flex justify-between items-center p-2 bg-muted rounded",children:[e.jsxs("div",{className:"flex flex-col text-sm flex-1",children:[e.jsxs("div",{children:[e.jsxs("strong",{children:[u.term_months," Monate:"]})," ",u.rate.toLocaleString("de-DE")," € brutto / ",u.rate_net.toLocaleString("de-DE")," € netto"]}),e.jsxs("div",{className:"text-xs text-muted-foreground",children:["Restwert: ",u.residual_eur.toLocaleStr
66ing("de-DE",{minimumFractionDigits:2,maximumFractionDigits:2})," € (",u.residual_pct,"%)"," · ",(u.down_payment||0)>0?`mit ${u.down_payment.toLocaleString("de-DE",{minimumFractionDigits:2,maximumFractionDigits:2})} € Anzahlung`:"ohne Anzahlung"]})]}),e.jsx(F,{variant:"ghost",size:"sm",onClick:()=>$(E),children:e.jsx(Ke,{className:"h-4 w-4"})})]},E))]})]})]})}function tt({customerName:t,customerEmail:n,customerPhone:o,onFieldChange:h,onSave:m,isLoading:_}){return e.jsxs(P,{children:[e.jsx(H,{children:e.jsx(M,{children:"Kundendaten (optional)"})}),e.jsxs(z,{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx(f,{children:"Name"}),e.jsx(w,{value:t,onChange:g=>h("customer_name",g.target.value),placeholder:"Max Mustermann"})]}),e.jsxs("div",{children:[e.jsx(f,{children:"E-Mail"}),e.jsx(w,{type:"email",value:n,onChange:g=>h("customer_email",g.target.value),placeholder:"[email protected]"})]}),e.jsxs("div",{children:[e.jsx(f,{children:"Telefon"}),e.jsx(w,{type:"tel",value:o,onChange:g=>h("customer_phone",g.target.value),placeholder:"+49 123 456789"})]}),e.jsxs(F,{onClick:m,disabled:_,className:"w-full",children:[_?e.jsx(Y,{className:"h-4 w-4 animate-spin mr-2"}):null,"Angebot speichern"]})]})]})}function rt({emailText:t,whatsappText:n,onCopyToClipboard:o,onDownloadPDF:h,isLoading:m}){return e.jsxs(P,{children:[e.jsx(H,{children:e.jsx(M,{children:"Vorschau & Export"})}),e.jsx(z,{children:e.jsxs(Ge,{defaultValue:"email",children:[e.jsxs(Ve,{className:"grid w-full grid-cols-3",children:[e.jsx(te,{value:"email",children:"E-Mail"}),e.jsx(te,{value:"whatsapp",children:"WhatsApp"}),e.jsx(te,{value:"pdf",children:"PDF"})]}),e.jsxs(re,{value:"email",className:"space-y-4",children:[e.jsx(R,{value:t,readOnly:!0,rows:20,className:"font-mono text-xs"}),e.jsxs(F,{onClick:()=>o(t,"email"),className:"w-full",children:[e.jsx(de,{className:"h-4 w-4 mr-2"}),"E-Mail-Text kopieren"]})]}),e.jsxs(re,{value:"whatsapp",className:"space-y-4",children:[e.jsx(R,{value:n,readOnly:!0,rows:20,className:"font-mono text-xs"}),e.jsxs(F,{onClick:()=>o(n,"whatsapp"),className:"w-full",children:[e.jsx(de,{className:"h-4 w-4 mr-2"}),"WhatsApp-Text kopieren"]})]}),e.jsxs(re,{value:"pdf",className:"space-y-4",children:[e.jsx("p",{className:"text-sm text-muted-foreground",children:"Laden Sie das Angebot als formatierte Textdatei herunter."}),e.jsxs(F,{onClick:h,disabled:m,className:"w-full",children:[m?e.jsx(Y,{className:"h-4 w-4 animate-spin mr-2"}):e.jsx(Ue,{className:"h-4 w-4 mr-2"}),"PDF herunterladen"]})]})]})})]})}function Ft(){const t=Ye();return e.jsxs("div",{className:"container mx-auto p-6",children:[e.jsxs("div",{className:"flex justify-between items-center mb-6",children:[e.jsx("h1",{className:"text-3xl font-bold",children:"Angebotserstellung PDF"}),e.jsxs(F,{onClick:t.clearDraft,variant:"outline",size:"sm",children:[e.jsx(We,{className:"h-4 w-4 mr-2"}),"Entwurf verwerfen"]})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[e.jsxs("div",{className:"space-y-6",children:[e.jsx(Je,{htmlInput:t.htmlInput,onHtmlInputChange:t.setHtmlInput,isImporting:t.isImporting,onAnalyze:t.analyzeHtml}),e.jsx(Xe,{formData:t.formData,onFormDataChange:t.setFormData,originalPrice:t.originalPrice,askPrice:t.askPrice,mileage:t.mileage,equipmentHighlights:t.equipmentHighlights,onAskPriceChange:t.handleAskPriceChange,onMileageChange:t.handleMileageChange,onEquipmentHighlightsChange:n=>{t.setEquipmentHighlights(n),t.setFormData(o=>({...o,equipment_highlights:n}))},makes:t.makes,models:t.models,variants:t.variants,oemColors:t.oemColors,isGeneratingHighlights:t.isGeneratingHighlights,onGenerateHighlights:t.generateHighlights}),e.jsx(et,{currentRate:t.currentRate,onCurrentRateChange:t.setCurrentRate,downPayment:t.downPayment,onDownPaymentChange:t.handleDownPaymentChange,interestRate:t.interestRate,onInterestRateChange:t.setInterestRate,brokerFee:t.brokerFee,onBrokerFeeChange:t.handleBrokerFeeChange,calc:t.calc,purchasePriceGross:t.formData.purchase_price_gross||0,rates:t.formData.rates||[],onAddRate:t.addRate,onRemoveRate:t.removeRate}),e.jsx(tt,{customerName:t.formData.customer_name||"",customerEmail:t.formData.customer_email||"",customerPhone:t.formData.customer_phone||"",onFieldChange:(n,o)=>t.setFormData(h=>({...h,[n]:o})),onSave:t.saveOffer,isLoading:t.isLoading})]}),e.jsx("div",{children:e.jsx(rt,{emailText:t.emailText,whatsappText:t.whatsappText,onCopyToClipboard:t.copyToClipboard,onDownloadPDF:t.downloadPDF,isLoading:t.isLoading})})]})]})}export{Ft as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.