![]() Server : Apache/2 System : Linux server-15-235-50-60 5.15.0-164-generic #174-Ubuntu SMP Fri Nov 14 20:25:16 UTC 2025 x86_64 User : gositeme ( 1004) PHP Version : 8.2.29 Disable Function : exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname Directory : /home/gositeme/domains/lavocat.ca/private_html/.next/server/pages/api/admin/ |
"use strict";(()=>{var e={};e.id=9582,e.ids=[9582],e.modules={7816:(e,i,a)=>{a.r(i),a.d(i,{config:()=>p,default:()=>h,routeModule:()=>f});var t={};a.r(t),a.d(t,{default:()=>g});var s=a(33480),r=a(8667),n=a(86435),o=a(15806),l=a(41822),c=a(76760);class u{static analyzeCaseComplexity(e){let i=0,a=[];["urgent","court date","deadline","appeal","bail","hearing"].some(i=>e.urgentNeeds?.toLowerCase().includes(i)||e.message?.toLowerCase().includes(i))&&(i+=30,a.push("Time-sensitive case requiring immediate attention")),["wrongful conviction","appeal","class action","federal"].some(i=>e.message?.toLowerCase().includes(i)||e.reasonForJoining?.toLowerCase().includes(i))&&(i+=40,a.push("Complex legal matter requiring specialized expertise")),(e.documents?.length||0)>5&&(i+=20,a.push("High document volume requiring thorough review")),["bordeaux","leclerc"].includes(e.detaineeInfo?.facility)&&(i+=15,a.push("High-security facility with additional procedural requirements")),"French"!==e.preferredLanguage&&(i+=10,a.push("Bilingual communication requirements"));let t="low",s=20;return i>=70?(t="critical",s=80):i>=50?(t="high",s=60):i>=30&&(t="medium",s=40),{score:i,factors:a,urgency:t,estimatedHours:s}}static async calculateLawyerCapacity(e){let i=await c.z.user.findUnique({where:{id:e},include:{caseAssignments:{where:{isActive:!0},include:{registration:!0}}}});if(!i)throw Error("User not found");let a=i.caseAssignments.length,t=await c.z.caseAssignment.count({where:{userId:e,isActive:!1,registration:{status:"APPROVED"}}}),s=await c.z.caseAssignment.count({where:{userId:e}}),r=Math.max(0,40-20*a);return{userId:e,currentCaseload:a,specializations:i.specialization?[i.specialization]:[],successRate:s>0?t/s*100:50,availableHours:r,preferredCaseTypes:[]}}static async generateRecommendations(e){let i=await c.z.registration.findUnique({where:{id:e},include:{documents:!0,detaineeInfo:!0}});if(!i)throw Error("Registration not found");let a=this.analyzeCaseComplexity(i),t=await c.z.user.findMany({where:{role:{in:["LAWYER","ADMIN","SUPERADMIN","SUPERADMIN"]}}}),s=[];for(let e of t){let t=await this.calculateLawyerCapacity(e.id),r=50,n=[];t.availableHours>=a.estimatedHours?(r+=30,n.push(`Has ${t.availableHours} available hours for ${a.estimatedHours}h case`)):t.availableHours>0?(r+=10,n.push(`Limited availability: ${t.availableHours}h available`)):(r-=20,n.push("Currently at capacity with existing caseload")),t.successRate>80?(r+=20,n.push(`High success rate: ${t.successRate.toFixed(1)}%`)):t.successRate>60&&(r+=10,n.push(`Good success rate: ${t.successRate.toFixed(1)}%`)),t.specializations.some(e=>i.message?.toLowerCase().includes(e.toLowerCase())||i.reasonForJoining?.toLowerCase().includes(e.toLowerCase()))&&(r+=25,n.push("Specialization matches case requirements")),t.currentCaseload<=3?(r+=15,n.push("Optimal caseload for quality attention")):t.currentCaseload<=5?(r+=5,n.push("Manageable caseload")):(r-=10,n.push("Heavy caseload may impact attention")),e.name&&"French"===i.preferredLanguage&&["marie","jean","pierre","sophie","isabelle"].some(i=>e.name.toLowerCase().includes(i))&&(r+=10,n.push("Language compatibility with client preference")),"critical"===a.urgency&&t.availableHours>20&&(r+=15,n.push("Available for urgent case handling"));let o="primary_lawyer";(t.currentCaseload>5||a.score<30)&&(o="assistant_lawyer",n.push("Recommended as supporting attorney"));let l=new Date;t.availableHours<10&&l.setDate(l.getDate()+7),s.push({userId:e.id,confidence:Math.min(100,Math.max(0,r)),reasoning:n,role:o,estimatedStartDate:l})}return s.sort((e,i)=>i.confidence-e.confidence)}static async autoAssignOptimalTeam(e,i){let a=await this.generateRecommendations(e),t=await this.analyzeCaseComplexity(await c.z.registration.findUnique({where:{id:e},include:{documents:!0,detaineeInfo:!0}})),s=[];if(a.length>0){let t=a[0];s.push(await c.z.caseAssignment.create({data:{registrationId:e,userId:t.userId,role:"primary_lawyer",assignedBy:i}}))}if(t.score>=50&&a.length>1){let t=a[1];s.push(await c.z.caseAssignment.create({data:{registrationId:e,userId:t.userId,role:"assistant_lawyer",assignedBy:i}}))}if(t.score>=70){let a=await c.z.user.findMany({where:{role:{in:["SECRETARY","ASSISTANT"]}}});a.length>0&&s.push(await c.z.caseAssignment.create({data:{registrationId:e,userId:a[0].id,role:"secretary",assignedBy:i}}))}return s}}class d{static async findSimilarCases(e){let i=await c.z.registration.findUnique({where:{id:e},include:{documents:!0,detaineeInfo:!0,caseAssignments:{include:{user:!0}}}});if(!i)return[];let a=this.createCaseProfile(i),t=await c.z.registration.findMany({where:{status:{in:["APPROVED","REJECTED"]},id:{not:e}},include:{documents:!0,detaineeInfo:!0,caseAssignments:{include:{user:!0}}}}),s=[];for(let e of t){let i=this.createCaseProfile(e),t=this.calculateSimilarity(a,i);t>.3&&s.push({id:e.id,similarity:t,outcome:e.status,duration:this.calculateCaseDuration(e),assignedTeam:e.caseAssignments.map(e=>e.user.name).filter(e=>null!==e),successFactors:this.extractSuccessFactors(e)})}return s.sort((e,i)=>i.similarity-e.similarity).slice(0,10)}static async getSmartRecommendations(e){let i=await c.z.registration.findUnique({where:{id:e},include:{documents:!0,detaineeInfo:!0}});if(!i)return[];let a=this.createCaseProfile(i),t=await this.findSimilarCases(e),s=await c.z.user.findMany({where:{role:{in:["LAWYER","ADMIN","SUPERADMIN","SUPERADMIN"]}},include:{caseAssignments:{include:{registration:!0}}}}),r=[];for(let e of s){let i=await this.evaluateLawyerMatch(e,a,t);r.push(i)}return r.sort((e,i)=>i.matchScore-e.matchScore).slice(0,5)}static createCaseProfile(e){let i=this.extractKeywords(e.message+" "+(e.reasonForJoining||"")),a=this.calculateComplexity(e);return{id:e.id,complexity:a,keywords:i,facility:e.detaineeInfo?.facility||"unknown",caseType:this.determineCaseType(e),urgency:this.determineUrgency(e),documentCount:e.documents?.length||0,language:e.preferredLanguage||"French"}}static extractKeywords(e){let i=["the","a","an","and","or","but","in","on","at","to","for","of","with","by"],a=e.toLowerCase().replace(/[^\w\s]/g,"").split(/\s+/).filter(e=>e.length>3&&!i.includes(e)),t={};return a.forEach(e=>{t[e]=(t[e]||0)+1}),Object.entries(t).sort(([,e],[,i])=>i-e).slice(0,10).map(([e])=>e)}static calculateComplexity(e){let i;return i=0+Math.min(5*(e.documents?.length||0),25),["urgent","court","hearing","deadline","appeal"].some(i=>e.message?.toLowerCase().includes(i)||e.urgentNeeds?.toLowerCase().includes(i))&&(i+=20),["appeal","wrongful conviction","class action","federal"].some(i=>e.message?.toLowerCase().includes(i))&&(i+=30),["bordeaux","leclerc"].includes(e.detaineeInfo?.facility?.toLowerCase())&&(i+=15),Math.min(i,100)}static determineCaseType(e){let i=(e.message+" "+(e.reasonForJoining||"")).toLowerCase();return i.includes("appeal")?"appeal":i.includes("wrongful conviction")?"wrongful_conviction":i.includes("bail")?"bail":i.includes("sentence")?"sentencing":i.includes("parole")?"parole":i.includes("conditions")?"conditions":"general"}static determineUrgency(e){let i=(e.message+" "+(e.urgentNeeds||"")).toLowerCase();return i.includes("urgent")||i.includes("immediate")?"critical":i.includes("court date")||i.includes("hearing")?"high":i.includes("deadline")?"medium":"low"}static calculateSimilarity(e,i){let a,t=0;a=0+.3*this.calculateKeywordSimilarity(e.keywords,i.keywords),t+=.3,e.facility===i.facility&&(a+=.15),t+=.15,e.caseType===i.caseType&&(a+=.2),t+=.2,a+=.2*Math.max(0,1-Math.abs(e.complexity-i.complexity)/100),t+=.2;let s=["low","medium","high","critical"];return a+=.1*Math.max(0,1-Math.abs(s.indexOf(e.urgency)-s.indexOf(i.urgency))/3),t+=.1,e.language===i.language&&(a+=.05),a/(t+=.05)}static calculateKeywordSimilarity(e,i){let a=new Set(e),t=new Set(i),s=new Set(Array.from(a).filter(e=>t.has(e))),r=new Set([...e,...i]);return 0===r.size?0:s.size/r.size}static calculateCaseDuration(e){if(!e.createdAt||!e.updatedAt)return 0;let i=new Date(e.createdAt);return Math.ceil((new Date(e.updatedAt).getTime()-i.getTime())/864e5)}static extractSuccessFactors(e){let i=[];if("APPROVED"===e.status){let a=e.caseAssignments.map(e=>e.role);a.includes("primary_lawyer")&&a.includes("assistant_lawyer")&&i.push("Full legal team assigned"),30>this.calculateCaseDuration(e)&&i.push("Resolved quickly (< 30 days)"),e.documents?.length>3&&i.push("Comprehensive documentation"),e.caseAssignments.some(i=>i.user.specialization&&e.message?.toLowerCase().includes(i.user.specialization.toLowerCase()))&&i.push("Specialist lawyer assigned")}return i}static async evaluateLawyerMatch(e,i,a){let t=50,s=[],r=e.caseAssignments.filter(e=>{let a=this.createCaseProfile(e.registration);return this.calculateSimilarity(i,a)>.5}).length;r>0&&(t+=Math.min(10*r,30),s.push(`Has handled ${r} similar cases`)),e.specialization&&i.keywords.some(i=>e.specialization.toLowerCase().includes(i)||i.includes(e.specialization.toLowerCase()))&&(t+=20,s.push("Specialization matches case requirements"));let n=e.caseAssignments.filter(e=>["APPROVED","REJECTED"].includes(e.registration.status)),o=n.filter(e=>"APPROVED"===e.registration.status),l=n.length>0?o.length/n.length*100:50;l>80?(t+=15,s.push(`High success rate: ${l.toFixed(1)}%`)):l>60&&(t+=8,s.push(`Good success rate: ${l.toFixed(1)}%`));let c=e.caseAssignments.filter(e=>e.isActive).length;c<=3?(t+=10,s.push("Optimal workload for attention to detail")):c>6&&(t-=15,s.push("Heavy workload may impact case attention")),"French"!==i.language&&e.name&&["john","mary","david","sarah","michael"].some(i=>e.name.toLowerCase().includes(i))&&(t+=5,s.push("Language compatibility"));let u=this.calculateAverageDuration(e.caseAssignments);return{userId:e.id,name:e.name,matchScore:Math.min(t,100),expertise:e.specialization?[e.specialization]:[],pastPerformance:{similarCases:r,successRate:l,averageDuration:u},availability:{currentLoad:c,nextAvailable:new Date},reasoning:s}}static calculateAverageDuration(e){let i=e.filter(e=>["APPROVED","REJECTED"].includes(e.registration.status));return 0===i.length?45:Math.round(i.reduce((e,i)=>e+this.calculateCaseDuration(i.registration),0)/i.length)}static async getCaseInsights(e){let i=await this.findSimilarCases(e),a=await this.getSmartRecommendations(e);return{similarCases:i.slice(0,5),recommendedLawyers:a.slice(0,3),predictedOutcome:this.predictOutcome(i),estimatedDuration:this.estimateDuration(i),riskFactors:this.identifyRiskFactors(i),successStrategies:this.extractSuccessStrategies(i)}}static predictOutcome(e){if(0===e.length)return{prediction:"Unknown",confidence:0};let i=e.map(e=>e.outcome),a=i.filter(e=>"APPROVED"===e).length;i.filter(e=>"REJECTED"===e).length;let t=a/i.length;return{prediction:t>.5?"APPROVED":"REJECTED",confidence:Math.max(t,1-t),approvalRate:100*t}}static estimateDuration(e){if(0===e.length)return 45;let i=e.map(e=>e.duration);return Math.round(i.reduce((e,i)=>e+i,0)/i.length)}static identifyRiskFactors(e){let i=e.filter(e=>"REJECTED"===e.outcome),a=[];return i.length>.3*e.length&&a.push("High rejection rate for similar cases"),e.filter(e=>e.duration>90).length>.4*e.length&&a.push("Similar cases tend to take longer than average"),a}static extractSuccessStrategies(e){let i=e.filter(e=>"APPROVED"===e.outcome),a=[],t=i.flatMap(e=>e.successFactors),s={};return t.forEach(e=>{s[e]=(s[e]||0)+1}),Object.entries(s).sort(([,e],[,i])=>i-e).slice(0,5).forEach(([e,t])=>{t>.3*i.length&&a.push(e)}),a}}var m=a(8168);async function g(e,i){if("POST"!==e.method)return i.status(405).json({error:"Method not allowed"});try{let a,t=await (0,o.getServerSession)(e,i,l.N);if(!t?.user||!["ADMIN","SUPERADMIN","LAWYER"].includes(t.user.role))return i.status(403).json({error:"Access denied"});let{registrationId:s,type:r="full"}=e.body;if(!s)return i.status(400).json({error:"Registration ID is required"});switch(r){case"ai_assignment":a=await u.generateRecommendations(s);break;case"smart_match":a=await d.getCaseInsights(s);break;case"auto_assign":a=await u.autoAssignOptimalTeam(s,t.user.id);break;default:let[n,c]=await Promise.all([u.generateRecommendations(s),d.getCaseInsights(s)]);a={ai_recommendations:n,smart_match:c,timestamp:new Date().toISOString()}}m.v.info("AI recommendations generated",{registrationId:s,type:r,userId:t.user.id,recommendationCount:Array.isArray(a)?a.length:1}),i.status(200).json(a)}catch(e){m.v.error("Error generating AI recommendations",{error:e}),i.status(500).json({error:"Failed to generate recommendations"})}}let h=(0,n.M)(t,"default"),p=(0,n.M)(t,"config"),f=new s.PagesAPIRouteModule({definition:{kind:r.A.PAGES_API,page:"/api/admin/ai-recommendations",pathname:"/api/admin/ai-recommendations",bundlePath:"",filename:""},userland:t})},8168:(e,i,a)=>{a.d(i,{v:()=>s});class t{formatMessage(e,i,a){let t=new Date().toISOString(),s=a?JSON.stringify(a,null,2):"";return`[${t}] [${e.toUpperCase()}] ${i}${s?`
Context: ${s}`:""}`}log(e,i,a){let t=this.formatMessage(e,i,a);this.isDevelopment?console.log(`${{debug:"\x1b[36m",info:"\x1b[32m",warn:"\x1b[33m",error:"\x1b[31m",security:"\x1b[35m"}[e]}${t}\x1b[0m`):console.log(t),"security"===e&&console.error(`🔒 SECURITY EVENT: ${t}`)}debug(e,i){this.isDevelopment&&this.log("debug",e,i)}info(e,i){this.log("info",e,i)}warn(e,i){this.log("warn",e,i)}error(e,i,a){let t={...a,error:i instanceof Error?{name:i.name,message:i.message,stack:i.stack}:i};this.log("error",e,t)}security(e,i){this.log("security",e,i)}getRequestContext(e,i){return{ip:e.headers["x-forwarded-for"]||e.connection.remoteAddress||"unknown",userAgent:e.headers["user-agent"]||"unknown",path:e.url||"unknown",method:e.method||"unknown",timestamp:new Date().toISOString(),...i}}authEvent(e,i){this.security(`AUTH_EVENT: ${e}`,{event:e,...i})}adminAction(e,i){this.security(`ADMIN_ACTION: ${e}`,{action:e,...i})}constructor(){this.isDevelopment=!1}}let s=new t},8667:(e,i)=>{Object.defineProperty(i,"A",{enumerable:!0,get:function(){return a}});var a=function(e){return e.PAGES="PAGES",e.PAGES_API="PAGES_API",e.APP_PAGE="APP_PAGE",e.APP_ROUTE="APP_ROUTE",e.IMAGE="IMAGE",e}({})},15806:e=>{e.exports=require("next-auth/next")},16382:e=>{e.exports=require("next-auth/providers/credentials")},33480:(e,i,a)=>{e.exports=a(75600)},41822:(e,i,a)=>{a.d(i,{N:()=>o});var t=a(16382),s=a.n(t),r=a(74729),n=a(76760);let o={providers:[s()({name:"Credentials",credentials:{email:{label:"Email",type:"email"},password:{label:"Password",type:"password"}},async authorize(e){if(!e?.email||!e?.password)return null;try{let i=await n.z.user.findUnique({where:{email:e.email},select:{id:!0,email:!0,password:!0,role:!0,name:!0,isVerified:!0,verificationStatus:!0}});if(!i||!await (0,r.compare)(e.password,i.password))return null;let{password:a,...t}=i;return{...t,name:t.name||t.email}}catch(e){return console.error("Auth error:",e),null}}})],session:{strategy:"jwt",maxAge:2592e3},cookies:{sessionToken:{name:"__Secure-next-auth.session-token",options:{httpOnly:!0,sameSite:"lax",path:"/",secure:!0,domain:process.env.COOKIE_DOMAIN}}},pages:{signIn:"/auth/login",signOut:"/auth/login",error:"/auth/error"},callbacks:{async jwt({token:e,user:i,trigger:a}){try{if(console.log("JWT Callback - trigger:",a),console.log("JWT Callback - user:",i?{id:i.id,email:i.email,role:i.role}:null),i)e.id=i.id,e.role=i.role,e.email=i.email,e.name=i.name||i.email,e.profilePicture=i.profilePicture||void 0,e.username=i.username||void 0,e.isVerified=i.isVerified||!1,e.verificationStatus=i.verificationStatus||"PENDING",e.isImpersonating=i.isImpersonating||!1,e.originalUser=i.originalUser||void 0,console.log("JWT Callback - Updated token from user:",{id:e.id,role:e.role,isImpersonating:e.isImpersonating});else if(e.id)try{console.log("JWT Callback - Checking for impersonation sessions...");let i=await n.z.impersonationSession.findFirst({where:{originalUserId:e.id,isActive:!0,expiresAt:{gt:new Date}},include:{impersonatedUser:{select:{id:!0,email:!0,name:!0,role:!0,profilePicture:!0,username:!0}},originalUser:{select:{id:!0,email:!0,name:!0,role:!0,profilePicture:!0,username:!0}}}});if(i){let a=i.impersonatedUser;e.id=a.id,e.email=a.email,e.name=a.name||a.email,e.role=a.role,e.profilePicture=a.profilePicture||void 0,e.username=a.username||void 0,e.isImpersonating=!0,e.originalUser={id:i.originalUser.id,email:i.originalUser.email,name:i.originalUser.name||i.originalUser.email,role:i.originalUser.role,profilePicture:i.originalUser.profilePicture||void 0,username:i.originalUser.username||void 0},console.log("JWT Callback - Applied impersonation:",{originalId:e.originalUser.id,impersonatedId:e.id,originalRole:e.originalUser.role,impersonatedRole:e.role})}else e.isImpersonating&&(e.originalUser&&(console.log("JWT Callback - Restoring original user from token"),e.id=e.originalUser.id,e.email=e.originalUser.email,e.name=e.originalUser.name||e.originalUser.email,e.role=e.originalUser.role,e.profilePicture=e.originalUser.profilePicture||void 0,e.username=e.originalUser.username||void 0),e.isImpersonating=!1,e.originalUser=void 0,console.log("JWT Callback - Cleared impersonation state"))}catch(i){console.error("JWT Callback - Database error:",i),e.isImpersonating&&e.originalUser&&(console.log("JWT Callback - Error occurred, restoring original user"),e.id=e.originalUser.id,e.email=e.originalUser.email,e.name=e.originalUser.name||e.originalUser.email,e.role=e.originalUser.role,e.profilePicture=e.originalUser.profilePicture||void 0,e.username=e.originalUser.username||void 0,e.isImpersonating=!1,e.originalUser=void 0)}return console.log("JWT Callback - Final token:",{id:e.id,email:e.email,role:e.role,isImpersonating:e.isImpersonating}),e}catch(i){return console.error("JWT Callback - Error:",i),e}},async session({session:e,token:i}){try{return console.log("Session Callback - token:",{id:i.id,email:i.email,role:i.role,isImpersonating:i.isImpersonating}),console.log("Session Callback - session before:",e),i&&e.user&&(e.user.id=i.id,e.user.role=i.role,e.user.email=i.email,e.user.name=i.name,e.user.profilePicture=i.profilePicture,e.user.username=i.username,e.user.isVerified=i.isVerified,e.user.verificationStatus=i.verificationStatus,e.user.isImpersonating=i.isImpersonating,e.user.originalUser=i.originalUser),console.log("Session Callback - session after:",e),console.log("Session Callback - Final user ID:",e.user?.id),e}catch(i){return console.error("Session Callback - Error:",i),e}},redirect:async({url:e,baseUrl:i})=>e===i||e===`${i}/`||e.endsWith("/auth/login")?i:e.startsWith("/")?`${i}${e}`:e.startsWith(i)?e:i},secret:process.env.NEXTAUTH_SECRET||"3560f921b7bbf968e64fbc2835960840d184fcb95977e960a2124de6bbbed2d3",debug:!1}},74729:e=>{e.exports=require("bcryptjs")},75600:e=>{e.exports=require("next/dist/compiled/next-server/pages-api.runtime.prod.js")},76760:(e,i,a)=>{a.d(i,{z:()=>s});var t=a(96330);let s=globalThis.prisma??new t.PrismaClient({log:["error"]})},86435:(e,i)=>{Object.defineProperty(i,"M",{enumerable:!0,get:function(){return function e(i,a){return a in i?i[a]:"then"in i&&"function"==typeof i.then?i.then(i=>e(i,a)):"function"==typeof i&&"default"===a?i:void 0}}})},96330:e=>{e.exports=require("@prisma/client")}};var i=require("../../../webpack-api-runtime.js");i.C(e);var a=i(i.s=7816);module.exports=a})();