PageSourceSearch

https://www.logistap.com/assets/FinanceCenter-B1YmXP8Z.js

js logistap.com collected 2026-10-02 01:35:32 UTC 10,353 bytes, 1 lines download raw bytes

1import{g as U,i as z,b as w,j as e}from"./index-CkAxGocv.js";import{u as K,r as l}from"./i18n-vendor-Co-krN6G.js";import{a as W,L as V,E as Z}from"./Feedback-DlkCcoCE.js";import{a as G,b as H,f as J,d as Q,c as D}from"./companyFinance-Cy-kVkZF.js";import{f as X,h as Y,g as ee}from"./transactions-BipItEb4.js";import{W as te}from"./wallet-cards-xnJr65BH.js";import{B as ae}from"./banknote-CS0Js15q.js";import{C as se}from"./calendar-clock-CeWo-FHZ.js";import{U as re}from"./users-Ca2mGkUt.js";import{C as ne}from"./circle-alert-ENI3C5U8.js";import{L as $}from"./react-vendor-D5E1hOjb.js";import{A as B}from"./arrow-up-right-CQ-vdLu5.js";import{B as oe}from"./building-2-cUnDNkc8.js";import{R as ie}from"./receipt-text-DrkvIWrT.js";import{F as le}from"./file-text-DDMr4pQb.js";import"./supabase-vendor-Co_IX6oM.js";import"./loader-circle-BnjBO311.js";import"./createLucideIcon-BPd9wT8k.js";import"./x-vmD7m2IU.js";import"./info-DPZ067dm.js";import"./circle-check-Doi6ea3z.js";import"./refresh-cw-BvuhVw-0.js";import"./permissionGuard-BRj1WUDY.js";import"./employeeData-C8aL7inU.js";import"./fileUploadPolicy-Dsb_MFV2.js";import"./browserCache-CpZow4D-.js";const ce={amber:"border-amber-200 bg-amber-50 text-amber-700 dark:border-amber-900/70 dark:bg-amber-950/30 dark:text-amber-300",red:"border-red-200 bg-red-50 text-red-700 dark:border-red-900/70 dark:bg-red-950/30 dark:text-red-300",violet:"border-violet-200 bg-violet-50 text-violet-700 dark:border-violet-900/70 dark:bg-violet-950/30 dark:text-violet-300"};function $e(){const{i18n:u,t:f}=K(),t=l.useCallback(a=>String(f(`terms.${a}`,{defaultValue:a})),[f]),b=u.language.startsWith("ar"),n=U(),x=z(n),i=x||w(n==null?void 0:n.permissions,"company_finance"),p=x||w(n==null?void 0:n.permissions,"transaction"),q=x||w(n==null?void 0:n.permissions,"invoice_maker"),[r,C]=l.useState(null),[F,E]=l.useState([]),[S,T]=l.useState(!1),[A,R]=l.useState(!1),[v,I]=l.useState(!0),k=l.useCallback(async()=>{I(!0);const a=i?Promise.all([G(),H(),J(),Q()]):Promise.resolve(null),c=p?X():Promise.resolve(null),[d,m]=await Promise.allSettled([a,c]);if(d.status==="fulfilled"){const o=d.value;C(o?{accounts:o[0],dashboard:o[1],dues:o[2],transactions:o[3]}:null),T(!1)}else C(null),T(!0);m.status==="fulfilled"?(E(m.value??[]),R(!1)):(E([]),R(!0)),I(!1)},[i,p]);l.useEffect(()=>{k();const a=()=>void k();return window.addEventListener(D,a),()=>window.removeEventListener(D,a)},[k]);const P=l.useMemo(()=>new Intl.NumberFormat(b?"ar-SA-u-nu-latn":"en-US",{maximumFractionDigits:2,minimumFractionDigits:0}),[b]),h=a=>`${P.format(a)} ${b?"ر.س":"SAR"}`,M=(r==null?void 0:r.accounts.reduce((a,c)=>a+c.balance,0))??0,y=F.filter(Y),j=ee(F),_=l.useMemo(()=>{const a=[],c=(r==null?void 0:r.dues)??[],d=c.filter(s=>s.commitmentKind==="Rent"&&s.dueStatus==="Overdue");d.length>0&&a.push({amount:d.reduce((s,g)=>
1s+g.remainingAmount,0),count:d.length,description:d[0].commitmentTitle,label:t("Overdue rent"),path:"/finance/company/commitments",tone:"red"});const m=c.filter(s=>s.commitmentKind==="Bill"&&s.dueStatus==="Due Today");m.length>0&&a.push({amount:m.reduce((s,g)=>s+g.remainingAmount,0),count:m.length,description:m[0].commitmentTitle,label:t("Bill due today"),path:"/finance/company/commitments",tone:"red"});const o=c.filter(s=>s.commitmentKind==="Installment"&&s.remainingAmount>0&&s.daysToDue>=0&&s.dueStatus!=="Paid"&&s.dueStatus!=="Cancelled").sort((s,g)=>s.daysToDue-g.daysToDue);o.length>0&&a.push({amount:o[0].remainingAmount,count:o.length,description:o[0].commitmentTitle,label:t("Upcoming installment"),path:"/finance/company/commitments",tone:"amber"}),y.length>0&&a.push({amount:j,count:y.length,description:t("Employee payments are waiting to be settled."),label:t("Pending employee transaction"),path:"/finance/employee/transactions",tone:"violet"});const L=(r==null?void 0:r.transactions.filter(s=>s.status==="Draft").length)??0;return L>0&&a.push({count:L,description:t("Review and post or discard incomplete finance drafts."),label:t("Finance action requires attention"),path:"/finance/company/transactions",tone:"amber"}),a.slice(0,5)},[r,j,y.length,t]),O=[{label:t("Company Balance"),value:i&&r?h(M):"-",description:t("Current balance across cash and bank accounts."),Icon:te,tone:"text-emerald-600 bg-emerald-50 border-emerald-200 dark:bg-emerald-950/30 dark:border-emerald-900"},{label:t("Monthly Net Cash Flow"),value:i&&r?h(r.dashboard.netCashFlow):"-",description:t("This month's company income minus expense."),Icon:ae,tone:"text-blue-600 bg-blue-50 border-blue-200 dark:bg-blue-950/30 dark:border-blue-900"},{label:t("Overdue Payments"),value:i&&r?h(r.dashboard.overdueAmount):"-",description:i?r?`${r.dashboard.overdueDueCount} ${t("overdue items")}`:t(S?"Finance data unavailable.":"Loading..."):t("Company Finance access required."),Icon:se,tone:"text-red-600 bg-red-50 border-red-200 dark:bg-red-950/30 dark:border-red-900"},{label:t("Pending Employee Transactions"),value:p?h(j):"-",description:p?A?t("Finance data unavailable."):v?t("Loading..."):`${y.length} ${t("pending items")}`:t("Employee Finance access required."),Icon:re,tone:"text-violet-600 bg-violet-50 border-violet-200 dark:bg-violet-950/30 dark:border-violet-900"}];return e.jsx("section",{className:"ars-page min-h-full bg-slate-50/80 p-4 dark:bg-slate-950 sm:p-6",children:e.jsxs("div",{className:"mx-auto w-full max-w-[1500px] space-y-5",children:[e.jsx("header",{className:"flex flex-wrap items-end justify-between gap-3 border-b border-slate-200 pb-4 dark:border-slate-800",children:e.jsxs("div",{children:[e.jsx("p",{className:"text-[11px] font-black uppercase text-emerald-600",children:t("Finance Center")}),e.jsx("h1",{className:"mt-1 text-2xl font-black text-slate-950 dark:text-white sm:text-3xl",children:t("Finance Overview")}),e.jsx("p",{className:"mt-1 text-sm font-semibold text-slate-500",children:t("Company and employee finance priorities in one place.")})]})}),(S||A)&&e.jsx(W,{compact:!0,title:t("Some finance data could not be loaded."),message:t("Check the connection and retry the overview."),onRetry:()=>void k(),isRetrying:v,retryLabel:t("Retry")}),e.jsx("div",{className:"grid gap-3 sm:grid-cols-2 xl:grid-cols-4",children:O.map(({label:a,value:c,description:d,Icon:m,tone:o})=>e.jsxs("article",{className:"min-w-0 rounded-lg border border-slate-200 bg-white p-4 dark:border-slate-800 dark:bg-slate-900",children:[e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("p",{className:"text-xs font-black text-slate-500",children:a}),e.jsx("p",{className:"mt-2 break-words text-xl font-black text-slate-950 dark:text-white",children:v?"...":c})]}),e.jsx("span",{className:`flex h-9 w-9 shrink-0 items-center justify-center rounded-lg border ${o}`,children:e.jsx(m,{size:18})})]}),e.jsx("p",{className:"mt-2 text-xs font-semibold leading-5 text-slate-400",children:d})]},a))}),e.jsxs("section",{className:"rounded-lg border border-slate-200 bg-white dark:border-slate-800 dark:bg-slate-900",children:[e.jsxs("div",{className:"flex items-center gap-2 border-b border-slate-100 px-4 py-3 dark:border-slate-800",children:[e.jsx(ne,{size:17,className:"text-amber-500"}
1),e.jsx("h2",{className:"text-sm font-black text-slate-950 dark:text-white",children:t("Action Required")})]}),v?e.jsx(V,{compact:!0,className:"m-4",label:t("Loading finance priorities...")}):_.length===0?e.jsx(Z,{compact:!0,title:t("No finance action requires attention.")}):e.jsx("div",{className:"divide-y divide-slate-100 dark:divide-slate-800",children:_.map(a=>e.jsxs($,{to:a.path,className:"flex min-w-0 items-center gap-3 px-4 py-3 transition hover:bg-slate-50 dark:hover:bg-slate-800/60",children:[e.jsx("span",{className:`flex h-8 min-w-8 shrink-0 items-center justify-center rounded-lg border px-2 text-xs font-black ${ce[a.tone]}`,children:a.count}),e.jsxs("span",{className:"min-w-0 flex-1",children:[e.jsx("span",{className:"block truncate text-sm font-black text-slate-900 dark:text-white",children:a.label}),e.jsx("span",{className:"block truncate text-xs font-semibold text-slate-400",children:a.description})]}),a.amount!==void 0&&e.jsx("span",{className:"shrink-0 text-xs font-black text-slate-700 dark:text-slate-200",children:h(a.amount)}),e.jsx(B,{size:16,className:"shrink-0 text-slate-400"})]},`${a.label}-${a.path}`))})]}),e.jsxs("div",{className:"grid gap-3 lg:grid-cols-3",children:[e.jsx(N,{canOpen:i,description:t("Income, expenses, commitments, assets, inventory, alerts, and balances."),Icon:oe,label:t("Company Finance"),noAccessLabel:t("Company Finance access required."),to:"/finance/company"}),e.jsx(N,{canOpen:p,description:t("Employee transactions, payments, balances, and paid history."),Icon:ie,label:t("Employee Finance"),noAccessLabel:t("Employee Finance access required."),to:"/finance/employee/transactions"}),e.jsx(N,{canOpen:q,description:t("Platform-based B2B invoices, drafted here and cleared through ZATCA."),Icon:le,label:t("Invoice Maker"),noAccessLabel:t("Invoice Maker access required."),to:"/finance/invoices"})]})]})})}function N({canOpen:u,description:f,Icon:t,label:b,noAccessLabel:n,to:x}){const i=e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"flex h-10 w-10 items-center justify-center rounded-lg border border-emerald-200 bg-emerald-50 text-emerald-700 [grid-area:icon] dark:border-emerald-900 dark:bg-emerald-950/30 dark:text-emerald-300",children:e.jsx(t,{size:19})}),u&&e.jsx(B,{size:18,className:"text-slate-400 [grid-area:arrow]"}),e.jsx("h2",{className:"text-sm font-black text-slate-950 [grid-area:title] dark:text-white sm:mt-4 sm:text-base",children:b}),e.jsx("p",{className:"mt-0.5 text-xs font-semibold leading-5 text-slate-500 [grid-area:desc] dark:text-slate-400 sm:mt-1",children:u?f:n})]}),p=`grid grid-cols-[auto_minmax(0,1fr)_auto] items-start gap-x-3 rounded-lg border bg-white p-3.5 [grid-template-areas:'icon_title_arrow'_'icon_desc_arrow'] dark:bg-slate-900 sm:grid-cols-[minmax(0,1fr)_auto] sm:p-5 sm:[grid-template-areas:'icon_arrow'_'title_title'_'desc_desc'] ${u?"border-slate-200 transition hover:border-emerald-300 hover:shadow-md dark:border-slate-800 dark:hover:border-emerald-800":"cursor-not-allowed border-slate-200 opacity-60 dark:border-slate-800"}`;return u?e.jsx($,{to:x,className:p,children:i}):e.jsx("div",{className:p,children:i})}export{$e 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.