Project Initialisation - all steps
authormarcellszabo-spedinfo <marcell.szabo@gmail.com>
Tue, 5 Dec 2023 19:55:25 +0000 (20:55 +0100)
committermarcellszabo-spedinfo <marcell.szabo@gmail.com>
Tue, 5 Dec 2023 19:55:25 +0000 (20:55 +0100)
lis-app/src/test/java/hu/user/lis/workflow/PrepareProjectIT.java
lis-workflow/pom.xml
lis-workflow/src/main/java/hu/user/lis/workflow/project/CopyCalculationXlsx.java [new file with mode: 0644]
lis-workflow/src/main/java/hu/user/lis/workflow/project/CreateEnglishProposal.java [new file with mode: 0644]
lis-workflow/src/main/java/hu/user/lis/workflow/project/CreateHungarianProposal.java [new file with mode: 0644]
lis-workflow/src/main/java/hu/user/lis/workflow/project/CreateProjectFolders.java
lis-workflow/src/main/java/hu/user/lis/workflow/project/CreateProjectStructure.java [new file with mode: 0644]
lis-workflow/src/main/java/hu/user/lis/workflow/project/CreateTIG.java [new file with mode: 0644]
lis-workflow/src/main/java/hu/user/lis/workflow/project/SlyException.java [deleted file]
lis-workflow/src/main/resources/prepare-project.bpmn

index 4699ebcdcad51e3a863781488b31af530051c011..9fdc08e3ab9d9289b045089b54bec787421e31ae 100644 (file)
@@ -6,6 +6,7 @@
 package hu.user.lis.workflow;
 
 import com.google.common.collect.ImmutableMap;
+import hu.user.lis.db.Partner;
 import hu.user.lis.db.Project;
 import hu.user.lis.db.repository.PartnerRepository;
 import hu.user.lis.db.repository.ProjectRepository;
@@ -16,15 +17,17 @@ import org.camunda.bpm.engine.RuntimeService;
 import org.camunda.bpm.engine.runtime.ProcessInstance;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import static org.junit.jupiter.api.Assertions.assertEquals;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.test.context.ActiveProfiles;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.io.File;
 import java.util.Objects;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
 
 @Log4j2
 @SpringBootTest
