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.*; | ||||
|  | ||||
| @RestController | ||||
| @CrossOrigin(originPatterns = "*", allowCredentials = "true") | ||||
| public class MinervalController { | ||||
|     private final AuthenticatorService authServ; | ||||
|     private final MinervalRepository mr; | ||||
| @ -42,4 +43,14 @@ public class MinervalController { | ||||
|         Minerval m = mlist.get(0); | ||||
|         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.web.bind.annotation.*; | ||||
| import ovh.herisson.Clyde.Repositories.MinervalRepository; | ||||
| import ovh.herisson.Clyde.Repositories.TokenRepository; | ||||
| import ovh.herisson.Clyde.Repositories.UserCurriculumRepository; | ||||
| import ovh.herisson.Clyde.Repositories.UserRepository; | ||||
| @ -29,7 +30,9 @@ public class MockController { | ||||
|  | ||||
|     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.userRepo = userRepo; | ||||
|         this.tokenService = tokenService; | ||||
| @ -38,6 +41,7 @@ public class MockController { | ||||
|         this.courseService = courseService; | ||||
|         this.inscriptionService = inscriptionService; | ||||
|         this.ucr = ucr; | ||||
|         this.minervalRepository = minervalRepository; | ||||
|     } | ||||
|  | ||||
|     /** Saves an example of each user type by : | ||||
| @ -61,6 +65,8 @@ public class MockController { | ||||
|  | ||||
|         userRepo.saveAll(mockUsers); | ||||
|  | ||||
|         Minerval minerval = new Minerval(joe.getRegNo(), 0, 852, 2023); | ||||
|         minervalRepository.save(minerval); | ||||
|         // Course / Curriculum part | ||||
|  | ||||
|         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 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.stereotype.Service; | ||||
| import ovh.herisson.Clyde.Repositories.CurriculumRepository; | ||||
| import ovh.herisson.Clyde.Repositories.InscriptionRepository; | ||||
| 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; | ||||
| import ovh.herisson.Clyde.Repositories.*; | ||||
| import ovh.herisson.Clyde.Tables.*; | ||||
|  | ||||
| @Service | ||||
| public class InscriptionService { | ||||
| @ -22,14 +16,16 @@ public class InscriptionService { | ||||
|  | ||||
|     private final CurriculumRepository curriculumRepo; | ||||
|  | ||||
|     private final MinervalRepository minervalRepository; | ||||
|     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.userRepo = userRepo; | ||||
|         this.userCurriculumRepo = userCurriculumRepo; | ||||
|         this.curriculumRepo = curriculumRepo; | ||||
|         this.minervalRepository = minervalRepository; | ||||
|     } | ||||
|  | ||||
|     public InscriptionRequest save(InscriptionRequest inscriptionRequest){ | ||||
| @ -82,6 +78,11 @@ public class InscriptionService { | ||||
|  | ||||
|             userRepo.save(userFromRequest); | ||||
|             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); | ||||
|         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){ | ||||
|     await validateRegister(id,review); | ||||
|     if (review == "Accepted"){ | ||||
|  | ||||
|     } | ||||
|     requests.value = await getAllRegisters(); | ||||
|   } | ||||
| </script> | ||||
|  | ||||
| @ -6,12 +6,15 @@ | ||||
|   import i18n from "@/i18n.js" | ||||
|   import { uploadProfilePicture } from '@/rest/uploads.js' | ||||
|   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 UserCurriculum = ref("");  | ||||
|   const curricula = ref (await getAllCurriculums()); | ||||
|  | ||||
|   const minerv = ref({}); | ||||
|   if(user.value.role === "Student"){ | ||||
|     minerv.value = ref(await getCurrentMinerval(user.value.regNo)); | ||||
|     UserCurriculum.value = await getSomeonesCurriculumList(user.value.regNo); | ||||
|   } | ||||
|  | ||||
| @ -22,7 +25,8 @@ | ||||
|   const curric = ref(false); | ||||
|   const reg = ref(false); | ||||
|   const courseslist = ref(false); | ||||
|  | ||||
|   const minerval = ref(false); | ||||
|   const paymentPage = ref(false); | ||||
|   const pattern = { | ||||
|     profilPictureUrl:null, | ||||
|     email:null, | ||||
| @ -37,7 +41,16 @@ | ||||
|     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 personnalInfos =  Object.assign({}, patternInfos); | ||||
|    | ||||
| @ -117,7 +130,7 @@ | ||||
|       <img class="subContainter" :src=getPP()> | ||||
|     </div> | ||||
|       <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> | ||||
|             {{user.firstName}} {{user.lastName}}    | ||||
|           </div> | ||||
| @ -142,6 +155,42 @@ | ||||
|           </div> | ||||
|           <div v-if="(user.role==='Student')"> | ||||
|             <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 v-else-if="modif" class="infosContainer"> | ||||
| @ -207,7 +256,7 @@ | ||||
|           </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="listTitle"> | ||||
|               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