diff --git a/.vscode/settings.json b/.vscode/settings.json index c5f3f6b9c754225a4c577122bc2f9c0b49713e3c..0153b3183adf22bb54b94634a9aa9291c5bc3f66 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,4 @@ { - "java.configuration.updateBuildConfiguration": "interactive" + "java.configuration.updateBuildConfiguration": "interactive", + "java.compile.nullAnalysis.mode": "disabled" } \ No newline at end of file diff --git a/DISPticketing/front/extraInformation.html b/DISPticketing/front/extraInformation.html index c74e9b1f8031728cc81429b2e97b8785bf1a309a..d5441d4ad45caa70c9d637f1b414633431e91b25 100644 --- a/DISPticketing/front/extraInformation.html +++ b/DISPticketing/front/extraInformation.html @@ -12,9 +12,16 @@ </style> </head> -<body> - <div id="form"></div> - +<body style="background-color: lightblue;"> + <div + style="display: flex; flex-direction: column; justify-content: center; align-items: center; margin: 0; background-color: lightblue;"> + <h1>Extra Information Form</h1> + <div + style="padding: 20px; border: 2px solid black; border-radius: 10px; background-color: white; max-width: 800px; height: 450px;"> + <div id="form"> + </div> + </div> + </div> <!-- add your form schema to this script tag alternatively, load it asynchronously from anywhere @@ -52,7 +59,7 @@ "id": "Textarea_4", "label": "Detailed Description of the Issue", "validate": { - "minLength": 10, + "minLength": 2, "maxLength": 500, "required": true }, @@ -94,47 +101,45 @@ }) form.importSchema(schema) - - - - - - form.on('submit', (event) => { - event.preventDefault(); // Prevent the default form submission - - let formData = event.data; // Accessing the data object from the event - formData.emailType = "ExtraEmailReplied"; - console.log(formData); - formData = JSON.stringify(formData); - - fetch('http://localhost:8080/submission', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: formData - }) - .then(response => { - if (!response.ok) { - throw new Error('Network response was not ok'); - } - return response.json(); + const errors = form.validate(); + if (Object.keys(errors).length) { + console.error("Form has errors", errors); + } else { + event.preventDefault(); // Prevent the default form submission + + let formData = event.data; // Accessing the data object from the event + formData.emailType = "ExtraEmailReplied"; + console.log(formData); + formData = JSON.stringify(formData); + + fetch('http://localhost:8080/submission', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: formData }) - .then(data => { - if (data) { - console.log('Form submitted successfully', data); - } else { - console.log('Form submitted successfully'); - } - }) - .catch(error => { - console.error('There was a problem submitting the form', error); - }); + .then(response => { + if (!response.ok) { + throw new Error('Network response was not ok'); + } + return response.json(); + }) + .then(data => { + if (data) { + console.log('Form submitted successfully', data); + } else { + console.log('Form submitted successfully'); + } + }) + .catch(error => { + console.error('There was a problem submitting the form', error); + }); + form.reset(); + } }); - - </script> </body> diff --git a/DISPticketing/front/index.html b/DISPticketing/front/index.html deleted file mode 100644 index 0adc85c4c8ddc8fc6748ae81f7fca1ead36ef8b6..0000000000000000000000000000000000000000 --- a/DISPticketing/front/index.html +++ /dev/null @@ -1,276 +0,0 @@ -<html> - -<head> - <!-- - required viewer styles - --> - <link rel="stylesheet" href="https://unpkg.com/@bpmn-io/form-js@1.7.3/dist/assets/form-js.css"> - <style> - #form { - max-width: 800px; - } - </style> -</head> - -<body> - <div id="form"></div> - - <!-- - add your form schema to this script tag - alternatively, load it asynchronously from anywhere - --> - <script type="application/form-schema"> - { - "executionPlatform": "Camunda Cloud", - "executionPlatformVersion": "8.5.0", - "exporter": { - "name": "Camunda Web Modeler", - "version": "8c03b57" - }, - "schemaVersion": 16, - "id": "complete-issue-form-0x1n9i1", - "components": [ - { - "text": "### Report an Issue", - "type": "text", - "id": "Heading_0", - "layout": { - "columns": 16, - "row": "Row_0c7idvx" - } - }, - { - "text": "##### Your Details ", - "type": "text", - "id": "Subheading_1", - "layout": { - "row": "row_0", - "columns": null - } - }, - { - "type": "textfield", - "id": "Textfield_2", - "label": "User Name", - "validate": { - "minLength": 2, - "required": true - }, - "key": "fieldName", - "layout": { - "row": "row_1", - "columns": null - } - }, - { - "type": "textfield", - "id": "Textfield_3", - "label": "Contact Number", - "validate": { - "minLength": 8, - "maxLength": 15, - "required": true - }, - "key": "fieldContactNumber", - "layout": { - "row": "row_1", - "columns": null - } - }, - { - "values": [ - { - "value": "IT", - "label": "IT" - }, - { - "value": "HR", - "label": "HR" - }, - { - "value": "Finance", - "label": "Finance" - }, - { - "value": "Operations", - "label": "Operations" - } - ], - "type": "select", - "id": "Select_4", - "label": "Department", - "validate": { - "required": true - }, - "key": "fieldDepartment", - "layout": { - "row": "row_2", - "columns": 16 - } - }, - { - "text": "##### What is the Issue?", - "type": "text", - "id": "Subheading_5", - "layout": { - "row": "row_3", - "columns": null - } - }, - { - "type": "textfield", - "id": "Textfield_6", - "label": "Issue Title", - "validate": { - "minLength": 5, - "maxLength": 50, - "required": true - }, - "key": "fieldTitle", - "layout": { - "row": "row_4", - "columns": null - } - }, - { - "type": "textarea", - "id": "Textarea_7", - "label": "Issue Description", - "validate": { - "minLength": 10, - "maxLength": 300, - "required": true - }, - "key": "fieldDescription", - "layout": { - "row": "Row_0vwv1n8", - "columns": null - } - }, - { - "values": [ - { - "label": "Non-Urgent, Low Priority", - "value": "Non-Urgent, Low Priority" - }, - { - "label": "Medium Urgency, Low Priority", - "value": "Medium Urgency, Low Priority" - }, - { - "label": "High Urgency, Low Priority", - "value": "High Urgency, Low Priority" - }, - { - "label": "Non-Urgent, Medium Priority", - "value": "Non-Urgent, Medium Priority" - }, - { - "label": "Non-Urgent, High Priority", - "value": "Non-Urgent, High Priority" - }, - { - "label": "Medium Urgency, Medium Priority", - "value": "Medium Urgency, Medium Priority" - }, - { - "label": "Medium Urgency, High Priority", - "value": "Medium Urgency, High Priority" - }, - { - "label": "High Urgency, Medium Priority", - "value": "High Urgency, Medium Priority" - }, - { - "label": "High Urgency, High Priority", - "value": "High Urgency, High Priority" - } - ], - "label": "Severity of Issue", - "type": "select", - "layout": { - "row": "Row_0bzl8je", - "columns": null - }, - "id": "Field_0rbo5w8", - "key": "fieldSLA", - "validate": { - "required": true - } - }, - { - "values": [ - { - "label": "IT", - "value": "IT" - }, - { - "label": "Development", - "value": "Development" - } - ], - "label": "Issue Department", - "type": "select", - "layout": { - "row": "Row_0bzl8je", - "columns": null - }, - "id": "Field_16wtr7u", - "key": "assignedDepartment", - "validate": { - "required": true - } - }, - { - "action": "submit", - "label": "Submit", - "type": "button", - "layout": { - "row": "Row_0fs2y8h", - "columns": null - }, - "id": "Field_1dolsqn" - } - ], - "generated": true, - "type": "default" - } - </script> - - - <!-- - required viewer script - --> - <script src="https://unpkg.com/@bpmn-io/form-js@1.7.3/dist/form-viewer.umd.js"></script> - <script> - const schema = JSON.parse( - document.querySelector('[type="application/form-schema"]').textContent - ); - const container = document.querySelector('#form'); - - const form = new FormViewer.Form({ - container - }) - form.importSchema(schema) - - - - - - - - // add event listeners - form.on('submit', (event) => { - const errors = form.validate(); - if (Object.keys(errors).length) { - - console.error("Form has errors", errors); - }else - console.log('Form <submit>', event); - }); - - - </script> -</body> - -</html> \ No newline at end of file diff --git a/DISPticketing/front/issueFormPortal.html b/DISPticketing/front/issueFormPortal.html new file mode 100644 index 0000000000000000000000000000000000000000..fad8b152ae0137ed58503784879b5269373dab60 --- /dev/null +++ b/DISPticketing/front/issueFormPortal.html @@ -0,0 +1,317 @@ +<html> + +<head> + <!-- + required viewer styles + --> + <link rel="stylesheet" href="https://unpkg.com/@bpmn-io/form-js@1.7.3/dist/assets/form-js.css"> + <style> + #form { + max-width: 800px; + } + </style> +</head> + +<body style="background-color: lightblue;"> + <div + style="display: flex; flex-direction: column; justify-content: center; align-items: center; margin: 0; background-color: lightblue;"> + <h1>Employee Web Portal</h1> + <div + style="padding: 20px; border: 2px solid black; border-radius: 10px; background-color: white; max-width: 800px; height: 810px;"> + <div id="form"> + </div> + </div> + </div> + <!-- + add your form schema to this script tag + alternatively, load it asynchronously from anywhere + --> + <script type="application/form-schema"> + { + "executionPlatform": "Camunda Cloud", + "executionPlatformVersion": "8.5.0", + "exporter": { + "name": "Camunda Web Modeler", + "version": "8c4dae7" + }, + "schemaVersion": 16, + "id": "complete-issue-form-0x1n9i1", + "components": [ + { + "text": "### Raise an Issue", + "type": "text", + "id": "Heading_0", + "layout": { + "columns": 16, + "row": "Row_0c7idvx" + } + }, + { + "text": "##### Your Employee Details ", + "type": "text", + "id": "Subheading_1", + "layout": { + "row": "row_0", + "columns": null + } + }, + { + "type": "textfield", + "id": "Textfield_2", + "label": "Username", + "validate": { + "minLength": 2, + "required": true, + "maxLength": 20 + }, + "key": "fieldName", + "layout": { + "row": "row_1", + "columns": 7 + } + }, + { + "label": "Employee Email Address", + "type": "textfield", + "layout": { + "row": "row_1", + "columns": 8 + }, + "id": "Field_1kct5bo", + "key": "fieldEmail", + "validate": { + "required": true, + "validationType": "email" + } + }, + { + "type": "textfield", + "id": "Textfield_3", + "label": "Contact Number", + "validate": { + "required": true, + "validationType": "phone" + }, + "key": "fieldContactNumber", + "layout": { + "row": "Row_0sh0red", + "columns": 7 + } + }, + { + "values": [ + { + "value": "IT", + "label": "IT" + }, + { + "value": "HR", + "label": "HR" + }, + { + "value": "Finance", + "label": "Finance" + }, + { + "value": "Operations", + "label": "Operations" + } + ], + "type": "select", + "id": "Select_4", + "label": "Department", + "validate": { + "required": true + }, + "key": "fieldDepartment", + "layout": { + "row": "Row_0sh0red", + "columns": 8 + } + }, + { + "text": "##### What is Your Issue?", + "type": "text", + "id": "Subheading_5", + "layout": { + "row": "row_3", + "columns": 15 + } + }, + { + "type": "textfield", + "id": "Textfield_6", + "label": "Issue Title", + "validate": { + "minLength": 2, + "maxLength": 50, + "required": true + }, + "key": "fieldTitle", + "layout": { + "row": "row_4", + "columns": 15 + } + }, + { + "type": "textarea", + "id": "Textarea_7", + "label": "Issue Description", + "validate": { + "maxLength": 300, + "required": true, + "minLength": 10 + }, + "key": "fieldDescription", + "layout": { + "row": "Row_0vwv1n8", + "columns": 15 + } + }, + { + "values": [ + { + "label": "Non-Urgent, Low Priority", + "value": "Non-Urgent, Low Priority" + }, + { + "label": "Medium Urgency, Low Priority", + "value": "Medium Urgency, Low Priority" + }, + { + "label": "High Urgency, Low Priority", + "value": "High Urgency, Low Priority" + }, + { + "label": "Non-Urgent, Medium Priority", + "value": "Non-Urgent, Medium Priority" + }, + { + "label": "Non-Urgent, High Priority", + "value": "Non-Urgent, High Priority" + }, + { + "label": "Medium Urgency, Medium Priority", + "value": "Medium Urgency, Medium Priority" + }, + { + "label": "Medium Urgency, High Priority", + "value": "Medium Urgency, High Priority" + }, + { + "label": "High Urgency, Medium Priority", + "value": "High Urgency, Medium Priority" + }, + { + "label": "High Urgency, High Priority", + "value": "High Urgency, High Priority" + } + ], + "label": "Severity of Issue", + "type": "select", + "layout": { + "row": "Row_0bzl8je", + "columns": 7 + }, + "id": "Field_0rbo5w8", + "key": "fieldSLA", + "validate": { + "required": true + } + }, + { + "values": [ + { + "label": "IT", + "value": "IT" + }, + { + "label": "Development", + "value": "Development" + } + ], + "label": "Type of Ticket?", + "type": "select", + "layout": { + "row": "Row_0bzl8je", + "columns": 8 + }, + "id": "Field_16wtr7u", + "key": "assignedDepartment", + "validate": { + "required": true + } + }, + { + "action": "submit", + "label": "Submit", + "type": "button", + "layout": { + "row": "Row_0fs2y8h", + "columns": null + }, + "id": "Field_1dolsqn" + } + ], + "generated": true, + "type": "default" + } + + </script> + + <!-- + required viewer script + --> + <script src="https://unpkg.com/@bpmn-io/form-js@1.7.3/dist/form-viewer.umd.js"></script> + <script> + const schema = JSON.parse( + document.querySelector('[type="application/form-schema"]').textContent + ); + const container = document.querySelector('#form'); + + const form = new FormViewer.Form({ + container + }) + form.importSchema(schema) + + form.on('submit', (event) => { + const errors = form.validate(); + if (Object.keys(errors).length) { + console.error("Form has errors", errors); + } else { + event.preventDefault(); // Prevent the default form submission + + let formData = event.data; // Accessing the data object from the event + console.log(formData); + formData = JSON.stringify(formData); + + fetch('http://localhost:8080/issueSubmission', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: formData + }) + .then(response => { + if (!response.ok) { + throw new Error('Network response was not ok'); + } + return response.json(); + }) + .then(data => { + if (data) { + console.log('Form submitted successfully', data); + } else { + console.log('Form submitted successfully'); + } + }) + .catch(error => { + console.error('There was a problem submitting the form', error); + }); + form.reset(); + } + }); + </script> +</body> + +</html> \ No newline at end of file diff --git a/DISPticketing/front/reviewInformation.html b/DISPticketing/front/reviewInformation.html index c615a95afd63aafa91a55e27ba98fc5bff36bd86..f91c39662e5e42e748090cfe3530a3f2975d3651 100644 --- a/DISPticketing/front/reviewInformation.html +++ b/DISPticketing/front/reviewInformation.html @@ -1,25 +1,32 @@ <html> <head> - <!-- + <!-- required viewer styles --> - <link rel="stylesheet" href="https://unpkg.com/@bpmn-io/form-js@1.7.3/dist/assets/form-js.css"> - <style> - #form { - max-width: 800px; - } - </style> + <link rel="stylesheet" href="https://unpkg.com/@bpmn-io/form-js@1.7.3/dist/assets/form-js.css"> + <style> + #form { + max-width: 800px; + } + </style> </head> -<body> - <div id="form"></div> - - <!-- +<body style="background-color: lightblue;"> + <div + style="display: flex; flex-direction: column; justify-content: center; align-items: center; margin: 0; background-color: lightblue;"> + <h1>Review Completion Form</h1> + <div + style="padding: 20px; border: 2px solid black; border-radius: 10px; background-color: white; max-width: 800px; height: 550px;"> + <div id="form"> + </div> + </div> + </div> + <!-- add your form schema to this script tag alternatively, load it asynchronously from anywhere --> - <script type="application/form-schema"> + <script type="application/form-schema"> { "executionPlatform": "Camunda Cloud", "executionPlatformVersion": "8.5.0", @@ -71,7 +78,7 @@ "row": "row_7", "columns": null }, - "defaultValue": "yes" + "defaultValue": "" }, { "type": "textarea", @@ -108,63 +115,60 @@ } </script> - <!-- + <!-- required viewer script --> - <script src="https://unpkg.com/@bpmn-io/form-js@1.7.3/dist/form-viewer.umd.js"></script> - <script> - const schema = JSON.parse( - document.querySelector('[type="application/form-schema"]').textContent - ); - const container = document.querySelector('#form'); - - const form = new FormViewer.Form({ - container - }) - form.importSchema(schema) - + <script src="https://unpkg.com/@bpmn-io/form-js@1.7.3/dist/form-viewer.umd.js"></script> + <script> + const schema = JSON.parse( + document.querySelector('[type="application/form-schema"]').textContent + ); + const container = document.querySelector('#form'); + const form = new FormViewer.Form({ + container + }) + form.importSchema(schema) + form.on('submit', (event) => { + const errors = form.validate(); + if (Object.keys(errors).length) { + console.error("Form has errors", errors); + } else { + event.preventDefault(); // Prevent the default form submission + let formData = event.data; // Accessing the data object from the event + formData.emailType = "ReviewEmailReplied" + console.log(formData); + formData = JSON.stringify(formData); - - - form.on('submit', (event) => { - event.preventDefault(); // Prevent the default form submission - - let formData = event.data; // Accessing the data object from the event - formData.emailType = "ReviewEmailReplied"; - console.log(formData); - formData = JSON.stringify(formData); - - fetch('http://localhost:8080/submission', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: formData + fetch('http://localhost:8080/submission', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: formData + }) + .then(response => { + if (!response.ok) { + throw new Error('Network response was not ok'); + } + return response.json(); }) - .then(response => { - if (!response.ok) { - throw new Error('Network response was not ok'); - } - return response.json(); - }) - .then(data => { - if (data) { - console.log('Form submitted successfully', data); - } else { - console.log('Form submitted successfully'); - } - }) - .catch(error => { - console.error('There was a problem submitting the form', error); - }); - }); - - - - </script> + .then(data => { + if (data) { + console.log('Form submitted successfully', data); + } else { + console.log('Form submitted successfully'); + } + }) + .catch(error => { + console.error('There was a problem submitting the form', error); + }); + form.reset(); + } + }); + </script> </body> </html> \ No newline at end of file diff --git a/DISPticketing/front/surveyInformation.html b/DISPticketing/front/surveyInformation.html index e6d79a5a3cfc56d416dc46b56a21a84647191655..6b75e86289c8824824f80ed5db3f358e3cf8adb0 100644 --- a/DISPticketing/front/surveyInformation.html +++ b/DISPticketing/front/surveyInformation.html @@ -1,25 +1,33 @@ <html> <head> - <!-- + <!-- required viewer styles --> - <link rel="stylesheet" href="https://unpkg.com/@bpmn-io/form-js@1.7.3/dist/assets/form-js.css"> - <style> - #form { - max-width: 800px; - } - </style> + <link rel="stylesheet" href="https://unpkg.com/@bpmn-io/form-js@1.7.3/dist/assets/form-js.css"> + <style> + #form { + max-width: 800px; + } + </style> </head> -<body> - <div id="form"></div> +<body style="background-color: lightblue;"> + <div + style="display: flex; flex-direction: column; justify-content: center; align-items: center; margin: 0; background-color: lightblue;"> + <h1>Completion Survey</h1> + <div + style="padding: 20px; border: 2px solid black; border-radius: 10px; background-color: white; max-width: 800px; height: 500px;"> + <div id="form"> + </div> + </div> + </div> - <!-- + <!-- add your form schema to this script tag alternatively, load it asynchronously from anywhere --> - <script type="application/form-schema"> + <script type="application/form-schema"> { "executionPlatform": "Camunda Cloud", "executionPlatformVersion": "8.5.0", @@ -113,62 +121,61 @@ "type": "default" } </script> - - <!-- + <!-- required viewer script --> - <script src="https://unpkg.com/@bpmn-io/form-js@1.7.3/dist/form-viewer.umd.js"></script> - <script> - const schema = JSON.parse( - document.querySelector('[type="application/form-schema"]').textContent - ); - const container = document.querySelector('#form'); - - const form = new FormViewer.Form({ - container - }) - form.importSchema(schema) - - - + <script src="https://unpkg.com/@bpmn-io/form-js@1.7.3/dist/form-viewer.umd.js"></script> + <script> + const schema = JSON.parse( + document.querySelector('[type="application/form-schema"]').textContent + ); + const container = document.querySelector('#form'); + const form = new FormViewer.Form({ + container + }) + form.importSchema(schema) + form.on('submit', (event) => { + const errors = form.validate(); + if (Object.keys(errors).length) { + console.error("Form has errors", errors); + } else { + event.preventDefault(); // Prevent the default form submission + let formData = event.data; // Accessing the data object from the event + formData.emailType = "SurveyEmailReplied" + console.log(formData); + formData = JSON.stringify(formData); - form.on('submit', (event) => { - event.preventDefault(); // Prevent the default form submission - - let formData = event.data; // Accessing the data object from the event - formData.emailType = "SurveyEmailReplied"; - console.log(formData); - formData = JSON.stringify(formData); - - fetch('http://localhost:8080/submission', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: formData + fetch('http://localhost:8080/submission', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: formData + }) + .then(response => { + if (!response.ok) { + throw new Error('Network response was not ok'); + } + return response.json(); }) - .then(response => { - if (!response.ok) { - throw new Error('Network response was not ok'); - } - return response.json(); - }) - .then(data => { - if (data) { - console.log('Form submitted successfully', data); - } else { - console.log('Form submitted successfully'); - } - }) - .catch(error => { - console.error('There was a problem submitting the form', error); - }); - }); + .then(data => { + if (data) { + console.log('Form submitted successfully', data); + } else { + console.log('Form submitted successfully'); + } + }) + .catch(error => { + console.error('There was a problem submitting the form', error); + }); + form.reset(); + } + }); - </script> + </script> </body> </html> \ No newline at end of file diff --git a/DISPticketing/pom.xml b/DISPticketing/pom.xml index bf7648763db259fa2f0f302314b9c809b594d968..94f5e7e37d5c39b44dee2272569d7f856c53052b 100644 --- a/DISPticketing/pom.xml +++ b/DISPticketing/pom.xml @@ -69,31 +69,6 @@ <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> - - <dependency> - <groupId>com.sun.mail</groupId> - <artifactId>javax.mail</artifactId> - <version>1.6.2</version> - </dependency> - - <dependency> - <groupId>com.sun.activation</groupId> - <artifactId>javax.activation</artifactId> - <version>1.2.0</version> - </dependency> - - <dependency> - <groupId>org.eclipse.angus</groupId> - <artifactId>jakarta.mail</artifactId> - <version>2.0.3</version> - <exclusions> - <exclusion> - <groupId>org.eclipse.angus</groupId> - <artifactId>angus-activation</artifactId> - </exclusion> - </exclusions> - </dependency> - </dependencies> <build> diff --git a/DISPticketing/src/main/java/com/disp/Worker.java b/DISPticketing/src/main/java/com/disp/Worker.java index 609bdec054db248abd8c2eb379418af907324deb..f5baa70a4523fb490a358233ed75dd9fa8506142 100644 --- a/DISPticketing/src/main/java/com/disp/Worker.java +++ b/DISPticketing/src/main/java/com/disp/Worker.java @@ -2,14 +2,12 @@ package com.disp; import java.util.HashMap; import java.util.Map; - import com.disp.email.EmailRequest; import com.disp.email.EmailService; import com.disp.forms.FormData; import com.disp.ticket.Ticket; import com.disp.ticket.TicketCamundaManager; import com.disp.ticket.TicketDBManager; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -17,10 +15,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; - import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; - import io.camunda.zeebe.client.ZeebeClient; import io.camunda.zeebe.client.api.response.ActivatedJob; import io.camunda.zeebe.client.api.worker.JobClient; @@ -46,6 +42,7 @@ public class Worker { return new RestTemplate(); } + // creates a ticket and stores within the database @JobWorker(type = "createTicket", autoComplete = false) public void createTicket(final JobClient client, final ActivatedJob job) { // get the process instance variables and creates a ticket object @@ -57,7 +54,18 @@ public class Worker { TicketDBManager ticketCRUD = new TicketDBManager(); ticketCRUD.createTicket(ticket); variableMap.put("ticketID", ticket.getId()); - variableMap.put("ticketStatus", "active"); + variableMap.put("creationDate", ticket.getCreationDate()); + variableMap.put("loggedTime", ticket.getLoggedTime()); + variableMap.put("ticketStatus", "Open"); + + // send email notifying that the ticket has been closed + String sender = "joewilko17@gmail.com"; + String subject = "Ticket Open!"; + String body = "Hello " + ticket.getName() + + ", Your ticket is now open and being worked on! Kind Regards, Your Company"; + String recipient = ticket.getEmail(); + emailService.sendEmail(subject, body, sender, recipient); + System.out.println(variableMap); // complete task and return all variables @@ -66,6 +74,7 @@ public class Worker { .send(); } + // updates a ticket with variables taken from the process engine @JobWorker(type = "updateTicket", autoComplete = false) public void updateTicket(final JobClient client, final ActivatedJob job) { // get the process instance variables and creates a ticket object @@ -75,11 +84,25 @@ public class Worker { // make changes to the database TicketDBManager ticketDBManager = new TicketDBManager(); - ticketDBManager.updateTicket(ticket.getId(), ticket); + // Check if the ticket needs to be moved from Email_Tickets to the appropriate + // department table + if (ticket.getAssignedDepartment() != null) { + if (ticketDBManager.ticketExistsInEmailTickets(ticket.getId())) { + ticketDBManager.moveTicketToDepartment(ticket.getId(), ticket); + } else { + ticketDBManager.updateTicket(ticket.getId(), ticket); + } + } else { + ticketDBManager.updateTicket(ticket.getId(), ticket); + } // complete the task updating the variables in the camunda process instance variableMap.put("fieldManagerReviewDescription", ticketDBManager.getGeneratedDescription(ticket.getId(), ticket)); + // update the logged time as new value calculated when getTicketFromEngine() + // called + variableMap.put("ticketID", ticket.getId()); + variableMap.put("loggedTime", ticket.getLoggedTime()); // complete task and return all variables client.newCompleteCommand(job.getKey()) @@ -87,6 +110,7 @@ public class Worker { .send(); } + // sets the status of a ticket to closed @JobWorker(type = "closeTicket", autoComplete = false) public void closeTicket(final JobClient client, final ActivatedJob job) { // get the ticket from camunda process variables, using getTicketFromEngine() @@ -95,7 +119,7 @@ public class Worker { Ticket ticket = ticketCamundaManager.getTicketFromEngine(variableMap); // set the ticket status to closed - ticket.setStatus("closed"); + ticket.setStatus("Closed"); // make changes to the database TicketDBManager ticketDBManager = new TicketDBManager(); @@ -104,12 +128,22 @@ public class Worker { // complete the task updating the variables in the camunda process instance variableMap.put("ticketStatus", ticket.getStatus()); + // send email notifying that the ticket has been closed + String sender = "joewilko17@gmail.com"; + String subject = "Ticket Closed: Inactive 2 Weeks"; + String body = "Hello " + ticket.getName() + + ", Your ticket has been inactive for two weeks and has been closed! Kind Regards, Your Company"; + String recipient = ticket.getEmail(); + emailService.sendEmail(subject, body, sender, recipient); + System.out.println("Ticket Closed"); + // complete task client.newCompleteCommand(job.getKey()) .variables(variableMap) .send(); } + // sets the status of a ticket to complete @JobWorker(type = "completeTicket", autoComplete = false) public void completeTicket(final JobClient client, final ActivatedJob job) { // get the ticket from camunda process variables, using getTicketFromEngine() @@ -118,7 +152,7 @@ public class Worker { Ticket ticket = ticketCamundaManager.getTicketFromEngine(variableMap); // set the ticket status to complete - ticket.setStatus("completed"); + ticket.setStatus("Completed"); TicketDBManager ticketDBManager = new TicketDBManager(); ticketDBManager.updateTicket(ticket.getId(), ticket); @@ -126,12 +160,23 @@ public class Worker { // complete the task updating the variables in the camunda process instance variableMap.put("ticketStatus", ticket.getStatus()); + // send email notifying that the ticket has been closed + String sender = "joewilko17@gmail.com"; + String subject = "Ticket Complete!"; + String body = "Hello " + ticket.getName() + + ", Your ticket has been successfuly solved and has been completed! Kind Regards, Your Company"; + String recipient = ticket.getEmail(); + emailService.sendEmail(subject, body, sender, recipient); + + System.out.println("Ticket Completed"); // complete task client.newCompleteCommand(job.getKey()) .variables(variableMap) .send(); } + // method which sends an email to the end user based on the type of email + // needing to be sent using switch/case statements @JobWorker(type = "sendEmail", autoComplete = false) public void sendEmail(final JobClient client, final ActivatedJob job) { // get the email details to send from the header type @@ -143,10 +188,9 @@ public class Worker { String sender = "joewilko17@gmail.com"; String subject = ""; String body = ""; - // change to ticket.getEmail(); - String recipient = ticket.getName(); + String recipient = ticket.getEmail(); - // Determine recipient based on the emailType header + // determine recipient based on the emailType header switch (emailType) { case "Survey": // survey email contents @@ -161,7 +205,7 @@ public class Worker { case "ExtraInfo": // extra information email contents subject = "We Require More Info!"; - body = "Please fill out the form: <a href=\'http://localhost:8000/extraInformation.html'>This link will take you to the form!</a>"; + body = ticket.getMoreDescription() + ". Please fill out the form: <a href=\'http://localhost:8000/extraInformation.html'>This link will take you to the form!</a>"; break; default: break; @@ -169,6 +213,7 @@ public class Worker { // send email emailService.sendEmail(subject, body, sender, recipient); + System.out.println("Sending Email of Type: " + emailType); // complete the task client.newCompleteCommand(job.getKey()) @@ -176,42 +221,20 @@ public class Worker { .join(); } - // defunct remove in a bit - @JobWorker(type = "saveSurvey", autoComplete = false) - public void saveSurvey(final JobClient client, final ActivatedJob job) { - // get the ticket from camunda process variables, using getTicketFromEngine() - Map<String, Object> variableMap = job.getVariablesAsMap(); - TicketCamundaManager ticketCamundaManager = new TicketCamundaManager(); - Ticket ticket = ticketCamundaManager.getTicketFromEngine(variableMap); - - TicketDBManager ticketDBManager = new TicketDBManager(); - ticketDBManager.updateTicket(ticket.getId(), ticket); - - // complete the task updating the variables in the camunda process instance - variableMap.put("fieldSatisfactionLevel", ticket.getSatisfactionLevel()); - variableMap.put("fieldComments", ticket.getComments()); - - // complete task - client.newCompleteCommand(job.getKey()) - .variables(variableMap) - .send(); - } - + // method by which email can be recieved from a sender for submitting an issue @PostMapping("/email") public void receiveEmail(@RequestBody EmailRequest emailRequest) { // gets the values from the email and stores to variable - System.out.println("Email received:"); - System.out.println("Sender: " + emailRequest.getSender()); - System.out.println("Subject: " + emailRequest.getSubject()); - System.out.println("Body: " + emailRequest.getBody()); + System.out.println("Email received: Sending to Database and Process Engine"); String sender = emailRequest.getSender(); - String contactDetails = "N/A"; - String department = "N/A"; + String contactDetails = emailRequest.getContactDetails(); + String department = emailRequest.getDepartment(); String serviceLevelAgreement = emailRequest.getServiceLevelAgreement(); String assignedDepartment = emailRequest.getAssignedDepartment(); String subject = emailRequest.getSubject(); String body = emailRequest.getBody(); + String email = emailRequest.getEmail(); // loads a variable map with the content from the email Map<String, Object> emailContents = new HashMap<>(); @@ -222,6 +245,14 @@ public class Worker { emailContents.put("assignedDepartment", assignedDepartment); emailContents.put("fieldTitle", subject); emailContents.put("fieldDescription", body); + emailContents.put("fieldEmail", email); + emailContents.put("ticketStatus", "Open"); + + // // save the email into a ticket, to send to database + // TicketCamundaManager TicketCamundaManager = new TicketCamundaManager(); + // Ticket ticket = TicketCamundaManager.getTicketFromEmail(emailContents); + // TicketDBManager ticketCRUD = new TicketDBManager(); + // ticketCRUD.createTicket(ticket); // triggers the email recieved boundary event zClient.newPublishMessageCommand() @@ -231,6 +262,39 @@ public class Worker { .send(); } + @PostMapping("/issueSubmission") + public ResponseEntity<String> recieveIssueForm(@RequestBody FormData formData) { + + String fieldName = formData.getFieldName(); + String fieldEmail = formData.getFieldEmail(); + String fieldContactNumber = formData.getFieldContactNumber(); + String fieldDepartment = formData.getFieldDepartment(); + String fieldTitle = formData.getFieldTitle(); + String fieldDescription = formData.getFieldDescription(); + String fieldSLA = formData.getFieldSLA(); + String assignedDepartment = formData.getAssignedDepartment(); + + Map<String, Object> formContents = new HashMap<>(); + formContents.put("fieldName", fieldName); + formContents.put("fieldEmail", fieldEmail); + formContents.put("fieldContactNumber", fieldContactNumber); + formContents.put("fieldDepartment", fieldDepartment); + formContents.put("fieldTitle", fieldTitle); + formContents.put("fieldDescription", fieldDescription); + formContents.put("fieldSLA", fieldSLA); + formContents.put("assignedDepartment", assignedDepartment); + + System.out.println("Issue form data has been retrieved"); + + zClient.newPublishMessageCommand() + .messageName("issueFormRecieved") + .correlationKey("Recieved") + .variables(formContents) + .send(); + return ResponseEntity.ok("{\"message\": \"Form submitted successfully\"}"); + } + + // method to retrieve external form data sent by email to the end user @PostMapping("/submission") public ResponseEntity<String> receiveFormData(@RequestBody FormData formData) { // find out which email type this is recieving data from @@ -261,8 +325,8 @@ public class Worker { formContents.put("fieldComments", comments); } - // finish any recieve tasks waiting on an email based on which header was - // requested + System.out.println("Form Data Recieved from " + emailType); + zClient.newPublishMessageCommand() .messageName(emailType) .correlationKey("Reply") diff --git a/DISPticketing/src/main/java/com/disp/email/EmailConfig.java b/DISPticketing/src/main/java/com/disp/email/EmailConfig.java index 3e3391f33f4eb40b9d7cdc0b5ee75599b5146636..8e142f39360d3559d8708cf3882f912b7cdc9da1 100644 --- a/DISPticketing/src/main/java/com/disp/email/EmailConfig.java +++ b/DISPticketing/src/main/java/com/disp/email/EmailConfig.java @@ -10,11 +10,6 @@ import org.springframework.mail.javamail.JavaMailSenderImpl; @Configuration public class EmailConfig { - - private String userName = "joewilko17@gmail.com"; - - private String password = "hqwkhcbqztnlcfhd"; - @Bean public JavaMailSender mailSender() { @@ -22,21 +17,15 @@ public class EmailConfig { mailSender.setHost("smtp.gmail.com"); mailSender.setPort(587); - mailSender.setUsername(userName); - mailSender.setPassword(password); + mailSender.setUsername("joewilko17@gmail.com"); + mailSender.setPassword("hqwkhcbqztnlcfhd"); Properties javaMailProperties = new Properties(); - javaMailProperties.put("mail.smtp.auth", "true"); // Change to string value - javaMailProperties.put("mail.smtp.starttls.enable", "true"); // Change to string value + javaMailProperties.put("mail.smtp.auth", "true"); + javaMailProperties.put("mail.smtp.starttls.enable", "true"); mailSender.setJavaMailProperties(javaMailProperties); return mailSender; } - - //only one getter so that emails can be sent from the correct address in Worker.java - public String getUserName() { - return userName; - } - } diff --git a/DISPticketing/src/main/java/com/disp/email/EmailListener.java b/DISPticketing/src/main/java/com/disp/email/EmailListener.java index 0561531b17dd0f42dbb8a793f2750685be536822..6595b484d049f5bfdeb2bfae1cee9c74b1f4ddc3 100644 --- a/DISPticketing/src/main/java/com/disp/email/EmailListener.java +++ b/DISPticketing/src/main/java/com/disp/email/EmailListener.java @@ -1,24 +1,19 @@ package com.disp.email; -import javax.mail.*; -import javax.mail.event.*; -import javax.mail.internet.MimeMultipart; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; - import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; - import jakarta.annotation.PostConstruct; - +import jakarta.mail.*; +import jakarta.mail.event.*; +import jakarta.mail.internet.MimeMultipart; import java.io.IOException; import java.util.Properties; import java.util.Timer; import java.util.TimerTask; - @Service public class EmailListener { @@ -62,6 +57,9 @@ public class EmailListener { for (Message message : messages) { try { String sender = message.getFrom()[0].toString(); + String[] senderParts = parseSender(sender); + String name = senderParts[0]; + String email = senderParts[1]; String subject = message.getSubject(); Object content = message.getContent(); String body = ""; @@ -75,7 +73,8 @@ public class EmailListener { System.out.println(subject); System.out.println(body); // Send email data to the API endpoint - EmailRequest emailRequest = new EmailRequest(sender, null, null, null, null, subject, body); + EmailRequest emailRequest = new EmailRequest(name, null, null, null, null, subject, body, + email); restTemplate.postForObject(EMAIL_RECEIVE_ENDPOINT, emailRequest, Void.class); } catch (Exception ex) { ex.printStackTrace(); @@ -85,22 +84,20 @@ public class EmailListener { @Override public void messagesRemoved(MessageCountEvent e) { - // Not used in this example } }); - // Check for new messages every 10 seconds Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { try { - inbox.getMessageCount(); // Triggers MessageCountListener + inbox.getMessageCount(); } catch (MessagingException e) { e.printStackTrace(); } } - }, 0, 10000); // Check every 10 seconds + }, 0, 1000); } catch (Exception e) { e.printStackTrace(); @@ -114,13 +111,27 @@ public class EmailListener { for (int i = 0; i < count; i++) { BodyPart bodyPart = multipart.getBodyPart(i); if (bodyPart.getContent() instanceof MimeMultipart) { - // Recursively process nested multiparts textContent.append(getTextFromMimeMultipart((MimeMultipart) bodyPart.getContent())); - } else if (bodyPart.isMimeType("text/*")) { - // If the body part is text, append it to the text content - textContent.append(bodyPart.getContent().toString()); + } else if (bodyPart.isMimeType("text/plain")) { + String text = bodyPart.getContent().toString() + .replaceAll("\\r\\n|\\r|\\n|\\t|\\f|\\b", " "); + textContent.append(text); } } return textContent.toString(); } + + // Method to parse sender name and email address + private static String[] parseSender(String sender) { + String name = ""; + String email = ""; + String[] parts = sender.split("<"); + if (parts.length > 1) { + name = parts[0].trim(); + email = parts[1].replaceAll(">", "").trim(); + } else { + email = sender.trim(); + } + return new String[] { name, email }; + } } diff --git a/DISPticketing/src/main/java/com/disp/email/EmailRequest.java b/DISPticketing/src/main/java/com/disp/email/EmailRequest.java index c189ddbd3a41bb1b3fae60136f7a670d567ac45c..c99858a9a4e6a05b79a4b0975824a0cb04a2aad3 100644 --- a/DISPticketing/src/main/java/com/disp/email/EmailRequest.java +++ b/DISPticketing/src/main/java/com/disp/email/EmailRequest.java @@ -9,11 +9,11 @@ public class EmailRequest { private String assignedDepartment; private String subject; private String body; - + private String email; public EmailRequest(String sender, String contactDetails, String department, String serviceLevelAgreement, - String assignedDepartment, String subject, String body) { + String assignedDepartment, String subject, String body, String email) { this.sender = sender; this.contactDetails = contactDetails; this.department = department; @@ -21,6 +21,7 @@ public class EmailRequest { this.assignedDepartment = assignedDepartment; this.subject = subject; this.body = body; + this.email = email; } // getters and setters public String getSender() { @@ -65,6 +66,11 @@ public class EmailRequest { public void setBody(String body) { this.body = body; } + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } - } diff --git a/DISPticketing/src/main/java/com/disp/email/EmailService.java b/DISPticketing/src/main/java/com/disp/email/EmailService.java index cc192d4ad87cd2792d5cedbad08bc2af3edbd875..23eb8fe37764737cb329e7e77bc81b224987acc4 100644 --- a/DISPticketing/src/main/java/com/disp/email/EmailService.java +++ b/DISPticketing/src/main/java/com/disp/email/EmailService.java @@ -13,15 +13,14 @@ public class EmailService { private JavaMailSender mailSender; public void sendEmail(String subject, String messageBody, String from, String to) { - // Define your email details - // Create a MimeMessagePreparator using a lambda expression + // Create a MimeMessagePreparator MimeMessagePreparator messagePreparator = mimeMessage -> { MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage); messageHelper.setTo(to); messageHelper.setFrom(from); messageHelper.setSubject(subject); - messageHelper.setText(messageBody, true); // Set to true if using HTML content + messageHelper.setText(messageBody, true); }; // Send the email diff --git a/DISPticketing/src/main/java/com/disp/forms/FormData.java b/DISPticketing/src/main/java/com/disp/forms/FormData.java index 43060654eef6ee355360fe757b96123bad66af04..fc1a6f1cf34e92a3d630e9299578d22d34a9d4d6 100644 --- a/DISPticketing/src/main/java/com/disp/forms/FormData.java +++ b/DISPticketing/src/main/java/com/disp/forms/FormData.java @@ -2,36 +2,108 @@ package com.disp.forms; public class FormData { + // form data variables private String emailType; - + private String fieldName; + private String fieldEmail; + private String fieldContactNumber; + private String fieldDepartment; + private String fieldTitle; + private String fieldDescription; + private String fieldSLA; + private String assignedDepartment; private String fieldDetailedDescription; private String issueResolved; private String fieldUnresolvedReason; private String fieldSatisfactionLevel; private String fieldComments; + // getter and setters public String getEmailType() { return emailType; } - + public void setEmailType(String emailType) { + this.emailType = emailType; + } + public String getFieldName() { + return fieldName; + } + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + public String getFieldEmail() { + return fieldEmail; + } + public void setFieldEmail(String fieldEmail) { + this.fieldEmail = fieldEmail; + } + public String getFieldContactNumber() { + return fieldContactNumber; + } + public void setFieldContactNumber(String fieldContactNumber) { + this.fieldContactNumber = fieldContactNumber; + } + public String getFieldDepartment() { + return fieldDepartment; + } + public void setFieldDepartment(String fieldDepartment) { + this.fieldDepartment = fieldDepartment; + } + public String getFieldTitle() { + return fieldTitle; + } + public void setFieldTitle(String fieldTitle) { + this.fieldTitle = fieldTitle; + } + public String getFieldDescription() { + return fieldDescription; + } + public void setFieldDescription(String fieldDescription) { + this.fieldDescription = fieldDescription; + } + public String getFieldSLA() { + return fieldSLA; + } + public void setFieldSLA(String fieldSLA) { + this.fieldSLA = fieldSLA; + } + public String getAssignedDepartment() { + return assignedDepartment; + } + public void setAssignedDepartment(String assignedDepartment) { + this.assignedDepartment = assignedDepartment; + } public String getFieldDetailedDescription() { return fieldDetailedDescription; } - + public void setFieldDetailedDescription(String fieldDetailedDescription) { + this.fieldDetailedDescription = fieldDetailedDescription; + } public String getIssueResolved() { return issueResolved; } - + public void setIssueResolved(String issueResolved) { + this.issueResolved = issueResolved; + } public String getFieldUnresolvedReason() { return fieldUnresolvedReason; } - + public void setFieldUnresolvedReason(String fieldUnresolvedReason) { + this.fieldUnresolvedReason = fieldUnresolvedReason; + } public String getFieldSatisfactionLevel() { return fieldSatisfactionLevel; } - + public void setFieldSatisfactionLevel(String fieldSatisfactionLevel) { + this.fieldSatisfactionLevel = fieldSatisfactionLevel; + } public String getFieldComments() { return fieldComments; } + public void setFieldComments(String fieldComments) { + this.fieldComments = fieldComments; + } + + } diff --git a/DISPticketing/src/main/java/com/disp/ticket/Ticket.java b/DISPticketing/src/main/java/com/disp/ticket/Ticket.java index 30b1b3fd3f08c00055581a2f9b5ec9ea359eeb74..a45fe28488a2dd55d7a8c9bbbfa18c323234e8ea 100644 --- a/DISPticketing/src/main/java/com/disp/ticket/Ticket.java +++ b/DISPticketing/src/main/java/com/disp/ticket/Ticket.java @@ -2,12 +2,13 @@ package com.disp.ticket; public class Ticket { private String name; + private String email; private String contactNumber; private String department; private String ticketTitle; private String ticketDescription; private String serviceLevelAgreement; - private String assignedDepartment; + private String assignedDepartment; private Integer id; private String status; private String assignedEmployee; @@ -16,10 +17,13 @@ public class Ticket { private String unresolvedReason; private String satisfactionLevel; private String comments; + private String creationDate; + private String loggedTime; // default constructor - public Ticket(){ + public Ticket() { this.name = null; + this.email = null; this.contactNumber = null; this.department = null; this.ticketTitle = null; @@ -34,13 +38,20 @@ public class Ticket { this.unresolvedReason = null; this.satisfactionLevel = null; this.comments = null; + this.creationDate = null; + this.loggedTime = null; + } // constructor for ticket creation - public Ticket(String name, String contactNumber, String department, String ticketTitle, String ticketDescription, - String serviceLevelAgreement, String assignedDepartment, Integer id, String status, String assignedEmployee,String moreDescription, - String detailedDescription,String unresolvedReason,String satisfactionLevel, String comments) { + public Ticket(String name, String email, String contactNumber, String department, String ticketTitle, + String ticketDescription, + String serviceLevelAgreement, String assignedDepartment, Integer id, String status, String assignedEmployee, + String moreDescription, + String detailedDescription, String unresolvedReason, String satisfactionLevel, String comments, + String creationDate, String loggedTime) { this.name = name; + this.email = email; this.contactNumber = contactNumber; this.department = department; this.ticketTitle = ticketTitle; @@ -48,13 +59,16 @@ public class Ticket { this.serviceLevelAgreement = serviceLevelAgreement; this.assignedDepartment = assignedDepartment; this.id = id; - this.status = status; + this.status = status; this.assignedEmployee = assignedEmployee; this.moreDescription = moreDescription; this.detailedDescription = detailedDescription; this.unresolvedReason = unresolvedReason; this.satisfactionLevel = satisfactionLevel; this.comments = comments; + this.creationDate = creationDate; + this.loggedTime = loggedTime; + } // function to return a singular ticket description for camunda process instance @@ -85,7 +99,7 @@ public class Ticket { } } - // getter & setter methods + // getter & setter methods public String getName() { return name; } @@ -94,6 +108,14 @@ public class Ticket { this.name = name; } + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + public String getContactNumber() { return contactNumber; } @@ -205,4 +227,21 @@ public class Ticket { public void setComments(String comments) { this.comments = comments; } + + public String getCreationDate() { + return creationDate; + } + + public void setCreationDate(String creationDate) { + this.creationDate = creationDate; + } + + public String getLoggedTime() { + return loggedTime; + } + + public void setLoggedTime(String loggedTime) { + this.loggedTime = loggedTime; + } + } diff --git a/DISPticketing/src/main/java/com/disp/ticket/TicketCamundaManager.java b/DISPticketing/src/main/java/com/disp/ticket/TicketCamundaManager.java index 21f76dfcb84b3b62c1e4d5a48d0d00869e1725e2..0b2427a4e1cae55fe220fa03bd81b5b27753dccf 100644 --- a/DISPticketing/src/main/java/com/disp/ticket/TicketCamundaManager.java +++ b/DISPticketing/src/main/java/com/disp/ticket/TicketCamundaManager.java @@ -1,5 +1,8 @@ package com.disp.ticket; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.Map; public class TicketCamundaManager { @@ -8,6 +11,7 @@ public class TicketCamundaManager { // variableMap) int ticketID = variableMap.containsKey("ticketID") ? (int) variableMap.get("ticketID") : 0; String name = (String) variableMap.get("fieldName"); + String email = (String) variableMap.get("fieldEmail"); String contactNumber = (String) variableMap.get("fieldContactNumber"); String department = (String) variableMap.get("fieldDepartment"); String ticketTitle = (String) variableMap.get("fieldTitle"); @@ -21,10 +25,45 @@ public class TicketCamundaManager { String unresolvedReason = (String) variableMap.get("fieldUnresolvedReason"); String satisfactionLevel = (String) variableMap.get("fieldSatisfactionLevel"); String comments = (String) variableMap.get("fieldComments"); + String creationDate = (String) variableMap.get("creationDate"); + String loggedTime = (String) variableMap.get("loggedTime"); + + if (creationDate == null) { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + creationDate = formatter.format(date); + } + loggedTime = calculateTimeDifference(creationDate); // create and return a new ticket object with these values - return new Ticket(name, contactNumber, department, ticketTitle, ticketDescription, sla, + return new Ticket(name, email, contactNumber, department, ticketTitle, ticketDescription, sla, assignedDepartment, ticketID, status, - assignedEmployee, moreDescription, detailedDescription, unresolvedReason, satisfactionLevel, comments); + assignedEmployee, moreDescription, detailedDescription, unresolvedReason, satisfactionLevel, comments, + creationDate, loggedTime); + } + + private static String calculateTimeDifference(String creationDate) { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date currentDate = new Date(); + String loggedTime = ""; + + try { + // Parse creationDate + Date dateCreationDate = formatter.parse(creationDate); + + // Calculate the difference between currentDate and dateCreationDate + long difference = currentDate.getTime() - dateCreationDate.getTime(); + long seconds = difference / 1000 % 60; + long minutes = difference / (60 * 1000) % 60; + long hours = difference / (60 * 60 * 1000); + + // Format the difference into HH:mm:ss format + loggedTime = String.format("%02d:%02d:%02d", hours, minutes, seconds); + } catch (ParseException e) { + e.printStackTrace(); + } + + return loggedTime; } + } diff --git a/DISPticketing/src/main/java/com/disp/ticket/TicketDBManager.java b/DISPticketing/src/main/java/com/disp/ticket/TicketDBManager.java index 2f9c811c8af052ccd484e9cda32bed2a1ad30535..d7ab79c561233e5327fc7cebb0f3b8c1246f38f8 100644 --- a/DISPticketing/src/main/java/com/disp/ticket/TicketDBManager.java +++ b/DISPticketing/src/main/java/com/disp/ticket/TicketDBManager.java @@ -10,10 +10,10 @@ public class TicketDBManager { public void createTicket(Ticket ticket) { // first create the ticketStorage database if it doesnt already exist // then add the ticket to that database - + // get the correct table to add ticket String tableName; - if(ticket.getAssignedDepartment() != null){ + if (ticket.getAssignedDepartment() != null) { if (ticket.getAssignedDepartment().equals("Development")) { tableName = "Development_Tickets"; } else if (ticket.getAssignedDepartment().equals("IT")) { @@ -22,35 +22,36 @@ public class TicketDBManager { System.err.println("Invalid department: " + ticket.getAssignedDepartment()); return; } - } - else{ + } else { tableName = "Email_Tickets"; } - - String createTicket = "INSERT INTO "+ tableName + " (name, contactNumber, department, ticketTitle, ticketDescription, serviceLevelAgreement, status) " - + "VALUES (?, ?, ?, ?, ?, ?,?)"; + String createTicket = "INSERT INTO " + tableName + + " (name, email, contactNumber, department, ticketTitle, ticketDescription, serviceLevelAgreement, status, creationDate, loggedTime) " + + "VALUES (?, ?, ?, ?, ?, ?, ?,?,?,?)"; try (Connection connection = SQLiteConnection.connect(); PreparedStatement statement = connection.prepareStatement(createTicket, Statement.RETURN_GENERATED_KEYS)) { // set the parameters of the INSERT statement statement.setString(1, ticket.getName()); - statement.setString(2, ticket.getContactNumber()); - statement.setString(3, ticket.getDepartment()); - statement.setString(4, ticket.getTicketTitle()); - statement.setString(5, ticket.getTicketDescription()); - statement.setString(6, ticket.getServiceLevelAgreement()); - statement.setString(7, "active"); - - // execute the INSERT statement + statement.setString(2, ticket.getEmail()); + statement.setString(3, ticket.getContactNumber()); + statement.setString(4, ticket.getDepartment()); + statement.setString(5, ticket.getTicketTitle()); + statement.setString(6, ticket.getTicketDescription()); + statement.setString(7, ticket.getServiceLevelAgreement()); + statement.setString(8, "Open"); + statement.setString(9, ticket.getCreationDate()); + statement.setString(10, ticket.getLoggedTime()); + + statement.executeUpdate(); // get the ticketId generated by the database and assign it to this ticket - // object ResultSet generatedKeys = statement.getGeneratedKeys(); if (generatedKeys.next()) { - ticket.setId(generatedKeys.getInt(1)); // Assuming the ID is of type long + ticket.setId(generatedKeys.getInt(1)); System.out.println("Generated Ticket ID: " + ticket.getId()); } else { System.out.println("Failed to retrieve generated Ticket ID."); @@ -64,6 +65,95 @@ public class TicketDBManager { } + public void moveTicketToDepartment(int ticketID, Ticket ticket) { + // move the ticket from Email_Tickets to the appropriate department table + String sourceTableName = "Email_Tickets"; + String destinationTableName; + + if (ticket.getAssignedDepartment().equals("Development")) { + destinationTableName = "Development_Tickets"; + } else if (ticket.getAssignedDepartment().equals("IT")) { + destinationTableName = "IT_Tickets"; + } else { + System.err.println("Invalid department: " + ticket.getAssignedDepartment()); + return; + } + + String selectSql = "SELECT * FROM " + sourceTableName + " WHERE ticketID = ?"; + String insertSql = "INSERT INTO " + destinationTableName + + " (name, email, contactNumber, department, ticketTitle, ticketDescription, serviceLevelAgreement, status, creationDate, loggedTime) " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + String deleteSql = "DELETE FROM " + sourceTableName + " WHERE ticketID = ?"; + + try (Connection connection = SQLiteConnection.connect(); + PreparedStatement selectStatement = connection.prepareStatement(selectSql); + PreparedStatement insertStatement = connection.prepareStatement(insertSql); + PreparedStatement deleteStatement = connection.prepareStatement(deleteSql)) { + + // select ticket from Email_Tickets + selectStatement.setInt(1, ticketID); + ResultSet resultSet = selectStatement.executeQuery(); + + // if ticket found in Email_Tickets, move it to the department table + if (resultSet.next()) { + insertStatement.setString(1, resultSet.getString("name")); + insertStatement.setString(2, resultSet.getString("email")); + insertStatement.setString(3, resultSet.getString("contactNumber")); + insertStatement.setString(4, resultSet.getString("department")); + insertStatement.setString(5, resultSet.getString("ticketTitle")); + insertStatement.setString(6, resultSet.getString("ticketDescription")); + insertStatement.setString(7, resultSet.getString("serviceLevelAgreement")); + insertStatement.setString(8, resultSet.getString("status")); + insertStatement.setString(9, resultSet.getString("creationDate")); + insertStatement.setString(10, resultSet.getString("loggedTime")); + + insertStatement.executeUpdate(); + + // delete the ticket from Email_Tickets + deleteStatement.setInt(1, ticketID); + deleteStatement.executeUpdate(); + + // update the ticket ID in the Ticket object + ticket.setId(getLastInsertedID(connection)); + + System.out.println( + "Ticket moved from Email_Tickets to " + destinationTableName + " with ID: " + ticket.getId()); + } else { + System.err.println("Ticket not found in Email_Tickets."); + } + } catch (SQLException e) { + e.printStackTrace(); + } + } + + private int getLastInsertedID(Connection connection) throws SQLException { + String sql = "SELECT last_insert_rowid()"; + try (Statement statement = connection.createStatement(); + ResultSet resultSet = statement.executeQuery(sql)) { + return resultSet.getInt(1); + } + } + + public boolean ticketExistsInEmailTickets(int ticketID) { + String selectSql = "SELECT COUNT(*) AS count FROM Email_Tickets WHERE ticketID = ?"; + try (Connection connection = SQLiteConnection.connect(); + PreparedStatement selectStatement = connection.prepareStatement(selectSql)) { + // set the parameter of the SELECT statement + selectStatement.setInt(1, ticketID); + + // execute the SELECT statement + try (ResultSet resultSet = selectStatement.executeQuery()) { + // if a result is found, return true + if (resultSet.next()) { + return resultSet.getInt("count") > 0; + } + } + } catch (SQLException e) { + e.printStackTrace(); + } + return false; + } + public void updateTicket(int ticketID, Ticket ticket) { // update the ticket in the database relative to the ticketID // with the variables from this passed in ticket object @@ -79,29 +169,30 @@ public class TicketDBManager { return; } - // generate the new ticket description - String newTicketDescription = getGeneratedDescription(ticketID, ticket); - // SQL query to update the ticket - String updateSql = "UPDATE "+ tableName + " SET name = ?, contactNumber = ?, department = ?, ticketTitle = ?, " + + String updateSql = "UPDATE " + tableName + + " SET name = ?, email = ?, contactNumber = ?, department = ?, ticketTitle = ?, " + "ticketDescription = ?, serviceLevelAgreement = ?, status = ?, assignedEmployee = ?, " + - "satisfactionLevel = ?, comments = ? WHERE ticketID = ?"; + "satisfactionLevel = ?, comments = ?, creationDate = ?, loggedTime = ? WHERE ticketID = ?"; try (Connection connection = SQLiteConnection.connect(); PreparedStatement updateStatement = connection.prepareStatement(updateSql)) { // set the parameters of the UPDATE statement updateStatement.setString(1, ticket.getName()); - updateStatement.setString(2, ticket.getContactNumber()); - updateStatement.setString(3, ticket.getDepartment()); - updateStatement.setString(4, ticket.getTicketTitle()); - updateStatement.setString(5, newTicketDescription); - updateStatement.setString(6, ticket.getServiceLevelAgreement()); - updateStatement.setString(7, ticket.getStatus()); - updateStatement.setString(8, ticket.getAssignedEmployee()); - updateStatement.setString(9, ticket.getSatisfactionLevel()); - updateStatement.setString(10, ticket.getComments()); - updateStatement.setInt(11, ticketID); + updateStatement.setString(2, ticket.getEmail()); + updateStatement.setString(3, ticket.getContactNumber()); + updateStatement.setString(4, ticket.getDepartment()); + updateStatement.setString(5, ticket.getTicketTitle()); + updateStatement.setString(6, ticket.getTicketDescription()); + updateStatement.setString(7, ticket.getServiceLevelAgreement()); + updateStatement.setString(8, ticket.getStatus()); + updateStatement.setString(9, ticket.getAssignedEmployee()); + updateStatement.setString(10, ticket.getSatisfactionLevel()); + updateStatement.setString(11, ticket.getComments()); + updateStatement.setString(12, ticket.getCreationDate()); + updateStatement.setString(13, ticket.getLoggedTime()); + updateStatement.setInt(14, ticketID); // execute the UPDATE statement updateStatement.executeUpdate(); diff --git a/DISPticketing/src/main/resources/application.yaml b/DISPticketing/src/main/resources/application.yaml index dad1a01024c682403157e835b8aeb49a406aa24f..f8683745a16b17078a33ff4640624a7e124ecb47 100644 --- a/DISPticketing/src/main/resources/application.yaml +++ b/DISPticketing/src/main/resources/application.yaml @@ -1,3 +1,14 @@ +spring.h2.console.enabled: true +spring.mail: + host: smtp.gmail.com + port: 587 + username: joewilko17@gmail.com + password: hqwkhcbqztnlcfhd + protocol: smtp + properties.mail.smtp: + auth: true + starttls.enable: true + zeebe: client: cloud: diff --git a/DISPticketing/target/classes/application.yaml b/DISPticketing/target/classes/application.yaml index dad1a01024c682403157e835b8aeb49a406aa24f..f8683745a16b17078a33ff4640624a7e124ecb47 100644 --- a/DISPticketing/target/classes/application.yaml +++ b/DISPticketing/target/classes/application.yaml @@ -1,3 +1,14 @@ +spring.h2.console.enabled: true +spring.mail: + host: smtp.gmail.com + port: 587 + username: joewilko17@gmail.com + password: hqwkhcbqztnlcfhd + protocol: smtp + properties.mail.smtp: + auth: true + starttls.enable: true + zeebe: client: cloud: diff --git a/DISPticketing/target/classes/com/disp/Worker.class b/DISPticketing/target/classes/com/disp/Worker.class index 6e6dfa5505de7a2f8b317bd66a6739f246ec1226..87b32ade780bd1d38714b12ae2713342270dcb8a 100644 Binary files a/DISPticketing/target/classes/com/disp/Worker.class and b/DISPticketing/target/classes/com/disp/Worker.class differ diff --git a/DISPticketing/target/classes/com/disp/email/EmailRequest.class b/DISPticketing/target/classes/com/disp/email/EmailRequest.class index dd5c80e9240d78e6ecfcc0943fc8b8c56c1c4241..d5b9de1929ed23e70c86f9df668195e4adba6197 100644 Binary files a/DISPticketing/target/classes/com/disp/email/EmailRequest.class and b/DISPticketing/target/classes/com/disp/email/EmailRequest.class differ diff --git a/ticketStorage.db b/ticketStorage.db index 38fb517547ee9a5f2a3eb3134148cea977a85644..f6f789d9a9c29989ccf4f869f479ed3ea0d5ac2e 100644 Binary files a/ticketStorage.db and b/ticketStorage.db differ