Implements the school fees gestion for a student and a payment table containing a history of all the financial transactions of the system
This commit is contained in:
		| @ -13,6 +13,7 @@ import ovh.herisson.Clyde.Tables.Role; | |||||||
| import java.util.*; | import java.util.*; | ||||||
|  |  | ||||||
| @RestController | @RestController | ||||||
|  | @CrossOrigin(originPatterns = "*", allowCredentials = "true") | ||||||
| public class MinervalController { | public class MinervalController { | ||||||
|     private final AuthenticatorService authServ; |     private final AuthenticatorService authServ; | ||||||
|     private final MinervalRepository mr; |     private final MinervalRepository mr; | ||||||
| @ -42,4 +43,14 @@ public class MinervalController { | |||||||
|         Minerval m = mlist.get(0); |         Minerval m = mlist.get(0); | ||||||
|         return new ResponseEntity<>(m, HttpStatus.OK); |         return new ResponseEntity<>(m, HttpStatus.OK); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @PatchMapping("/minerval") | ||||||
|  |     public ResponseEntity<Object> updateMinerval(@RequestBody Minerval updatedMinerval){ | ||||||
|  |         Minerval minerval = mr.findById(updatedMinerval.getId()); | ||||||
|  |  | ||||||
|  |         minerval.setPaidAmount(updatedMinerval.getPaidAmount()); | ||||||
|  |         minerval.setToPay(updatedMinerval.getToPay()); | ||||||
|  |         mr.save(minerval); | ||||||
|  |         return new ResponseEntity<>(HttpStatus.OK); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ package ovh.herisson.Clyde.EndPoints; | |||||||
|  |  | ||||||
| import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; | import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; | ||||||
| import org.springframework.web.bind.annotation.*; | import org.springframework.web.bind.annotation.*; | ||||||
|  | import ovh.herisson.Clyde.Repositories.MinervalRepository; | ||||||
| import ovh.herisson.Clyde.Repositories.TokenRepository; | import ovh.herisson.Clyde.Repositories.TokenRepository; | ||||||
| import ovh.herisson.Clyde.Repositories.UserCurriculumRepository; | import ovh.herisson.Clyde.Repositories.UserCurriculumRepository; | ||||||
| import ovh.herisson.Clyde.Repositories.UserRepository; | import ovh.herisson.Clyde.Repositories.UserRepository; | ||||||
| @ -29,7 +30,9 @@ public class MockController { | |||||||
|  |  | ||||||
|     public final UserCurriculumRepository ucr; |     public final UserCurriculumRepository ucr; | ||||||
|  |  | ||||||
|     public MockController(UserRepository userRepo, TokenRepository tokenRepo, TokenService tokenService, CurriculumCourseService CurriculumCourseService, CurriculumService curriculumService, CourseService courseService, InscriptionService inscriptionService, UserCurriculumRepository ucr){ |     public final MinervalRepository minervalRepository; | ||||||
|  |  | ||||||
|  |     public MockController(UserRepository userRepo, TokenRepository tokenRepo, TokenService tokenService, CurriculumCourseService CurriculumCourseService, CurriculumService curriculumService, CourseService courseService, InscriptionService inscriptionService, UserCurriculumRepository ucr, MinervalRepository minervalRepository){ | ||||||
|         this.tokenRepo = tokenRepo; |         this.tokenRepo = tokenRepo; | ||||||
|         this.userRepo = userRepo; |         this.userRepo = userRepo; | ||||||
|         this.tokenService = tokenService; |         this.tokenService = tokenService; | ||||||
| @ -38,6 +41,7 @@ public class MockController { | |||||||
|         this.courseService = courseService; |         this.courseService = courseService; | ||||||
|         this.inscriptionService = inscriptionService; |         this.inscriptionService = inscriptionService; | ||||||
|         this.ucr = ucr; |         this.ucr = ucr; | ||||||
|  |         this.minervalRepository = minervalRepository; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** Saves an example of each user type by : |     /** Saves an example of each user type by : | ||||||
| @ -61,6 +65,8 @@ public class MockController { | |||||||
|  |  | ||||||
|         userRepo.saveAll(mockUsers); |         userRepo.saveAll(mockUsers); | ||||||
|  |  | ||||||
|  |         Minerval minerval = new Minerval(joe.getRegNo(), 0, 852, 2023); | ||||||
|  |         minervalRepository.save(minerval); | ||||||
|         // Course / Curriculum part |         // Course / Curriculum part | ||||||
|  |  | ||||||
|         Curriculum infoBab1 = new Curriculum(1,"info"); |         Curriculum infoBab1 = new Curriculum(1,"info"); | ||||||
|  | |||||||
| @ -0,0 +1,42 @@ | |||||||
|  | package ovh.herisson.Clyde.EndPoints; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | import org.springframework.http.HttpStatus; | ||||||
|  | import org.springframework.http.ResponseEntity; | ||||||
|  | import org.springframework.web.bind.annotation.*; | ||||||
|  | import ovh.herisson.Clyde.Repositories.PaymentRepository; | ||||||
|  | import ovh.herisson.Clyde.Responses.UnauthorizedResponse; | ||||||
|  | import ovh.herisson.Clyde.Tables.Minerval; | ||||||
|  | import ovh.herisson.Clyde.Tables.Payment; | ||||||
|  | import ovh.herisson.Clyde.Tables.Role; | ||||||
|  |  | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.Calendar; | ||||||
|  | import java.util.GregorianCalendar; | ||||||
|  |  | ||||||
|  | @RestController | ||||||
|  | @CrossOrigin(originPatterns = "*", allowCredentials = "true") | ||||||
|  | public class PaymentController { | ||||||
|  |  | ||||||
|  |     private final PaymentRepository paymentRepository; | ||||||
|  |  | ||||||
|  |     public PaymentController(PaymentRepository paymentRepository){ | ||||||
|  |         this.paymentRepository = paymentRepository; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     //Post a payment record | ||||||
|  |     @PostMapping("/payment") | ||||||
|  |     public ResponseEntity<Object> postPayment(@RequestBody Payment payment){ | ||||||
|  |         paymentRepository.save(payment); | ||||||
|  |         return new ResponseEntity<>(HttpStatus.OK); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     //Get all payment records of a student | ||||||
|  |     @GetMapping("/payment/{studentRegNo}") | ||||||
|  |     public ResponseEntity<ArrayList<Payment>> getPaymentsByUser(@PathVariable long studentRegNo){ | ||||||
|  |         ArrayList<Payment> toReturn = paymentRepository.getPaymentsByStudentRegNo(studentRegNo); | ||||||
|  |         return new ResponseEntity<>(toReturn, HttpStatus.OK); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -7,4 +7,6 @@ import java.util.ArrayList; | |||||||
|  |  | ||||||
| public interface MinervalRepository extends CrudRepository<Minerval, Long> { | public interface MinervalRepository extends CrudRepository<Minerval, Long> { | ||||||
|     public ArrayList<Minerval> getMinervalsByStudentRegNoOrderByYearDesc(Long studentRegNo); |     public ArrayList<Minerval> getMinervalsByStudentRegNoOrderByYearDesc(Long studentRegNo); | ||||||
|  |  | ||||||
|  |     public Minerval findById(long id); | ||||||
| } | } | ||||||
|  | |||||||
| @ -0,0 +1,10 @@ | |||||||
|  | package ovh.herisson.Clyde.Repositories; | ||||||
|  |  | ||||||
|  | import org.springframework.data.repository.CrudRepository; | ||||||
|  | import ovh.herisson.Clyde.Tables.Payment; | ||||||
|  |  | ||||||
|  | import java.util.ArrayList; | ||||||
|  |  | ||||||
|  | public interface PaymentRepository extends CrudRepository<Payment, Long> { | ||||||
|  |     public ArrayList<Payment> getPaymentsByStudentRegNo(long regNo); | ||||||
|  | } | ||||||
| @ -2,14 +2,8 @@ package ovh.herisson.Clyde.Services; | |||||||
|  |  | ||||||
| import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; | import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; | ||||||
| import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||||
| import ovh.herisson.Clyde.Repositories.CurriculumRepository; | import ovh.herisson.Clyde.Repositories.*; | ||||||
| import ovh.herisson.Clyde.Repositories.InscriptionRepository; | import ovh.herisson.Clyde.Tables.*; | ||||||
| import ovh.herisson.Clyde.Repositories.UserCurriculumRepository; |  | ||||||
| import ovh.herisson.Clyde.Repositories.UserRepository; |  | ||||||
| import ovh.herisson.Clyde.Tables.InscriptionRequest; |  | ||||||
| import ovh.herisson.Clyde.Tables.RequestState; |  | ||||||
| import ovh.herisson.Clyde.Tables.User; |  | ||||||
| import ovh.herisson.Clyde.Tables.UserCurriculum; |  | ||||||
|  |  | ||||||
| @Service | @Service | ||||||
| public class InscriptionService { | public class InscriptionService { | ||||||
| @ -22,14 +16,16 @@ public class InscriptionService { | |||||||
|  |  | ||||||
|     private final CurriculumRepository curriculumRepo; |     private final CurriculumRepository curriculumRepo; | ||||||
|  |  | ||||||
|  |     private final MinervalRepository minervalRepository; | ||||||
|     private final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); |     private final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); | ||||||
|  |  | ||||||
|  |  | ||||||
|     public InscriptionService(InscriptionRepository inscriptionRepo, UserRepository userRepo, UserCurriculumRepository userCurriculumRepo, CurriculumRepository curriculumRepo){ |     public InscriptionService(InscriptionRepository inscriptionRepo, UserRepository userRepo, UserCurriculumRepository userCurriculumRepo, CurriculumRepository curriculumRepo, MinervalRepository minervalRepository){ | ||||||
|         this.inscriptionRepo = inscriptionRepo; |         this.inscriptionRepo = inscriptionRepo; | ||||||
|         this.userRepo = userRepo; |         this.userRepo = userRepo; | ||||||
|         this.userCurriculumRepo = userCurriculumRepo; |         this.userCurriculumRepo = userCurriculumRepo; | ||||||
|         this.curriculumRepo = curriculumRepo; |         this.curriculumRepo = curriculumRepo; | ||||||
|  |         this.minervalRepository = minervalRepository; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public InscriptionRequest save(InscriptionRequest inscriptionRequest){ |     public InscriptionRequest save(InscriptionRequest inscriptionRequest){ | ||||||
| @ -82,6 +78,11 @@ public class InscriptionService { | |||||||
|  |  | ||||||
|             userRepo.save(userFromRequest); |             userRepo.save(userFromRequest); | ||||||
|             userCurriculumRepo.save(new UserCurriculum(userFromRequest, curriculumRepo.findById(inscrRequest.getCurriculumId()),0)); |             userCurriculumRepo.save(new UserCurriculum(userFromRequest, curriculumRepo.findById(inscrRequest.getCurriculumId()),0)); | ||||||
|  |  | ||||||
|  |             //Create a minerval for the new student | ||||||
|  |             Minerval minerval = new Minerval(userFromRequest.getRegNo(), 0, 852, 2023); | ||||||
|  |             minervalRepository.save(minerval); | ||||||
|  |  | ||||||
|         } |         } | ||||||
|         inscrRequest.setState(requestState); |         inscrRequest.setState(requestState); | ||||||
|         save(inscrRequest); |         save(inscrRequest); | ||||||
|  | |||||||
							
								
								
									
										84
									
								
								backend/src/main/java/ovh/herisson/Clyde/Tables/Payment.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								backend/src/main/java/ovh/herisson/Clyde/Tables/Payment.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,84 @@ | |||||||
|  | package ovh.herisson.Clyde.Tables; | ||||||
|  |  | ||||||
|  | import jakarta.persistence.Entity; | ||||||
|  | import jakarta.persistence.GeneratedValue; | ||||||
|  | import jakarta.persistence.GenerationType; | ||||||
|  | import jakarta.persistence.Id; | ||||||
|  |  | ||||||
|  | import java.util.Date; | ||||||
|  |  | ||||||
|  | @Entity | ||||||
|  | public class Payment { | ||||||
|  |     @Id | ||||||
|  |     @GeneratedValue(strategy = GenerationType.AUTO) | ||||||
|  |     private long id; | ||||||
|  |  | ||||||
|  |     private long studentRegNo; | ||||||
|  |     private String card; | ||||||
|  |     private String client; | ||||||
|  |     private Date expDate; | ||||||
|  |     private int amount; | ||||||
|  |     private Date date; | ||||||
|  |     public Payment(){} | ||||||
|  |  | ||||||
|  |     public Payment(long studentRegNo, String card, String client, Date expDate, int amount, Date date){ | ||||||
|  |         this.studentRegNo = studentRegNo; | ||||||
|  |         this.card = card; | ||||||
|  |         this.client = client; | ||||||
|  |         this.expDate = expDate; | ||||||
|  |         this.amount = amount; | ||||||
|  |         this.date = date; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public long getStudentRegNo() { | ||||||
|  |         return studentRegNo; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setStudentRegNo(long studentRegNo) { | ||||||
|  |         this.studentRegNo = studentRegNo; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public String getCard() { | ||||||
|  |         return card; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setCard(String card) { | ||||||
|  |         this.card = card; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public String getClient() { | ||||||
|  |         return client; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setClient(String client) { | ||||||
|  |         this.client = client; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public Date getExpDate() { | ||||||
|  |         return expDate; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setExpDate(Date expDate) { | ||||||
|  |         this.expDate = expDate; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public int getAmount() { | ||||||
|  |         return amount; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setAmount(int amount) { | ||||||
|  |         this.amount = amount; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public long getId() { | ||||||
|  |         return id; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public Date getDate() { | ||||||
|  |         return date; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setDate(Date date) { | ||||||
|  |         this.date = date; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -12,6 +12,9 @@ | |||||||
|  |  | ||||||
|   async function upPage(id,review){ |   async function upPage(id,review){ | ||||||
|     await validateRegister(id,review); |     await validateRegister(id,review); | ||||||
|  |     if (review == "Accepted"){ | ||||||
|  |  | ||||||
|  |     } | ||||||
|     requests.value = await getAllRegisters(); |     requests.value = await getAllRegisters(); | ||||||
|   } |   } | ||||||
| </script> | </script> | ||||||
|  | |||||||
| @ -6,12 +6,15 @@ | |||||||
|   import i18n from "@/i18n.js" |   import i18n from "@/i18n.js" | ||||||
|   import { uploadProfilePicture } from '@/rest/uploads.js' |   import { uploadProfilePicture } from '@/rest/uploads.js' | ||||||
|   import CourseList from "@/Apps/CourseList.vue"; |   import CourseList from "@/Apps/CourseList.vue"; | ||||||
|  |   import {editMinerval, getCurrentMinerval} from "@/rest/minerval.js"; | ||||||
|  |   import {postPayment} from "@/rest/payment.js"; | ||||||
|  |  | ||||||
|   const user = ref(await getSelf()); |   const user = ref(await getSelf()); | ||||||
|   const UserCurriculum = ref("");  |   const UserCurriculum = ref("");  | ||||||
|   const curricula = ref (await getAllCurriculums()); |   const curricula = ref (await getAllCurriculums()); | ||||||
|  |   const minerv = ref({}); | ||||||
|   if(user.value.role === "Student"){ |   if(user.value.role === "Student"){ | ||||||
|  |     minerv.value = ref(await getCurrentMinerval(user.value.regNo)); | ||||||
|     UserCurriculum.value = await getSomeonesCurriculumList(user.value.regNo); |     UserCurriculum.value = await getSomeonesCurriculumList(user.value.regNo); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @ -22,7 +25,8 @@ | |||||||
|   const curric = ref(false); |   const curric = ref(false); | ||||||
|   const reg = ref(false); |   const reg = ref(false); | ||||||
|   const courseslist = ref(false); |   const courseslist = ref(false); | ||||||
|  |   const minerval = ref(false); | ||||||
|  |   const paymentPage = ref(false); | ||||||
|   const pattern = { |   const pattern = { | ||||||
|     profilPictureUrl:null, |     profilPictureUrl:null, | ||||||
|     email:null, |     email:null, | ||||||
| @ -37,7 +41,16 @@ | |||||||
|     id:null, |     id:null, | ||||||
|   } |   } | ||||||
|  |  | ||||||
|    |   //Used to modelize a payment | ||||||
|  |   const paymentData={ | ||||||
|  |     studentRegNo: user.value.regNo, | ||||||
|  |     date:null, | ||||||
|  |     card:null, | ||||||
|  |     client:null, | ||||||
|  |     expDate:null, | ||||||
|  |     amount: null | ||||||
|  |   } | ||||||
|  |   const paymentAmount = ref(0); | ||||||
|   let toModify= Object.assign({}, pattern); |   let toModify= Object.assign({}, pattern); | ||||||
|   let personnalInfos =  Object.assign({}, patternInfos); |   let personnalInfos =  Object.assign({}, patternInfos); | ||||||
|    |    | ||||||
| @ -117,7 +130,7 @@ | |||||||
|       <img class="subContainter" :src=getPP()> |       <img class="subContainter" :src=getPP()> | ||||||
|     </div> |     </div> | ||||||
|       <div class="globalInfos"> |       <div class="globalInfos"> | ||||||
|         <div v-if="modif==false && curric==false && reg==false" class="infosContainer"> |         <div v-if="modif==false && curric==false && reg==false && minerval==false && paymentPage == false" class="infosContainer"> | ||||||
|           <div> |           <div> | ||||||
|             {{user.firstName}} {{user.lastName}}    |             {{user.firstName}} {{user.lastName}}    | ||||||
|           </div> |           </div> | ||||||
| @ -142,6 +155,42 @@ | |||||||
|           </div> |           </div> | ||||||
|           <div v-if="(user.role==='Student')"> |           <div v-if="(user.role==='Student')"> | ||||||
|             <button @click="courseslist=!courseslist">Manage Courses</button> |             <button @click="courseslist=!courseslist">Manage Courses</button> | ||||||
|  |             <button @click="minerval = !minerval" style="margin-left: 2%">Manage minerval</button> | ||||||
|  |           </div> | ||||||
|  |         </div> | ||||||
|  |         <div v-else-if="minerval" class="infosContainer"> | ||||||
|  |           <div v-if="minerv.value.toPay != 0"> | ||||||
|  |             Payment : {{minerv.value.toPay}}€ left to pay | ||||||
|  |             <div v-if="minerv.value.paidAmount <= 50"> | ||||||
|  |               <button @click="minerval = !minerval; paymentPage = !paymentPage; paymentAmount = 50">Pay deposit (50€)</button> | ||||||
|  |             </div> | ||||||
|  |             <div> | ||||||
|  |               <button @click="minerval = !minerval; paymentPage = !paymentPage; paymentAmount = minerv.value.toPay">Pay all the rest ({{minerv.value.toPay}}€)</button> | ||||||
|  |             </div> | ||||||
|  |           </div> | ||||||
|  |           <div v-else> | ||||||
|  |             Payment : School fees have already been paid this year | ||||||
|  |           </div> | ||||||
|  |         </div> | ||||||
|  |         <div v-else-if="paymentPage" class="infosContainer"> | ||||||
|  |           Proceed to payment of {{paymentAmount}}€ | ||||||
|  |           <div style="margin-top: 1%"> | ||||||
|  |             Client: | ||||||
|  |             <input type="text" v-model="paymentData.client"> | ||||||
|  |           </div> | ||||||
|  |           <div style="margin-top: 1%"> | ||||||
|  |             Card: | ||||||
|  |             <input type="text" v-model="paymentData.card"> | ||||||
|  |           </div> | ||||||
|  |           <div style="margin-top: 1%"> | ||||||
|  |             ExpDate: | ||||||
|  |             <input type="date" v-model="paymentData.expDate"> | ||||||
|  |           </div> | ||||||
|  |           <div style="margin-top: 1%"> | ||||||
|  |             <button @click="paymentPage=!paymentPage;minerval=!minerval;paymentData.amount=paymentAmount;paymentData.date=new Date();postPayment(paymentData);minerv.value.toPay -= paymentAmount; minerv.value.paidAmount += paymentAmount; editMinerval(minerv.value)">Process Payment</button> | ||||||
|  |           </div> | ||||||
|  |           <div> | ||||||
|  |             <button @click="minerval = !minerval; paymentPage = !paymentPage;">Back</button> | ||||||
|           </div> |           </div> | ||||||
|         </div> |         </div> | ||||||
|         <div v-else-if="modif" class="infosContainer"> |         <div v-else-if="modif" class="infosContainer"> | ||||||
| @ -207,7 +256,7 @@ | |||||||
|           </div> |           </div> | ||||||
|         </div> |         </div> | ||||||
|       </div> |       </div> | ||||||
|       <div v-if="modif==false && curric==false && reg==false "class="moreInfos"> |       <div v-if="modif==false && curric==false && reg==false && minerval==false"class="moreInfos"> | ||||||
|           <div class = "oldcursus"> |           <div class = "oldcursus"> | ||||||
|             <div class="listTitle"> |             <div class="listTitle"> | ||||||
|               Anciens Cursus |               Anciens Cursus | ||||||
|  | |||||||
							
								
								
									
										9
									
								
								frontend/src/rest/minerval.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								frontend/src/rest/minerval.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | import {restGet, restPatch, restPost} from "@/rest/restConsumer.js"; | ||||||
|  |  | ||||||
|  | export async function getCurrentMinerval(userRegNo){ | ||||||
|  |     return restGet("/minerval/"+userRegNo) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export async function editMinerval(updatedMinerval){ | ||||||
|  |     return restPatch("/minerval", updatedMinerval) | ||||||
|  | } | ||||||
							
								
								
									
										6
									
								
								frontend/src/rest/payment.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								frontend/src/rest/payment.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | |||||||
|  | import {restPost} from "@/rest/restConsumer.js"; | ||||||
|  |  | ||||||
|  | export async function postPayment(payment){ | ||||||
|  |     return restPost("/payment", payment) | ||||||
|  | } | ||||||
|  |  | ||||||
		Reference in New Issue
	
	Block a user