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