@@ -50,34 +53,31 @@ public class PrepareProjectIT extends BpmnTest {
 
     @Test
     public void testPrepareProject() throws InterruptedException {
-        Project project = Project.builder()
-                .partner(partnerRepository.findAll().get(0))
-                .projectStatus(projectStatusRepository.findAll().get(0))
-                .name("Teszt projekt")
-                .humanId("2092-1123")
-                .active(true)
-                .build();
+        Partner partner = partnerRepository.findAll().get(0);
+        partner.setAddress("1039 Budapest, Kovács utca 772.");
+        partnerRepository.saveAndFlush(partner);
+        Project project = Project.builder().partner(partner).projectStatus(projectStatusRepository.findAll().get(0)).name("Teszt projekt").humanId("2092-1123").contactName("Gipsz Jakab").active(true).build();
+        WorkflowProperties.PrepareProject pp = workflowProperties.getPrepareProject();
         try {
             projectRepository.saveAndFlush(project);
-            WorkflowProperties.PrepareProject pp = workflowProperties.getPrepareProject();
-            assertEquals(pp.getProposalPostfixDateFormat(),"yyyyMMdd");
-            assertEquals(pp.getValidityDateFormat(),"yyyy. MMMM dd.");
-            assertEquals(pp.getProjectNameSeparator()," - ");
-            assertEquals(pp.getAjanlatkeres(),"01_Ajánlatkérés");
-            assertEquals(pp.getBejovoAjanlatkeres(),"02_Bejövő ajánlatok");
-            assertEquals(pp.getKalkulacio(),"03_Kalkuláció");
-            assertEquals(pp.getKimenoAjanlatok(),"04_Kimenő ajánlatok");
-            assertEquals(pp.getMegrendeles(),"05_Megrendelés");
-            assertEquals(pp.getTeljesites(),"06_Teljesítés");
-            assertEquals(pp.getAjanlatNamePrefix(),"USER_Ajánlat_");
-            assertEquals(pp.getProposalNamePrefix(),"USER_Proposal_");
-            assertEquals(pp.getTigNamePrefix(),"USER_TIG_");
-            assertEquals(pp.getKalkulacioNamePrefix(),"USER_Kalkuláció_");
-            assertEquals(pp.getSmbMountPointForSalesDirector(),"/Users/marcellszabo/Downloads/SALES");
-            assertEquals(pp.getAjanlatTemplateDocx(),"/Users/marcellszabo/Downloads/SALES/SABLONOK/USER_Ajánlat_v1.docx");
-            assertEquals(pp.getProposalTemplateDocx(),"/Users/marcellszabo/Downloads/SALES/SABLONOK/USER_Proposal_v1.docx");
-            assertEquals(pp.getTigTemplateDocx(),"/Users/marcellszabo/Downloads/SALES/SABLONOK/TIG_Sablon_v1.docx");
-            assertEquals(pp.getCalculationXlsx(),"/Users/marcellszabo/Downloads/SALES/SABLONOK/USER_kalkuláció_v1.xlsx");
+            assertEquals(pp.getProposalPostfixDateFormat(), "yyyyMMdd");
+            assertEquals(pp.getValidityDateFormat(), "yyyy. MMMM dd.");
+            assertEquals(pp.getProjectNameSeparator(), " - ");
+            assertEquals(pp.getAjanlatkeres(), "01_Ajánlatkérés");
+            assertEquals(pp.getBejovoAjanlatkeres(), "02_Bejövő ajánlatok");
+            assertEquals(pp.getKalkulacio(), "03_Kalkuláció");
+            assertEquals(pp.getKimenoAjanlatok(), "04_Kimenő ajánlatok");
+            assertEquals(pp.getMegrendeles(), "05_Megrendelés");
+            assertEquals(pp.getTeljesites(), "06_Teljesítés");
+            assertEquals(pp.getAjanlatNamePrefix(), "USER_Ajánlat_");
+            assertEquals(pp.getProposalNamePrefix(), "USER_Proposal_");
+            assertEquals(pp.getTigNamePrefix(), "USER_TIG_");
+            assertEquals(pp.getKalkulacioNamePrefix(), "USER_Kalkuláció_");
+            assertEquals(pp.getSmbMountPointForSalesDirector(), "/Users/marcellszabo/Downloads/SALES");
+            assertEquals(pp.getAjanlatTemplateDocx(), "/Users/marcellszabo/Downloads/SALES/SABLONOK/USER_Ajánlat_v1.docx");
+            assertEquals(pp.getProposalTemplateDocx(), "/Users/marcellszabo/Downloads/SALES/SABLONOK/USER_Proposal_v1.docx");
+            assertEquals(pp.getTigTemplateDocx(), "/Users/marcellszabo/Downloads/SALES/SABLONOK/TIG_Sablon_v1.docx");
+            assertEquals(pp.getCalculationXlsx(), "/Users/marcellszabo/Downloads/SALES/SABLONOK/USER_kalkuláció_v1.xlsx");
             log.info("Postfixdate format: {}", workflowProperties.getPrepareProject().getProposalPostfixDateFormat());
             cancelRunningProcesses(PROCESSID);
             ImmutableMap<String, Object> params = ImmutableMap.of("projectId", project.getId());
@@ -90,8 +90,22 @@ public class PrepareProjectIT extends BpmnTest {
             if (Objects.nonNull(project.getId())) {
                 projectRepository.delete(project);
             }
+            String fileSeparator = File.separator;
+            String path = pp.getSmbMountPointForSalesDirector() + fileSeparator + project.getPartner().getName() + fileSeparator + project.getHumanId().trim() + pp.getProjectNameSeparator() + project.getName().trim();
+            log.info("Delete project folder path: " + path + ".");
+            File baseDir = new File(path);
+            deleteDirectory(baseDir);
         }
 
     }
 
+    boolean deleteDirectory(File directoryToBeDeleted) {
+        File[] allContents = directoryToBeDeleted.listFiles();
+        if (allContents != null) {
+            for (File file : allContents) {
+                deleteDirectory(file);
+            }
+        }
+        return directoryToBeDeleted.delete();
+    }
 }
\ No newline at end of file
index ce39ae14b40ef0fb717e71c19d11b146a2050fbb..ed04436a0ebb289a75477a6763a98e7aa2549052 100644 (file)
             <groupId>org.springframework</groupId>
             <artifactId>spring-context</artifactId>
         </dependency>
+        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>5.2.5</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>5.2.5</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-io -->
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.15.1</version>
+        </dependency>
     </dependencies>
 </project>
diff --git a/lis-workflow/src/main/java/hu/user/lis/workflow/project/CopyCalculationXlsx.java b/lis-workflow/src/main/java/hu/user/lis/workflow/project/CopyCalculationXlsx.java
new file mode 100644 (file)
index 0000000..8423eba
--- /dev/null
@@ -0,0 +1,73 @@
+package hu.user.lis.workflow.project;
+
+import hu.user.lis.db.repository.ProjectRepository;
+import hu.user.lis.workflow.properties.WorkflowProperties;
+import lombok.extern.log4j.Log4j2;
+import org.camunda.bpm.engine.ProcessEngineException;
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.persistence.EntityNotFoundException;
+import java.io.File;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Locale;
+
+@Log4j2
+@Component
+public class CopyCalculationXlsx extends CreateProjectStructure {
+    private final static String fileSeparator = File.separator; // or FileSystems.getDefault().getSeparator(); File.separatorChar;
+
+    @Autowired
+    private ProjectRepository projectRepository;
+
+    @Autowired
+    private WorkflowProperties workflowProperties;
+
+    @Override
+    public void execute(DelegateExecution delegateExecution) throws Exception {
+        Long projectId = (Long) delegateExecution.getVariable("projectId");
+        project = projectRepository.findById(projectId).orElseThrow(EntityNotFoundException::new);
+        log.info("Creating Calculation Xlsx project ID {}", projectId);
+        log.info("Creating Calculation Xlsx Name {}", project.getName());
+//        delegateExecution.setVariableLocal("invoices", invoices);
+        copyCalculation(project.getPartner().getName(), project.getHumanId(), project.getName());
+
+    }
+
+    private void copyCalculation(String partnerShortName, String projectID, String projectName) throws ProcessEngineException {
+        WorkflowProperties.PrepareProject pp = workflowProperties.getPrepareProject();
+
+        log.info("Copy Calculation file for " + partnerShortName + ", and " + projectID + pp.getProjectNameSeparator() + projectName + ". File system separator: " + fileSeparator);
+        if (partnerShortName == null || partnerShortName.isEmpty() || partnerShortName.trim().isEmpty()) {
+            log.error("Copy Calculation file failed, Partner Short Name is Null or Empty!");
+            throw new ProcessEngineException("Partner Short Name is Null or Empty!");
+        }
+
+        if (projectID == null || projectID.isEmpty() || projectID.trim().isEmpty()) {
+            log.error("Copy Calculation file failed, Project ID is Null or Empty!");
+            throw new ProcessEngineException("Project ID is Null or Empty!");
+        }
+
+        if (projectName == null || projectName.isEmpty() || projectName.trim().isEmpty()) {
+            log.error("Copy Calculation file failed, Project Name is Null or Empty!");
+            throw new ProcessEngineException("Project Name is Null or Empty!");
+        }
+
+        String path = pp.getSmbMountPointForSalesDirector() + fileSeparator + partnerShortName.trim() + fileSeparator + projectID.trim() + pp.getProjectNameSeparator() + projectName.trim();
+        log.info("Project folder path: " + path + ".");
+        LocalDateTime ldt = LocalDateTime.now();
+        String date = DateTimeFormatter.ofPattern(pp.getProposalPostfixDateFormat(), Locale.ENGLISH).format(ldt);
+        File kalkulacioDir = new File(path + fileSeparator + pp.getKalkulacio() + fileSeparator + pp.getKalkulacioNamePrefix() + projectID.trim() + "_" + projectName.trim() + "_" + date + ".xlsx");
+        try {
+            copyFile(new File(pp.getCalculationXlsx()), kalkulacioDir);
+        } catch (IOException e) {
+            log.error("Copy Calculation file failed: " + e.getMessage());
+            throw new ProcessEngineException("Copy Calculation file failed: " + e.getMessage());
+
+        }
+    }
+
+}
diff --git a/lis-workflow/src/main/java/hu/user/lis/workflow/project/CreateEnglishProposal.java b/lis-workflow/src/main/java/hu/user/lis/workflow/project/CreateEnglishProposal.java
new file mode 100644 (file)
index 0000000..2e6c805
--- /dev/null
@@ -0,0 +1,90 @@
+package hu.user.lis.workflow.project;
+
+import hu.user.lis.workflow.properties.WorkflowProperties;
+import lombok.extern.log4j.Log4j2;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.camunda.bpm.engine.ProcessEngineException;
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.springframework.stereotype.Component;
+
+import javax.persistence.EntityNotFoundException;
+import java.io.File;
+import java.nio.file.Files;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Locale;
+
+@Log4j2
+@Component
+public class CreateEnglishProposal extends CreateProjectStructure {
+
+    @Override
+    public void execute(DelegateExecution delegateExecution) throws Exception {
+        Long projectId = (Long) delegateExecution.getVariable("projectId");
+        project = projectRepository.findById(projectId).orElseThrow(EntityNotFoundException::new);
+        log.info("Creating English Proposal project ID {}", projectId);
+        log.info("Creating English Proposal project Name {}", project.getName());
+//        delegateExecution.setVariableLocal("invoices", invoices);
+        createProposalEN(project.getPartner().getName(), project.getPartner().getName(), project.getHumanId(), project.getName(), project.getContactName());
+
+    }
+
+    public void createProposalEN(String partnerShortName, String partnerName, String projectID, String projectName, String partnerContact) throws ProcessEngineException {
+        WorkflowProperties.PrepareProject pp = workflowProperties.getPrepareProject();
+
+        log.info("Creating EN proposal for " + partnerShortName + ", " + projectID + ", " + projectName);
+
+        if (partnerShortName == null || partnerShortName.isEmpty() || partnerShortName.trim().isEmpty()) {
+            log.error("Proposal creation failed, Partner Short Name is Null or Empty!");
+            throw new ProcessEngineException("Partner Short Name is Null or Empty!");
+        }
+        if (partnerName == null || partnerName.isEmpty() || partnerName.trim().isEmpty()) {
+            log.error("Proposal creation failed, Partner Name is Null or Empty!");
+            throw new ProcessEngineException("Partner Short Name is Null or Empty!");
+        }
+
+        if (projectID == null || projectID.isEmpty() || projectID.trim().isEmpty()) {
+            log.error("Proposal creation failed, Project ID is Null or Empty!");
+            throw new ProcessEngineException("Project ID is Null or Empty!");
+        }
+
+        if (projectName == null || projectName.isEmpty() || projectName.trim().isEmpty()) {
+            log.error("Proposal creation failed, Project Name is Null or Empty!");
+            throw new ProcessEngineException("Project Name is Null or Empty!");
+        }
+
+        if (partnerContact == null || partnerContact.isEmpty() || partnerContact.trim().isEmpty()) {
+            partnerContact = "Ajánlatkérő";
+        }
+
+        log.info("Moving template file into its folder: " + partnerShortName + ", " + projectID + ", " + projectName);
+
+        String path = pp.getSmbMountPointForSalesDirector() + fileSeparator + partnerShortName.trim() + fileSeparator + projectID.trim() + pp.getProjectNameSeparator() + projectName.trim();
+        log.info("Project folder path: " + path + ".");
+
+        LocalDateTime ldt = LocalDateTime.now();
+        String date = DateTimeFormatter.ofPattern(pp.getProposalPostfixDateFormat(), Locale.ENGLISH).format(ldt);
+
+        File source = new File(pp.getProposalTemplateDocx());
+        File destination = new File(path + fileSeparator + pp.getKimenoAjanlatok() + fileSeparator + pp.getProposalNamePrefix() + projectID.trim() + "_" + projectName.trim() + "_" + date + ".docx");
+
+        try {
+            log.info("Changing custom variables.");
+            XWPFDocument doc = new XWPFDocument(Files.newInputStream(source.toPath()));
+            doc = replaceTextFor(doc, "Project_ID", projectID);
+            doc = replaceTextFor(doc, "Customer_TO", partnerContact);
+            doc = replaceTextFor(doc, "Client", partnerName);
+            doc = replaceTextFor(doc, "Project_Name", projectName);
+
+            String enValidityDate = DateTimeFormatter.ofPattern("dd MMM yyyy", Locale.ENGLISH).format(ldt.plusMonths(1));
+            doc = replaceTextFor(doc, "Valid_To", enValidityDate);
+            doc.enforceUpdateFields();
+            saveWord(destination.getAbsolutePath(), doc);
+
+        } catch (Exception e) {
+            throw new ProcessEngineException(e.getMessage());
+        }
+
+    }
+
+}
diff --git a/lis-workflow/src/main/java/hu/user/lis/workflow/project/CreateHungarianProposal.java b/lis-workflow/src/main/java/hu/user/lis/workflow/project/CreateHungarianProposal.java
new file mode 100644 (file)
index 0000000..fcfcf74
--- /dev/null
@@ -0,0 +1,91 @@
+package hu.user.lis.workflow.project;
+
+import hu.user.lis.db.Project;
+import hu.user.lis.workflow.properties.WorkflowProperties;
+import lombok.extern.log4j.Log4j2;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.camunda.bpm.engine.ProcessEngineException;
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.springframework.stereotype.Component;
+
+import javax.persistence.EntityNotFoundException;
+import java.io.File;
+import java.nio.file.Files;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Locale;
+
+@Log4j2
+@Component
+public class CreateHungarianProposal extends CreateProjectStructure {
+
+
+    @Override
+    public void execute(DelegateExecution delegateExecution) throws Exception {
+        Long projectId = (Long) delegateExecution.getVariable("projectId");
+        Project project = projectRepository.findById(projectId).orElseThrow(EntityNotFoundException::new);
+        log.info("Creating Hungarian Proposal for project ID {}", projectId);
+        log.info("Creating Hungarian Proposal for project Name {}", project.getName());
+//        delegateExecution.setVariableLocal("invoices", invoices);
+        createProposalHUN(project.getPartner().getName(), project.getPartner().getName(), project.getHumanId(), project.getName(), project.getContactName());
+
+    }
+
+    public void createProposalHUN(String partnerShortName, String partnerName, String projectID, String projectName, String partnerContact) throws ProcessEngineException {
+        WorkflowProperties.PrepareProject pp = workflowProperties.getPrepareProject();
+
+        log.info("Creating HUN proposal for " + partnerShortName + ", " + projectID + ", " + projectName);
+
+        if (partnerShortName == null || partnerShortName.isEmpty() || partnerShortName.trim().isEmpty()) {
+            log.error("Proposal creation failed, Partner Short Name is Null or Empty!");
+            throw new ProcessEngineException("Partner Short Name is Null or Empty!");
+        }
+        if (partnerName == null || partnerName.isEmpty() || partnerName.trim().isEmpty()) {
+            log.error("Proposal creation failed, Partner Name is Null or Empty!");
+            throw new ProcessEngineException("Partner Short Name is Null or Empty!");
+        }
+
+        if (projectID == null || projectID.isEmpty() || projectID.trim().isEmpty()) {
+            log.error("Proposal creation failed, Project ID is Null or Empty!");
+            throw new ProcessEngineException("Project ID is Null or Empty!");
+        }
+
+        if (projectName == null || projectName.isEmpty() || projectName.trim().isEmpty()) {
+            log.error("Proposal creation failed, Project Name is Null or Empty!");
+            throw new ProcessEngineException("Project Name is Null or Empty!");
+        }
+
+        if (partnerContact == null || partnerContact.isEmpty() || partnerContact.trim().isEmpty()) {
+            partnerContact = "Ajánlatkérő";
+        }
+
+        String path = pp.getSmbMountPointForSalesDirector() + fileSeparator + partnerShortName.trim() + fileSeparator + projectID.trim() + pp.getProjectNameSeparator() + projectName.trim();
+        log.info("Moving template file into its folder: " + partnerShortName + ", " + projectID + ", " + projectName);
+        log.info("Project folder path: " + path + ".");
+
+        LocalDateTime ldt = LocalDateTime.now();
+        String date = DateTimeFormatter.ofPattern(pp.getProposalPostfixDateFormat(), Locale.ENGLISH).format(ldt);
+
+        File source = new File(pp.getAjanlatTemplateDocx());
+        File destination = new File(path + fileSeparator + pp.getKimenoAjanlatok() + fileSeparator + pp.getAjanlatNamePrefix() + projectID.trim() + "_" + projectName.trim() + "_" + date + ".docx");
+
+        try {
+            log.info("Changing custom variables.");
+            XWPFDocument doc = new XWPFDocument(Files.newInputStream(source.toPath()));
+            doc = replaceTextFor(doc, "Project_ID", projectID);
+            doc = replaceTextFor(doc, "Customer_TO", partnerContact);
+            doc = replaceTextFor(doc, "Client", partnerName);
+            doc = replaceTextFor(doc, "Project_Name", projectName);
+            String hunValidityDate = DateTimeFormatter.ofPattern(pp.getValidityDateFormat(), new Locale("hu", "HU")).format(ldt.plusMonths(1));
+
+            doc = replaceTextFor(doc, "Valid_To", hunValidityDate);
+            doc.enforceUpdateFields();
+            saveWord(destination.getAbsolutePath(), doc);
+
+        } catch (Exception e) {
+            throw new ProcessEngineException(e.getMessage());
+        }
+
+    }
+
+}
index 0659b1ba66578e42ab49d055090ead8fe8881204..3a79638830f5444410fb0eed0c40efe003d024fe 100644 (file)
@@ -1,12 +1,9 @@
 package hu.user.lis.workflow.project;
 
-import hu.user.lis.db.Project;
-import hu.user.lis.db.repository.ProjectRepository;
 import hu.user.lis.workflow.properties.WorkflowProperties;
 import lombok.extern.log4j.Log4j2;
+import org.camunda.bpm.engine.ProcessEngineException;
 import org.camunda.bpm.engine.delegate.DelegateExecution;
-import org.camunda.bpm.engine.delegate.JavaDelegate;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import javax.persistence.EntityNotFoundException;
@@ -14,48 +11,40 @@ import java.io.File;
 
 @Log4j2
 @Component
-public class CreateProjectFolders implements JavaDelegate {
-    private final static String fileSeparator = File.separator; // or FileSystems.getDefault().getSeparator(); File.separatorChar;
-
-    @Autowired
-    private ProjectRepository projectRepository;
-
-    @Autowired
-    private WorkflowProperties workflowProperties;
+public class CreateProjectFolders extends CreateProjectStructure {
 
     @Override
     public void execute(DelegateExecution delegateExecution) throws Exception {
         Long projectId = (Long) delegateExecution.getVariable("projectId");
-        Project project = projectRepository.findById(projectId).orElseThrow(EntityNotFoundException::new);
+        project = projectRepository.findById(projectId).orElseThrow(EntityNotFoundException::new);
         log.info("Executing on project ID {}", projectId);
         log.info("Executing on project Name {}", project.getName());
         createFolder(project.getPartner().getName(), project.getHumanId(), project.getName());
 //        delegateExecution.setVariableLocal("invoices", invoices);
-        
+
+
     }
 
-    private void createFolder(String partnerShortName, String projectID, String projectName) throws SlyException {
+    private void createFolder(String partnerShortName, String projectID, String projectName) throws ProcessEngineException {
         WorkflowProperties.PrepareProject pp = workflowProperties.getPrepareProject();
 
-        log.info("Creating project folder for " + partnerShortName + ", and " + projectID + pp.getProjectNameSeparator()
-                + projectName + ". File system separator: " + fileSeparator);
+        log.info("Creating project folder for " + partnerShortName + ", and " + projectID + pp.getProjectNameSeparator() + projectName + ". File system separator: " + fileSeparator);
         if (partnerShortName == null || partnerShortName.isEmpty() || partnerShortName.trim().isEmpty()) {
             log.error("Project folder creation failed, Partner Short Name is Null or Empty!");
-            throw new SlyException("Partner Short Name is Null or Empty!");
+            throw new ProcessEngineException("Partner Short Name is Null or Empty!");
         }
 
         if (projectID == null || projectID.isEmpty() || projectID.trim().isEmpty()) {
             log.error("Project folder creation failed, Project ID is Null or Empty!");
-            throw new SlyException("Project ID is Null or Empty!");
+            throw new ProcessEngineException("Project ID is Null or Empty!");
         }
 
         if (projectName == null || projectName.isEmpty() || projectName.trim().isEmpty()) {
             log.error("Project folder creation failed, Project Name is Null or Empty!");
-            throw new SlyException("Project Name is Null or Empty!");
+            throw new ProcessEngineException("Project Name is Null or Empty!");
         }
 
-        String path = pp.getSmbMountPointForSalesDirector() + fileSeparator + partnerShortName.trim() + fileSeparator
-                + projectID.trim() + pp.getProjectNameSeparator() + projectName.trim();
+        String path = pp.getSmbMountPointForSalesDirector() + fileSeparator + partnerShortName.trim() + fileSeparator + projectID.trim() + pp.getProjectNameSeparator() + projectName.trim();
         log.info("Project folder path: " + path + ".");
         File baseDir = new File(path);
         File ajanlatkeresDir = new File(path + fileSeparator + pp.getAjanlatkeres());
@@ -66,7 +55,7 @@ public class CreateProjectFolders implements JavaDelegate {
         File teljesitesDir = new File(path + fileSeparator + pp.getTeljesites());
         if (baseDir.exists()) {
             log.error("Project folder (" + path + ") already exists!");
-            throw new SlyException("Project folder (" + path + ") already exists!");
+            throw new ProcessEngineException("Project folder (" + path + ") already exists!");
         }
 
         try {
@@ -77,9 +66,8 @@ public class CreateProjectFolders implements JavaDelegate {
             kimenoDir.mkdirs();
             megrendelesDir.mkdirs();
             teljesitesDir.mkdirs();
-
         } catch (Exception e) {
-            throw new SlyException(e.getMessage());
+            throw new ProcessEngineException(e.getMessage());
         } finally {
             log.info("Project folder has been created: " + path + ".");
 
diff --git a/lis-workflow/src/main/java/hu/user/lis/workflow/project/CreateProjectStructure.java b/lis-workflow/src/main/java/hu/user/lis/workflow/project/CreateProjectStructure.java
new file mode 100644 (file)
index 0000000..38900f3
--- /dev/null
@@ -0,0 +1,102 @@
+package hu.user.lis.workflow.project;
+
+import hu.user.lis.db.Project;
+import hu.user.lis.db.repository.ProjectRepository;
+import hu.user.lis.workflow.properties.WorkflowProperties;
+import lombok.extern.log4j.Log4j2;
+import org.apache.poi.ooxml.POIXMLProperties;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.camunda.bpm.engine.delegate.JavaDelegate;
+import org.openxmlformats.schemas.officeDocument.x2006.customProperties.CTProperty;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.persistence.EntityNotFoundException;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.channels.FileChannel;
+import java.util.List;
+
+@Log4j2
+@Component
+public class CreateProjectStructure implements JavaDelegate {
+    protected final static String fileSeparator = File.separator; // or FileSystems.getDefault().getSeparator(); File.separatorChar;
+
+    @Autowired
+    protected ProjectRepository projectRepository;
+
+    @Autowired
+    protected WorkflowProperties workflowProperties;
+
+    protected Project project;
+
+    protected static XWPFDocument replaceTextFor(XWPFDocument doc, String findText, String replaceText) {
+        log.info("Replacing custom variable: " + findText + " => " + replaceText);
+
+        POIXMLProperties props = doc.getProperties();
+        POIXMLProperties.CustomProperties cp = props.getCustomProperties();
+        if (cp != null) {
+            List<CTProperty> ctProperties = cp.getUnderlyingProperties().getPropertyList();
+            for (CTProperty ctp : ctProperties) {
+                if (ctp.getName().equals(findText)) {
+                    ctp.setLpwstr(replaceText);
+                }
+            }
+        }
+        return doc;
+    }
+
+    protected static void saveWord(String filePath, XWPFDocument doc) throws IOException {
+        log.info("Saving file into: " + filePath);
+        FileOutputStream out = null;
+        try {
+            out = new FileOutputStream(filePath);
+            doc.write(out);
+        } catch (Exception e) {
+            log.error(e.getMessage());
+        } finally {
+            assert out != null;
+            out.close();
+        }
+    }
+
+    protected static void copyFile(File sourceFile, File destFile) throws IOException {
+        log.info("Copy file: " + sourceFile.getAbsolutePath() + " => " + destFile.getAbsolutePath());
+
+        if (!destFile.exists()) {
+            destFile.createNewFile();
+        }
+
+        FileChannel source = null;
+        FileChannel destination = null;
+        try {
+            source = new RandomAccessFile(sourceFile, "rw").getChannel();
+            destination = new RandomAccessFile(destFile, "rw").getChannel();
+
+            long position = 0;
+            long count = source.size();
+
+            source.transferTo(position, count, destination);
+        } finally {
+            if (source != null) {
+                source.close();
+            }
+            if (destination != null) {
+                destination.close();
+            }
+        }
+    }
+
+    @Override
+    public void execute(DelegateExecution delegateExecution) throws Exception {
+        Long projectId = (Long) delegateExecution.getVariable("projectId");
+        project = projectRepository.findById(projectId).orElseThrow(EntityNotFoundException::new);
+        log.info("Creating Project Structure on project ID {}", projectId);
+        log.info("Creating Project Structure on project Name {}", project.getName());
+//        delegateExecution.setVariableLocal("invoices", invoices);
+
+    }
+}
diff --git a/lis-workflow/src/main/java/hu/user/lis/workflow/project/CreateTIG.java b/lis-workflow/src/main/java/hu/user/lis/workflow/project/CreateTIG.java
new file mode 100644 (file)
index 0000000..57cab99
--- /dev/null
@@ -0,0 +1,84 @@
+package hu.user.lis.workflow.project;
+
+import hu.user.lis.workflow.properties.WorkflowProperties;
+import lombok.extern.log4j.Log4j2;
+import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.camunda.bpm.engine.ProcessEngineException;
+import org.camunda.bpm.engine.delegate.DelegateExecution;
+import org.springframework.stereotype.Component;
+
+import javax.persistence.EntityNotFoundException;
+import java.io.File;
+import java.nio.file.Files;
+
+@Log4j2
+@Component
+public class CreateTIG extends CreateProjectStructure {
+
+    @Override
+    public void execute(DelegateExecution delegateExecution) throws Exception {
+        Long projectId = (Long) delegateExecution.getVariable("projectId");
+        project = projectRepository.findById(projectId).orElseThrow(EntityNotFoundException::new);
+        log.info("Creating TIG for project ID {}", projectId);
+        log.info("Creating TIG for project Name {}", project.getName());
+//        delegateExecution.setVariableLocal("invoices", invoices);
+        createTIG(project.getPartner().getName(), project.getPartner().getName(), project.getHumanId(), project.getName(), project.getContactName(), project.getPartner().getAddress());
+    }
+
+    public void createTIG(String partnerShortName, String partnerName, String projectID, String projectName, String partnerContact, String partnerAddress) throws ProcessEngineException {
+        WorkflowProperties.PrepareProject pp = workflowProperties.getPrepareProject();
+
+        log.info("Creating TIG for " + partnerShortName + ", " + projectID + ", " + projectName);
+
+        if (partnerShortName == null || partnerShortName.isEmpty() || partnerShortName.trim().isEmpty()) {
+            log.error("TIG creation failed, Partner Short Name is Null or Empty!");
+            throw new ProcessEngineException("Partner Short Name is Null or Empty!");
+        }
+        if (partnerName == null || partnerName.isEmpty() || partnerName.trim().isEmpty()) {
+            log.error("TIG creation failed, Partner Name is Null or Empty!");
+            throw new ProcessEngineException("Partner Short Name is Null or Empty!");
+        }
+
+        if (projectID == null || projectID.isEmpty() || projectID.trim().isEmpty()) {
+            log.error("TIG creation failed, Project ID is Null or Empty!");
+            throw new ProcessEngineException("Project ID is Null or Empty!");
+        }
+
+        if (projectName == null || projectName.isEmpty() || projectName.trim().isEmpty()) {
+            log.error("TIG creation failed, Project Name is Null or Empty!");
+            throw new ProcessEngineException("Project Name is Null or Empty!");
+        }
+
+        if (partnerContact == null || partnerContact.isEmpty() || partnerContact.trim().isEmpty()) {
+            partnerContact = "Ajánlatkérő";
+        }
+
+        if (partnerAddress == null || partnerAddress.isEmpty() || partnerAddress.trim().isEmpty()) {
+            log.error("TIG creation failed, Partner Address is Null or Empty!");
+            throw new ProcessEngineException("Partner Address is Null or Empty!");
+        }
+
+        String path = pp.getSmbMountPointForSalesDirector() + fileSeparator + partnerShortName.trim() + fileSeparator + projectID.trim() + pp.getProjectNameSeparator() + projectName.trim();
+
+        File source = new File(pp.getTigTemplateDocx());
+        File destination = new File(path + fileSeparator + pp.getTeljesites() + fileSeparator + pp.getTigNamePrefix() + projectID.trim() + "_" + projectName.trim() + ".docx");
+
+        try {
+            log.info("Changing custom variables.");
+            XWPFDocument doc = new XWPFDocument(Files.newInputStream(source.toPath()));
+            doc = replaceTextFor(doc, "Project_ID", projectID);
+            doc = replaceTextFor(doc, "Customer_TO", partnerContact);
+            doc = replaceTextFor(doc, "Client", partnerName);
+            doc = replaceTextFor(doc, "Project_Name", projectName);
+            doc = replaceTextFor(doc, "Customer_FullName", partnerName);
+            doc = replaceTextFor(doc, "Customer_Address", partnerAddress);
+            doc.enforceUpdateFields();
+            saveWord(destination.getAbsolutePath(), doc);
+
+        } catch (Exception e) {
+            throw new ProcessEngineException(e.getMessage());
+        }
+
+    }
+
+}
diff --git a/lis-workflow/src/main/java/hu/user/lis/workflow/project/SlyException.java b/lis-workflow/src/main/java/hu/user/lis/workflow/project/SlyException.java
deleted file mode 100644 (file)
index 4b3c5bb..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-package hu.user.lis.workflow.project;
-
-public class SlyException extends Exception {
-
-       private String exception;
-
-       public SlyException(String exception) {
-               this.exception = exception;
-       }
-
-       @Override
-       public String getMessage() {
-               return exception;
-       }
-}
index b4ca0a4fbbe10f562156958fd12b1ee2d1d5a493..a230360ade0b5d49cc9dae23531f1439a377aebe 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_08cp8iu" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.14.0" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.19.0">
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_08cp8iu" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.17.0" modeler:executionPlatform="Camunda Platform" modeler:executionPlatformVersion="7.19.0">
   <bpmn:process id="prepareProject" name="Prepare Project" isExecutable="true" camunda:historyTimeToLive="180">
     <bpmn:startEvent id="StartEvent_1">
       <bpmn:outgoing>Flow_1w8ohiv</bpmn:outgoing>
       <bpmn:outgoing>Flow_0fihphr</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:endEvent id="Event_0h9gy35">
-      <bpmn:incoming>Flow_0fihphr</bpmn:incoming>
+      <bpmn:incoming>Flow_0ikbv65</bpmn:incoming>
     </bpmn:endEvent>
-    <bpmn:sequenceFlow id="Flow_0fihphr" sourceRef="createProjectFolders" targetRef="Event_0h9gy35" />
+    <bpmn:sequenceFlow id="Flow_0fihphr" sourceRef="createProjectFolders" targetRef="createHungarianProposal" />
+    <bpmn:sequenceFlow id="Flow_05gmf6m" sourceRef="createHungarianProposal" targetRef="createEnglishProposal" />
+    <bpmn:sequenceFlow id="Flow_1m4bb4c" sourceRef="createEnglishProposal" targetRef="copyCalculationXlsx" />
+    <bpmn:sequenceFlow id="Flow_0wdepir" sourceRef="copyCalculationXlsx" targetRef="createTIG" />
+    <bpmn:sequenceFlow id="Flow_0ikbv65" sourceRef="createTIG" targetRef="Event_0h9gy35" />
+    <bpmn:serviceTask id="createHungarianProposal" name="Create Hungarian Proposal" camunda:delegateExpression="${createHungarianProposal}">
+      <bpmn:incoming>Flow_0fihphr</bpmn:incoming>
+      <bpmn:outgoing>Flow_05gmf6m</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:serviceTask id="createTIG" name="Create TIG" camunda:delegateExpression="${createTIG}">
+      <bpmn:incoming>Flow_0wdepir</bpmn:incoming>
+      <bpmn:outgoing>Flow_0ikbv65</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:serviceTask id="copyCalculationXlsx" name="Copy Calculation Xlsx" camunda:delegateExpression="${copyCalculationXlsx}">
+      <bpmn:incoming>Flow_1m4bb4c</bpmn:incoming>
+      <bpmn:outgoing>Flow_0wdepir</bpmn:outgoing>
+    </bpmn:serviceTask>
+    <bpmn:serviceTask id="createEnglishProposal" name="Create English Proposal" camunda:delegateExpression="${createEnglishProposal}">
+      <bpmn:incoming>Flow_05gmf6m</bpmn:incoming>
+      <bpmn:outgoing>Flow_1m4bb4c</bpmn:outgoing>
+    </bpmn:serviceTask>
   </bpmn:process>
   <bpmndi:BPMNDiagram id="BPMNDiagram_1">
     <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="prepareProject">
-      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
-        <dc:Bounds x="179" y="79" width="36" height="36" />
-      </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="Activity_06cl6md_di" bpmnElement="createProjectFolders">
-        <dc:Bounds x="270" y="57" width="100" height="80" />
+        <dc:Bounds x="270" y="80" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
+        <dc:Bounds x="179" y="102" width="36" height="36" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="Event_0h9gy35_di" bpmnElement="Event_0h9gy35">
-        <dc:Bounds x="432" y="79" width="36" height="36" />
+        <dc:Bounds x="1022" y="102" width="36" height="36" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="Activity_0s0ndzj_di" bpmnElement="createTIG">
+        <dc:Bounds x="840" y="80" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="Activity_1xmp0ex_di" bpmnElement="copyCalculationXlsx">
+        <dc:Bounds x="700" y="80" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="Activity_1yx7pu7_di" bpmnElement="createEnglishProposal">
+        <dc:Bounds x="550" y="80" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="Activity_1iyzghf_di" bpmnElement="createHungarianProposal">
+        <dc:Bounds x="410" y="80" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="Flow_1w8ohiv_di" bpmnElement="Flow_1w8ohiv">
-        <di:waypoint x="215" y="97" />
-        <di:waypoint x="270" y="97" />
+        <di:waypoint x="215" y="120" />
+        <di:waypoint x="270" y="120" />
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="Flow_0fihphr_di" bpmnElement="Flow_0fihphr">
-        <di:waypoint x="370" y="97" />
-        <di:waypoint x="432" y="97" />
+        <di:waypoint x="370" y="120" />
+        <di:waypoint x="410" y="120" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_0ikbv65_di" bpmnElement="Flow_0ikbv65">
+        <di:waypoint x="940" y="120" />
+        <di:waypoint x="1022" y="120" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_05gmf6m_di" bpmnElement="Flow_05gmf6m">
+        <di:waypoint x="510" y="120" />
+        <di:waypoint x="550" y="120" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_0wdepir_di" bpmnElement="Flow_0wdepir">
+        <di:waypoint x="800" y="120" />
+        <di:waypoint x="840" y="120" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_1m4bb4c_di" bpmnElement="Flow_1m4bb4c">
+        <di:waypoint x="650" y="120" />
+        <di:waypoint x="700" y="120" />
       </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>