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;
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
@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());
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
<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>
--- /dev/null
+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());
+
+ }
+ }
+
+}
--- /dev/null
+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());
+ }
+
+ }
+
+}
--- /dev/null
+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());
+ }
+
+ }
+
+}
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;
@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());
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 {
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 + ".");
--- /dev/null
+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);
+
+ }
+}
--- /dev/null
+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());
+ }
+
+ }
+
+}
+++ /dev/null
-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;
- }
-}
<?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>