Commit 279e3e25 authored by AnasJeg's avatar AnasJeg

demo3-fc-v2

parent 5b9938d3
No preview for this file type
......@@ -24,10 +24,17 @@ public class ScheduleService {
this.demandeService = demandeService;
}
@Scheduled(cron = "0 0 10 * * *", zone = "Africa/Casablanca")
@Scheduled(cron = "0 0 9 * * *", zone = "Africa/Casablanca")
public void scheduleTaskWithFixedDelay(){
log.info("Fixed Task :: Execution Time - {}", dateTimeFormatter.format(LocalDateTime.now()));
// demandeService.findDemandesByExpirationDateBeforeAndStatut
demandeService.cancelExpiredDm();
}
@Scheduled(cron = "0 28 17 * * *", zone = "Africa/Casablanca")
public void scheduleExpiredSoonTask(){
log.info("Fixed Expired Soon Task :: Execution Time - {}", dateTimeFormatter.format(LocalDateTime.now()));
demandeService.findExpiringTomorrow();
// demandeService.cancelExpiredDm();
}
}
......@@ -2,25 +2,19 @@ package bmci.esign.backendend.controllers;
import bmci.esign.backendend.dto.DemandeDto;
import bmci.esign.backendend.dto.request.FilterDto;
import bmci.esign.backendend.dto.request.GlobaleRequestDto;
import bmci.esign.backendend.dto.request.RequestId;
import bmci.esign.backendend.dto.response.DashboardChart;
import bmci.esign.backendend.dto.response.TableDto;
import bmci.esign.backendend.dto.response.GlobalTableDto;
import bmci.esign.backendend.models.ResponseModelStandard;
import bmci.esign.backendend.models.enums.EStatut;
import bmci.esign.backendend.services.DemandeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@RestController
......@@ -68,22 +62,37 @@ public class DemandeController {
}
}
@GetMapping("/canceled")
@GetMapping("/by")
public ResponseModelStandard<Long> canceledDemande(@RequestParam( name = "idDemand") Long id){
try {
DemandeDto demandeDto = demandeService.getDemande(id);
if(demandeDto.getStatut().equals(EStatut.WAITING.name())){
String message = demandeService.cancelDemand(demandeDto);
if(message.equals("success")){
return new ResponseModelStandard<>("000");
}
}
return new ResponseModelStandard<>("099");
DemandeDto demandeDto = demandeService.getDemande(id);
System.out.println(demandeDto);
log.info("STATUT {}", demandeDto.getStatut());
// if(demandeDto.getStatut().equals(EStatut.WAITING.name())){
// System.out.println("demandeDto -> "+demandeDto);
// String message = demandeService.cancelDemand(demandeDto);
// if(message.equals("success")){
// return new ResponseModelStandard<>("000");
// }
// }
return new ResponseModelStandard<>("099");
}catch (Exception e){
return new ResponseModelStandard<>("099");
}
}
@PostMapping("/canceled")
public ResponseModelStandard<Long> byIdTest(@RequestBody RequestId idDemand){
try {
String result =demandeService.cancelDemandById(idDemand);
if(result.equals("success")){
return new ResponseModelStandard<>("000");
}
return new ResponseModelStandard<>("099");
}catch (Exception e){
return new ResponseModelStandard<>("099");
}
}
@GetMapping("/getForUser")
public ResponseModelStandard<List<DemandeDto>> getForUserDemande(@RequestParam(name = "id") Long id){
try {
......@@ -133,7 +142,7 @@ public class DemandeController {
}
@PostMapping("/global")
public ResponseModelStandard<Page<TableDto>> loadGlobalFilteredDm(@RequestBody GlobaleRequestDto dto){
public ResponseModelStandard<Page<GlobalTableDto>> loadGlobalFilteredDm(@RequestBody FilterDto dto){
try {
if(dto.getPage() == null || dto.getSize() == null || dto.getPage() < 0 || dto.getSize() <= 0){
return new ResponseModelStandard<>("099","Page or Size cannot be negative or Null");
......@@ -149,4 +158,9 @@ public class DemandeController {
return new ResponseModelStandard<>("000", demandeService.cancelExpiredDm());
}
@PostMapping("/tomorrow")
public ResponseModelStandard<Integer> findExpiringTomorrow(){
return new ResponseModelStandard<>("000", demandeService.findExpiringTomorrow());
}
}
......@@ -41,7 +41,7 @@ public class NotificationController {
@PostMapping("/update/status")
public ResponseModelStandard<NotificationDto> updateStatus(@RequestParam Long id) {
try {
notificationService.changeStatusByDmId(id, null,ENotification.VIEW);
notificationService.changeStatusByDmId(id, null,null,ENotification.VIEW);
return new ResponseModelStandard<>("000");
}catch (Exception e){
return new ResponseModelStandard<>("099");
......
package bmci.esign.backendend.controllers;
import bmci.esign.backendend.dto.SignatureDto;
import bmci.esign.backendend.models.ResponseModelStandard;
import bmci.esign.backendend.services.SignatureService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/signature")
public class SignatureController {
private final SignatureService signatureService;
@Autowired
private SignatureService signatureService;
public SignatureController(SignatureService signatureService) {
this.signatureService = signatureService;
}
@PostMapping("/add")
public ResponseModelStandard<Long> addSignature(@RequestBody SignatureDto signatureDto){
......@@ -28,10 +28,9 @@ public class SignatureController {
@GetMapping("/get")
public ResponseModelStandard<List<SignatureDto>> getSignature(@RequestParam(name = "id") Long id){
public ResponseModelStandard<SignatureDto> getSignature(@RequestParam(name = "id") Long id){
try {
List<SignatureDto> signatureDtos = signatureService.findAllByUserId(id);
return new ResponseModelStandard<>("000", signatureDtos);
return new ResponseModelStandard<>("000", signatureService.findByUserId(id));
}catch (Exception e){
return new ResponseModelStandard<>("099");
}
......
......@@ -4,9 +4,12 @@ import bmci.esign.backendend.dto.DemandeDto;
import bmci.esign.backendend.models.MailRequest;
import bmci.esign.backendend.models.ResponseModelStandard;
import bmci.esign.backendend.models.enums.EMailStatus;
import bmci.esign.backendend.models.enums.ENotification;
import bmci.esign.backendend.models.enums.EStatut;
import bmci.esign.backendend.repositories.MailRequestRepository;
import bmci.esign.backendend.services.DemandeService;
import bmci.esign.backendend.services.NotificationService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
......@@ -14,25 +17,32 @@ import java.util.stream.Collectors;
@RestController
@RequestMapping("/token")
@Slf4j
public class TokenController {
private final MailRequestRepository mailRequestRepository;
private final DemandeService demandeService;
private final NotificationService notificationService;
public TokenController(MailRequestRepository mailRequestRepository, DemandeService demandeService) {
public TokenController(MailRequestRepository mailRequestRepository, DemandeService demandeService, NotificationService notificationService) {
this.mailRequestRepository = mailRequestRepository;
this.demandeService = demandeService;
this.notificationService = notificationService;
}
@GetMapping("/getToken")
public ResponseModelStandard<DemandeDto> getToken(@RequestParam(name = "token") String token){
log.info("getToken {}",token);
MailRequest mailRequest = mailRequestRepository.findByToken(token);
log.info("mailRequest {}",mailRequest);
if(mailRequest != null){
if(mailRequest.getStatus().equals(EMailStatus.SENT)){
mailRequest.setStatus(EMailStatus.CLICKED);
log.info("CLICKED");
mailRequestRepository.save(mailRequest);
log.warn("CHANGE NOTIFICATION STATUS");
notificationService.changeStatusByDmId(null, mailRequest.getDemandeId(), mailRequest.getDestination(),ENotification.VIEW);
}
DemandeDto demandeDto = demandeService.getDemande(mailRequest.getDemandeId());
if(demandeDto.getStatut().equals(EStatut.COMPLETE.name())){
......
......@@ -4,15 +4,15 @@ import bmci.esign.backendend.models.TypeDocument;
import bmci.esign.backendend.models.enums.EDemande;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.*;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
@Data
@Getter
@Setter
@Builder
@AllArgsConstructor @NoArgsConstructor
public class DemandeDto implements Serializable {
private Long id;
......@@ -42,4 +42,24 @@ public class DemandeDto implements Serializable {
public String getStringDemand(){
return edemande;
}
@Override
public String toString() {
return "DemandeDto{" +
"id=" + id +
", confidentiality='" + confidentiality + '\'' +
", priority='" + priority + '\'' +
", objetMail='" + objetMail + '\'' +
", message='" + message + '\'' +
", statut='" + statut + '\'' +
", edemande='" + edemande + '\'' +
", user=" + user +
", typeDocument=" + typeDocument +
", expirationDate=" + expirationDate +
", creationDate=" + creationDate +
", modificationDate=" + modificationDate +
", destinataires=" + destinataires.size() +
", documents=" + documents.size() +
'}';
}
}
......@@ -21,6 +21,7 @@ public class DestinataireDto {
private String statut;
private String envoie;
private int place;
private String telephone;
@JsonIgnore
private DemandeDto demande;
......
......@@ -18,7 +18,7 @@ public class UserDto {
private Long id;
private String firstname;
private String lastname;
private String avatar;
private String telephone;
private String email;
private String password;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
......
......@@ -11,10 +11,9 @@ import java.time.LocalDate;
@AllArgsConstructor
@NoArgsConstructor
public class FilterDto {
private int page;
private int size;
private Integer page;
private Integer size;
private String email;
private LocalDate createdDate;
private String demandeType;
private String statut;
......@@ -27,6 +26,7 @@ public class FilterDto {
", email='" + email + '\'' +
", createdDate=" + createdDate +
", demandeType='" + demandeType + '\'' +
", statut='" + statut + '\'' +
'}';
}
}
\ No newline at end of file
package bmci.esign.backendend.dto.request;
import bmci.esign.backendend.models.enums.EStatut;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.time.LocalDate;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class GlobaleRequestDto {
private String email;
private Integer page;
private Integer size;
private String creationDate;
private EStatut statut;
private String email;
private LocalDate createdDate;
private String statut;
private String type;
@Override
public String toString() {
return "GlobaleRequestDto{" +
"page=" + page +
", size=" + size +
", email='" + email + '\'' +
", createdDate=" + createdDate +
", statut='" + statut + '\'' +
", type='" + type + '\'' +
'}';
}
}
package bmci.esign.backendend.dto.request;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class RequestId {
private Long demandId;
}
\ No newline at end of file
package bmci.esign.backendend.dto.response;
import bmci.esign.backendend.dto.DestinataireDto;
import bmci.esign.backendend.dto.DocumentDto;
import bmci.esign.backendend.models.TypeDocument;
import bmci.esign.backendend.models.User;
import bmci.esign.backendend.models.enums.EStatut;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class GlobalTableDto implements Serializable {
private Long id;
private String confidentiality;
private String priority;
private String objetMail;
private String message;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Date creationDate;
private String demandeType;
private TypeDocument typeDocument;
private List<DestinataireDto> destinataires;
private EStatut statut;
@JsonFormat(pattern = "yyyy-MM-dd")
private Date expirationDate;
private List<DocumentDto> documents;
private User currentUser;
public void setDemandeTypeBasedOnUser(boolean isSender, boolean isRecipient) {
if (isSender) {
this.demandeType = "Demande des signatures";
} else if (isRecipient) {
this.demandeType = "Demandes à signer";
} else {
this.demandeType = "";
}
}
@Override
public String toString() {
return "GlobalTableDto{" +
"id=" + id +
", creationDate=" + creationDate +
", demandeType=" + demandeType +
", statut='" + statut + '\'' +
", typeDocument=" + typeDocument +
", expirationDate=" + expirationDate +
", destinataires=" + destinataires +
", documents=" + documents +
'}';
}
}
package bmci.esign.backendend.dto.response;
import bmci.esign.backendend.models.enums.EStatut;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.util.Date;
@Getter
@Setter
@AllArgsConstructor
public class TableDto implements Serializable {
private Long id;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
private Date creationDate;
private String demandeType;
private String typeDocument;
// private List<RecipientDto> destinataires;
private int destinataires;
private String statut;
public String getStatut() {
return EStatut.valueOf(statut).getDisplayName();
}
}
......@@ -13,7 +13,7 @@ import lombok.Setter;
public class TableResponseDto {
@SerializedName("data")
private TableDto data;
private GlobalTableDto data;
private int totalElements;
......
package bmci.esign.backendend.dto.services;
import bmci.esign.backendend.dto.response.DashboardChart;
import bmci.esign.backendend.dto.response.GlobalTableDto;
import bmci.esign.backendend.models.Demande;
import bmci.esign.backendend.models.User;
import org.springframework.data.domain.Page;
import java.util.Collection;
......@@ -19,5 +22,4 @@ public interface IMapClassWithDto<E,D> {
Page<D> convertResponseToPageDto(Page<E> entityList, Class<D> outCLass);
List<DashboardChart> mappingData(List<DashboardChart> chartList);
}
package bmci.esign.backendend.dto.services;
import bmci.esign.backendend.dto.DestinataireDto;
import bmci.esign.backendend.dto.DocumentDto;
import bmci.esign.backendend.dto.response.DashboardChart;
import bmci.esign.backendend.dto.response.GlobalTableDto;
import bmci.esign.backendend.models.Demande;
import bmci.esign.backendend.models.Destinataire;
import bmci.esign.backendend.models.Document;
import bmci.esign.backendend.models.User;
import bmci.esign.backendend.models.enums.EStatut;
import org.modelmapper.Conditions;
import org.modelmapper.ModelMapper;
......@@ -17,6 +24,7 @@ import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
public class MapClassWithDto<E, D> implements IMapClassWithDto<E, D> {
......@@ -96,4 +104,13 @@ public class MapClassWithDto<E, D> implements IMapClassWithDto<E, D> {
}
}).collect(Collectors.toList());
}
}
// public Page<GlobalTableDto> convertResponseToPageDto(Page<Demande> demandes, Class<GlobalTableDto> dtoClass, User currentUser) {
// return demandes.map(demande -> {
// GlobalTableDto dto = modelMapper.map(demande, dtoClass);
// dto.setCurrentUser(currentUser);
// dto.setDemandeTypeBasedOnUser(currentUser);
// return dto;
// });
// }
}
\ No newline at end of file
......@@ -15,7 +15,6 @@ import java.util.Date;
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class AuditorEntity {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
......@@ -26,4 +25,4 @@ public abstract class AuditorEntity {
@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
protected Date modificationDate;
}
\ No newline at end of file
}
......@@ -3,20 +3,21 @@ package bmci.esign.backendend.models;
import bmci.esign.backendend.models.enums.EDemande;
import bmci.esign.backendend.models.enums.EStatut;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.*;
import javax.persistence.*;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@NoArgsConstructor
@AllArgsConstructor
@Data
@Getter
@Setter
@Builder
@Entity
public class Demande extends AuditorEntity implements Serializable {
private String confidentiality;
private String priority;
private String objetMail;
......@@ -30,7 +31,7 @@ public class Demande extends AuditorEntity implements Serializable {
@Column(length = 50)
private EDemande edemande;
@ManyToOne
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private User user;
......@@ -43,10 +44,28 @@ public class Demande extends AuditorEntity implements Serializable {
private Date expirationDate;
@OneToMany(mappedBy = "demande", fetch = FetchType.LAZY)
// @JsonManagedReference
private List<Destinataire> destinataires;
@OneToMany(mappedBy = "demande")
private List<Document> documents;
private List<Destinataire> destinataires = new ArrayList<>();
@OneToMany(mappedBy = "demande", fetch = FetchType.LAZY)
private List<Document> documents = new ArrayList<>();
@Override
public String toString() {
return "Demande{" +
"confidentiality='" + confidentiality + '\'' +
", priority='" + priority + '\'' +
", objetMail='" + objetMail + '\'' +
", message='" + message + '\'' +
", statut=" + statut +
", edemande=" + edemande +
", user=" + user +
", typeDocument=" + typeDocument +
", expirationDate=" + expirationDate +
", destinataires=" + destinataires +
", documents=" + documents +
", id=" + id +
", creationDate=" + creationDate +
", modificationDate=" + modificationDate +
'}';
}
}
package bmci.esign.backendend.models;
import bmci.esign.backendend.models.enums.EStatut;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Data
@NoArgsConstructor @AllArgsConstructor
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Destinataire {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
private String role;
......@@ -25,15 +27,18 @@ public class Destinataire {
@Enumerated(EnumType.STRING)
@Column(length = 50)
private EStatut statut;
private String envoie;
private int place;
@ManyToOne
private String telephone;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "demande_id")
@JsonIgnore
private Demande demande;
@ManyToOne
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User recipient;
......@@ -45,6 +50,6 @@ public class Destinataire {
@Temporal(TemporalType.TIMESTAMP)
private Date modificationDate;
@OneToMany(mappedBy = "destinataire")
private List<Position> positions;
@OneToMany(mappedBy = "destinataire", fetch = FetchType.LAZY)
private List<Position> positions = new ArrayList<>();
}
......@@ -6,6 +6,7 @@ import lombok.*;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
@Getter
@Setter
......@@ -16,16 +17,23 @@ public class MailRequest extends AuditorEntity implements Serializable {
private String destination;
private String email_type;
private long demandeId;
private String processCamundaId ;
private String processCamundaId;
@Column(unique = true)
private String token;
private String expiration_date;
// private String expiration_date;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "expiration_date")
private Date expirationDate;
private String name;
private String userMessage;
private EMailStatus status;
private String responseMessage;
private String url_sign;
// @ManyToOne(fetch = FetchType.LAZY)
// @JoinColumn(name = "demande_id")
// private Demande demande;
@Override
public String toString() {
return "MailRequest{" +
......@@ -34,7 +42,7 @@ public class MailRequest extends AuditorEntity implements Serializable {
", demandeId=" + demandeId +
", processCamundaId='" + processCamundaId + '\'' +
", token='" + token + '\'' +
", expiration_date='" + expiration_date + '\'' +
", expirationDate=" + expirationDate +
", name='" + name + '\'' +
", userMessage='" + userMessage + '\'' +
", status=" + status +
......
......@@ -13,7 +13,7 @@ import java.io.Serializable;
@Entity
public class Notification extends AuditorEntity implements Serializable {
private String title;
// private String title;
private String message;
@ManyToOne
......@@ -31,7 +31,6 @@ public class Notification extends AuditorEntity implements Serializable {
@Override
public String toString() {
return "Notification{" +
"title='" + title + '\'' +
", message='" + message + '\'' +
", destinataire_name=" + destinataire.getName() +
", demande_id=" + demande.getId() +
......
......@@ -13,7 +13,8 @@ import java.io.Serializable;
@Entity
public class Signature extends AuditorEntity implements Serializable {
private String directory;
@ManyToOne
@JoinColumn(name = "user_id") @JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
@JsonIgnore
private User user;
}
package bmci.esign.backendend.models;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@Data
@NoArgsConstructor @AllArgsConstructor
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "userEntity")
public class User extends AuditorEntity implements Serializable {
@Column(length = 120)
private String firstname;
@Column(length = 120)
private String lastname;
private String avatar;
private String telephone;
@Column(unique = true)
private String email;
@Column(length = 60)
private String password;
/*
@OneToMany(mappedBy = "sender")
@JsonIgnore
private List<Demande> sentDemandes = new ArrayList<>();
@OneToMany(mappedBy = "recipient")
@JsonIgnore
private List<Destinataire> receivedDemandes = new ArrayList<>();
*/
@OneToMany(mappedBy = "user")
@JsonIgnore
private List<Signature> signatures = new ArrayList<>();
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
......@@ -45,4 +33,18 @@ public class User extends AuditorEntity implements Serializable {
inverseJoinColumns = @JoinColumn(name = "authority_id")
)
private Set<Authority> authorities;
@Override
public String toString() {
return "User{" +
"firstname='" + firstname + '\'' +
", lastname='" + lastname + '\'' +
", telephone='" + telephone + '\'' +
", email='" + email + '\'' +
", password='" + password + '\'' +
", id=" + id +
", creationDate=" + creationDate +
", modificationDate=" + modificationDate +
'}';
}
}
......@@ -2,9 +2,9 @@ package bmci.esign.backendend.models.enums;
public enum EStatut {
WAITING("En attente"),
CANCELED("Expiré"),
COMPLETE("Signé");
// REJECTED("Rejeté");
CANCELED("Expirée"),
COMPLETE("Signée"),
DELETED("Annulée");
private final String displayName;
EStatut(String displayName) {
......
......@@ -15,12 +15,18 @@ import java.util.List;
@Repository
public interface DemandeRepository extends JpaRepository<Demande, Long>, JpaSpecificationExecutor<Demande> {
List<Demande> findAllByUserId(Long id);
@Query(value = "SELECT count(d.id) as count, d.statut as statut FROM Demande d WHERE d.user.email= :email GROUP BY d.statut")
// @Query(value = "SELECT count(d.id) as count, d.statut as statut FROM Demande d WHERE d.user.email= :email GROUP BY d.statut")
@Query(value = "SELECT count(d.id) as count, d.statut as statut FROM demande d inner join user_entity u " +
"on (d.user_id= u.id) WHERE u.email= :email GROUP BY d.statut", nativeQuery = true)
List<DashboardChart> loadSignaturesChart(@Param("email") String email);
List<Demande> findAllByExpirationDateBeforeAndStatut(Date date, EStatut eStatut);
@Modifying
@Query("UPDATE Demande d set d.statut = :newStatut WHERE d.id = :id")
int updateExpiredById(@Param("id") Long id, @Param("newStatut") EStatut newStatut);
@Query(value = "SELECT * FROM demande d WHERE d.expiration_date <= NOW() + INTERVAL '1 days' " +
"AND expiration_date > NOW() AND statut = 'WAITING'", nativeQuery = true)
List<Demande> findExpiringTomorrow();
}
/*
SELECT statut as statut, SUM(count) as total
......
......@@ -3,6 +3,8 @@ package bmci.esign.backendend.repositories;
import bmci.esign.backendend.models.Notification;
import bmci.esign.backendend.models.enums.ENotification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
......@@ -10,5 +12,6 @@ import java.util.List;
@Repository
public interface NotificationRepository extends JpaRepository<Notification, Long> {
List<Notification> findAllByDestinataire_EmailAndStatus(String email, ENotification status);
Notification findByDemandeId(Long id);
@Query("SELECT n from Notification n WHERE n.demande.id= :id AND n.destinataire.email= :email")
Notification findByDemandeId(@Param("id") Long id,@Param("email") String email);
}
......@@ -2,12 +2,12 @@ package bmci.esign.backendend.repositories;
import bmci.esign.backendend.models.Signature;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;
@Repository
public interface SignatureRepository extends JpaRepository<Signature, Long> {
List<Signature> findAllByUserId(Long id);
Optional<Signature> findByUserId(Long id);
}
......@@ -2,9 +2,9 @@ package bmci.esign.backendend.services;
import bmci.esign.backendend.dto.DemandeDto;
import bmci.esign.backendend.dto.request.FilterDto;
import bmci.esign.backendend.dto.request.GlobaleRequestDto;
import bmci.esign.backendend.dto.request.RequestId;
import bmci.esign.backendend.dto.response.DashboardChart;
import bmci.esign.backendend.dto.response.TableDto;
import bmci.esign.backendend.dto.response.GlobalTableDto;
import bmci.esign.backendend.models.Demande;
import org.springframework.data.domain.Page;
......@@ -19,7 +19,7 @@ public interface DemandeService {
Demande findDemande(Long id);
void processEmail(Demande demande);
String relaunchUser(Long idDemand, Long idDestinatiare);
String cancelDemand(DemandeDto demandeDto);
String cancelDemandById(RequestId idDemand);
void deleteDemande(Long id);
List<DemandeDto> getAll();
List<DemandeDto> getAllbyUser(Long userId);
......@@ -27,6 +27,7 @@ public interface DemandeService {
Page<DemandeDto> findDemandesByUser(FilterDto filterDto);
List<DashboardChart> loadReceivedChart(String email);
List<DashboardChart> loadGlobalData(String email);
Page<TableDto> loadGlobalFiltered(GlobaleRequestDto globaleRequestDto);
Page<GlobalTableDto> loadGlobalFiltered(FilterDto globaleRequestDto);
int cancelExpiredDm();
int findExpiringTomorrow();
}
......@@ -8,5 +8,5 @@ import java.util.Map;
public interface EmailService {
String generateVerificationCode();
String generateUrl(String sdkType);
void SendEmail(MailRequest req, Map<String, String> model);
void sendEmail(MailRequest req, Map<String, String> model, int emailType);
}
......@@ -10,5 +10,5 @@ public interface NotificationService {
List<NotificationDto> loadActiveNotificationsByUserEmail(String email);
// Notification createNotification(NotificationDto dto);
Notification createNotification(Notification notification);
void changeStatusByDmId(Long id,Long demandeId, ENotification status);
void changeStatusByDmId(Long id,Long demandeId, String email,ENotification status);
}
......@@ -7,5 +7,5 @@ public interface SignatureService {
SignatureDto addSignature(SignatureDto signatureDto);
SignatureDto updateSignature(SignatureDto signatureDto, Long id);
SignatureDto getSignature(Long id);
List<SignatureDto> findAllByUserId(Long id);
SignatureDto findByUserId(Long id);
}
package bmci.esign.backendend.services.impl;
import bmci.esign.backendend.models.Demande;
import bmci.esign.backendend.models.Destinataire;
import bmci.esign.backendend.models.User;
import bmci.esign.backendend.models.enums.EStatut;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.jpa.domain.Specification;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.JoinType;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
@Slf4j
public class DemandeSpecification {
private static final String date_pattern ="yyyy-MM-dd"; // "dd-MM-yyyy"
public static Specification<Demande> isSentBy(User user) {
return (root, query, criteriaBuilder) ->
criteriaBuilder.equal(root.get("user"), user);
}
public static Specification<Demande> isReceivedBy(User user) {
return (root, query, criteriaBuilder) -> {
Join<Demande, Destinataire> join = root.join("destinataires", JoinType.INNER);
return criteriaBuilder.equal(join.get("recipient"), user);
};
}
public static Specification<Demande> hasStatus(EStatut statut) {
return (root, query, criteriaBuilder) ->
criteriaBuilder.equal(root.get("statut"), statut);
}
public static Specification<Demande> withDate(String creationDate) {
try {
Date date = new SimpleDateFormat(date_pattern).parse(creationDate);
log.info("creationDate_string: {} -> parse_date {}", creationDate, date);
return (root, query, criteriaBuilder) ->
criteriaBuilder.equal(
criteriaBuilder.function("DATE", Date.class, root.get("creationDate")),
date);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
}
\ No newline at end of file
......@@ -121,6 +121,7 @@ public class DestinataireServiceImpl implements DestinataireService {
}
// predicates.add(criteriaBuilder.equal(root.get("statut"), EStatut.WAITING));
predicates.add(criteriaBuilder.equal(root.get("email"), dto.getEmail()));
query.orderBy(criteriaBuilder.desc(root.get("creationDate")));
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
};
......
......@@ -42,7 +42,9 @@ public class EmailServiceImpl implements EmailService {
private static final String CHARACTERS = "0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
private static final int CODE_LENGTH = 16;
// private static final String TEMPLATE_NAME="sendDoc.ftl";
private static final String TEMPLATE_NAME="test.ftl";
private static final String NEW_DM_TEMPLATE="demande.ftl";
private static final String RELANCE_DM_TEMPLATE="relance.ftl";
private static final String EXPIRED_DM_TEMPLATE="test.ftl";
@Override
public String generateVerificationCode() {
Random random = new Random();
......@@ -59,7 +61,7 @@ public class EmailServiceImpl implements EmailService {
}
@Override
public void SendEmail(MailRequest req, Map<String, String> model) {
public void sendEmail(MailRequest req, Map<String, String> model, int emailType) {
log.info("PROCESSING<>{sendEmail} REQUEST {}", req.toString());
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = null;
......@@ -77,8 +79,10 @@ public class EmailServiceImpl implements EmailService {
model.put("url_sign", environment.getProperty("url.esign.acess")+":"+url_sign);
model.put("day_date", LocalDateTime.now().format(formatter));
model.put("message", model.get("message"));
log.info("ROLE USER IN DM {}", model.get("role"));
}
template = config.getTemplate(TEMPLATE_NAME);
log.info("emailType: {}", emailType);
template = config.getTemplate(emailType == 1 ? NEW_DM_TEMPLATE : RELANCE_DM_TEMPLATE);
String HtmlMsg = FreeMarkerTemplateUtils.processTemplateIntoString(template,model) ;
req.setToken(url_sign);
......
......@@ -45,7 +45,6 @@ public class NotificationServiceImpl implements NotificationService {
}
@Override
@Transactional(rollbackFor = Exception.class)
// public Notification createNotification(NotificationDto dto) {
public Notification createNotification(Notification notification) {
log.info("PROCESSING<>{createNotification}.. REQUEST {}", notification);
try {
......@@ -62,12 +61,12 @@ public class NotificationServiceImpl implements NotificationService {
@Override
@Transactional
public void changeStatusByDmId(Long id, Long demandeId, ENotification status) {
public void changeStatusByDmId(Long id, Long demandeId, String email,ENotification status) {
log.info("PROCESSING<>{changeStatus}.. REQUEST_ ID {} Demande_Id {}", id, demandeId);
try {
Notification notification;
if(id == null){
notification = notificationRepository.findByDemandeId(demandeId);
notification = notificationRepository.findByDemandeId(demandeId, email);
}else{
notification = notificationRepository.findById(id).get();
}
......
package bmci.esign.backendend.services.impl;
import bmci.esign.backendend.dto.PositionDto;
import bmci.esign.backendend.dto.SignatureDto;
import bmci.esign.backendend.dto.services.IMapClassWithDto;
import bmci.esign.backendend.models.Position;
import bmci.esign.backendend.models.Signature;
import bmci.esign.backendend.repositories.SignatureRepository;
import bmci.esign.backendend.services.SignatureService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service
@Slf4j
public class SignatureServiceImpl implements SignatureService {
@Autowired
......@@ -39,8 +40,12 @@ public class SignatureServiceImpl implements SignatureService {
}
@Override
public List<SignatureDto> findAllByUserId(Long id) {
List<Signature> signatures = signatureRepository.findAllByUserId(id);
return signatureMapping.convertListToListDto(signatures, SignatureDto.class);
public SignatureDto findByUserId(Long id) {
Optional<Signature> signatures = signatureRepository.findByUserId(id);
if(signatures.isEmpty()){
log.error("Signature Not Found for userId {}",id);
return null;
}
return signatureMapping.convertToDto(signatures.get(), SignatureDto.class);
}
}
spring.application.name=backend-esign
# App Properties
spring.mvc.converters.preferred-json-mapper=gson
server.address=192.168.1.23
server.address=192.168.1.25
#server.address=192.168.1.144
server.servlet.context-path=/esignback
#server.address=192.168.11.106
#server.servlet-path=/*
server.port=9091
spring.sql.init.platform= postgres
#server.ssl.enabled= true
#spring.datasource.url= jdbc:postgresql://192.168.1.46:5433/esigndb?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=GMT+1:00
spring.datasource.url= jdbc:postgresql://localhost:5432/esigndb?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=GMT+1:00
spring.datasource.password= admin
#spring.datasource.username=postgres
#spring.datasource.password= @sql$23asas
spring.datasource.url= jdbc:postgresql://localhost:5432/esigndb?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=GMT+1:00
spring.datasource.username=admin
spring.datasource.password= admin
spring.jpa.database = postgresql
spring.jpa.show-sql=false
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation= true
......@@ -34,8 +35,8 @@ spring.servlet.multipart.max-request-size=10MB
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
camunda.bpm.admin-user.email=anas@indatacore.com
camunda.bpm.admin-user.password=123456
#camunda.bpm.admin-user.email=anas.jegoual@indatacore.com
#camunda.bpm.admin-user.password=123456
......
<!doctype html>
<html lang="en">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta charset="UTF-8">
<title>Nouvelle Demande - BMCI</title>
<style>
body {
font-family: Helvetica, Arial, sans-serif;
background-color: #f4f5f6;
margin: 0;
padding: 0;
color: #333;
}
.container {
max-width: 600px;
margin: 0 auto;
padding: 24px;
}
.content {
background-color: #ffffff;
border: 1px solid #eaebed;
border-radius: 16px;
padding: 24px;
}
.footer {
text-align: center;
color: #9a9ea6;
font-size: 14px;
margin-top: 24px;
}
.btn-primary {
display: inline-block;
padding: 12px 24px;
background: linear-gradient(45deg, #07674D, #0ECD99);
color: #ffffff;
text-decoration: none;
border-radius: 4px;
font-weight: bold;
}
.btn-primary:hover {
background: linear-gradient(45deg, #065942, #0bb689);
}
@media only screen and (max-width: 640px) {
.container {
padding: 16px;
}
.content {
padding: 16px;
}
.btn-primary {
width: 100%;
text-align: center;
}
}
</style>
</head>
<body>
<div class="container">
<div class="content">
<p>Bonjour ${name},</p>
<p>${message}</p>
<p>Veuillez cliquer sur le lien ci-dessous pour procéder à la signature :</p>
<p><a href="${url_sign}" target="_blank">Cliquez ici pour ${role}</a></p>
</div>
<div class="footer">
<p>BANQUE MAROCAINE POUR LE COMMERCE ET L'INDUSTRIE (BMCI)</p>
<p>Fait à <b>Casablanca</b> le <span>${day_date}</span></p>
</div>
</div>
</body>
</html>
<!doctype html>
<html lang="fr">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Notification d'expiration de licence</title>
<style media="all">
body {
font-family: Helvetica, sans-serif;
-webkit-font-smoothing: antialiased;
font-size: 16px;
line-height: 1.3;
-ms-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%;
background-color: #f4f5f6;
margin: 0;
padding: 0;
}
table {
border-collapse: separate;
mso-table-lspace: 0pt;
mso-table-rspace: 0pt;
width: 100%;
}
table td {
font-family: Helvetica, sans-serif;
font-size: 16px;
vertical-align: top;
}
.container {
margin: 0 auto !important;
max-width: 600px;
padding: 0;
padding-top: 24px;
width: 600px;
}
.content {
box-sizing: border-box;
display: block;
margin: 0 auto;
max-width: 600px;
padding: 0;
}
.main {
background: #ffffff;
border: 1px solid #eaebed;
border-radius: 16px;
width: 100%;
}
.wrapper {
box-sizing: border-box;
padding: 24px;
}
.footer {
clear: both;
padding-top: 24px;
text-align: center;
width: 100%;
}
.footer td, .footer p, .footer span, .footer a {
color: #9a9ea6;
font-size: 16px;
text-align: center;
}
p {
font-family: Helvetica, sans-serif;
font-size: 16px;
font-weight: normal;
margin: 0;
margin-bottom: 16px;
}
a {
color: #0867ec;
text-decoration: underline;
}
.btn-primary table td {
background: linear-gradient(45deg, #07674D, #0ECD99);
}
.btn-primary a {
background: linear-gradient(45deg, #07674D, #0ECD99);
border-color: #07674D;
color: #ffffff;
text-decoration: none;
display: inline-block;
padding: 10px 20px;
border-radius: 5px;
}
@media all {
.btn-primary table td:hover {
background-color: #218838 !important;
}
.btn-primary a:hover {
background-color: #218838 !important;
border-color: #218838 !important;
}
}
@media only screen and (max-width: 640px) {
.main p, .main td, .main span {
font-size: 16px !important;
}
.wrapper {
padding: 8px !important;
}
.content {
padding: 0 !important;
}
.container {
padding: 0 !important;
padding-top: 8px !important;
width: 100% !important;
}
.btn table {
max-width: 100% !important;
width: 100% !important;
}
.btn a {
font-size: 16px !important;
max-width: 100% !important;
width: 100% !important;
}
}
@media all {
.apple-link a {
color: inherit !important;
font-family: inherit !important;
font-size: inherit !important;
font-weight: inherit !important;
line-height: inherit !important;
text-decoration: none !important;
}
#MessageViewBody a {
color: inherit;
text-decoration: none;
font-size: inherit;
font-family: inherit;
font-weight: inherit;
line-height: inherit;
}
}
</style>
</head>
<body>
<table role="presentation" border="0" cellpadding="0" cellspacing="0" class="body">
<tr>
<td>&nbsp;</td>
<td class="container">
<div class="content">
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td class="wrapper">
<p>Bonjour ${name},</p>
<p>${message}</p>
<p>Veuillez cliquer sur le lien ci-dessous pour procéder à la signature :</p>
<table role="presentation" border="0" cellpadding="0" cellspacing="0" class="btn btn-primary">
<tbody>
<tr>
<td align="left">
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td> <a href="${url_sign}" target="_blank">Cliquez ici pour signer</a> </td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</table>
<div class="footer">
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td class="content-block">
<span class="apple-link">BANQUE MAROCAINE POUR LE COMMERCE ET L'INDUSTRIE (BMCI)</span>
</td>
</tr>
<tr>
<td class="content-block powered-by">
Fait à <b>Casablanca</b> le &nbsp;<span>${day_date}</span>
</td>
</tr>
</table>
</div>
</div>
</td>
<td>&nbsp;</td>
</tr>
</table>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta charset="UTF-8">
<title>Relance - Demande en attente - BMCI</title>
<style>
body {
font-family: Helvetica, Arial, sans-serif;
background-color: #f4f5f6;
margin: 0;
padding: 0;
color: #333;
}
.container {
max-width: 600px;
margin: 0 auto;
padding: 24px;
}
.content {
background-color: #ffffff;
border: 1px solid #eaebed;
border-radius: 16px;
padding: 24px;
}
.footer {
text-align: center;
color: #9a9ea6;
font-size: 14px;
margin-top: 24px;
}
.btn-primary {
display: inline-block;
padding: 12px 24px;
background: linear-gradient(45deg, #07674D, #0ECD99);
color: #ffffff;
text-decoration: none;
border-radius: 4px;
font-weight: bold;
}
.btn-primary:hover {
background: linear-gradient(45deg, #065942, #0bb689);
}
@media only screen and (max-width: 640px) {
.container {
padding: 16px;
}
.content {
padding: 16px;
}
.btn-primary {
width: 100%;
text-align: center;
}
}
</style>
</head>
<body>
<div class="container">
<div class="content">
<p>Bonjour ${name},</p>
<p>Votre demande est toujours en attente et va bientôt expirer.</p>
<p>Veuillez cliquer sur le lien ci-dessous pour procéder à la ${role} :</p>
<p><a href="${url_sign}" target="_blank" class="btn-primary">Cliquez ici pour ${role}</a></p>
</div>
<div class="footer">
<p>BANQUE MAROCAINE POUR LE COMMERCE ET L'INDUSTRIE (BMCI)</p>
<p>Fait à <b>Casablanca</b> le <span>${day_date}</span></p>
</div>
</div>
</body>
</html>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment