PageSourceSearch

https://clozure.net/assets/InvoiceDetail-B1TMPiqG.js

js clozure.net collected 2026-10-02 01:07:44 UTC 17,355 bytes, 1 lines download raw bytes

1import{p as Fe,n as Ae,r as G,q as W,j as e}from"./react-vendor-Ca39dfnS.js";import{a as g,u as D}from"./query-vendor-CZuItqE6.js";import{u as $e,B as r,K as Te,C as x,a as u,b as h,d as p,D as X,y as Y,z as Z,E as ee,G as te,F as Me,j as se,k as ae,l as ie,R as ne,m as de,U as re,V as oe,W as ce,X as o,n as le,T as me,aa as xe,I as ue,t as ke,v as l,w as b,e as qe,p as Oe,s as he,ac as Ke}from"./main-klyVOJfp.js";import{T as pe,a as je,b as j,c as y,d as ye,e as d}from"./table-D2yQDG3z.js";import{a$ as Ee,u as Qe,k as O,au as He,bQ as Ue,q as Be,H as Le,a2 as ve,U as Re,M as Ve,b as Je}from"./ui-vendor-CDWeqcbU.js";import{f as F}from"./chart-vendor-B24y44e_.js";import"./modulepreload-polyfill-B5Qt9EMX.js";const _e=Oe({status:Ke(["draft","sent","paid","overdue","cancelled"]),notes:he().optional(),paidAt:he().optional()}),ze=s=>{const n={draft:{variant:"outline",color:"text-gray-600"},sent:{variant:"default",color:"text-blue-600"},paid:{variant:"default",color:"text-green-600"},overdue:{variant:"destructive",color:"text-red-600"},cancelled:{variant:"outline",color:"text-gray-400"}},N=n[s]||n.draft;return e.jsx(qe,{variant:N.variant,className:N.color,children:s.charAt(0).toUpperCase()+s.slice(1)})};function at(){const{businessId:s,id:n}=Fe(),[,N]=Ae(),{toast:m}=$e(),[fe,w]=G.useState(!1),[ge,I]=G.useState(!1),{data:a,isLoading:be}=g({queryKey:["/api/businesses",s,"invoices",n],enabled:!!s&&!!n}),{data:v}=g({queryKey:["/api/businesses",s,"customers",a?.customerId],enabled:!!s&&!!a?.customerId}),{data:A=[]}=g({queryKey:["/api/businesses",s,"transactions",{invoiceId:n}],enabled:!!s&&!!n}),{data:K=[]}=g({queryKey:["/api/businesses",s,"leads"],enabled:!!s,select:t=>Array.isArray(t)?t:t?.leads??[]}),{data:$=[]}=g({queryKey:["/api/businesses",s,"companies"],enabled:!!s}),Ne=t=>{if(t.leadId){const i=K.find(c=>c.id===t.leadId);return i?`${i.firstName} ${i.lastName}`:"Unknown Customer"}return t.companyId?$.find(c=>c.id===t.companyId)?.name||"Unknown Company":"Unknown Customer"},E=t=>t.leadId?K.find(c=>c.id===t.leadId)?.email||null:t.companyId&&$.find(c=>c.id===t.companyId)?.website||null,S=W({resolver:ke(_e),values:a?{status:a.status,notes:a.notes||"",paidAt:a.paidAt?new Date(a.paidAt).toISOString().split("T")[0]:void 0}:void 0}),T=D({mutationFn:async t=>b(`/api/businesses/${s}/invoices/${n}`,{method:"PATCH",body:JSON.stringify(t)}),onSuccess:()=>{l.invalidateQueries({queryKey:["/api/businesses",s,"invoices",n]}),l.invalidateQueries({queryKey:["/api/businesses",s,"invoices"]}),m({title:"Invoice updated",description:"Invoice has been updated successfully."}),w(!1)},onError:t=>{m({title:"Failed to update invoice",description:t.message||"An error occurred",variant:"destructive"})}}),we=D({mutationFn:async()=>b(`/api/businesses/${s}/invoices/${n}/send`,{method:"POST"}),onSuccess:()=>{l.invalidateQueries({queryKey:["/api/businesses",s,"invoices",n]}),l.invalidateQueries({queryKey:["/api/businesses",s,"invoices"]}),m({title:"Invoice sent",description:"Invoice has been sent to the customer."})},onError:t=>{m({title:"Failed to send invoice",description:t.message||"An error occurred",variant:"destructive"})}}),Ie=D({mutationFn:async()=>b(`/api/businesses/${s}/invoices/${n}`,{method:"PATCH",body:JSON.stringify({status:"paid",paidAt:new Date().toISOString()})}),onSuccess:()=>{l.invalidateQueries({queryKey:["/api/businesses",s,"invoices",n]}),l.invalidateQueries({queryKey:["/api/businesses",s,"invoices"]}),m({title:"Invoice marked as paid",description:"Invoice status updated successfully."})},onError:t=>{m({title:"Failed to update invoice",description:t.message||"An error occurred",variant:"destructive"})}}),M=D({mutationFn:async t=>{const i={type:"income",category:"sales",amount:t.amount,description:`Payment for invoice ${a?.invoiceNumber}`,transactionDate:t.transactionDate,paymentMethod:t.paymentMethod,invoiceId:n,customerId:a?.customerId};t.notes&&(i.metadata={notes:t.notes});const c=await b(`/api/businesses/${s}/transactions`,{method:"POST",body:JSON.stringify(i)}),Ce=A.filter(P=>P.type==="income"&&P.invoiceId===n).reduce((P,De)=>P+parseFloat(De.amount),0)+parseFloat(t.amount),Pe=parseFloat(a?.totalAmount||"0"),z=Ce>=Pe?"paid":"sent";return await b(`/api/businesses/${s}/invoices/${n}`,{method:"PATCH",body:JSON.stringify({status:z,paidAt:z==="paid"?new Date().toISOString():void 0})}),c},onSuccess:()=>
1{l.invalidateQueries({queryKey:["/api/businesses",s,"invoices",n]}),l.invalidateQueries({queryKey:["/api/businesses",s,"invoices"]}),l.invalidateQueries({queryKey:["/api/businesses",s,"transactions"]}),m({title:"Payment recorded",description:"Payment has been recorded successfully."}),I(!1)},onError:t=>{m({title:"Failed to record payment",description:t.message||"An error occurred",variant:"destructive"})}}),f=W({defaultValues:{amount:"",paymentMethod:"bank_transfer",transactionDate:new Date().toISOString().split("T")[0],notes:""}});if(be)return e.jsx("div",{className:"flex-1 flex items-center justify-center",children:e.jsx("div",{className:"text-muted-foreground",children:"Loading invoice..."})});if(!a)return e.jsxs("div",{className:"flex-1 flex flex-col items-center justify-center gap-4",children:[e.jsx("div",{className:"text-muted-foreground",children:"Invoice not found"}),e.jsx(r,{onClick:()=>N(`/business/${s}/finance/invoices`),"data-testid":"button-back-to-invoices",children:"Back to Invoices"})]});const Q=a.items||[],Se=Q.reduce((t,i)=>t+(parseFloat(String(i?.total??i?.amount??0))||0),0),H=parseFloat(a.subtotal||"0"),k=parseFloat(a.amount||"0"),U=parseFloat(a.taxAmount||"0"),B=parseFloat(a.discountAmount||"0"),L=parseFloat(a.totalAmount||"0"),C=L>0?L:H>0?H:k>0?k:Se,R=A.filter(t=>t.type==="income"&&t.invoiceId===n).reduce((t,i)=>t+parseFloat(i.amount),0),V=parseFloat(a.amountPaid||"0"),J=R>0?R:V>0?V:a.status==="paid"?C:0,_=Math.max(0,C-J),q=A.filter(t=>t.type==="income");return e.jsxs("div",{className:"flex-1 flex flex-col gap-6 p-8",children:[e.jsx(Te,{department:"FINANCE",title:a.invoiceNumber||"Invoice",subtitle:"Invoice Details",actions:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(r,{onClick:()=>we.mutate(),"data-testid":"button-send-invoice",children:[e.jsx(Ee,{className:"bg-white/20 text-white hover:bg-white/30 border-white/20"}),"Send Invoice"]}),e.jsxs(r,{onClick:()=>I(!0),"data-testid":"button-record-payment",children:[e.jsx(Qe,{className:"bg-white/20 text-white hover:bg-white/30 border-white/20"}),"Record Payment"]}),e.jsxs(r,{onClick:()=>Ie.mutate(),variant:"outline","data-testid":"button-mark-paid",children:[e.jsx(O,{className:"bg-white/20 text-white hover:bg-white/30 border-white/20"}),"Mark as Paid"]}),e.jsxs(r,{variant:"outline",onClick:()=>w(!0),"data-testid":"button-edit-invoice",children:[e.jsx(He,{className:"bg-white/20 text-white hover:bg-white/30 border-white/20"}),"Edit"]}),e.jsxs(r,{variant:"outline","data-testid":"button-print",children:[e.jsx(Ue,{className:"bg-white/20 text-white hover:bg-white/30 border-white/20"}),"Print"]})]}),compact:!0}),e.jsxs("div",{className:"grid grid-cols-3 gap-4",children:[e.jsxs(x,{children:[e.jsxs(u,{className:"flex flex-row items-center justify-between gap-1 space-y-0 pb-2",children:[e.jsx(h,{className:"text-sm font-medium",children:"Total Amount"}),e.jsx(Be,{className:"h-4 w-4 text-muted-foreground"})]}),e.jsxs(p,{children:[e.jsxs("div",{className:"text-2xl font-bold","data-testid":"text-total-amount",children:["$",C.toLocaleString()]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Invoice total"})]})]}),e.jsxs(x,{children:[e.jsxs(u,{className:"flex flex-row items-center justify-between gap-1 space-y-0 pb-2",children:[e.jsx(h,{className:"text-sm font-medium",children:"Amount Paid"}),e.jsx(O,{className:"h-4 w-4 text-green-600"})]}),e.jsxs(p,{children:[e.jsxs("div",{className:"text-2xl font-bold text-green-600","data-testid":"text-amount-paid",children:["$",J.toLocaleString()]}),e.jsxs("p",{className:"text-xs text-muted-foreground",children:[q.length," payments"]})]})]}),e.jsxs(x,{children:[e.jsxs(u,{className:"flex flex-row items-center justify-between gap-1 space-y-0 pb-2",children:[e.jsx(h,{className:"text-sm font-medium",children:"Amount Due"}),e.jsx(Le,{className:"h-4 w-4 text-yellow-600"})]}),e.jsxs(p,{children:[e.jsxs("div",{className:"text-2xl font-bold text-yellow-600","data-testid":"text-amount-due",children:["$",_.toLocaleString()]}),e.jsx("p",{className:"text-xs text-muted-foreground",children:"Outstanding balance"})]})]})]}),e.jsxs("div",{className:"grid grid-cols-2 gap-6",children:[e.jsxs(x,{children:[e.jsx(u,{children:e.jsx(h,{children:"Invoice Information"})}),e.jsx(p,{className:"space-y-4",children:e.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-muted-foreground",children:"Invoice Number"}),e.jsx("p",{className:"text-sm font-semibold","data-testid":"text-invoice-info-number",children:a.invoiceNumber})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-muted-foreground",children:"Status"}),e.jsx("div",{"data-testid":"text-invoice-info-status",children:ze(a.status)})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-muted-foreground",children:"Issue Date"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ve,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("p",{className:"text-sm","data-testid":"text-issue-date",children:F(new Date(a.createdAt),"MMM dd, yyyy")})]})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-muted-foreground",children:"Due Date"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(ve,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("p",{className:"text-sm","data-testid":"text-due-date",children:a.dueDate?F(new Date(a.dueDate),"MMM dd, yyyy"):"Not set"})]})]}),a.paidAt&&e.jsxs("div",{className:"col-span-2",children:[e.jsx("p",{className:"text-sm font-medium text-muted-foreground",children:"Paid Date"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(O,{className:"h-4 w-4 text-green-600"}),e.jsx("p",{className:"text-sm","data-testid":"text-paid-date",children:F(new Date(a.paidAt),"MMM dd, yyyy")})]})]})]})})]}),e.jsxs(x,{children:[e.jsx(u,{children:e.jsx(h,{children:"Customer Information"})}),e.jsxs(p,{className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-muted-foreground",children:"Customer Name"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Re,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("p",{className:"text-sm font-semibold","data-testid":"text-customer-name",children:v?Ne(v):"N/A"})]})]}),v&&E(v)&&e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-muted-foreground",children:"Email"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Ve,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("p",{className:"text-sm","data-testid":"text-customer-email",children:E(v)})]})]}),v?.companyId&&(()=>{const t=$.find(i=>i.id===v.companyId);return t?e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-muted-foreground",children:"Company"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Je,{className:"h-4 w-4 text-muted-foreground"}),e.jsx("p",{className:"text-sm","data-testid":"text-customer-company",children:t.name})]})]}):null})()]})]})]}),e.jsxs(x,{children:[e.jsx(u,{children:e.jsx(h,{children:"Line Items"})}),e.jsx(p,{children:e.jsxs(pe,{children:[e.jsx(je,{children:e.jsxs(j,{children:[e.jsx(y,{children:"Description"}),e.jsx(y,{className:"text-right",children:"Quantity"}),e.jsx(y,{className:"text-right",children:"Unit Price"}),e.jsx(y,{className:"text-right",children:"Total"})]})}),e.jsxs(ye,{children:[Q.map((t,i)=>e.jsxs(j,{"data-testid":`row-line-item-${i}`,children:[e.jsx(d,{"data-testid":`text-item-description-${i}`,children:t.description}),e.jsx(d,{className:"text-right","data-testid":`text-item-quantity-${i}`,children:t.quantity}),e.jsxs(d,{className:"text-right","data-testid":`text-item-price-${i}`,children:["$",parseFloat(t.unitPrice||"0").toFixed(2)]}),e.jsxs(d,{className:"text-right font-semibold","data-testid":`text-item-total-${i}`,children:["$",parseFloat(t.total||"0").toFixed(2)]})]},i)),e.jsxs(j,{children:[e.jsx(d,{colSpan:3,className:"text-right font-medium",children:"Subtotal"}),e.jsxs(d,{className:"text-right font-semibold","data-testid":"text-subtotal",children:["$",k.toFixed(2)]})]}),U>0&&e.jsxs(j,{children:[e.jsx(d,{colSpan:3,className:"text-right font-medium",children:"Tax"}),e.jsxs(d,{className:"text-right font-semibold","data-testid":"text-tax",children:["$",U.toFixed(2)]})]}),B>0&&e.jsxs(j,{children:[e.jsx(d,{colSpan:3,className:"text-right font-medium",children:"Discount"}),e.jsxs(d,{className:"text-right font-semibold text-green-600","data-testid":"text-discount",children:["-$",B.toFixed(2)]})]}),e.jsxs(j,{children:[e.jsx(d,{colSpan:3,className:"text-right text-lg font-bold",children:"Total Amount"}),e.jsxs(d,{className:"text-right text-lg font-bold","data-testid":"text-final-total",children:["$",C.toFixed(2)]})]})]})]})})]}),q.length>0&&e.jsxs(x,{children:[e.jsx(u,{children:e.jsx(h,{children:"Payment History"})}),e.jsx(p,{children:e.jsxs(pe,{children:[e.jsx(je,{children:e.jsxs(j,{children:[e.jsx(y,{children:"Date"}),e.jsx(y,{children:"Payment Method"}),e.jsx(y,{children:"Amount"}),e.jsx(y,{children:"Notes"})]})}),e.jsx(ye,{children:q.map(t=>e.jsxs(j,{"data-testid":`row-payment-${t.id}`,children:[e.jsx(d,{"data-testid":`text-payment-date-${t.id}`,children:F(new Date(t.transactionDate),"MMM dd, yyyy")}),e.jsx(d,{"data-testid":`text-payment-method-${t.id}`,children:t.paymentMethod||"N/A"}),e.jsxs(d,{className:"font-semibold","data-testid":`text-payment-amount-${t.id}`,children:["$",parseFloat(t.amount||"0").toFixed(2)]}),e.jsx(d,{"data-testid":`text-payment-notes-${t.id}`,children:t.metadata?.notes||t.description||"-"})]},t.id))})]})})]}),a.notes&&e.jsxs(x,{children:[e.jsx(u,{children:e.jsx(h,{children:"Notes"})}),e.jsx(p,{children:e.jsx("p",{className:"text-sm","data-testid":"text-invoice-notes",children:a.notes})})]}),e.jsx(X,{open:fe,onOpenChange:w,children:e.jsxs(Y,{"data-testid":"dialog-edit-invoice",children:[e.jsxs(Z,{children:[e.jsx(ee,{children:"Edit Invoice"}),e.jsx(te,{children:"Update invoice details"})]}),e.jsx(Me,{...S,children:e.jsxs("form",{onSubmit:S.handleSubmit(t=>T.mutate(t)),className:"space-y-4",children:[e.jsx(se,{control:S.control,name:"status",render:({field:t})=>e.jsxs(ae,{children:[e.jsx(ie,{children:"Status"}),e.jsxs(ne,{onValueChange:t.onChange,value:t.value,children:[e.jsx(de,{children:e.jsx(re,{"data-testid":"select-status",children:e.jsx(oe,{})})}),e.jsxs(ce,{children:[e.jsx(o,{value:"draft",children:"Draft"}),e.jsx(o,{value:"sent",children:"Sent"}),e.jsx(o,{value:"paid",children:"Paid"}),e.jsx(o,{value:"overdue",children:"Overdue"}),e.jsx(o,{value:"cancelled",children:"Cancelled"})]})]}),e.jsx(le,{})]})}),e.jsx(se,{control:S.control,name:"notes",render:({field:t})=>e.jsxs(ae,{children:[e.jsx(ie,{children:"Notes"}),e.jsx(de,{children:e.jsx(me,{...t,"data-testid":"input-notes"})}),e.jsx(le,{})]})}),e.jsxs(xe,{children:[e.jsx(r,{type:"button",variant:"outline",onClick:()=>w(!1),"data-testid":"button-cancel-edit",children:"Cancel"}),e.jsx(r,{type:"submit",disabled:T.isPending,"data-testid":"button-save-changes",children:T.isPending?"Saving...":"Save Changes"})]})]})})]})}),e.jsx(X,{open:ge,onOpenChange:I,children:e.jsxs(Y,{"data-testid":"dialog-record-payment",children:[e.jsxs(Z,{children:[e.jsx(ee,{children:"Record Payment"}),e.jsxs(te,{children:["Record a payment for this invoice. Amount due: $",_.toFixed(2)]})]}),e.jsxs("form",{onSubmit:f.handleSubmit(t=>M.mutate(t)),className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{className:"text-sm font-medium",children:"Amount"}),e.jsx(ue,{type:"number",step:"0.01",placeholder:"0.00",...f.register("amount"),"data-testid":"input-payment-amount"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{className:"text-sm font-medium",children:"Payment Method"}),e.jsxs(ne,{value:f.watch("paymentMethod"),onValueChange:t=>f.setValue("paymentMethod",t),children:[e.jsx(re,{"data-testid":"select-payment-method",children:e.jsx(oe,{})}),e.jsxs(ce,{children:[e.jsx(o,{value:"bank_transfer",children:"Bank Transfer"}),e.jsx(o,{value:"credit_card",children:"Credit Card"}),e.jsx(o,{value:"check",children:"Check"}),e.jsx(o,{value:"cash",children:"Cash"}),e.jsx(o,{value:"other",children:"Other"})]})]})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{className:"text-sm font-medium",children:"Payment Date"}),e.jsx(ue,{type:"date",...f.register("transactionDate"),"data-testid":"input-payment-date"})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{className:"text-sm font-medium",children:"Notes (Optional)"}),e.jsx(me,{placeholder:"Payment notes...",...f.register("notes"),"data-testid":"input-payment-notes"})]}),e.jsxs(xe,{children:[e.jsx(r,{type:"button",variant:"outline",onClick:()=>I(!1),"data-testid":"button-cancel-payment",children:"Cancel"}),e.jsx(r,{type:"submit",disabled:M.isPending,"data-testid":"button-submit-payment",children:M.isPending?"Recording...":"Record Payment"})]})]})]})})]})}export{at 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.