bettertend/frontend/dist/assets/useRequestManagement-BaHfQU...

2 lines
12 KiB
JavaScript

import{aP as F,r as E,c as q,br as g}from"./index-QAlcqU00.js";const M=F("requests",()=>{const r=E([]),a=E(null),u=E(!1),I=E(!1),c=E(null),w=E(0),L=E(0),v=E({status:null,priority:null,type:null,assignedTo:null,asset:null,location:null,search:"",dateRange:null}),C=E({page:0,size:20,sort:"created_desc",sortDirection:"desc"}),A=q(()=>{let t=r.value;if(v.value.status&&(t=t.filter(e=>e.status===v.value.status)),v.value.priority&&(t=t.filter(e=>e.priority===v.value.priority)),v.value.type&&(t=t.filter(e=>e.type===v.value.type)),v.value.assignedTo&&(t=t.filter(e=>{var l;return((l=e.assignedTo)==null?void 0:l.id)===v.value.assignedTo})),v.value.asset&&(t=t.filter(e=>e.assetId===v.value.asset)),v.value.location&&(t=t.filter(e=>e.locationId===v.value.location)),v.value.search){const e=v.value.search.toLowerCase();t=t.filter(l=>{var n,y,h,D;return((n=l.title)==null?void 0:n.toLowerCase().includes(e))||((y=l.description)==null?void 0:y.toLowerCase().includes(e))||((h=l.customId)==null?void 0:h.toLowerCase().includes(e))||((D=l.id)==null?void 0:D.toString().includes(e))})}return t}),x=q(()=>r.value.reduce((t,e)=>(t[e.status]||(t[e.status]=[]),t[e.status].push(e),t),{})),S=q(()=>r.value.reduce((t,e)=>(t[e.priority]||(t[e.priority]=[]),t[e.priority].push(e),t),{})),O=q(()=>r.value.reduce((t,e)=>(t[e.type]||(t[e.type]=[]),t[e.type].push(e),t),{})),T=q(()=>r.value.filter(t=>t.status==="pending")),b=q(()=>r.value.filter(t=>t.status==="approved")),s=q(()=>{const t=new Date;return r.value.filter(e=>e.requiredDate&&new Date(e.requiredDate)<t&&!["completed","cancelled"].includes(e.status))}),i=q(()=>r.value.filter(t=>["high","critical","emergency"].includes(t.priority))),o=async(t={})=>{try{I.value=!0,c.value=null;const e={...C.value,...t},l=await g.search(e);return r.value=l.content||l,w.value=l.totalElements||l.length,l}catch(e){throw c.value=e.message||"Failed to search requests",e}finally{I.value=!1}},f=async(t={})=>{try{u.value=!0,c.value=null;const e=await g.getAll(t);return r.value=e.content||e,w.value=e.totalElements||e.length,e}catch(e){throw c.value=e.message||"Failed to fetch requests",e}finally{u.value=!1}};return{requests:r,currentRequest:a,loading:u,loadingGet:I,error:c,totalCount:w,pendingCount:L,filters:v,pagination:C,filteredRequests:A,requestsByStatus:x,requestsByPriority:S,requestsByType:O,pendingRequests:T,approvedRequests:b,overdueRequests:s,highPriorityRequests:i,searchRequests:o,fetchRequests:f,fetchRequestById:async t=>{try{I.value=!0,c.value=null;const e=await g.getById(t);a.value=e;const l=r.value.findIndex(n=>n.id===t);return l!==-1&&(r.value[l]=e),e}catch(e){throw c.value=e.message||"Failed to fetch request",e}finally{I.value=!1}},createRequest:async t=>{try{u.value=!0,c.value=null;const e=await g.create(t);return r.value.unshift(e),w.value+=1,e}catch(e){throw c.value=e.message||"Failed to create request",e}finally{u.value=!1}},updateRequest:async(t,e)=>{var l;try{u.value=!0,c.value=null;const n=await g.update(t,e),y=r.value.findIndex(h=>h.id===t);return y!==-1&&(r.value[y]=n),((l=a.value)==null?void 0:l.id)===t&&(a.value=n),n}catch(n){throw c.value=n.message||"Failed to update request",n}finally{u.value=!1}},deleteRequest:async t=>{var e;try{u.value=!0,c.value=null,await g.delete(t);const l=r.value.findIndex(n=>n.id===t);return l!==-1&&(r.value.splice(l,1),w.value-=1),((e=a.value)==null?void 0:e.id)===t&&(a.value=null),!0}catch(l){throw c.value=l.message||"Failed to delete request",l}finally{u.value=!1}},approveRequest:async(t,e)=>{var l;try{u.value=!0,c.value=null;const n=await g.approve(t,e),y=r.value.findIndex(h=>h.id===t);return y!==-1&&(r.value[y]={...r.value[y],status:"approved",workOrder:n.workOrder}),((l=a.value)==null?void 0:l.id)===t&&(a.value={...a.value,status:"approved",workOrder:n.workOrder}),n}catch(n){throw c.value=n.message||"Failed to approve request",n}finally{u.value=!1}},rejectRequest:async(t,e)=>{var l;try{u.value=!0,c.value=null;const n=await g.reject(t,e),y=r.value.findIndex(h=>h.id===t);return y!==-1&&(r.value[y]=n),((l=a.value)==null?void 0:l.id)===t&&(a.value=n),n}catch(n){throw c.value=n.message||"Failed to reject request",n}finally{u.value=!1}},cancelRequest:async(t,e)=>{var l;try{u.value=!0,c.value=null;const n=await g.cancel(t,e),y=r.value.findIndex(h=>h.id===t);return y!==-1&&(r.value[y]=n),((l=a.value)==null?void 0:l.id)===t&&(a.value=n),n}catch(n){throw c.value=n.message||"Failed to cancel request",n}finally{u.value=!1}},getPendingRequestsCount:async()=>{try{const t=await g.getPendingCount();return L.value=t.count||0,L.value}catch(t){throw c.value=t.message||"Failed to get pending count",t}},getRequestStatistics:async(t={})=>{try{return await g.getStatistics(t)}catch(e){throw c.value=e.message||"Failed to get request statistics",e}},bulkUpdateRequests:async t=>{try{u.value=!0,c.value=null;const e=await g.bulkUpdate(t);return await f(),e}catch(e){throw c.value=e.message||"Failed to perform bulk update",e}finally{u.value=!1}},clearCurrentRequest:()=>{a.value=null},clearRequests:()=>{r.value=[],a.value=null,w.value=0,c.value=null},updateFilters:t=>{v.value={...v.value,...t}},updatePagination:t=>{C.value={...C.value,...t}}}}),m={MAINTENANCE:"maintenance",REPAIR:"repair",INSPECTION:"inspection",INSTALLATION:"installation",MODIFICATION:"modification",CLEANING:"cleaning",OTHER:"other"},H={[m.MAINTENANCE]:"Maintenance Request",[m.REPAIR]:"Repair Request",[m.INSPECTION]:"Inspection Request",[m.INSTALLATION]:"Installation Request",[m.MODIFICATION]:"Modification Request",[m.CLEANING]:"Cleaning Request",[m.OTHER]:"Other Request"},R={PENDING:"pending",UNDER_REVIEW:"under_review",APPROVED:"approved",REJECTED:"rejected",IN_PROGRESS:"in_progress",COMPLETED:"completed",CANCELLED:"cancelled"},U={[R.PENDING]:"Pending",[R.UNDER_REVIEW]:"Under Review",[R.APPROVED]:"Approved",[R.REJECTED]:"Rejected",[R.IN_PROGRESS]:"In Progress",[R.COMPLETED]:"Completed",[R.CANCELLED]:"Cancelled"},d={LOW:"low",MEDIUM:"medium",HIGH:"high",CRITICAL:"critical",EMERGENCY:"emergency"},_={[d.LOW]:"Low",[d.MEDIUM]:"Medium",[d.HIGH]:"High",[d.CRITICAL]:"Critical",[d.EMERGENCY]:"Emergency"},X={id:null,customId:"",title:"",description:"",type:m.MAINTENANCE,status:R.PENDING,priority:d.MEDIUM,assetId:null,assetName:"",locationId:null,locationName:"",categoryId:null,categoryName:"",workOrderId:null,requestedBy:null,requestedDate:null,requiredDate:null,assignedTo:null,approvedBy:null,approvedDate:null,estimatedHours:null,estimatedCost:null,urgencyReason:"",businessJustification:"",cancelled:!1,cancellationReason:null,cancelledBy:null,cancelledDate:null,audioDescription:null,attachments:[],images:[],createdAt:null,updatedAt:null,createdBy:null,updatedBy:null},p={title:{minLength:3,maxLength:100,pattern:/^[a-zA-Z0-9\s\-_.,()&]+$/},description:{minLength:10,maxLength:2e3},type:{validValues:Object.values(m)},priority:{validValues:Object.values(d)},estimatedHours:{min:.25,max:1e3},estimatedCost:{min:0,max:1e6}};Object.keys(R).map(r=>({label:U[R[r]],value:R[r]})),Object.keys(d).map(r=>({label:_[d[r]],value:d[r]})),Object.keys(m).map(r=>({label:H[m[r]],value:m[r]}));function ee(){const r=M(),a=E(null),u=E(!1),I=s=>{if(a.value=null,!s.title||typeof s.title!="string")return a.value="Request title is required",!1;const i=s.title.trim();if(i.length<p.title.minLength)return a.value=`Request title must be at least ${p.title.minLength} characters`,!1;if(i.length>p.title.maxLength)return a.value=`Request title must be less than ${p.title.maxLength} characters`,!1;if(!p.title.pattern.test(i))return a.value="Request title contains invalid characters",!1;if(!s.description||typeof s.description!="string")return a.value="Request description is required",!1;const o=s.description.trim();if(o.length<p.description.minLength)return a.value=`Request description must be at least ${p.description.minLength} characters`,!1;if(o.length>p.description.maxLength)return a.value=`Request description must be less than ${p.description.maxLength} characters`,!1;if(!s.type||!p.type.validValues.includes(s.type))return a.value="Valid request type is required",!1;if(!s.priority||!p.priority.validValues.includes(s.priority))return a.value="Valid request priority is required",!1;if(s.requiredDate){const f=new Date(s.requiredDate),N=new Date;if(N.setHours(0,0,0,0),f<N)return a.value="Required date cannot be in the past",!1}if(s.estimatedHours!==null&&s.estimatedHours!==void 0){const f=parseFloat(s.estimatedHours);if(isNaN(f)||f<p.estimatedHours.min||f>p.estimatedHours.max)return a.value=`Estimated hours must be between ${p.estimatedHours.min} and ${p.estimatedHours.max}`,!1}if(s.estimatedCost!==null&&s.estimatedCost!==void 0){const f=parseFloat(s.estimatedCost);if(isNaN(f)||f<p.estimatedCost.min||f>p.estimatedCost.max)return a.value=`Estimated cost must be between ${p.estimatedCost.min} and ${p.estimatedCost.max}`,!1}return!0},c=s=>{var o,f,N,P;return{...s,title:(o=s.title)==null?void 0:o.trim(),description:(f=s.description)==null?void 0:f.trim(),urgencyReason:((N=s.urgencyReason)==null?void 0:N.trim())||"",businessJustification:((P=s.businessJustification)==null?void 0:P.trim())||"",estimatedHours:s.estimatedHours?parseFloat(s.estimatedHours):null,estimatedCost:s.estimatedCost?parseFloat(s.estimatedCost):null,createdAt:s.createdAt||new Date().toISOString(),updatedAt:new Date().toISOString()}},w=async s=>{try{if(u.value=!0,a.value=null,!I(s))throw new Error(a.value);const i=c(s);return await r.createRequest(i)}catch(i){throw a.value=i.message||"Failed to create request",i}finally{u.value=!1}},L=async(s,i)=>{try{if(u.value=!0,a.value=null,!I(i))throw new Error(a.value);const o=c(i);return await r.updateRequest(s,o)}catch(o){throw a.value=o.message||"Failed to update request",o}finally{u.value=!1}},v=async s=>{try{return u.value=!0,a.value=null,await r.deleteRequest(s),!0}catch(i){throw a.value=i.message||"Failed to delete request",i}finally{u.value=!1}},C=async(s,i={})=>{try{return u.value=!0,a.value=null,await r.approveRequest(s,i)}catch(o){throw a.value=o.message||"Failed to approve request",o}finally{u.value=!1}},A=async(s,i)=>{try{if(u.value=!0,a.value=null,!i.reason||!i.reason.trim())throw a.value="Rejection reason is required",new Error(a.value);return await r.rejectRequest(s,i)}catch(o){throw a.value=o.message||"Failed to reject request",o}finally{u.value=!1}},x=async(s,i)=>{try{if(u.value=!0,a.value=null,!i.reason||!i.reason.trim())throw a.value="Cancellation reason is required",new Error(a.value);return await r.cancelRequest(s,i)}catch(o){throw a.value=o.message||"Failed to cancel request",o}finally{u.value=!1}},S=s=>{let o={[d.EMERGENCY]:100,[d.CRITICAL]:80,[d.HIGH]:60,[d.MEDIUM]:40,[d.LOW]:20}[s.priority]||0;s.requiredDate&&new Date(s.requiredDate)<new Date&&(o+=20);const f=(new Date-new Date(s.createdAt))/(1e3*60*60*24);return o+=Math.min(f*2,20),o},O=s=>({...s,formattedCreatedDate:new Date(s.createdAt).toLocaleDateString(),formattedRequiredDate:s.requiredDate?new Date(s.requiredDate).toLocaleDateString():"Not specified",isOverdue:s.requiredDate&&new Date(s.requiredDate)<new Date,priorityScore:S(s),statusColor:T(s.status),priorityColor:b(s.priority)}),T=s=>({[R.PENDING]:"text-yellow-600 bg-yellow-100",[R.UNDER_REVIEW]:"text-blue-600 bg-blue-100",[R.APPROVED]:"text-green-600 bg-green-100",[R.REJECTED]:"text-red-600 bg-red-100",[R.IN_PROGRESS]:"text-purple-600 bg-purple-100",[R.COMPLETED]:"text-green-700 bg-green-200",[R.CANCELLED]:"text-gray-600 bg-gray-100"})[s]||"text-gray-600 bg-gray-100",b=s=>({[d.EMERGENCY]:"text-red-700 bg-red-200",[d.CRITICAL]:"text-red-600 bg-red-100",[d.HIGH]:"text-orange-600 bg-orange-100",[d.MEDIUM]:"text-yellow-600 bg-yellow-100",[d.LOW]:"text-green-600 bg-green-100"})[s]||"text-gray-600 bg-gray-100";return{error:q(()=>a.value),processing:q(()=>u.value),validateRequest:I,processRequestData:c,createRequest:w,updateRequest:L,deleteRequest:v,approveRequest:C,rejectRequest:A,cancelRequest:x,calculatePriorityScore:S,formatRequestForDisplay:O,getStatusColor:T,getPriorityColor:b}}export{_ as R,ee as a,d as b,H as c,m as d,X as e,U as f,R as g,M as u};