Implements the possibility to ask for a scholarship for a student
This commit is contained in:
		@ -7,26 +7,42 @@ import org.springframework.web.bind.annotation.PostMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestBody;
 | 
			
		||||
import org.springframework.web.bind.annotation.RestController;
 | 
			
		||||
import ovh.herisson.Clyde.Repositories.ExemptionsRequestRepository;
 | 
			
		||||
import ovh.herisson.Clyde.Repositories.ScholarshipRequestRepository;
 | 
			
		||||
import ovh.herisson.Clyde.Tables.ExemptionsRequest;
 | 
			
		||||
import ovh.herisson.Clyde.Tables.RequestState;
 | 
			
		||||
import ovh.herisson.Clyde.Tables.ScholarshipRequest;
 | 
			
		||||
 | 
			
		||||
@RestController
 | 
			
		||||
@CrossOrigin(originPatterns = "*", allowCredentials = "true")
 | 
			
		||||
public class RequestsController {
 | 
			
		||||
 | 
			
		||||
    public final ExemptionsRequestRepository err;
 | 
			
		||||
    public final ScholarshipRequestRepository srr;
 | 
			
		||||
 | 
			
		||||
    public RequestsController(ExemptionsRequestRepository err) {
 | 
			
		||||
    public RequestsController(ExemptionsRequestRepository err, ScholarshipRequestRepository srr) {
 | 
			
		||||
        this.err = err;
 | 
			
		||||
        this.srr = srr;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @PostMapping(value="/exemptionreq")
 | 
			
		||||
    public ResponseEntity<String> register(@RequestBody ExemptionsRequest exemptionsRequest){
 | 
			
		||||
 | 
			
		||||
        //This line ensures that the request is sent in pending state not matter what
 | 
			
		||||
        exemptionsRequest.setState(RequestState.Pending);
 | 
			
		||||
 | 
			
		||||
        err.save(exemptionsRequest);
 | 
			
		||||
 | 
			
		||||
        return new ResponseEntity<>(HttpStatus.CREATED);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @PostMapping(value="/scholarshipreq")
 | 
			
		||||
    public ResponseEntity<String> register(@RequestBody ScholarshipRequest scholarshipRequest){
 | 
			
		||||
 | 
			
		||||
        //This line ensures that the request is sent in pending state not matter what
 | 
			
		||||
        scholarshipRequest.setState(RequestState.Pending);
 | 
			
		||||
 | 
			
		||||
        srr.save(scholarshipRequest);
 | 
			
		||||
 | 
			
		||||
        return new ResponseEntity<>(HttpStatus.CREATED);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,8 @@
 | 
			
		||||
package ovh.herisson.Clyde.Repositories;
 | 
			
		||||
 | 
			
		||||
import org.springframework.data.repository.CrudRepository;
 | 
			
		||||
import ovh.herisson.Clyde.Tables.ScholarshipRequest;
 | 
			
		||||
 | 
			
		||||
public interface ScholarshipRequestRepository extends CrudRepository<ScholarshipRequest, Long> {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -2,35 +2,39 @@ package ovh.herisson.Clyde.Tables;
 | 
			
		||||
 | 
			
		||||
import jakarta.persistence.*;
 | 
			
		||||
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
 | 
			
		||||
@Entity
 | 
			
		||||
public class ScholarshipRequest {
 | 
			
		||||
    @Id
 | 
			
		||||
    @GeneratedValue(strategy = GenerationType.AUTO)
 | 
			
		||||
    private int id;
 | 
			
		||||
    private long id;
 | 
			
		||||
 | 
			
		||||
    @ManyToOne
 | 
			
		||||
    @JoinColumn(name = "Users")
 | 
			
		||||
    private User user;
 | 
			
		||||
    private long userId;
 | 
			
		||||
    private RequestState state;
 | 
			
		||||
    private String requestForm;
 | 
			
		||||
    private Date date;
 | 
			
		||||
    private int amount;
 | 
			
		||||
 | 
			
		||||
    private String taxDocUrl;
 | 
			
		||||
    private String residencyDocUrl;
 | 
			
		||||
 | 
			
		||||
    public ScholarshipRequest(User user, RequestState state, String requestForm, int amount){
 | 
			
		||||
        this.user = user;
 | 
			
		||||
    public ScholarshipRequest(long userId, RequestState state, int amount, Date date, String taxDocUrl, String residencyDocUrl){
 | 
			
		||||
        this.userId = userId;
 | 
			
		||||
        this.state = state;
 | 
			
		||||
        this.requestForm = requestForm;
 | 
			
		||||
        this.amount = amount;
 | 
			
		||||
        this.date = date;
 | 
			
		||||
        this.taxDocUrl = taxDocUrl;
 | 
			
		||||
        this.residencyDocUrl = residencyDocUrl;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public ScholarshipRequest(){}
 | 
			
		||||
 | 
			
		||||
    public User getUser() {
 | 
			
		||||
        return user;
 | 
			
		||||
    public Long getUserId() {
 | 
			
		||||
        return userId;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setUser(User user) {
 | 
			
		||||
        this.user = user;
 | 
			
		||||
    public void setUserId(Long userId) {
 | 
			
		||||
        this.userId = userId;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public RequestState getState() {
 | 
			
		||||
@ -41,14 +45,6 @@ public class ScholarshipRequest {
 | 
			
		||||
        this.state = state;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getRequestForm() {
 | 
			
		||||
        return requestForm;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setRequestForm(String requestForm) {
 | 
			
		||||
        this.requestForm = requestForm;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public int getAmount() {
 | 
			
		||||
        return amount;
 | 
			
		||||
    }
 | 
			
		||||
@ -56,4 +52,32 @@ public class ScholarshipRequest {
 | 
			
		||||
    public void setAmount(int amount) {
 | 
			
		||||
        this.amount = amount;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public Date getDate() {
 | 
			
		||||
        return date;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setDate(Date date) {
 | 
			
		||||
        this.date = date;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public long getId() {
 | 
			
		||||
        return id;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getResidencyDocUrl() {
 | 
			
		||||
        return residencyDocUrl;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setResidencyDocUrl(String residencyDocUrl) {
 | 
			
		||||
        this.residencyDocUrl = residencyDocUrl;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public String getTaxDocUrl() {
 | 
			
		||||
        return taxDocUrl;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void setTaxDocUrl(String taxDocUrl) {
 | 
			
		||||
        this.taxDocUrl = taxDocUrl;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -20,11 +20,6 @@ async function updateCourseList(){
 | 
			
		||||
  courseslist.value = await getcurriculum(selectedCurriculum.value.curriculumId)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function uploadfileandgetpath(file, type){
 | 
			
		||||
  const a = await uploadFile(file, type);
 | 
			
		||||
  exemptReq.justifDocument = a.url
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function postExemptionRequest(file, type){
 | 
			
		||||
  const a = await uploadFile(file, type);
 | 
			
		||||
  exemptReq.justifDocument = a.url
 | 
			
		||||
 | 
			
		||||
@ -4,10 +4,11 @@
 | 
			
		||||
  import {getSelfCurriculum, getAllCurriculums, getSomeonesCurriculumList} from '../rest/curriculum.js'
 | 
			
		||||
  import {getCourses} from "../rest/courses.js"
 | 
			
		||||
  import i18n from "@/i18n.js"
 | 
			
		||||
  import { uploadProfilePicture } from '@/rest/uploads.js'
 | 
			
		||||
  import {uploadFile, uploadProfilePicture} from '@/rest/uploads.js'
 | 
			
		||||
  import CourseList from "@/Apps/CourseList.vue";
 | 
			
		||||
  import {editMinerval, getCurrentMinerval} from "@/rest/minerval.js";
 | 
			
		||||
  import {postPayment} from "@/rest/payment.js";
 | 
			
		||||
  import {createScholarshipRequest} from "@/rest/requests.js";
 | 
			
		||||
 | 
			
		||||
  const user = ref(await getSelf());
 | 
			
		||||
  const UserCurriculum = ref(""); 
 | 
			
		||||
@ -27,6 +28,8 @@
 | 
			
		||||
  const courseslist = ref(false);
 | 
			
		||||
  const minerval = ref(false);
 | 
			
		||||
  const paymentPage = ref(false);
 | 
			
		||||
  const scholarship = ref(false);
 | 
			
		||||
  const scholarshipinfos = ref(false);
 | 
			
		||||
  const pattern = {
 | 
			
		||||
    profilPictureUrl:null,
 | 
			
		||||
    email:null,
 | 
			
		||||
@ -50,6 +53,17 @@
 | 
			
		||||
    expDate:null,
 | 
			
		||||
    amount: null
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  //Used to modelize a scholarship request
 | 
			
		||||
  const scholarshipData=reactive({
 | 
			
		||||
    userId: user.value.regNo,
 | 
			
		||||
    state:null,
 | 
			
		||||
    date:null,
 | 
			
		||||
    amount:0,
 | 
			
		||||
    taxDocUrl : "",
 | 
			
		||||
    residencyDocUrl : ""
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  const paymentAmount = ref(0);
 | 
			
		||||
  let toModify= Object.assign({}, pattern);
 | 
			
		||||
  let personnalInfos =  Object.assign({}, patternInfos);
 | 
			
		||||
@ -121,6 +135,18 @@
 | 
			
		||||
    }
 | 
			
		||||
    return actualCurriculumList
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async function postScholarshipRequest(file1, type1, file2, type2){
 | 
			
		||||
    const a = await uploadFile(file1, type1)
 | 
			
		||||
    scholarshipData.taxDocUrl =  a.url;
 | 
			
		||||
 | 
			
		||||
    const b = await uploadFile(file2, type2)
 | 
			
		||||
    scholarshipData.residencyDocUrl = b.url;
 | 
			
		||||
 | 
			
		||||
    scholarshipData.date = Date.now();
 | 
			
		||||
 | 
			
		||||
    await createScholarshipRequest(scholarshipData)
 | 
			
		||||
  }
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<template>
 | 
			
		||||
@ -130,7 +156,7 @@
 | 
			
		||||
      <img class="subContainter" :src=getPP()>
 | 
			
		||||
    </div>
 | 
			
		||||
      <div class="globalInfos">
 | 
			
		||||
        <div v-if="modif==false && curric==false && reg==false && minerval==false && paymentPage == false" class="infosContainer">
 | 
			
		||||
        <div v-if="modif==false && curric==false && reg==false && minerval==false && paymentPage == false && scholarship==false" class="infosContainer">
 | 
			
		||||
          <div>
 | 
			
		||||
            {{user.firstName}} {{user.lastName}}   
 | 
			
		||||
          </div>
 | 
			
		||||
@ -171,6 +197,30 @@
 | 
			
		||||
          <div v-else>
 | 
			
		||||
            Payment : School fees have already been paid this year
 | 
			
		||||
          </div>
 | 
			
		||||
          <div>
 | 
			
		||||
            <button @click="scholarship=!scholarship; minerval=!minerval">Ask for a scholarship</button>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div v-else-if="scholarship && !scholarshipinfos" class="infosContainer">
 | 
			
		||||
          <p>Please upload the required documents</p>
 | 
			
		||||
          <div>
 | 
			
		||||
            Tax justification document :
 | 
			
		||||
            <input type="file" @change="scholarshipData.taxDocUrl = $event.target.files">
 | 
			
		||||
          </div>
 | 
			
		||||
          <div>
 | 
			
		||||
            Residency justification document :
 | 
			
		||||
            <input type="file" style="margin-top:2%" @change="scholarshipData.residencyDocUrl = $event.target.files">
 | 
			
		||||
          </div>
 | 
			
		||||
          <button style="margin-top: 5%" @click="scholarshipinfos = !scholarshipinfos;postScholarshipRequest(scholarshipData.taxDocUrl, 'JustificationDocument',scholarshipData.residencyDocUrl, 'JustificationDocument');">Submit scholarship request</button>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div v-else-if="scholarship && scholarshipinfos" class="infosContainer">
 | 
			
		||||
          <div>
 | 
			
		||||
            Your request has been sent to the inscription service you will get notified when
 | 
			
		||||
            the request is reviewed.
 | 
			
		||||
          </div>
 | 
			
		||||
          <button @click="scholarshipinfos=!scholarshipinfos; scholarship=!scholarship">
 | 
			
		||||
            Go back to profile
 | 
			
		||||
          </button>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div v-else-if="paymentPage" class="infosContainer">
 | 
			
		||||
          Proceed to payment of {{paymentAmount}}€
 | 
			
		||||
@ -256,7 +306,7 @@
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div v-if="modif==false && curric==false && reg==false && minerval==false"class="moreInfos">
 | 
			
		||||
      <div v-if="modif==false && curric==false && reg==false && minerval==false && scholarship == false"class="moreInfos">
 | 
			
		||||
          <div class = "oldcursus">
 | 
			
		||||
            <div class="listTitle">
 | 
			
		||||
              Anciens Cursus
 | 
			
		||||
 | 
			
		||||
@ -3,3 +3,7 @@ import {restPost} from "@/rest/restConsumer.js";
 | 
			
		||||
export async function createExemptionsRequest(exempReq){
 | 
			
		||||
    return restPost("/exemptionreq", exempReq)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export async function createScholarshipRequest(scholReq){
 | 
			
		||||
    return restPost("/scholarshipreq", scholReq)
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user