diff --git a/Dockerfile b/Dockerfile
index ceacf16e..18ed6c1a 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,5 @@
FROM amazoncorretto:17.0.8-alpine3.17
+ENV TZ="Europe/Rome"
EXPOSE 8080
ADD /target/tendermanagement-0.0.1-SNAPSHOT.jar tendermanagement-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java", "-jar","tendermanagement-0.0.1-SNAPSHOT.jar"]
diff --git a/pom.xml b/pom.xml
index db1f4b8f..1e6d394a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -191,6 +191,26 @@
2.3.0
+
+ com.itextpdf
+ itextpdf
+ 5.5.13.3
+
+
+
+
+ com.itextpdf
+ itext7-core
+ 8.0.5
+ pom
+
+
+
+
+ com.itextpdf
+ layout
+ 8.0.5
+
diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java
index ce35fbc4..b1b05dc4 100644
--- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java
+++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java
@@ -203,5 +203,12 @@ public class GepafinConstant {
public static final String USER_NOT_AUTHORIZED_TO_CREATE_APPLICATION = "user.not.authorized.create.application";
public static final String APPLICATION_SUBMITTED_CANNOT_CHANGE = "application.submitted.cannot.change";
+ public static final String CALL_DOCUMENTS_FETCH_SUCCESS_MSG = "call.documents.fetch.success";
+ public static final String CALL_DOCUMENTS_NOT_FOUND_MSG = "call.documents.not.found";
+ public static final String PERMISSION_DENIED = "permission.denied";
+ public static final String SIGNED_DOCUMENT_FILE_UPLOAD_SUCCESS = "signed.document.file.upload.success";
+ public static final String GET_SIGNED_DOCUMENT_FILE_SUCCESS = "get.signed.document.file.success";
+ public static final String APPLICATION_SIGNED_DOCUMENT_NOT_FOUND = "application.signed.document.not.found";
+ public static final String DELETE_SIGNED_DOCUMENT_FILE_SUCCESS = "delete.signed.document.file.success";
}
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java
index 1a621072..879c12b2 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java
@@ -4,6 +4,7 @@ import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.entities.*;
import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum;
+import net.gepafin.tendermanagement.enums.ApplicationSignedDocumentStatusEnum;
import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum;
import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum;
import net.gepafin.tendermanagement.enums.RoleStatusEnum;
@@ -13,6 +14,7 @@ import net.gepafin.tendermanagement.model.request.ApplicationRequest;
import net.gepafin.tendermanagement.model.request.ApplicationRequestBean;
import net.gepafin.tendermanagement.model.response.*;
import net.gepafin.tendermanagement.repositories.*;
+import net.gepafin.tendermanagement.service.AmazonS3Service;
import net.gepafin.tendermanagement.service.CallService;
import net.gepafin.tendermanagement.service.CompanyService;
import net.gepafin.tendermanagement.service.DocumentService;
@@ -33,8 +35,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
import jakarta.persistence.criteria.Predicate;
+import jakarta.servlet.http.HttpServletRequest;
import java.text.MessageFormat;
import java.time.LocalDateTime;
@@ -76,12 +80,13 @@ public class ApplicationDao {
@Autowired
private FlowDataRepository flowDataRepository;
- @Autowired
- private UserWithCompanyRepository userWithCompanyRepository;
+
@Autowired
private UserCompanyDelegationRepository userCompanyDelegationRepository;
+
@Autowired
private Validator validator;
+
@Autowired
private CompanyService companyService;
@@ -89,6 +94,7 @@ public class ApplicationDao {
private ProtocolRepository protocolRepository;
@Autowired
+
private SystemEmailTemplatesService systemEmailTemplatesService;
@Autowired
@@ -106,6 +112,13 @@ public class ApplicationDao {
@Value("${carlo_email}")
private String carloEmail;
+ private AmazonS3Service amazonS3Service;
+
+ @Autowired
+ private ApplicationSignedDocumentRepository applicationSignedDocumentRepository;
+
+ @Value("${aws.s3.url.folder.signed.document}")
+ private String signedDocumentS3Folder;
public ApplicationResponseBean createApplication(ApplicationRequestBean applicationRequestBean, UserEntity userEntity, Long formId, Long applicationId) {
@@ -689,7 +702,6 @@ public class ApplicationDao {
protocolRepository.save(protocolEntity);
return protocolEntity;
}
-
private void sendMailToUserAndCompany(UserEntity userEntity, ApplicationEntity applicationEntity) {
CallEntity call =applicationEntity.getCall();
CompanyEntity company = applicationEntity.getCompany();
@@ -724,34 +736,109 @@ public class ApplicationDao {
}
private void sendMailTodefaultSystemAndGepafin(UserEntity userEntity, ApplicationEntity applicationEntity) {
- CallEntity call =applicationEntity.getCall();
- CompanyEntity company = applicationEntity.getCompany();
- ProtocolEntity protocol = applicationEntity.getProtocol();
- SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService
- .retrieveTemplateByTypeAndCall(SystemEmailTemplatesEntityTypeEnum.APPLICATION_SUBMISSION_TO_GEPAFIN,
- call, null);
+ CallEntity call = applicationEntity.getCall();
+ CompanyEntity company = applicationEntity.getCompany();
+ ProtocolEntity protocol = applicationEntity.getProtocol();
+ SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService
+ .retrieveTemplateByTypeAndCall(SystemEmailTemplatesEntityTypeEnum.APPLICATION_SUBMISSION_TO_GEPAFIN,
+ call, null);
+
+ // Create the map for subject placeholders
+ Map subjectPlaceholders = new HashMap<>();
+ subjectPlaceholders.put("{{call_name}}", call.getName());
+ subjectPlaceholders.put("{{company_name}}", company.getCompanyName());
+
+ // Create the map for body placeholders
+ Map bodyPlaceholders = new HashMap<>();
+ bodyPlaceholders.put("{{call_name}}", call.getName());
+ bodyPlaceholders.put("{{protocol_number}}", protocol.getProtocolNumber().toString());
+ bodyPlaceholders.put("{{date}}", DateTimeUtil.formatLocalDateTime(protocol.getCreatedDate(), GepafinConstant.YYYY_MM_DD_SLASH));
+ bodyPlaceholders.put("{{time}}", DateTimeUtil.parseLocalTimeToString(protocol.getTime(), GepafinConstant.HH_MM_SS));
+
+ // Replace placeholders in the subject and body
+ String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders);
+ String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders);
+
+
+ mailUtil.sendByMailGun(subject, body, List.of(defaultSystemReceiverEmail), null);
+ mailUtil.sendByMailGun(subject, body, List.of(gepafinEmail), null);
+ mailUtil.sendByMailGun(subject, body, List.of(rinaldoEmail), null);
+ mailUtil.sendByMailGun(subject, body, List.of(carloEmail), null);
+
+ }
+ public ApplicationSignedDocumentResponse uploadSignedDocument(HttpServletRequest request, Long applicationId,
+ MultipartFile file) {
+ ApplicationEntity applicationEntity = validateApplication(applicationId);
+ validator.validateUserWithCompany(request, applicationEntity.getCompany().getId());
+ validateFileType(file);
+ ApplicationSignedDocumentEntity applicationSignedDocument = applicationSignedDocumentRepository
+ .findByApplicationIdAndStatus(applicationId, ApplicationSignedDocumentStatusEnum.ACTIVE.getValue());
+ if (applicationSignedDocument != null) {
+ applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.INACTIVE.getValue());
+ applicationSignedDocumentRepository.save(applicationSignedDocument);
+ }
+ UploadFileOnAmazonS3Response uploadFileOnAmazonS3 = amazonS3Service.uploadFileOnAmazonS3(signedDocumentS3Folder,
+ file);
+ applicationSignedDocument = new ApplicationSignedDocumentEntity();
+ applicationSignedDocument.setApplication(applicationEntity);
+ applicationSignedDocument.setFileName(uploadFileOnAmazonS3.getFileName());
+ applicationSignedDocument.setFilePath(uploadFileOnAmazonS3.getFilePath());
+ applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.ACTIVE.getValue());
+ applicationSignedDocumentRepository.save(applicationSignedDocument);
+ return convertApplicationSignedDocumentToApplicationSignedDocumentResponse(applicationSignedDocument);
+ }
+
+ private ApplicationSignedDocumentResponse convertApplicationSignedDocumentToApplicationSignedDocumentResponse(
+ ApplicationSignedDocumentEntity applicationSignedDocument) {
+ ApplicationSignedDocumentResponse applicationSignedDocumentResponse = new ApplicationSignedDocumentResponse();
+ applicationSignedDocumentResponse.setId(applicationSignedDocument.getId());
+ applicationSignedDocumentResponse.setApplicationId(applicationSignedDocument.getApplication().getId());
+ applicationSignedDocumentResponse.setFileName(applicationSignedDocument.getFileName());
+ applicationSignedDocumentResponse.setFilePath(applicationSignedDocument.getFilePath());
+ applicationSignedDocumentResponse
+ .setStatus(ApplicationSignedDocumentStatusEnum.valueOf(applicationSignedDocument.getStatus()));
+ applicationSignedDocumentResponse.setCreatedDate(applicationSignedDocument.getCreatedDate());
+ applicationSignedDocumentResponse.setUpdatedDate(applicationSignedDocument.getUpdatedDate());
+ return applicationSignedDocumentResponse;
+ }
+
+ private void validateFileType(MultipartFile file) {
+ if (file.isEmpty()) {
+ throw new CustomValidationException(Status.VALIDATION_ERROR,
+ Translator.toLocale(GepafinConstant.VALIDATION_ERROR_FILE_EMPTY));
+ }
+ String filename = file.getOriginalFilename();
+ if (filename == null || !filename.endsWith(".p7m")) {
+ throw new CustomValidationException(Status.VALIDATION_ERROR,
+ Translator.toLocale(GepafinConstant.VALIDATION_ERROR_FILE_INVALIDTYPE));
+ }
+ }
+
+ public ApplicationSignedDocumentResponse getSignedDocument(HttpServletRequest request, Long applicationId) {
- // Create the map for subject placeholders
- Map subjectPlaceholders = new HashMap<>();
- subjectPlaceholders.put("{{call_name}}", call.getName());
- subjectPlaceholders.put("{{company_name}}", company.getCompanyName());
-
- // Create the map for body placeholders
- Map bodyPlaceholders = new HashMap<>();
- bodyPlaceholders.put("{{call_name}}", call.getName());
- bodyPlaceholders.put("{{protocol_number}}", protocol.getProtocolNumber().toString());
- bodyPlaceholders.put("{{date}}", DateTimeUtil.formatLocalDateTime(protocol.getCreatedDate(), GepafinConstant.YYYY_MM_DD_SLASH));
- bodyPlaceholders.put("{{time}}", DateTimeUtil.parseLocalTimeToString(protocol.getTime(), GepafinConstant.HH_MM_SS));
-
- // Replace placeholders in the subject and body
- String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders);
- String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders);
-
+ ApplicationEntity applicationEntity = validateApplication(applicationId);
+ validator.validateUserWithCompany(request, applicationEntity.getCompany().getId());
- mailUtil.sendByMailGun(subject, body, List.of(defaultSystemReceiverEmail), null);
- mailUtil.sendByMailGun(subject, body, List.of(gepafinEmail), null);
- mailUtil.sendByMailGun(subject, body, List.of(rinaldoEmail), null);
- mailUtil.sendByMailGun(subject, body, List.of(carloEmail), null);
-
+ ApplicationSignedDocumentEntity applicationSignedDocument = applicationSignedDocumentRepository
+ .findByApplicationIdAndStatus(applicationId, ApplicationSignedDocumentStatusEnum.ACTIVE.getValue());
+ if(applicationSignedDocument == null) {
+ throw new ResourceNotFoundException(Status.NOT_FOUND,
+ Translator.toLocale(GepafinConstant.APPLICATION_SIGNED_DOCUMENT_NOT_FOUND));
+ }
+ return convertApplicationSignedDocumentToApplicationSignedDocumentResponse(applicationSignedDocument);
+ }
+
+ public void deleteSignedDocument(HttpServletRequest request, Long applicationId) {
+ ApplicationEntity applicationEntity = validateApplication(applicationId);
+ validator.validateUserWithCompany(request, applicationEntity.getCompany().getId());
+
+ ApplicationSignedDocumentEntity applicationSignedDocument = applicationSignedDocumentRepository
+ .findByApplicationIdAndStatus(applicationId, ApplicationSignedDocumentStatusEnum.ACTIVE.getValue());
+ if(applicationSignedDocument == null) {
+ throw new ResourceNotFoundException(Status.NOT_FOUND,
+ Translator.toLocale(GepafinConstant.APPLICATION_SIGNED_DOCUMENT_NOT_FOUND));
+ }
+ applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.INACTIVE.getValue());
+ applicationSignedDocumentRepository.save(applicationSignedDocument);
}
}
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java
index c6345d59..0827b62a 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java
@@ -1,5 +1,9 @@
package net.gepafin.tendermanagement.dao;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
@@ -8,13 +12,21 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum;
import net.gepafin.tendermanagement.model.response.*;
import net.gepafin.tendermanagement.service.*;
import net.gepafin.tendermanagement.util.DateTimeUtil;
import net.gepafin.tendermanagement.util.Utils;
+import org.h2.util.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
@@ -85,6 +97,10 @@ public class CallDao {
private FlowDao flowDao;
@Autowired
private FormDao formDao;
+ @Value("${aws.s3.url.folder}")
+ private String s3Folder;
+ @Autowired
+ private AmazonS3Service amazonS3Service;
public CallResponse createCallStep1(CreateCallRequestStep1 createCallRequest, Long userId) {
UserEntity userEntity = userService.validateUser(userId);
@@ -101,6 +117,35 @@ public class CallDao {
return createCallResponseBean;
}
+ public byte[] downloadCallDocumentsAsZip(Long callId) {
+ List documents = documentRepository.findBySourceIdAndSourceAndTypeAndIsDeletedFalse(callId, DocumentSourceTypeEnum.CALL.getValue(),DocumentTypeEnum.DOCUMENT.getValue());
+ if (documents.isEmpty()) {
+ throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND));
+ }
+
+ try (ByteArrayOutputStream zipOutputStream = new ByteArrayOutputStream();
+ ZipOutputStream zos = new ZipOutputStream(zipOutputStream)) {
+
+ for (DocumentEntity document : documents) {
+ try (InputStream fileInputStream = amazonS3Service.getFile(s3Folder, document.getFileName())) {
+ ZipEntry zipEntry = new ZipEntry(document.getFileName());
+ zos.putNextEntry(zipEntry);
+ IOUtils.copy(fileInputStream, zos);
+ zos.closeEntry();
+ } catch (IOException e) {
+ throw new RuntimeException("Error downloading or adding document to ZIP: " + document.getFileName(), e);
+ }
+ }
+
+ zos.finish();
+ return zipOutputStream.toByteArray();
+
+ } catch (IOException e) {
+ throw new RuntimeException("Error while creating ZIP file", e);
+ }
+ }
+
+
public CallEntity convertToCallEntity(CreateCallRequestStep1 createCallRequest) {
CallEntity callEntity = new CallEntity();
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java
index 728990b5..3a9b92ad 100644
--- a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java
+++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java
@@ -18,6 +18,7 @@ import net.gepafin.tendermanagement.repositories.UserWithCompanyRepository;
import net.gepafin.tendermanagement.service.UserService;
import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
+import net.gepafin.tendermanagement.web.rest.api.errors.ForbiddenAccessException;
import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException;
import net.gepafin.tendermanagement.web.rest.api.errors.Status;
@@ -190,8 +191,8 @@ public class CompanyDao {
}
public UserWithCompanyEntity validateUserWithCompny(Long userId, Long companyId) {
- return userWithCompanyRepository.findByUserIdAndCompanyId(userId, companyId).orElseThrow(() -> new CustomValidationException(Status.UNAUTHORIZED,
- Translator.toLocale(GepafinConstant.UNAUTHORIZED)));
+ return userWithCompanyRepository.findByUserIdAndCompanyId(userId, companyId).orElseThrow(() -> new ForbiddenAccessException(Status.FORBIDDEN,
+ Translator.toLocale(GepafinConstant.PERMISSION_DENIED)));
}
public UserWithCompanyEntity getUserWithCompany(Long userId, Long compnayId) {
diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java
new file mode 100644
index 00000000..30e10fe8
--- /dev/null
+++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java
@@ -0,0 +1,600 @@
+package net.gepafin.tendermanagement.dao;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.itextpdf.kernel.colors.ColorConstants;
+import com.itextpdf.kernel.colors.DeviceRgb;
+import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
+import com.itextpdf.layout.properties.UnitValue;
+import com.itextpdf.layout.renderer.CellRenderer;
+import com.itextpdf.layout.renderer.DrawContext;
+import com.itextpdf.text.*;
+import com.itextpdf.text.Element;
+import com.itextpdf.text.Font;
+import com.itextpdf.text.Image;
+import com.itextpdf.text.Rectangle;
+import com.itextpdf.text.pdf.*;
+
+import jakarta.servlet.http.HttpServletRequest;
+import net.gepafin.tendermanagement.config.Translator;
+import net.gepafin.tendermanagement.constants.GepafinConstant;
+import net.gepafin.tendermanagement.entities.*;
+import net.gepafin.tendermanagement.model.request.CustomPageEvent;
+import net.gepafin.tendermanagement.model.request.FieldLabelValuePairRequest;
+import net.gepafin.tendermanagement.model.response.*;
+import net.gepafin.tendermanagement.repositories.ApplicationRepository;
+import net.gepafin.tendermanagement.service.CallService;
+import net.gepafin.tendermanagement.util.Validator;
+import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException;
+import net.gepafin.tendermanagement.web.rest.api.errors.Status;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import com.itextpdf.layout.element.Table;
+import com.itextpdf.layout.element.Cell;
+//import com.itextpdf.layout.element.
+
+
+import java.awt.*;
+import java.io.ByteArrayOutputStream;
+import java.util.*;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Component
+public class PdfDao {
+
+ @Autowired
+ private CallService callService;
+
+ @Autowired
+ private ApplicationDao applicationDao;
+
+ @Autowired
+ private Validator validator;
+
+
+ public byte[] generatePdf(HttpServletRequest request,Long applicationId) {
+ try {
+ UserEntity userEntity = validator.validateUser(request);
+ ApplicationEntity applicationEntity = applicationDao.validateApplication(applicationId);
+ validator.validateUserWithCompany(request, applicationEntity.getCompany().getId());
+ CallEntity call=callService.validateCall(applicationEntity.getCall().getId());
+
+ // Create a byte stream to hold the PDF
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ float leftMargin = 50f; // Adjust this for the left margin
+
+ Document document = new Document(PageSize.A4, leftMargin, 36f, 50f, 35);
+ PdfWriter writer = PdfWriter.getInstance(document, out);
+ CustomPageEvent pageEvent = new CustomPageEvent(call.getName(), 0);
+ writer.setPageEvent(pageEvent);
+ document.open();
+ pageEvent.setTotalPages(writer.getPageNumber());
+ addLogo(document, "https://mementoresources.s3.eu-west-1.amazonaws.com/gepafin/logo.jpg"); // Add your image path here
+
+
+ BaseColor customColor = new BaseColor(0, 128, 0); // Adjust RGB values as needed
+ // Define fonts and styles
+ BaseColor greenColor = new BaseColor(0, 128, 0); // Adjust RGB values as needed
+ BaseColor darkGreenColor = new BaseColor(1, 50, 32); // Adjust RGB values as needed
+ Font titleFont = FontFactory.getFont(FontFactory.HELVETICA_BOLD, 16, customColor);
+ Font sectionFont = FontFactory.getFont(FontFactory.HELVETICA_BOLD, 12,darkGreenColor);
+ Font labelFont = FontFactory.getFont(FontFactory.HELVETICA_BOLD, 12,new BaseColor(113,121,126)); // Light grey);
+ Font smallFont = FontFactory.getFont(FontFactory.HELVETICA_BOLD, 8,new BaseColor(105, 105, 105));
+ Font valueFont=FontFactory.getFont(FontFactory.HELVETICA_BOLD,10,new BaseColor(178, 190, 181));
+ Paragraph title = new Paragraph(call.getName(), titleFont);
+ title.setAlignment(Element.ALIGN_LEFT);
+ document.add(title);
+
+ BaseColor greyColor=new BaseColor(178, 190, 181); // Very light grey color
+ addColoredLines(writer,document,greyColor);
+ document.add(new Paragraph(" "));
+
+ // Application ID section (Centered)
+ pageEvent.setTotalPages(writer.getPageNumber());
+ Paragraph appId = new Paragraph("ID domanda :" +"XX00");
+ appId.setAlignment(Element.ALIGN_RIGHT);
+ document.add(appId);
+
+ if(applicationEntity.getProtocol()!=null) {
+ appId = new Paragraph("ID domanda :"+String.valueOf(applicationEntity.getProtocol().getProtocolNumber()), valueFont);
+ appId.setAlignment(Element.ALIGN_RIGHT);
+ document.add(appId);
+ }
+ document.add(new Paragraph(" "));
+
+ addColoredLines(writer,document,greenColor);
+ document.add(new Paragraph(" "));
+ document.add(new Paragraph("\n")); // Add line break
+// String companyName= companyEntity.getCompanyName();
+// String vatNumber=companyEntity.getVatNumber();
+// String address=companyEntity.getAddress();
+// // Section: Dati Anagrafici Azienda
+// document.add(new Paragraph("Dati Anagrafici Azienda", sectionFont));
+// addLabelValuePair(document, "Codice ATECO", "SEZIONE C “ATTIVITÀ MANUFATTURIERE”", regularFont);
+// addLabelValuePair(document, "Ragione Sociale", companyName, regularFont);
+// addLabelValuePair(document, "Partita IVA", vatNumber, regularFont);
+// addLabelValuePair(document, "Indirizzo sede Legale", address, regularFont);
+//
+// document.add(new Paragraph("\n")); // Add line break
+//
+// // Section: Domanda presentata da
+// document.add(new Paragraph("Domanda presentata da:", sectionFont));
+// addLabelValuePair(document, "Nome e cognome", userEntity.getBeneficiary().getFirstName()+" "+userEntity.getBeneficiary().getLastName(), regularFont);
+// addLabelValuePair(document, "Codice fiscale", userEntity.getBeneficiary().getCodiceFiscale(), regularFont);
+// addLabelValuePair(document, "Telefono", userEntity.getBeneficiary().getPhoneNumber(), regularFont);
+// addLabelValuePair(document, "Email", userEntity.getBeneficiary().getEmail(), regularFont);
+// addLabelValuePair(document, "Con il titolo di", "Rappresentante legale", regularFont);
+ document.add(new Paragraph(" "));
+
+ ApplicationGetResponseBean applicationGetResponseBean=applicationDao.getApplicationByFormId(applicationId,null, userEntity);
+ for(FormApplicationResponse formApplicationResponse: applicationGetResponseBean.getForm()) {
+ document.add(new Paragraph(formApplicationResponse.getLabel(),sectionFont));
+ document.add(new Paragraph(" ")); // Add line break
+ List fieldLabelValuePairRequests = getFormFieldsToLabels(formApplicationResponse);
+ for (FieldLabelValuePairRequest pair : fieldLabelValuePairRequests) {
+ String label = pair.getLabel();
+ Object value = pair.getValue();
+ Integer pages=0;
+ pages=addLabelValuePair(writer,document, label, value, labelFont,valueFont,call.getName(),pages);
+ if(pages !=0 ){
+ pageEvent.setTotalPages(writer.getPageNumber());
+ }
+ }
+ addColoredLines(writer,document,greenColor);
+ document.add(new Paragraph(" ")); // Add line break
+ }
+ document.add(new Paragraph("\n")); // Add line break
+ Font boldSmallFont = new Font(Font.FontFamily.HELVETICA, 10, Font.BOLD,new BaseColor(105, 105, 105));
+
+ // Adding the "Documenti Allegati" section title
+ document.add(new Paragraph(" "));
+
+ pageEvent.setTotalPages(writer.getPageNumber());
+ document.newPage();
+ document.add(new Paragraph("Documenti Allegati", sectionFont));
+ document.add(new Paragraph(" "));
+
+
+// 1. Autocertificazione possesso Requisiti
+ Paragraph p1 = new Paragraph();
+ p1.add(new Chunk("1. ", boldSmallFont));
+ p1.add(new Chunk("Autocertificazione possesso Requisiti ", boldSmallFont));
+ p1.add(new Chunk("ai sensi degli artt. 46 e 47 del DPR 445/2000", smallFont));
+ document.add(p1);
+ document.add(new Paragraph(" "));
+
+
+
+// 2. Informativa Privacy relativa al trattamento dei dati personali
+ Paragraph p2 = new Paragraph();
+ p2.add(new Chunk("2. ", boldSmallFont));
+ p2.add(new Chunk("Informativa Privacy relativa al trattamento dei dati personali", boldSmallFont));
+ document.add(p2);
+ document.add(new Paragraph(" "));
+
+
+// 3. Dati richiesti per la valutazione dell’adeguatezza dei flussi finanziari
+ Paragraph p3 = new Paragraph();
+ p3.add(new Chunk("3. ", boldSmallFont));
+ p3.add(new Chunk("Dati richiesti per la valutazione dell’adeguatezza dei flussi finanziari prospettici come da tabella di cui all’Appendice 9", boldSmallFont));
+ document.add(p3);
+ document.add(new Paragraph(" "));
+
+
+// 4. Rilevazione Centrale dei Rischi
+ Paragraph p4 = new Paragraph();
+ p4.add(new Chunk("4. ", boldSmallFont));
+ p4.add(new Chunk("Rilevazione Centrale dei Rischi riferita agli ultimi 36 mesi disponibili alla data di presentazione della Domanda", boldSmallFont));
+ document.add(p4);
+ document.add(new Paragraph(" "));
+
+
+// 5. Schema di presentazione dei dati di bilancio
+ Paragraph p5 = new Paragraph();
+ p5.add(new Chunk("5. ", boldSmallFont));
+ p5.add(new Chunk("Schema di presentazione dei dati di bilancio", boldSmallFont));
+ document.add(p5);
+ document.add(new Paragraph(" "));
+
+
+// 6. Dettagli bilanci in forma abbreviata
+ Paragraph p6 = new Paragraph();
+ p6.add(new Chunk("6. ", boldSmallFont));
+ p6.add(new Chunk("Dettagli bilanci in forma abbreviata", boldSmallFont));
+ document.add(p6);
+ document.add(new Paragraph(" "));
+
+
+// 7. Relazione aziendale illustrativa
+ Paragraph p7 = new Paragraph();
+ p7.add(new Chunk("7. ", boldSmallFont));
+ p7.add(new Chunk("Relazione aziendale illustrativa", boldSmallFont));
+ document.add(p7);
+ document.add(new Paragraph(" "));
+
+ addColoredLines(writer,document,greenColor);
+
+ // Close the document
+ document.close();
+
+ // Convert to byte array for response
+ byte[] pdfBytes = out.toByteArray();
+ return pdfBytes;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ private Integer addLabelValuePair(PdfWriter writer,Document document, String label, Object value, Font labelFont,Font valueFont,String title,Integer totalPages) throws DocumentException {
+ // Add label
+ Paragraph labelParagraph = new Paragraph(label, labelFont);
+ document.add(labelParagraph);
+ float leftMargin = 20f;
+
+ PdfContentByte canvas = writer.getDirectContent();
+
+ // Setting the color and width of the line
+ float lineWidth = 1.0f; // Thickness of the line
+ canvas.setLineWidth(lineWidth);
+
+ // Get the current vertical position in the document
+ float yPos = writer.getVerticalPosition(true) - 10f; // Adjust this to move line slightly below current content
+
+ // Define start and end points for the line (relative to the page size and margins)
+
+ if (yPos <= 140) {
+ // If xEnd is less than or equal to 200, generate a new page
+
+ totalPages++;
+ document.newPage();
+ } // Add a gap between the label and value
+ document.add(new Paragraph(" ")); // Adding an empty paragraph for spacing
+ // Create value cell with rounded corners
+ PdfPTable valueTable = new PdfPTable(1);
+ valueTable.setWidthPercentage(100);
+ if (value instanceof List>) {
+ // Further check if the list contains Strings
+ List> list = (List>) value;
+ if (!list.isEmpty() && list.get(0) instanceof String) {
+ // Cast to List
+ List values = (List) value;
+
+ // Loop through the list of strings and create a cell for each string
+ for (String item : values) {
+ PdfPCell valueCell = new PdfPCell(new Phrase(item, valueFont));
+ valueCell.setPadding(5f); // Increase padding for better spacing
+ valueCell.setPaddingLeft(leftMargin); // Increase left margin for value
+ valueCell.setBorder(Rectangle.NO_BORDER); // Remove border for value cell
+ valueCell.setMinimumHeight(30f);
+ valueCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
+ valueCell.setCellEvent(new RoundedCorners()); // Apply rounded corners
+
+ // Add the cell to the table
+ valueTable.addCell(valueCell);
+ }
+
+ // Finally, add the table to the document
+ document.add(valueTable);
+ } else {
+ boolean containsThreeValues = false; // Variable to track if any map contains three keys
+ List