1import{c as N,k,j as e}from"./react-CZnA0W6t.js";import{m3 as S,m4 as b,Y as d,m5 as c,aB as v,kv as C,ao as m,B as y,aR as E,m6 as R,m7 as A,m8 as D}from"./index-tPF9c8DN.js";import{E as u,L as x,A as g}from"./widgets-DOtWC6L5.js";import{H as T}from"./HeldPayoutsPanel-C30kF4PH.js";import{g as q,s as F,r as L,a as B}from"./opsAdmin-IyV34vMZ.js";/* empty css */import"./firebase-BX4oiCIK.js";import"./MenuContainer-CXKyQN9z.js";/* empty css */import"./LoadError-BMk3NQk6.js";const p="Money";function o(h){return h?E(h,!0):"â"}function f({title:h,run:t}){const r=R(t),i=A(t);return e.jsxs("div",{className:"hm-card",children:[e.jsx("h2",{children:h}),e.jsx("p",{children:D(t)}),t&&t.ranAt?e.jsxs("p",{className:"hm-small hm-muted",children:["Ran ",c(t.ranAt)]}):null,r.length?e.jsx("ul",{className:"ops-lines",children:r.map((a,n)=>e.jsxs("li",{className:"ops-error",children:[a.outcome," · ",a.ref," · ",d(a.amount||0),a.location?" · "+a.location:"",a.email?" · "+a.email:"",a.detail?" · "+a.detail:""]},n))}):null,i.length?e.jsx("ul",{className:"ops-lines hm-muted",children:i.map((a,n)=>e.jsxs("li",{children:[a.outcome," · ",a.ref,a.email?" · "+a.email:"",a.detail?" · "+a.detail:""]},n))}):null]})}function j({title:h,stays:t,columns:r,empty:i}){return e.jsxs("div",{className:"hm-card",children:[e.jsxs("h2",{children:[h," (",(t||[]).length,")"]}),(t||[]).length?e.jsx("div",{className:"ops-scroll",children:e.jsxs("table",{className:"hm-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"Payment group"}),e.jsx("th",{children:"Listing"}),e.jsx("th",{children:"Guest"}),e.jsx("th",{children:"First night"}),e.jsx("th",{className:"hm-num",children:"Nights"}),e.jsx("th",{className:"hm-num",children:"Amount"}),r.map(a=>e.jsx("th",{children:a.label},a.key))]})}),e.jsx("tbody",{children:t.map(a=>e.jsxs("tr",{children:[e.jsx("td",{children:e.jsx("code",{children:a.paymentGroup})}),e.jsx("td",{children:a.locationName}),e.jsx("td",{children:a.guestEmail}),e.jsx("td",{children:o(a.firstNight)}),e.jsx("td",{className:"hm-num",children:a.nights}),e.jsx("td",{className:"hm-num",children:d(a.amount||0)}),r.map(n=>e.jsx("td",{children:n.render(a)},n.key))]},a.paymentGroup||(a.uids||[]).join(",")))})]})}):e.jsx("p",{className:"hm-muted",children:i})]})}class O extends k.Component{constructor(t){super(t),this.state={loading:!0,error:null,data:null,q:"",searching:!1,searchError:null,search:null,confirm:null,retrying:!1,retryResult:null,retryError:null,digestOpen:!1,digest:null,digestError:null}}componentDidMount(){this.alive=!0,this.load()}componentWillUnmount(){this.alive=!1}load=()=>{this.setState({loading:!0,error:null}),q().then(t=>this.alive&&this.setState({loading:!1,data:t||{}})).catch(t=>this.alive&&this.setState({loading:!1,error:t}))};search=t=>{t&&t.preventDefault();const r=this.state.q.trim();r&&(this.setState({searching:!0,searchError:null}),F(r).then(i=>this.alive&&this.setState({searching:!1,search:i||{bookings:[]}})).catch(i=>this.alive&&this.setState({searching:!1,searchError:i})))};retry=()=>{const t=this.state.confirm;this.setState({retrying:!0,retryError:null}),L(t.chargeId).then(r=>this.alive&&this.setState({retrying:!1,confirm:null,retryResult:`Retry queued for ${t.chargeId} (${(r&&r.uids||t.uids||[]).length} nights). Refresh in a minute to see it clear.`})).catch(r=>this.alive&&this.setState({retrying:!1,retryError:r}))};toggleDigest=()=>{const t=!this.state.digestOpen;this.setState({digestOpen:t}),t&&!this.state.digest&&B().then(r=>this.alive&&this.setState({digest:r||{}})).catch(r=>this.alive&&this.setState({digestError:r}))};renderSearch(){const{q:t,searching:r,searchError:i,search:a}=this.state,n=a&&a.bookings||[];return e.jsxs("div",{className:"hm-card",children:[e.jsx("h2",{children:"Find a booking"}),e.jsxs("form",{className:"ops-row",onSubmit:this.search,children:[e.jsx("input",{className:"form-control",type:"text",value:t,placeholder:"Booking uid, payment group or guest email","aria-label":"Search bookings",onChange:s=>this.setState({q:s.target.value})}),e.jsx("button",{type:"submit",className:"hm-btn",disabled:r||!t.trim(),children:"Search"})]}),e.jsx("p",{className:"hm-small hm-muted",children:S[b(t)]}),e.jsx(u,{error:i}),r?e.jsx(x,{}):null,a&&!r?n.length?e.jsxs("div",{className:"ops-scroll",children:[e.jsxs("p",{className:"hm-small",children:[n.length," night",n.length===1?"":"s"," (matched by ",a.kind,")"]}),e.jsxs("table",{className:"hm-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"Night"}),e.jsx("th",{children:"Uid"}),e.jsx("th",{children:"Group"}),e.jsx("th",{children:"Status"}),e.jsx("th",{children:"Payment"}),e.jsx("th",{children:"Listing / site"}),e.jsx("th",{children:"Guest"}),e.jsx("th",{className:"hm-num",children:"Paid"}),e.jsx("th",{className:"hm-num",children:"Host payout"}),e.jsx("th",{className:"hm-num",children:"Refunded"}),e.jsx("th",{children:"Charge due"}),e.jsx("th",{children:"Charged"}),e.jsx("th",{children:"Attempts / error"}),e.jsx("th",{children:"Charge / transfer"}),e.jsx("th",{children:"Payout"}),e.jsx("th",{children:"Hold"})]})}),e.jsx("tbody",{children:n.map(s=>e.jsxs("tr",{children:[e.jsx("td",{children:o(s.date)}),e.jsx("td",{children:e.jsx("code",{children:s.uid})}),e.jsx("td",{children:e.jsx("code",{children:s.paymentGroup||"â"})}),e.jsx("td",{children:s.status}),e.jsx("td",{children:s.paymentStatus||"paid at booking"}),e.jsxs("td",{children:[s.locationName,s.siteName?" / "+s.siteName:""]}),e.jsxs("td",{children:[s.guestName?s.guestName+" · ":"",s.guestEmail]}),e.jsx("td",{className:"hm-num",children:d(s.paid||0)}),e.jsx("td",{className:"hm-num",children:s.hostPayout!=null?d(s.hostPayout):"â"}),e.jsx("td",{className:"hm-num",children:s.refunded?d(s.refunded):"â"}),e.jsx("td",{children:o(s.chargeDue)}),e.jsx("td",{children:s.charged?c(s.charged):"â"}),e.jsxs("td",{children:[s.chargeAttempts||0,s.chargeError?e.jsxs("span",{className:"ops-error",children:[" · ",s.chargeError]}):null]}),e.jsxs("td",{className:"hm-small",children:[s.chargeReference||"â",e.jsx("br",{}),s.transferReference||""]}),e.jsxs("td",{className:"hm-small",children:[s.payoutDue?"due "+o(s.payoutDue):"â",s.paidOut?e.jsxs(e.Fragment,{children:[e.jsx("br",{}),"paid ",c(s.paidOut)]}
1):null,s.payoutTransferId?e.jsxs(e.Fragment,{children:[e.jsx("br",{}),s.payoutTransferId]}):null]}),e.jsxs("td",{className:"hm-small",children:[s.holdStatus?`${s.holdStatus} ${d(s.holdAmount||0)}`:"â",s.holdCaptureBefore?e.jsxs(e.Fragment,{children:[e.jsx("br",{}),"capture by ",c(s.holdCaptureBefore)]}):null]})]},s.uid))})]})]}):e.jsxs("p",{children:['No bookings match "',a.query,'".']}):null]})}renderTransfers(t){return e.jsxs("div",{className:"hm-card",children:[e.jsxs("h2",{children:["Failed transfers (",t.length,")"]}),e.jsx("p",{className:"hm-small hm-muted",children:"Charged at booking (the old pay-at-booking flow) but the host transfer never happened. Retry queues the existing transfer-retry task for that one charge. Check the Stripe dashboard first."}),this.state.retryResult?e.jsx("p",{className:"ops-ok",role:"status",children:this.state.retryResult}):null,t.length?e.jsx("div",{className:"ops-scroll",children:e.jsxs("table",{className:"hm-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"Charge"}),e.jsx("th",{children:"Listing"}),e.jsx("th",{children:"Guest"}),e.jsx("th",{children:"First night"}),e.jsx("th",{className:"hm-num",children:"Nights"}),e.jsx("th",{className:"hm-num",children:"Paid"}),e.jsx("th",{children:"Booked"}),e.jsx("th",{})]})}),e.jsx("tbody",{children:t.map(r=>e.jsxs("tr",{children:[e.jsx("td",{children:e.jsx("code",{children:r.chargeId})}),e.jsx("td",{children:r.locationName}),e.jsx("td",{children:r.guestEmail}),e.jsx("td",{children:o(r.firstNight)}),e.jsx("td",{className:"hm-num",children:r.nights}),e.jsx("td",{className:"hm-num",children:d(r.paid||0)}),e.jsx("td",{children:r.created?c(r.created):"â"}),e.jsx("td",{children:e.jsx("button",{type:"button",className:"hm-btn hm-btn-secondary",onClick:()=>this.setState({confirm:r,retryError:null,retryResult:null}),children:"Retry"})})]},r.chargeId))})]})}):e.jsx("p",{className:"hm-muted",children:"No failed transfers."})]})}renderDigest(){const{digestOpen:t,digest:r,digestError:i}=this.state;return e.jsxs("div",{className:"hm-card",children:[e.jsx("h2",{children:e.jsxs("button",{type:"button",className:"hm-link","aria-expanded":t,onClick:this.toggleDigest,children:[t?"â¾":"â¸"," Ops digest preview"]})}),t?e.jsxs("div",{children:[e.jsx(u,{error:i}),!r&&!i?e.jsx(x,{}):null,r?e.jsxs("div",{children:[e.jsxs("p",{className:"hm-small",children:["Email digest: ",e.jsx("strong",{children:r.enabled?"enabled":"disabled"})," (campable.ops.digest.enabled). This preview never sends anything."]}),r.subject?e.jsx("p",{children:e.jsx("strong",{children:r.subject})}):null,e.jsx("pre",{className:"ops-pre",children:r.text||""})]}):null]}):null]})}render(){const t=this.props.user;if(!t)return e.jsx(g,{className:"admin-type",title:p,children:e.jsx(x,{})});if(!v(t)||C(t))return e.jsx(g,{className:"admin-type",title:p,children:e.jsx("p",{children:"You need to be an administrator to see this page."})});const{loading:r,error:i,data:a,confirm:n}=this.state,s=a||{};return e.jsxs(g,{className:"admin-type",title:p,children:[e.jsxs("p",{className:"hm-intro",children:["Deferred payments: guests are charged 14 days before the stay (daily run, 7am NZ); hosts are paid on the 15th of the month after. Read-only apart from retrying a failed transfer."," ",e.jsx("button",{type:"button",className:"hm-link",onClick:this.load,children:"Refresh"})]}),this.renderSearch(),e.jsx(u,{error:i}),r?e.jsx(x,{}):null,!r&&a?e.jsxs("div",{children:[s.truncated?e.jsx("p",{className:"ops-error",children:"Some lists were cut short; search for a specific booking to see everything."}):null,e.jsxs("div",{className:"ops-runs",children:[e.jsx(f,{title:"Last charge run",run:s.lastChargeRun}),e.jsx(f,{title:"Last payout run",run:s.lastPayoutRun})]}),e.jsx(j,{title:"Charged today"+(s.today?" ("+o(s.today)+")":""),stays:s.chargedToday||[],empty:"Nothing charged today.",columns:[{key:"charged",label:"Charged",render:l=>c(l.charged)}]}),e.jsx(j,{title:"Charge failed",stays:s.chargeFailed||[],empty:"No failed charges.",columns:[{key:"due",label:"Charge date",render:l=>o(l.chargeDue)},{key:"att",label:"Attempts",render:l=>l.chargeAttempts||0},{key:"err",label:"Error",render:l=>e.jsx("span",{className:"ops-error",children:l.chargeError||"â"})}]}),e.jsx(j,{title:"Scheduled charges",stays:s.scheduled||[],empty:"No charges scheduled.",columns:[{key:"due",label:"Charge date",render:l=>o(l.chargeDue)}]}),e.jsx(j,{title:"Card holds",stays:s.holds||[],empty:"No card holds.",columns:[{key:"hs",label:"Hold",render:l=>(l.holdStatus||"â")+" "+d(l.holdAmount||0)},{key:"cb",label:"Capture before",render:l=>c(l.holdCaptureBefore)},{key:"re",label:"Request expires",render:l=>c(l.requestExpires)}]}),e.jsx(T,{}),this.renderTransfers(s.failedTransfers||[])]}):null,this.renderDigest(),e.jsxs(m,{show:!!n,onHide:()=>!this.state.retrying&&this.setState({confirm:null}),children:[e.jsx(m.Header,{closeButton:!0,children:e.jsx(m.Title,{children:"Retry this transfer?"})}),e.jsxs(m.Body,{children:[n?e.jsxs("p",{children:["This queues a real Stripe transfer to the host of ",e.jsx("strong",{children:n.locationName})," for charge ",e.jsx("code",{children:n.chargeId})," (",d(n.paid||0)," paid by the guest, less fees). Only do this after checking in Stripe that no transfer exists for this charge."]}):null,e.jsx(u,{error:this.state.retryError})]}),e.jsxs(m.Footer,{children:[e.jsx(y,{onClick:()=>this.setState({confirm:null}),disabled:this.state.retrying,children:"Cancel"}),e.jsx(y,{bsStyle:"danger",onClick:this.retry,disabled:this.state.retrying,children:this.state.retrying?"Queuingâ¦":"Yes, retry the transfer"})]})]})]})}}const W=N(h=>({user:h.data.campableUser}))(O);export{O as AdminMoney,W 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.