1import{F as ue,r,b as me,o as pe,I as M,J as k,K as s,V as e,L as t,f,a0 as v,a1 as u,N as h,Q as D,a4 as W,C as F,U as B,T as X,O as fe,a8 as ve,ab as he,a2 as q}from"./index-DmMWFTlW.js";import{Q as _e}from"./QDate-D9COvH7O.js";import{Q as ge}from"./QPopupProxy-AWT6B6dI.js";import{Q as j,a as be}from"./QTable-WY2Tuy1f.js";import{Q as ye}from"./QSelect-Cm7KAHFZ.js";import{Q as we}from"./QSpace-DvkoovRP.js";import{Q as xe}from"./QPage-B13jEZvj.js";import{C as L}from"./ClosePopup-CqSTItjh.js";import{u as De}from"./use-quasar-DqtP9Las.js";import{e as Z}from"./export-file-BlQk-c_E.js";import"./use-render-cache-DLxPkVnQ.js";import"./date-CILjOVFa.js";import"./format-DyQxkAtJ.js";import"./QMenu-B3LFZvpl.js";import"./position-engine-D1Iga1eY.js";import"./selection-9CI4SQ0E.js";import"./QList-zMztYSyu.js";import"./QMarkupTable-CvRgMmbQ.js";import"./QChip-Bw_0mvxH.js";import"./QItem-RvHevyvj.js";import"./rtl-DFPa-2ov.js";const Ne={class:"row items-center q-mb-md"},Pe=e("div",{class:"col"},[e("div",{class:"text-h4 text-weight-bold text-primary"}," Attendance Dashboard "),e("div",{class:"text-subtitle1 text-grey-8"}," Monitor employee attendance and generate reports ")],-1),Ae={class:"col-auto"},Ce={class:"row q-col-gutter-md q-mb-lg"},Se={class:"col-12 col-sm-6 col-md-3"},$e={class:"row items-center"},Qe={class:"col"},qe=e("div",{class:"text-h6 text-grey-8"},"Total Employees",-1),Te={class:"text-h4 text-weight-bold text-primary"},Ve={class:"col-auto"},Ee={class:"col-12 col-sm-6 col-md-3"},Me={class:"row items-center"},ke={class:"col"},Fe=e("div",{class:"text-h6 text-grey-8"},"Present Today",-1),Be={class:"text-h4 text-weight-bold text-positive"},je={class:"col-auto"},Le={class:"col-12 col-sm-6 col-md-3"},Oe={class:"row items-center"},Re={class:"col"},Ue=e("div",{class:"text-h6 text-grey-8"},"Absent Today",-1),ze={class:"text-h4 text-weight-bold text-negative"},Ye={class:"col-auto"},Ie={class:"col-12 col-sm-6 col-md-3"},Je={class:"row items-center"},Ke={class:"col"},Ge=e("div",{class:"text-h6 text-grey-8"},"Active Devices",-1),He={class:"text-h4 text-weight-bold text-teal"},We={class:"col-auto"},Xe=e("div",{class:"text-h6"},"Filters & Actions",-1),Ze={class:"row q-col-gutter-md items-end"},et={class:"col-12 col-sm-4"},tt={class:"row items-center justify-end"},at={class:"col-12 col-sm-4"},lt={class:"col-12 col-sm-4"},st={class:"row items-center"},ot={class:"col"},nt=e("div",{class:"text-h6"},"Daily Attendance Log",-1),it={class:"text-caption text-grey"},ct={class:"col-auto"},dt=e("div",{class:"text-h6"},"Monthly Attendance Report",-1),rt={class:"row q-col-gutter-md q-mb-md"},ut={class:"col-12 col-sm-6 col-md-3"},mt={class:"col-12 col-sm-6 col-md-3"},pt={class:"col-12 col-sm-6 col-md-3"},ft={class:"col-12 col-sm-6 col-md-3"},vt={class:"text-h6"},ht={class:"row justify-between items-center q-mb-md"},_t={class:"col"},gt={class:"text-subtitle1"},bt={class:"col-auto"},yt={class:"text-weight-medium"},Ut={__name:"StaffAttendance",setup(wt){const m=De(),N=ue(),y=r({totalEmployees:0,totalPresent:0,totalAbsent:0,numberOfDevices:0}),c=r(""),P=r([]),T=r(!1),w=r([]),A=r(!1),V=r(!1),_=r(new Date().getFullYear()+57),g=r((new Date().getMonth()+1)%12||12),p=r([]),C=r(!1),O={required:l=>!!l||"Required field"},R=[{label:"Baishakh",value:1},{label:"Jestha",value:2},{label:"Asar",value:3},{label:"Shrawan",value:4},{label:"Bhadau",value:5},{label:"Ashwin",value:6},{label:"Kartik",value:7},{label:"Mangshir",value:8},{label:"Poush",value:9},{label:"Magh",value:10},{label:"Falgun",value:11},{label:"Chaitra",value:12}],ee=[{name:"sn",label:"SN",field:"sn",align:"left",sortable:!0},{name:"name",label:"Name",field:"name",align:"left",sortable:!0},{name:"designation",label:"Designation",field:"designation",align:"left",sortable:!0},{name:"branchName",label:"Branch",field:"branchName",align:"left",sortable:!0},{name:"firstPunch",label:"First Punch",field:"firstPunch",align:"left",sortable:!0},{name:"lastPunch",label:"Last Punch",field:"lastPunch",align:"left",sortable:!0},{name:"attendanceDate",label:"Date",field:"attendanceDate",align:"left",sortable:!0}],te=[{name:"sn",label:"SN",field:"sn",align:"left",sortable:!0},{name:"name",label:"Name",field:"name",align:"left",sortable:!0},{name:"designation",label:"Designation",field:"designation",align:"left",sortable:!0},{name:"branchName",label:"Branch",field:"branchName",align:"left",sortable:!0},{name:"absentDate",label:"Absent Date",field:"absentDate",align:"left",sortable:!0}],ae=me(()=>{if(!p.value.length)return[];const l=[{name:"sn",label:"SN",field:"SN",align:"left",sortable:!0},{name:"employeeName",label:"Employee Name",field:"employeeName",align:"left",sortable:!0}],a=Object.keys(p.value[0]||{}).filter(i=>i!=="employeeName"&&i!=="totalPresent"&&i!=="SN").map(i=>({name:i,label:i,field:i,align:"center",sortable:!0})),o={name:"totalPresent",label:"Total Present",field:"totalPresent",align:"center",sortable:!0};return[...l,...a,o]}),le=()=>{var $;if(!p.value.length){m.notify({type:"warning",message:"No data to export!"});return}const l=(($=R.find(n=>n.value===g.value))==null?void 0:$.label)||g.value,a=Math.max(...p.value.flatMap(n=>Object.keys(n).filter(d=>d!=="employeeName"&&d!=="totalPresent").map(Number))),o=["SN","Employee Name"];for(let n=1;n<=a;n++)o.push(n.toString());o.push("Total Present");const i=p.value.map((n,d)=>{var G,H;const b={SN:d+1,"Employee Name":n.employeeName};for(let Q=1;Q<=a;Q++)b[Q]=(G=n[Q])!=null?G:"";return b["Total Present"]=(H=n.totalPresent)!=null?H:0,b}),J=[[`Monthly Attendance Report - ${l} ${_.value}`],[],o,...i.map(n=>o.map(d=>{var b;return(b=n[d])!=null?b:""}))].map(n=>n.map(d=>`"${d}"`).join(",")).join(`\r 2`);Z(`monthly_attendance_${l}_${_.value}.csv`,J,"text/csv")?m.notify({type:"positive",message:"File downloaded successfully"}):m.notify({type:"negative",message:"Browser denied file download"})},se=()=>{const l=P.value.map(a=>({SN:a.sn,Name:a.name,Designation:a.designation,Branch:a.branchName,"First Punch":a.firstPunch,"Last Punch":a.lastPunch,Date:E(a.attendanceDate)}));U(l,`attendance_log_${c.value}`)},oe=()=>{const l=w.value.map(a=>({SN:a.sn,Name:a.name,Designation:a.designation,Branch:a.branchName,"Absent Date":E(a.absentDate)}));U(l,`absent_employees_${c.value}`)},U=(l,a)=>{const o=Object.keys(l[0]),i=l.map(K=>o.map($=>JSON.stringify(K[$]||"",(n,d)=>d===null?"":d)).join(","));i.unshift(o.join(","));const I=i.join(`\r 3`);Z(`${a}.csv`,I,"text/csv")?m.notify({type:"positive",message:"File downloaded successfully"}):m.notify({type:"negative",message:"Browser denied file download"})},x=l=>{const a=l.getFullYear(),o=String(l.getMonth()+1).padStart(2,"0"),i=String(l.getDate()).padStart(2,"0");return`${a}-${o}-${i}`},E=l=>{if(!l)return"";if(typeof l=="string"&&l.match(/^\d{4}-\d{2}-\d{2}$/))return l;if(typeof l=="string"&&l.includes("T"))return l.split("T")[0];const a=new Date(l);return`${a.getFullYear()}
3-${String(a.getMonth()+1).padStart(2,"0")}-${String(a.getDate()).padStart(2,"0")}`},z=l=>l||"",ne=()=>{c.value=x(new Date),S()},Y=()=>{S()},S=()=>{ie(),ce()},ie=async()=>{try{const l=c.value||x(new Date),a=await q.get(`/api/StaffAttendance/Dashboard/${N.getSchoolCode}/${l}`);y.value=a.data}catch{m.notify({type:"negative",message:"Failed to load dashboard data"})}},ce=async()=>{T.value=!0;try{const l=c.value||x(new Date),a=await q.get(`/api/StaffAttendance/DailyLog/${N.getSchoolCode}?fromDate=${l}&toDate=${l}`);P.value=a.data}catch{m.notify({type:"negative",message:"Failed to load attendance log"})}finally{T.value=!1}},de=async()=>{A.value=!0;try{const l=c.value||x(new Date),a=await q.get(`/api/StaffAttendance/Absent/${N.getSchoolCode}/${l}`);w.value=a.data,V.value=!0}catch{m.notify({type:"negative",message:"Failed to load absent employees list"})}finally{A.value=!1}},re=async()=>{if(!_.value||!g.value){m.notify({type:"warning",message:"Please select both year and month"});return}C.value=!0,p.value=[];try{const l=await q.get(`/api/StaffAttendance/MonthlyReport/${N.getSchoolCode}/${_.value}/${g.value}`);Array.isArray(l.data)&&(p.value=l.data.map(({SN:a,...o})=>o))}catch{m.notify({type:"negative",message:"Failed to load monthly report"})}finally{C.value=!1}};return pe(()=>{c.value=x(new Date),S()}),(l,a)=>(k(),M(xe,{class:"q-pa-md bg-grey-2"},{default:s(()=>[e("div",Ne,[Pe,e("div",Ae,[t(f,{color:"primary",icon:"event",label:"Today",onClick:ne})])]),e("div",Ce,[e("div",Se,[t(v,{class:"stats-card bg-blue-1"},{default:s(()=>[t(u,{class:"q-pa-md"},{default:s(()=>[e("div",$e,[e("div",Qe,[qe,e("div",Te,h(y.value.totalEmployees||0),1)]),e("div",Ve,[t(D,{name:"people",size:"lg",color:"primary"})])])]),_:1})]),_:1})]),e("div",Ee,[t(v,{class:"stats-card bg-green-1"},{default:s(()=>[t(u,{class:"q-pa-md"},{default:s(()=>[e("div",Me,[e("div",ke,[Fe,e("div",Be,h(y.value.totalPresent||0),1)]),e("div",je,[t(D,{name:"check_circle",size:"lg",color:"positive"})])])]),_:1})]),_:1})]),e("div",Le,[t(v,{class:"stats-card bg-red-1"},{default:s(()=>[t(u,{class:"q-pa-md"},{default:s(()=>[e("div",Oe,[e("div",Re,[Ue,e("div",ze,h(y.value.totalAbsent||0),1)]),e("div",Ye,[t(D,{name:"cancel",size:"lg",color:"negative"})])])]),_:1})]),_:1})]),e("div",Ie,[t(v,{class:"stats-card bg-teal-1"},{default:s(()=>[t(u,{class:"q-pa-md"},{default:s(()=>[e("div",Je,[e("div",Ke,[Ge,e("div",He,h(y.value.numberOfDevices||0),1)]),e("div",We,[t(D,{name:"devices",size:"lg",color:"teal"})])])]),_:1})]),_:1})])]),t(v,{class:"q-mb-md"},{default:s(()=>[t(u,null,{default:s(()=>[Xe,e("div",Ze,[e("div",et,[t(W,{filled:"",modelValue:c.value,"onUpdate:modelValue":[a[1]||(a[1]=o=>c.value=o),Y],label:"Select Date",type:"date"},{append:s(()=>[t(D,{name:"event",class:"cursor-pointer"},{default:s(()=>[t(ge,{cover:"","transition-show":"scale","transition-hide":"scale"},{default:s(()=>[t(_e,{modelValue:c.value,"onUpdate:modelValue":[a[0]||(a[0]=o=>c.value=o),Y]},{default:s(()=>[e("div",tt,[F(t(f,{label:"Close",color:"primary",flat:""},null,512),[[L]])])]),_:1},8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue"])]),e("div",at,[t(f,{color:"negative",icon:"person_off",label:"View Absent List",onClick:de,loading:A.value,class:"full-width"},null,8,["loading"])]),e("div",lt,[t(f,{color:"primary",icon:"refresh",label:"Refresh Data",onClick:S,class:"full-width"})])])]),_:1})]),_:1}),t(v,{class:"q-mb-md"},{default:s(()=>[t(u,null,{default:s(()=>[e("div",st,[e("div",ot,[nt,e("div",it," Showing data for "+h(z(c.value)),1)]),e("div",ct,[t(f,{color:"primary",icon:"file_download",label:"Export to Excel",onClick:se,disable:P.value.length===0},null,8,["disable"])])])]),_:1}),t(B),t(u,{class:"q-pa-none"},{default:s(()=>[t(j,{rows:P.value,columns:ee,"row-key":"sn",loading:T.value,pagination:{rowsPerPage:10},flat:"",bordered:"",class:"attendance-table"},null,8,["rows","loading"])]),_:1})]),_:1}),t(v,null,{default:s(()=>[t(u,null,{default:s(()=>[dt,e("div",rt,[e("div",ut,[t(W,{filled:"",modelValue:_.value,"onUpdate:modelValue":a[2]||(a[2]=o=>_.value=o),label:"Nepali Year",type:"number",rules:[O.required]},null,8,["modelValue","rules"])]),e("div",mt,[t(ye,{filled:"",modelValue:g.value,"onUpdate:modelValue":a[3]||(a[3]=o=>g.value=o),options:R,label:"Nepali Month",rules:[O.required],"emit-value":"","map-options":""},null,8,["modelValue","rules"])]),e("div",pt,[t(f,{color:"primary",icon:"analytics",label:"Generate Report",onClick:re,loading:C.value,class:"full-width"},null,8,["loading"])]),e("div",ft,[p.value.length>0?(k(),M(f,{key:0,color:"positive",icon:"file_download",label:"Export Report",onClick:le,class:"full-width"})):X("",!0)])])]),_:1}),t(B),p.value.length>0?(k(),M(u,{key:0,class:"q-pa-none"},{default:s(()=>
3[t(j,{rows:p.value,columns:fe(ae),"row-key":"employeeName",loading:C.value,pagination:{rowsPerPage:10},flat:"",bordered:"",class:"monthly-table"},null,8,["rows","columns","loading"])]),_:1})):X("",!0)]),_:1}),t(ve,{modelValue:V.value,"onUpdate:modelValue":a[4]||(a[4]=o=>V.value=o),maximized:""},{default:s(()=>[t(v,{class:"absent-dialog"},{default:s(()=>[t(u,{class:"row items-center q-pb-none"},{default:s(()=>[e("div",vt," Absent Employees - "+h(z(c.value)),1),t(we),F(t(f,{icon:"close",flat:"",round:"",dense:""},null,512),[[L]])]),_:1}),t(B),t(u,null,{default:s(()=>[e("div",ht,[e("div",_t,[e("div",gt," Total Absent: "+h(w.value.length),1)]),e("div",bt,[t(f,{color:"primary",icon:"file_download",label:"Export to Excel",onClick:oe,disable:w.value.length===0},null,8,["disable"])])]),t(j,{rows:w.value,columns:te,"row-key":"sn",loading:A.value,pagination:{rowsPerPage:20},flat:"",bordered:""},{"body-cell-absentDate":s(o=>[t(be,{props:o},{default:s(()=>[e("span",yt,h(E(o.value)),1)]),_:2},1032,["props"])]),_:1},8,["rows","loading"])]),_:1}),t(he,{align:"right"},{default:s(()=>[F(t(f,{flat:"",label:"Close",color:"primary"},null,512),[[L]])]),_:1})]),_:1})]),_:1},8,["modelValue"])]),_:1}))}};export{Ut 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.