diff --git a/src/main/java/fr/atlantique/imt/inf211/jobmngt/controller/JobOfferController.java b/src/main/java/fr/atlantique/imt/inf211/jobmngt/controller/JobOfferController.java new file mode 100644 index 0000000000000000000000000000000000000000..53fc3eb2c478dccd242a62a425e4e01f359b8fe1 --- /dev/null +++ b/src/main/java/fr/atlantique/imt/inf211/jobmngt/controller/JobOfferController.java @@ -0,0 +1,159 @@ +package fr.atlantique.imt.inf211.jobmngt.controller; + +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +import fr.atlantique.imt.inf211.jobmngt.entity.Company; +import fr.atlantique.imt.inf211.jobmngt.entity.JobOffer; +import fr.atlantique.imt.inf211.jobmngt.entity.QualificationLevel; +import fr.atlantique.imt.inf211.jobmngt.entity.Sector; +import fr.atlantique.imt.inf211.jobmngt.service.CompanyService; +import fr.atlantique.imt.inf211.jobmngt.service.JobOfferService; +import fr.atlantique.imt.inf211.jobmngt.service.QualificationLevelService; +import fr.atlantique.imt.inf211.jobmngt.service.SectorService; + +@Controller +@RequestMapping("/jobs") +public class JobOfferController { + + private static final Logger log = LoggerFactory.getLogger(JobOfferController.class); // ✅ Ajout du logger + + private final JobOfferService jobOfferService; + private final CompanyService companyService; + private final QualificationLevelService qualificationLevelService; + private final SectorService sectorService; + + @Autowired + public JobOfferController(JobOfferService jobOfferService, + CompanyService companyService, + QualificationLevelService qualificationLevelService, + SectorService sectorService) { + this.jobOfferService = jobOfferService; + this.companyService = companyService; + this.qualificationLevelService = qualificationLevelService; + this.sectorService = sectorService; + } + + // ✅ Affiche la liste des offres d'emploi avec log + @GetMapping + public String listJobOffers(Model model) { + List<JobOffer> jobOffers = jobOfferService.getAllJobOffers(); + log.info("🔎 Nombre d'offres récupérées: {}", jobOffers.size()); + + model.addAttribute("jobOffers", jobOffers); + return "jobOffer/jobOfferList"; + } + + // ✅ Affiche les détails d'une offre + @GetMapping("/view/{id}") + public String viewJobOffer(@PathVariable("id") int id, Model model, RedirectAttributes redirectAttributes) { + Optional<JobOffer> jobOfferOpt = jobOfferService.findById(id); + if (jobOfferOpt.isPresent()) { + model.addAttribute("jobOffer", jobOfferOpt.get()); + return "jobOffer/jobOfferView"; + } else { + redirectAttributes.addFlashAttribute("errorMessage", "L'offre d'emploi avec ID " + id + " n'existe pas !"); + return "redirect:/jobs"; + } + } + + // ✅ Affiche le formulaire de création + @GetMapping("/create") + public String showCreateForm(Model model) { + List<QualificationLevel> levels = qualificationLevelService.listOfQualificationLevels(); + List<Company> companies = companyService.getAllCompanies(); + List<Sector> sectors = sectorService.listOfSectors(); + + // Ajout des logs pour voir si les listes sont vides + log.info("Loaded Qualification Levels: {}", levels.size()); + log.info("Loaded Companies: {}", companies.size()); + log.info("Loaded Sectors: {}", sectors.size()); + + model.addAttribute("jobOffer", new JobOffer()); + model.addAttribute("qualificationLevels", levels); + model.addAttribute("companies", companies); + model.addAttribute("sectors", sectors); + return "jobOffer/jobOfferForm"; + } + + // ✅ Enregistre une offre avec gestion des secteurs et des erreurs + @PostMapping("/save") + public String saveJobOffer(@ModelAttribute JobOffer jobOffer, + @RequestParam(value = "sectorIds", required = false) List<Integer> sectorIds, + RedirectAttributes redirectAttributes) { + try { + log.info("🔹 Tentative d'enregistrement: {}", jobOffer); + + // Associer les secteurs sélectionnés à l'offre d'emploi + if (sectorIds != null && !sectorIds.isEmpty()) { + Set<Sector> selectedSectors = sectorIds.stream() + .map(sectorService::findById) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toSet()); + + jobOffer.setSectors(selectedSectors); + } + + jobOfferService.saveJobOffer(jobOffer); + log.info("✅ Enregistrement réussi !"); + redirectAttributes.addFlashAttribute("successMessage", "✅ Offre d'emploi créée avec succès !"); + return "redirect:/jobs"; + } catch (Exception e) { + log.error("❌ Erreur lors de l'enregistrement: {}", e.getMessage()); + redirectAttributes.addFlashAttribute("errorMessage", "❌ Erreur lors de la création de l'offre !"); + return "redirect:/jobs/create"; + } + } + + // ✅ Supprime une offre d'emploi + @GetMapping("/delete/{id}") + public String deleteJobOffer(@PathVariable("id") int id, RedirectAttributes redirectAttributes) { + Optional<JobOffer> jobOfferOpt = jobOfferService.findById(id); + + if (jobOfferOpt.isPresent()) { + try { + jobOfferService.deleteJobOffer(id); + redirectAttributes.addFlashAttribute("successMessage", "✅ Offre d'emploi supprimée avec succès !"); + } catch (Exception e) { + log.error("❌ Erreur lors de la suppression de l'offre: {}", e.getMessage()); + redirectAttributes.addFlashAttribute("errorMessage", "❌ Erreur lors de la suppression de l'offre !"); + } + } else { + redirectAttributes.addFlashAttribute("errorMessage", "❌ L'offre d'emploi avec ID " + id + " n'existe pas !"); + } + + return "redirect:/jobs"; + } + + // ✅ Affiche le formulaire de modification + @GetMapping("/{id}/edit") + public String showEditForm(@PathVariable("id") int id, Model model, RedirectAttributes redirectAttributes) { + Optional<JobOffer> jobOfferOpt = jobOfferService.findById(id); + if (jobOfferOpt.isPresent()) { + model.addAttribute("jobOffer", jobOfferOpt.get()); + model.addAttribute("companies", companyService.getAllCompanies()); + model.addAttribute("qualificationLevels", qualificationLevelService.listOfQualificationLevels()); + model.addAttribute("sectors", sectorService.listOfSectors()); + return "jobOffer/jobOfferForm"; + } else { + redirectAttributes.addFlashAttribute("errorMessage", "L'offre d'emploi avec ID " + id + " n'existe pas !"); + return "redirect:/jobs"; + } + } +} diff --git a/src/main/java/fr/atlantique/imt/inf211/jobmngt/entity/JobOffer.java b/src/main/java/fr/atlantique/imt/inf211/jobmngt/entity/JobOffer.java index 2838c90dae951c415c8cfe1557df68780722efbb..dbc643b04756af42ea44f302108449fc196ef7a6 100644 --- a/src/main/java/fr/atlantique/imt/inf211/jobmngt/entity/JobOffer.java +++ b/src/main/java/fr/atlantique/imt/inf211/jobmngt/entity/JobOffer.java @@ -6,6 +6,7 @@ import java.util.Set; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; @@ -31,14 +32,14 @@ public class JobOffer implements java.io.Serializable { @SequenceGenerator(name = "JOBOFFER_ID_GENERATOR", sequenceName = "JOBOFFER_ID_SEQ", allocationSize = 1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "JOBOFFER_ID_GENERATOR") @Column(name="id", unique = true, nullable = false) - private int id; + private Integer id; // 🔹 Modifié de int à Integer @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "compid", nullable = false) + @JoinColumn(name = "compid", nullable = true) // 🔹 nullable = true pour éviter les erreurs si null private Company company; @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "qualiflevelid", nullable = false) + @JoinColumn(name = "qualiflevelid", nullable = true) // 🔹 nullable = true pour éviter les erreurs si null private QualificationLevel qualificationLevel; @Column(name="title", nullable = false, length = 50) @@ -48,29 +49,33 @@ public class JobOffer implements java.io.Serializable { private String taskDescription; @Temporal(TemporalType.DATE) +<<<<<<< HEAD +======= + @DateTimeFormat(pattern = "yyyy-MM-dd") +>>>>>>> d9a17a2 (new_feat) @Column(name="publicationdate") private Date publicationDate; - @ManyToMany(fetch = FetchType.LAZY) + @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) // 🔹 Ajout du cascade pour assurer la persistance @JoinTable(name="indexjoboffersector", schema="public", joinColumns = { @JoinColumn(name="jobofferid", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name="sectorid", nullable = false, updatable = false) }) @JsonIgnoreProperties({"applications", "jobOffers"}) // Empêche les boucles JSON infinies private Set<Sector> sectors = new HashSet<>(); - @OneToMany(fetch = FetchType.LAZY, mappedBy = "jobOffer") // Correction du mappedBy + @OneToMany(fetch = FetchType.LAZY, mappedBy = "jobOffer", cascade = CascadeType.ALL) // 🔹 Ajout du cascade private Set<OfferMessage> offerMessages = new HashSet<>(); public JobOffer() {} - public JobOffer(int id, Company company, QualificationLevel qualificationLevel, String title) { + public JobOffer(Integer id, Company company, QualificationLevel qualificationLevel, String title) { this.id = id; this.company = company; this.qualificationLevel = qualificationLevel; this.title = title; } - public JobOffer(int id, Company company, QualificationLevel qualificationLevel, String title, + public JobOffer(Integer id, Company company, QualificationLevel qualificationLevel, String title, String taskDescription, Date publicationDate, Set<Sector> sectors, Set<OfferMessage> offerMessages) { this.id = id; this.company = company; @@ -82,8 +87,8 @@ public class JobOffer implements java.io.Serializable { this.offerMessages = offerMessages; } - public int getId() { return id; } - public void setId(int id) { this.id = id; } + public Integer getId() { return id; } + public void setId(Integer id) { this.id = id; } public Company getCompany() { return company; } public void setCompany(Company company) { this.company = company; } @@ -108,3 +113,237 @@ public class JobOffer implements java.io.Serializable { } +<<<<<<< HEAD +======= + + + + + +// package fr.atlantique.imt.inf211.jobmngt.entity; + +// import java.util.Date; +// import java.util.HashSet; +// import java.util.Set; + +// import org.springframework.format.annotation.DateTimeFormat; + +// import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +// import jakarta.persistence.Column; +// import jakarta.persistence.Entity; +// import jakarta.persistence.FetchType; +// import jakarta.persistence.GeneratedValue; +// import jakarta.persistence.GenerationType; +// import jakarta.persistence.Id; +// import jakarta.persistence.JoinColumn; +// import jakarta.persistence.JoinTable; +// import jakarta.persistence.ManyToMany; +// import jakarta.persistence.ManyToOne; +// import jakarta.persistence.OneToMany; +// import jakarta.persistence.SequenceGenerator; +// import jakarta.persistence.Table; +// import jakarta.persistence.Temporal; +// import jakarta.persistence.TemporalType; + +// @Entity +// @Table(name="joboffer", schema="public") +// @JsonIgnoreProperties({"offerMessages"}) // ✅ Évite la surcharge JSON circulaire +// public class JobOffer implements java.io.Serializable { + +// @Id +// @SequenceGenerator(name = "JOBOFFER_ID_GENERATOR", sequenceName = "JOBOFFER_ID_SEQ", allocationSize = 1) +// @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "JOBOFFER_ID_GENERATOR") +// @Column(name="id", unique = true, nullable = false) +// private int id; + +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name = "compid", nullable = false) +// private Company company; + +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name = "qualiflevelid", nullable = false) +// private QualificationLevel qualificationLevel; + +// @Column(name="title", nullable = false, length = 50) +// private String title; + +// @Column(name="taskdescription") +// private String taskDescription; + +// @Temporal(TemporalType.DATE) +// @DateTimeFormat(pattern = "yyyy-MM-dd") +// @Column(name="publicationdate") +// private Date publicationDate; + +// @ManyToMany(fetch = FetchType.LAZY) +// @JoinTable(name="indexjoboffersector", schema="public", +// joinColumns = { @JoinColumn(name="jobofferid", nullable = false, updatable = false) }, +// inverseJoinColumns = { @JoinColumn(name="sectorid", nullable = false, updatable = false) }) +// @JsonIgnoreProperties({"applications", "jobOffers"}) // Empêche les boucles JSON infinies +// private Set<Sector> sectors = new HashSet<>(); + +// @OneToMany(fetch = FetchType.LAZY, mappedBy = "jobOffer") // Correction du mappedBy +// private Set<OfferMessage> offerMessages = new HashSet<>(); + +// public JobOffer() {} + +// public JobOffer(int id, Company company, QualificationLevel qualificationLevel, String title) { +// this.id = id; +// this.company = company; +// this.qualificationLevel = qualificationLevel; +// this.title = title; +// } + +// public JobOffer(int id, Company company, QualificationLevel qualificationLevel, String title, +// String taskDescription, Date publicationDate, Set<Sector> sectors, Set<OfferMessage> offerMessages) { +// this.id = id; +// this.company = company; +// this.qualificationLevel = qualificationLevel; +// this.title = title; +// this.taskDescription = taskDescription; +// this.publicationDate = publicationDate; +// this.sectors = sectors; +// this.offerMessages = offerMessages; +// } + +// public int getId() { return id; } +// public void setId(int id) { this.id = id; } + +// public Company getCompany() { return company; } +// public void setCompany(Company company) { this.company = company; } + +// public QualificationLevel getQualificationLevel() { return qualificationLevel; } +// public void setQualificationLevel(QualificationLevel qualificationLevel) { this.qualificationLevel = qualificationLevel; } + +// public String getTitle() { return title; } +// public void setTitle(String title) { this.title = title; } + +// public String getTaskDescription() { return taskDescription; } +// public void setTaskDescription(String taskDescription) { this.taskDescription = taskDescription; } + +// public Date getPublicationDate() { return publicationDate; } +// public void setPublicationDate(Date publicationDate) { this.publicationDate = publicationDate; } + +// public Set<Sector> getSectors() { return sectors; } +// public void setSectors(Set<Sector> sectors) { this.sectors = sectors; } + +// public Set<OfferMessage> getOfferMessages() { return offerMessages; } +// public void setOfferMessages(Set<OfferMessage> offerMessages) { this.offerMessages = offerMessages; } +// } + + + + + +// // package fr.atlantique.imt.inf211.jobmngt.entity; + +// // import java.util.Date; +// // import java.util.HashSet; +// // import java.util.Set; + +// // import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +// // import jakarta.persistence.Column; +// // import jakarta.persistence.Entity; +// // import jakarta.persistence.FetchType; +// // import jakarta.persistence.GeneratedValue; +// // import jakarta.persistence.GenerationType; +// // import jakarta.persistence.Id; +// // import jakarta.persistence.JoinColumn; +// // import jakarta.persistence.JoinTable; +// // import jakarta.persistence.ManyToMany; +// // import jakarta.persistence.ManyToOne; +// // import jakarta.persistence.OneToMany; +// // import jakarta.persistence.SequenceGenerator; +// // import jakarta.persistence.Table; +// // import jakarta.persistence.Temporal; +// // import jakarta.persistence.TemporalType; + +// // @Entity +// // @Table(name="joboffer", schema="public") +// // @JsonIgnoreProperties({"offerMessages"}) // ✅ Évite la surcharge JSON circulaire +// // public class JobOffer implements java.io.Serializable { + +// // @Id +// // @SequenceGenerator(name = "JOBOFFER_ID_GENERATOR", sequenceName = "JOBOFFER_ID_SEQ", allocationSize = 1) +// // @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "JOBOFFER_ID_GENERATOR") +// // @Column(name="id", unique = true, nullable = false) +// // private int id; + +// // @ManyToOne(fetch = FetchType.LAZY) +// // @JoinColumn(name = "compid", nullable = false) +// // private Company company; + +// // @ManyToOne(fetch = FetchType.LAZY) +// // @JoinColumn(name = "qualiflevelid", nullable = false) +// // private QualificationLevel qualificationLevel; + +// // @Column(name="title", nullable = false, length = 50) +// // private String title; + +// // @Column(name="taskdescription") +// // private String taskDescription; + +// // @Temporal(TemporalType.DATE) +// // @Column(name="publicationdate") +// // private Date publicationDate; + +// // @ManyToMany(fetch = FetchType.LAZY) +// // @JoinTable(name="indexjoboffersector", schema="public", +// // joinColumns = { @JoinColumn(name="jobofferid", nullable = false, updatable = false) }, +// // inverseJoinColumns = { @JoinColumn(name="sectorid", nullable = false, updatable = false) }) +// // @JsonIgnoreProperties({"applications", "jobOffers"}) // Empêche les boucles JSON infinies +// // private Set<Sector> sectors = new HashSet<>(); + +// // @OneToMany(fetch = FetchType.LAZY, mappedBy = "jobOffer") // Correction du mappedBy +// // private Set<OfferMessage> offerMessages = new HashSet<>(); + +// // public JobOffer() {} + +// // public JobOffer(int id, Company company, QualificationLevel qualificationLevel, String title) { +// // this.id = id; +// // this.company = company; +// // this.qualificationLevel = qualificationLevel; +// // this.title = title; +// // } + +// // public JobOffer(int id, Company company, QualificationLevel qualificationLevel, String title, +// // String taskDescription, Date publicationDate, Set<Sector> sectors, Set<OfferMessage> offerMessages) { +// // this.id = id; +// // this.company = company; +// // this.qualificationLevel = qualificationLevel; +// // this.title = title; +// // this.taskDescription = taskDescription; +// // this.publicationDate = publicationDate; +// // this.sectors = sectors; +// // this.offerMessages = offerMessages; +// // } + +// // public int getId() { return id; } +// // public void setId(int id) { this.id = id; } + +// // public Company getCompany() { return company; } +// // public void setCompany(Company company) { this.company = company; } + +// // public QualificationLevel getQualificationLevel() { return qualificationLevel; } +// // public void setQualificationLevel(QualificationLevel qualificationLevel) { this.qualificationLevel = qualificationLevel; } + +// // public String getTitle() { return title; } +// // public void setTitle(String title) { this.title = title; } + +// // public String getTaskDescription() { return taskDescription; } +// // public void setTaskDescription(String taskDescription) { this.taskDescription = taskDescription; } + +// // public Date getPublicationDate() { return publicationDate; } +// // public void setPublicationDate(Date publicationDate) { this.publicationDate = publicationDate; } + +// // public Set<Sector> getSectors() { return sectors; } +// // public void setSectors(Set<Sector> sectors) { this.sectors = sectors; } + +// // public Set<OfferMessage> getOfferMessages() { return offerMessages; } +// // public void setOfferMessages(Set<OfferMessage> offerMessages) { this.offerMessages = offerMessages; } +// // } + + +>>>>>>> d9a17a2 (new_feat) diff --git a/src/main/resources/templates/jobOffer/jobOfferForm.html b/src/main/resources/templates/jobOffer/jobOfferForm.html new file mode 100644 index 0000000000000000000000000000000000000000..0ca49b5302a9d081cc88bbf048edc0db161e2a9e --- /dev/null +++ b/src/main/resources/templates/jobOffer/jobOfferForm.html @@ -0,0 +1,73 @@ +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head> + <title>Créer une offre d'emploi</title> + <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"> +</head> +<body> + +<div class="container mt-4"> + <h2 class="text-center mb-4">Créer une offre d'emploi</h2> + + <form th:action="@{/jobs/save}" th:object="${jobOffer}" method="post"> + + <div class="mb-3"> + <label class="form-label">Titre :</label> + <input type="text" class="form-control" th:field="*{title}" required> + </div> + + <div class="mb-3"> + <label class="form-label">Description :</label> + <textarea class="form-control" rows="3" th:field="*{taskDescription}" required></textarea> + </div> + + <div class="mb-3"> + <label class="form-label">Date de publication :</label> + <input type="date" class="form-control" th:field="*{publicationDate}" required> + </div> + + <div class="mb-3"> + <label class="form-label">Entreprise :</label> + <select class="form-select" th:field="*{company}"> + <option value="">-- Sélectionner une entreprise --</option> + <option th:each="company : ${companies}" + th:value="${company.id}" + th:text="${company.denomination}" + th:selected="${company.id == jobOffer.company?.id}"></option> + </option> + </select> + + </div> + + <div class="mb-3"> + <label class="form-label">Niveau de qualification :</label> + <select class="form-select" th:field="*{qualificationLevel}"> + <option value="">Sélectionner un niveau de qualification</option> + <option th:each="level : ${qualificationLevels}" + th:value="${level.id}" + th:text="${level.label}" + th:selected="${level.id == jobOffer.qualificationLevel?.id}"> + </option> + </select> + + </div> + + <div class="mb-3"> + <label class="form-label">Secteurs d'activité :</label> + <select class="form-select" multiple th:name="sectorIds" required> + <option th:each="sector : ${sectors}" th:value="${sector.id}" th:text="${sector.label}"></option> + </select> + <small class="form-text text-muted">Maintenez "Ctrl" (ou "Cmd" sur Mac) pour sélectionner plusieurs secteurs.</small> + </div> + + <div class="text-center"> + <button type="submit" class="btn btn-success">Créer</button> + <a href="/jobs" class="btn btn-secondary">Retour</a> + </div> + + </form> +</div> + +<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> +</body> +</html> diff --git a/target/classes/fr/atlantique/imt/inf211/jobmngt/controller/CandidateController.class b/target/classes/fr/atlantique/imt/inf211/jobmngt/controller/CandidateController.class index 034a4816d5c366e2990a916e824458867e368983..579957c653e3aa7eab385453e60b4041dde48fdd 100644 Binary files a/target/classes/fr/atlantique/imt/inf211/jobmngt/controller/CandidateController.class and b/target/classes/fr/atlantique/imt/inf211/jobmngt/controller/CandidateController.class differ diff --git a/target/classes/fr/atlantique/imt/inf211/jobmngt/controller/JobOfferController.class b/target/classes/fr/atlantique/imt/inf211/jobmngt/controller/JobOfferController.class new file mode 100644 index 0000000000000000000000000000000000000000..b365da8ce8aa989128b15e82cb51b77e5c72bf9b Binary files /dev/null and b/target/classes/fr/atlantique/imt/inf211/jobmngt/controller/JobOfferController.class differ diff --git a/target/classes/fr/atlantique/imt/inf211/jobmngt/controller/QualificationLevelController.class b/target/classes/fr/atlantique/imt/inf211/jobmngt/controller/QualificationLevelController.class index a192bc80992984f36a4c4d20b52f60a87282e06f..98cf3b272d023db55d6abbd8ff8b653c15631e83 100644 Binary files a/target/classes/fr/atlantique/imt/inf211/jobmngt/controller/QualificationLevelController.class and b/target/classes/fr/atlantique/imt/inf211/jobmngt/controller/QualificationLevelController.class differ diff --git a/target/classes/fr/atlantique/imt/inf211/jobmngt/controller/TestApplicationDaoController.class b/target/classes/fr/atlantique/imt/inf211/jobmngt/controller/TestApplicationDaoController.class index ed3e253a93495fd012ddec42c8bee89ac98d2b53..55f4edd1d63c3a3fff908f8cdbd86d838c6098b3 100644 Binary files a/target/classes/fr/atlantique/imt/inf211/jobmngt/controller/TestApplicationDaoController.class and b/target/classes/fr/atlantique/imt/inf211/jobmngt/controller/TestApplicationDaoController.class differ diff --git a/target/classes/fr/atlantique/imt/inf211/jobmngt/controller/TestCompanyDaoController.class b/target/classes/fr/atlantique/imt/inf211/jobmngt/controller/TestCompanyDaoController.class index ced7c4abbb028e946bde3a8abd451803079c47fe..c1e513b3356c1f869aa61853b93a5dc1f6c0a331 100644 Binary files a/target/classes/fr/atlantique/imt/inf211/jobmngt/controller/TestCompanyDaoController.class and b/target/classes/fr/atlantique/imt/inf211/jobmngt/controller/TestCompanyDaoController.class differ diff --git a/target/classes/fr/atlantique/imt/inf211/jobmngt/controller/TestJobOfferDaoController.class b/target/classes/fr/atlantique/imt/inf211/jobmngt/controller/TestJobOfferDaoController.class index 2407686cf357bd91f10c131f30074a5af0b5ba0b..0f7f231d71b0380957d6fa28e13e6cbbe1384fba 100644 Binary files a/target/classes/fr/atlantique/imt/inf211/jobmngt/controller/TestJobOfferDaoController.class and b/target/classes/fr/atlantique/imt/inf211/jobmngt/controller/TestJobOfferDaoController.class differ diff --git a/target/classes/fr/atlantique/imt/inf211/jobmngt/dao/ApplicationDao.class b/target/classes/fr/atlantique/imt/inf211/jobmngt/dao/ApplicationDao.class index 8c9c5a69cb587e39f2cad47fbcb3968ad0ed3e69..c5c2e0b87938cb25bf348a5e06f72124db05bfdf 100644 Binary files a/target/classes/fr/atlantique/imt/inf211/jobmngt/dao/ApplicationDao.class and b/target/classes/fr/atlantique/imt/inf211/jobmngt/dao/ApplicationDao.class differ diff --git a/target/classes/fr/atlantique/imt/inf211/jobmngt/dao/CandidateDao.class b/target/classes/fr/atlantique/imt/inf211/jobmngt/dao/CandidateDao.class index 55b7090135c7e5ac4e8850371f500b20ca3e0ac6..26dd2232e49722cb6f51ad44c63f3570263091e9 100644 Binary files a/target/classes/fr/atlantique/imt/inf211/jobmngt/dao/CandidateDao.class and b/target/classes/fr/atlantique/imt/inf211/jobmngt/dao/CandidateDao.class differ diff --git a/target/classes/fr/atlantique/imt/inf211/jobmngt/dao/CompanyDao.class b/target/classes/fr/atlantique/imt/inf211/jobmngt/dao/CompanyDao.class index aab7b98c5433f7c7090af6f0bedf888361f1b168..e8cbbb27465da1b471bda57e2301e8e156758de8 100644 Binary files a/target/classes/fr/atlantique/imt/inf211/jobmngt/dao/CompanyDao.class and b/target/classes/fr/atlantique/imt/inf211/jobmngt/dao/CompanyDao.class differ diff --git a/target/classes/fr/atlantique/imt/inf211/jobmngt/dao/JobOfferDao.class b/target/classes/fr/atlantique/imt/inf211/jobmngt/dao/JobOfferDao.class index e0a3941d0b8dfaf6fbcfe0e17e15c2d0228b2a1d..8135d3d754e03900af1d7f62cd7ac4372c63ceb3 100644 Binary files a/target/classes/fr/atlantique/imt/inf211/jobmngt/dao/JobOfferDao.class and b/target/classes/fr/atlantique/imt/inf211/jobmngt/dao/JobOfferDao.class differ diff --git a/target/classes/fr/atlantique/imt/inf211/jobmngt/dao/QualificationLevelDao.class b/target/classes/fr/atlantique/imt/inf211/jobmngt/dao/QualificationLevelDao.class index b21f278c1e8896ad2f35c7f18a051f72769ba46a..8007f008519c4bf388d1662bebad7f2dcaa43986 100644 Binary files a/target/classes/fr/atlantique/imt/inf211/jobmngt/dao/QualificationLevelDao.class and b/target/classes/fr/atlantique/imt/inf211/jobmngt/dao/QualificationLevelDao.class differ diff --git a/target/classes/fr/atlantique/imt/inf211/jobmngt/dao/SectorDao.class b/target/classes/fr/atlantique/imt/inf211/jobmngt/dao/SectorDao.class index 164c1d2f2e7b6ea44acf8f417d9a23c6e5535d81..8fa07a9b22d47bb7aa418cb98955b2c104eef2f9 100644 Binary files a/target/classes/fr/atlantique/imt/inf211/jobmngt/dao/SectorDao.class and b/target/classes/fr/atlantique/imt/inf211/jobmngt/dao/SectorDao.class differ diff --git a/target/classes/fr/atlantique/imt/inf211/jobmngt/entity/Application.class b/target/classes/fr/atlantique/imt/inf211/jobmngt/entity/Application.class index 572bd81d49af528d4f85be3005e84686055e7fca..a1798658fa1cd8eafa8efd9d54d46ff187903e09 100644 Binary files a/target/classes/fr/atlantique/imt/inf211/jobmngt/entity/Application.class and b/target/classes/fr/atlantique/imt/inf211/jobmngt/entity/Application.class differ diff --git a/target/classes/fr/atlantique/imt/inf211/jobmngt/entity/Company.class b/target/classes/fr/atlantique/imt/inf211/jobmngt/entity/Company.class index c6f8223ef9574c61988370e484b5d85c302117df..4b6589240fa1bb74d160a97f895a5bee30bdec99 100644 Binary files a/target/classes/fr/atlantique/imt/inf211/jobmngt/entity/Company.class and b/target/classes/fr/atlantique/imt/inf211/jobmngt/entity/Company.class differ diff --git a/target/classes/fr/atlantique/imt/inf211/jobmngt/entity/JobOffer.class b/target/classes/fr/atlantique/imt/inf211/jobmngt/entity/JobOffer.class index 3e622ed54553af0343ace975a6787bc0b52125ad..f84b25d7363c5ecf07ef416fee886eddaba28c0b 100644 Binary files a/target/classes/fr/atlantique/imt/inf211/jobmngt/entity/JobOffer.class and b/target/classes/fr/atlantique/imt/inf211/jobmngt/entity/JobOffer.class differ diff --git a/target/classes/fr/atlantique/imt/inf211/jobmngt/entity/OfferMessage.class b/target/classes/fr/atlantique/imt/inf211/jobmngt/entity/OfferMessage.class index c3808951a49b5bab19ef144587e807649ef7254b..2bf7663fdb299a1f49f3cfa134e7ee56109f1ff1 100644 Binary files a/target/classes/fr/atlantique/imt/inf211/jobmngt/entity/OfferMessage.class and b/target/classes/fr/atlantique/imt/inf211/jobmngt/entity/OfferMessage.class differ diff --git a/target/classes/fr/atlantique/imt/inf211/jobmngt/entity/QualificationLevel.class b/target/classes/fr/atlantique/imt/inf211/jobmngt/entity/QualificationLevel.class index b9fff9b0711bc03004b71f3a6436d5583a60c8ae..79b9c5db3994ec9fc109e6191645f40a949a30ff 100644 Binary files a/target/classes/fr/atlantique/imt/inf211/jobmngt/entity/QualificationLevel.class and b/target/classes/fr/atlantique/imt/inf211/jobmngt/entity/QualificationLevel.class differ diff --git a/target/classes/fr/atlantique/imt/inf211/jobmngt/entity/Sector.class b/target/classes/fr/atlantique/imt/inf211/jobmngt/entity/Sector.class index 4a368de5745fae2cbcee9180b53724f6df60f07a..dc2efbc4ec65c937d69e1b36c9c0b999dadd6a65 100644 Binary files a/target/classes/fr/atlantique/imt/inf211/jobmngt/entity/Sector.class and b/target/classes/fr/atlantique/imt/inf211/jobmngt/entity/Sector.class differ diff --git a/target/classes/fr/atlantique/imt/inf211/jobmngt/service/AppUserServiceImpl.class b/target/classes/fr/atlantique/imt/inf211/jobmngt/service/AppUserServiceImpl.class index 3228527ea8ab8d6aa2fbdc25684e9fe6230ed4e0..b7d4f38bb88c61a88aa0531663e2870e6d6b3e81 100644 Binary files a/target/classes/fr/atlantique/imt/inf211/jobmngt/service/AppUserServiceImpl.class and b/target/classes/fr/atlantique/imt/inf211/jobmngt/service/AppUserServiceImpl.class differ diff --git a/target/classes/fr/atlantique/imt/inf211/jobmngt/service/ApplicationService.class b/target/classes/fr/atlantique/imt/inf211/jobmngt/service/ApplicationService.class index e69c4e36058d14d7685097aadf83d243bab68fcf..f6f19b603c614181203001c8186f8c52ebb5948d 100644 Binary files a/target/classes/fr/atlantique/imt/inf211/jobmngt/service/ApplicationService.class and b/target/classes/fr/atlantique/imt/inf211/jobmngt/service/ApplicationService.class differ diff --git a/target/classes/fr/atlantique/imt/inf211/jobmngt/service/CandidateService.class b/target/classes/fr/atlantique/imt/inf211/jobmngt/service/CandidateService.class index 9f0685154fb00d5101ae34c83ffb2ad0fb37888e..bb1147bab3d2cc1892c35fc0c6dd92a77f103947 100644 Binary files a/target/classes/fr/atlantique/imt/inf211/jobmngt/service/CandidateService.class and b/target/classes/fr/atlantique/imt/inf211/jobmngt/service/CandidateService.class differ diff --git a/target/classes/fr/atlantique/imt/inf211/jobmngt/service/CandidateServiceImpl.class b/target/classes/fr/atlantique/imt/inf211/jobmngt/service/CandidateServiceImpl.class index 39619aa907c3e02be2c0dc1bc5928c968d156020..b8bf7550a4f4a126cfc33beb4f2ddd18b1404a4d 100644 Binary files a/target/classes/fr/atlantique/imt/inf211/jobmngt/service/CandidateServiceImpl.class and b/target/classes/fr/atlantique/imt/inf211/jobmngt/service/CandidateServiceImpl.class differ diff --git a/target/classes/fr/atlantique/imt/inf211/jobmngt/service/QualificationLevelServiceImpl.class b/target/classes/fr/atlantique/imt/inf211/jobmngt/service/QualificationLevelServiceImpl.class index 08ec5d7cb97e28251759ac2b59b95f53c45be192..c885e0a74bd1b5eaa3b07234d30f4578f8ad8550 100644 Binary files a/target/classes/fr/atlantique/imt/inf211/jobmngt/service/QualificationLevelServiceImpl.class and b/target/classes/fr/atlantique/imt/inf211/jobmngt/service/QualificationLevelServiceImpl.class differ diff --git a/target/classes/fr/atlantique/imt/inf211/jobmngt/service/SectorServiceImpl.class b/target/classes/fr/atlantique/imt/inf211/jobmngt/service/SectorServiceImpl.class index f334aa308956ab38259b622f4bcc075815866557..4d066b21b90cb81b0171f088ab548a005f29fb95 100644 Binary files a/target/classes/fr/atlantique/imt/inf211/jobmngt/service/SectorServiceImpl.class and b/target/classes/fr/atlantique/imt/inf211/jobmngt/service/SectorServiceImpl.class differ diff --git a/target/classes/templates/jobOffer/jobOfferForm.html b/target/classes/templates/jobOffer/jobOfferForm.html new file mode 100644 index 0000000000000000000000000000000000000000..0ca49b5302a9d081cc88bbf048edc0db161e2a9e --- /dev/null +++ b/target/classes/templates/jobOffer/jobOfferForm.html @@ -0,0 +1,73 @@ +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head> + <title>Créer une offre d'emploi</title> + <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"> +</head> +<body> + +<div class="container mt-4"> + <h2 class="text-center mb-4">Créer une offre d'emploi</h2> + + <form th:action="@{/jobs/save}" th:object="${jobOffer}" method="post"> + + <div class="mb-3"> + <label class="form-label">Titre :</label> + <input type="text" class="form-control" th:field="*{title}" required> + </div> + + <div class="mb-3"> + <label class="form-label">Description :</label> + <textarea class="form-control" rows="3" th:field="*{taskDescription}" required></textarea> + </div> + + <div class="mb-3"> + <label class="form-label">Date de publication :</label> + <input type="date" class="form-control" th:field="*{publicationDate}" required> + </div> + + <div class="mb-3"> + <label class="form-label">Entreprise :</label> + <select class="form-select" th:field="*{company}"> + <option value="">-- Sélectionner une entreprise --</option> + <option th:each="company : ${companies}" + th:value="${company.id}" + th:text="${company.denomination}" + th:selected="${company.id == jobOffer.company?.id}"></option> + </option> + </select> + + </div> + + <div class="mb-3"> + <label class="form-label">Niveau de qualification :</label> + <select class="form-select" th:field="*{qualificationLevel}"> + <option value="">Sélectionner un niveau de qualification</option> + <option th:each="level : ${qualificationLevels}" + th:value="${level.id}" + th:text="${level.label}" + th:selected="${level.id == jobOffer.qualificationLevel?.id}"> + </option> + </select> + + </div> + + <div class="mb-3"> + <label class="form-label">Secteurs d'activité :</label> + <select class="form-select" multiple th:name="sectorIds" required> + <option th:each="sector : ${sectors}" th:value="${sector.id}" th:text="${sector.label}"></option> + </select> + <small class="form-text text-muted">Maintenez "Ctrl" (ou "Cmd" sur Mac) pour sélectionner plusieurs secteurs.</small> + </div> + + <div class="text-center"> + <button type="submit" class="btn btn-success">Créer</button> + <a href="/jobs" class="btn btn-secondary">Retour</a> + </div> + + </form> +</div> + +<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script> +</body> +</html> diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst index 19cd16bfe2768ef781000793e8efc900f679b2a2..91f4584ec8c24562173a26de677227fd7de88128 100644 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -1,3 +1,4 @@ +<<<<<<< HEAD C:\Users\LENOVO\INF210\Docker\DockerExo\Docker_environment\JobmngmntVersionAFP\src\main\java\fr\atlantique\imt\inf211\jobmngt\entity\AppUser.java C:\Users\LENOVO\INF210\Docker\DockerExo\Docker_environment\JobmngmntVersionAFP\src\main\java\fr\atlantique\imt\inf211\jobmngt\entity\Sector.java C:\Users\LENOVO\INF210\Docker\DockerExo\Docker_environment\JobmngmntVersionAFP\src\main\java\fr\atlantique\imt\inf211\jobmngt\service\SectorServiceImpl.java @@ -36,3 +37,47 @@ C:\Users\LENOVO\INF210\Docker\DockerExo\Docker_environment\JobmngmntVersionAFP\s C:\Users\LENOVO\INF210\Docker\DockerExo\Docker_environment\JobmngmntVersionAFP\src\main\java\fr\atlantique\imt\inf211\jobmngt\service\CandidateService.java C:\Users\LENOVO\INF210\Docker\DockerExo\Docker_environment\JobmngmntVersionAFP\src\main\java\fr\atlantique\imt\inf211\jobmngt\service\CandidateServiceImpl.java C:\Users\LENOVO\INF210\Docker\DockerExo\Docker_environment\JobmngmntVersionAFP\src\main\java\fr\atlantique\imt\inf211\jobmngt\service\QualificationLevelServiceImpl.java +======= +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\JobmngtApplication.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\controller\TestJobOfferDaoController.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\service\CompanyServiceImpl.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\service\JobOfferServiceImpl.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\entity\OfferMessage.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\entity\Company.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\service\JobOfferService.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\controller\CompanyController.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\converter\QualificationLevelConverter.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\controller\TestCompanyDaoController.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\converter\CompanyConverter.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\entity\AppUser.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\entity\Candidate.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\entity\QualificationLevel.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\entity\Sector.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\dao\CandidateDao.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\config\WebConfig.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\service\AppUserServiceImpl.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\service\CompanyService.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\dao\JobOfferDao.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\dao\ApplicationMessageDao.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\dao\OfferMessageDao.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\service\SectorServiceImpl.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\entity\JobOffer.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\controller\SectorController.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\dao\SectorDao.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\dao\CompanyDao.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\entity\ApplicationMessage.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\service\AppUserService.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\controller\QualificationLevelController.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\controller\JobOfferController.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\controller\LoginController.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\controller\PagesController.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\controller\TestApplicationDaoController.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\dao\QualificationLevelDao.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\service\SectorService.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\controller\TestCandidateDaoController.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\service\QualificationLevelService.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\dao\AppUserDao.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\dao\ApplicationDao.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\service\QualificationLevelServiceImpl.java +C:\Users\rania\Desktop\jobmngt\jobmngt\src\main\java\fr\atlantique\imt\inf211\jobmngt\entity\Application.java +>>>>>>> d9a17a2 (new_feat)