1"use strict";(self.webpackChunkclient=self.webpackChunkclient||[]).push([[7778],{40170:(e,t,a)=>{a.d(t,{A:()=>b});var n=a(89379),r=a(53986),s=a(9950),o=a(94121),c=a(22748),i=a(58755),l=a(76538),d=a(14107),y=a(2260),p=a(55266),u=a(90287),m=a(37645);const h=u.A.create({baseURL:"/api/transcriptions"});(0,m.Cy)(h);var g=a(44414);const w=["value","onChange","onTranscribed","style","wrapperStyle","disabled"],A=s.forwardRef((e,t)=>{let{value:a,onChange:u,onTranscribed:m,style:A,wrapperStyle:b,disabled:v}=e,_=(0,r.A)(e,w);const{message:x}=o.A.useApp(),[f,j]=(0,s.useState)("idle"),S=(0,s.useRef)(null),k=(0,s.useRef)([]),C=(0,s.useRef)(!1),R=(0,s.useRef)(a);R.current=a,(0,s.useEffect)(()=>(C.current=!1,()=>{C.current=!0;const e=S.current;e&&"inactive"!==e.state&&e.stop()}),[]);const P=async()=>{const e=S.current;e.stream.getTracks().forEach(e=>e.stop());const t=e.mimeType||"audio/webm",a=new Blob(k.current,{type:t});if(k.current=[],!C.current)if(a.size<1e3)j("idle");else{j("transcribing");try{const e=t.includes("mp4")?"mp4":t.includes("ogg")?"ogg":"webm",{text:n}=await(async(e,t)=>{const a=new FormData;return a.append("audio",e,t),(await h.post("/",a)).data})(a,"dictation.".concat(e));n?(e=>{const t=(R.current||"").replace(/\s+$/,""),a=t?"".concat(t," ").concat(e):e;null===u||void 0===u||u({target:{value:a}}),null===m||void 0===m||m(a)})(n):x.info("Didn't catch any speech \u2014 please try again.")}catch(s){var n,r;x.error((null===s||void 0===s||null===(n=s.response)||void 0===n||null===(r=n.data)||void 0===r?void 0:r.message)||"Couldn't transcribe the audio. Please try again.")}finally{j("idle")}}},E="recording"===f?(0,g.jsx)(c.A,{title:"Stop and transcribe",children:(0,g.jsx)(i.Ay,{type:"text",danger:!0,size:"small",shape:"circle",icon:(0,g.jsx)(d.A,{}),onClick:()=>{const e=S.current;e&&"inactive"!==e.state&&e.stop()},"aria-label":"Stop dictation"})}):"transcribing"===f?(0,g.jsx)(i.Ay,{type:"text",size:"small",shape:"circle",icon:(0,g.jsx)(y.A,{}),disabled:!0,"aria-label":"Transcribing"}):(0,g.jsx)(c.A,{title:"Dictate",children:(0,g.jsx)(i.Ay,{type:"text",size:"small",shape:"circle",icon:(0,g.jsx)(p.A,{}),onClick:async()=>{var e;if(null!==(e=navigator.mediaDevices)&&void 0!==e&&e.getUserMedia&&"undefined"!==typeof MediaRecorder)try{const e=await navigator.mediaDevices.getUserMedia({audio:!0}),t=["audio/webm","audio/mp4","audio/ogg"].find(e=>MediaRecorder.isTypeSupported(e)),a=new MediaRecorder(e,t?{mimeType:t}:void 0);k.current=[],a.ondataavailable=e=>{e.data.size>0&&k.current.push(e.data)},a.onstop=P,S.current=a,a.start(),j("recording")}catch(t){x.error("Microphone access was blocked. Allow it in your browser settings to dictate.")}else x.error("Voice input isn't supported in this browser.")},disabled:v,"aria-label":"Dictate"})});return(0,g.jsxs)("div",{style:(0,n.A)({position:"relative"},b),children:[(0,g.jsx)(l.A.TextArea,(0,n.A)({ref:t,value:a,onChange:u,disabled:v,style:(0,n.A)({paddingRight:34},A)},_)),!_.readOnly&&(0,g.jsx)("div",{style:{position:"absolute",top:3,right:_.allowClear?26:3},children:E})]})});A.displayName="VoiceTextArea";const b=A},57778:(e,t,a)=>{a.r(t),a.d(t,{default:()=>M});var n=a(9950),r=a(32856),s=a(99674),o=a(94121),c=a(20559),i=a(43910),l=a(58755),d=a(1203),y=a(82056),p=a(65455),u=a(87094),m=a(41988),h=a(76538),g=a(16895),w=a(85939),A=a(23072),b=a(6006),v=a(24513),_=a(44070),x=a(8750),f=a(66276),j=a(89008),S=a(40170),k=a(52459);const C=e=>({earning:"Earning",deduction:"Deduction",employer_contribution:"Employer Contribution",benefit:"Benefit"}[e]||e),R=e=>({earning:"#52c41a",deduction:"#f5222d",employer_contribution:"#1890ff",benefit:"#722ed1"}[e]||"#666");var P=a(44414);const{Option:E}=s.A,M=()=>{const{message:e}=o.A.useApp(),[t,a]=(0,n.useState)([]),[M,F]=(0,n.useState)(!1),[I,D]=(0,n.useState)(!1),[T,N]=(0,n.useState)(null),[U]=c.A.useForm(),[O,B]=(0,n.useState)(!1),q=async()=>{F(!0);try{const e=await j.Ay.getSalaryComponents();a(e)}catch(t){console.error("Error fetching salary components:",t),e.error("Failed to fetch salary components")}finally{F(!1)}};(0,n.useEffect)(()=>{q()},[]);const L=()=>{D(!1),U.resetFields(),N(null)};return(0,P.jsxs)("div",{children:[(0,P.jsx)(r.mg,{children:(0,P.jsx)("title",{children:"Payroll Settings | Maidan"})}),(0,P.jsx)(k.A,{title:"Payroll Settings",subtitle:"Manage payroll settings",actions:(0,P.jsx)(l.Ay,{type:"primary",icon:(0,P.jsx)(x.A,{}),onClick:()=>{N(null),D(!0),U.resetFields()},children:"Add Component"})}),(0,P.jsx)(y.A,{title:"Salary Components",children:(()=>{const a=[{title:"Name",dataIndex:"name",key:"name"},{title:"Type",dataIndex:"type",key:"type",render:e=>(0,P.jsx)("span",{style:{color:R(e),fontWeight:"500"},children:C(e)})},{title:"Tax Exempt",dataIndex:"is_tax_exempt",key:"is_tax_exempt",render:e=>(0,P.jsx)("span",{style:{color:e?"var(--color-success)":"var(--color-text-tertiary)"},children:e?"Yes":"No"})},{title:"Statutory",dataIndex:"is_statutory",key:"is_statutory",render:e=>(0,P.jsx)("span",{style:{color:e?"var(--color-success)":"var(--color-text-tertiary)"},children:e?"Yes":"No"})},{title:"Display Order",dataIndex:"display_order",key:"display_order"},{title:"Actions",key:"actions",width:120,render:(t,a)=>(0,P.jsxs)(i.A,{children:[(0,P.jsx)(l.Ay,{size:"small",icon:(0,P.jsx)(v.A,{}),onClick:()=>{return N(e=a),D(!0),void U.setFieldsValue(e);var e}}),(0,P.jsx)(l.Ay,{size:"small",danger:!0,icon:(0,P.jsx)(_.A,{}),onClick:()=>(async t=>{try{await j.Ay.deleteSalaryComponent(t),e.success("Salary component deleted successfully"),q()}catch(a){console.error("Error deleting salary component:",a),e.error("Failed to delete salary component")}})(a.id)})]})}];return(0,P.jsx)(b.A,{columns:a,dataSource:t,rowKey:"id",showSerialNo:!1,locale:{emptyText:(0,P.jsx)(d.A,{image:d.A.PRESENTED_IMAGE_SIMPLE,description:"No salary components"})}})})()}),(0,P.jsx)(p.A,{title:(0,P.jsxs)(i.A,{children:[(0,P.jsx)(f.A,{}),(0,P.jsx)("span",{children:T?"Edit Salary Component":"Add Salary Component"})]}),open:I,onCancel:L,footer:null,width:600,children:(0,P.jsxs)(c.A,{form:U,layout:"vertical",onFinish:async t=>{try{B(!0),T?(await j.Ay.updateSalaryComponent(T.id,t),e.success("Salary component updated successfully")):(await j.Ay.createSalaryComponent(t),e.success("Salary component created successfully")),D(!1),U.resetFields(),N(null),q()}catch(a){console.error("Error saving salary component:",a),e.error("Failed to save salary component")}finally{B(!1)}},children:[(0,P.jsxs)(u.A,{gutter:16,children:[(0,P.jsx)(m.A,{span:12,children:(0,P.jsx)(c.A.Item,{name:"name",label:"Component Name",rules:[{required:!0,message:"Please enter component name"}],children:(0,P.jsx)(h.A,{placeholder:"e.g., Basic Salary, HRA, PF"})})}),(0,P.jsx)(m.A,{span:12,children:(0,P.jsx)(c.A.Item,{name:"type",label:"Type",rules:[{required:!0,message:"Please select type"}],children:(0,P.jsx)(s.A,{placeholder:"Select type",children:[{value:"earning",label:"Earning"},{value:"deduction",label:"Deduction"},{value:"employer_contribution",label:"Employer Contribution"},{value:"benefit",label:"Benefit"}].map(e=>(0,P.jsx)(E,{value:e.value,children:e.label},e.value))})})})]}),(0,P.jsxs)(u.A,{gutter:16,children:[(0,P.jsx)(m.A,{span:8,children:(0,P.jsx)(c.A.Item,{name:"is_tax_exempt",label:"Tax Exempt",valuePropName:"checked",children:(0,P.jsx)(g.A,{})})}),(0,P.jsx)(m.A,{span:8,children:(0,P.jsx)(c.A.Item,{name:"is_statutory",label:"Statutory",valuePropName:"checked",children:(0,P.jsx)(g.A,{})})}),(0,P.jsx)(m.A,{span:8,children:(0,P.jsx)(c.A.Item,{name:"display_order",label:"Display Order",children:(0,P.jsx)(w.A,{style:{width:"100%"},placeholder:"Order",min:0})})})]}),(0,P.jsx)(c.A.Item,{name:"description",label:"Description",children:(0,P.jsx)(S.A,{rows:3,placeholder:"Optional description for this component"})}),(0,P.jsx)(A.A,{}),(0,P.jsx)("div",{style:{textAlign:"right"},children:(0,P.jsxs)(i.A,{children:[(0,P.jsx)(l.Ay,{onClick:L,children:"Cancel"}),(0,P.jsx)(l.Ay,{type:"primary",htmlType:"submit",loading:O,icon:T?(0,P.jsx)(v.A,{}):(0,P.jsx)(x.A,{}),children:T?"Update Component":"Add Component"})]})})]})})]})}},89008:(e,t,a)=>{a.d(t,{A$:()=>p,Ay:()=>h,WR:()=>u,X$:()=>l,ae:()=>m,bT:()=>d});var n=a(89379),r=a(90287),s=a(4159),o=a.n(s),c=a(37645);const i=r.A.create({baseURL:"/api/payroll"});(0,c.Cy)(i);const l=async e=>{let{ctcMonthly:t,basicMonthly:a,hraRate:n,state:r}=e;const s=new URLSearchParams;s.append("ctcMonthly",t),s.append("basicMonthly",a),void 0!==n&&s.append("hraRate",n),r&&s.append("state",r);return(await i.get("/ctc-breakup?".concat(s.toString()))).data},d=async e=>{try{return(await i.get("/payslips/".concat(e))).data}catch(t){throw t}},y=async(e,t)=>{try{return(await i.put("/payslips/".concat(e,"/payment"),t)).data}catch(a){throw a}},p=async function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};try{const{limit:t=12,offset:a=0}=e,n=new URLSearchParams({limit:t,offset:a});return(await i.get("/my-payslips?".concat(n))).data}catch(t){throw t}},u=async e=>{try{return(await i.get("/my-payslips/".concat(e))).data}catch(t){throw t}},m=async e=>{try{const t=await i.get("/payslips/".concat(e,"/pdf/download"),{responseType:"blob"}),a=new Blob([t.data],{type:"application/pdf"}),n=window.URL.createObjectURL(a),r=document.createElement("a");return r.href=n,r.download="payslip-".concat(e,".pdf"),document.body.appendChild(r),r.click(),document.body.removeChild(r),window.URL.revokeObjectURL(n),t.data}catch(n){var t,a;throw console.error("Error downloading payslip PDF:",n),console.error("Response status:",null===(t=n.response)||void 0===t?void 0:t.status),console.error("Response data:",null===(a=n.response)||void 0===a?void 0:a.data),n}},h={getSalaryComponents:async()=>{try{return(await i.get("/salary-components")).data}catch(e){throw e}},createSalaryComponent:async e=>{try{return(await i.post("/salary-components",e)).data}catch(t){throw t}},updateSalaryComponent:async(e,t)=>{try{return(await i.put("/salary-components/".concat(e),t)).data}catch(a){throw a}},deleteSalaryComponent:async e=>{try{return(await i.delete("/salary-components/".concat(e))).data}catch(t){throw t}},getEmployeeSalaryRevisions:async e=>{try{return(await i.get("/employees/".concat(e,"/salary-revisions"))).data}catch(t){throw t}},getCurrentEmployeeSalary:async e=>{try{return(await i.get("/employees/".concat(e,"/current-salary"))).data}catch(t){throw t}},getEmployeeSalaries:async()=>(await i.get("/employee-salaries")).data,createEmployeeSalaryRevision:async(e,t)=>{try{return(await i.post("/employees/".concat(e,"/salary-revisions"),t)).data}catch(a){throw a}},getEmployeeBankAccounts:async e=>{try{return(await i.get("/employees/".concat(e,"/bank-accounts"))).data}catch(t){throw t}},createEmployeeBankAccount:async(e,t)=>{try{return(await i.post("/employees/".concat(e,"/bank-accounts"),t)).data}catch(a){throw a}},updateEmployeeBankAccount:async(e,t)=>{try{return(await i.put("/bank-accounts/".concat(e),t)).data}catch(a){throw a}},deleteEmployeeBankAccount:async e=>{try{return(await i.delete("/bank-accounts/".concat(e))).data}catch(t){throw t}},getMonthlyAttendance:async(e,t)=>{try{return(await i.get("/employees/".concat(e,"/attendance/").concat(t))).data}catch(a){throw a}},createOrUpdateMonthlyAttendance:async(e,t)=>{try{return(await i.post("/employees/".concat(e,"/attendance"),t)).data}catch(a){throw a}},getAllMonthlyAttendance:async e=>{try{return(await i.get("/attendance/".concat(e))).data}catch(t){throw t}},bulkCreateOrUpdateMonthlyAttendance:async e=>{try{return(await i.post("/attendance",{attendanceRecords:e})).data}catch(t){throw t}},getPayrollRuns:async e=>{try{return(await i.get("/payroll-runs".concat(e?"?month=".concat(e):""))).data}catch(t){throw t}},createPayrollRun:async e=>{try{return(await i.post("/payroll-runs",e)).data}catch(t){throw t}},updatePayrollRun:async(e,t)=>{try{return(await i.put("/payroll-runs/".concat(e),t)).data}catch(a){throw a}},initiatePayroll:async e=>{try{return(await i.post("/payroll-runs/initiate",{month:e})).data}catch(t){throw t}},getEmployeePayslips:async function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};try{const{limit:a=12,offset:n=0}=t,r=new URLSearchParams({limit:a,offset:n});return(await i.get("/employees/".concat(e,"/payslips?").concat(r))).data}catch(a){throw a}},getPayslipById:d,getPayslipByHash:async e=>{try{return(await i.get("/payslips/by-hash/".concat(e))).data}catch(t){throw t}},updatePayslipPaymentDetails:y,markPayslipAsPaid:async function(e,t){let a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:o()().format("YYYY-MM-DD");return y(e,{payment_date:a,payment_reference:t,status:"paid"})},revokePayslipVerification:async(e,t)=>(await i.post("/payslips/".concat(e,"/verification/revoke"),{reason:t})).data,voidPayslip:async(e,t)=>(await i.post("/payslips/".concat(e,"/void"),{reason:t})).data,getPayrollRunAudit:async e=>(await i.get("/payroll-runs/".concat(e,"/audit"))).data,getStatutorySuggestions:async e=>{let{basicMonthly:t,specialMonthly:a,grossMonthly:n,state:r,currentValues:s}=e;const o=new URLSearchParams;void 0!==t&&o.append("basicMonthly",t),void 0!==a&&o.append("specialMonthly",a),void 0!==n&&o.append("grossMonthly",n),r&&o.append("state",r),s&&o.append("currentValues",JSON.stringify(s));return(await i.get("/statutory-suggestions?".concat(o.toString()))).data},getCtcBreakup:l,bulkUpdatePaymentStatus:async e=>{const t=[],a=[];for(const r of e)try{const e=await y(r.payslipId,{payment_date:r.paymentDate,payment_reference:r.paymentReference,status:r.status||"paid"});t.push(e)}catch(n){a.push({payslipId:r.payslipId,error:n.message||"Failed to update payment status"})}return{success:t,errors:a,totalProcessed:e.length,successCount:t.length,errorCount:a.length}},getPayrollSummaryReport:async(e,t)=>{try{const a=new URLSearchParams({pay_period_start:e,pay_period_end:t});return(await i.get("/reports/summary?".concat(a))).data}catch(a){throw a}},getMyPayslips:p,getMyPayslipByHash:u,formatSalaryComponent:e=>(0,n.A)((0,n.A)({},e),{},{display_name:e.name,type_label:"earning"===e.type?"Earning":"Deduction",tax_status:e.is_tax_exempt?"Tax Exempt":"Taxable",statutory_status:e.is_statutory?"Statutory":"Non-Statutory"}),formatPayslip:e=>{var t,a;return(0,n.A)((0,n.A)({},e),{},{pay_period:"".concat(e.pay_period_start," to ").concat(e.pay_period_end),net_pay_formatted:new Intl.NumberFormat("en-IN",{style:"currency",currency:"INR"}).format(e.net_pay),total_earnings_formatted:new Intl.NumberFormat("en-IN",{style:"currency",currency:"INR"}).format(e.total_earnings),total_deductions_formatted:new Intl.NumberFormat("en-IN",{style:"currency",currency:"INR"}).format(e.total_deductions),status_label:(null===(t=e.status)||void 0===t?void 0:t.charAt(0).toUpperCase())+(null===(a=e.status)||void 0===a?void 0:a.slice(1))||"Draft"})},validateSalaryComponent:e=>{const t={};return e.name&&0!==e.name.trim().length||(t.name="Component name is required"),e.type&&["earning","deduction"].includes(e.type)||(t.type="Component type must be either 'earning' or 'deduction'"),void 0!==e.display_order&&e.display_order<0&&(t.display_order="Display order must be a non-negative number"),{isValid:0===Object.keys(t).length,errors:t}},validateSalaryRevision:e=>{const t={};
1if(e.employee_id||(t.employee_id="Employee ID is required"),e.effective_from||(t.effective_from="Effective date is required"),(!e.annual_ctc||parseFloat(e.annual_ctc)<=0)&&(t.annual_ctc="Total CTC must be a positive number"),e.salary_structure&&Array.isArray(e.salary_structure)){const a=[];e.salary_structure.forEach((e,t)=>{const n={};e.salary_component_id||(n.salary_component_id="Salary component is required"),(!e.amount||parseFloat(e.amount)<=0)&&(n.amount="Amount must be a positive number"),Object.keys(n).length>0&&(a[t]=n)}),a.length>0&&(t.salary_structure=a)}return{isValid:0===Object.keys(t).length,errors:t}},validateBankAccount:e=>{const t={};return e.account_holder_name&&0!==e.account_holder_name.trim().length||(t.account_holder_name="Account holder name is required"),e.bank_name&&0!==e.bank_name.trim().length||(t.bank_name="Bank name is required"),e.account_number&&0!==e.account_number.trim().length||(t.account_number="Account number is required"),e.ifsc_code&&/^[A-Z]{4}0[A-Z0-9]{6}$/.test(e.ifsc_code)||(t.ifsc_code="Valid IFSC code is required (e.g., HDFC0000001)"),{isValid:0===Object.keys(t).length,errors:t}},validateMonthlyAttendance:e=>{const t={};e.employee_id||(t.employee_id="Employee ID is required"),e.attendance_month||(t.attendance_month="Attendance month is required"),(!e.working_days||parseFloat(e.working_days)<=0)&&(t.working_days="Working days must be a positive number"),void 0!==e.present_days&&parseFloat(e.present_days)<0&&(t.present_days="Present days cannot be negative");const a=parseFloat(e.working_days)||0;return(parseFloat(e.present_days)||0)+(parseFloat(e.absent_days)||0)+(parseFloat(e.paid_leaves)||0)+(parseFloat(e.unpaid_leaves)||0)>a&&(t.total_days="Total of present days, absent days, and leaves cannot exceed working days"),{isValid:0===Object.keys(t).length,errors:t}},getNewEmployeesForMonth:async e=>{try{return(await i.get("/checklist/new-employees/".concat(e))).data}catch(t){throw t}},getExitedEmployeesForMonth:async e=>{try{return(await i.get("/checklist/exited-employees/".concat(e))).data}catch(t){throw t}},getOrCreatePayrollSummary:async e=>{try{return(await i.get("/summary/".concat(e))).data}catch(t){throw t}},reRunPayroll:async e=>{try{return(await i.post("/payroll-runs/".concat(e,"/rerun"))).data}catch(t){throw t}},approvePayroll:async e=>{try{return(await i.post("/payroll-runs/".concat(e,"/approve"))).data}catch(t){throw t}}}}}]);
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.