diff --git a/pom.xml b/pom.xml
index b0a632d8..9a6ef12d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -185,6 +185,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/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java
new file mode 100644
index 00000000..11e39dc4
--- /dev/null
+++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java
@@ -0,0 +1,574 @@
+package net.gepafin.tendermanagement.dao;
+
+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 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.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 ApplicationRepository applicationRepository;
+
+ @Autowired
+ private CallService callService;
+
+ @Autowired
+ private ApplicationDao applicationDao;
+
+
+ public byte[] generatePdf(UserEntity userEntity,Long applicationId) {
+ try {
+ ApplicationEntity applicationEntity = applicationRepository
+ .findByIdAndUserIdAndIsDeletedFalse(applicationId, userEntity.getId())
+ .orElseThrow(() -> new ResourceNotFoundException(
+ Status.NOT_FOUND,
+ Translator.toLocale(GepafinConstant.APPLICATION_NOT_FOUND_MSG)
+ ));
+
+ CompanyEntity companyEntity=applicationEntity.getCompany();
+ 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