From: marcellszabo-spedinfo Date: Tue, 5 Dec 2023 19:55:25 +0000 (+0100) Subject: Project Initialisation - all steps X-Git-Url: http://git.useribm.hu/?a=commitdiff_plain;h=c9a7b0438ab7e8f348138235df77e53c06888593;p=sly-crm.git Project Initialisation - all steps --- diff --git a/lis-app/src/test/java/hu/user/lis/workflow/PrepareProjectIT.java b/lis-app/src/test/java/hu/user/lis/workflow/PrepareProjectIT.java index 4699ebc..9fdc08e 100644 --- a/lis-app/src/test/java/hu/user/lis/workflow/PrepareProjectIT.java +++ b/lis-app/src/test/java/hu/user/lis/workflow/PrepareProjectIT.java @@ -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 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 diff --git a/lis-workflow/pom.xml b/lis-workflow/pom.xml index ce39ae1..ed04436 100644 --- a/lis-workflow/pom.xml +++ b/lis-workflow/pom.xml @@ -54,5 +54,23 @@ org.springframework spring-context + + + org.apache.poi + poi + 5.2.5 + + + + org.apache.poi + poi-ooxml + 5.2.5 + + + + commons-io + commons-io + 2.15.1 + 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 index 0000000..8423eba --- /dev/null +++ b/lis-workflow/src/main/java/hu/user/lis/workflow/project/CopyCalculationXlsx.java @@ -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 index 0000000..2e6c805 --- /dev/null +++ b/lis-workflow/src/main/java/hu/user/lis/workflow/project/CreateEnglishProposal.java @@ -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 index 0000000..fcfcf74 --- /dev/null +++ b/lis-workflow/src/main/java/hu/user/lis/workflow/project/CreateHungarianProposal.java @@ -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()); + } + + } + +} diff --git a/lis-workflow/src/main/java/hu/user/lis/workflow/project/CreateProjectFolders.java b/lis-workflow/src/main/java/hu/user/lis/workflow/project/CreateProjectFolders.java index 0659b1b..3a79638 100644 --- a/lis-workflow/src/main/java/hu/user/lis/workflow/project/CreateProjectFolders.java +++ b/lis-workflow/src/main/java/hu/user/lis/workflow/project/CreateProjectFolders.java @@ -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 index 0000000..38900f3 --- /dev/null +++ b/lis-workflow/src/main/java/hu/user/lis/workflow/project/CreateProjectStructure.java @@ -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 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 index 0000000..57cab99 --- /dev/null +++ b/lis-workflow/src/main/java/hu/user/lis/workflow/project/CreateTIG.java @@ -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 index 4b3c5bb..0000000 --- a/lis-workflow/src/main/java/hu/user/lis/workflow/project/SlyException.java +++ /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; - } -} diff --git a/lis-workflow/src/main/resources/prepare-project.bpmn b/lis-workflow/src/main/resources/prepare-project.bpmn index b4ca0a4..a230360 100644 --- a/lis-workflow/src/main/resources/prepare-project.bpmn +++ b/lis-workflow/src/main/resources/prepare-project.bpmn @@ -1,5 +1,5 @@ - + Flow_1w8ohiv @@ -10,28 +10,76 @@ Flow_0fihphr - Flow_0fihphr + Flow_0ikbv65 - + + + + + + + Flow_0fihphr + Flow_05gmf6m + + + Flow_0wdepir + Flow_0ikbv65 + + + Flow_1m4bb4c + Flow_0wdepir + + + Flow_05gmf6m + Flow_1m4bb4c + - - - - + + + + - + + + + + + + + + + + + + - - + + - - + + + + + + + + + + + + + + + + + +