diff --git a/.github/workflows/course-deploy.yml b/.github/workflows/course-deploy.yml new file mode 100644 index 0000000..3e48f3b --- /dev/null +++ b/.github/workflows/course-deploy.yml @@ -0,0 +1,46 @@ +name: Deploy Drools course + +on: + workflow_dispatch: + push: + tags: + - 'course-v*' + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: drools-course-pages + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + defaults: + run: + working-directory: course-site + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '22' + - run: npm install + - run: npm run validate:content + - run: npm run build + - uses: actions/configure-pages@v5 + - uses: actions/upload-pages-artifact@v3 + with: + path: course-site/build + + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + needs: build + runs-on: ubuntu-latest + steps: + - name: Deploy + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/course-quality.yml b/.github/workflows/course-quality.yml new file mode 100644 index 0000000..bd7c790 --- /dev/null +++ b/.github/workflows/course-quality.yml @@ -0,0 +1,59 @@ +name: Drools course quality + +on: + pull_request: + paths: + - 'course-site/**' + - '.github/workflows/course-quality.yml' + push: + branches: [main] + paths: + - 'course-site/**' + - '.github/workflows/course-quality.yml' + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: drools-course-quality-${{ github.ref }} + cancel-in-progress: true + +jobs: + validate-build: + runs-on: ubuntu-latest + defaults: + run: + working-directory: course-site + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: '22' + - name: Install + run: npm install + - name: Record dependency audit + run: npm audit --json > npm-audit.json || true + - name: Enforce no critical dependency vulnerabilities + run: npm audit --audit-level=critical + - name: Validate course structure + run: npm run validate:content + - name: Build Docusaurus + run: npm run build + - name: Upload dependency evidence + if: always() + uses: actions/upload-artifact@v4 + with: + name: drools-course-dependency-evidence + path: | + course-site/package-lock.json + course-site/npm-audit.json + if-no-files-found: error + - name: Upload production build + uses: actions/upload-artifact@v4 + with: + name: drools-course-site + path: course-site/build + if-no-files-found: error diff --git a/.obsidian/app.json b/.obsidian/app.json deleted file mode 100644 index f699f2f..0000000 --- a/.obsidian/app.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "pdfExportSettings": { - "includeName": true, - "pageSize": "Letter", - "landscape": false, - "margin": "0", - "downscalePercent": 100 - } -} \ No newline at end of file diff --git a/.obsidian/appearance.json b/.obsidian/appearance.json deleted file mode 100644 index c8c365d..0000000 --- a/.obsidian/appearance.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "accentColor": "" -} \ No newline at end of file diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json deleted file mode 100644 index 7631926..0000000 --- a/.obsidian/workspace.json +++ /dev/null @@ -1,206 +0,0 @@ -{ - "main": { - "id": "99a015a32072475d", - "type": "split", - "children": [ - { - "id": "b51e4f1877be7f91", - "type": "tabs", - "children": [ - { - "id": "dc70199e93b0204c", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "README.md", - "mode": "source", - "backlinks": true, - "source": false - } - } - }, - { - "id": "6c569969d55f5f40", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "Course Material/Student Handbook.md.md", - "mode": "source", - "backlinks": true, - "source": false - } - } - } - ], - "currentTab": 1 - } - ], - "direction": "vertical" - }, - "left": { - "id": "75d22e6ffaf011dc", - "type": "split", - "children": [ - { - "id": "5629bbbd86d877b1", - "type": "tabs", - "children": [ - { - "id": "c65861e6494dd9ce", - "type": "leaf", - "state": { - "type": "file-explorer", - "state": { - "sortOrder": "alphabetical" - } - } - }, - { - "id": "5f3ae532dfd52e15", - "type": "leaf", - "state": { - "type": "search", - "state": { - "query": "", - "matchingCase": false, - "explainSearch": false, - "collapseAll": false, - "extraContext": false, - "sortOrder": "alphabetical" - } - } - }, - { - "id": "adc805c336c0136c", - "type": "leaf", - "state": { - "type": "bookmarks", - "state": {} - } - } - ] - } - ], - "direction": "horizontal", - "width": 300 - }, - "right": { - "id": "3b726ff6bea829c4", - "type": "split", - "children": [ - { - "id": "b6af97af987b47ff", - "type": "tabs", - "children": [ - { - "id": "377f05f2c3280db3", - "type": "leaf", - "state": { - "type": "backlink", - "state": { - "file": "Course Material/Student Handbook.md.md", - "collapseAll": false, - "extraContext": false, - "sortOrder": "alphabetical", - "showSearch": false, - "searchQuery": "", - "backlinkCollapsed": false, - "unlinkedCollapsed": true - } - } - }, - { - "id": "ec068cf3cb93457a", - "type": "leaf", - "state": { - "type": "outgoing-link", - "state": { - "file": "Course Material/Student Handbook.md.md", - "linksCollapsed": false, - "unlinkedCollapsed": true - } - } - }, - { - "id": "3cb9cd25535c19bc", - "type": "leaf", - "state": { - "type": "tag", - "state": { - "sortOrder": "frequency", - "useHierarchy": true - } - } - }, - { - "id": "465822c3f529ceab", - "type": "leaf", - "state": { - "type": "outline", - "state": { - "file": "Course Material/Student Handbook.md.md" - } - } - } - ] - } - ], - "direction": "horizontal", - "width": 300, - "collapsed": true - }, - "left-ribbon": { - "hiddenItems": { - "switcher:Open quick switcher": false, - "graph:Open graph view": false, - "canvas:Create new canvas": false, - "daily-notes:Open today's daily note": false, - "templates:Insert template": false, - "command-palette:Open command palette": false, - "audio-recorder:Start/stop recording": false - } - }, - "active": "6c569969d55f5f40", - "lastOpenFiles": [ - "README.md", - "Course Material/Student Handbook.md.md", - "Course Material/labs/Case 2/Loan Application.md", - "Course Material/labs/Drools Lab Setup.md", - "Course Material/Student Handbook.pdf", - "Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/resources/schema.sql", - "Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/resources/data.sql", - "Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/repository/PolicyServiceTest.java", - "Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/repository/ClaimServiceTest.java", - "Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/repository/ApplicationServiceTest.java", - "Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/repository", - "Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/impl/PolicyServiceImpl.java", - "Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/impl/ApplicationServiceImpl.java", - "Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/impl/ClaimServiceImpl.java", - "Course Material/README.md", - "Course Material/labs/Case 3/Fraud Detection.md", - "Course Material/labs/Case 1/Health Insurance.md", - "Course Material/Exercises/Student Files/Raydo.md", - "Course Material/Exercises/Student Files/README.md", - "Course Material/Exercises/README.md", - "Course Material/Exercises/Lab Exercise 07 - Structuring Business Rules in Drools Rule Language (DRL).md", - "WhatsApp Image 2024-01-24 at 11.59.26_c34de5eb.jpg", - "Welcome.md", - "Oracle SQL Database exam mock test.md", - "Drools (1).png", - "Drools/Course Material/labs/README.md", - "Drools/Course Material/Exercises/README.md", - "Course Outline.md", - "Drools/README.md", - "Pasted image 20240124131510.png", - "ken099-lunde/README.md", - "ken099-lunde/Exam Prep/1Z0-071/Exam Preparation Guide.md", - "ken099-lunde/Exam Prep/README.md", - "Pasted image 20240124131537.png", - "Drools/Course Material/README.md", - "Drools/Course Material/Exercises/Student Files/README.md", - "Drools/Course Material/Exercises/Student Files/Raydo.md", - "Drools/Course Material/Exercises/Lab Exercise 07 - Structuring Business Rules in Drools Rule Language (DRL).md" - ] -} \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..a5b7679 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +drools.skunkworksacademy.com \ No newline at end of file diff --git a/COURSE_AUDIT.md b/COURSE_AUDIT.md new file mode 100644 index 0000000..8bdc319 --- /dev/null +++ b/COURSE_AUDIT.md @@ -0,0 +1,52 @@ +# Drools Self-Paced Course Modernisation Audit + +**Audit date:** 2026-08-26 +**Repository:** `skunkworks-academy/drools` +**Target delivery:** Docusaurus static learning site at `drools.skunkworksacademy.com` +**Course baseline:** Drools 10.2.0 / Apache KIE 10.2 documentation family + +## Executive assessment + +The repository contains valuable legacy instructor-led assets, including a substantial student handbook, day-based PDF slide decks, day-based lab PDFs, exercise folders, and insurance case-study material. The root course outline is explicitly framed as a three-day **Drools 8** course. This is useful source material, but it is not yet a publishable self-paced learning product. + +The principal gaps are: + +1. **Version drift** — the learning narrative is centred on Drools 8 while the current Apache KIE documentation family is Drools 10.2.0. +2. **Delivery-model mismatch** — content is organized around instructor-led “Day 1/2/3” delivery rather than asynchronous learning paths, learner pacing, mastery checks, remediation, and completion rules. +3. **Weak traceability** — objectives, activities, labs, assessments, and completion evidence are not linked through a formal outcome/assessment matrix. +4. **Assessment governance** — there is no formal blueprint, pass standard, retake/remediation policy, marking rubric, answer-key separation, or evidence-retention model. +5. **Accessibility evidence** — existing PDF-heavy delivery does not provide a WCAG 2.2 AA publishing baseline or a repeatable accessibility QA gate. +6. **Publishing controls** — there is no course-specific static-site build, structured metadata, automated link/content checks, release checklist, or versioned quality record. +7. **Learner support** — no self-paced orientation, expected workload, study strategy, troubleshooting route, accessibility statement, glossary, note templates, or progress model. +8. **Content lifecycle** — no documented SME review cadence, version support policy, change-control mechanism, or deprecation process for technical content. +9. **Legacy asset risk** — binary PDFs are difficult to diff, maintain, accessibility-test, and update. They should be retained as source evidence while canonical course content moves to text-first, version-controlled Markdown/MDX. +10. **Certification boundary** — a repository can be designed to support ISO-aligned evidence, but ISO conformity/certification is an organizational management-system determination and cannot be asserted by source code alone. + +## Modernisation decision + +Build a new `course-site/` Docusaurus learning layer while preserving `Course Material/` unchanged as legacy source material. The self-paced site becomes the canonical learner-facing source, with explicit standards mapping, version metadata, review controls, labs, formative checks, summative assessment, capstone rubric, learner notes, facilitator/assessor material, and slide source. + +## Standards and frameworks used + +The implementation is designed to support evidence relevant to: + +- **ISO 21001:2025** — Educational organizations management systems; learner-centred design, competence development, inclusion, monitoring, and continual improvement. +- **ISO 29993:2017** — Learning services outside formal education; defined goals, learner information, learning-service delivery, assessment, and evaluation. +- **ISO/IEC 40180:2017** — Quality reference framework for ICT-enhanced learning. +- **ISO/PAS 25171:2026** — audit-oriented guidance for ISO 21001:2025 evidence and measures. +- **WCAG 2.2 Level AA** — stronger current web-accessibility target for the learner site. +- **Revised Bloom taxonomy** — measurable outcome verbs and cognitive progression. +- **Backward design / constructive alignment** — outcome → activity → evidence mapping. +- **SCORM/xAPI readiness** — interoperability hooks are documented, but no LMS package is claimed in this foundation release. + +No claim of ISO certification or accredited status is made. + +## Release gates before public launch + +- Technical SME verifies Drools 10.2.0 examples and executes all labs from a clean environment. +- Independent instructional-design review checks outcome/assessment alignment. +- Accessibility review reaches WCAG 2.2 AA for authored pages and interactive elements. +- All external links and Docusaurus build checks pass. +- Assessment keys and lab solutions remain outside the public Docusaurus `docs/` tree. +- Course owner approves version, review date, support window, and change record. +- Learner evaluation and incident/support channels are configured in the target platform. diff --git a/Course Material/Day three/Drools - Slide Master.pdf b/Course Material/Day three/Drools - Slide Master.pdf new file mode 100644 index 0000000..2c3638c Binary files /dev/null and b/Course Material/Day three/Drools - Slide Master.pdf differ diff --git a/Course Material/Day three/Lab Exercise 03.01.pdf b/Course Material/Day three/Lab Exercise 03.01.pdf new file mode 100644 index 0000000..84acc3c Binary files /dev/null and b/Course Material/Day three/Lab Exercise 03.01.pdf differ diff --git a/Course Material/Day three/Lab Exercise 03.02 - Final Capstone Project.pdf b/Course Material/Day three/Lab Exercise 03.02 - Final Capstone Project.pdf new file mode 100644 index 0000000..cba7dc1 Binary files /dev/null and b/Course Material/Day three/Lab Exercise 03.02 - Final Capstone Project.pdf differ diff --git a/Course Material/Day three/Readme.md b/Course Material/Day three/Readme.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Course Material/Day three/Readme.md @@ -0,0 +1 @@ + diff --git a/Course Material/Day three/insurance/insurance/.gitignore b/Course Material/Day three/insurance/insurance/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/.idea/.gitignore b/Course Material/Day three/insurance/insurance/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/Course Material/Day three/insurance/insurance/.idea/encodings.xml b/Course Material/Day three/insurance/insurance/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/Course Material/Day three/insurance/insurance/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/.idea/misc.xml b/Course Material/Day three/insurance/insurance/.idea/misc.xml new file mode 100644 index 0000000..45028cd --- /dev/null +++ b/Course Material/Day three/insurance/insurance/.idea/misc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/.idea/uiDesigner.xml b/Course Material/Day three/insurance/insurance/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/pom.xml b/Course Material/Day three/insurance/insurance/pom.xml new file mode 100644 index 0000000..b74e278 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/pom.xml @@ -0,0 +1,171 @@ + + + + 4.0.0 + + org.sw + insurance + 1.0-SNAPSHOT + + + 17 + 17 + UTF-8 + org.sw.drools + 7.74.0.Final + + 11 + 11 + + 5.1.0 + + + + + apache-snapshots-repo + Apache + https://repository.apache.org/content/repositories/snapshots/ + default + + true + never + + + true + daily + + + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + java + + -Xms1024M + -Xmx1024M + -cp + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 11 + 11 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.2 + + + + org.kie + kie-maven-plugin + 8.44.0.Final + true + + + + + + + + org.kie + kie-api + ${drools.version} + + + + org.drools + drools-engine-classic + ${drools.version} + + + + org.drools + drools-core + ${drools.version} + + + + org.drools + drools-compiler + ${drools.version} + + + + org.drools + drools-decisiontables + ${drools.version} + + + + org.kie + kie-internal + ${drools.version} + + + + org.slf4j + slf4j-api + 2.0.5 + + + + org.slf4j + slf4j-nop + 2.0.5 + + + + org.mvel + mvel2 + 2.4.15.Final + + + + org.junit.jupiter + junit-jupiter-engine + 5.9.2 + test + + + org.junit.jupiter + junit-jupiter-api + 5.9.2 + test + + + + org.hamcrest + hamcrest-all + 1.3 + test + + + + org.assertj + assertj-core + 3.24.2 + test + + + + + \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/Common.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/Common.java new file mode 100644 index 0000000..908cd97 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/Common.java @@ -0,0 +1,77 @@ +package org.sw; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class Common { + + public static boolean disposeSession = true; + + public static int promptForDemo(int lesson, String[] args, int minDemo, int maxDemo) { + return promptForDemoInternal("Lesson " + lesson, args, minDemo, maxDemo); + } + + private static int promptForDemoInternal(String lessonStr, String[] args, int minDemo, int maxDemo) { + String demoStr = ""; + + while (true) { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + try { + if (args != null && args.length > 0) { + demoStr = args[0]; + return Integer.parseInt(demoStr); + } + else { + System.out.printf(lessonStr + ". Enter demo number (%d...%d): ", minDemo, maxDemo); + demoStr = br.readLine(); + } + + int step = Integer.parseInt(demoStr); + + if (step < minDemo || step > maxDemo) { + System.out.println("Step number out of range. Insert a number between " + minDemo + " and " + maxDemo); + } + else { + return step; + } + } + catch (NumberFormatException e) { + System.out.println("Invalid number: " + demoStr); + } + catch (IOException e) { + System.out.println("Invalid demo input: " + demoStr); + } + } + + } + + + public static boolean promptForYesNoQuestion(String question) { + String enteredStr = ""; + + while (true) { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + try { + System.out.printf("%s Enter 'yes' or 'no': ", question); + enteredStr = br.readLine().trim(); + + if ("yes".equalsIgnoreCase(enteredStr) || "y".equalsIgnoreCase(enteredStr)) { + return true; + } + + if ("no".equalsIgnoreCase(enteredStr) || "n".equalsIgnoreCase(enteredStr)) { + return false; + } + + System.out.println("Enter either 'yes' or 'no'"); + } + catch (IOException e) { + System.out.println("Invalid input: " + enteredStr); + } + } + + } + +} + diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/builder/ApplicationRepository.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/builder/ApplicationRepository.java new file mode 100644 index 0000000..96984b3 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/builder/ApplicationRepository.java @@ -0,0 +1,173 @@ +package org.sw.builder; + +import org.sw.facts.Application; +import org.sw.facts.FamilyApplication; + +import java.time.LocalDate; +import java.time.Month; +import java.util.ArrayList; +import java.util.List; + +import static java.util.Arrays.asList; + +public class ApplicationRepository { + public static List getApplications() { + List applications = new ArrayList<>(); + + applications.add(Application.newBuilder() + .withApplicationNumber("A-1000") + .withClientName("James Smith") + .withClientAge(52) + .withPEC(false) + .withRisk("High") + .withEmployed(true) + .withBMI(21) + .withClientIdNumber("ID-100") + .withSmoker(false) + .build()); + +/* applications.add(Application.newBuilder() + .withApplicationNumber("A-1010") + .withClientName("John Doe") + .withClientAge(30) + .withEmployed(true) + .withPEC(false) + .withRisk("Low") + .withBMI(24) + .withSmoker(false) + .withClientIdNumber("ID-110") + .build());*/ + + applications.add(Application.newBuilder() + .withApplicationNumber("A-1001") + .withClientName("Maria Smith") + .withClientAge(56) + .withPEC(true) + .withRisk("Medium") + .withEmployed(true) + .withBMI(23) + .withClientIdNumber("ID-101") + .withSmoker(true) + .build()); + + applications.add(Application.newBuilder() + .withApplicationNumber("A-1002") + .withClientName("Robert Johnson") + .withClientAge(38) + .withPEC(false) + .withRisk("High") + .withEmployed(true) + .withBMI(25) + .withClientIdNumber("ID-102") + .withSmoker(true) + .build()); + + applications.add(Application.newBuilder() + .withApplicationNumber("A-1003") + .withClientName("Linda Johnson") + .withClientAge(36) + .withPEC(true) + .withRisk("Low") + .withEmployed(false) + .withBMI(32) + .withClientIdNumber("ID-103") + .withSmoker(false) + .build()); + + applications.add(Application.newBuilder() + .withApplicationNumber("A-1004") + .withClientName("Michael Johnson") + .withClientAge(16) + .withPEC(false) + .withRisk("Low") + .withEmployed(false) + .withBMI(20) + .withClientIdNumber("ID-104") + .withSmoker(false) + .build()); + + applications.add(Application.newBuilder() + .withApplicationNumber("A-1005") + .withClientName("Elizabeth Anderson") + .withClientAge(27) + .withPEC(false) + .withRisk("Medium") + .withEmployed(true) + .withBMI(27) + .withClientIdNumber("ID-105") + .withSmoker(true) + .build()); + + applications.add(Application.newBuilder() + .withApplicationNumber("A-1006") + .withClientName("David Lrr") + .withClientAge(63) + .withPEC(true) + .withRisk("High") + .withEmployed(true) + .withBMI(31) + .withClientIdNumber("ID-106") + .withSmoker(true) + .build()); + + applications.add(Application.newBuilder() + .withApplicationNumber("A-1007") + .withClientName("Emily Taylor") + .withClientAge(80) + .withPEC(false) + .withRisk("Low") + .withEmployed(false) + .withBMI(18) + .withClientIdNumber("ID-107") + .withSmoker(true) + .build()); + + applications.add(Application.newBuilder() + .withApplicationNumber("A-1008") + .withClientName("William Brown") + .withClientAge(21) + .withPEC(true) + .withRisk("Low") + .withEmployed(true) + .withBMI(28) + .withClientIdNumber("ID-108") + .withSmoker(true) + .build()); + + applications.add(Application.newBuilder() + .withApplicationNumber("A-1009") + .withClientName("Jessica Thompson") + .withClientAge(71) + .withPEC(false) + .withRisk("Medium") + .withEmployed(false) + .withBMI(23) + .withClientIdNumber("ID-110") + .withSmoker(false) + .build()); + + return applications; + } + + public static List getFamilyApplications() { + List familyApplications = new ArrayList<>(); + + familyApplications.add(FamilyApplication.newBuilder() + .withApplicationNumber("GIA-1000") + .withClientIdNumbers(asList("ID-100", "ID-101")) + .withClientAges(asList(52, 56)) + .withStartDate(LocalDate.of(2024, Month.MARCH, 1)) + .withPolicyDurationYears(1) + .build()); + + familyApplications.add(FamilyApplication.newBuilder() + .withApplicationNumber("GIA-1001") + .withClientIdNumbers(asList("ID-102", "ID-103", "ID-104")) + .withClientAges(asList(38, 36, 16)) + .withStartDate(LocalDate.of(2024, Month.MAY, 5)) + .withPolicyDurationYears(1) + .build()); + + return familyApplications; + } +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/builder/ClaimRepository.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/builder/ClaimRepository.java new file mode 100644 index 0000000..a5f4d12 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/builder/ClaimRepository.java @@ -0,0 +1,49 @@ +package org.sw.builder; + +import org.sw.facts.Claim; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +public class ClaimRepository { + public static List getClaims() { + List claims = new ArrayList<>(); + + claims.add(Claim.newBuilder() + .withClientName("John Doe") + .withPolicyNumber("P-1100") + .withDateOfClaim(LocalDate.of(2022, 5, 19)) + .withClaimAmount(8000) + .build()); + + claims.add(Claim.newBuilder() + .withClientName("William Johnson") + .withPolicyNumber("P-1002") + .withDateOfClaim(LocalDate.of(2020, 4, 14)) + .withClaimAmount(10000) + .build()); + + claims.add(Claim.newBuilder() + .withClientName("Michael Davis") + .withPolicyNumber("P-1004") + .withDateOfClaim(LocalDate.of(2023, 1, 31)) + .withClaimAmount(40000) + .build()); + + claims.add(Claim.newBuilder() + .withClientName("Sophia Martinez") + .withPolicyNumber("P-1005") + .withDateOfClaim(LocalDate.of(2022, 1, 3)) + .withClaimAmount(50000) + .build()); + + claims.add(Claim.newBuilder() + .withClientName("Ava Thompson") + .withPolicyNumber("P-1009") + .withDateOfClaim(LocalDate.of(2022, 2, 8)) + .withClaimAmount(25000) + .build()); + + return claims; + } +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/builder/ClientIdRepository.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/builder/ClientIdRepository.java new file mode 100644 index 0000000..0eaf5fd --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/builder/ClientIdRepository.java @@ -0,0 +1,76 @@ +package org.sw.builder; + +import org.sw.facts.ClientID; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +public class ClientIdRepository { + + public static List getClientIDs() { + List clientIDs = new ArrayList<>(); + + clientIDs.add(ClientID.newBuilder() + .withName("James Smith") + .withIdNumber("ID-100") + .withExpiryDate(LocalDate.of(2030, 5, 21)) + .build()); + + clientIDs.add(ClientID.newBuilder() + .withName("Maria Smith") + .withIdNumber("ID-101") + .withExpiryDate(LocalDate.of(2023, 5, 11)) + .build()); + + clientIDs.add(ClientID.newBuilder() + .withName("Robert Johnson") + .withIdNumber("ID-102") + .withExpiryDate(LocalDate.of(2037, 11, 11)) + .build()); + + clientIDs.add(ClientID.newBuilder() + .withName("Linda Johnson") + .withIdNumber("ID-103") + .withExpiryDate(LocalDate.of(2026, 11, 2)) + .build()); + + clientIDs.add(ClientID.newBuilder() + .withName("Michael Johnson") + .withIdNumber("ID-104") + .withExpiryDate(LocalDate.of(2032, 1, 11)) + .build()); + + clientIDs.add(ClientID.newBuilder() + .withName("Elizabeth Anderson") + .withIdNumber("ID-105") + .withExpiryDate(LocalDate.of(2024, 3, 31)) + .build()); + + clientIDs.add(ClientID.newBuilder() + .withName("David Lee") + .withIdNumber("ID-106") + .withExpiryDate(LocalDate.of(2025, 6, 8)) + .build()); + + clientIDs.add(ClientID.newBuilder() + .withName("Emily Taylor") + .withIdNumber("ID-107") + .withExpiryDate(LocalDate.of(2027, 3, 31)) + .build()); + + clientIDs.add(ClientID.newBuilder() + .withName("William Brown") + .withIdNumber("ID-108") + .withExpiryDate(LocalDate.of(2031, 1, 8)) + .build()); + + clientIDs.add(ClientID.newBuilder() + .withName("Jessica Thompson") + .withIdNumber("ID-109") + .withExpiryDate(LocalDate.of(2031, 1, 8)) + .build()); + + return clientIDs; + } +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/builder/PolicyRepository.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/builder/PolicyRepository.java new file mode 100644 index 0000000..03c5bb2 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/builder/PolicyRepository.java @@ -0,0 +1,95 @@ +package org.sw.builder; + +import org.sw.facts.Policy; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +public class PolicyRepository { + public static List getPolicies() { + List policies = new ArrayList<>(); + + policies.add(Policy.newBuilder() + .withPolicyNumber("P-1000") + .withClientName("John Doe") + .withPremium(140) + .withCoverage(14000) + .withPaymentStatus("Paid") + .build()); + + policies.add(Policy.newBuilder() + .withPolicyNumber("P-1001") + .withClientName("Emma Smith") + .withPremium(220) + .withCoverage(22000) + .withPaymentStatus("Unpaid") + .build()); + + policies.add(Policy.newBuilder() + .withPolicyNumber("P-1002") + .withClientName("William Johnson") + .withPremium(150) + .withCoverage(15000) + .withPaymentStatus("Unpaid") + .build()); + + policies.add(Policy.newBuilder() + .withPolicyNumber("P-1003") + .withClientName("Olivia Brown") + .withPremium(90) + .withCoverage(9000) + .withPaymentStatus("Paid") + .build()); + + policies.add(Policy.newBuilder() + .withPolicyNumber("P-1004") + .withClientName("Michael Davis") + .withPremium(400) + .withCoverage(40000) + .withPaymentStatus("Paid") + .build()); + + policies.add(Policy.newBuilder() + .withPolicyNumber("P-1005") + .withClientName("Sophia Martinez") + .withPremium(230) + .withCoverage(23000) + .withPaymentStatus("Paid") + .build()); + + policies.add(Policy.newBuilder() + .withPolicyNumber("P-1006") + .withClientName("Ethan Wilson") + .withPremium(180) + .withCoverage(18000) + .withPaymentStatus("Paid") + .build()); + + policies.add(Policy.newBuilder() + .withPolicyNumber("P-1007") + .withClientName("Isabella Taylor") + .withPremium(240) + .withCoverage(24000) + .withPaymentStatus("Paid") + .build()); + + policies.add(Policy.newBuilder() + .withPolicyNumber("P-1008") + .withClientName("Daniel Moore") + .withPremium(120) + .withCoverage(12000) + .withPaymentStatus("Unpaid") + .build()); + + policies.add(Policy.newBuilder() + .withPolicyNumber("P-1009") + .withClientName("Ava Thompson") + .withPremium(210) + .withCoverage(21000) + .withPaymentStatus("Unpaid") + .build()); + + return policies; + } +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/Application.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/Application.java new file mode 100644 index 0000000..f6bdfaa --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/Application.java @@ -0,0 +1,184 @@ +package org.sw.facts; + +import java.util.Objects; + +public class Application { + private String applicationNumber; + private String clientName; + private String clientIdNumber; + private boolean PEC; + private String risk; + private boolean employed; + private boolean isSmoker; + private int clientAge; + private int BMI; + private int premium = 100; + private Status status = Status.PENDING; + private String reason = ""; + + // Getters + public String getApplicationNumber() { + return applicationNumber; + } + + public String getClientName() { + return clientName; + } + + public String getClientIdNumber() { + return clientIdNumber; + } + + public boolean getPEC() { + return PEC; + } + public int getPremium() { return premium; } + + public String getRisk() { + return risk; + } + + public boolean getEmployed() { + return employed; + } + + public boolean isSmoker() { + return isSmoker; + } + + public boolean isOverweight() { return BMI >= 25 && BMI <= 29; } + + public boolean isObeseA() { return BMI >= 30 && BMI <= 34; } + + public boolean isObeseB() { return BMI >= 35 && BMI <= 39; } + + public boolean isObeseC() { return BMI >= 40; } + + public int getClientAge() { + return clientAge; + } + + public int getBMI() { + return BMI; + } + + public Status getStatus() { + return status; + } + + public String getReason() { + return reason; + } + + // Setters + public void addPremium(int amount) { this.premium += amount; } + + public void setStatus(Status status) { + this.status = status; + } + + public void setAge(int clientAge) { + this.clientAge = clientAge; + } + + public void setReason(String reason) { + this.reason = reason; + } + + @Override + public String toString() { + return String.format("Application [#%s, name:%s]", applicationNumber, clientName); + } + + public static ApplicationBuilder newBuilder() { + return new ApplicationBuilder(); + } + + public static final class ApplicationBuilder { + private String applicationNumber; + private String clientName; + private String clientIdNumber; + private boolean PEC; + private String risk; + private boolean employed; + private boolean isSmoker; + private int clientAge; + private int BMI; + + private ApplicationBuilder() { + } + + public ApplicationBuilder withApplicationNumber(String applicationNumber) { + this.applicationNumber = applicationNumber; + return this; + } + + public ApplicationBuilder withClientName(String clientName) { + this.clientName = clientName; + return this; + } + + public ApplicationBuilder withClientIdNumber(String clientIdNumber) { + this.clientIdNumber = clientIdNumber; + return this; + } + + public ApplicationBuilder withPEC(boolean PEC) { + this.PEC = PEC; + return this; + } + + public ApplicationBuilder withRisk(String risk) { + this.risk = risk; + return this; + } + + public ApplicationBuilder withEmployed(boolean employed) { + this.employed = employed; + return this; + } + + public ApplicationBuilder withSmoker(boolean isSmoker) { + this.isSmoker = isSmoker; + return this; + } + + public ApplicationBuilder withClientAge(int clientAge) { + this.clientAge = clientAge; + return this; + } + + public ApplicationBuilder withBMI(int BMI) { + this.BMI = BMI; + return this; + } + + public Application build() { + Application application = new Application(); + application.applicationNumber = this.applicationNumber; + application.clientName = this.clientName; + application.clientIdNumber = this.clientIdNumber; + application.PEC = this.PEC; + application.risk = this.risk; + application.employed = this.employed; + application.isSmoker = this.isSmoker; + application.clientAge = this.clientAge; + application.BMI = this.BMI; + return application; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Application application = (Application) o; + return Objects.equals(applicationNumber, application.applicationNumber); + } + + @Override + public int hashCode() { + return Objects.hash(applicationNumber); + } + +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/Claim.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/Claim.java new file mode 100644 index 0000000..a21e1d3 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/Claim.java @@ -0,0 +1,111 @@ +package org.sw.facts; + +import java.time.LocalDate; +import java.util.Objects; + +public class Claim { + private String clientName; + private String policyNumber; + private LocalDate dateOfClaim; + private int claimAmount; + private Status status = Status.PENDING; + private String reason = ""; + + // Getters + public String getClientName() { + return clientName; + } + + public String getPolicyNumber() { + return policyNumber; + } + + public LocalDate getDateOfClaim() { + return dateOfClaim; + } + + public int getClaimAmount() { + return claimAmount; + } + + public Status getStatus() { + return status; + } + + public String getReason() { + return reason; + } + + // Setters + public void setClaimAmount(int claimAmount) { this.claimAmount = claimAmount; } + + public void setStatus(Status status) { + this.status = status; + } + + public void setReason(String reason) { + this.reason = reason; + } + + @Override + public String toString() { + return String.format("Claim [name:%s, amount:%s]", clientName, claimAmount); + } + + public static ClaimBuilder newBuilder() { + return new ClaimBuilder(); + } + + public static final class ClaimBuilder { + private String clientName; + private String policyNumber; + private LocalDate dateOfClaim; + private int claimAmount; + + private ClaimBuilder() { + } + + public ClaimBuilder withClientName(String clientName) { + this.clientName = clientName; + return this; + } + + public ClaimBuilder withPolicyNumber(String policyNumber) { + this.policyNumber = policyNumber; + return this; + } + + public ClaimBuilder withDateOfClaim(LocalDate dateOfClaim) { + this.dateOfClaim = dateOfClaim; + return this; + } + + public ClaimBuilder withClaimAmount(int claimAmount) { + this.claimAmount = claimAmount; + return this; + } + + public Claim build() { + Claim claim = new Claim(); + claim.clientName = this.clientName; + claim.policyNumber = this.policyNumber; + claim.dateOfClaim = this.dateOfClaim; + claim.claimAmount = this.claimAmount; + return claim; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Claim claim = (Claim) o; + return Objects.equals(policyNumber, claim.policyNumber); + } + + @Override + public int hashCode() { + return Objects.hash(policyNumber); + } + +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/ClientID.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/ClientID.java new file mode 100644 index 0000000..bab2ce2 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/ClientID.java @@ -0,0 +1,104 @@ +package org.sw.facts; + +import java.time.LocalDate; +import java.util.Objects; + +public class ClientID { + private String name; + private String idNumber; + private LocalDate expiryDate; + private Status status = Status.UNKNOWN; + private String reason = ""; + + // Getters + public String getName() { + return name; + } + + public String getIdNumber() { + return idNumber; + } + + public LocalDate getExpiryDate() { + return expiryDate; + } + + public Status getStatus() { + return status; + } + + public String getReason() { + return reason; + } + + // Setters + public void setExpiryDate(LocalDate expiryDate) { + this.expiryDate = expiryDate; + } + + public void setStatus(Status status) { + this.status = status; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public boolean isExpired() { + return expiryDate.isBefore(LocalDate.now()); + } + + @Override + public String toString() { + return String.format("ID: [%s, #:%s]", name, idNumber); + } + + public static ClientIDBuilder newBuilder() { + return new ClientIDBuilder(); + } + + public static final class ClientIDBuilder { + private String name; + private String idNumber; + private LocalDate expiryDate; + + private ClientIDBuilder() { + } + + public ClientIDBuilder withName(String name) { + this.name = name; + return this; + } + + public ClientIDBuilder withIdNumber(String idNumber) { + this.idNumber = idNumber; + return this; + } + + public ClientIDBuilder withExpiryDate(LocalDate expiryDate) { + this.expiryDate = expiryDate; + return this; + } + + public ClientID build() { + ClientID clientID = new ClientID(); + clientID.name = this.name; + clientID.idNumber = this.idNumber; + clientID.expiryDate = this.expiryDate; + return clientID; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ClientID clientID = (ClientID) o; + return Objects.equals(idNumber, clientID.idNumber); + } + + @Override + public int hashCode() { + return Objects.hash(idNumber); + } +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/FamilyApplication.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/FamilyApplication.java new file mode 100644 index 0000000..e5fe24d --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/FamilyApplication.java @@ -0,0 +1,117 @@ +package org.sw.facts; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +public class FamilyApplication { + private final String applicationNumber; + private List clientIdNumbers = new ArrayList<>(); + private List clientAges = new ArrayList<>(); + private LocalDate startDate; + private int policyDurationYears; + + public FamilyApplication(String applicationNumber) { + this.applicationNumber = applicationNumber; + } + + public String getApplicationNumber() { + return applicationNumber; + } + + public List getClientIdNumbers() { + return clientIdNumbers; + } + + public List getClientAges() { return clientAges; } + + public LocalDate getStartDate() { + return startDate; + } + + public int getPolicyDurationYears() { + return policyDurationYears; + } + + public void setStartDate(LocalDate startDate) { + this.startDate = startDate; + } + + public void setPolicyDurationYears(int policyDurationYears) { + this.policyDurationYears = policyDurationYears; + } + + public static String join(Collection collection) { + return collection.stream() + .map(Object::toString) + .collect(Collectors.joining(", ")); + } + + @Override + public String toString() { + return String.format("FamilyApplication[Number:%s, Clients:%s]", applicationNumber, join(clientIdNumbers)); + } + + public static FamilyApplicationBuilder newBuilder() { + return new FamilyApplicationBuilder(); + } + + public static final class FamilyApplicationBuilder { + private String applicationNumber; + private List clientIdNumbers = new ArrayList<>(); + private List clientAges = new ArrayList<>(); + private LocalDate startDate; + private int policyDurationYears; + + private FamilyApplicationBuilder() { + } + + public FamilyApplicationBuilder withApplicationNumber(String applicationNumber) { + this.applicationNumber = applicationNumber; + return this; + } + + public FamilyApplicationBuilder withClientIdNumbers(List clientIdNumbers) { + this.clientIdNumbers = clientIdNumbers; + return this; + } + + public FamilyApplicationBuilder withClientAges(List clientAges) { + this.clientAges = clientAges; + return this; + } + + public FamilyApplicationBuilder withStartDate(LocalDate startDate) { + this.startDate = startDate; + return this; + } + + public FamilyApplicationBuilder withPolicyDurationYears(int policyDurationYears) { + this.policyDurationYears = policyDurationYears; + return this; + } + + public FamilyApplication build() { + FamilyApplication familyApplication = new FamilyApplication(applicationNumber); + familyApplication.clientIdNumbers = this.clientIdNumbers; + familyApplication.clientAges = this.clientAges; + familyApplication.startDate = this.startDate; + familyApplication.policyDurationYears = this.policyDurationYears; + return familyApplication; + } + } + + @Override + public boolean equals(Object obj) { + return obj instanceof FamilyApplication + && ((FamilyApplication) obj).getApplicationNumber().equals(applicationNumber); + } + + @Override + public int hashCode() { + return applicationNumber.hashCode(); + } + +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/InvalidApplication.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/InvalidApplication.java new file mode 100644 index 0000000..942cdcb --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/InvalidApplication.java @@ -0,0 +1,30 @@ +package org.sw.facts; + +public class InvalidApplication { + private Application application; + + public InvalidApplication(Application application) { + this.application = application; + } + + public Application getApplication() { + return application; + } + + @Override + public String toString() { + return "Invalid:" + application; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof InvalidApplication + && ((InvalidApplication) obj).getApplication().equals(application); + } + + @Override + public int hashCode() { + return application.hashCode(); + } + +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/InvalidClaim.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/InvalidClaim.java new file mode 100644 index 0000000..048005d --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/InvalidClaim.java @@ -0,0 +1,29 @@ +package org.sw.facts; + +public class InvalidClaim { + private Claim claim; + + public InvalidClaim(Claim claim) { + this.claim = claim; + } + + public Claim getClaim() { + return claim; + } + + @Override + public String toString() { + return "Invalid:" + claim; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof InvalidClaim + && ((InvalidClaim) obj).getClaim().equals(claim); + } + + @Override + public int hashCode() { + return claim.hashCode(); + } +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/InvalidClientID.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/InvalidClientID.java new file mode 100644 index 0000000..e94d6f4 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/InvalidClientID.java @@ -0,0 +1,29 @@ +package org.sw.facts; + +public class InvalidClientID { + private ClientID clientID; + + public InvalidClientID(ClientID clientID) { + this.clientID = clientID; + } + + public ClientID getClientID() { + return clientID; + } + + @Override + public String toString() { + return "Invalid:" + clientID; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof InvalidClientID + && ((InvalidClientID) obj).getClientID().equals(clientID); + } + + @Override + public int hashCode() { + return clientID.hashCode(); + } +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/InvalidFamilyApplication.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/InvalidFamilyApplication.java new file mode 100644 index 0000000..70ce594 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/InvalidFamilyApplication.java @@ -0,0 +1,36 @@ +package org.sw.facts; + +public class InvalidFamilyApplication { + private FamilyApplication familyApplication; + + public InvalidFamilyApplication(FamilyApplication familyApplication) { + this.familyApplication = familyApplication; + } + + public FamilyApplication getFamilyApplication() { + return familyApplication; + } + + @Override + public String toString() { + return "Invalid:" + familyApplication; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + InvalidFamilyApplication that = (InvalidFamilyApplication) obj; + return familyApplication != null ? familyApplication.equals(that.familyApplication) : that.familyApplication == null; + } + + @Override + public int hashCode() { + return familyApplication != null ? familyApplication.hashCode() : 0; + } + +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/InvalidPolicy.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/InvalidPolicy.java new file mode 100644 index 0000000..4981912 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/InvalidPolicy.java @@ -0,0 +1,31 @@ +package org.sw.facts; + +public class InvalidPolicy { + private Policy policy; + + public InvalidPolicy(Policy policy) { + this.policy = policy; + } + + public Policy getPolicy() { + return policy; + } + + @Override + public String toString() { + return "Invalid:" + policy; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + InvalidPolicy that = (InvalidPolicy) obj; + return policy != null ? policy.equals(that.policy) : that.policy == null; + } + + @Override + public int hashCode() { + return policy != null ? policy.hashCode() : 0; + } +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/Payout.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/Payout.java new file mode 100644 index 0000000..0a44d80 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/Payout.java @@ -0,0 +1,40 @@ +package org.sw.facts; + +import java.util.Objects; + +public class Payout { + private String policyNumber; + private int claimAmount; + + public Payout(String policyNumber, int claimAmount) { + this.policyNumber = policyNumber; + this.claimAmount = claimAmount; + } + + public String getPolicyNumber() { + return policyNumber; + } + + public int getClaimAmount() { + return claimAmount; + } + + @Override + public String toString() { + return "Payout[to Policy: " + policyNumber + ", in amount: " + claimAmount + "]"; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Payout payout = (Payout) o; + return Objects.equals(policyNumber, payout.policyNumber); + } + + @Override + public int hashCode() { + return Objects.hash(policyNumber); + } + +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/Policy.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/Policy.java new file mode 100644 index 0000000..e38b92e --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/Policy.java @@ -0,0 +1,131 @@ +package org.sw.facts; + +import java.util.Objects; + +public class Policy { + private String policyNumber; + private String clientName; + private int premium; + private int coverage; + private String paymentStatus; + private Status status = Status.VALID; + private String reason = ""; + + // Getters + public String getPolicyNumber() { + return policyNumber; + } + + public String getClientName() { + return clientName; + } + + public int getPremium() { + return premium; + } + + public int getCoverage() { + return coverage; + } + + public String getPaymentStatus() { + return paymentStatus; + } + + public Status getStatus() { + return status; + } + + + + public String getReason() { + return reason; + } + + // Setters + public void setPolicyNumber(String policyNumber) {this.policyNumber = policyNumber; } + public void setClientName(String clientName) { this.clientName = clientName; } + public void setPremium(int premium) { + this.premium = premium; + } + + public void setCoverage(int coverage) { this.coverage = coverage; } + + public void setPaymentStatus(String paymentStatus) { this.paymentStatus = paymentStatus; } + + public void setStatus(Status status) { + this.status = status; + } + + public void setReason(String reason) { + this.reason = reason; + } + + @Override + public String toString() { + return String.format("Policy [Policy #%s, %s]", policyNumber, clientName); + } + + public static PolicyBuilder newBuilder() { + return new PolicyBuilder(); + } + + public static final class PolicyBuilder { + private String policyNumber; + private String clientName; + private int premium; + private int coverage; + private String paymentStatus; + + private PolicyBuilder() { + } + + public PolicyBuilder withPolicyNumber(String policyNumber) { + this.policyNumber = policyNumber; + return this; + } + + public PolicyBuilder withClientName(String clientName) { + this.clientName = clientName; + return this; + } + + public PolicyBuilder withPremium(int premium) { + this.premium = premium; + return this; + } + + public PolicyBuilder withCoverage(int coverage) { + this.coverage = coverage; + return this; + } + + public PolicyBuilder withPaymentStatus(String paymentStatus) { + this.paymentStatus = paymentStatus; + return this; + } + + public Policy build() { + Policy policy = new Policy(); + policy.policyNumber = this.policyNumber; + policy.clientName = this.clientName; + policy.premium = this.premium; + policy.coverage = this.coverage; + policy.paymentStatus = this.paymentStatus; + return policy; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Policy policy = (Policy) o; + return Objects.equals(policyNumber, policy.policyNumber); + } + + @Override + public int hashCode() { + return Objects.hash(policyNumber); + } +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/PrimaryClient.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/PrimaryClient.java new file mode 100644 index 0000000..a2844df --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/PrimaryClient.java @@ -0,0 +1,20 @@ +package org.sw.facts; + +public class PrimaryClient { + private ClientID clientID; + private FamilyApplication familyApplication; + + public PrimaryClient(ClientID clientID, FamilyApplication familyApplication) { + this.clientID = clientID; + this.familyApplication = familyApplication; + } + + public ClientID getClientID() { + return clientID; + } + + @Override + public String toString() { + return "Application #"+ familyApplication.getApplicationNumber() + " Primary Cleint: " + clientID.getName(); + } +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/Proposal.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/Proposal.java new file mode 100644 index 0000000..1499727 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/Proposal.java @@ -0,0 +1,36 @@ +package org.sw.facts; + +import java.util.Objects; + +public class Proposal { + private String applicationNumber; + private int premium; + + public Proposal(String applicationNumber, int premium) { + this.applicationNumber = applicationNumber; + this.premium = premium; + } + + // Getters + public String getApplicationNumber() { return applicationNumber; } + public int getPremium() { return premium; } + + @Override + public String toString() { + return "Proposal[to Application: " + applicationNumber + ", with final premium: " + premium + "]"; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Proposal proposal = (Proposal) o; + return Objects.equals(applicationNumber, proposal.applicationNumber); + } + + @Override + public int hashCode() { + return Objects.hash(applicationNumber); + } + +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/SessionData.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/SessionData.java new file mode 100644 index 0000000..fd48838 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/SessionData.java @@ -0,0 +1,21 @@ +package org.sw.facts; + +import java.util.Collection; + +public class SessionData { + public Collection applications; + public Collection policies; + public Collection clientIDs; + public Collection claims; + public Collection familyApplications; + // Add other collections as necessary + + // If you have valid and invalid versions of each, you can add those collections too + public Collection validApplications; + public Collection invalidApplications; + public Collection validClientIDs; + public Collection invalidClientIDs; + public Collection validClaims; + public Collection invalidClaims; + public Collection invalidFamilyApplications; +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/Status.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/Status.java new file mode 100644 index 0000000..8143714 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/Status.java @@ -0,0 +1,5 @@ +package org.sw.facts; + +public enum Status { + APPROVED,DENIED,VALID,INVALID,PENDING,UNKNOWN +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/ValidApplication.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/ValidApplication.java new file mode 100644 index 0000000..c5bddc6 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/ValidApplication.java @@ -0,0 +1,30 @@ +package org.sw.facts; + +public class ValidApplication { + private Application application; + + public ValidApplication(Application application) { + this.application = application; + } + + public Application getApplication() { + return application; + } + + @Override + public String toString() { + return "Valid:" + application; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof ValidApplication + && ((ValidApplication) obj).getApplication().equals(application); + } + + @Override + public int hashCode() { + return application.hashCode(); + } + +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/ValidClaim.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/ValidClaim.java new file mode 100644 index 0000000..3e104b0 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/ValidClaim.java @@ -0,0 +1,30 @@ +package org.sw.facts; + +public class ValidClaim { + private Claim claim; + + public ValidClaim(Claim claim) { + this.claim = claim; + } + + public Claim getClaim() { + return claim; + } + + @Override + public String toString() { + return "Valid:" + claim; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof ValidClaim + && ((ValidClaim) obj).getClaim().equals(claim); + } + + @Override + public int hashCode() { + return claim.hashCode(); + } + +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/ValidClientID.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/ValidClientID.java new file mode 100644 index 0000000..6940242 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/facts/ValidClientID.java @@ -0,0 +1,30 @@ +package org.sw.facts; + +public class ValidClientID { + private ClientID clientID; + + public ValidClientID(ClientID clientID) { + this.clientID = clientID; + } + + public ClientID getClientID() { + return clientID; + } + + @Override + public String toString() { + return "Valid:" + clientID; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof ValidClientID + && ((ValidClientID) obj).getClientID().equals(clientID); + } + + @Override + public int hashCode() { + return clientID.hashCode(); + } + +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson01/StatelessApplicationValidation.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson01/StatelessApplicationValidation.java new file mode 100644 index 0000000..8ccd6a6 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson01/StatelessApplicationValidation.java @@ -0,0 +1,37 @@ +package org.sw.lesson01; + +import org.sw.facts.Application; +import org.sw.Common; +import org.sw.builder.ApplicationRepository; + +import org.kie.api.KieServices; +import org.kie.api.runtime.KieContainer; +import org.kie.api.runtime.StatelessKieSession; + +import java.util.List; + +public class StatelessApplicationValidation { + public static void main(final String[] args) { + execute(Common.promptForDemo(1, args, 1, 5)); + } + + static void execute(int demo) { + System.out.println("Demo Number " + demo); + + List applications = ApplicationRepository.getApplications(); + + KieContainer kieContainer = KieServices.Factory.get().getKieClasspathContainer(); + StatelessKieSession kieSession = kieContainer.newStatelessKieSession("StatelessApplicationValidationDemo" + demo); + System.out.println("==== DROOLS SESSION START ==== "); + kieSession.execute(applications); + System.out.println("==== DROOLS SESSION END ==== "); + + if (demo >= 4) { + System.out.println("==== VALIDATION STATUS AFTER SESSION ==== "); + + applications.forEach(application -> System.out.println(application + " validation " + application.getStatus())); + + } + + } +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson02/StatefulValidation.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson02/StatefulValidation.java new file mode 100644 index 0000000..05801ef --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson02/StatefulValidation.java @@ -0,0 +1,50 @@ +package org.sw.lesson02; + +import org.sw.facts.*; +import org.sw.Common; +import org.sw.builder.*; + +import org.kie.api.KieServices; +import org.kie.api.runtime.KieContainer; +import org.kie.api.runtime.KieSession; + +import java.util.List; + +public class StatefulValidation { + public static void main(final String[] args) { + execute(Common.promptForDemo(2, args, 1, 2)); + } + + static void execute(int demo) { + System.out.println("Demo Number " + demo); + KieContainer kieClasspathContainer = KieServices.Factory.get().getKieClasspathContainer(); + KieSession ksession = kieClasspathContainer.newKieSession("StatefulApplicationValidationDemo" + demo); + + List applications = ApplicationRepository.getApplications(); + applications.forEach(ksession::insert); + +/* List claims = ClaimRepository.getClaims(); + claims.forEach(ksession::insert); + + List policies = PolicyRepository.getPolicies(); + policies.forEach(ksession::insert);*/ + + System.out.println("==== DROOLS SESSION START ==== "); + ksession.fireAllRules(); + if (Common.disposeSession) { + ksession.dispose(); + } + System.out.println("==== DROOLS SESSION END ==== "); + + System.out.println("==== VALIDATION STATUS AFTER SESSION === "); + applications.forEach(application -> { + if (demo == 1) { + System.out.println(application+ " result: Application " + application.getStatus() ); + } + if (demo == 2) { + System.out.println(application + " result: " + application.getStatus() + ", reason: " + application.getReason()); + } + }); + + } +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson03/CrossValidation.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson03/CrossValidation.java new file mode 100644 index 0000000..d2c1bdd --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson03/CrossValidation.java @@ -0,0 +1,75 @@ +package org.sw.lesson03; + +import org.sw.builder.ApplicationRepository; +import org.sw.builder.ClientIdRepository; +import org.sw.facts.Application; +import org.sw.facts.Claim; +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import org.sw.builder.ClaimRepository; +import org.sw.builder.PolicyRepository; +import org.sw.Common; + +import org.kie.api.KieServices; +import org.kie.api.runtime.KieContainer; +import org.kie.api.runtime.KieSession; + +import java.util.List; + +public class CrossValidation { + public static void main(final String[] args) { + execute(Common.promptForDemo(3, args, 1, 3)); + } + + + static void execute(int demo) { + System.out.println("Demo Number " + demo); + + if (demo == 1) { + KieContainer kieClasspathContainer = KieServices.Factory.get().getKieClasspathContainer(); + KieSession ksession = kieClasspathContainer.newKieSession("CrossValidationDemo" + demo); + + List claims = ClaimRepository.getClaims(); + claims.forEach(ksession::insert); + + List applications = ApplicationRepository.getApplications(); + applications.forEach(ksession::insert); + + List policies = PolicyRepository.getPolicies(); + policies.forEach(ksession::insert); + + System.out.println("==== DROOLS SESSION START ==== "); + ksession.fireAllRules(); + if (Common.disposeSession) { + ksession.dispose(); + } + System.out.println("==== DROOLS SESSION END ==== "); + + System.out.println("==== CLAIMS VALIDATION STATUS AFTER SESSION === "); + claims.forEach(claim -> System.out.println(claim + " verdict: " + claim.getStatus()) + ); + } + + if (demo >= 2) { + KieContainer kieClasspathContainer = KieServices.Factory.get().getKieClasspathContainer(); + KieSession ksession = kieClasspathContainer.newKieSession("CrossValidationDemo" + demo); + + List applications = ApplicationRepository.getApplications(); + applications.forEach(ksession::insert); + + List clientIDs = ClientIdRepository.getClientIDs(); + clientIDs.forEach(ksession::insert); + + + System.out.println("==== DROOLS SESSION START ==== "); + ksession.fireAllRules(); + if (Common.disposeSession) { + ksession.dispose(); + } + System.out.println("==== DROOLS SESSION END ==== "); + + System.out.println("==== APPLICATIONS AFTER DROOLS SESSION === "); + applications.forEach(application -> System.out.println(application + " verdict: " + application.getStatus())); + } + } +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson04/EventStream.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson04/EventStream.java new file mode 100644 index 0000000..dd29694 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson04/EventStream.java @@ -0,0 +1,68 @@ +package org.sw.lesson04; + +import org.kie.api.event.rule.*; + +import java.io.PrintStream; + +public class EventStream extends DebugAgendaEventListener { + private PrintStream stream; + + public EventStream() { + super(); + } + + public EventStream(PrintStream stream) { + super(stream); + this.stream = stream; + } + + @Override + public void matchCancelled(MatchCancelledEvent event) { + //super.matchCancelled(event); + } + + @Override + public void matchCreated(MatchCreatedEvent event) { + //super.matchCreated(event); + } + + @Override + public void afterMatchFired(AfterMatchFiredEvent event) { + //super.afterMatchFired(event); + } + + @Override + public void agendaGroupPopped(AgendaGroupPoppedEvent event) { + stream.println("==> " + event.getAgendaGroup() + " popped from stack "); + } + + @Override + public void agendaGroupPushed(AgendaGroupPushedEvent event) { + stream.println("==> " + event.getAgendaGroup() + " pushed to stack "); + } + + @Override + public void beforeMatchFired(BeforeMatchFiredEvent event) { + //super.beforeMatchFired(event); + } + + @Override + public void beforeRuleFlowGroupActivated(RuleFlowGroupActivatedEvent event) { + //super.beforeRuleFlowGroupActivated(event); + } + + @Override + public void afterRuleFlowGroupActivated(RuleFlowGroupActivatedEvent event) { + //super.afterRuleFlowGroupActivated(event); + } + + @Override + public void beforeRuleFlowGroupDeactivated(RuleFlowGroupDeactivatedEvent event) { + //super.beforeRuleFlowGroupDeactivated(event); + } + + @Override + public void afterRuleFlowGroupDeactivated(RuleFlowGroupDeactivatedEvent event) { + //super.afterRuleFlowGroupDeactivated(event); + } +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson04/FactInsertionAndExecutionOrder.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson04/FactInsertionAndExecutionOrder.java new file mode 100644 index 0000000..9412823 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson04/FactInsertionAndExecutionOrder.java @@ -0,0 +1,83 @@ +package org.sw.lesson04; + +import org.kie.api.event.rule.ObjectDeletedEvent; +import org.kie.api.event.rule.ObjectInsertedEvent; +import org.kie.api.event.rule.ObjectUpdatedEvent; +import org.kie.api.event.rule.RuleRuntimeEventListener; +import org.kie.api.runtime.rule.Agenda; +import org.kie.api.KieServices; +import org.kie.api.runtime.KieContainer; +import org.kie.api.runtime.KieSession; + +import org.sw.facts.*; +import org.sw.builder.*; +import org.sw.Common; + +import java.time.LocalDate; +import java.util.List; +import java.util.stream.Collectors; + +public class FactInsertionAndExecutionOrder { + public static void main(final String[] args) { + execute(Common.promptForDemo(4, args, 1, 5)); + } + + + static void execute(int demo) { + System.out.println("Demo Number " + demo); + + KieContainer kieClasspathContainer = KieServices.Factory.get().getKieClasspathContainer(); + KieSession ksession = kieClasspathContainer.newKieSession("FactInsertionAndExecutionOrderDemo" + demo); + + ksession.addEventListener(new EventStream(System.out)); + + List claims = ClaimRepository.getClaims(); + + if (demo == 5) { + if (Common.promptForYesNoQuestion("Do you want to set all claims to 1,000,000?")) { + System.out.println("All claims set to 1,000,000"); + claims.forEach(claim -> claim.setClaimAmount(1000000)); + } + } + + claims.forEach(ksession::insert); + + List policies = PolicyRepository.getPolicies(); + policies.forEach(ksession::insert); + +/* List applications = ApplicationRepository.getApplications(); + applications.forEach(ksession::insert); + + List clientIDs = ClientIdRepository.getClientIDs(); + clientIDs.forEach(ksession::insert);*/ + + if (demo == 3) { + Agenda agenda = ksession.getAgenda(); + agenda.getAgendaGroup("issue-payout").setFocus(); + agenda.getAgendaGroup("valid-claim").setFocus(); + agenda.getAgendaGroup("invalid-claim").setFocus(); + } + + if (demo == 4 || demo == 5) { + Agenda agenda = ksession.getAgenda(); + agenda.getAgendaGroup("issue-payout").setFocus(); + agenda.getAgendaGroup("claim-validation").setFocus(); + } + + System.out.println("==== DROOLS SESSION START ==== "); + ksession.fireAllRules(); + System.out.println("==== DROOLS SESSION END ==== "); + + List payoutObjects = ksession + .getObjects(o -> o.getClass() == Payout.class).stream() + .map(o -> (Payout) o) + .collect(Collectors.toList()); + System.out.println("==== PAYOUTS ISSUED ==== "); + payoutObjects.forEach(System.out::println); + + if (Common.disposeSession) { + ksession.dispose(); + } + + } +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson05/InsertLogicalAndFactObjects.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson05/InsertLogicalAndFactObjects.java new file mode 100644 index 0000000..7c392dd --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson05/InsertLogicalAndFactObjects.java @@ -0,0 +1,81 @@ +package org.sw.lesson05; + +import org.kie.api.KieServices; +import org.kie.api.runtime.KieSession; +import org.kie.api.event.rule.ObjectDeletedEvent; +import org.kie.api.event.rule.ObjectInsertedEvent; +import org.kie.api.event.rule.ObjectUpdatedEvent; +import org.kie.api.event.rule.RuleRuntimeEventListener; +import java.util.List; +import java.util.stream.Collectors; + +import org.sw.builder.*; +import org.sw.facts.*; +import org.sw.Common; + +public class InsertLogicalAndFactObjects { + public static void main(final String[] args) { + execute(Common.promptForDemo(5, args, 1, 4)); + } + + + static void execute(int demo) { + System.out.println("Running Demo " + demo); + SessionData sessionData = new SessionData(); + + KieSession ksession = KieServices.Factory.get().getKieClasspathContainer().newKieSession("InsertLogicalAndFactObjectsDemo" + demo); + + List claims = ClaimRepository.getClaims(); + claims.forEach(ksession::insert); + + List policies = PolicyRepository.getPolicies(); + policies.forEach(ksession::insert); + + ksession.addEventListener(new RuleRuntimeEventListener() { + @Override + public void objectInserted(ObjectInsertedEvent event) { + System.out.println("==> " + event.getObject() + " inserted"); + } + + @Override + public void objectUpdated(ObjectUpdatedEvent event) { + System.out.println("==> " + event.getObject() + " updated"); + } + + @Override + public void objectDeleted(ObjectDeletedEvent event) { + System.out.println("==> " + event.getOldObject() + " deleted"); + } + }); + + System.out.println("==== DROOLS SESSION START ==== "); + ksession.fireAllRules(); + System.out.println("==== DROOLS SESSION END ==== "); + + if (demo > 1) { + System.out.println("==== VALID CLAIMS INSERTED === "); + sessionData.validClaims = ksession.getObjects(o -> o.getClass() == ValidClaim.class).stream() + .map(o -> (ValidClaim) o) + .collect(Collectors.toList()); + sessionData.validClaims.forEach(System.out::println); + + System.out.println("==== INVALID CLAIMS INSERTED === "); + sessionData.invalidClaims = ksession.getObjects(o -> o.getClass() == InvalidClaim.class).stream() + .map(o -> (InvalidClaim) o) + .collect(Collectors.toList()); + sessionData.invalidClaims.forEach(System.out::println); + + List payoutObjects = ksession + .getObjects(o -> o.getClass() == Payout.class).stream() + .map(o -> (Payout) o) + .collect(Collectors.toList()); + System.out.println("== PAYOUTS ISSUED == "); + payoutObjects.forEach(System.out::println); + } + + if (Common.disposeSession) { + ksession.dispose(); + } + + } +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson06/ObjectGroupValidation.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson06/ObjectGroupValidation.java new file mode 100644 index 0000000..f427801 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson06/ObjectGroupValidation.java @@ -0,0 +1,80 @@ +package org.sw.lesson06; + +import org.kie.api.event.rule.ObjectDeletedEvent; +import org.kie.api.event.rule.ObjectInsertedEvent; +import org.kie.api.event.rule.ObjectUpdatedEvent; +import org.kie.api.event.rule.RuleRuntimeEventListener; +import org.sw.facts.*; +import org.sw.builder.*; +import org.sw.Common; + +import org.kie.api.KieServices; +import org.kie.api.runtime.KieSession; + +import java.time.LocalDate; +import java.util.Collection; +import java.util.List; + +public class ObjectGroupValidation { + public static void main(final String[] args) { + execute(Common.promptForDemo(6, args, 1, 4)); + } + + static void execute(int demo) { + System.out.println("Running Demo " + demo); + + KieSession ksession = KieServices.Factory.get().getKieClasspathContainer().newKieSession("ObjectGroupValidationDemo" + demo); + + ksession.addEventListener(new RuleRuntimeEventListener() { + @Override + public void objectInserted(ObjectInsertedEvent event) { + System.out.println("==> " + event.getObject() + " inserted"); + } + + @Override + public void objectUpdated(ObjectUpdatedEvent event) { + System.out.println("==> " + event.getObject() + " updated"); + } + + @Override + public void objectDeleted(ObjectDeletedEvent event) { + System.out.println("==> " + event.getOldObject() + " deleted"); + } + }); + + List familyApplications = ApplicationRepository.getFamilyApplications(); + familyApplications.forEach(ksession::insert); + + List clientIDS = ClientIdRepository.getClientIDs(); + if (demo == 3) { + if (Common.promptForYesNoQuestion("Do you want to set all IDs as expired?")) { + System.out.println("All client IDs are now expired"); + clientIDS.forEach(clientID -> clientID.setExpiryDate(LocalDate.MIN)); + } + } + clientIDS.forEach(ksession::insert); + + if (demo == 4) { + List applications = ApplicationRepository.getApplications(); + applications.forEach(ksession::insert); + } + + System.out.println("==== DROOLS SESSION START ==== "); + ksession.fireAllRules(); + System.out.println("==== DROOLS SESSION END ==== "); + + System.out.println("==== INVALID FAMILY APPLICATIONS INSERTED === "); + + Collection invalidApplications = ksession.getObjects(o -> o.getClass() == InvalidFamilyApplication.class); + invalidApplications.forEach(System.out::println); + + Collection policies = ksession.getObjects(o -> o.getClass() == Policy.class); + System.out.println("== NEW POLICIES CREATED == "); + policies.forEach(System.out::println); + + if (Common.disposeSession) { + ksession.dispose(); + } + + } +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson07/CalculatePremium.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson07/CalculatePremium.java new file mode 100644 index 0000000..d397aaf --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson07/CalculatePremium.java @@ -0,0 +1,42 @@ +package org.sw.lesson07; + +import org.kie.api.KieServices; +import org.kie.api.runtime.KieSession; +import org.sw.facts.Application; +import org.sw.facts.Proposal; +import org.sw.builder.ApplicationRepository; + +import java.util.List; +import java.util.stream.Collectors; + + +public class CalculatePremium { + public static void main(final String[] args) { execute(); } + static void execute() { + + System.out.println("Running Lesson07"); + + KieSession ksession = KieServices.Factory.get().getKieClasspathContainer().newKieSession("SpreadsheetDecisionTables"); + + System.out.println("==== APPLICATIONS IN DROOLS SESSION LESSON 07 ==== "); + + List applications = ApplicationRepository.getApplications(); + applications.forEach(ksession::insert); + applications.forEach(System.out::println); + + System.out.println("==== DROOLS SESSION LESSON 07 START ==== "); + ksession.fireAllRules(); + + System.out.println("==== DROOLS SESSION LESSON 07 END ==== "); + + List proposals = ksession + .getObjects(o -> o.getClass() == Proposal.class).stream() + .map(proposal -> (Proposal) proposal) + .collect(Collectors.toList()); + System.out.println("==== PROPOSALS ISSUED ==== "); + proposals.forEach(System.out::println); + + ksession.dispose(); + } + +} \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson07/CalculatePremiumStateless.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson07/CalculatePremiumStateless.java new file mode 100644 index 0000000..be79641 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson07/CalculatePremiumStateless.java @@ -0,0 +1,41 @@ +package org.sw.lesson07; + +import org.kie.api.KieServices; +import org.kie.api.runtime.KieContainer; +import org.kie.api.runtime.StatelessKieSession; +import org.sw.facts.Application; +import org.sw.facts.Proposal; +import org.sw.builder.ApplicationRepository; + +import java.util.ArrayList; +import java.util.List; + +public class CalculatePremiumStateless { + public static void main(final String[] args) { + execute(); + } + + static void execute() { + System.out.println("Running Lesson07 as a Stateless Session"); + + List applications = ApplicationRepository.getApplications(); + System.out.println("==== APPLICATIONS IN DROOLS SESSION LESSON 07 ==== "); + applications.forEach(System.out::println); + + List proposals = new ArrayList<>(); + + KieServices ks = KieServices.Factory.get(); + KieContainer kc = ks.getKieClasspathContainer(); + StatelessKieSession ksession = kc.newStatelessKieSession("SpreadsheetDecisionTablesStateless"); + + ksession.setGlobal("proposalsList", proposals ); + + System.out.println("==== DROOLS SESSION LESSON 07 START ==== "); + ksession.execute(applications); + System.out.println("==== DROOLS SESSION LESSON 07 END ==== "); + + System.out.println("==== PROPOSALS ISSUED ==== "); + proposals.forEach(System.out::println); + } + +} diff --git a/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson07/ConvertXlsxToDrl.java b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson07/ConvertXlsxToDrl.java new file mode 100644 index 0000000..ddab659 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/java/org/sw/lesson07/ConvertXlsxToDrl.java @@ -0,0 +1,36 @@ +package org.sw.lesson07; + +import org.drools.compiler.compiler.DecisionTableFactory; +import org.drools.core.builder.conf.impl.DecisionTableConfigurationImpl; +import org.drools.core.io.impl.FileSystemResource; +import org.kie.internal.builder.DecisionTableConfiguration; + +import java.io.File; +import java.net.URL; +import java.util.Objects; + +public class ConvertXlsxToDrl { + public static void main(String[] args) { + + DecisionTableConfiguration decisionTableConfiguration = new DecisionTableConfigurationImpl(); + + FileSystemResource spreadsheetFile = + new FileSystemResource(getFile()); + + String generatedDrl = DecisionTableFactory.loadFromResource(spreadsheetFile, decisionTableConfiguration); + + System.out.println(); + System.out.println(" =================== GENERATED RULES =================== "); + System.out.println(); + System.out.println(generatedDrl); + System.out.println(); + System.out.println(" ========================== END ========================== "); + System.out.println(); + } + + private static File getFile() { + ClassLoader classLoader = ConvertXlsxToDrl.class.getClassLoader(); + URL resource = classLoader.getResource("org.sw/lesson07/ruleSpreadsheet.xls"); + return new File(Objects.requireNonNull(resource).getFile()); + } +} diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/META-INF/kmodule.xml b/Course Material/Day three/insurance/insurance/src/main/resources/META-INF/kmodule.xml new file mode 100644 index 0000000..94bb419 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/META-INF/kmodule.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson01/demo1/ApplicationValidation.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson01/demo1/ApplicationValidation.drl new file mode 100644 index 0000000..823b268 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson01/demo1/ApplicationValidation.drl @@ -0,0 +1,17 @@ +package org.sw.lesson01.demo1; + +import org.sw.facts.Application; + +rule "Invalidate application with Pre-existing conditions, underage, or unemployed" + when + Application( clientAge < 18 || !employed || PEC ) + then + System.out.println("Application Invalid - Client is minor, unemployed, or has PECs"); +end + +rule "Valid Application" + when + Application( clientAge >= 18 && employed && !PEC ) + then + System.out.println("Application Validated"); +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson01/demo2/ApplicationValidation.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson01/demo2/ApplicationValidation.drl new file mode 100644 index 0000000..07e5a8c --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson01/demo2/ApplicationValidation.drl @@ -0,0 +1,34 @@ +package org.sw.lesson01.demo2; + +import org.sw.facts.Application; + +rule "Invalid application - underaged" + dialect "java" + when + Application( clientAge < 18 ) + then + System.out.println("Application Invalid – client is underaged"); +end + +rule "Invalid application – unemployed" + dialect "java" + when + Application( !employed ) + then + System.out.println("Application Invalid – client is unemployed"); +end + +rule "Invalid application – has pre-existing conditions" + dialect "java" + when + Application( PEC ) + then + System.out.println("Application Invalid – client has PECs"); +end + +rule "Valid Application" + when + $application: Application( clientAge >= 18 && employed && !PEC ) + then + System.out.println("Application Validated"); +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson01/demo3/ApplicationValidation.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson01/demo3/ApplicationValidation.drl new file mode 100644 index 0000000..4b37952 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson01/demo3/ApplicationValidation.drl @@ -0,0 +1,27 @@ +package org.sw.lesson01.demo3; + +import org.sw.facts.Application; + +rule "Invalid application from minor" + dialect "java" + when + $application: Application( $clientAge: clientAge < 18 ) + then + System.out.println($application + ": Invalid – client age: " + $clientAge); +end + +rule "Invalid application – unemployed" + dialect "java" + when + $application: Application( $employed: employed == false ) + then + System.out.println($application + ": Invalid – unemployed: " + $employed); +end + +rule "Valid Application" + dialect "java" + when + $application: Application( employed, clientAge >= 18 ) + then + System.out.println($application + ": Validated"); +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson01/demo4/ApplicationValidation.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson01/demo4/ApplicationValidation.drl new file mode 100644 index 0000000..1ea6781 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson01/demo4/ApplicationValidation.drl @@ -0,0 +1,40 @@ +package org.sw.lesson01.demo4; + +import org.sw.facts.Application; +import org.sw.facts.Status; + +rule "Valid Application" + dialect "java" + when + $application: Application( !PEC , employed , clientAge >= 18 ) + then + System.out.println($application + ": Validated"); + $application.setStatus(Status.APPROVED); +end + +rule "Invalid application - minor" + dialect "java" + when + $application: Application( clientAge < 18 ) + then + System.out.println($application + ": Invalid – Client age: " + $application.getClientAge()); + $application.setStatus(Status.DENIED); +end + +rule "Invalid application - unemployed" + dialect "java" + when + $application: Application( !employed ) + then + System.out.println($application + ": Invalid - Client unemployed"); + $application.setStatus(Status.DENIED); +end + +rule "Invalid application - Pre-existing Condition" + dialect "java" + when + $application: Application( PEC ) + then + System.out.println($application + ": Invalid - Client has PEC"); + $application.setStatus(Status.DENIED); +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson01/demo5/ApplicationValidation.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson01/demo5/ApplicationValidation.drl new file mode 100644 index 0000000..8798688 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson01/demo5/ApplicationValidation.drl @@ -0,0 +1,40 @@ +package org.sw.lesson01.demo5; + +import org.sw.facts.Application; +import org.sw.facts.Status; + +rule "Invalid application - minor" + dialect "java" + when + $application: Application( clientAge < 18 ) + then + System.out.println($application + ": Invalid – Client age: " + $application.getClientAge()); + $application.setStatus(Status.DENIED); +end + +rule "Invalid application - unemployed" + dialect "java" + when + $application: Application( !employed ) + then + System.out.println($application + ": Invalid - Client unemployed"); + $application.setStatus(Status.DENIED); +end + +rule "Invalid application - Pre-existing Condition" + dialect "java" + when + $application: Application( PEC ) + then + System.out.println($application + ": Invalid - Client has PEC"); + $application.setStatus(Status.DENIED); +end + +rule "Valid Application" + dialect "java" + when + $application: Application( status == Status.PENDING ) + then + System.out.println($application + ": Not Invalidated - Approval Granted"); + $application.setStatus(Status.APPROVED); +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson02/demo1/ApplicationValidation.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson02/demo1/ApplicationValidation.drl new file mode 100644 index 0000000..4357816 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson02/demo1/ApplicationValidation.drl @@ -0,0 +1,45 @@ +package org.sw.lesson02.demo1; + +import org.sw.facts.Application; +import org.sw.facts.Status; + +rule "Invalidate application if not employed" + dialect "java" + when + $application: Application( !employed ) + then + System.out.println($application + ": Invalid – Unemployed"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate application from minor" + when + $application: Application( clientAge < 18 ) + then + System.out.println($application + ": Invalid – Minor"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Invalid application – has pre-existing conditions" + when + $application: Application( PEC ) + then + System.out.println($application + ": Invalid – Client has PEC"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Valid Application" + when + $application: Application( status == Status.PENDING ) + then + System.out.println($application + ": Approval Granted!"); + modify($application) { + setStatus(Status.APPROVED) + } +end diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson02/demo1/ClaimAndPolicyValidation.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson02/demo1/ClaimAndPolicyValidation.drl new file mode 100644 index 0000000..30dcd33 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson02/demo1/ClaimAndPolicyValidation.drl @@ -0,0 +1,31 @@ +/* +package org.sw.lesson02.demo1; + +import org.sw.facts.Policy; +import org.sw.facts.Claim; +import org.sw.facts.Status +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; + +rule "Invalidate Policy with unpaid Premium" + when + $policy: Policy( $paymentStatus: paymentStatus == "Unpaid" ) + then + System.out.println($policy + " Invalid!"); + modify($policy){ + setStatus(Status.INVALID) + } +end + +rule "Invalidate Old Claims" + dialect "java" + when + $claim : Claim( $dateOfClaim : dateOfClaim, status != Status.DENIED, + ChronoUnit.YEARS.between($dateOfClaim, LocalDate.now()) > 2 ) + then + System.out.println("Claim " + $claim + " invalidated due to being older than 2 years."); + modify($claim) { + setStatus(Status.DENIED), + setReason("Claim is older than 2 years") + }; +end*/ diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson02/demo2/ApplicationValidation.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson02/demo2/ApplicationValidation.drl new file mode 100644 index 0000000..9cee882 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson02/demo2/ApplicationValidation.drl @@ -0,0 +1,52 @@ +package org.sw.lesson02.demo2; + +import org.sw.facts.Application; +import org.sw.facts.Status; + +rule "Invalidate application if not employed" + dialect "java" + when + $application: Application( !employed ) + then + System.out.println($application + ": Invalid – Unemployed"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client unemployed") + } +end + +rule "Invalidate application from minor" + dialect "java" + when + $application: Application( clientAge < 18 ) + + then + System.out.println($application + ": Invalid – Minor"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client underaged") + } +end + +rule "Invalid application – has pre-existing conditions" + dialect "java" + when + $application: Application( PEC ) + then + System.out.println($application + ": Invalid – Client has PEC"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client has PEC") + } +end + +rule "Valid Application" + dialect "java" + when + $application: Application( status == Status.PENDING ) + then + System.out.println($application + ": Approval Granted!"); + modify($application) { + setStatus(Status.APPROVED) + } +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson03/demo1/ClaimPolicyCrossCheck.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson03/demo1/ClaimPolicyCrossCheck.drl new file mode 100644 index 0000000..dc350b4 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson03/demo1/ClaimPolicyCrossCheck.drl @@ -0,0 +1,17 @@ +package org.sw.lesson03.demo1; + +import org.sw.facts.Application; +import org.sw.facts.Policy; +import org.sw.facts.Status; + +rule "Invalidate Application with Existing Policy" + dialect "java" + when + $application: Application( status != Status.DENIED ) + $policy: Policy( clientName == $application.clientName ) + then + System.out.println($application + " Invalidated"); + modify($application) { + setStatus(Status.DENIED) + } +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson03/demo1/ClaimValidation.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson03/demo1/ClaimValidation.drl new file mode 100644 index 0000000..794f5ca --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson03/demo1/ClaimValidation.drl @@ -0,0 +1,52 @@ +package org.sw.lesson03.demo1; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; + +rule "Invalidate claim without matching policy" + dialect "java" + when + $claim: Claim( ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + then + System.out.println($claim + ": failed (no matching policy)"); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + when + $claim: Claim( ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + when + $claim: Claim( ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + System.out.println($claim + ": failed. Unpaid premiums in " + $policy); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Valid Claims" + dialect "java" + when + $claim: Claim( status == Status.PENDING ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + modify($claim) { + setStatus(Status.APPROVED) + } +end diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson03/demo2/ApplicationIDCrossValidation.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson03/demo2/ApplicationIDCrossValidation.drl new file mode 100644 index 0000000..bd6cbee --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson03/demo2/ApplicationIDCrossValidation.drl @@ -0,0 +1,42 @@ +package org.sw.lesson03.demo2; + +import org.sw.facts.Application; +import org.sw.facts.ClientID; +import org.sw.facts.Status; +import java.time.LocalDate; + +rule "Invalidate applications with missing ID" + dialect "java" + when + $application: Application( ) + not ClientID( idNumber == $application.clientIdNumber ) + then + System.out.println($application + " Invalid – No matching ID found"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate applications with incorrect name" + dialect "java" + when + $application: Application( ) + $clientID: ClientID( idNumber == $application.clientIdNumber, name != $application.clientName ) + then + System.out.println($application + " Invalid – Name [" + $application.getClientName() + "] not matching name on ID [" + $clientID.getName() + "]"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate applications with Expired ID" + dialect "java" + when + $application: Application( ) + $clientid: ClientID( idNumber == $application.clientIdNumber, isExpired() ) + then + System.out.println($application + " Invalid – " + $clientid + " ID expired"); + modify($application) { + setStatus(Status.DENIED) + } +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson03/demo2/ApplicationValidation.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson03/demo2/ApplicationValidation.drl new file mode 100644 index 0000000..c811c96 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson03/demo2/ApplicationValidation.drl @@ -0,0 +1,52 @@ +package org.sw.lesson03.demo2; + +import org.sw.facts.Application; +import org.sw.facts.Status; + +rule "Invalidate application if not employed" + dialect "java" + when + $application: Application( !employed ) + then + System.out.println($application + ": Invalid – Unemployed"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client unemployed") + } +end + +rule "Invalidate application from minor" + dialect "java" + when + $application: Application( clientAge < 18 ) + + then + System.out.println($application + ": Invalid – Minor"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client underaged") + } +end + +rule "Invalid application – has pre-existing conditions" + dialect "java" + when + $application: Application( PEC ) + then + System.out.println($application + ": Invalid – Client has PEC"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client has PEC") + } +end + +rule "Valid Application" + dialect "java" + when + $application: Application( status == Status.PENDING ) + then + System.out.println($application + ": Approval Granted!"); + modify($application) { + setStatus(Status.APPROVED) + } +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson03/demo3/ApplicationIDCrossValidation.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson03/demo3/ApplicationIDCrossValidation.drl new file mode 100644 index 0000000..7b652d1 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson03/demo3/ApplicationIDCrossValidation.drl @@ -0,0 +1,43 @@ +package org.sw.lesson03.demo3; + +import org.sw.facts.Application; +import org.sw.facts.ClientID; +import org.sw.facts.Status; +import java.time.LocalDate; + +rule "Invalidate Applications with missing ID" + dialect "java" + when + $application: Application( status != Status.DENIED ) + not ClientID( idNumber == $application.getClientIdNumber()) + then + System.out.println($application + " Invalid – No matching ID found"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate applications with incorrect name" + dialect "java" + when + $application: Application( status != Status.DENIED ) + $clientID: ClientID( idNumber == $application.getClientIdNumber(), name != $application.clientName ) + then + System.out.println($application + " Invalid – Name [" + $application.getClientName() + "] not matching name on ID [" + $clientID.getName() + "]"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate Applications with Expired ID" + dialect "java" + when + $application: Application( status != Status.DENIED ) + $clientid: ClientID( idNumber == $application.getClientIdNumber(), + expiryDate.isBefore(LocalDate.now()) ) + then + System.out.println($application + " Invalid – " + $clientid + " ID expired"); + modify($application) { + setStatus(Status.DENIED) + } +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson03/demo3/ApplicationValidation.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson03/demo3/ApplicationValidation.drl new file mode 100644 index 0000000..bc90a35 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson03/demo3/ApplicationValidation.drl @@ -0,0 +1,55 @@ +package org.sw.lesson03.demo3; + +import org.sw.facts.Application; +import org.sw.facts.Status; + +rule "Invalidate application if not employed" + dialect "java" + when + $application: Application( !employed, + status != Status.DENIED ) + then + System.out.println($application + ": Invalid – Unemployed"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client unemployed") + } +end + +rule "Invalidate application from minor" + dialect "java" + when + $application: Application( clientAge < 18, + status != Status.DENIED ) + + then + System.out.println($application + ": Invalid – Minor"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client underaged") + } +end + +rule "Invalid application – has pre-existing conditions" + dialect "java" + when + $application: Application( PEC, + status != Status.DENIED ) + then + System.out.println($application + ": Invalid – Client has PEC"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client has PEC") + } +end + +rule "Valid Application" + dialect "java" + when + $application: Application( status == Status.PENDING ) + then + System.out.println($application + ": Approval Granted!"); + modify($application) { + setStatus(Status.APPROVED) + } +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo1/ClaimValidation.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo1/ClaimValidation.drl new file mode 100644 index 0000000..974da63 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo1/ClaimValidation.drl @@ -0,0 +1,51 @@ +package org.sw.lesson04.demo1; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; +import org.sw.facts.Payout; + +rule "Valid Claims" + dialect "java" + when + $claim: Claim( status == Status.PENDING ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + modify($claim) { + setStatus(Status.APPROVED) + } +end + +rule "Issue Payout" + dialect "java" + when + $claim: Claim(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insert( payout ); +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + System.out.println($claim + ": failed. Unpaid premiums in " + $policy); + modify($claim) { + setStatus(Status.DENIED) + } +end diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo2/ClaimValidation.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo2/ClaimValidation.drl new file mode 100644 index 0000000..2dfbe8e --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo2/ClaimValidation.drl @@ -0,0 +1,56 @@ +package org.sw.lesson04.demo2; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; + +rule "Valid Claims" + dialect "java" + salience 20 + when + $claim: Claim( status == Status.PENDING ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + modify($claim) { + setStatus(Status.APPROVED) + } +end + +rule "Invalidate claim without matching policy" + dialect "java" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + then + System.out.println($claim + ": failed (no matching policy)"); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + System.out.println($claim + ": failed. Unpaid premiums in " + $policy); + modify($claim) { + setStatus(Status.DENIED) + } +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo2/PayoutIssue.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo2/PayoutIssue.drl new file mode 100644 index 0000000..07ff371 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo2/PayoutIssue.drl @@ -0,0 +1,16 @@ +package org.sw.lesson04.demo2; + +import org.sw.facts.Claim; +import org.sw.facts.Status; +import org.sw.facts.Payout; + +rule "Issue Payout" + dialect "java" + salience 0 + when + $claim: Claim(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insert( payout ); +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo3/ClaimValidation.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo3/ClaimValidation.drl new file mode 100644 index 0000000..0d8052c --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo3/ClaimValidation.drl @@ -0,0 +1,56 @@ +package org.sw.lesson04.demo3; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; + +rule "Valid Claims" + dialect "java" + agenda-group "valid-claim" + when + $claim: Claim( status == Status.PENDING ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + modify($claim) { + setStatus(Status.APPROVED) + } +end + +rule "Invalidate claim without matching policy" + dialect "java" + agenda-group "invalid-claim" + when + $claim: Claim( status != Status.DENIED ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + then + System.out.println($claim + ": failed (no matching policy)"); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + agenda-group "invalid-claim" + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + agenda-group "invalid-claim" + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + System.out.println($claim + ": failed. Unpaid premiums in " + $policy); + modify($claim) { + setStatus(Status.DENIED) + } +end diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo3/PayoutIssue.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo3/PayoutIssue.drl new file mode 100644 index 0000000..90c9915 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo3/PayoutIssue.drl @@ -0,0 +1,19 @@ +package org.sw.lesson04.demo3; + +import java.util.Random; +import org.sw.facts.Claim; +import org.sw.facts.Application; +import org.sw.facts.Policy; +import org.sw.facts.Status; +import org.sw.facts.Payout; + +rule "Issue Payout" + dialect "java" + agenda-group "issue-payout" + when + $claim: Claim(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insert( payout ); +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo4/ClaimValidation.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo4/ClaimValidation.drl new file mode 100644 index 0000000..bbcf561 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo4/ClaimValidation.drl @@ -0,0 +1,60 @@ +package org.sw.lesson04.demo4; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; + +rule "Valid Claims" + dialect "java" + agenda-group "claim-validation" + salience 20 + when + $claim: Claim( status == Status.PENDING ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + modify($claim) { + setStatus(Status.APPROVED) + } +end + +rule "Invalidate claim without matching policy" + dialect "java" + agenda-group "claim-validation" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + then + System.out.println($claim + ": failed (no matching policy)"); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + agenda-group "claim-validation" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + agenda-group "claim-validation" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + System.out.println($claim + ": failed. Unpaid premiums in " + $policy); + modify($claim) { + setStatus(Status.DENIED) + } +end diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo4/PayoutIssue.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo4/PayoutIssue.drl new file mode 100644 index 0000000..a42ca92 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo4/PayoutIssue.drl @@ -0,0 +1,16 @@ +package org.sw.lesson04.demo4; + +import org.sw.facts.Claim; +import org.sw.facts.Status; +import org.sw.facts.Payout; + +rule "Issue Payout" + dialect "java" + agenda-group "issue-payout" + when + $claim: Claim(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insert( payout ); +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo5/ClaimValidation.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo5/ClaimValidation.drl new file mode 100644 index 0000000..dbf3753 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo5/ClaimValidation.drl @@ -0,0 +1,60 @@ +package org.sw.lesson04.demo5; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; + +rule "Valid Claims" + dialect "java" + agenda-group "claim-validation" + salience 20 + when + $claim: Claim( status == Status.PENDING ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + modify($claim) { + setStatus(Status.APPROVED) + } +end + +rule "Invalidate claim without matching policy" + dialect "java" + agenda-group "claim-validation" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + then + System.out.println($claim + ": failed (no matching policy)"); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + agenda-group "claim-validation" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + agenda-group "claim-validation" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + System.out.println($claim + ": failed. Unpaid premiums in " + $policy); + modify($claim) { + setStatus(Status.DENIED) + } +end diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo5/PayoutIssue.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo5/PayoutIssue.drl new file mode 100644 index 0000000..a9a2142 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo5/PayoutIssue.drl @@ -0,0 +1,16 @@ +package org.sw.lesson04.demo5; + +import org.sw.facts.Claim; +import org.sw.facts.Status; +import org.sw.facts.Payout; + +rule "Issue Payout" + dialect "java" + agenda-group "issue-payout" + when + $claim: Claim(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insert( payout ); +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo5/Verdict.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo5/Verdict.drl new file mode 100644 index 0000000..a79c3ee --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson04/demo5/Verdict.drl @@ -0,0 +1,25 @@ +package org.sw.lesson04.demo5; + +import org.sw.facts.Payout +import org.sw.facts.Claim +import org.sw.facts.Status + +rule "Report Payouts Issued" + dialect "java" + activation-group "verdict" + salience 20 + when + Payout() + then + System.out.println("Verdict: Payouts were issued this session"); +end + +rule "Report No Payouts" + dialect "java" + activation-group "verdict" + salience 10 + when + Claim( status == Status.DENIED ) + then + System.out.println("Verdict: No Payouts issued this session"); +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo1/ClaimValidation.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo1/ClaimValidation.drl new file mode 100644 index 0000000..83e5eca --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo1/ClaimValidation.drl @@ -0,0 +1,63 @@ +package org.sw.lesson05.demo1; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; +import org.sw.facts.Payout; + +rule "Valid Claims" + dialect "java" + when + $claim: Claim( status == Status.PENDING ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + modify($claim) { + setStatus(Status.APPROVED) + } +end + +rule "Issue Payout" + dialect "java" + when + $claim: Claim(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insertLogical( payout ); +end + +rule "Invalidate claim without matching policy" + dialect "java" + when + $claim: Claim( status != Status.DENIED ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + then + System.out.println($claim + ": failed (no matching policy)"); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + System.out.println($claim + ": failed. Unpaid premiums in " + $policy); + modify($claim) { + setStatus(Status.DENIED) + } +end diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo2/ClaimValidation.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo2/ClaimValidation.drl new file mode 100644 index 0000000..ccda17c --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo2/ClaimValidation.drl @@ -0,0 +1,48 @@ +package org.sw.lesson05.demo2; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; +import org.sw.facts.Payout; +import org.sw.facts.InvalidClaim; +import org.sw.facts.ValidClaim; + +rule "Valid Claims" + dialect "java" + when + $claim: Claim( ) + not (InvalidClaim( claim == $claim) ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + insertLogical( new ValidClaim($claim) ); +end + +rule "Invalidate claim without matching policy" + dialect "java" + when + $claim: Claim( ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + then + System.out.println($claim + ": failed (no matching policy)"); + insert( new InvalidClaim($claim) ); +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + when + $claim: Claim( ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + insert( new InvalidClaim($claim) ); +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + when + $claim: Claim( ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + System.out.println($claim + ": failed. Unpaid premiums in " + $policy); + insert( new InvalidClaim($claim) ); +end diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo2/PayoutIssue.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo2/PayoutIssue.drl new file mode 100644 index 0000000..4ed915a --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo2/PayoutIssue.drl @@ -0,0 +1,17 @@ +package org.sw.lesson05.demo2; + +import org.sw.facts.Payout +import org.sw.facts.Policy +import org.sw.facts.Claim +import org.sw.facts.ValidClaim; + + +rule "Issue Payout" + dialect "java" + when + $validClaim : ValidClaim( $claim : claim ) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insertLogical( payout ); +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo3/ClaimValidation.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo3/ClaimValidation.drl new file mode 100644 index 0000000..62598ed --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo3/ClaimValidation.drl @@ -0,0 +1,52 @@ +package org.sw.lesson05.demo3; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; +import org.sw.facts.Payout; +import org.sw.facts.InvalidClaim; +import org.sw.facts.ValidClaim; +import org.sw.facts.InvalidPolicy; + +rule "Valid Claims" + dialect "java" + when + $claim: Claim( ) + not (InvalidClaim( claim == $claim) ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + insertLogical( new ValidClaim($claim) ); +end + +rule "Invalidate claim without matching policy" + dialect "java" + when + $claim: Claim( ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + not InvalidClaim( claim.policyNumber == $claim.policyNumber) + then + System.out.println($claim + ": failed (no matching policy)"); + insert( new InvalidClaim($claim) ); +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + when + $claim: Claim( ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + not InvalidClaim( claim.policyNumber == $claim.policyNumber) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + insert( new InvalidClaim($claim) ); +end + +rule "Invalidate claim with invalid policy" + dialect "java" + when + $invalidPolicy: InvalidPolicy( ) + $claim: Claim( policyNumber == $invalidPolicy.policy.policyNumber ) + not InvalidClaim( claim.policyNumber == $claim.policyNumber) + then + System.out.println($claim + ": failed. " + $invalidPolicy + " Invalid"); + insert( new InvalidClaim($claim) ); +end diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo3/PayoutIssue.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo3/PayoutIssue.drl new file mode 100644 index 0000000..364102e --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo3/PayoutIssue.drl @@ -0,0 +1,16 @@ +package org.sw.lesson05.demo3; + +import org.sw.facts.Payout +import org.sw.facts.Policy +import org.sw.facts.Claim +import org.sw.facts.ValidClaim; + +rule "Issue Payout" + dialect "java" + when + $validClaim : ValidClaim( $claim : claim ) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insertLogical( payout ); +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo3/PolicyValidation.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo3/PolicyValidation.drl new file mode 100644 index 0000000..4580edc --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo3/PolicyValidation.drl @@ -0,0 +1,14 @@ +package org.sw.lesson05.demo3; + +import org.sw.facts.Policy +import org.sw.facts.InvalidPolicy + +rule "Invalidate unpaid Policy" + dialect "java" + when + $policy: Policy( paymentStatus == "Unpaid" ) + not InvalidPolicy( policy.policyNumber == $policy.policyNumber) + then + System.out.println("Policy [" + $policy + "] invalidated due to unpaid premiums"); + insert( new InvalidPolicy($policy) ); +end diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo4/ClaimValidation.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo4/ClaimValidation.drl new file mode 100644 index 0000000..ef38a2a --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo4/ClaimValidation.drl @@ -0,0 +1,41 @@ +package org.sw.lesson05.demo4; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; +import org.sw.facts.Payout; +import org.sw.facts.InvalidClaim; +import org.sw.facts.ValidClaim; +import org.sw.facts.InvalidPolicy; + +rule "Invalidate claim without matching policy" + dialect "java" + when + $claim: Claim( ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + not InvalidClaim( claim.policyNumber == $claim.policyNumber) + then + System.out.println($claim + ": failed (no matching policy)"); + insert( new InvalidClaim($claim) ); +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + when + $claim: Claim( ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + insert( new InvalidClaim($claim) ); +end + +rule "Invalidate claim with invalid policy" + dialect "java" + when + $invalidPolicy: InvalidPolicy( ) + $claim: Claim( policyNumber == $invalidPolicy.policy.policyNumber ) + not InvalidClaim( claim.policyNumber == $claim.policyNumber) + then + System.out.println($claim + ": failed. " + $invalidPolicy + " Invalid"); + insert( new InvalidClaim($claim) ); +end diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo4/PolicyValidation.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo4/PolicyValidation.drl new file mode 100644 index 0000000..687db68 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo4/PolicyValidation.drl @@ -0,0 +1,14 @@ +package org.sw.lesson05.demo4; + +import org.sw.facts.Policy +import org.sw.facts.InvalidPolicy + +rule "Invalidate unpaid Policy" + dialect "java" + when + $policy: Policy( paymentStatus == "Unpaid" ) + not InvalidPolicy( policy.policyNumber == $policy.policyNumber) + then + System.out.println("Policy [" + $policy + "] invalidated due to unpaid premiums"); + insert( new InvalidPolicy($policy) ); +end diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo4/XPayoutIssue.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo4/XPayoutIssue.drl new file mode 100644 index 0000000..9898130 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson05/demo4/XPayoutIssue.drl @@ -0,0 +1,17 @@ +package org.sw.lesson05.demo4; + +import org.sw.facts.Payout +import org.sw.facts.Policy +import org.sw.facts.Claim +import org.sw.facts.InvalidClaim; + +rule "Issue Payout" + dialect "java" + when + $claim: Claim( ) + not InvalidClaim( claim.policyNumber == $claim.policyNumber) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insertLogical( payout ); +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo1/FamilyApplication.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo1/FamilyApplication.drl new file mode 100644 index 0000000..6ef783a --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo1/FamilyApplication.drl @@ -0,0 +1,29 @@ +package org.sw.lesson06.demo1; + +import org.sw.facts.FamilyApplication; +import org.sw.facts.InvalidFamilyApplication +import org.sw.facts.InvalidClientID; +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import java.util.Random; + +/*rule "Invalidate family applications with invalid ID" + dialect "java" + when + $familyApplication: FamilyApplication( ) + InvalidClientID( $familyApplication.clientIdNumbers.contains(clientID.idNumber) ) + then + System.out.println( "Set " + $familyApplication + " invalid - invalid ID found"); + insert( new InvalidFamilyApplication($familyApplication) ); +end*/ + +rule "Invalidate family applications with single expired ID" + dialect "java" + salience 50 + when + $familyApplication: FamilyApplication( $ids: clientIdNumbers ) + ClientID( $id: idNumber, isExpired() == true, $id memberOf $ids ) + then + System.out.println( "Set " + $familyApplication + " invalid - expired ID found for ID: " + $id); + insert( new InvalidFamilyApplication($familyApplication) ); +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo1/PolicyIssue.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo1/PolicyIssue.drl new file mode 100644 index 0000000..5c7570c --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo1/PolicyIssue.drl @@ -0,0 +1,31 @@ +package org.sw.lesson06.demo1; + +import org.sw.facts.FamilyApplication; +import org.sw.facts.InvalidFamilyApplication +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import java.util.Random; + +rule "Issue New Policy to Valid Application" + dialect "java" + salience 20 + when + $familyApplication: FamilyApplication() + not InvalidFamilyApplication(familyApplication.applicationNumber == $familyApplication.applicationNumber) + $clientIdNumber: String() from $familyApplication.clientIdNumbers + $clientID: ClientID(idNumber == $clientIdNumber, $name: name) + then + Random random = new Random(); + int premium = 50 + random.nextInt(51); // Random number between 50 and 100 + int coverage = premium * 100; + + Policy newPolicy = new Policy(); + newPolicy.setPolicyNumber($familyApplication.getApplicationNumber()); + newPolicy.setClientName($name); + newPolicy.setPremium(premium); + newPolicy.setCoverage(coverage); + newPolicy.setPaymentStatus("Unpaid"); + + insert(newPolicy); + System.out.println("New policy issued: " + newPolicy); +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo1/ValidateID.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo1/ValidateID.drl new file mode 100644 index 0000000..1b7edae --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo1/ValidateID.drl @@ -0,0 +1,13 @@ +package org.sw.lesson06.demo1; + +import org.sw.facts.ClientID; +import org.sw.facts.InvalidClientID; + +/* +rule "Invalidate Expired ID" + when + $clientID: ClientID( isExpired()) + then + System.out.println($clientID + " is expired."); + insert( new InvalidClientID($clientID)); +end*/ diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo2/FamilyApplication.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo2/FamilyApplication.drl new file mode 100644 index 0000000..4b75342 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo2/FamilyApplication.drl @@ -0,0 +1,18 @@ +package org.sw.lesson06.demo2; + +import org.sw.facts.FamilyApplication; +import org.sw.facts.InvalidFamilyApplication +import org.sw.facts.InvalidClientID; +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import java.util.Random; + +rule "Invalidate family applications with single invalid ID" + dialect "java" + when + $familyApplication: FamilyApplication( ) + exists InvalidClientID( $familyApplication.clientIdNumbers.contains(clientID.idNumber) ) + then + System.out.println( "Set " + $familyApplication + " invalid - invalid ID found"); + insert( new InvalidFamilyApplication($familyApplication) ); +end diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo2/PolicyIssue.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo2/PolicyIssue.drl new file mode 100644 index 0000000..8044da4 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo2/PolicyIssue.drl @@ -0,0 +1,31 @@ +package org.sw.lesson06.demo2; + +import org.sw.facts.FamilyApplication; +import org.sw.facts.InvalidFamilyApplication +import org.sw.facts.InvalidClientID; +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import java.util.Random; + +rule "Issue New Policy to Valid Application" + dialect "java" + when + $familyApplication: FamilyApplication() + not InvalidFamilyApplication(familyApplication.applicationNumber == $familyApplication.applicationNumber) + $clientIdNumber: String() from $familyApplication.clientIdNumbers + $clientID: ClientID(idNumber == $clientIdNumber, $name: name) + then + Random random = new Random(); + int premium = 100 + random.nextInt(201); // Random number between 200 and 300 + int coverage = premium * 100; + + Policy newPolicy = new Policy(); + newPolicy.setPolicyNumber($familyApplication.getApplicationNumber()); + newPolicy.setClientName($name); + newPolicy.setPremium(premium); + newPolicy.setCoverage(coverage); + newPolicy.setPaymentStatus("Unpaid"); + + insertLogical(newPolicy); + System.out.println("New policy issued: " + newPolicy); +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo2/ValidateID.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo2/ValidateID.drl new file mode 100644 index 0000000..5f30c28 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo2/ValidateID.drl @@ -0,0 +1,12 @@ +package org.sw.lesson06.demo2; + +import org.sw.facts.ClientID; +import org.sw.facts.InvalidClientID; + +rule "Invalidate Expired ID" + when + $clientID: ClientID( isExpired()) + then + System.out.println($clientID + " is expired."); + insert( new InvalidClientID($clientID)); +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo3/FamilyApplication.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo3/FamilyApplication.drl new file mode 100644 index 0000000..bcfd8b6 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo3/FamilyApplication.drl @@ -0,0 +1,35 @@ +package org.sw.lesson06.demo3; + +import org.sw.facts.FamilyApplication; +import org.sw.facts.InvalidFamilyApplication +import org.sw.facts.InvalidClientID; +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import java.util.Random; + +/*rule "Invalidate family applications with single Invalid ID" + date-expires "04-May-2010" + enabled false + dialect "java" + when + $familyApplication: FamilyApplication( ) + exists InvalidClientID( $familyApplication.clientIdNumbers.contains(clientID.idNumber) ) + then + System.out.println( "Set " + $familyApplication + " invalid - invalid ID found"); + insert( new InvalidFamilyApplication($familyApplication) ); +end*/ + +rule "Invalidate family application with all IDs expired" + dialect "java" + when + $familyApplication: FamilyApplication( $ids : clientIdNumbers ) + forall ( + $clientIdNumber : String() from $ids, + ClientID( idNumber == $clientIdNumber, isExpired() ) + ) + then + System.out.println( "Set " + $familyApplication + " invalid as all client IDs are expired"); + insert( new InvalidFamilyApplication($familyApplication) ); +end + + diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo3/PolicyIssue.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo3/PolicyIssue.drl new file mode 100644 index 0000000..5856f56 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo3/PolicyIssue.drl @@ -0,0 +1,31 @@ +package org.sw.lesson06.demo3; + +import org.sw.facts.FamilyApplication; +import org.sw.facts.InvalidFamilyApplication +import org.sw.facts.InvalidClientID; +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import java.util.Random; + +rule "Issue New Policy to Valid Application" + dialect "java" + when + $familyApplication: FamilyApplication() + not InvalidFamilyApplication(familyApplication.applicationNumber == $familyApplication.applicationNumber) + $clientIdNumber: String() from $familyApplication.clientIdNumbers + $clientID: ClientID(idNumber == $clientIdNumber, $name: name) + then + Random random = new Random(); + int premium = 50 + random.nextInt(51); // Random number between 50 and 100 + int coverage = premium * 100; + + Policy newPolicy = new Policy(); + newPolicy.setPolicyNumber($familyApplication.getApplicationNumber()); + newPolicy.setClientName($name); + newPolicy.setPremium(premium); + newPolicy.setCoverage(coverage); + newPolicy.setPaymentStatus("Unpaid"); + + insertLogical(newPolicy); + System.out.println("New policy issued: " + newPolicy); +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo3/ValidateID.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo3/ValidateID.drl new file mode 100644 index 0000000..5d2ef87 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo3/ValidateID.drl @@ -0,0 +1,14 @@ +package org.sw.lesson06.demo3; + +import org.sw.facts.ClientID; +import org.sw.facts.InvalidClientID; + +/*rule "Invalidate Expired ID" + date-expires "04-May-2010" + enabled false + when + $clientID: ClientID( isExpired()) + then + System.out.println($clientID + " is expired."); + insert( new InvalidClientID($clientID)); +end*/ diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo4/FamilyApplication.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo4/FamilyApplication.drl new file mode 100644 index 0000000..05bf012 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo4/FamilyApplication.drl @@ -0,0 +1,24 @@ +package org.sw.lesson06.demo4; + +import org.sw.facts.FamilyApplication; +import org.sw.facts.InvalidFamilyApplication +import org.sw.facts.InvalidClientID; +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import org.sw.facts.PrimaryClient; +import java.util.Random; + +rule "Invalidate family application with all IDs expired" + dialect "java" + when + $familyApplication: FamilyApplication( $ids : clientIdNumbers ) + forall ( + $clientIdNumber : String() from $ids, + ClientID( idNumber == $clientIdNumber, isExpired() ) + ) + then + System.out.println( "Set " + $familyApplication + " invalid as all client IDs are expired"); + insert( new InvalidFamilyApplication($familyApplication) ); +end + + diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo4/PolicyIssue.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo4/PolicyIssue.drl new file mode 100644 index 0000000..28709f4 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo4/PolicyIssue.drl @@ -0,0 +1,30 @@ +package org.sw.lesson06.demo4; + +import org.sw.facts.FamilyApplication; +import org.sw.facts.InvalidFamilyApplication +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import java.util.Random; + +rule "Issue New Policy to Valid Application" + dialect "java" + when + $familyApplication: FamilyApplication() + not InvalidFamilyApplication(familyApplication.applicationNumber == $familyApplication.applicationNumber) + $clientIdNumber: String() from $familyApplication.clientIdNumbers + $clientID: ClientID(idNumber == $clientIdNumber, $name: name) + then + Random random = new Random(); + int premium = 50 + random.nextInt(51); // Random number between 50 and 100 + int coverage = premium * 100; + + Policy newPolicy = new Policy(); + newPolicy.setPolicyNumber($familyApplication.getApplicationNumber()); + newPolicy.setClientName($name); + newPolicy.setPremium(premium); + newPolicy.setCoverage(coverage); + newPolicy.setPaymentStatus("Unpaid"); + + insertLogical(newPolicy); + System.out.println("New policy issued: " + newPolicy); +end \ No newline at end of file diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo4/Report.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo4/Report.drl new file mode 100644 index 0000000..ec77469 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson06/demo4/Report.drl @@ -0,0 +1,11 @@ +package org.sw.lesson06.demo4; + +import org.sw.facts.Application; + +rule "Check for Child Applications" + dialect "java" + when + forall ( Application( clientAge >= 16 )) + then + System.out.println( "No applications from under 16 year olds" ); +end diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson07/ExplicitRules.drl b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson07/ExplicitRules.drl new file mode 100644 index 0000000..4b82de4 --- /dev/null +++ b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson07/ExplicitRules.drl @@ -0,0 +1,130 @@ +/* +package org.sw.lesson07; + +//generated from Decision Table +import org.sw.facts.Application; +import org.sw.facts.Proposal; + +global java.util.List proposalsList; + +// rule values at B13, header at B8 +rule "Adjust premium for overweight client" +// 10% increase for overweight BMI + salience 100 + when + $application: Application(isOverweight()) + then + System.out.println( "Positive Risk Factor in application "+$application.getApplicationNumber() +". Premium adjustment: "+10); + $application.addPremium( 10 ); +end + +// rule values at B14, header at B8 +rule "Adjust premium for Obese Class A client" +// 20% increase for overweight BMI + salience 99 + when + $application: Application(isObeseA()) + then + System.out.println( "Positive Risk Factor in application "+$application.getApplicationNumber() +". Premium adjustment: "+20); + $application.addPremium( 20 ); +end + +// rule values at B15, header at B8 +rule "Adjust premium for Obese Class B client" +// 30% increase for overweight BMI + salience 98 + when + $application: Application(isObeseB()) + then + System.out.println( "Positive Risk Factor in application "+$application.getApplicationNumber() +". Premium adjustment: "+30); + $application.addPremium( 30 ); +end + +// rule values at B16, header at B8 +rule "Adjust premium for Obese Class C client" +// 40% increase for overweight BMI + salience 97 + when + $application: Application(isObeseC()) + then + System.out.println( "Positive Risk Factor in application "+$application.getApplicationNumber() +". Premium adjustment: "+40); + $application.addPremium( 40 ); +end + +// rule values at B17, header at B8 +rule "Adjust premium for smokers" +// 15% increase for overweight BMI + salience 96 + when + $application: Application(isSmoker()) + then + System.out.println( "Positive Risk Factor in application "+$application.getApplicationNumber() +". Premium adjustment: "+15); + $application.addPremium( 15 ); +end + +// rule values at B18, header at B8 +rule "Adjust premium for high-risk client" +// 30% increase for overweight BMI + salience 95 + when + $application: Application(risk == "high") + then + System.out.println( "Positive Risk Factor in application "+$application.getApplicationNumber() +". Premium adjustment: "+30); + $application.addPremium( 30 ); +end + +// rule values at B19, header at B8 +rule "Adjust premium for medium-risk client" +// 15% increase for overweight BMI + salience 94 + when + $application: Application(risk == "medium") + then + System.out.println( "Positive Risk Factor in application "+$application.getApplicationNumber() +". Premium adjustment: "+15); + $application.addPremium( 15 ); +end + +// rule values at B20, header at B8 +rule "Adjust premium for seniors" +// 20% increase for overweight BMI + salience 93 + when + $application: Application(clientAge >= 70) + then + System.out.println( "Positive Risk Factor in application "+$application.getApplicationNumber() +". Premium adjustment: "+20); + $application.addPremium( 20 ); +end + +// rule values at B21, header at B8 +rule "Adjust premium for clients with PEC" +// 20% increase for overweight BMI + salience 92 + when + $application: Application(PEC) + then + System.out.println( "Positive Risk Factor in application "+$application.getApplicationNumber() +". Premium adjustment: "+20); + $application.addPremium( 20 ); +end + +//// rule values at B29, header at B24 +//rule "Issue insurance proposal" +//// Issues proposal after adjustments +// salience 91 +// when +// $application: Application() +// then +// System.out.println( $application.getApplicationNumber()+" Final Premium Calculation: " + $application.getPremium()); +// Proposal proposal = new Proposal( $application.getApplicationNumber(), $application.getPremium()); +// proposalsList.add(proposal); +//end + +rule "Issue insurance proposal" +// Issues proposal after adjustments + salience 91 + when + $application: Application() + then + System.out.println( $application.getApplicationNumber()+" Final Premium Calculation: " + $application.getPremium()); + insert( new Proposal( $application.getApplicationNumber(), $application.getPremium())); +end +*/ diff --git a/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson07/ruleSpreadsheet.xls b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson07/ruleSpreadsheet.xls new file mode 100644 index 0000000..a98821f Binary files /dev/null and b/Course Material/Day three/insurance/insurance/src/main/resources/org.sw/lesson07/ruleSpreadsheet.xls differ diff --git a/Course Material/Day two/Drools - Slide Master.pdf b/Course Material/Day two/Drools - Slide Master.pdf new file mode 100644 index 0000000..55bbfd3 Binary files /dev/null and b/Course Material/Day two/Drools - Slide Master.pdf differ diff --git a/Course Material/Day two/Lab Exercise 02.01.pdf b/Course Material/Day two/Lab Exercise 02.01.pdf new file mode 100644 index 0000000..546335b Binary files /dev/null and b/Course Material/Day two/Lab Exercise 02.01.pdf differ diff --git a/Course Material/Day two/Lab Exercise 02.02.pdf b/Course Material/Day two/Lab Exercise 02.02.pdf new file mode 100644 index 0000000..54baf3c Binary files /dev/null and b/Course Material/Day two/Lab Exercise 02.02.pdf differ diff --git a/Course Material/Day two/Lab Exercise 02.03.pdf b/Course Material/Day two/Lab Exercise 02.03.pdf new file mode 100644 index 0000000..df0e773 Binary files /dev/null and b/Course Material/Day two/Lab Exercise 02.03.pdf differ diff --git a/Course Material/Day two/Lab Exercise 02.04.pdf b/Course Material/Day two/Lab Exercise 02.04.pdf new file mode 100644 index 0000000..7e5e17b Binary files /dev/null and b/Course Material/Day two/Lab Exercise 02.04.pdf differ diff --git a/Course Material/Day two/Lab Exercise 02.05.pdf b/Course Material/Day two/Lab Exercise 02.05.pdf new file mode 100644 index 0000000..52e9169 Binary files /dev/null and b/Course Material/Day two/Lab Exercise 02.05.pdf differ diff --git a/Course Material/Day two/Lab Exercise 02.06.pdf b/Course Material/Day two/Lab Exercise 02.06.pdf new file mode 100644 index 0000000..abf4704 Binary files /dev/null and b/Course Material/Day two/Lab Exercise 02.06.pdf differ diff --git a/Course Material/Day two/insurance/insurance/.gitignore b/Course Material/Day two/insurance/insurance/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/.idea/.gitignore b/Course Material/Day two/insurance/insurance/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/Course Material/Day two/insurance/insurance/.idea/compiler.xml b/Course Material/Day two/insurance/insurance/.idea/compiler.xml new file mode 100644 index 0000000..c95aeda --- /dev/null +++ b/Course Material/Day two/insurance/insurance/.idea/compiler.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/.idea/encodings.xml b/Course Material/Day two/insurance/insurance/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/Course Material/Day two/insurance/insurance/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/.idea/jarRepositories.xml b/Course Material/Day two/insurance/insurance/.idea/jarRepositories.xml new file mode 100644 index 0000000..f7b4154 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/.idea/misc.xml b/Course Material/Day two/insurance/insurance/.idea/misc.xml new file mode 100644 index 0000000..45028cd --- /dev/null +++ b/Course Material/Day two/insurance/insurance/.idea/misc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/.idea/uiDesigner.xml b/Course Material/Day two/insurance/insurance/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/.idea/workspace.xml b/Course Material/Day two/insurance/insurance/.idea/workspace.xml new file mode 100644 index 0000000..bb0ed74 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/.idea/workspace.xml @@ -0,0 +1,177 @@ + + + + + + + + + + + { + "associatedIndex": 4 +} + + + + { + "keyToString": { + "Application.ClaimCrossValidation.executor": "Run", + "Application.CrossValidation.executor": "Run", + "Application.FactInsertionAndExecutionOrder.executor": "Run", + "Application.InsertLogicalAndFactObjects.executor": "Run", + "Application.ObjectGroupValidation.executor": "Run", + "Application.StatefulValidation.executor": "Run", + "Application.StatelessApplicationValidation.executor": "Run", + "RunOnceActivity.OpenProjectViewOnStart": "true", + "RunOnceActivity.ShowReadmeOnStart": "true", + "ignore.virus.scanning.warn.message": "true", + "kotlin-language-version-configured": "true", + "last_opened_file_path": "C:/Users/jpfra/IdeaProjects/insurance", + "node.js.detected.package.eslint": "true", + "node.js.detected.package.tslint": "true", + "node.js.selected.package.eslint": "(autodetect)", + "node.js.selected.package.tslint": "(autodetect)", + "nodejs_package_manager_path": "npm", + "vue.rearranger.settings.migration": "true" + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1706279752084 + + + + + + \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/pom.xml b/Course Material/Day two/insurance/insurance/pom.xml new file mode 100644 index 0000000..f67519a --- /dev/null +++ b/Course Material/Day two/insurance/insurance/pom.xml @@ -0,0 +1,160 @@ + + + + 4.0.0 + + org.sw + insurance + 1.0-SNAPSHOT + + + 17 + 17 + UTF-8 + org.sw.drools + 8.45.0-SNAPSHOT + + + + + apache-snapshots-repo + Apache + https://repository.apache.org/content/repositories/snapshots/ + default + + true + never + + + true + daily + + + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + java + + -Xms1024M + -Xmx1024M + -cp + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 11 + 11 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.2 + + + + org.kie + kie-maven-plugin + 8.44.0.Final + true + + + + + + + + org.kie + kie-api + ${drools.version} + + + + org.drools + drools-engine-classic + ${drools.version} + + + + org.drools + drools-ruleunits-engine + ${drools.version} + + + + org.drools + drools-tms + ${drools.version} + + + + org.kie + kie-internal + ${drools.version} + + + + org.slf4j + slf4j-api + 2.0.5 + + + + org.slf4j + slf4j-nop + 2.0.5 + + + + org.mvel + mvel2 + 2.4.15.Final + + + + org.junit.jupiter + junit-jupiter-engine + 5.9.2 + test + + + org.junit.jupiter + junit-jupiter-api + 5.9.2 + test + + + + org.hamcrest + hamcrest-all + 1.3 + test + + + + org.assertj + assertj-core + 3.24.2 + test + + + + + \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/Common.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/Common.java new file mode 100644 index 0000000..908cd97 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/Common.java @@ -0,0 +1,77 @@ +package org.sw; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class Common { + + public static boolean disposeSession = true; + + public static int promptForDemo(int lesson, String[] args, int minDemo, int maxDemo) { + return promptForDemoInternal("Lesson " + lesson, args, minDemo, maxDemo); + } + + private static int promptForDemoInternal(String lessonStr, String[] args, int minDemo, int maxDemo) { + String demoStr = ""; + + while (true) { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + try { + if (args != null && args.length > 0) { + demoStr = args[0]; + return Integer.parseInt(demoStr); + } + else { + System.out.printf(lessonStr + ". Enter demo number (%d...%d): ", minDemo, maxDemo); + demoStr = br.readLine(); + } + + int step = Integer.parseInt(demoStr); + + if (step < minDemo || step > maxDemo) { + System.out.println("Step number out of range. Insert a number between " + minDemo + " and " + maxDemo); + } + else { + return step; + } + } + catch (NumberFormatException e) { + System.out.println("Invalid number: " + demoStr); + } + catch (IOException e) { + System.out.println("Invalid demo input: " + demoStr); + } + } + + } + + + public static boolean promptForYesNoQuestion(String question) { + String enteredStr = ""; + + while (true) { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + try { + System.out.printf("%s Enter 'yes' or 'no': ", question); + enteredStr = br.readLine().trim(); + + if ("yes".equalsIgnoreCase(enteredStr) || "y".equalsIgnoreCase(enteredStr)) { + return true; + } + + if ("no".equalsIgnoreCase(enteredStr) || "n".equalsIgnoreCase(enteredStr)) { + return false; + } + + System.out.println("Enter either 'yes' or 'no'"); + } + catch (IOException e) { + System.out.println("Invalid input: " + enteredStr); + } + } + + } + +} + diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/Lesson6/ObjectGroupValidation.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/Lesson6/ObjectGroupValidation.java new file mode 100644 index 0000000..c2fa1d6 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/Lesson6/ObjectGroupValidation.java @@ -0,0 +1,80 @@ +package org.sw.Lesson6; + +import org.kie.api.event.rule.ObjectDeletedEvent; +import org.kie.api.event.rule.ObjectInsertedEvent; +import org.kie.api.event.rule.ObjectUpdatedEvent; +import org.kie.api.event.rule.RuleRuntimeEventListener; +import org.sw.facts.*; +import org.sw.builder.*; +import org.sw.Common; + +import org.kie.api.KieServices; +import org.kie.api.runtime.KieSession; + +import java.time.LocalDate; +import java.util.Collection; +import java.util.List; + +public class ObjectGroupValidation { + public static void main(final String[] args) { + execute(Common.promptForDemo(6, args, 1, 4)); + } + + static void execute(int demo) { + System.out.println("Running Demo " + demo); + + KieSession ksession = KieServices.Factory.get().getKieClasspathContainer().newKieSession("ObjectGroupValidationDemo" + demo); + + ksession.addEventListener(new RuleRuntimeEventListener() { + @Override + public void objectInserted(ObjectInsertedEvent event) { + System.out.println("==> " + event.getObject() + " inserted"); + } + + @Override + public void objectUpdated(ObjectUpdatedEvent event) { + System.out.println("==> " + event.getObject() + " updated"); + } + + @Override + public void objectDeleted(ObjectDeletedEvent event) { + System.out.println("==> " + event.getOldObject() + " deleted"); + } + }); + + List familyApplications = ApplicationRepository.getFamilyApplications(); + familyApplications.forEach(ksession::insert); + + List clientIDS = ClientIdRepository.getClientIDs(); + if (demo == 3) { + if (Common.promptForYesNoQuestion("Do you want to set all IDs as expired?")) { + System.out.println("All client IDs are now expired"); + clientIDS.forEach(clientID -> clientID.setExpiryDate(LocalDate.MIN)); + } + } + clientIDS.forEach(ksession::insert); + + if (demo == 4) { + List applications = ApplicationRepository.getApplications(); + applications.forEach(ksession::insert); + } + + System.out.println("==== DROOLS SESSION START ==== "); + ksession.fireAllRules(); + System.out.println("==== DROOLS SESSION END ==== "); + + System.out.println("==== INVALID FAMILY APPLICATIONS INSERTED === "); + + Collection invalidApplications = ksession.getObjects(o -> o.getClass() == InvalidFamilyApplication.class); + invalidApplications.forEach(System.out::println); + + Collection policies = ksession.getObjects(o -> o.getClass() == Policy.class); + System.out.println("== NEW POLICIES CREATED == "); + policies.forEach(System.out::println); + + if (Common.disposeSession) { + ksession.dispose(); + } + + } +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/builder/ApplicationRepository.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/builder/ApplicationRepository.java new file mode 100644 index 0000000..aa3eadb --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/builder/ApplicationRepository.java @@ -0,0 +1,161 @@ +package org.sw.builder; + +import org.sw.facts.Application; +import org.sw.facts.FamilyApplication; + +import java.time.LocalDate; +import java.time.Month; +import java.util.ArrayList; +import java.util.List; + +import static java.util.Arrays.asList; + +public class ApplicationRepository { + public static List getApplications() { + List applications = new ArrayList<>(); + + applications.add(Application.newBuilder() + .withApplicationNumber("A-1000") + .withClientName("James Smith") + .withClientAge(52) + .withPEC(false) + .withRisk("High") + .withEmployed(true) + .withBMI(21) + .withClientIdNumber("ID-100") + .withSmoker(false) + .build()); + + applications.add(Application.newBuilder() + .withApplicationNumber("A-1001") + .withClientName("Maria Smith") + .withClientAge(56) + .withPEC(true) + .withRisk("Medium") + .withEmployed(true) + .withBMI(23) + .withClientIdNumber("ID-101") + .withSmoker(true) + .build()); + + applications.add(Application.newBuilder() + .withApplicationNumber("A-1002") + .withClientName("Robert Johnson") + .withClientAge(38) + .withPEC(false) + .withRisk("High") + .withEmployed(true) + .withBMI(25) + .withClientIdNumber("ID-102") + .withSmoker(true) + .build()); + + applications.add(Application.newBuilder() + .withApplicationNumber("A-1003") + .withClientName("Linda Johnson") + .withClientAge(36) + .withPEC(true) + .withRisk("Low") + .withEmployed(false) + .withBMI(32) + .withClientIdNumber("ID-103") + .withSmoker(false) + .build()); + + applications.add(Application.newBuilder() + .withApplicationNumber("A-1004") + .withClientName("Michael Johnson") + .withClientAge(16) + .withPEC(false) + .withRisk("Low") + .withEmployed(false) + .withBMI(20) + .withClientIdNumber("ID-104") + .withSmoker(false) + .build()); + + applications.add(Application.newBuilder() + .withApplicationNumber("A-1005") + .withClientName("Elizabeth Anderson") + .withClientAge(27) + .withPEC(false) + .withRisk("Medium") + .withEmployed(true) + .withBMI(27) + .withClientIdNumber("ID-105") + .withSmoker(true) + .build()); + + applications.add(Application.newBuilder() + .withApplicationNumber("A-1006") + .withClientName("David Lrr") + .withClientAge(63) + .withPEC(true) + .withRisk("High") + .withEmployed(true) + .withBMI(31) + .withClientIdNumber("ID-106") + .withSmoker(true) + .build()); + + applications.add(Application.newBuilder() + .withApplicationNumber("A-1007") + .withClientName("Emily Taylor") + .withClientAge(80) + .withPEC(false) + .withRisk("Low") + .withEmployed(false) + .withBMI(18) + .withClientIdNumber("ID-107") + .withSmoker(true) + .build()); + + applications.add(Application.newBuilder() + .withApplicationNumber("A-1008") + .withClientName("William Brown") + .withClientAge(21) + .withPEC(true) + .withRisk("Low") + .withEmployed(true) + .withBMI(28) + .withClientIdNumber("ID-108") + .withSmoker(true) + .build()); + + applications.add(Application.newBuilder() + .withApplicationNumber("A-1009") + .withClientName("Jessica Thompson") + .withClientAge(71) + .withPEC(false) + .withRisk("Medium") + .withEmployed(false) + .withBMI(23) + .withClientIdNumber("ID-110") + .withSmoker(false) + .build()); + + return applications; + } + + public static List getFamilyApplications() { + List familyApplications = new ArrayList<>(); + + familyApplications.add(FamilyApplication.newBuilder() + .withApplicationNumber("GIA-1000") + .withClientIdNumbers(asList("ID-100", "ID-101")) + .withClientAges(asList(52, 56)) + .withStartDate(LocalDate.of(2024, Month.MARCH, 1)) + .withPolicyDurationYears(1) + .build()); + + familyApplications.add(FamilyApplication.newBuilder() + .withApplicationNumber("GIA-1001") + .withClientIdNumbers(asList("ID-102", "ID-103", "ID-104")) + .withClientAges(asList(38, 36, 16)) + .withStartDate(LocalDate.of(2024, Month.MAY, 5)) + .withPolicyDurationYears(1) + .build()); + + return familyApplications; + } +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/builder/ClaimRepository.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/builder/ClaimRepository.java new file mode 100644 index 0000000..a5f4d12 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/builder/ClaimRepository.java @@ -0,0 +1,49 @@ +package org.sw.builder; + +import org.sw.facts.Claim; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +public class ClaimRepository { + public static List getClaims() { + List claims = new ArrayList<>(); + + claims.add(Claim.newBuilder() + .withClientName("John Doe") + .withPolicyNumber("P-1100") + .withDateOfClaim(LocalDate.of(2022, 5, 19)) + .withClaimAmount(8000) + .build()); + + claims.add(Claim.newBuilder() + .withClientName("William Johnson") + .withPolicyNumber("P-1002") + .withDateOfClaim(LocalDate.of(2020, 4, 14)) + .withClaimAmount(10000) + .build()); + + claims.add(Claim.newBuilder() + .withClientName("Michael Davis") + .withPolicyNumber("P-1004") + .withDateOfClaim(LocalDate.of(2023, 1, 31)) + .withClaimAmount(40000) + .build()); + + claims.add(Claim.newBuilder() + .withClientName("Sophia Martinez") + .withPolicyNumber("P-1005") + .withDateOfClaim(LocalDate.of(2022, 1, 3)) + .withClaimAmount(50000) + .build()); + + claims.add(Claim.newBuilder() + .withClientName("Ava Thompson") + .withPolicyNumber("P-1009") + .withDateOfClaim(LocalDate.of(2022, 2, 8)) + .withClaimAmount(25000) + .build()); + + return claims; + } +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/builder/ClientIdRepository.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/builder/ClientIdRepository.java new file mode 100644 index 0000000..0eaf5fd --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/builder/ClientIdRepository.java @@ -0,0 +1,76 @@ +package org.sw.builder; + +import org.sw.facts.ClientID; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +public class ClientIdRepository { + + public static List getClientIDs() { + List clientIDs = new ArrayList<>(); + + clientIDs.add(ClientID.newBuilder() + .withName("James Smith") + .withIdNumber("ID-100") + .withExpiryDate(LocalDate.of(2030, 5, 21)) + .build()); + + clientIDs.add(ClientID.newBuilder() + .withName("Maria Smith") + .withIdNumber("ID-101") + .withExpiryDate(LocalDate.of(2023, 5, 11)) + .build()); + + clientIDs.add(ClientID.newBuilder() + .withName("Robert Johnson") + .withIdNumber("ID-102") + .withExpiryDate(LocalDate.of(2037, 11, 11)) + .build()); + + clientIDs.add(ClientID.newBuilder() + .withName("Linda Johnson") + .withIdNumber("ID-103") + .withExpiryDate(LocalDate.of(2026, 11, 2)) + .build()); + + clientIDs.add(ClientID.newBuilder() + .withName("Michael Johnson") + .withIdNumber("ID-104") + .withExpiryDate(LocalDate.of(2032, 1, 11)) + .build()); + + clientIDs.add(ClientID.newBuilder() + .withName("Elizabeth Anderson") + .withIdNumber("ID-105") + .withExpiryDate(LocalDate.of(2024, 3, 31)) + .build()); + + clientIDs.add(ClientID.newBuilder() + .withName("David Lee") + .withIdNumber("ID-106") + .withExpiryDate(LocalDate.of(2025, 6, 8)) + .build()); + + clientIDs.add(ClientID.newBuilder() + .withName("Emily Taylor") + .withIdNumber("ID-107") + .withExpiryDate(LocalDate.of(2027, 3, 31)) + .build()); + + clientIDs.add(ClientID.newBuilder() + .withName("William Brown") + .withIdNumber("ID-108") + .withExpiryDate(LocalDate.of(2031, 1, 8)) + .build()); + + clientIDs.add(ClientID.newBuilder() + .withName("Jessica Thompson") + .withIdNumber("ID-109") + .withExpiryDate(LocalDate.of(2031, 1, 8)) + .build()); + + return clientIDs; + } +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/builder/PolicyRepository.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/builder/PolicyRepository.java new file mode 100644 index 0000000..03c5bb2 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/builder/PolicyRepository.java @@ -0,0 +1,95 @@ +package org.sw.builder; + +import org.sw.facts.Policy; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +public class PolicyRepository { + public static List getPolicies() { + List policies = new ArrayList<>(); + + policies.add(Policy.newBuilder() + .withPolicyNumber("P-1000") + .withClientName("John Doe") + .withPremium(140) + .withCoverage(14000) + .withPaymentStatus("Paid") + .build()); + + policies.add(Policy.newBuilder() + .withPolicyNumber("P-1001") + .withClientName("Emma Smith") + .withPremium(220) + .withCoverage(22000) + .withPaymentStatus("Unpaid") + .build()); + + policies.add(Policy.newBuilder() + .withPolicyNumber("P-1002") + .withClientName("William Johnson") + .withPremium(150) + .withCoverage(15000) + .withPaymentStatus("Unpaid") + .build()); + + policies.add(Policy.newBuilder() + .withPolicyNumber("P-1003") + .withClientName("Olivia Brown") + .withPremium(90) + .withCoverage(9000) + .withPaymentStatus("Paid") + .build()); + + policies.add(Policy.newBuilder() + .withPolicyNumber("P-1004") + .withClientName("Michael Davis") + .withPremium(400) + .withCoverage(40000) + .withPaymentStatus("Paid") + .build()); + + policies.add(Policy.newBuilder() + .withPolicyNumber("P-1005") + .withClientName("Sophia Martinez") + .withPremium(230) + .withCoverage(23000) + .withPaymentStatus("Paid") + .build()); + + policies.add(Policy.newBuilder() + .withPolicyNumber("P-1006") + .withClientName("Ethan Wilson") + .withPremium(180) + .withCoverage(18000) + .withPaymentStatus("Paid") + .build()); + + policies.add(Policy.newBuilder() + .withPolicyNumber("P-1007") + .withClientName("Isabella Taylor") + .withPremium(240) + .withCoverage(24000) + .withPaymentStatus("Paid") + .build()); + + policies.add(Policy.newBuilder() + .withPolicyNumber("P-1008") + .withClientName("Daniel Moore") + .withPremium(120) + .withCoverage(12000) + .withPaymentStatus("Unpaid") + .build()); + + policies.add(Policy.newBuilder() + .withPolicyNumber("P-1009") + .withClientName("Ava Thompson") + .withPremium(210) + .withCoverage(21000) + .withPaymentStatus("Unpaid") + .build()); + + return policies; + } +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/Application.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/Application.java new file mode 100644 index 0000000..f0ff21f --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/Application.java @@ -0,0 +1,172 @@ +package org.sw.facts; + +import java.util.Objects; + +public class Application { + private String applicationNumber; + private String clientName; + private String clientIdNumber; + private boolean PEC; + private String risk; + private boolean employed; + private boolean isSmoker; + private int clientAge; + private int BMI; + private Status status = Status.PENDING; + private String reason = ""; + + // Getters + public String getApplicationNumber() { + return applicationNumber; + } + + public String getClientName() { + return clientName; + } + + public String getClientIdNumber() { + return clientIdNumber; + } + + public boolean getPEC() { + return PEC; + } + + public String getRisk() { + return risk; + } + + public boolean getEmployed() { + return employed; + } + + public boolean isSmoker() { + return isSmoker; + } + + public int getClientAge() { + return clientAge; + } + + public int getBMI() { + return BMI; + } + + public Status getStatus() { + return status; + } + + public String getReason() { + return reason; + } + + // Setters + public void setStatus(Status status) { + this.status = status; + } + + public void setAge(int clientAge) { + this.clientAge = clientAge; + } + + public void setReason(String reason) { + this.reason = reason; + } + + @Override + public String toString() { + return String.format("Application [#%s, name:%s]", applicationNumber, clientName); + } + + public static ApplicationBuilder newBuilder() { + return new ApplicationBuilder(); + } + + public static final class ApplicationBuilder { + private String applicationNumber; + private String clientName; + private String clientIdNumber; + private boolean PEC; + private String risk; + private boolean employed; + private boolean isSmoker; + private int clientAge; + private int BMI; + + private ApplicationBuilder() { + } + + public ApplicationBuilder withApplicationNumber(String applicationNumber) { + this.applicationNumber = applicationNumber; + return this; + } + + public ApplicationBuilder withClientName(String clientName) { + this.clientName = clientName; + return this; + } + + public ApplicationBuilder withClientIdNumber(String clientIdNumber) { + this.clientIdNumber = clientIdNumber; + return this; + } + + public ApplicationBuilder withPEC(boolean PEC) { + this.PEC = PEC; + return this; + } + + public ApplicationBuilder withRisk(String risk) { + this.risk = risk; + return this; + } + + public ApplicationBuilder withEmployed(boolean employed) { + this.employed = employed; + return this; + } + + public ApplicationBuilder withSmoker(boolean isSmoker) { + this.isSmoker = isSmoker; + return this; + } + + public ApplicationBuilder withClientAge(int clientAge) { + this.clientAge = clientAge; + return this; + } + + public ApplicationBuilder withBMI(int BMI) { + this.BMI = BMI; + return this; + } + + public Application build() { + Application application = new Application(); + application.applicationNumber = this.applicationNumber; + application.clientName = this.clientName; + application.clientIdNumber = this.clientIdNumber; + application.PEC = this.PEC; + application.risk = this.risk; + application.employed = this.employed; + application.isSmoker = this.isSmoker; + application.clientAge = this.clientAge; + application.BMI = this.BMI; + return application; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Application application = (Application) o; + return Objects.equals(applicationNumber, application.applicationNumber); + } + + @Override + public int hashCode() { + return Objects.hash(applicationNumber); + } + +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/Claim.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/Claim.java new file mode 100644 index 0000000..a21e1d3 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/Claim.java @@ -0,0 +1,111 @@ +package org.sw.facts; + +import java.time.LocalDate; +import java.util.Objects; + +public class Claim { + private String clientName; + private String policyNumber; + private LocalDate dateOfClaim; + private int claimAmount; + private Status status = Status.PENDING; + private String reason = ""; + + // Getters + public String getClientName() { + return clientName; + } + + public String getPolicyNumber() { + return policyNumber; + } + + public LocalDate getDateOfClaim() { + return dateOfClaim; + } + + public int getClaimAmount() { + return claimAmount; + } + + public Status getStatus() { + return status; + } + + public String getReason() { + return reason; + } + + // Setters + public void setClaimAmount(int claimAmount) { this.claimAmount = claimAmount; } + + public void setStatus(Status status) { + this.status = status; + } + + public void setReason(String reason) { + this.reason = reason; + } + + @Override + public String toString() { + return String.format("Claim [name:%s, amount:%s]", clientName, claimAmount); + } + + public static ClaimBuilder newBuilder() { + return new ClaimBuilder(); + } + + public static final class ClaimBuilder { + private String clientName; + private String policyNumber; + private LocalDate dateOfClaim; + private int claimAmount; + + private ClaimBuilder() { + } + + public ClaimBuilder withClientName(String clientName) { + this.clientName = clientName; + return this; + } + + public ClaimBuilder withPolicyNumber(String policyNumber) { + this.policyNumber = policyNumber; + return this; + } + + public ClaimBuilder withDateOfClaim(LocalDate dateOfClaim) { + this.dateOfClaim = dateOfClaim; + return this; + } + + public ClaimBuilder withClaimAmount(int claimAmount) { + this.claimAmount = claimAmount; + return this; + } + + public Claim build() { + Claim claim = new Claim(); + claim.clientName = this.clientName; + claim.policyNumber = this.policyNumber; + claim.dateOfClaim = this.dateOfClaim; + claim.claimAmount = this.claimAmount; + return claim; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Claim claim = (Claim) o; + return Objects.equals(policyNumber, claim.policyNumber); + } + + @Override + public int hashCode() { + return Objects.hash(policyNumber); + } + +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/ClientID.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/ClientID.java new file mode 100644 index 0000000..bab2ce2 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/ClientID.java @@ -0,0 +1,104 @@ +package org.sw.facts; + +import java.time.LocalDate; +import java.util.Objects; + +public class ClientID { + private String name; + private String idNumber; + private LocalDate expiryDate; + private Status status = Status.UNKNOWN; + private String reason = ""; + + // Getters + public String getName() { + return name; + } + + public String getIdNumber() { + return idNumber; + } + + public LocalDate getExpiryDate() { + return expiryDate; + } + + public Status getStatus() { + return status; + } + + public String getReason() { + return reason; + } + + // Setters + public void setExpiryDate(LocalDate expiryDate) { + this.expiryDate = expiryDate; + } + + public void setStatus(Status status) { + this.status = status; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public boolean isExpired() { + return expiryDate.isBefore(LocalDate.now()); + } + + @Override + public String toString() { + return String.format("ID: [%s, #:%s]", name, idNumber); + } + + public static ClientIDBuilder newBuilder() { + return new ClientIDBuilder(); + } + + public static final class ClientIDBuilder { + private String name; + private String idNumber; + private LocalDate expiryDate; + + private ClientIDBuilder() { + } + + public ClientIDBuilder withName(String name) { + this.name = name; + return this; + } + + public ClientIDBuilder withIdNumber(String idNumber) { + this.idNumber = idNumber; + return this; + } + + public ClientIDBuilder withExpiryDate(LocalDate expiryDate) { + this.expiryDate = expiryDate; + return this; + } + + public ClientID build() { + ClientID clientID = new ClientID(); + clientID.name = this.name; + clientID.idNumber = this.idNumber; + clientID.expiryDate = this.expiryDate; + return clientID; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ClientID clientID = (ClientID) o; + return Objects.equals(idNumber, clientID.idNumber); + } + + @Override + public int hashCode() { + return Objects.hash(idNumber); + } +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/FamilyApplication.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/FamilyApplication.java new file mode 100644 index 0000000..e5fe24d --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/FamilyApplication.java @@ -0,0 +1,117 @@ +package org.sw.facts; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +public class FamilyApplication { + private final String applicationNumber; + private List clientIdNumbers = new ArrayList<>(); + private List clientAges = new ArrayList<>(); + private LocalDate startDate; + private int policyDurationYears; + + public FamilyApplication(String applicationNumber) { + this.applicationNumber = applicationNumber; + } + + public String getApplicationNumber() { + return applicationNumber; + } + + public List getClientIdNumbers() { + return clientIdNumbers; + } + + public List getClientAges() { return clientAges; } + + public LocalDate getStartDate() { + return startDate; + } + + public int getPolicyDurationYears() { + return policyDurationYears; + } + + public void setStartDate(LocalDate startDate) { + this.startDate = startDate; + } + + public void setPolicyDurationYears(int policyDurationYears) { + this.policyDurationYears = policyDurationYears; + } + + public static String join(Collection collection) { + return collection.stream() + .map(Object::toString) + .collect(Collectors.joining(", ")); + } + + @Override + public String toString() { + return String.format("FamilyApplication[Number:%s, Clients:%s]", applicationNumber, join(clientIdNumbers)); + } + + public static FamilyApplicationBuilder newBuilder() { + return new FamilyApplicationBuilder(); + } + + public static final class FamilyApplicationBuilder { + private String applicationNumber; + private List clientIdNumbers = new ArrayList<>(); + private List clientAges = new ArrayList<>(); + private LocalDate startDate; + private int policyDurationYears; + + private FamilyApplicationBuilder() { + } + + public FamilyApplicationBuilder withApplicationNumber(String applicationNumber) { + this.applicationNumber = applicationNumber; + return this; + } + + public FamilyApplicationBuilder withClientIdNumbers(List clientIdNumbers) { + this.clientIdNumbers = clientIdNumbers; + return this; + } + + public FamilyApplicationBuilder withClientAges(List clientAges) { + this.clientAges = clientAges; + return this; + } + + public FamilyApplicationBuilder withStartDate(LocalDate startDate) { + this.startDate = startDate; + return this; + } + + public FamilyApplicationBuilder withPolicyDurationYears(int policyDurationYears) { + this.policyDurationYears = policyDurationYears; + return this; + } + + public FamilyApplication build() { + FamilyApplication familyApplication = new FamilyApplication(applicationNumber); + familyApplication.clientIdNumbers = this.clientIdNumbers; + familyApplication.clientAges = this.clientAges; + familyApplication.startDate = this.startDate; + familyApplication.policyDurationYears = this.policyDurationYears; + return familyApplication; + } + } + + @Override + public boolean equals(Object obj) { + return obj instanceof FamilyApplication + && ((FamilyApplication) obj).getApplicationNumber().equals(applicationNumber); + } + + @Override + public int hashCode() { + return applicationNumber.hashCode(); + } + +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/InvalidApplication.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/InvalidApplication.java new file mode 100644 index 0000000..942cdcb --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/InvalidApplication.java @@ -0,0 +1,30 @@ +package org.sw.facts; + +public class InvalidApplication { + private Application application; + + public InvalidApplication(Application application) { + this.application = application; + } + + public Application getApplication() { + return application; + } + + @Override + public String toString() { + return "Invalid:" + application; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof InvalidApplication + && ((InvalidApplication) obj).getApplication().equals(application); + } + + @Override + public int hashCode() { + return application.hashCode(); + } + +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/InvalidClaim.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/InvalidClaim.java new file mode 100644 index 0000000..048005d --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/InvalidClaim.java @@ -0,0 +1,29 @@ +package org.sw.facts; + +public class InvalidClaim { + private Claim claim; + + public InvalidClaim(Claim claim) { + this.claim = claim; + } + + public Claim getClaim() { + return claim; + } + + @Override + public String toString() { + return "Invalid:" + claim; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof InvalidClaim + && ((InvalidClaim) obj).getClaim().equals(claim); + } + + @Override + public int hashCode() { + return claim.hashCode(); + } +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/InvalidClientID.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/InvalidClientID.java new file mode 100644 index 0000000..e94d6f4 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/InvalidClientID.java @@ -0,0 +1,29 @@ +package org.sw.facts; + +public class InvalidClientID { + private ClientID clientID; + + public InvalidClientID(ClientID clientID) { + this.clientID = clientID; + } + + public ClientID getClientID() { + return clientID; + } + + @Override + public String toString() { + return "Invalid:" + clientID; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof InvalidClientID + && ((InvalidClientID) obj).getClientID().equals(clientID); + } + + @Override + public int hashCode() { + return clientID.hashCode(); + } +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/InvalidFamilyApplication.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/InvalidFamilyApplication.java new file mode 100644 index 0000000..70ce594 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/InvalidFamilyApplication.java @@ -0,0 +1,36 @@ +package org.sw.facts; + +public class InvalidFamilyApplication { + private FamilyApplication familyApplication; + + public InvalidFamilyApplication(FamilyApplication familyApplication) { + this.familyApplication = familyApplication; + } + + public FamilyApplication getFamilyApplication() { + return familyApplication; + } + + @Override + public String toString() { + return "Invalid:" + familyApplication; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + InvalidFamilyApplication that = (InvalidFamilyApplication) obj; + return familyApplication != null ? familyApplication.equals(that.familyApplication) : that.familyApplication == null; + } + + @Override + public int hashCode() { + return familyApplication != null ? familyApplication.hashCode() : 0; + } + +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/InvalidPolicy.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/InvalidPolicy.java new file mode 100644 index 0000000..4981912 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/InvalidPolicy.java @@ -0,0 +1,31 @@ +package org.sw.facts; + +public class InvalidPolicy { + private Policy policy; + + public InvalidPolicy(Policy policy) { + this.policy = policy; + } + + public Policy getPolicy() { + return policy; + } + + @Override + public String toString() { + return "Invalid:" + policy; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + InvalidPolicy that = (InvalidPolicy) obj; + return policy != null ? policy.equals(that.policy) : that.policy == null; + } + + @Override + public int hashCode() { + return policy != null ? policy.hashCode() : 0; + } +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/Payout.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/Payout.java new file mode 100644 index 0000000..fa5e159 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/Payout.java @@ -0,0 +1,39 @@ +package org.sw.facts; + +import java.util.Objects; +public class Payout { + private String policyNumber; + private int claimAmount; + + public Payout(String policyNumber, int claimAmount) { + this.policyNumber = policyNumber; + this.claimAmount = claimAmount; + } + + public String getPolicyNumber() { + return policyNumber; + } + + public int getClaimAmount() { + return claimAmount; + } + + @Override + public String toString() { + return "Payout[to Policy: " + policyNumber + ", in amount: " + claimAmount + "]"; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Payout payout = (Payout) o; + return Objects.equals(policyNumber, payout.policyNumber); + } + + @Override + public int hashCode() { + return Objects.hash(policyNumber); + } + +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/Policy.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/Policy.java new file mode 100644 index 0000000..e38b92e --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/Policy.java @@ -0,0 +1,131 @@ +package org.sw.facts; + +import java.util.Objects; + +public class Policy { + private String policyNumber; + private String clientName; + private int premium; + private int coverage; + private String paymentStatus; + private Status status = Status.VALID; + private String reason = ""; + + // Getters + public String getPolicyNumber() { + return policyNumber; + } + + public String getClientName() { + return clientName; + } + + public int getPremium() { + return premium; + } + + public int getCoverage() { + return coverage; + } + + public String getPaymentStatus() { + return paymentStatus; + } + + public Status getStatus() { + return status; + } + + + + public String getReason() { + return reason; + } + + // Setters + public void setPolicyNumber(String policyNumber) {this.policyNumber = policyNumber; } + public void setClientName(String clientName) { this.clientName = clientName; } + public void setPremium(int premium) { + this.premium = premium; + } + + public void setCoverage(int coverage) { this.coverage = coverage; } + + public void setPaymentStatus(String paymentStatus) { this.paymentStatus = paymentStatus; } + + public void setStatus(Status status) { + this.status = status; + } + + public void setReason(String reason) { + this.reason = reason; + } + + @Override + public String toString() { + return String.format("Policy [Policy #%s, %s]", policyNumber, clientName); + } + + public static PolicyBuilder newBuilder() { + return new PolicyBuilder(); + } + + public static final class PolicyBuilder { + private String policyNumber; + private String clientName; + private int premium; + private int coverage; + private String paymentStatus; + + private PolicyBuilder() { + } + + public PolicyBuilder withPolicyNumber(String policyNumber) { + this.policyNumber = policyNumber; + return this; + } + + public PolicyBuilder withClientName(String clientName) { + this.clientName = clientName; + return this; + } + + public PolicyBuilder withPremium(int premium) { + this.premium = premium; + return this; + } + + public PolicyBuilder withCoverage(int coverage) { + this.coverage = coverage; + return this; + } + + public PolicyBuilder withPaymentStatus(String paymentStatus) { + this.paymentStatus = paymentStatus; + return this; + } + + public Policy build() { + Policy policy = new Policy(); + policy.policyNumber = this.policyNumber; + policy.clientName = this.clientName; + policy.premium = this.premium; + policy.coverage = this.coverage; + policy.paymentStatus = this.paymentStatus; + return policy; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Policy policy = (Policy) o; + return Objects.equals(policyNumber, policy.policyNumber); + } + + @Override + public int hashCode() { + return Objects.hash(policyNumber); + } +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/PrimaryClient.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/PrimaryClient.java new file mode 100644 index 0000000..a2844df --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/PrimaryClient.java @@ -0,0 +1,20 @@ +package org.sw.facts; + +public class PrimaryClient { + private ClientID clientID; + private FamilyApplication familyApplication; + + public PrimaryClient(ClientID clientID, FamilyApplication familyApplication) { + this.clientID = clientID; + this.familyApplication = familyApplication; + } + + public ClientID getClientID() { + return clientID; + } + + @Override + public String toString() { + return "Application #"+ familyApplication.getApplicationNumber() + " Primary Cleint: " + clientID.getName(); + } +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/SessionData.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/SessionData.java new file mode 100644 index 0000000..fd48838 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/SessionData.java @@ -0,0 +1,21 @@ +package org.sw.facts; + +import java.util.Collection; + +public class SessionData { + public Collection applications; + public Collection policies; + public Collection clientIDs; + public Collection claims; + public Collection familyApplications; + // Add other collections as necessary + + // If you have valid and invalid versions of each, you can add those collections too + public Collection validApplications; + public Collection invalidApplications; + public Collection validClientIDs; + public Collection invalidClientIDs; + public Collection validClaims; + public Collection invalidClaims; + public Collection invalidFamilyApplications; +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/Status.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/Status.java new file mode 100644 index 0000000..8143714 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/Status.java @@ -0,0 +1,5 @@ +package org.sw.facts; + +public enum Status { + APPROVED,DENIED,VALID,INVALID,PENDING,UNKNOWN +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/ValidApplication.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/ValidApplication.java new file mode 100644 index 0000000..c5bddc6 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/ValidApplication.java @@ -0,0 +1,30 @@ +package org.sw.facts; + +public class ValidApplication { + private Application application; + + public ValidApplication(Application application) { + this.application = application; + } + + public Application getApplication() { + return application; + } + + @Override + public String toString() { + return "Valid:" + application; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof ValidApplication + && ((ValidApplication) obj).getApplication().equals(application); + } + + @Override + public int hashCode() { + return application.hashCode(); + } + +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/ValidClaim.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/ValidClaim.java new file mode 100644 index 0000000..3e104b0 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/ValidClaim.java @@ -0,0 +1,30 @@ +package org.sw.facts; + +public class ValidClaim { + private Claim claim; + + public ValidClaim(Claim claim) { + this.claim = claim; + } + + public Claim getClaim() { + return claim; + } + + @Override + public String toString() { + return "Valid:" + claim; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof ValidClaim + && ((ValidClaim) obj).getClaim().equals(claim); + } + + @Override + public int hashCode() { + return claim.hashCode(); + } + +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/ValidClientID.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/ValidClientID.java new file mode 100644 index 0000000..6940242 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/facts/ValidClientID.java @@ -0,0 +1,30 @@ +package org.sw.facts; + +public class ValidClientID { + private ClientID clientID; + + public ValidClientID(ClientID clientID) { + this.clientID = clientID; + } + + public ClientID getClientID() { + return clientID; + } + + @Override + public String toString() { + return "Valid:" + clientID; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof ValidClientID + && ((ValidClientID) obj).getClientID().equals(clientID); + } + + @Override + public int hashCode() { + return clientID.hashCode(); + } + +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/lesson01/StatelessApplicationValidation.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/lesson01/StatelessApplicationValidation.java new file mode 100644 index 0000000..8ccd6a6 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/lesson01/StatelessApplicationValidation.java @@ -0,0 +1,37 @@ +package org.sw.lesson01; + +import org.sw.facts.Application; +import org.sw.Common; +import org.sw.builder.ApplicationRepository; + +import org.kie.api.KieServices; +import org.kie.api.runtime.KieContainer; +import org.kie.api.runtime.StatelessKieSession; + +import java.util.List; + +public class StatelessApplicationValidation { + public static void main(final String[] args) { + execute(Common.promptForDemo(1, args, 1, 5)); + } + + static void execute(int demo) { + System.out.println("Demo Number " + demo); + + List applications = ApplicationRepository.getApplications(); + + KieContainer kieContainer = KieServices.Factory.get().getKieClasspathContainer(); + StatelessKieSession kieSession = kieContainer.newStatelessKieSession("StatelessApplicationValidationDemo" + demo); + System.out.println("==== DROOLS SESSION START ==== "); + kieSession.execute(applications); + System.out.println("==== DROOLS SESSION END ==== "); + + if (demo >= 4) { + System.out.println("==== VALIDATION STATUS AFTER SESSION ==== "); + + applications.forEach(application -> System.out.println(application + " validation " + application.getStatus())); + + } + + } +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/lesson02/StatefulValidation.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/lesson02/StatefulValidation.java new file mode 100644 index 0000000..68189e8 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/lesson02/StatefulValidation.java @@ -0,0 +1,44 @@ +package org.sw.lesson02; + +import org.sw.facts.Application; +import org.sw.Common; +import org.sw.builder.ApplicationRepository; + +import org.kie.api.KieServices; +import org.kie.api.runtime.KieContainer; +import org.kie.api.runtime.KieSession; + +import java.util.List; + +public class StatefulValidation { + public static void main(final String[] args) { + execute(Common.promptForDemo(2, args, 1, 2)); + } + + static void execute(int demo) { + System.out.println("Demo Number " + demo); + KieContainer kieClasspathContainer = KieServices.Factory.get().getKieClasspathContainer(); + KieSession ksession = kieClasspathContainer.newKieSession("StatefulApplicationValidationDemo" + demo); + + List applications = ApplicationRepository.getApplications(); + applications.forEach(ksession::insert); + + System.out.println("==== DROOLS SESSION START ==== "); + ksession.fireAllRules(); + if (Common.disposeSession) { + ksession.dispose(); + } + System.out.println("==== DROOLS SESSION END ==== "); + + System.out.println("==== VALIDATION STATUS AFTER SESSION === "); + applications.forEach(application -> { + if (demo == 1) { + System.out.println(application + " result: Application " + application.getStatus() ); + } + if (demo == 2) { + System.out.println(application + " result: " + application.getStatus() + ", reason: " + application.getReason()); + } + }); + + } +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/lesson03/CrossValidation.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/lesson03/CrossValidation.java new file mode 100644 index 0000000..21defc6 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/lesson03/CrossValidation.java @@ -0,0 +1,72 @@ +package org.sw.lesson03; + +import org.sw.builder.ApplicationRepository; +import org.sw.builder.ClientIdRepository; +import org.sw.facts.Application; +import org.sw.facts.Claim; +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import org.sw.builder.ClaimRepository; +import org.sw.builder.PolicyRepository; +import org.sw.Common; + +import org.kie.api.KieServices; +import org.kie.api.runtime.KieContainer; +import org.kie.api.runtime.KieSession; + +import java.util.List; + +public class CrossValidation { + public static void main(final String[] args) { + execute(Common.promptForDemo(3, args, 1, 3)); + } + + + static void execute(int demo) { + System.out.println("Demo Number " + demo); + + if (demo == 1) { + KieContainer kieClasspathContainer = KieServices.Factory.get().getKieClasspathContainer(); + KieSession ksession = kieClasspathContainer.newKieSession("CrossValidationDemo" + demo); + + List claims = ClaimRepository.getClaims(); + claims.forEach(ksession::insert); + + List policies = PolicyRepository.getPolicies(); + policies.forEach(ksession::insert); + + System.out.println("==== DROOLS SESSION START ==== "); + ksession.fireAllRules(); + if (Common.disposeSession) { + ksession.dispose(); + } + System.out.println("==== DROOLS SESSION END ==== "); + + System.out.println("==== CLAIMS VALIDATION STATUS AFTER SESSION === "); + claims.forEach(claim -> System.out.println(claim + " verdict: " + claim.getStatus()) + ); + } + + if (demo >= 2) { + KieContainer kieClasspathContainer = KieServices.Factory.get().getKieClasspathContainer(); + KieSession ksession = kieClasspathContainer.newKieSession("CrossValidationDemo" + demo); + + List applications = ApplicationRepository.getApplications(); + applications.forEach(ksession::insert); + + List clientIDs = ClientIdRepository.getClientIDs(); + clientIDs.forEach(ksession::insert); + + + System.out.println("==== DROOLS SESSION START ==== "); + ksession.fireAllRules(); + if (Common.disposeSession) { + ksession.dispose(); + } + System.out.println("==== DROOLS SESSION END ==== "); + + System.out.println("==== APPLICATIONS AFTER DROOLS SESSION === "); + applications.forEach(application -> System.out.println(application + " verdict: " + application.getStatus())); + } + } +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/lesson04/EventStream.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/lesson04/EventStream.java new file mode 100644 index 0000000..dd29694 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/lesson04/EventStream.java @@ -0,0 +1,68 @@ +package org.sw.lesson04; + +import org.kie.api.event.rule.*; + +import java.io.PrintStream; + +public class EventStream extends DebugAgendaEventListener { + private PrintStream stream; + + public EventStream() { + super(); + } + + public EventStream(PrintStream stream) { + super(stream); + this.stream = stream; + } + + @Override + public void matchCancelled(MatchCancelledEvent event) { + //super.matchCancelled(event); + } + + @Override + public void matchCreated(MatchCreatedEvent event) { + //super.matchCreated(event); + } + + @Override + public void afterMatchFired(AfterMatchFiredEvent event) { + //super.afterMatchFired(event); + } + + @Override + public void agendaGroupPopped(AgendaGroupPoppedEvent event) { + stream.println("==> " + event.getAgendaGroup() + " popped from stack "); + } + + @Override + public void agendaGroupPushed(AgendaGroupPushedEvent event) { + stream.println("==> " + event.getAgendaGroup() + " pushed to stack "); + } + + @Override + public void beforeMatchFired(BeforeMatchFiredEvent event) { + //super.beforeMatchFired(event); + } + + @Override + public void beforeRuleFlowGroupActivated(RuleFlowGroupActivatedEvent event) { + //super.beforeRuleFlowGroupActivated(event); + } + + @Override + public void afterRuleFlowGroupActivated(RuleFlowGroupActivatedEvent event) { + //super.afterRuleFlowGroupActivated(event); + } + + @Override + public void beforeRuleFlowGroupDeactivated(RuleFlowGroupDeactivatedEvent event) { + //super.beforeRuleFlowGroupDeactivated(event); + } + + @Override + public void afterRuleFlowGroupDeactivated(RuleFlowGroupDeactivatedEvent event) { + //super.afterRuleFlowGroupDeactivated(event); + } +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/lesson04/FactInsertionAndExecutionOrder.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/lesson04/FactInsertionAndExecutionOrder.java new file mode 100644 index 0000000..1a5a334 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/lesson04/FactInsertionAndExecutionOrder.java @@ -0,0 +1,83 @@ +package org.sw.lesson04; + +import org.kie.api.event.rule.ObjectDeletedEvent; +import org.kie.api.event.rule.ObjectInsertedEvent; +import org.kie.api.event.rule.ObjectUpdatedEvent; +import org.kie.api.event.rule.RuleRuntimeEventListener; +import org.kie.api.runtime.rule.Agenda; +import org.kie.api.KieServices; +import org.kie.api.runtime.KieContainer; +import org.kie.api.runtime.KieSession; + +import org.sw.facts.*; +import org.sw.builder.*; +import org.sw.Common; + +import java.time.LocalDate; +import java.util.List; +import java.util.stream.Collectors; + +public class FactInsertionAndExecutionOrder { + public static void main(final String[] args) { + execute(Common.promptForDemo(4, args, 1, 5)); + } + + + static void execute(int demo) { + System.out.println("Demo Number " + demo); + + KieContainer kieClasspathContainer = KieServices.Factory.get().getKieClasspathContainer(); + KieSession ksession = kieClasspathContainer.newKieSession("FactInsertionAndExecutionOrderDemo" + demo); + + ksession.addEventListener(new EventStream(System.out)); + + List claims = ClaimRepository.getClaims(); + + if (demo == 5) { + if (Common.promptForYesNoQuestion("Do you want to set all claims to 1,000,000?")) { + System.out.println("All claims set to 1,000,000"); + claims.forEach(claim -> claim.setClaimAmount(1000000)); + } + } + + claims.forEach(ksession::insert); + + List policies = PolicyRepository.getPolicies(); + policies.forEach(ksession::insert); + +/* List applications = ApplicationRepository.getApplications(); + applications.forEach(ksession::insert); + + List clientIDs = ClientIdRepository.getClientIDs(); + clientIDs.forEach(ksession::insert);*/ + + if (demo == 3) { + Agenda agenda = ksession.getAgenda(); + agenda.getAgendaGroup("issue-payout").setFocus(); + agenda.getAgendaGroup("valid-claim").setFocus(); + agenda.getAgendaGroup("invalid-claim").setFocus(); + } + + if (demo == 4 || demo == 5) { + Agenda agenda = ksession.getAgenda(); + agenda.getAgendaGroup("issue-payout").setFocus(); + agenda.getAgendaGroup("claim-validation").setFocus(); + } + + System.out.println("==== DROOLS SESSION START ==== "); + ksession.fireAllRules(); + System.out.println("==== DROOLS SESSION END ==== "); + + List payoutObjects = ksession + .getObjects(o -> o.getClass() == Payout.class).stream() + .map(o -> (Payout) o) + .collect(Collectors.toList()); + System.out.println("== PAYOUTS ISSUED == "); + payoutObjects.forEach(System.out::println); + + if (Common.disposeSession) { + ksession.dispose(); + } + + } +} diff --git a/Course Material/Day two/insurance/insurance/src/main/java/org/sw/lesson05/InsertLogicalAndFactObjects.java b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/lesson05/InsertLogicalAndFactObjects.java new file mode 100644 index 0000000..d84cdc0 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/java/org/sw/lesson05/InsertLogicalAndFactObjects.java @@ -0,0 +1,82 @@ +package org.sw.lesson05; + +import org.kie.api.KieServices; +import org.kie.api.runtime.KieSession; +import org.kie.api.event.rule.ObjectDeletedEvent; +import org.kie.api.event.rule.ObjectInsertedEvent; +import org.kie.api.event.rule.ObjectUpdatedEvent; +import org.kie.api.event.rule.RuleRuntimeEventListener; +import java.util.List; +import java.util.stream.Collectors; + +import org.sw.builder.*; +import org.sw.facts.*; +import org.sw.Common; + +public class InsertLogicalAndFactObjects { + public static void main(final String[] args) { + execute(Common.promptForDemo(5, args, 1, 4)); + } + + + static SessionData execute(int demo) { + System.out.println("Running Demo " + demo); + SessionData sessionData = new SessionData(); + + KieSession ksession = KieServices.Factory.get().getKieClasspathContainer().newKieSession("InsertLogicalAndFactObjectsDemo" + demo); + + List claims = ClaimRepository.getClaims(); + claims.forEach(ksession::insert); + + List policies = PolicyRepository.getPolicies(); + policies.forEach(ksession::insert); + + ksession.addEventListener(new RuleRuntimeEventListener() { + @Override + public void objectInserted(ObjectInsertedEvent event) { + System.out.println("==> " + event.getObject() + " inserted"); + } + + @Override + public void objectUpdated(ObjectUpdatedEvent event) { + System.out.println("==> " + event.getObject() + " updated"); + } + + @Override + public void objectDeleted(ObjectDeletedEvent event) { + System.out.println("==> " + event.getOldObject() + " deleted"); + } + }); + + System.out.println("==== DROOLS SESSION START ==== "); + ksession.fireAllRules(); + System.out.println("==== DROOLS SESSION END ==== "); + + if (demo >= 1) { + System.out.println("==== VALID CLAIMS INSERTED === "); + sessionData.validClaims = ksession.getObjects(o -> o.getClass() == ValidClaim.class).stream() + .map(o -> (ValidClaim) o) + .collect(Collectors.toList()); + sessionData.validClaims.forEach(System.out::println); + + System.out.println("==== INVALID CLAIMS INSERTED === "); + sessionData.invalidClaims = ksession.getObjects(o -> o.getClass() == InvalidClaim.class).stream() + .map(o -> (InvalidClaim) o) + .collect(Collectors.toList()); + sessionData.invalidClaims.forEach(System.out::println); + + List payoutObjects = ksession + .getObjects(o -> o.getClass() == Payout.class).stream() + .map(o -> (Payout) o) + .collect(Collectors.toList()); + System.out.println("== PAYOUTS ISSUED == "); + payoutObjects.forEach(System.out::println); + } + + if (Common.disposeSession) { + ksession.dispose(); + } + return sessionData; + + } +} diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/META-INF/kmodule.xml b/Course Material/Day two/insurance/insurance/src/main/resources/META-INF/kmodule.xml new file mode 100644 index 0000000..8fabb1d --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/META-INF/kmodule.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson01/demo1/ApplicationValidation.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson01/demo1/ApplicationValidation.drl new file mode 100644 index 0000000..7b7ec58 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson01/demo1/ApplicationValidation.drl @@ -0,0 +1,17 @@ +package org.sw.lesson01.demo1; + +import org.sw.facts.Application; + +rule "Invalidate application with Pre-existing conditions, underage, or unemployed" + when + Application( clientAge < 18 || !employed || PEC ) + then + System.out.println("Application Invalid - Client is minor, unemployed, or has PECs"); +end + +rule "Valid Application" + when + Application( clientAge >= 18 && employed && !PEC ) + then + System.out.println("Application Validated"); +end diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson01/demo2/ApplicationValidation.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson01/demo2/ApplicationValidation.drl new file mode 100644 index 0000000..07e5a8c --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson01/demo2/ApplicationValidation.drl @@ -0,0 +1,34 @@ +package org.sw.lesson01.demo2; + +import org.sw.facts.Application; + +rule "Invalid application - underaged" + dialect "java" + when + Application( clientAge < 18 ) + then + System.out.println("Application Invalid – client is underaged"); +end + +rule "Invalid application – unemployed" + dialect "java" + when + Application( !employed ) + then + System.out.println("Application Invalid – client is unemployed"); +end + +rule "Invalid application – has pre-existing conditions" + dialect "java" + when + Application( PEC ) + then + System.out.println("Application Invalid – client has PECs"); +end + +rule "Valid Application" + when + $application: Application( clientAge >= 18 && employed && !PEC ) + then + System.out.println("Application Validated"); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson01/demo3/ApplicationValidation.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson01/demo3/ApplicationValidation.drl new file mode 100644 index 0000000..4b37952 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson01/demo3/ApplicationValidation.drl @@ -0,0 +1,27 @@ +package org.sw.lesson01.demo3; + +import org.sw.facts.Application; + +rule "Invalid application from minor" + dialect "java" + when + $application: Application( $clientAge: clientAge < 18 ) + then + System.out.println($application + ": Invalid – client age: " + $clientAge); +end + +rule "Invalid application – unemployed" + dialect "java" + when + $application: Application( $employed: employed == false ) + then + System.out.println($application + ": Invalid – unemployed: " + $employed); +end + +rule "Valid Application" + dialect "java" + when + $application: Application( employed, clientAge >= 18 ) + then + System.out.println($application + ": Validated"); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson01/demo4/ApplicationValidation.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson01/demo4/ApplicationValidation.drl new file mode 100644 index 0000000..1ea6781 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson01/demo4/ApplicationValidation.drl @@ -0,0 +1,40 @@ +package org.sw.lesson01.demo4; + +import org.sw.facts.Application; +import org.sw.facts.Status; + +rule "Valid Application" + dialect "java" + when + $application: Application( !PEC , employed , clientAge >= 18 ) + then + System.out.println($application + ": Validated"); + $application.setStatus(Status.APPROVED); +end + +rule "Invalid application - minor" + dialect "java" + when + $application: Application( clientAge < 18 ) + then + System.out.println($application + ": Invalid – Client age: " + $application.getClientAge()); + $application.setStatus(Status.DENIED); +end + +rule "Invalid application - unemployed" + dialect "java" + when + $application: Application( !employed ) + then + System.out.println($application + ": Invalid - Client unemployed"); + $application.setStatus(Status.DENIED); +end + +rule "Invalid application - Pre-existing Condition" + dialect "java" + when + $application: Application( PEC ) + then + System.out.println($application + ": Invalid - Client has PEC"); + $application.setStatus(Status.DENIED); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson01/demo5/ApplicationValidation.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson01/demo5/ApplicationValidation.drl new file mode 100644 index 0000000..b5cde7e --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson01/demo5/ApplicationValidation.drl @@ -0,0 +1,41 @@ +package org.sw.lesson01.demo5; + +import org.sw.facts.Application; +import org.sw.facts.Status; + +//Move to end of File +rule "Valid Application" + dialect "java" + when + $application: Application( status == Status.PENDING ) + then + System.out.println($application + ": Not Invalidated - Approval Granted"); + $application.setStatus(Status.APPROVED); +end + +rule "Invalid application - minor" + dialect "java" + when + $application: Application( clientAge < 18 ) + then + System.out.println($application + ": Invalid – Client age: " + $application.getClientAge()); + $application.setStatus(Status.DENIED); +end + +rule "Invalid application - unemployed" + dialect "java" + when + $application: Application( !employed ) + then + System.out.println($application + ": Invalid - Client unemployed"); + $application.setStatus(Status.DENIED); +end + +rule "Invalid application - Pre-existing Condition" + dialect "java" + when + $application: Application( PEC ) + then + System.out.println($application + ": Invalid - Client has PEC"); + $application.setStatus(Status.DENIED); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson02/demo1/ApplicationValidation.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson02/demo1/ApplicationValidation.drl new file mode 100644 index 0000000..c3fff4d --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson02/demo1/ApplicationValidation.drl @@ -0,0 +1,45 @@ +package org.sw.lesson02.demo1; + +import org.sw.facts.Application; +import org.sw.facts.Status; + +rule "Invalidate application if not employed" + dialect "java" + when + $application: Application( !employed ) + then + System.out.println($application + ": Invalid – Unemployed"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate application from minor" + when + $application: Application( clientAge < 18 ) + then + System.out.println($application + ": Invalid – Minor"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Invalid application – has pre-existing conditions" + when + $application: Application( ) + then + System.out.println($application + ": Invalid – Client has PEC"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Valid Application" + when + $application: Application( status == Status.PENDING ) + then + System.out.println($application + ": Approval Granted!"); + modify($application) { + setStatus(Status.APPROVED) + } +end diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson02/demo2/ApplicationValidation.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson02/demo2/ApplicationValidation.drl new file mode 100644 index 0000000..9cee882 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson02/demo2/ApplicationValidation.drl @@ -0,0 +1,52 @@ +package org.sw.lesson02.demo2; + +import org.sw.facts.Application; +import org.sw.facts.Status; + +rule "Invalidate application if not employed" + dialect "java" + when + $application: Application( !employed ) + then + System.out.println($application + ": Invalid – Unemployed"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client unemployed") + } +end + +rule "Invalidate application from minor" + dialect "java" + when + $application: Application( clientAge < 18 ) + + then + System.out.println($application + ": Invalid – Minor"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client underaged") + } +end + +rule "Invalid application – has pre-existing conditions" + dialect "java" + when + $application: Application( PEC ) + then + System.out.println($application + ": Invalid – Client has PEC"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client has PEC") + } +end + +rule "Valid Application" + dialect "java" + when + $application: Application( status == Status.PENDING ) + then + System.out.println($application + ": Approval Granted!"); + modify($application) { + setStatus(Status.APPROVED) + } +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson03/demo1/ClaimValidation.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson03/demo1/ClaimValidation.drl new file mode 100644 index 0000000..103ad94 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson03/demo1/ClaimValidation.drl @@ -0,0 +1,52 @@ +package org.sw.lesson03.demo1; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; + +rule "Invalidate claim without matching policy" + dialect "java" + when + $claim: Claim( ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + then + System.out.println($claim + ": failed (no matching policy)"); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + when + $claim: Claim( ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + when + $claim: Claim( ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + System.out.println($claim + ": failed. Unpaid premiums in " + $policy); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Valid Claims" + dialect "java" + when + $claim: Claim( status == Status.PENDING ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + modify($claim) { + setStatus(Status.APPROVED) + } +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson03/demo2/ApplicationIDCrossValidation.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson03/demo2/ApplicationIDCrossValidation.drl new file mode 100644 index 0000000..21c9cf9 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson03/demo2/ApplicationIDCrossValidation.drl @@ -0,0 +1,42 @@ +package org.sw.lesson03.demo2; + +import org.sw.facts.Application; +import org.sw.facts.ClientID; +import org.sw.facts.Status; +import java.time.LocalDate; + +rule "Invalidate applications with missing ID" + dialect "java" + when + $application: Application( ) + not ClientID( idNumber == $application.clientIdNumber ) + then + System.out.println($application + " Invalid – No matching ID found"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate applications with incorrect name" + dialect "java" + when + $application: Application( ) + $clientID: ClientID( idNumber == $application.clientIdNumber, name != $application.clientName ) + then + System.out.println($application + " Invalid – Name [" + $application.getClientName() + "] not matching name on ID [" + $clientID.getName() + "]"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate applications with Expired ID" + dialect "java" + when + $application: Application( ) + $clientid: ClientID( idNumber == $application.clientIdNumber, expiryDate.isBefore(LocalDate.now()) ) + then + System.out.println($application + " Invalid – " + $clientid + " ID expired"); + modify($application) { + setStatus(Status.DENIED) + } +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson03/demo2/ApplicationValidation.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson03/demo2/ApplicationValidation.drl new file mode 100644 index 0000000..c811c96 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson03/demo2/ApplicationValidation.drl @@ -0,0 +1,52 @@ +package org.sw.lesson03.demo2; + +import org.sw.facts.Application; +import org.sw.facts.Status; + +rule "Invalidate application if not employed" + dialect "java" + when + $application: Application( !employed ) + then + System.out.println($application + ": Invalid – Unemployed"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client unemployed") + } +end + +rule "Invalidate application from minor" + dialect "java" + when + $application: Application( clientAge < 18 ) + + then + System.out.println($application + ": Invalid – Minor"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client underaged") + } +end + +rule "Invalid application – has pre-existing conditions" + dialect "java" + when + $application: Application( PEC ) + then + System.out.println($application + ": Invalid – Client has PEC"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client has PEC") + } +end + +rule "Valid Application" + dialect "java" + when + $application: Application( status == Status.PENDING ) + then + System.out.println($application + ": Approval Granted!"); + modify($application) { + setStatus(Status.APPROVED) + } +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson03/demo3/ApplicationIDCrossValidation.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson03/demo3/ApplicationIDCrossValidation.drl new file mode 100644 index 0000000..7b652d1 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson03/demo3/ApplicationIDCrossValidation.drl @@ -0,0 +1,43 @@ +package org.sw.lesson03.demo3; + +import org.sw.facts.Application; +import org.sw.facts.ClientID; +import org.sw.facts.Status; +import java.time.LocalDate; + +rule "Invalidate Applications with missing ID" + dialect "java" + when + $application: Application( status != Status.DENIED ) + not ClientID( idNumber == $application.getClientIdNumber()) + then + System.out.println($application + " Invalid – No matching ID found"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate applications with incorrect name" + dialect "java" + when + $application: Application( status != Status.DENIED ) + $clientID: ClientID( idNumber == $application.getClientIdNumber(), name != $application.clientName ) + then + System.out.println($application + " Invalid – Name [" + $application.getClientName() + "] not matching name on ID [" + $clientID.getName() + "]"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate Applications with Expired ID" + dialect "java" + when + $application: Application( status != Status.DENIED ) + $clientid: ClientID( idNumber == $application.getClientIdNumber(), + expiryDate.isBefore(LocalDate.now()) ) + then + System.out.println($application + " Invalid – " + $clientid + " ID expired"); + modify($application) { + setStatus(Status.DENIED) + } +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson03/demo3/ApplicationValidation.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson03/demo3/ApplicationValidation.drl new file mode 100644 index 0000000..bc90a35 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson03/demo3/ApplicationValidation.drl @@ -0,0 +1,55 @@ +package org.sw.lesson03.demo3; + +import org.sw.facts.Application; +import org.sw.facts.Status; + +rule "Invalidate application if not employed" + dialect "java" + when + $application: Application( !employed, + status != Status.DENIED ) + then + System.out.println($application + ": Invalid – Unemployed"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client unemployed") + } +end + +rule "Invalidate application from minor" + dialect "java" + when + $application: Application( clientAge < 18, + status != Status.DENIED ) + + then + System.out.println($application + ": Invalid – Minor"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client underaged") + } +end + +rule "Invalid application – has pre-existing conditions" + dialect "java" + when + $application: Application( PEC, + status != Status.DENIED ) + then + System.out.println($application + ": Invalid – Client has PEC"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client has PEC") + } +end + +rule "Valid Application" + dialect "java" + when + $application: Application( status == Status.PENDING ) + then + System.out.println($application + ": Approval Granted!"); + modify($application) { + setStatus(Status.APPROVED) + } +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo1/ClaimValidation.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo1/ClaimValidation.drl new file mode 100644 index 0000000..974da63 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo1/ClaimValidation.drl @@ -0,0 +1,51 @@ +package org.sw.lesson04.demo1; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; +import org.sw.facts.Payout; + +rule "Valid Claims" + dialect "java" + when + $claim: Claim( status == Status.PENDING ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + modify($claim) { + setStatus(Status.APPROVED) + } +end + +rule "Issue Payout" + dialect "java" + when + $claim: Claim(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insert( payout ); +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + System.out.println($claim + ": failed. Unpaid premiums in " + $policy); + modify($claim) { + setStatus(Status.DENIED) + } +end diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo2/ClaimValidation.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo2/ClaimValidation.drl new file mode 100644 index 0000000..2dfbe8e --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo2/ClaimValidation.drl @@ -0,0 +1,56 @@ +package org.sw.lesson04.demo2; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; + +rule "Valid Claims" + dialect "java" + salience 20 + when + $claim: Claim( status == Status.PENDING ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + modify($claim) { + setStatus(Status.APPROVED) + } +end + +rule "Invalidate claim without matching policy" + dialect "java" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + then + System.out.println($claim + ": failed (no matching policy)"); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + System.out.println($claim + ": failed. Unpaid premiums in " + $policy); + modify($claim) { + setStatus(Status.DENIED) + } +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo2/PayoutIssue.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo2/PayoutIssue.drl new file mode 100644 index 0000000..07ff371 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo2/PayoutIssue.drl @@ -0,0 +1,16 @@ +package org.sw.lesson04.demo2; + +import org.sw.facts.Claim; +import org.sw.facts.Status; +import org.sw.facts.Payout; + +rule "Issue Payout" + dialect "java" + salience 0 + when + $claim: Claim(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insert( payout ); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo3/ClaimValidation.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo3/ClaimValidation.drl new file mode 100644 index 0000000..0d8052c --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo3/ClaimValidation.drl @@ -0,0 +1,56 @@ +package org.sw.lesson04.demo3; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; + +rule "Valid Claims" + dialect "java" + agenda-group "valid-claim" + when + $claim: Claim( status == Status.PENDING ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + modify($claim) { + setStatus(Status.APPROVED) + } +end + +rule "Invalidate claim without matching policy" + dialect "java" + agenda-group "invalid-claim" + when + $claim: Claim( status != Status.DENIED ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + then + System.out.println($claim + ": failed (no matching policy)"); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + agenda-group "invalid-claim" + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + agenda-group "invalid-claim" + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + System.out.println($claim + ": failed. Unpaid premiums in " + $policy); + modify($claim) { + setStatus(Status.DENIED) + } +end diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo3/PayoutIssue.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo3/PayoutIssue.drl new file mode 100644 index 0000000..90c9915 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo3/PayoutIssue.drl @@ -0,0 +1,19 @@ +package org.sw.lesson04.demo3; + +import java.util.Random; +import org.sw.facts.Claim; +import org.sw.facts.Application; +import org.sw.facts.Policy; +import org.sw.facts.Status; +import org.sw.facts.Payout; + +rule "Issue Payout" + dialect "java" + agenda-group "issue-payout" + when + $claim: Claim(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insert( payout ); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo4/ClaimValidation.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo4/ClaimValidation.drl new file mode 100644 index 0000000..bbcf561 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo4/ClaimValidation.drl @@ -0,0 +1,60 @@ +package org.sw.lesson04.demo4; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; + +rule "Valid Claims" + dialect "java" + agenda-group "claim-validation" + salience 20 + when + $claim: Claim( status == Status.PENDING ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + modify($claim) { + setStatus(Status.APPROVED) + } +end + +rule "Invalidate claim without matching policy" + dialect "java" + agenda-group "claim-validation" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + then + System.out.println($claim + ": failed (no matching policy)"); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + agenda-group "claim-validation" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + agenda-group "claim-validation" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + System.out.println($claim + ": failed. Unpaid premiums in " + $policy); + modify($claim) { + setStatus(Status.DENIED) + } +end diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo4/PayoutIssue.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo4/PayoutIssue.drl new file mode 100644 index 0000000..a42ca92 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo4/PayoutIssue.drl @@ -0,0 +1,16 @@ +package org.sw.lesson04.demo4; + +import org.sw.facts.Claim; +import org.sw.facts.Status; +import org.sw.facts.Payout; + +rule "Issue Payout" + dialect "java" + agenda-group "issue-payout" + when + $claim: Claim(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insert( payout ); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo5/ClaimValidation.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo5/ClaimValidation.drl new file mode 100644 index 0000000..dbf3753 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo5/ClaimValidation.drl @@ -0,0 +1,60 @@ +package org.sw.lesson04.demo5; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; + +rule "Valid Claims" + dialect "java" + agenda-group "claim-validation" + salience 20 + when + $claim: Claim( status == Status.PENDING ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + modify($claim) { + setStatus(Status.APPROVED) + } +end + +rule "Invalidate claim without matching policy" + dialect "java" + agenda-group "claim-validation" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + then + System.out.println($claim + ": failed (no matching policy)"); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + agenda-group "claim-validation" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + agenda-group "claim-validation" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + System.out.println($claim + ": failed. Unpaid premiums in " + $policy); + modify($claim) { + setStatus(Status.DENIED) + } +end diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo5/PayoutIssue.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo5/PayoutIssue.drl new file mode 100644 index 0000000..a9a2142 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo5/PayoutIssue.drl @@ -0,0 +1,16 @@ +package org.sw.lesson04.demo5; + +import org.sw.facts.Claim; +import org.sw.facts.Status; +import org.sw.facts.Payout; + +rule "Issue Payout" + dialect "java" + agenda-group "issue-payout" + when + $claim: Claim(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insert( payout ); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo5/Verdict.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo5/Verdict.drl new file mode 100644 index 0000000..f33b618 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson04/demo5/Verdict.drl @@ -0,0 +1,25 @@ +package org.sw.lesson04.demo5; + +import org.sw.facts.Payout +import org.sw.facts.Claim +import org.sw.facts.Status + +rule "Report Payouts Issued" + dialect "java" + activation-group "verdict" + salience 20 + when + Payout() + then + System.out.println("Verdict: Payouts were issued this session"); +end + +rule "Report payouts " + dialect "java" + activation-group "verdict" + salience 10 + when + Claim( status == Status.DENIED ) + then + System.out.println("Verdict: No Payouts issued this session"); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo1/ClaimValidation.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo1/ClaimValidation.drl new file mode 100644 index 0000000..83e5eca --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo1/ClaimValidation.drl @@ -0,0 +1,63 @@ +package org.sw.lesson05.demo1; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; +import org.sw.facts.Payout; + +rule "Valid Claims" + dialect "java" + when + $claim: Claim( status == Status.PENDING ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + modify($claim) { + setStatus(Status.APPROVED) + } +end + +rule "Issue Payout" + dialect "java" + when + $claim: Claim(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insertLogical( payout ); +end + +rule "Invalidate claim without matching policy" + dialect "java" + when + $claim: Claim( status != Status.DENIED ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + then + System.out.println($claim + ": failed (no matching policy)"); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + System.out.println($claim + ": failed. Unpaid premiums in " + $policy); + modify($claim) { + setStatus(Status.DENIED) + } +end diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo2/ClaimValidation.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo2/ClaimValidation.drl new file mode 100644 index 0000000..ccda17c --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo2/ClaimValidation.drl @@ -0,0 +1,48 @@ +package org.sw.lesson05.demo2; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; +import org.sw.facts.Payout; +import org.sw.facts.InvalidClaim; +import org.sw.facts.ValidClaim; + +rule "Valid Claims" + dialect "java" + when + $claim: Claim( ) + not (InvalidClaim( claim == $claim) ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + insertLogical( new ValidClaim($claim) ); +end + +rule "Invalidate claim without matching policy" + dialect "java" + when + $claim: Claim( ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + then + System.out.println($claim + ": failed (no matching policy)"); + insert( new InvalidClaim($claim) ); +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + when + $claim: Claim( ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + insert( new InvalidClaim($claim) ); +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + when + $claim: Claim( ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + System.out.println($claim + ": failed. Unpaid premiums in " + $policy); + insert( new InvalidClaim($claim) ); +end diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo2/PayoutIssue.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo2/PayoutIssue.drl new file mode 100644 index 0000000..4ed915a --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo2/PayoutIssue.drl @@ -0,0 +1,17 @@ +package org.sw.lesson05.demo2; + +import org.sw.facts.Payout +import org.sw.facts.Policy +import org.sw.facts.Claim +import org.sw.facts.ValidClaim; + + +rule "Issue Payout" + dialect "java" + when + $validClaim : ValidClaim( $claim : claim ) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insertLogical( payout ); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo3/ClaimValidation.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo3/ClaimValidation.drl new file mode 100644 index 0000000..62598ed --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo3/ClaimValidation.drl @@ -0,0 +1,52 @@ +package org.sw.lesson05.demo3; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; +import org.sw.facts.Payout; +import org.sw.facts.InvalidClaim; +import org.sw.facts.ValidClaim; +import org.sw.facts.InvalidPolicy; + +rule "Valid Claims" + dialect "java" + when + $claim: Claim( ) + not (InvalidClaim( claim == $claim) ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + insertLogical( new ValidClaim($claim) ); +end + +rule "Invalidate claim without matching policy" + dialect "java" + when + $claim: Claim( ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + not InvalidClaim( claim.policyNumber == $claim.policyNumber) + then + System.out.println($claim + ": failed (no matching policy)"); + insert( new InvalidClaim($claim) ); +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + when + $claim: Claim( ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + not InvalidClaim( claim.policyNumber == $claim.policyNumber) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + insert( new InvalidClaim($claim) ); +end + +rule "Invalidate claim with invalid policy" + dialect "java" + when + $invalidPolicy: InvalidPolicy( ) + $claim: Claim( policyNumber == $invalidPolicy.policy.policyNumber ) + not InvalidClaim( claim.policyNumber == $claim.policyNumber) + then + System.out.println($claim + ": failed. " + $invalidPolicy + " Invalid"); + insert( new InvalidClaim($claim) ); +end diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo3/PayoutIssue.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo3/PayoutIssue.drl new file mode 100644 index 0000000..364102e --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo3/PayoutIssue.drl @@ -0,0 +1,16 @@ +package org.sw.lesson05.demo3; + +import org.sw.facts.Payout +import org.sw.facts.Policy +import org.sw.facts.Claim +import org.sw.facts.ValidClaim; + +rule "Issue Payout" + dialect "java" + when + $validClaim : ValidClaim( $claim : claim ) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insertLogical( payout ); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo3/PolicyValidation.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo3/PolicyValidation.drl new file mode 100644 index 0000000..4580edc --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo3/PolicyValidation.drl @@ -0,0 +1,14 @@ +package org.sw.lesson05.demo3; + +import org.sw.facts.Policy +import org.sw.facts.InvalidPolicy + +rule "Invalidate unpaid Policy" + dialect "java" + when + $policy: Policy( paymentStatus == "Unpaid" ) + not InvalidPolicy( policy.policyNumber == $policy.policyNumber) + then + System.out.println("Policy [" + $policy + "] invalidated due to unpaid premiums"); + insert( new InvalidPolicy($policy) ); +end diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo4/ClaimValidation.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo4/ClaimValidation.drl new file mode 100644 index 0000000..ef38a2a --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo4/ClaimValidation.drl @@ -0,0 +1,41 @@ +package org.sw.lesson05.demo4; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; +import org.sw.facts.Payout; +import org.sw.facts.InvalidClaim; +import org.sw.facts.ValidClaim; +import org.sw.facts.InvalidPolicy; + +rule "Invalidate claim without matching policy" + dialect "java" + when + $claim: Claim( ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + not InvalidClaim( claim.policyNumber == $claim.policyNumber) + then + System.out.println($claim + ": failed (no matching policy)"); + insert( new InvalidClaim($claim) ); +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + when + $claim: Claim( ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + insert( new InvalidClaim($claim) ); +end + +rule "Invalidate claim with invalid policy" + dialect "java" + when + $invalidPolicy: InvalidPolicy( ) + $claim: Claim( policyNumber == $invalidPolicy.policy.policyNumber ) + not InvalidClaim( claim.policyNumber == $claim.policyNumber) + then + System.out.println($claim + ": failed. " + $invalidPolicy + " Invalid"); + insert( new InvalidClaim($claim) ); +end diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo4/PolicyValidation.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo4/PolicyValidation.drl new file mode 100644 index 0000000..687db68 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo4/PolicyValidation.drl @@ -0,0 +1,14 @@ +package org.sw.lesson05.demo4; + +import org.sw.facts.Policy +import org.sw.facts.InvalidPolicy + +rule "Invalidate unpaid Policy" + dialect "java" + when + $policy: Policy( paymentStatus == "Unpaid" ) + not InvalidPolicy( policy.policyNumber == $policy.policyNumber) + then + System.out.println("Policy [" + $policy + "] invalidated due to unpaid premiums"); + insert( new InvalidPolicy($policy) ); +end diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo4/XPayoutIssue.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo4/XPayoutIssue.drl new file mode 100644 index 0000000..9898130 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson05/demo4/XPayoutIssue.drl @@ -0,0 +1,17 @@ +package org.sw.lesson05.demo4; + +import org.sw.facts.Payout +import org.sw.facts.Policy +import org.sw.facts.Claim +import org.sw.facts.InvalidClaim; + +rule "Issue Payout" + dialect "java" + when + $claim: Claim( ) + not InvalidClaim( claim.policyNumber == $claim.policyNumber) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insertLogical( payout ); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo1/FamilyApplication.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo1/FamilyApplication.drl new file mode 100644 index 0000000..6ef783a --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo1/FamilyApplication.drl @@ -0,0 +1,29 @@ +package org.sw.lesson06.demo1; + +import org.sw.facts.FamilyApplication; +import org.sw.facts.InvalidFamilyApplication +import org.sw.facts.InvalidClientID; +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import java.util.Random; + +/*rule "Invalidate family applications with invalid ID" + dialect "java" + when + $familyApplication: FamilyApplication( ) + InvalidClientID( $familyApplication.clientIdNumbers.contains(clientID.idNumber) ) + then + System.out.println( "Set " + $familyApplication + " invalid - invalid ID found"); + insert( new InvalidFamilyApplication($familyApplication) ); +end*/ + +rule "Invalidate family applications with single expired ID" + dialect "java" + salience 50 + when + $familyApplication: FamilyApplication( $ids: clientIdNumbers ) + ClientID( $id: idNumber, isExpired() == true, $id memberOf $ids ) + then + System.out.println( "Set " + $familyApplication + " invalid - expired ID found for ID: " + $id); + insert( new InvalidFamilyApplication($familyApplication) ); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo1/PolicyIssue.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo1/PolicyIssue.drl new file mode 100644 index 0000000..5c7570c --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo1/PolicyIssue.drl @@ -0,0 +1,31 @@ +package org.sw.lesson06.demo1; + +import org.sw.facts.FamilyApplication; +import org.sw.facts.InvalidFamilyApplication +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import java.util.Random; + +rule "Issue New Policy to Valid Application" + dialect "java" + salience 20 + when + $familyApplication: FamilyApplication() + not InvalidFamilyApplication(familyApplication.applicationNumber == $familyApplication.applicationNumber) + $clientIdNumber: String() from $familyApplication.clientIdNumbers + $clientID: ClientID(idNumber == $clientIdNumber, $name: name) + then + Random random = new Random(); + int premium = 50 + random.nextInt(51); // Random number between 50 and 100 + int coverage = premium * 100; + + Policy newPolicy = new Policy(); + newPolicy.setPolicyNumber($familyApplication.getApplicationNumber()); + newPolicy.setClientName($name); + newPolicy.setPremium(premium); + newPolicy.setCoverage(coverage); + newPolicy.setPaymentStatus("Unpaid"); + + insert(newPolicy); + System.out.println("New policy issued: " + newPolicy); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo1/ValidateID.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo1/ValidateID.drl new file mode 100644 index 0000000..1b7edae --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo1/ValidateID.drl @@ -0,0 +1,13 @@ +package org.sw.lesson06.demo1; + +import org.sw.facts.ClientID; +import org.sw.facts.InvalidClientID; + +/* +rule "Invalidate Expired ID" + when + $clientID: ClientID( isExpired()) + then + System.out.println($clientID + " is expired."); + insert( new InvalidClientID($clientID)); +end*/ diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo2/FamilyApplication.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo2/FamilyApplication.drl new file mode 100644 index 0000000..4b75342 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo2/FamilyApplication.drl @@ -0,0 +1,18 @@ +package org.sw.lesson06.demo2; + +import org.sw.facts.FamilyApplication; +import org.sw.facts.InvalidFamilyApplication +import org.sw.facts.InvalidClientID; +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import java.util.Random; + +rule "Invalidate family applications with single invalid ID" + dialect "java" + when + $familyApplication: FamilyApplication( ) + exists InvalidClientID( $familyApplication.clientIdNumbers.contains(clientID.idNumber) ) + then + System.out.println( "Set " + $familyApplication + " invalid - invalid ID found"); + insert( new InvalidFamilyApplication($familyApplication) ); +end diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo2/PolicyIssue.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo2/PolicyIssue.drl new file mode 100644 index 0000000..8044da4 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo2/PolicyIssue.drl @@ -0,0 +1,31 @@ +package org.sw.lesson06.demo2; + +import org.sw.facts.FamilyApplication; +import org.sw.facts.InvalidFamilyApplication +import org.sw.facts.InvalidClientID; +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import java.util.Random; + +rule "Issue New Policy to Valid Application" + dialect "java" + when + $familyApplication: FamilyApplication() + not InvalidFamilyApplication(familyApplication.applicationNumber == $familyApplication.applicationNumber) + $clientIdNumber: String() from $familyApplication.clientIdNumbers + $clientID: ClientID(idNumber == $clientIdNumber, $name: name) + then + Random random = new Random(); + int premium = 100 + random.nextInt(201); // Random number between 200 and 300 + int coverage = premium * 100; + + Policy newPolicy = new Policy(); + newPolicy.setPolicyNumber($familyApplication.getApplicationNumber()); + newPolicy.setClientName($name); + newPolicy.setPremium(premium); + newPolicy.setCoverage(coverage); + newPolicy.setPaymentStatus("Unpaid"); + + insertLogical(newPolicy); + System.out.println("New policy issued: " + newPolicy); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo2/ValidateID.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo2/ValidateID.drl new file mode 100644 index 0000000..5f30c28 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo2/ValidateID.drl @@ -0,0 +1,12 @@ +package org.sw.lesson06.demo2; + +import org.sw.facts.ClientID; +import org.sw.facts.InvalidClientID; + +rule "Invalidate Expired ID" + when + $clientID: ClientID( isExpired()) + then + System.out.println($clientID + " is expired."); + insert( new InvalidClientID($clientID)); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo3/FamilyApplication.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo3/FamilyApplication.drl new file mode 100644 index 0000000..bcfd8b6 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo3/FamilyApplication.drl @@ -0,0 +1,35 @@ +package org.sw.lesson06.demo3; + +import org.sw.facts.FamilyApplication; +import org.sw.facts.InvalidFamilyApplication +import org.sw.facts.InvalidClientID; +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import java.util.Random; + +/*rule "Invalidate family applications with single Invalid ID" + date-expires "04-May-2010" + enabled false + dialect "java" + when + $familyApplication: FamilyApplication( ) + exists InvalidClientID( $familyApplication.clientIdNumbers.contains(clientID.idNumber) ) + then + System.out.println( "Set " + $familyApplication + " invalid - invalid ID found"); + insert( new InvalidFamilyApplication($familyApplication) ); +end*/ + +rule "Invalidate family application with all IDs expired" + dialect "java" + when + $familyApplication: FamilyApplication( $ids : clientIdNumbers ) + forall ( + $clientIdNumber : String() from $ids, + ClientID( idNumber == $clientIdNumber, isExpired() ) + ) + then + System.out.println( "Set " + $familyApplication + " invalid as all client IDs are expired"); + insert( new InvalidFamilyApplication($familyApplication) ); +end + + diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo3/PolicyIssue.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo3/PolicyIssue.drl new file mode 100644 index 0000000..5856f56 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo3/PolicyIssue.drl @@ -0,0 +1,31 @@ +package org.sw.lesson06.demo3; + +import org.sw.facts.FamilyApplication; +import org.sw.facts.InvalidFamilyApplication +import org.sw.facts.InvalidClientID; +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import java.util.Random; + +rule "Issue New Policy to Valid Application" + dialect "java" + when + $familyApplication: FamilyApplication() + not InvalidFamilyApplication(familyApplication.applicationNumber == $familyApplication.applicationNumber) + $clientIdNumber: String() from $familyApplication.clientIdNumbers + $clientID: ClientID(idNumber == $clientIdNumber, $name: name) + then + Random random = new Random(); + int premium = 50 + random.nextInt(51); // Random number between 50 and 100 + int coverage = premium * 100; + + Policy newPolicy = new Policy(); + newPolicy.setPolicyNumber($familyApplication.getApplicationNumber()); + newPolicy.setClientName($name); + newPolicy.setPremium(premium); + newPolicy.setCoverage(coverage); + newPolicy.setPaymentStatus("Unpaid"); + + insertLogical(newPolicy); + System.out.println("New policy issued: " + newPolicy); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo3/ValidateID.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo3/ValidateID.drl new file mode 100644 index 0000000..5d2ef87 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo3/ValidateID.drl @@ -0,0 +1,14 @@ +package org.sw.lesson06.demo3; + +import org.sw.facts.ClientID; +import org.sw.facts.InvalidClientID; + +/*rule "Invalidate Expired ID" + date-expires "04-May-2010" + enabled false + when + $clientID: ClientID( isExpired()) + then + System.out.println($clientID + " is expired."); + insert( new InvalidClientID($clientID)); +end*/ diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo4/FamilyApplication.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo4/FamilyApplication.drl new file mode 100644 index 0000000..05bf012 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo4/FamilyApplication.drl @@ -0,0 +1,24 @@ +package org.sw.lesson06.demo4; + +import org.sw.facts.FamilyApplication; +import org.sw.facts.InvalidFamilyApplication +import org.sw.facts.InvalidClientID; +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import org.sw.facts.PrimaryClient; +import java.util.Random; + +rule "Invalidate family application with all IDs expired" + dialect "java" + when + $familyApplication: FamilyApplication( $ids : clientIdNumbers ) + forall ( + $clientIdNumber : String() from $ids, + ClientID( idNumber == $clientIdNumber, isExpired() ) + ) + then + System.out.println( "Set " + $familyApplication + " invalid as all client IDs are expired"); + insert( new InvalidFamilyApplication($familyApplication) ); +end + + diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo4/PolicyIssue.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo4/PolicyIssue.drl new file mode 100644 index 0000000..28709f4 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo4/PolicyIssue.drl @@ -0,0 +1,30 @@ +package org.sw.lesson06.demo4; + +import org.sw.facts.FamilyApplication; +import org.sw.facts.InvalidFamilyApplication +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import java.util.Random; + +rule "Issue New Policy to Valid Application" + dialect "java" + when + $familyApplication: FamilyApplication() + not InvalidFamilyApplication(familyApplication.applicationNumber == $familyApplication.applicationNumber) + $clientIdNumber: String() from $familyApplication.clientIdNumbers + $clientID: ClientID(idNumber == $clientIdNumber, $name: name) + then + Random random = new Random(); + int premium = 50 + random.nextInt(51); // Random number between 50 and 100 + int coverage = premium * 100; + + Policy newPolicy = new Policy(); + newPolicy.setPolicyNumber($familyApplication.getApplicationNumber()); + newPolicy.setClientName($name); + newPolicy.setPremium(premium); + newPolicy.setCoverage(coverage); + newPolicy.setPaymentStatus("Unpaid"); + + insertLogical(newPolicy); + System.out.println("New policy issued: " + newPolicy); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo4/Report.drl b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo4/Report.drl new file mode 100644 index 0000000..ec77469 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/src/main/resources/org.sw/lesson06/demo4/Report.drl @@ -0,0 +1,11 @@ +package org.sw.lesson06.demo4; + +import org.sw.facts.Application; + +rule "Check for Child Applications" + dialect "java" + when + forall ( Application( clientAge >= 16 )) + then + System.out.println( "No applications from under 16 year olds" ); +end diff --git a/Course Material/Day two/insurance/insurance/target/classes/META-INF/kmodule.xml b/Course Material/Day two/insurance/insurance/target/classes/META-INF/kmodule.xml new file mode 100644 index 0000000..8fabb1d --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/META-INF/kmodule.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson01/demo1/ApplicationValidation.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson01/demo1/ApplicationValidation.drl new file mode 100644 index 0000000..7b7ec58 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson01/demo1/ApplicationValidation.drl @@ -0,0 +1,17 @@ +package org.sw.lesson01.demo1; + +import org.sw.facts.Application; + +rule "Invalidate application with Pre-existing conditions, underage, or unemployed" + when + Application( clientAge < 18 || !employed || PEC ) + then + System.out.println("Application Invalid - Client is minor, unemployed, or has PECs"); +end + +rule "Valid Application" + when + Application( clientAge >= 18 && employed && !PEC ) + then + System.out.println("Application Validated"); +end diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson01/demo2/ApplicationValidation.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson01/demo2/ApplicationValidation.drl new file mode 100644 index 0000000..07e5a8c --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson01/demo2/ApplicationValidation.drl @@ -0,0 +1,34 @@ +package org.sw.lesson01.demo2; + +import org.sw.facts.Application; + +rule "Invalid application - underaged" + dialect "java" + when + Application( clientAge < 18 ) + then + System.out.println("Application Invalid – client is underaged"); +end + +rule "Invalid application – unemployed" + dialect "java" + when + Application( !employed ) + then + System.out.println("Application Invalid – client is unemployed"); +end + +rule "Invalid application – has pre-existing conditions" + dialect "java" + when + Application( PEC ) + then + System.out.println("Application Invalid – client has PECs"); +end + +rule "Valid Application" + when + $application: Application( clientAge >= 18 && employed && !PEC ) + then + System.out.println("Application Validated"); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson01/demo3/ApplicationValidation.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson01/demo3/ApplicationValidation.drl new file mode 100644 index 0000000..4b37952 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson01/demo3/ApplicationValidation.drl @@ -0,0 +1,27 @@ +package org.sw.lesson01.demo3; + +import org.sw.facts.Application; + +rule "Invalid application from minor" + dialect "java" + when + $application: Application( $clientAge: clientAge < 18 ) + then + System.out.println($application + ": Invalid – client age: " + $clientAge); +end + +rule "Invalid application – unemployed" + dialect "java" + when + $application: Application( $employed: employed == false ) + then + System.out.println($application + ": Invalid – unemployed: " + $employed); +end + +rule "Valid Application" + dialect "java" + when + $application: Application( employed, clientAge >= 18 ) + then + System.out.println($application + ": Validated"); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson01/demo4/ApplicationValidation.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson01/demo4/ApplicationValidation.drl new file mode 100644 index 0000000..1ea6781 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson01/demo4/ApplicationValidation.drl @@ -0,0 +1,40 @@ +package org.sw.lesson01.demo4; + +import org.sw.facts.Application; +import org.sw.facts.Status; + +rule "Valid Application" + dialect "java" + when + $application: Application( !PEC , employed , clientAge >= 18 ) + then + System.out.println($application + ": Validated"); + $application.setStatus(Status.APPROVED); +end + +rule "Invalid application - minor" + dialect "java" + when + $application: Application( clientAge < 18 ) + then + System.out.println($application + ": Invalid – Client age: " + $application.getClientAge()); + $application.setStatus(Status.DENIED); +end + +rule "Invalid application - unemployed" + dialect "java" + when + $application: Application( !employed ) + then + System.out.println($application + ": Invalid - Client unemployed"); + $application.setStatus(Status.DENIED); +end + +rule "Invalid application - Pre-existing Condition" + dialect "java" + when + $application: Application( PEC ) + then + System.out.println($application + ": Invalid - Client has PEC"); + $application.setStatus(Status.DENIED); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson01/demo5/ApplicationValidation.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson01/demo5/ApplicationValidation.drl new file mode 100644 index 0000000..b5cde7e --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson01/demo5/ApplicationValidation.drl @@ -0,0 +1,41 @@ +package org.sw.lesson01.demo5; + +import org.sw.facts.Application; +import org.sw.facts.Status; + +//Move to end of File +rule "Valid Application" + dialect "java" + when + $application: Application( status == Status.PENDING ) + then + System.out.println($application + ": Not Invalidated - Approval Granted"); + $application.setStatus(Status.APPROVED); +end + +rule "Invalid application - minor" + dialect "java" + when + $application: Application( clientAge < 18 ) + then + System.out.println($application + ": Invalid – Client age: " + $application.getClientAge()); + $application.setStatus(Status.DENIED); +end + +rule "Invalid application - unemployed" + dialect "java" + when + $application: Application( !employed ) + then + System.out.println($application + ": Invalid - Client unemployed"); + $application.setStatus(Status.DENIED); +end + +rule "Invalid application - Pre-existing Condition" + dialect "java" + when + $application: Application( PEC ) + then + System.out.println($application + ": Invalid - Client has PEC"); + $application.setStatus(Status.DENIED); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson02/demo1/ApplicationValidation.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson02/demo1/ApplicationValidation.drl new file mode 100644 index 0000000..c3fff4d --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson02/demo1/ApplicationValidation.drl @@ -0,0 +1,45 @@ +package org.sw.lesson02.demo1; + +import org.sw.facts.Application; +import org.sw.facts.Status; + +rule "Invalidate application if not employed" + dialect "java" + when + $application: Application( !employed ) + then + System.out.println($application + ": Invalid – Unemployed"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate application from minor" + when + $application: Application( clientAge < 18 ) + then + System.out.println($application + ": Invalid – Minor"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Invalid application – has pre-existing conditions" + when + $application: Application( ) + then + System.out.println($application + ": Invalid – Client has PEC"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Valid Application" + when + $application: Application( status == Status.PENDING ) + then + System.out.println($application + ": Approval Granted!"); + modify($application) { + setStatus(Status.APPROVED) + } +end diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson02/demo2/ApplicationValidation.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson02/demo2/ApplicationValidation.drl new file mode 100644 index 0000000..9cee882 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson02/demo2/ApplicationValidation.drl @@ -0,0 +1,52 @@ +package org.sw.lesson02.demo2; + +import org.sw.facts.Application; +import org.sw.facts.Status; + +rule "Invalidate application if not employed" + dialect "java" + when + $application: Application( !employed ) + then + System.out.println($application + ": Invalid – Unemployed"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client unemployed") + } +end + +rule "Invalidate application from minor" + dialect "java" + when + $application: Application( clientAge < 18 ) + + then + System.out.println($application + ": Invalid – Minor"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client underaged") + } +end + +rule "Invalid application – has pre-existing conditions" + dialect "java" + when + $application: Application( PEC ) + then + System.out.println($application + ": Invalid – Client has PEC"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client has PEC") + } +end + +rule "Valid Application" + dialect "java" + when + $application: Application( status == Status.PENDING ) + then + System.out.println($application + ": Approval Granted!"); + modify($application) { + setStatus(Status.APPROVED) + } +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson03/demo1/ClaimValidation.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson03/demo1/ClaimValidation.drl new file mode 100644 index 0000000..103ad94 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson03/demo1/ClaimValidation.drl @@ -0,0 +1,52 @@ +package org.sw.lesson03.demo1; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; + +rule "Invalidate claim without matching policy" + dialect "java" + when + $claim: Claim( ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + then + System.out.println($claim + ": failed (no matching policy)"); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + when + $claim: Claim( ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + when + $claim: Claim( ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + System.out.println($claim + ": failed. Unpaid premiums in " + $policy); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Valid Claims" + dialect "java" + when + $claim: Claim( status == Status.PENDING ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + modify($claim) { + setStatus(Status.APPROVED) + } +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson03/demo2/ApplicationIDCrossValidation.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson03/demo2/ApplicationIDCrossValidation.drl new file mode 100644 index 0000000..21c9cf9 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson03/demo2/ApplicationIDCrossValidation.drl @@ -0,0 +1,42 @@ +package org.sw.lesson03.demo2; + +import org.sw.facts.Application; +import org.sw.facts.ClientID; +import org.sw.facts.Status; +import java.time.LocalDate; + +rule "Invalidate applications with missing ID" + dialect "java" + when + $application: Application( ) + not ClientID( idNumber == $application.clientIdNumber ) + then + System.out.println($application + " Invalid – No matching ID found"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate applications with incorrect name" + dialect "java" + when + $application: Application( ) + $clientID: ClientID( idNumber == $application.clientIdNumber, name != $application.clientName ) + then + System.out.println($application + " Invalid – Name [" + $application.getClientName() + "] not matching name on ID [" + $clientID.getName() + "]"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate applications with Expired ID" + dialect "java" + when + $application: Application( ) + $clientid: ClientID( idNumber == $application.clientIdNumber, expiryDate.isBefore(LocalDate.now()) ) + then + System.out.println($application + " Invalid – " + $clientid + " ID expired"); + modify($application) { + setStatus(Status.DENIED) + } +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson03/demo2/ApplicationValidation.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson03/demo2/ApplicationValidation.drl new file mode 100644 index 0000000..c811c96 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson03/demo2/ApplicationValidation.drl @@ -0,0 +1,52 @@ +package org.sw.lesson03.demo2; + +import org.sw.facts.Application; +import org.sw.facts.Status; + +rule "Invalidate application if not employed" + dialect "java" + when + $application: Application( !employed ) + then + System.out.println($application + ": Invalid – Unemployed"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client unemployed") + } +end + +rule "Invalidate application from minor" + dialect "java" + when + $application: Application( clientAge < 18 ) + + then + System.out.println($application + ": Invalid – Minor"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client underaged") + } +end + +rule "Invalid application – has pre-existing conditions" + dialect "java" + when + $application: Application( PEC ) + then + System.out.println($application + ": Invalid – Client has PEC"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client has PEC") + } +end + +rule "Valid Application" + dialect "java" + when + $application: Application( status == Status.PENDING ) + then + System.out.println($application + ": Approval Granted!"); + modify($application) { + setStatus(Status.APPROVED) + } +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson03/demo3/ApplicationIDCrossValidation.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson03/demo3/ApplicationIDCrossValidation.drl new file mode 100644 index 0000000..7b652d1 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson03/demo3/ApplicationIDCrossValidation.drl @@ -0,0 +1,43 @@ +package org.sw.lesson03.demo3; + +import org.sw.facts.Application; +import org.sw.facts.ClientID; +import org.sw.facts.Status; +import java.time.LocalDate; + +rule "Invalidate Applications with missing ID" + dialect "java" + when + $application: Application( status != Status.DENIED ) + not ClientID( idNumber == $application.getClientIdNumber()) + then + System.out.println($application + " Invalid – No matching ID found"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate applications with incorrect name" + dialect "java" + when + $application: Application( status != Status.DENIED ) + $clientID: ClientID( idNumber == $application.getClientIdNumber(), name != $application.clientName ) + then + System.out.println($application + " Invalid – Name [" + $application.getClientName() + "] not matching name on ID [" + $clientID.getName() + "]"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate Applications with Expired ID" + dialect "java" + when + $application: Application( status != Status.DENIED ) + $clientid: ClientID( idNumber == $application.getClientIdNumber(), + expiryDate.isBefore(LocalDate.now()) ) + then + System.out.println($application + " Invalid – " + $clientid + " ID expired"); + modify($application) { + setStatus(Status.DENIED) + } +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson03/demo3/ApplicationValidation.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson03/demo3/ApplicationValidation.drl new file mode 100644 index 0000000..bc90a35 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson03/demo3/ApplicationValidation.drl @@ -0,0 +1,55 @@ +package org.sw.lesson03.demo3; + +import org.sw.facts.Application; +import org.sw.facts.Status; + +rule "Invalidate application if not employed" + dialect "java" + when + $application: Application( !employed, + status != Status.DENIED ) + then + System.out.println($application + ": Invalid – Unemployed"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client unemployed") + } +end + +rule "Invalidate application from minor" + dialect "java" + when + $application: Application( clientAge < 18, + status != Status.DENIED ) + + then + System.out.println($application + ": Invalid – Minor"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client underaged") + } +end + +rule "Invalid application – has pre-existing conditions" + dialect "java" + when + $application: Application( PEC, + status != Status.DENIED ) + then + System.out.println($application + ": Invalid – Client has PEC"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client has PEC") + } +end + +rule "Valid Application" + dialect "java" + when + $application: Application( status == Status.PENDING ) + then + System.out.println($application + ": Approval Granted!"); + modify($application) { + setStatus(Status.APPROVED) + } +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo1/ClaimValidation.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo1/ClaimValidation.drl new file mode 100644 index 0000000..974da63 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo1/ClaimValidation.drl @@ -0,0 +1,51 @@ +package org.sw.lesson04.demo1; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; +import org.sw.facts.Payout; + +rule "Valid Claims" + dialect "java" + when + $claim: Claim( status == Status.PENDING ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + modify($claim) { + setStatus(Status.APPROVED) + } +end + +rule "Issue Payout" + dialect "java" + when + $claim: Claim(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insert( payout ); +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + System.out.println($claim + ": failed. Unpaid premiums in " + $policy); + modify($claim) { + setStatus(Status.DENIED) + } +end diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo2/ClaimValidation.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo2/ClaimValidation.drl new file mode 100644 index 0000000..2dfbe8e --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo2/ClaimValidation.drl @@ -0,0 +1,56 @@ +package org.sw.lesson04.demo2; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; + +rule "Valid Claims" + dialect "java" + salience 20 + when + $claim: Claim( status == Status.PENDING ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + modify($claim) { + setStatus(Status.APPROVED) + } +end + +rule "Invalidate claim without matching policy" + dialect "java" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + then + System.out.println($claim + ": failed (no matching policy)"); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + System.out.println($claim + ": failed. Unpaid premiums in " + $policy); + modify($claim) { + setStatus(Status.DENIED) + } +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo2/PayoutIssue.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo2/PayoutIssue.drl new file mode 100644 index 0000000..07ff371 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo2/PayoutIssue.drl @@ -0,0 +1,16 @@ +package org.sw.lesson04.demo2; + +import org.sw.facts.Claim; +import org.sw.facts.Status; +import org.sw.facts.Payout; + +rule "Issue Payout" + dialect "java" + salience 0 + when + $claim: Claim(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insert( payout ); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo3/ClaimValidation.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo3/ClaimValidation.drl new file mode 100644 index 0000000..0d8052c --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo3/ClaimValidation.drl @@ -0,0 +1,56 @@ +package org.sw.lesson04.demo3; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; + +rule "Valid Claims" + dialect "java" + agenda-group "valid-claim" + when + $claim: Claim( status == Status.PENDING ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + modify($claim) { + setStatus(Status.APPROVED) + } +end + +rule "Invalidate claim without matching policy" + dialect "java" + agenda-group "invalid-claim" + when + $claim: Claim( status != Status.DENIED ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + then + System.out.println($claim + ": failed (no matching policy)"); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + agenda-group "invalid-claim" + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + agenda-group "invalid-claim" + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + System.out.println($claim + ": failed. Unpaid premiums in " + $policy); + modify($claim) { + setStatus(Status.DENIED) + } +end diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo3/PayoutIssue.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo3/PayoutIssue.drl new file mode 100644 index 0000000..90c9915 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo3/PayoutIssue.drl @@ -0,0 +1,19 @@ +package org.sw.lesson04.demo3; + +import java.util.Random; +import org.sw.facts.Claim; +import org.sw.facts.Application; +import org.sw.facts.Policy; +import org.sw.facts.Status; +import org.sw.facts.Payout; + +rule "Issue Payout" + dialect "java" + agenda-group "issue-payout" + when + $claim: Claim(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insert( payout ); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo4/ClaimValidation.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo4/ClaimValidation.drl new file mode 100644 index 0000000..bbcf561 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo4/ClaimValidation.drl @@ -0,0 +1,60 @@ +package org.sw.lesson04.demo4; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; + +rule "Valid Claims" + dialect "java" + agenda-group "claim-validation" + salience 20 + when + $claim: Claim( status == Status.PENDING ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + modify($claim) { + setStatus(Status.APPROVED) + } +end + +rule "Invalidate claim without matching policy" + dialect "java" + agenda-group "claim-validation" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + then + System.out.println($claim + ": failed (no matching policy)"); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + agenda-group "claim-validation" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + agenda-group "claim-validation" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + System.out.println($claim + ": failed. Unpaid premiums in " + $policy); + modify($claim) { + setStatus(Status.DENIED) + } +end diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo4/PayoutIssue.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo4/PayoutIssue.drl new file mode 100644 index 0000000..a42ca92 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo4/PayoutIssue.drl @@ -0,0 +1,16 @@ +package org.sw.lesson04.demo4; + +import org.sw.facts.Claim; +import org.sw.facts.Status; +import org.sw.facts.Payout; + +rule "Issue Payout" + dialect "java" + agenda-group "issue-payout" + when + $claim: Claim(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insert( payout ); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo5/ClaimValidation.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo5/ClaimValidation.drl new file mode 100644 index 0000000..dbf3753 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo5/ClaimValidation.drl @@ -0,0 +1,60 @@ +package org.sw.lesson04.demo5; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; + +rule "Valid Claims" + dialect "java" + agenda-group "claim-validation" + salience 20 + when + $claim: Claim( status == Status.PENDING ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + modify($claim) { + setStatus(Status.APPROVED) + } +end + +rule "Invalidate claim without matching policy" + dialect "java" + agenda-group "claim-validation" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + then + System.out.println($claim + ": failed (no matching policy)"); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + agenda-group "claim-validation" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + agenda-group "claim-validation" + salience 50 + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + System.out.println($claim + ": failed. Unpaid premiums in " + $policy); + modify($claim) { + setStatus(Status.DENIED) + } +end diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo5/PayoutIssue.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo5/PayoutIssue.drl new file mode 100644 index 0000000..a9a2142 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo5/PayoutIssue.drl @@ -0,0 +1,16 @@ +package org.sw.lesson04.demo5; + +import org.sw.facts.Claim; +import org.sw.facts.Status; +import org.sw.facts.Payout; + +rule "Issue Payout" + dialect "java" + agenda-group "issue-payout" + when + $claim: Claim(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insert( payout ); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo5/Verdict.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo5/Verdict.drl new file mode 100644 index 0000000..f33b618 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson04/demo5/Verdict.drl @@ -0,0 +1,25 @@ +package org.sw.lesson04.demo5; + +import org.sw.facts.Payout +import org.sw.facts.Claim +import org.sw.facts.Status + +rule "Report Payouts Issued" + dialect "java" + activation-group "verdict" + salience 20 + when + Payout() + then + System.out.println("Verdict: Payouts were issued this session"); +end + +rule "Report payouts " + dialect "java" + activation-group "verdict" + salience 10 + when + Claim( status == Status.DENIED ) + then + System.out.println("Verdict: No Payouts issued this session"); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo1/ClaimValidation.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo1/ClaimValidation.drl new file mode 100644 index 0000000..83e5eca --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo1/ClaimValidation.drl @@ -0,0 +1,63 @@ +package org.sw.lesson05.demo1; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; +import org.sw.facts.Payout; + +rule "Valid Claims" + dialect "java" + when + $claim: Claim( status == Status.PENDING ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + modify($claim) { + setStatus(Status.APPROVED) + } +end + +rule "Issue Payout" + dialect "java" + when + $claim: Claim(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insertLogical( payout ); +end + +rule "Invalidate claim without matching policy" + dialect "java" + when + $claim: Claim( status != Status.DENIED ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + then + System.out.println($claim + ": failed (no matching policy)"); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + modify($claim) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + when + $claim: Claim( status != Status.DENIED ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + System.out.println($claim + ": failed. Unpaid premiums in " + $policy); + modify($claim) { + setStatus(Status.DENIED) + } +end diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo2/ClaimValidation.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo2/ClaimValidation.drl new file mode 100644 index 0000000..ccda17c --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo2/ClaimValidation.drl @@ -0,0 +1,48 @@ +package org.sw.lesson05.demo2; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; +import org.sw.facts.Payout; +import org.sw.facts.InvalidClaim; +import org.sw.facts.ValidClaim; + +rule "Valid Claims" + dialect "java" + when + $claim: Claim( ) + not (InvalidClaim( claim == $claim) ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + insertLogical( new ValidClaim($claim) ); +end + +rule "Invalidate claim without matching policy" + dialect "java" + when + $claim: Claim( ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + then + System.out.println($claim + ": failed (no matching policy)"); + insert( new InvalidClaim($claim) ); +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + when + $claim: Claim( ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + insert( new InvalidClaim($claim) ); +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + when + $claim: Claim( ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + System.out.println($claim + ": failed. Unpaid premiums in " + $policy); + insert( new InvalidClaim($claim) ); +end diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo2/PayoutIssue.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo2/PayoutIssue.drl new file mode 100644 index 0000000..4ed915a --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo2/PayoutIssue.drl @@ -0,0 +1,17 @@ +package org.sw.lesson05.demo2; + +import org.sw.facts.Payout +import org.sw.facts.Policy +import org.sw.facts.Claim +import org.sw.facts.ValidClaim; + + +rule "Issue Payout" + dialect "java" + when + $validClaim : ValidClaim( $claim : claim ) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insertLogical( payout ); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo3/ClaimValidation.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo3/ClaimValidation.drl new file mode 100644 index 0000000..62598ed --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo3/ClaimValidation.drl @@ -0,0 +1,52 @@ +package org.sw.lesson05.demo3; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; +import org.sw.facts.Payout; +import org.sw.facts.InvalidClaim; +import org.sw.facts.ValidClaim; +import org.sw.facts.InvalidPolicy; + +rule "Valid Claims" + dialect "java" + when + $claim: Claim( ) + not (InvalidClaim( claim == $claim) ) + then + System.out.println($claim + ": not invalidated. Approval Granted"); + insertLogical( new ValidClaim($claim) ); +end + +rule "Invalidate claim without matching policy" + dialect "java" + when + $claim: Claim( ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + not InvalidClaim( claim.policyNumber == $claim.policyNumber) + then + System.out.println($claim + ": failed (no matching policy)"); + insert( new InvalidClaim($claim) ); +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + when + $claim: Claim( ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + not InvalidClaim( claim.policyNumber == $claim.policyNumber) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + insert( new InvalidClaim($claim) ); +end + +rule "Invalidate claim with invalid policy" + dialect "java" + when + $invalidPolicy: InvalidPolicy( ) + $claim: Claim( policyNumber == $invalidPolicy.policy.policyNumber ) + not InvalidClaim( claim.policyNumber == $claim.policyNumber) + then + System.out.println($claim + ": failed. " + $invalidPolicy + " Invalid"); + insert( new InvalidClaim($claim) ); +end diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo3/PayoutIssue.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo3/PayoutIssue.drl new file mode 100644 index 0000000..364102e --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo3/PayoutIssue.drl @@ -0,0 +1,16 @@ +package org.sw.lesson05.demo3; + +import org.sw.facts.Payout +import org.sw.facts.Policy +import org.sw.facts.Claim +import org.sw.facts.ValidClaim; + +rule "Issue Payout" + dialect "java" + when + $validClaim : ValidClaim( $claim : claim ) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insertLogical( payout ); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo3/PolicyValidation.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo3/PolicyValidation.drl new file mode 100644 index 0000000..4580edc --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo3/PolicyValidation.drl @@ -0,0 +1,14 @@ +package org.sw.lesson05.demo3; + +import org.sw.facts.Policy +import org.sw.facts.InvalidPolicy + +rule "Invalidate unpaid Policy" + dialect "java" + when + $policy: Policy( paymentStatus == "Unpaid" ) + not InvalidPolicy( policy.policyNumber == $policy.policyNumber) + then + System.out.println("Policy [" + $policy + "] invalidated due to unpaid premiums"); + insert( new InvalidPolicy($policy) ); +end diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo4/ClaimValidation.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo4/ClaimValidation.drl new file mode 100644 index 0000000..ef38a2a --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo4/ClaimValidation.drl @@ -0,0 +1,41 @@ +package org.sw.lesson05.demo4; + +import org.sw.facts.Claim; +import org.sw.facts.Policy; +import org.sw.facts.Status; +import org.sw.facts.Payout; +import org.sw.facts.InvalidClaim; +import org.sw.facts.ValidClaim; +import org.sw.facts.InvalidPolicy; + +rule "Invalidate claim without matching policy" + dialect "java" + when + $claim: Claim( ) + not Policy( policyNumber == $claim.getPolicyNumber() ) + not InvalidClaim( claim.policyNumber == $claim.policyNumber) + then + System.out.println($claim + ": failed (no matching policy)"); + insert( new InvalidClaim($claim) ); +end + +rule "Invalidate claim that exceeds coverage" + dialect "java" + when + $claim: Claim( ) + $policy: Policy( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + System.out.println($claim + ": failed. Coverage in policy " + $policy + " insufficient."); + insert( new InvalidClaim($claim) ); +end + +rule "Invalidate claim with invalid policy" + dialect "java" + when + $invalidPolicy: InvalidPolicy( ) + $claim: Claim( policyNumber == $invalidPolicy.policy.policyNumber ) + not InvalidClaim( claim.policyNumber == $claim.policyNumber) + then + System.out.println($claim + ": failed. " + $invalidPolicy + " Invalid"); + insert( new InvalidClaim($claim) ); +end diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo4/PolicyValidation.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo4/PolicyValidation.drl new file mode 100644 index 0000000..687db68 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo4/PolicyValidation.drl @@ -0,0 +1,14 @@ +package org.sw.lesson05.demo4; + +import org.sw.facts.Policy +import org.sw.facts.InvalidPolicy + +rule "Invalidate unpaid Policy" + dialect "java" + when + $policy: Policy( paymentStatus == "Unpaid" ) + not InvalidPolicy( policy.policyNumber == $policy.policyNumber) + then + System.out.println("Policy [" + $policy + "] invalidated due to unpaid premiums"); + insert( new InvalidPolicy($policy) ); +end diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo4/XPayoutIssue.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo4/XPayoutIssue.drl new file mode 100644 index 0000000..9898130 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson05/demo4/XPayoutIssue.drl @@ -0,0 +1,17 @@ +package org.sw.lesson05.demo4; + +import org.sw.facts.Payout +import org.sw.facts.Policy +import org.sw.facts.Claim +import org.sw.facts.InvalidClaim; + +rule "Issue Payout" + dialect "java" + when + $claim: Claim( ) + not InvalidClaim( claim.policyNumber == $claim.policyNumber) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + System.out.println("New Payout: " + payout + " Issued"); + insertLogical( payout ); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo1/FamilyApplication.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo1/FamilyApplication.drl new file mode 100644 index 0000000..6ef783a --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo1/FamilyApplication.drl @@ -0,0 +1,29 @@ +package org.sw.lesson06.demo1; + +import org.sw.facts.FamilyApplication; +import org.sw.facts.InvalidFamilyApplication +import org.sw.facts.InvalidClientID; +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import java.util.Random; + +/*rule "Invalidate family applications with invalid ID" + dialect "java" + when + $familyApplication: FamilyApplication( ) + InvalidClientID( $familyApplication.clientIdNumbers.contains(clientID.idNumber) ) + then + System.out.println( "Set " + $familyApplication + " invalid - invalid ID found"); + insert( new InvalidFamilyApplication($familyApplication) ); +end*/ + +rule "Invalidate family applications with single expired ID" + dialect "java" + salience 50 + when + $familyApplication: FamilyApplication( $ids: clientIdNumbers ) + ClientID( $id: idNumber, isExpired() == true, $id memberOf $ids ) + then + System.out.println( "Set " + $familyApplication + " invalid - expired ID found for ID: " + $id); + insert( new InvalidFamilyApplication($familyApplication) ); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo1/PolicyIssue.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo1/PolicyIssue.drl new file mode 100644 index 0000000..5c7570c --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo1/PolicyIssue.drl @@ -0,0 +1,31 @@ +package org.sw.lesson06.demo1; + +import org.sw.facts.FamilyApplication; +import org.sw.facts.InvalidFamilyApplication +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import java.util.Random; + +rule "Issue New Policy to Valid Application" + dialect "java" + salience 20 + when + $familyApplication: FamilyApplication() + not InvalidFamilyApplication(familyApplication.applicationNumber == $familyApplication.applicationNumber) + $clientIdNumber: String() from $familyApplication.clientIdNumbers + $clientID: ClientID(idNumber == $clientIdNumber, $name: name) + then + Random random = new Random(); + int premium = 50 + random.nextInt(51); // Random number between 50 and 100 + int coverage = premium * 100; + + Policy newPolicy = new Policy(); + newPolicy.setPolicyNumber($familyApplication.getApplicationNumber()); + newPolicy.setClientName($name); + newPolicy.setPremium(premium); + newPolicy.setCoverage(coverage); + newPolicy.setPaymentStatus("Unpaid"); + + insert(newPolicy); + System.out.println("New policy issued: " + newPolicy); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo1/ValidateID.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo1/ValidateID.drl new file mode 100644 index 0000000..1b7edae --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo1/ValidateID.drl @@ -0,0 +1,13 @@ +package org.sw.lesson06.demo1; + +import org.sw.facts.ClientID; +import org.sw.facts.InvalidClientID; + +/* +rule "Invalidate Expired ID" + when + $clientID: ClientID( isExpired()) + then + System.out.println($clientID + " is expired."); + insert( new InvalidClientID($clientID)); +end*/ diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo2/FamilyApplication.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo2/FamilyApplication.drl new file mode 100644 index 0000000..4b75342 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo2/FamilyApplication.drl @@ -0,0 +1,18 @@ +package org.sw.lesson06.demo2; + +import org.sw.facts.FamilyApplication; +import org.sw.facts.InvalidFamilyApplication +import org.sw.facts.InvalidClientID; +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import java.util.Random; + +rule "Invalidate family applications with single invalid ID" + dialect "java" + when + $familyApplication: FamilyApplication( ) + exists InvalidClientID( $familyApplication.clientIdNumbers.contains(clientID.idNumber) ) + then + System.out.println( "Set " + $familyApplication + " invalid - invalid ID found"); + insert( new InvalidFamilyApplication($familyApplication) ); +end diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo2/PolicyIssue.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo2/PolicyIssue.drl new file mode 100644 index 0000000..8044da4 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo2/PolicyIssue.drl @@ -0,0 +1,31 @@ +package org.sw.lesson06.demo2; + +import org.sw.facts.FamilyApplication; +import org.sw.facts.InvalidFamilyApplication +import org.sw.facts.InvalidClientID; +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import java.util.Random; + +rule "Issue New Policy to Valid Application" + dialect "java" + when + $familyApplication: FamilyApplication() + not InvalidFamilyApplication(familyApplication.applicationNumber == $familyApplication.applicationNumber) + $clientIdNumber: String() from $familyApplication.clientIdNumbers + $clientID: ClientID(idNumber == $clientIdNumber, $name: name) + then + Random random = new Random(); + int premium = 100 + random.nextInt(201); // Random number between 200 and 300 + int coverage = premium * 100; + + Policy newPolicy = new Policy(); + newPolicy.setPolicyNumber($familyApplication.getApplicationNumber()); + newPolicy.setClientName($name); + newPolicy.setPremium(premium); + newPolicy.setCoverage(coverage); + newPolicy.setPaymentStatus("Unpaid"); + + insertLogical(newPolicy); + System.out.println("New policy issued: " + newPolicy); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo2/ValidateID.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo2/ValidateID.drl new file mode 100644 index 0000000..5f30c28 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo2/ValidateID.drl @@ -0,0 +1,12 @@ +package org.sw.lesson06.demo2; + +import org.sw.facts.ClientID; +import org.sw.facts.InvalidClientID; + +rule "Invalidate Expired ID" + when + $clientID: ClientID( isExpired()) + then + System.out.println($clientID + " is expired."); + insert( new InvalidClientID($clientID)); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo3/FamilyApplication.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo3/FamilyApplication.drl new file mode 100644 index 0000000..bcfd8b6 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo3/FamilyApplication.drl @@ -0,0 +1,35 @@ +package org.sw.lesson06.demo3; + +import org.sw.facts.FamilyApplication; +import org.sw.facts.InvalidFamilyApplication +import org.sw.facts.InvalidClientID; +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import java.util.Random; + +/*rule "Invalidate family applications with single Invalid ID" + date-expires "04-May-2010" + enabled false + dialect "java" + when + $familyApplication: FamilyApplication( ) + exists InvalidClientID( $familyApplication.clientIdNumbers.contains(clientID.idNumber) ) + then + System.out.println( "Set " + $familyApplication + " invalid - invalid ID found"); + insert( new InvalidFamilyApplication($familyApplication) ); +end*/ + +rule "Invalidate family application with all IDs expired" + dialect "java" + when + $familyApplication: FamilyApplication( $ids : clientIdNumbers ) + forall ( + $clientIdNumber : String() from $ids, + ClientID( idNumber == $clientIdNumber, isExpired() ) + ) + then + System.out.println( "Set " + $familyApplication + " invalid as all client IDs are expired"); + insert( new InvalidFamilyApplication($familyApplication) ); +end + + diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo3/PolicyIssue.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo3/PolicyIssue.drl new file mode 100644 index 0000000..5856f56 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo3/PolicyIssue.drl @@ -0,0 +1,31 @@ +package org.sw.lesson06.demo3; + +import org.sw.facts.FamilyApplication; +import org.sw.facts.InvalidFamilyApplication +import org.sw.facts.InvalidClientID; +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import java.util.Random; + +rule "Issue New Policy to Valid Application" + dialect "java" + when + $familyApplication: FamilyApplication() + not InvalidFamilyApplication(familyApplication.applicationNumber == $familyApplication.applicationNumber) + $clientIdNumber: String() from $familyApplication.clientIdNumbers + $clientID: ClientID(idNumber == $clientIdNumber, $name: name) + then + Random random = new Random(); + int premium = 50 + random.nextInt(51); // Random number between 50 and 100 + int coverage = premium * 100; + + Policy newPolicy = new Policy(); + newPolicy.setPolicyNumber($familyApplication.getApplicationNumber()); + newPolicy.setClientName($name); + newPolicy.setPremium(premium); + newPolicy.setCoverage(coverage); + newPolicy.setPaymentStatus("Unpaid"); + + insertLogical(newPolicy); + System.out.println("New policy issued: " + newPolicy); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo3/ValidateID.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo3/ValidateID.drl new file mode 100644 index 0000000..5d2ef87 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo3/ValidateID.drl @@ -0,0 +1,14 @@ +package org.sw.lesson06.demo3; + +import org.sw.facts.ClientID; +import org.sw.facts.InvalidClientID; + +/*rule "Invalidate Expired ID" + date-expires "04-May-2010" + enabled false + when + $clientID: ClientID( isExpired()) + then + System.out.println($clientID + " is expired."); + insert( new InvalidClientID($clientID)); +end*/ diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo4/FamilyApplication.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo4/FamilyApplication.drl new file mode 100644 index 0000000..05bf012 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo4/FamilyApplication.drl @@ -0,0 +1,24 @@ +package org.sw.lesson06.demo4; + +import org.sw.facts.FamilyApplication; +import org.sw.facts.InvalidFamilyApplication +import org.sw.facts.InvalidClientID; +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import org.sw.facts.PrimaryClient; +import java.util.Random; + +rule "Invalidate family application with all IDs expired" + dialect "java" + when + $familyApplication: FamilyApplication( $ids : clientIdNumbers ) + forall ( + $clientIdNumber : String() from $ids, + ClientID( idNumber == $clientIdNumber, isExpired() ) + ) + then + System.out.println( "Set " + $familyApplication + " invalid as all client IDs are expired"); + insert( new InvalidFamilyApplication($familyApplication) ); +end + + diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo4/PolicyIssue.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo4/PolicyIssue.drl new file mode 100644 index 0000000..28709f4 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo4/PolicyIssue.drl @@ -0,0 +1,30 @@ +package org.sw.lesson06.demo4; + +import org.sw.facts.FamilyApplication; +import org.sw.facts.InvalidFamilyApplication +import org.sw.facts.ClientID; +import org.sw.facts.Policy; +import java.util.Random; + +rule "Issue New Policy to Valid Application" + dialect "java" + when + $familyApplication: FamilyApplication() + not InvalidFamilyApplication(familyApplication.applicationNumber == $familyApplication.applicationNumber) + $clientIdNumber: String() from $familyApplication.clientIdNumbers + $clientID: ClientID(idNumber == $clientIdNumber, $name: name) + then + Random random = new Random(); + int premium = 50 + random.nextInt(51); // Random number between 50 and 100 + int coverage = premium * 100; + + Policy newPolicy = new Policy(); + newPolicy.setPolicyNumber($familyApplication.getApplicationNumber()); + newPolicy.setClientName($name); + newPolicy.setPremium(premium); + newPolicy.setCoverage(coverage); + newPolicy.setPaymentStatus("Unpaid"); + + insertLogical(newPolicy); + System.out.println("New policy issued: " + newPolicy); +end \ No newline at end of file diff --git a/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo4/Report.drl b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo4/Report.drl new file mode 100644 index 0000000..ec77469 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/classes/org.sw/lesson06/demo4/Report.drl @@ -0,0 +1,11 @@ +package org.sw.lesson06.demo4; + +import org.sw.facts.Application; + +rule "Check for Child Applications" + dialect "java" + when + forall ( Application( clientAge >= 16 )) + then + System.out.println( "No applications from under 16 year olds" ); +end diff --git a/Course Material/Day two/insurance/insurance/target/maven-archiver/pom.properties b/Course Material/Day two/insurance/insurance/target/maven-archiver/pom.properties new file mode 100644 index 0000000..4d55cf5 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/maven-archiver/pom.properties @@ -0,0 +1,3 @@ +artifactId=insurance +groupId=org.sw +version=1.0-SNAPSHOT diff --git a/Course Material/Day two/insurance/insurance/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/Course Material/Day two/insurance/insurance/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..68f1724 --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,24 @@ +org\sw\facts\ClientID$ClientIDBuilder.class +org\sw\builder\ClaimRepository.class +org\sw\facts\Policy$PolicyBuilder.class +org\sw\builder\ApplicationRepository.class +org\sw\facts\InvalidFamilyApplication.class +org\sw\Common.class +org\sw\facts\Payout.class +org\sw\builder\ClientIdRepository.class +org\sw\facts\InvalidClientID.class +org\sw\facts\ValidClaim.class +org\sw\facts\InvalidClaim.class +org\sw\facts\FamilyApplication$FamilyApplicationBuilder.class +org\sw\facts\SessionData.class +org\sw\facts\ValidApplication.class +org\sw\facts\FamilyApplication.class +org\sw\facts\ClientID.class +org\sw\facts\Claim$ClaimBuilder.class +org\sw\facts\InvalidApplication.class +org\sw\facts\Policy.class +org\sw\facts\ValidClientID.class +org\sw\facts\Status.class +org\sw\facts\Claim.class +org\sw\facts\Application$ApplicationBuilder.class +org\sw\facts\Application.class diff --git a/Course Material/Day two/insurance/insurance/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/Course Material/Day two/insurance/insurance/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..26cbecb --- /dev/null +++ b/Course Material/Day two/insurance/insurance/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,19 @@ +C:\Users\jpfra\IdeaProjects\insurance\src\main\java\org\sw\facts\Claim.java +C:\Users\jpfra\IdeaProjects\insurance\src\main\java\org\sw\facts\ValidClaim.java +C:\Users\jpfra\IdeaProjects\insurance\src\main\java\org\sw\facts\SessionData.java +C:\Users\jpfra\IdeaProjects\insurance\src\main\java\org\sw\facts\InvalidFamilyApplication.java +C:\Users\jpfra\IdeaProjects\insurance\src\main\java\org\sw\builder\ClientIdRepository.java +C:\Users\jpfra\IdeaProjects\insurance\src\main\java\org\sw\facts\InvalidApplication.java +C:\Users\jpfra\IdeaProjects\insurance\src\main\java\org\sw\facts\Policy.java +C:\Users\jpfra\IdeaProjects\insurance\src\main\java\org\sw\facts\ValidApplication.java +C:\Users\jpfra\IdeaProjects\insurance\src\main\java\org\sw\builder\ApplicationRepository.java +C:\Users\jpfra\IdeaProjects\insurance\src\main\java\org\sw\facts\ClientID.java +C:\Users\jpfra\IdeaProjects\insurance\src\main\java\org\sw\facts\InvalidClientID.java +C:\Users\jpfra\IdeaProjects\insurance\src\main\java\org\sw\facts\Application.java +C:\Users\jpfra\IdeaProjects\insurance\src\main\java\org\sw\facts\InvalidClaim.java +C:\Users\jpfra\IdeaProjects\insurance\src\main\java\org\sw\facts\Payout.java +C:\Users\jpfra\IdeaProjects\insurance\src\main\java\org\sw\facts\FamilyApplication.java +C:\Users\jpfra\IdeaProjects\insurance\src\main\java\org\sw\Common.java +C:\Users\jpfra\IdeaProjects\insurance\src\main\java\org\sw\facts\Status.java +C:\Users\jpfra\IdeaProjects\insurance\src\main\java\org\sw\builder\ClaimRepository.java +C:\Users\jpfra\IdeaProjects\insurance\src\main\java\org\sw\facts\ValidClientID.java diff --git a/Course Material/Day two/insurance/insurance/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/Course Material/Day two/insurance/insurance/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..e69de29 diff --git a/Course Material/Day two/insurance/insurance/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/Course Material/Day two/insurance/insurance/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..e69de29 diff --git a/Course Material/Exercises/Day 1/README.md b/Course Material/Exercises/Day 1/README.md new file mode 100644 index 0000000..9daeafb --- /dev/null +++ b/Course Material/Exercises/Day 1/README.md @@ -0,0 +1 @@ +test diff --git a/Course Material/Exercises/Student Files/Raydo.md b/Course Material/Exercises/Student Files/Raydo.md deleted file mode 100644 index cbb9871..0000000 --- a/Course Material/Exercises/Student Files/Raydo.md +++ /dev/null @@ -1,186 +0,0 @@ -# Applying Drools Rule Engine in University Course Registration Efficiency - - -## Objective - -The objective of this solution is to showcase how the Drools Rule Engine can be practically applied to improve efficiency in a university's course registration process. - -## University Description - -Our university is a reputable institution that offers a wide range of academic programs to students. It faces challenges related to course registration, particularly as the number of students and course offerings continue to grow. - -## Operational Challenges - -1. **Course Availability:** Ensuring that students can register for the courses they need to progress in their academic programs. -2. **Prerequisite Checking:** Verifying that students meet the prerequisites required for certain advanced courses. -3. **Scheduling Conflicts:** Avoiding scheduling conflicts that might prevent students from enrolling in essential courses. - -## Theoretical Rules - -### Course Availability Rules - -- **Course Capacity Rule:** If a course's enrollment reaches its maximum capacity, close registration for that course. -- **Priority Registration Rule:** Give priority registration to graduating seniors to ensure they can enroll in their required courses. -- **Waitlist Management Rule:** If a course is full, place students on a waitlist based on their registration timestamp, and automatically enroll them if a spot becomes available. - -### Prerequisite Checking Rules - -- **Prerequisite Verification Rule:** Before allowing registration for an advanced course, verify that the student has completed the required prerequisites. -- **Prerequisite Advisement Rule:** If a student registers for a course without meeting prerequisites, provide advisement on the required preparatory courses. - -### Scheduling Conflict Rules - -- **Conflict Detection Rule:** Before finalizing a student's course schedule, check for scheduling conflicts and prompt the student to make adjustments if conflicts are found. -- **Resolution Assistance Rule:** If a scheduling conflict is detected, provide alternative course options that do not conflict with the student's existing schedule. - -## Justification of Rules - -- **Course Capacity Rule:** Prevents over-enrollment, ensuring a manageable student-to-faculty ratio. -- **Priority Registration Rule:** Ensures that graduating seniors get the courses they need to graduate on time. -- **Waitlist Management Rule:** Maximizes course enrollment while managing waitlisted students fairly. - -- **Prerequisite Verification Rule:** Maintains academic standards by confirming students' readiness for advanced courses. -- **Prerequisite Advisement Rule:** Guides students toward completing prerequisites and making informed course choices. - -- **Conflict Detection Rule:** Eliminates scheduling conflicts that can disrupt students' academic plans. -- **Resolution Assistance Rule:** Offers solutions when conflicts arise, enhancing the student experience. - -## Presentation - -The findings and rules have been compiled into a structured document, demonstrating how Drools can improve operational efficiency, student satisfaction, and decision-making in a university's course registration process. - -## Learning Outcome - -This exercise highlights the practical application of Drools in addressing real-world operational challenges within a university. It underscores the role of automation and rule-based decision-making in enhancing efficiency and student success in the context of course registration. - ---- - -This solution is in response to "Exercise 01 – Module 01 Practical Task," demonstrating the practical application of Drools in addressing real-world operational challenges within a university's course registration process. - - - -# Implementing Drools Rules for University Course Registration Efficiency - -## Objective - -The objective of this task is to transform the theoretical Drools rules provided in the previous solution into actual code. By implementing these rules, you will gain hands-on experience in utilizing the Drools Rule Engine to improve efficiency in a university's course registration process. - -## Instructions - -1. **Setup Drools Environment:** Ensure that you have a working Drools environment set up. You can use Drools within your preferred programming language, such as Java or Kotlin. - -2. **Review Theoretical Rules:** Refer to the theoretical rules provided in the previous solution for improving university course registration efficiency. These rules are structured under "Course Availability Rules," "Prerequisite Checking Rules," and "Scheduling Conflict Rules." - -3. **Transform to Actual Drools Code:** For each of the theoretical rules, write the corresponding Drools rule in your chosen programming language. Implement each rule with the following components: - - - **Rule Name:** A unique identifier for each rule. - - **When (LHS):** The condition(s) part of the rule. Define the criteria that must be met for the rule to execute. - - **Then (RHS):** The actions part of the rule. Specify what actions should be taken when the conditions are met. - - **End:** Ensure that each rule is appropriately concluded. -4. **Compile and Test:** Compile your code and test the rules using sample data or scenarios. Ensure that the rules behave as expected and address the operational challenges mentioned in the solution. - -5. **Document Your Code:** Create documentation that includes: - - - A list of all transformed Drools rules. - - A clear explanation of each rule, including its Rule Name, LHS (conditions), RHS (actions), and any assumptions or explanations needed. - - Sample input data or scenarios used for testing. -6. **Justify Your Choices:** Provide a brief explanation for each rule's structure and logic. Discuss why you structured each rule in the way you did and how it addresses the specific challenges. - - -## Submission - -Submit your implementation of the Drools rules, along with the documentation, for review. Ensure that your code is well-documented, and your explanations are clear and concise. - -## Learning Outcome - -This task offers practical experience in converting theoretical rules into functional Drools rules, demonstrating the real-world application of the Drools Rule Engine in university course registration efficiency. - ---- - -> [!NOTE] -> Delegates are expected to implement the Drools rules based on the provided theoretical rules and document their code and reasoning for each rule. This hands-on exercise will help them understand how to apply Drools effectively in a university course registration context. - ---- - - -Here are hints and an actual example for implementing Drools rules along with code samples in Java. These examples cover a simplified scenario of course registration, focusing on the "Course Availability Rules." - -### Hints: - -1. **Setup Drools Environment:** - - - You can set up a Drools project using Maven or Gradle for easier dependency management. - - Ensure you have the Drools libraries and runtime integrated into your project. -2. **Transform Theoretical Rules:** - - - For each rule, define the conditions (LHS) using Drools' DSL (Domain Specific Language). - - Specify the actions (RHS) that should be taken when the conditions are met. - - Use Drools' syntax to express your rules, keeping them clear and concise. - - Don't forget to provide a unique name for each rule. -3. **Compile and Test:** - - - Create sample data or scenarios to test your rules. - - Ensure your rules are triggered correctly and produce the expected outcomes. -4. **Document Your Code:** - - - Create clear documentation that explains each rule in detail. - - Include comments in your code to make it more understandable. -5. **Justify Your Choices:** - - - Explain why you structured each rule in a particular way. - - Discuss how each rule addresses the specific challenges mentioned. - -### Example - Course Capacity Rule: - -**Theoretical Rule:** - -- "If a course's enrollment reaches its maximum capacity, close registration for that course." - -**Drools Code in Java:** - -``` java - -`import org.drools.core.spi.KnowledgeHelper; rule "Course Capacity Rule" when $course : Course(enrollment >= maxCapacity) then // Close registration for the course $course.setRegistrationClosed(true); System.out.println("Registration for course " + $course.getName() + " is closed due to maximum capacity reached."); end` -``` - -In this Java example, we define the "Course Capacity Rule" using Drools syntax. It checks if the enrollment for a course is greater than or equal to its maximum capacity. If the condition is met, it sets the `registrationClosed` flag to true and prints a message indicating that registration is closed for that course. - ---- - -> [!NOTE] -> Delegates should follow a similar approach to implement the remaining rules, adapt them to their specific use case, and test their behavior using sample data. - ---- - - -Let's make the code more complex by adding additional conditions and actions to the Drools rules. In this example, we'll expand on the "Course Capacity Rule" and introduce a new rule, the "Priority Registration Rule." - -### Complex Example - Course Capacity Rule with Priority Registration: - -**Theoretical Rules:** - -1. **Course Capacity Rule:** - - "If a course's enrollment reaches its maximum capacity, close registration for that course." -2. **Priority Registration Rule:** - - "Give priority registration to graduating seniors to ensure they can enroll in their required courses." - -**Drools Code in Java:** - -``` java - -`import org.drools.core.spi.KnowledgeHelper; rule "Course Capacity Rule" when $course : Course(enrollment >= maxCapacity, registrationClosed == false) then // Close registration for the course $course.setRegistrationClosed(true); System.out.println("Registration for course " + $course.getName() + " is closed due to maximum capacity reached."); end rule "Priority Registration Rule" when $student : Student(graduationYear == 2024) // Assuming 2024 represents graduating seniors $course : Course(priorityRegistration == true, registrationClosed == false) then // Allow priority registration for graduating seniors $student.setRegistered(true); System.out.println("Priority registration granted to student " + $student.getName() + "."); end` -``` - -In this more complex example, we have two rules: - -1. **Course Capacity Rule:** This rule checks if a course's enrollment has reached its maximum capacity and if registration for the course is still open. If both conditions are met, it closes the registration for that course. - -2. **Priority Registration Rule:** This rule grants priority registration to graduating seniors (assuming a graduation year of 2024) for courses that allow priority registration and still have open registration. It sets the `registered` flag for the student to true and prints a message indicating priority registration has been granted. - - ---- - -> [!NOTE] -> Delegates can use this example as a reference to create more complex Drools rules, adding multiple conditions and actions as needed to address specific challenges in their university course registration system. - ---- diff --git a/Course Material/Student Handbook.md.md b/Course Material/Student Handbook.md similarity index 99% rename from Course Material/Student Handbook.md.md rename to Course Material/Student Handbook.md index d155d04..5b169a9 100644 --- a/Course Material/Student Handbook.md.md +++ b/Course Material/Student Handbook.md @@ -864,4 +864,4 @@ By the end of this module, participants will have a comprehensive understanding --- -Upon completion of this immersive module, you will possess a formidable skill set, capable of leveraging advanced Drools features to elevate the management, execution, and real-time event processing capabilities within the intricate realm of health insurance, ultimately enhancing decision-making processes and industry performance. \ No newline at end of file +Upon completion of this immersive module, you will possess a formidable skill set, capable of leveraging advanced Drools features to elevate the management, execution, and real-time event processing capabilities within the intricate realm of health insurance, ultimately enhancing decision-making processes and industry performance. diff --git a/Course Material/Student Handbook.pdf b/Course Material/Student Handbook.pdf deleted file mode 100644 index bccccee..0000000 Binary files a/Course Material/Student Handbook.pdf and /dev/null differ diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/dto/ClaimDto.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/dto/ClaimDto.java index 0c8a426..12c0702 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/dto/ClaimDto.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/dto/ClaimDto.java @@ -1,5 +1,6 @@ package africa.skunkworks.training.drools.insurance.domain.dto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; import lombok.Builder; import lombok.Data; @@ -21,4 +22,8 @@ public class ClaimDto implements Serializable { private LocalDate dateOfClaim; private Double claimAmount; + + private Status status; + + private String reason; } diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/dto/ClientIdentificationDto.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/dto/ClientIdentificationDto.java new file mode 100644 index 0000000..f7c5816 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/dto/ClientIdentificationDto.java @@ -0,0 +1,25 @@ +package africa.skunkworks.training.drools.insurance.domain.dto; + +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import lombok.Builder; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; + +@Data +@Builder +public class ClientIdentificationDto implements Serializable { + + @Serial + private static final long serialVersionUID = 4978583599192950429L; + + private String name; + + private String idNumber; + + private LocalDate expiryDate; + + private Status status; +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/dto/InvalidClaim.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/dto/InvalidClaim.java new file mode 100644 index 0000000..5df9d1b --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/dto/InvalidClaim.java @@ -0,0 +1,21 @@ +package africa.skunkworks.training.drools.insurance.domain.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +@AllArgsConstructor +public class InvalidClaim implements Serializable { + + @Serial + private static final long serialVersionUID = -3284128457859671194L; + + private ClaimDto claim; + + + + +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/dto/InvalidPolicy.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/dto/InvalidPolicy.java new file mode 100644 index 0000000..752d879 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/dto/InvalidPolicy.java @@ -0,0 +1,17 @@ +package africa.skunkworks.training.drools.insurance.domain.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +@AllArgsConstructor +public class InvalidPolicy implements Serializable { + + @Serial + private static final long serialVersionUID = -6713081549489970745L; + + private PolicyDto policy; +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/dto/Payout.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/dto/Payout.java new file mode 100644 index 0000000..f2c623f --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/dto/Payout.java @@ -0,0 +1,19 @@ +package africa.skunkworks.training.drools.insurance.domain.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +@AllArgsConstructor +public class Payout implements Serializable { + + @Serial + private static final long serialVersionUID = 641444564784602066L; + + private String policyNumber; + + private Double claimAmount; +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/dto/ValidClaim.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/dto/ValidClaim.java new file mode 100644 index 0000000..a5a8acd --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/dto/ValidClaim.java @@ -0,0 +1,17 @@ +package africa.skunkworks.training.drools.insurance.domain.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +@AllArgsConstructor +public class ValidClaim implements Serializable { + + @Serial + private static final long serialVersionUID = 5818718485937939526L; + + private ClaimDto claim; +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/repository/Application.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/repository/Application.java index 69d64c6..20c594c 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/repository/Application.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/repository/Application.java @@ -1,8 +1,11 @@ package africa.skunkworks.training.drools.insurance.domain.repository; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.OneToOne; @@ -36,6 +39,14 @@ public class Application implements Serializable { @Column(name = "BMI") private String bmi; + @Column(name = "REASON") + private String reason; + + + @Column(name = "STATUS") + @Enumerated(EnumType.STRING) + private Status status; + public Application() { } @@ -79,17 +90,33 @@ public void setBmi(String bmi) { this.bmi = bmi; } + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public Status getStatus() { + return status; + } + + public void setStatus(Status status) { + this.status = status; + } + @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Application that = (Application) o; - return Objects.equals(applicationNumber, that.applicationNumber) && Objects.equals(client, that.client) && Objects.equals(pec, that.pec) && Objects.equals(risk, that.risk) && Objects.equals(bmi, that.bmi); + return Objects.equals(applicationNumber, that.applicationNumber) && Objects.equals(client, that.client) && Objects.equals(pec, that.pec) && Objects.equals(risk, that.risk) && Objects.equals(bmi, that.bmi) && Objects.equals(reason, that.reason) && status == that.status; } @Override public int hashCode() { - return Objects.hash(applicationNumber, client, pec, risk, bmi); + return Objects.hash(applicationNumber, client, pec, risk, bmi, reason, status); } @Override @@ -97,9 +124,11 @@ public String toString() { return "Application{" + "applicationNumber='" + applicationNumber + '\'' + ", client=" + client + - ", pec='" + pec + '\'' + + ", pec=" + pec + ", risk='" + risk + '\'' + ", bmi='" + bmi + '\'' + + ", reason='" + reason + '\'' + + ", status=" + status + '}'; } } diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/repository/Claim.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/repository/Claim.java index 8507735..1a7b525 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/repository/Claim.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/repository/Claim.java @@ -1,8 +1,11 @@ package africa.skunkworks.training.drools.insurance.domain.repository; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.OneToOne; @@ -34,6 +37,14 @@ public class Claim implements Serializable { @Column(name = "CLAIM_AMOUNT") private BigDecimal claimAmount; + @Column(name = "REASON") + private String reason; + + + @Column(name = "STATUS") + @Enumerated(EnumType.STRING) + private Status status; + public Claim() { } @@ -69,18 +80,33 @@ public void setClaimAmount(BigDecimal claimAmount) { this.claimAmount = claimAmount; } + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public Status getStatus() { + return status; + } + + public void setStatus(Status status) { + this.status = status; + } + @Override public boolean equals(Object o) { - if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Claim claim = (Claim) o; - return Objects.equals(claimId, claim.claimId) && Objects.equals(policy, claim.policy) && Objects.equals(dateOfClaim, claim.dateOfClaim) && Objects.equals(claimAmount, claim.claimAmount); + return Objects.equals(claimId, claim.claimId) && Objects.equals(policy, claim.policy) && Objects.equals(dateOfClaim, claim.dateOfClaim) && Objects.equals(claimAmount, claim.claimAmount) && Objects.equals(reason, claim.reason) && status == claim.status; } @Override public int hashCode() { - return Objects.hash(claimId, policy, dateOfClaim, claimAmount); + return Objects.hash(claimId, policy, dateOfClaim, claimAmount, reason, status); } @Override @@ -90,6 +116,8 @@ public String toString() { ", policy=" + policy + ", dateOfClaim=" + dateOfClaim + ", claimAmount=" + claimAmount + + ", reason='" + reason + '\'' + + ", status=" + status + '}'; } } diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/repository/Policy.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/repository/Policy.java index 528b482..b137d33 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/repository/Policy.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-domain/src/main/java/africa/skunkworks/training/drools/insurance/domain/repository/Policy.java @@ -33,9 +33,14 @@ public class Policy implements Serializable { @Column(name = "COVERAGE") private BigDecimal coverage; + @Column(name = "REASON") + private String reason; + @Column(name = "STATUS") private String status; + + public Policy() { } @@ -71,6 +76,14 @@ public void setCoverage(BigDecimal coverage) { this.coverage = coverage; } + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + public String getStatus() { return status; } @@ -84,12 +97,12 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Policy policy = (Policy) o; - return Objects.equals(policyNumber, policy.policyNumber) && Objects.equals(client, policy.client) && Objects.equals(premium, policy.premium) && Objects.equals(coverage, policy.coverage) && Objects.equals(status, policy.status); + return Objects.equals(policyNumber, policy.policyNumber) && Objects.equals(client, policy.client) && Objects.equals(premium, policy.premium) && Objects.equals(coverage, policy.coverage) && Objects.equals(reason, policy.reason) && Objects.equals(status, policy.status); } @Override public int hashCode() { - return Objects.hash(policyNumber, client, premium, coverage, status); + return Objects.hash(policyNumber, client, premium, coverage, reason, status); } @Override @@ -99,6 +112,7 @@ public String toString() { ", client=" + client + ", premium=" + premium + ", coverage=" + coverage + + ", reason='" + reason + '\'' + ", status='" + status + '\'' + '}'; } diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/main/java/africa/skunkworks/training/drools/insurance/manager/AbstractMessageSourceManager.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/main/java/africa/skunkworks/training/drools/insurance/manager/AbstractMessageSourceManager.java new file mode 100644 index 0000000..026508e --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/main/java/africa/skunkworks/training/drools/insurance/manager/AbstractMessageSourceManager.java @@ -0,0 +1,28 @@ +package africa.skunkworks.training.drools.insurance.manager; + +import org.springframework.context.MessageSource; + +import java.util.Locale; + +public abstract class AbstractMessageSourceManager { + + private static final Locale DEFAULT_LOCALE = new Locale("en", "ZA"); + + private final MessageSource messageSource; + + protected AbstractMessageSourceManager(MessageSource messageSource) { + this.messageSource = messageSource; + } + + protected String getMessage(String code){ + return getMessage(code, null, DEFAULT_LOCALE); + } + + protected String getMessage(String code, Object[]args){ + return getMessage(code, args, DEFAULT_LOCALE); + } + + protected String getMessage(String code, Object[]args, Locale locale){ + return messageSource.getMessage(code, args, locale); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/main/java/africa/skunkworks/training/drools/insurance/manager/rule/ApplicationRuleManager.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/main/java/africa/skunkworks/training/drools/insurance/manager/rule/ApplicationRuleManager.java new file mode 100644 index 0000000..81a283b --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/main/java/africa/skunkworks/training/drools/insurance/manager/rule/ApplicationRuleManager.java @@ -0,0 +1,12 @@ +package africa.skunkworks.training.drools.insurance.manager.rule; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.web.response.Response; + +import java.util.List; + +public interface ApplicationRuleManager { + + Response> fireApplicationRules(); + +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/main/java/africa/skunkworks/training/drools/insurance/manager/rule/ClaimRuleManager.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/main/java/africa/skunkworks/training/drools/insurance/manager/rule/ClaimRuleManager.java new file mode 100644 index 0000000..538203f --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/main/java/africa/skunkworks/training/drools/insurance/manager/rule/ClaimRuleManager.java @@ -0,0 +1,11 @@ +package africa.skunkworks.training.drools.insurance.manager.rule; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.web.response.Response; + +import java.util.List; + +public interface ClaimRuleManager { + + Response> fireClaimRules(); +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/main/java/africa/skunkworks/training/drools/insurance/manager/rule/PolicyRuleManager.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/main/java/africa/skunkworks/training/drools/insurance/manager/rule/PolicyRuleManager.java new file mode 100644 index 0000000..2db0f88 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/main/java/africa/skunkworks/training/drools/insurance/manager/rule/PolicyRuleManager.java @@ -0,0 +1,11 @@ +package africa.skunkworks.training.drools.insurance.manager.rule; + +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.web.response.Response; + +import java.util.List; + +public interface PolicyRuleManager { + + Response> fireAllRulePolicies(); +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/main/java/africa/skunkworks/training/drools/insurance/manager/rule/impl/ApplicationRuleManagerImpl.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/main/java/africa/skunkworks/training/drools/insurance/manager/rule/impl/ApplicationRuleManagerImpl.java new file mode 100644 index 0000000..5dfecf6 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/main/java/africa/skunkworks/training/drools/insurance/manager/rule/impl/ApplicationRuleManagerImpl.java @@ -0,0 +1,42 @@ +package africa.skunkworks.training.drools.insurance.manager.rule.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.web.response.Response; +import africa.skunkworks.training.drools.insurance.manager.AbstractMessageSourceManager; +import africa.skunkworks.training.drools.insurance.manager.rule.ApplicationRuleManager; +import africa.skunkworks.training.drools.insurance.service.ApplicationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.MessageSource; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class ApplicationRuleManagerImpl extends AbstractMessageSourceManager implements ApplicationRuleManager { + + private final ApplicationService applicationService; + + @Autowired + public ApplicationRuleManagerImpl(MessageSource messageSource, ApplicationService applicationService) { + super(messageSource); + this.applicationService = applicationService; + } + + @Override + public Response> fireApplicationRules() { + Response> response; + + try{ + List applications = applicationService.validateAllApplications(); + String message = getMessage("application.list.success"); + response = new Response<>(Boolean.TRUE,message,applications); + + }catch (Exception ex){ + String message = getMessage("application.list.error", new String[]{ex.getMessage()}); + response = new Response<>(Boolean.FALSE,message, new ArrayList<>()); + } + + return response; + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/main/java/africa/skunkworks/training/drools/insurance/manager/rule/impl/ClaimRuleManagerImpl.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/main/java/africa/skunkworks/training/drools/insurance/manager/rule/impl/ClaimRuleManagerImpl.java new file mode 100644 index 0000000..3e358f6 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/main/java/africa/skunkworks/training/drools/insurance/manager/rule/impl/ClaimRuleManagerImpl.java @@ -0,0 +1,42 @@ +package africa.skunkworks.training.drools.insurance.manager.rule.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.web.response.Response; +import africa.skunkworks.training.drools.insurance.manager.AbstractMessageSourceManager; +import africa.skunkworks.training.drools.insurance.manager.rule.ClaimRuleManager; +import africa.skunkworks.training.drools.insurance.service.ClaimValidationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.MessageSource; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class ClaimRuleManagerImpl extends AbstractMessageSourceManager implements ClaimRuleManager { + + private final ClaimValidationService claimValidationService; + + @Autowired + public ClaimRuleManagerImpl(MessageSource messageSource, ClaimValidationService claimValidationService) { + super(messageSource); + this.claimValidationService = claimValidationService; + } + + @Override + public Response> fireClaimRules() { + Response> response; + + try{ + + List claims = claimValidationService.validateAllClaims(); + String message = getMessage("claim.list.success"); + response = new Response<>(Boolean.TRUE,message, claims); + + }catch (Exception ex){ + String message = getMessage("claim.list.error", new String[]{ex.getMessage()}); + response = new Response<>(Boolean.FALSE,message, new ArrayList<>()); + } + return response; + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/main/java/africa/skunkworks/training/drools/insurance/manager/rule/impl/PolicyRuleManagerImpl.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/main/java/africa/skunkworks/training/drools/insurance/manager/rule/impl/PolicyRuleManagerImpl.java new file mode 100644 index 0000000..d7f585e --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/main/java/africa/skunkworks/training/drools/insurance/manager/rule/impl/PolicyRuleManagerImpl.java @@ -0,0 +1,43 @@ +package africa.skunkworks.training.drools.insurance.manager.rule.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.web.response.Response; +import africa.skunkworks.training.drools.insurance.manager.AbstractMessageSourceManager; +import africa.skunkworks.training.drools.insurance.manager.rule.PolicyRuleManager; +import africa.skunkworks.training.drools.insurance.service.PolicyService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.MessageSource; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class PolicyRuleManagerImpl extends AbstractMessageSourceManager implements PolicyRuleManager { + + private final PolicyService policyService; + + @Autowired + public PolicyRuleManagerImpl(MessageSource messageSource,PolicyService policyService) { + super(messageSource); + this.policyService = policyService; + } + + @Override + public Response> fireAllRulePolicies() { + Response> response; + + try{ + + List policies = policyService.validateAllPolicies(); + String message = getMessage("policy.list.success"); + response = new Response<>(Boolean.TRUE,message, policies); + + }catch (Exception ex){ + String message = getMessage("policy.list.error", new String[]{ex.getMessage()}); + response = new Response<>(Boolean.FALSE,message, new ArrayList<>()); + } + + return response; + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/test/java/africa/skunkworks/training/drools/insurance/manager/rule/ApplicationRuleManagerTest.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/test/java/africa/skunkworks/training/drools/insurance/manager/rule/ApplicationRuleManagerTest.java new file mode 100644 index 0000000..ce55f34 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/test/java/africa/skunkworks/training/drools/insurance/manager/rule/ApplicationRuleManagerTest.java @@ -0,0 +1,29 @@ +package africa.skunkworks.training.drools.insurance.manager.rule; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.web.response.Response; +import africa.skunkworks.training.drools.insurance.manager.AbstractManagerTest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class ApplicationRuleManagerTest extends AbstractManagerTest { + + @Autowired + private ApplicationRuleManager applicationRuleManager; + @Test + public void fireApplicationRules(){ + Response> response = applicationRuleManager.fireApplicationRules(); + assertNotNull(response); + assertTrue(response.isSuccessful()); + assertNotNull(response.getPayload()); + assertFalse(response.getPayload().isEmpty()); + assertEquals(10, response.getPayload().size()); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/test/java/africa/skunkworks/training/drools/insurance/manager/rule/ClaimRuleManagerTest.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/test/java/africa/skunkworks/training/drools/insurance/manager/rule/ClaimRuleManagerTest.java new file mode 100644 index 0000000..3bd2e8c --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/test/java/africa/skunkworks/training/drools/insurance/manager/rule/ClaimRuleManagerTest.java @@ -0,0 +1,30 @@ +package africa.skunkworks.training.drools.insurance.manager.rule; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.web.response.Response; +import africa.skunkworks.training.drools.insurance.manager.AbstractManagerTest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class ClaimRuleManagerTest extends AbstractManagerTest { + + @Autowired + private ClaimRuleManager claimRuleManager; + + @Test + public void fireClaimRules(){ + Response> response = claimRuleManager.fireClaimRules(); + assertNotNull(response); + assertTrue(response.isSuccessful()); + assertNotNull(response.getPayload()); + assertFalse(response.getPayload().isEmpty()); + assertEquals(5, response.getPayload().size()); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/test/java/africa/skunkworks/training/drools/insurance/manager/rule/PolicyRuleManagerTest.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/test/java/africa/skunkworks/training/drools/insurance/manager/rule/PolicyRuleManagerTest.java new file mode 100644 index 0000000..3ad8716 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/test/java/africa/skunkworks/training/drools/insurance/manager/rule/PolicyRuleManagerTest.java @@ -0,0 +1,30 @@ +package africa.skunkworks.training.drools.insurance.manager.rule; + +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.web.response.Response; +import africa.skunkworks.training.drools.insurance.manager.AbstractManagerTest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class PolicyRuleManagerTest extends AbstractManagerTest { + + @Autowired + private PolicyRuleManager policyRuleManager; + + @Test + public void fireAllRulePolicies(){ + Response> response = policyRuleManager.fireAllRulePolicies(); + assertNotNull(response); + assertTrue(response.isSuccessful()); + assertNotNull(response.getPayload()); + assertFalse(response.getPayload().isEmpty()); + assertEquals(10, response.getPayload().size()); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/test/resources/data.sql b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/test/resources/data.sql new file mode 100644 index 0000000..72c674c --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/test/resources/data.sql @@ -0,0 +1,57 @@ +-- Client Sample Data6 +INSERT INTO DROOLS_TRAINING_INSURANCE.CLIENT(CLIENT_ID, CLIENT_NAME, BIRTHDATE, IS_SMOKER, IS_EMPLOYED, ANNUAL_INCOME) +VALUES +( '01','James Smith', CURRENT_DATE,FALSE,TRUE,138000), +( '02','Maria Smith', CURRENT_DATE,FALSE,TRUE,57000), +( '03','Robert Johnson', CURRENT_DATE,FALSE,TRUE,90000), +( '04','Linda Johnson', CURRENT_DATE,FALSE,TRUE,120000), +( '05','Michael Wilson', CURRENT_DATE,FALSE,TRUE,21000), +( '06','Elizabeth Anderson', CURRENT_DATE,FALSE,TRUE,119000), +( '07','David Lee', CURRENT_DATE,FALSE,TRUE,75000), +( '08','Emily Taylor', CURRENT_DATE,FALSE,TRUE,147000), +( '09','William Brown', CURRENT_DATE,FALSE,TRUE,135000), +( '10','Jessica Thompson', CURRENT_DATE,FALSE,TRUE,89000); +-- Client Ids +INSERT INTO DROOLS_TRAINING_INSURANCE.CLIENT_IDENTIFICATION(IDENTIFICATION_NUMBER, CLIENT_ID, IS_EXPIRED) +VALUES ('ID-100','01',FALSE ), + ('ID-101','02',TRUE ), + ('ID-102','03',FALSE ), + ('ID-103','04',FALSE ), + ('ID-104','05',FALSE ), + ('ID-105','06',FALSE ), + ('ID-106','07',FALSE ), + ('ID-107','08',FALSE ), + ('ID-108','09',FALSE ), + ('ID-109','10',FALSE ); +-- Applications +INSERT INTO DROOLS_TRAINING_INSURANCE.APPLICATION(APPLICATION_NUMBER, CLIENT_ID, PEC, RISK, BMI) +VALUES ('A-100', '01',FALSE,'High','21' ), + ('A-101', '02',TRUE,'Medium','23' ), + ('A-102', '03',FALSE,'High','25'), + ('A-103', '04',FALSE,'Low','32'), + ('A-104', '05',TRUE,'Low','20' ), + ('A-105', '06',FALSE,'Medium','27' ), + ('A-106', '07',TRUE,'High','31' ), + ('A-107', '08',FALSE,'Low','18' ), + ('A-108', '09',TRUE,'Low','28'), + ('A-109', '10',FALSE,'Medium','23' ); + +-- Policies +INSERT INTO DROOLS_TRAINING_INSURANCE.POLICY(POLICY_NUMBER, CLIENT_ID, PREMIUM, COVERAGE, STATUS) +VALUES ('P-100','01',140,14000,'Paid' ), + ('P-101','02',220,22000,'Unpaid' ), + ('P-102','03',150,15000,'Unpaid' ), + ('P-103','04',90,9000,'Paid' ), + ('P-104','05',400,40000,'Paid' ), + ('P-105','06',230,23000,'Paid' ), + ('P-106','07',180,18000,'Paid' ), + ('P-107','08',240,24000,'Paid' ), + ('P-108','09',120,12000,'Unpaid' ), + ('P-109','10',210,21000,'Paid' ); + +INSERT INTO DROOLS_TRAINING_INSURANCE.CLAIM(CLAIM_ID, POLICY_NUMBER, DATE_OF_CLAIM, CLAIM_AMOUNT) +VALUES ('CLID-100','P-101',CURRENT_DATE,25000 ), + ('CLID-102','P-102',CURRENT_DATE,40000 ), + ('CLID-103','P-103',CURRENT_DATE,8000 ), + ('CLID-104','P-104',CURRENT_DATE,50000 ), + ('CLID-105','P-105',CURRENT_DATE,10000 ); \ No newline at end of file diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/test/resources/i18n/messages_en_ZA.properties b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/test/resources/i18n/messages_en_ZA.properties new file mode 100644 index 0000000..eade1cd --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/test/resources/i18n/messages_en_ZA.properties @@ -0,0 +1,7 @@ +# Drools Training Messages +application.list.success=Listed +application.list.error=Error {0} +claim.list.success=Listed +claim.list.error=Error {0} +policy.list.success=Listed +policy.list.error=Error {0} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/test/resources/schema.sql b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/test/resources/schema.sql new file mode 100644 index 0000000..5766db3 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-manager/src/test/resources/schema.sql @@ -0,0 +1,68 @@ +DROP SCHEMA IF EXISTS DROOLS_TRAINING_INSURANCE CASCADE; + +-- create schema +CREATE SCHEMA IF NOT EXISTS DROOLS_TRAINING_INSURANCE; + +-- Drop Tables +DROP TABLE IF EXISTS DROOLS_TRAINING_INSURANCE.APPLICATION; +DROP TABLE IF EXISTS DROOLS_TRAINING_INSURANCE.POLICY; +DROP TABLE IF EXISTS DROOLS_TRAINING_INSURANCE.CLAIM; +DROP TABLE IF EXISTS DROOLS_TRAINING_INSURANCE.CLIENT_IDENTIFICATION; +DROP TABLE IF EXISTS DROOLS_TRAINING_INSURANCE.CLIENT; + +-- CREATE TABLES +CREATE TABLE DROOLS_TRAINING_INSURANCE.CLIENT ( + CLIENT_ID VARCHAR(20), + CLIENT_NAME VARCHAR(100), + BIRTHDATE DATE, + IS_SMOKER BOOLEAN, + IS_EMPLOYED BOOLEAN, + ANNUAL_INCOME NUMERIC(14,4), + CONSTRAINT CLIENT_PK PRIMARY KEY (CLIENT_ID) +); + +-- CLIENT IDENTIFICATION +CREATE TABLE DROOLS_TRAINING_INSURANCE.CLIENT_IDENTIFICATION( + IDENTIFICATION_NUMBER VARCHAR(20), + CLIENT_ID VARCHAR(20), + IS_EXPIRED BOOLEAN, + CONSTRAINT IDENTIFICATION_PK PRIMARY KEY (IDENTIFICATION_NUMBER), + CONSTRAINT IDENTIFICATION_FK FOREIGN KEY (CLIENT_ID) REFERENCES DROOLS_TRAINING_INSURANCE.CLIENT +); + +-- APPLICATION +CREATE TABLE DROOLS_TRAINING_INSURANCE.APPLICATION( + APPLICATION_NUMBER VARCHAR(20), + CLIENT_ID VARCHAR(20), + PEC BOOLEAN, + RISK VARCHAR(20), + BMI VARCHAR(20), + REASON VARCHAR(50) DEFAULT 'N/A', + STATUS VARCHAR(20) DEFAULT 'UNKNOWN', + CONSTRAINT APPLICATION_PK PRIMARY KEY (APPLICATION_NUMBER), + CONSTRAINT APPLICATION_FK FOREIGN KEY (CLIENT_ID) REFERENCES DROOLS_TRAINING_INSURANCE.CLIENT +); + +-- POLICY +CREATE TABLE DROOLS_TRAINING_INSURANCE.POLICY( + POLICY_NUMBER VARCHAR(20), + CLIENT_ID VARCHAR(20), + PREMIUM NUMERIC (14,4), + COVERAGE NUMERIC(14,4), + REASON VARCHAR(50) DEFAULT 'N/A', + STATUS VARCHAR(20) DEFAULT 'UNKNOWN', + CONSTRAINT POLICY_PK PRIMARY KEY (POLICY_NUMBER), + CONSTRAINT POLICY_FK FOREIGN KEY (CLIENT_ID) REFERENCES DROOLS_TRAINING_INSURANCE.CLIENT +); + +-- CLAIMS +CREATE TABLE DROOLS_TRAINING_INSURANCE.CLAIM( + CLAIM_ID VARCHAR(20), + POLICY_NUMBER VARCHAR(20), + DATE_OF_CLAIM DATE, + CLAIM_AMOUNT NUMERIC(14,4), + REASON VARCHAR(50) DEFAULT 'N/A', + STATUS VARCHAR(20) DEFAULT 'UNKNOWN', + CONSTRAINT CLAIM_PK PRIMARY KEY (CLAIM_ID), + CONSTRAINT CLAIM_FK FOREIGN KEY (POLICY_NUMBER) REFERENCES DROOLS_TRAINING_INSURANCE.POLICY +); \ No newline at end of file diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-repository/src/test/java/africa/skunkworks/training/drools/insurance/repository/ApplicationRepositoryTest.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-repository/src/test/java/africa/skunkworks/training/drools/insurance/repository/ApplicationRepositoryTest.java index 1d90ba3..bf667eb 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-repository/src/test/java/africa/skunkworks/training/drools/insurance/repository/ApplicationRepositoryTest.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-repository/src/test/java/africa/skunkworks/training/drools/insurance/repository/ApplicationRepositoryTest.java @@ -1,5 +1,6 @@ package africa.skunkworks.training.drools.insurance.repository; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; import africa.skunkworks.training.drools.insurance.domain.repository.Application; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -21,6 +22,11 @@ public void listAllApplications(){ assertNotNull(applications); assertFalse(applications.isEmpty()); assertEquals(10,applications.size()); + + Application application = applications.get(0); + assertNotNull(application); + assertEquals("N/A", application.getReason()); + assertEquals(Status.UNKNOWN,application.getStatus()); } } diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-repository/src/test/java/africa/skunkworks/training/drools/insurance/repository/ClaimRepositoryTest.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-repository/src/test/java/africa/skunkworks/training/drools/insurance/repository/ClaimRepositoryTest.java index a7e9bd8..1f3eddd 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-repository/src/test/java/africa/skunkworks/training/drools/insurance/repository/ClaimRepositoryTest.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-repository/src/test/java/africa/skunkworks/training/drools/insurance/repository/ClaimRepositoryTest.java @@ -1,5 +1,6 @@ package africa.skunkworks.training.drools.insurance.repository; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; import africa.skunkworks.training.drools.insurance.domain.repository.Claim; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -21,5 +22,11 @@ public void listAllClaims(){ assertNotNull(claims); assertFalse(claims.isEmpty()); assertEquals(5, claims.size()); + + Claim claim = claims.get(0); + assertNotNull(claim); + assertEquals("CLID-100", claim.getClaimId()); + assertEquals("N/A", claim.getReason()); + assertEquals(Status.UNKNOWN, claim.getStatus()); } } diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-repository/src/test/java/africa/skunkworks/training/drools/insurance/repository/PolicyRepositoryTest.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-repository/src/test/java/africa/skunkworks/training/drools/insurance/repository/PolicyRepositoryTest.java index 633d1a3..54f4072 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-repository/src/test/java/africa/skunkworks/training/drools/insurance/repository/PolicyRepositoryTest.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-repository/src/test/java/africa/skunkworks/training/drools/insurance/repository/PolicyRepositoryTest.java @@ -21,5 +21,10 @@ public void listAllPolicies(){ assertNotNull(policies); assertFalse(policies.isEmpty()); assertEquals(10, policies.size()); + + Policy policy = policies.get(0); + assertNotNull(policy); + assertEquals("P-100", policy.getPolicyNumber()); + assertEquals("N/A", policy.getReason()); } } diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-repository/src/test/resources/schema.sql b/Course Material/labs/drools-training-insurance/drools-training-insurance-repository/src/test/resources/schema.sql index eea3788..5766db3 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-repository/src/test/resources/schema.sql +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-repository/src/test/resources/schema.sql @@ -37,6 +37,8 @@ CREATE TABLE DROOLS_TRAINING_INSURANCE.APPLICATION( PEC BOOLEAN, RISK VARCHAR(20), BMI VARCHAR(20), + REASON VARCHAR(50) DEFAULT 'N/A', + STATUS VARCHAR(20) DEFAULT 'UNKNOWN', CONSTRAINT APPLICATION_PK PRIMARY KEY (APPLICATION_NUMBER), CONSTRAINT APPLICATION_FK FOREIGN KEY (CLIENT_ID) REFERENCES DROOLS_TRAINING_INSURANCE.CLIENT ); @@ -47,7 +49,8 @@ CREATE TABLE DROOLS_TRAINING_INSURANCE.POLICY( CLIENT_ID VARCHAR(20), PREMIUM NUMERIC (14,4), COVERAGE NUMERIC(14,4), - STATUS VARCHAR(10), + REASON VARCHAR(50) DEFAULT 'N/A', + STATUS VARCHAR(20) DEFAULT 'UNKNOWN', CONSTRAINT POLICY_PK PRIMARY KEY (POLICY_NUMBER), CONSTRAINT POLICY_FK FOREIGN KEY (CLIENT_ID) REFERENCES DROOLS_TRAINING_INSURANCE.CLIENT ); @@ -58,6 +61,8 @@ CREATE TABLE DROOLS_TRAINING_INSURANCE.CLAIM( POLICY_NUMBER VARCHAR(20), DATE_OF_CLAIM DATE, CLAIM_AMOUNT NUMERIC(14,4), + REASON VARCHAR(50) DEFAULT 'N/A', + STATUS VARCHAR(20) DEFAULT 'UNKNOWN', CONSTRAINT CLAIM_PK PRIMARY KEY (CLAIM_ID), CONSTRAINT CLAIM_FK FOREIGN KEY (POLICY_NUMBER) REFERENCES DROOLS_TRAINING_INSURANCE.POLICY ); \ No newline at end of file diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/pom.xml b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/pom.xml index 4c8d58d..7dcfc55 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/pom.xml +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/pom.xml @@ -38,6 +38,11 @@ drools-mvel + + org.drools + drools-tms + + org.kie kie-spring diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/AbstractValidateApplication.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/AbstractValidateApplication.java index 7a1acc2..e98b4aa 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/AbstractValidateApplication.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/AbstractValidateApplication.java @@ -1,6 +1,10 @@ package africa.skunkworks.training.drools.insurance.rule; import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.ClientIdentificationDto; +import africa.skunkworks.training.drools.insurance.domain.dto.InvalidPolicy; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; import africa.skunkworks.training.drools.insurance.domain.response.ApplicationResponse; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; @@ -23,4 +27,48 @@ protected ApplicationResponse validateApplication(ApplicationDto applicationDto) return applicationResponse; } + + protected ApplicationResponse validateApplication(ApplicationDto applicationDto, ClientIdentificationDto clientIdentificationDto){ + ApplicationResponse applicationResponse = new ApplicationResponse(); + KieSession kieSession = kieContainer.newKieSession(); + kieSession.setGlobal("applicationResponse", applicationResponse); + kieSession.insert(applicationDto); + kieSession.insert(clientIdentificationDto); + kieSession.fireAllRules(); + kieSession.dispose(); + + return applicationResponse; + + } + + protected void validatePolicy(PolicyDto policyDto, InvalidPolicy invalidPolicy){ + KieSession kieSession = kieContainer.newKieSession(); + kieSession.insert(policyDto); + kieSession.insert(invalidPolicy); + kieSession.fireAllRules(); + kieSession.dispose(); + } + + protected void validateClaim(ClaimDto claimDto){ + this.validateClaim(claimDto,null); + } + + protected void validateClaim(ClaimDto claimDto, PolicyDto policyDto){ + this.validateClaim(claimDto, policyDto, null); + } + + protected void validateClaim(ClaimDto claimDto, PolicyDto policyDto, String agendaGroup){ + KieSession kieSession = kieContainer.newKieSession(); + kieSession.insert(claimDto); + if(null != policyDto){ + kieSession.insert(policyDto); + } + + if(null != agendaGroup){ + kieSession.getAgenda().getAgendaGroup(agendaGroup).setFocus(); + } + + kieSession.fireAllRules(); + kieSession.dispose(); + } } diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/ClaimValidation.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/ClaimValidation.java new file mode 100644 index 0000000..c4fb9f0 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/ClaimValidation.java @@ -0,0 +1,13 @@ +package africa.skunkworks.training.drools.insurance.rule; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; + +public interface ClaimValidation { + + void validateClaim(ClaimDto claimDto); + + void validateClaim(ClaimDto claimDto, PolicyDto policyDto); + + void validateClaim(ClaimDto claimDto, PolicyDto policyDto, String agendaGroup); +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/PolicyValidation.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/PolicyValidation.java new file mode 100644 index 0000000..e8a0262 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/PolicyValidation.java @@ -0,0 +1,9 @@ +package africa.skunkworks.training.drools.insurance.rule; + +import africa.skunkworks.training.drools.insurance.domain.dto.InvalidPolicy; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; + +public interface PolicyValidation { + + void validatePolicy(PolicyDto policyDto, InvalidPolicy invalidPolicy); +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/ValidateApplication.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/ValidateApplication.java index 1739772..15005de 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/ValidateApplication.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/ValidateApplication.java @@ -1,9 +1,12 @@ package africa.skunkworks.training.drools.insurance.rule; import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.dto.ClientIdentificationDto; import africa.skunkworks.training.drools.insurance.domain.response.ApplicationResponse; public interface ValidateApplication { ApplicationResponse validateApplication(ApplicationDto applicationDto); + + ApplicationResponse validateApplication(ApplicationDto applicationDto, ClientIdentificationDto clientIdentificationDto); } diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/application/ApplicationValidationRule.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/application/ApplicationValidationRule.java new file mode 100644 index 0000000..b34e660 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/application/ApplicationValidationRule.java @@ -0,0 +1,8 @@ +package africa.skunkworks.training.drools.insurance.rule.application; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; + +public interface ApplicationValidationRule { + + void validateApplication(ApplicationDto applicationDto, String agendaGroup); +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/application/impl/ApplicationValidationRuleImpl.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/application/impl/ApplicationValidationRuleImpl.java new file mode 100644 index 0000000..18b7bdf --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/application/impl/ApplicationValidationRuleImpl.java @@ -0,0 +1,29 @@ +package africa.skunkworks.training.drools.insurance.rule.application.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.rule.application.ApplicationValidationRule; +import org.kie.api.runtime.KieContainer; +import org.kie.api.runtime.KieSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component +public class ApplicationValidationRuleImpl implements ApplicationValidationRule { + + private final KieContainer kieContainer; + + @Autowired + public ApplicationValidationRuleImpl(@Qualifier("applicationKieContainer") KieContainer kieContainer) { + this.kieContainer = kieContainer; + } + + @Override + public void validateApplication(ApplicationDto applicationDto, String agendaGroup) { + KieSession kieSession = kieContainer.newKieSession(); + kieSession.insert(applicationDto); + kieSession.getAgenda().getAgendaGroup(agendaGroup).setFocus(); + kieSession.fireAllRules(); + kieSession.dispose(); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/claim/ClaimValidationRule.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/claim/ClaimValidationRule.java new file mode 100644 index 0000000..bf4ec19 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/claim/ClaimValidationRule.java @@ -0,0 +1,8 @@ +package africa.skunkworks.training.drools.insurance.rule.claim; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; + +public interface ClaimValidationRule { + + void validateClaim(ClaimDto claimDto, String agendaGroup); +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/claim/impl/ClaimValidationRuleImpl.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/claim/impl/ClaimValidationRuleImpl.java new file mode 100644 index 0000000..a0bd13f --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/claim/impl/ClaimValidationRuleImpl.java @@ -0,0 +1,30 @@ +package africa.skunkworks.training.drools.insurance.rule.claim.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.rule.claim.ClaimValidationRule; +import org.kie.api.runtime.KieContainer; +import org.kie.api.runtime.KieSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component +public class ClaimValidationRuleImpl implements ClaimValidationRule { + + private final KieContainer kieContainer; + + @Autowired + public ClaimValidationRuleImpl(@Qualifier("claimKieContainer") KieContainer kieContainer) { + this.kieContainer = kieContainer; + } + + @Override + public void validateClaim(ClaimDto claimDto, String agendaGroup) { + KieSession kieSession = kieContainer.newKieSession(); + kieSession.insert(claimDto); + kieSession.getAgenda().getAgendaGroup(agendaGroup).setFocus(); + kieSession.fireAllRules(); + kieSession.dispose(); + + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/config/RuleConfig.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/config/RuleConfig.java index ad7a1a6..cfb8a51 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/config/RuleConfig.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/config/RuleConfig.java @@ -6,6 +6,6 @@ @Configuration @ComponentScan({"africa.skunkworks.training.drools.insurance.rule"}) -@Import({RuleConfigLesson01.class, RuleConfigLesson02.class}) +@Import({RuleConfigLesson01.class, RuleConfigLesson02.class, RuleConfigLesson03.class, RuleConfigLesson04.class, RuleConfigApplication.class}) public class RuleConfig { } diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/config/RuleConfigApplication.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/config/RuleConfigApplication.java new file mode 100644 index 0000000..7f72bd1 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/config/RuleConfigApplication.java @@ -0,0 +1,33 @@ +package africa.skunkworks.training.drools.insurance.rule.config; + +import org.kie.api.KieServices; +import org.kie.api.builder.KieBuilder; +import org.kie.api.builder.KieFileSystem; +import org.kie.api.builder.KieModule; +import org.kie.api.runtime.KieContainer; +import org.kie.internal.io.ResourceFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RuleConfigApplication { + + private static final String DROOL_FILE = "africa/skunkworks/training/drools/insurance/application/application_validation.drl"; + + @Bean("applicationKieContainer") + public KieContainer getKieContainer(){ + + + KieServices kieServices = KieServices.Factory.get(); + + KieFileSystem kieFileSystem = kieServices.newKieFileSystem(); + kieFileSystem.write(ResourceFactory.newClassPathResource(DROOL_FILE)); + KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem); + kieBuilder.buildAll(); + KieModule kieModule = kieBuilder.getKieModule(); + + return kieServices.newKieContainer(kieModule.getReleaseId()); + + } + +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/config/RuleConfigClaim.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/config/RuleConfigClaim.java new file mode 100644 index 0000000..5c8963a --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/config/RuleConfigClaim.java @@ -0,0 +1,32 @@ +package africa.skunkworks.training.drools.insurance.rule.config; + +import org.kie.api.KieServices; +import org.kie.api.builder.KieBuilder; +import org.kie.api.builder.KieFileSystem; +import org.kie.api.builder.KieModule; +import org.kie.api.runtime.KieContainer; +import org.kie.internal.io.ResourceFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RuleConfigClaim { + + private static final String DROOL_FILE = "africa/skunkworks/training/drools/insurance/claim/claim_validation.drl"; + + @Bean("claimKieContainer") + public KieContainer getKieContainer(){ + + + KieServices kieServices = KieServices.Factory.get(); + + KieFileSystem kieFileSystem = kieServices.newKieFileSystem(); + kieFileSystem.write(ResourceFactory.newClassPathResource(DROOL_FILE)); + KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem); + kieBuilder.buildAll(); + KieModule kieModule = kieBuilder.getKieModule(); + + return kieServices.newKieContainer(kieModule.getReleaseId()); + + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/config/RuleConfigLesson03.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/config/RuleConfigLesson03.java new file mode 100644 index 0000000..d53557d --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/config/RuleConfigLesson03.java @@ -0,0 +1,48 @@ +package africa.skunkworks.training.drools.insurance.rule.config; + +import org.kie.api.runtime.KieContainer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RuleConfigLesson03 extends AbstractRuleConfig{ + + private static final String DROOL_FILE_DEMO_01 = "africa/skunkworks/training/drools/insurance/lesson03/demo01/claim_validation_demo_01.drl"; + + private static final String DROOL_FILE_DEMO_02 = "africa/skunkworks/training/drools/insurance/lesson03/demo02/application_client_identification_validation_demo_02.drl"; + + private static final String DROOL_FILE_DEMO_02_2 = "africa/skunkworks/training/drools/insurance/lesson03/demo02/validate_application_demo_02_2.drl"; + + private static final String DROOL_FILE_DEMO_03 = "africa/skunkworks/training/drools/insurance/lesson03/demo03/application_client_identification_validation_demo_03.drl"; + + private static final String DROOL_FILE_DEMO_03_2 = "africa/skunkworks/training/drools/insurance/lesson03/demo03/validate_application_demo_03_2.drl"; + + @Bean("kieContainerLesson03demo01") + public KieContainer kieContainerDemo01(){ + return getKieContainer(DROOL_FILE_DEMO_01); + } + + @Bean("kieContainerLesson03demo02") + public KieContainer kieContainerDemo02(){ + return getKieContainer(DROOL_FILE_DEMO_02); + } + + @Bean("kieContainerLesson03demo0202") + public KieContainer kieContainerDemo0202(){ + return getKieContainer(DROOL_FILE_DEMO_02_2); + } + + @Bean("kieContainerLesson03demo03") + public KieContainer kieContainerDemo03(){ + return getKieContainer(DROOL_FILE_DEMO_03); + } + + @Bean("kieContainerLesson03demo0302") + public KieContainer kieContainerDemo0302(){ + return getKieContainer(DROOL_FILE_DEMO_03_2); + } + + + + +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/config/RuleConfigLesson04.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/config/RuleConfigLesson04.java new file mode 100644 index 0000000..ffa9660 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/config/RuleConfigLesson04.java @@ -0,0 +1,73 @@ +package africa.skunkworks.training.drools.insurance.rule.config; + +import org.kie.api.runtime.KieContainer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RuleConfigLesson04 extends AbstractRuleConfig{ + + private static final String DROOL_FILE_DEMO_01 = "africa/skunkworks/training/drools/insurance/lesson04/demo01/claim_validation_demo_01.drl"; + + private static final String DROOL_FILE_DEMO_02 = "africa/skunkworks/training/drools/insurance/lesson04/demo02/claim_validation_demo_02.drl"; + + private static final String DROOL_FILE_DEMO_02_2 = "africa/skunkworks/training/drools/insurance/lesson04/demo02/payout_issue_demo_02.drl"; + + private static final String DROOL_FILE_DEMO_03 = "africa/skunkworks/training/drools/insurance/lesson04/demo03/claim_validation_demo_03.drl"; + + private static final String DROOL_FILE_DEMO_03_2 = "africa/skunkworks/training/drools/insurance/lesson04/demo03/payout_issue_demo_03.drl"; + + private static final String DROOL_FILE_DEMO_04 = "africa/skunkworks/training/drools/insurance/lesson04/demo04/claim_validation_demo_04.drl"; + + private static final String DROOL_FILE_DEMO_04_2 = "africa/skunkworks/training/drools/insurance/lesson04/demo04/payout_issue_demo_04.drl"; + + private static final String DROOL_FILE_DEMO_05 = "africa/skunkworks/training/drools/insurance/lesson04/demo05/claim_validation_demo_05.drl"; + + private static final String DROOL_FILE_DEMO_05_2 = "africa/skunkworks/training/drools/insurance/lesson04/demo05/payout_issue_demo_05.drl"; + + @Bean("kieContainerLesson04demo01") + public KieContainer kieContainerDemo01(){ + return getKieContainer(DROOL_FILE_DEMO_01); + } + + @Bean("kieContainerLesson04demo02") + public KieContainer kieContainerDemo02(){ + return getKieContainer(DROOL_FILE_DEMO_02); + } + + @Bean("kieContainerLesson04demo0202") + public KieContainer kieContainerDemo0202(){ + return getKieContainer(DROOL_FILE_DEMO_02_2); + } + + @Bean("kieContainerLesson04demo03") + public KieContainer kieContainerDemo03(){ + return getKieContainer(DROOL_FILE_DEMO_03); + } + + @Bean("kieContainerLesson04demo0302") + public KieContainer kieContainerDemo0302(){ + return getKieContainer(DROOL_FILE_DEMO_03_2); + } + + @Bean("kieContainerLesson04demo04") + public KieContainer kieContainerDemo04(){ + return getKieContainer(DROOL_FILE_DEMO_04); + } + + @Bean("kieContainerLesson04demo0402") + public KieContainer kieContainerDemo0402(){ + return getKieContainer(DROOL_FILE_DEMO_04_2); + } + + @Bean("kieContainerLesson04demo05") + public KieContainer kieContainerDemo05(){ + return getKieContainer(DROOL_FILE_DEMO_05); + } + + @Bean("kieContainerLesson04demo0502") + public KieContainer kieContainerDemo0502(){ + return getKieContainer(DROOL_FILE_DEMO_05_2); + } + +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/config/RuleConfigLesson05.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/config/RuleConfigLesson05.java new file mode 100644 index 0000000..2ac30f5 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/config/RuleConfigLesson05.java @@ -0,0 +1,53 @@ +package africa.skunkworks.training.drools.insurance.rule.config; + +import org.kie.api.runtime.KieContainer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RuleConfigLesson05 extends AbstractRuleConfig { + + private static final String DROOL_FILE_DEMO_01 = "africa/skunkworks/training/drools/insurance/lesson05/demo01/claim_validation_demo_01.drl"; + + private static final String DROOL_FILE_DEMO_02 = "africa/skunkworks/training/drools/insurance/lesson05/demo02/claim_validation_demo_02.drl"; + + private static final String DROOL_FILE_DEMO_02_2 = "africa/skunkworks/training/drools/insurance/lesson05/demo02/payout_issue_demo_02.drl"; + + private static final String DROOL_FILE_DEMO_03 = "africa/skunkworks/training/drools/insurance/lesson05/demo03/claim_validation_demo_03.drl"; + + private static final String DROOL_FILE_DEMO_03_2 = "africa/skunkworks/training/drools/insurance/lesson05/demo03/payout_issue_demo_03.drl"; + + private static final String DROOL_FILE_DEMO_03_3 = "africa/skunkworks/training/drools/insurance/lesson05/demo03/policy_validation_demo_03.drl"; + + private static final String DROOL_FILE_DEMO_04 = "africa/skunkworks/training/drools/insurance/lesson05/demo04/claim_validation_demo_04.drl"; + + private static final String DROOL_FILE_DEMO_04_2 = "africa/skunkworks/training/drools/insurance/lesson05/demo04/payout_issue_demo_04.drl"; + + private static final String DROOL_FILE_DEMO_04_3 = "africa/skunkworks/training/drools/insurance/lesson05/demo04/policy_validation_demo_04.drl"; + + @Bean("kieContainerLesson05demo01") + public KieContainer kieContainerDemo01(){return getKieContainer(DROOL_FILE_DEMO_01);} + @Bean("kieContainerLesson05demo02") + public KieContainer kieContainerDemo02(){return getKieContainer(DROOL_FILE_DEMO_02);} + @Bean("kieContainerLesson05demo0202") + public KieContainer kieContainerDemo0102(){return getKieContainer(DROOL_FILE_DEMO_02_2);} + + @Bean("kieContainerLesson05demo03") + public KieContainer kieContainerDemo03(){return getKieContainer(DROOL_FILE_DEMO_03);} + + @Bean("kieContainerLesson05demo0302") + public KieContainer kieContainerDemo0302(){return getKieContainer(DROOL_FILE_DEMO_03_2);} + + @Bean("kieContainerLesson05demo0303") + public KieContainer kieContainerDemo0303(){return getKieContainer(DROOL_FILE_DEMO_03_3);} + + @Bean("kieContainerLesson05demo04") + public KieContainer kieContainerDemo04(){return getKieContainer(DROOL_FILE_DEMO_04);} + + @Bean("kieContainerLesson05demo0401") + public KieContainer kieContainerDemo0402(){return getKieContainer(DROOL_FILE_DEMO_04_2);} + + @Bean("kieContainerLesson05demo0402") + public KieContainer kieContainerDemo0403(){return getKieContainer(DROOL_FILE_DEMO_04_3);} + +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/config/RuleConfigPolicy.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/config/RuleConfigPolicy.java new file mode 100644 index 0000000..a0f75b3 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/config/RuleConfigPolicy.java @@ -0,0 +1,32 @@ +package africa.skunkworks.training.drools.insurance.rule.config; + +import org.kie.api.KieServices; +import org.kie.api.builder.KieBuilder; +import org.kie.api.builder.KieFileSystem; +import org.kie.api.builder.KieModule; +import org.kie.api.runtime.KieContainer; +import org.kie.internal.io.ResourceFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RuleConfigPolicy { + + private static final String DROOL_FILE = "africa/skunkworks/training/drools/insurance/policy/policy_validation.drl"; + + @Bean("policyKieContainer") + public KieContainer getKieContainer(){ + + + KieServices kieServices = KieServices.Factory.get(); + + KieFileSystem kieFileSystem = kieServices.newKieFileSystem(); + kieFileSystem.write(ResourceFactory.newClassPathResource(DROOL_FILE)); + KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem); + kieBuilder.buildAll(); + KieModule kieModule = kieBuilder.getKieModule(); + + return kieServices.newKieContainer(kieModule.getReleaseId()); + + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson01/impl/ValidateApplicationLesson01Demo01.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson01/impl/ValidateApplicationLesson01Demo01.java index b98f518..27bf4bd 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson01/impl/ValidateApplicationLesson01Demo01.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson01/impl/ValidateApplicationLesson01Demo01.java @@ -1,6 +1,7 @@ package africa.skunkworks.training.drools.insurance.rule.lesson01.impl; import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.dto.ClientIdentificationDto; import africa.skunkworks.training.drools.insurance.domain.response.ApplicationResponse; import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; import africa.skunkworks.training.drools.insurance.rule.ValidateApplication; @@ -22,4 +23,9 @@ public ValidateApplicationLesson01Demo01(@Qualifier("kieContainerLesson01demo01" public ApplicationResponse validateApplication(ApplicationDto applicationDto) { return super.validateApplication(applicationDto); } + + @Override + public ApplicationResponse validateApplication(ApplicationDto applicationDto, ClientIdentificationDto clientIdentificationDto) { + return null; + } } diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson01/impl/ValidateApplicationLesson01Demo02.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson01/impl/ValidateApplicationLesson01Demo02.java index 8f7afd6..5458821 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson01/impl/ValidateApplicationLesson01Demo02.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson01/impl/ValidateApplicationLesson01Demo02.java @@ -1,6 +1,7 @@ package africa.skunkworks.training.drools.insurance.rule.lesson01.impl; import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.dto.ClientIdentificationDto; import africa.skunkworks.training.drools.insurance.domain.response.ApplicationResponse; import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; import africa.skunkworks.training.drools.insurance.rule.ValidateApplication; @@ -21,4 +22,9 @@ public ValidateApplicationLesson01Demo02(@Qualifier("kieContainerLesson01demo02" public ApplicationResponse validateApplication(ApplicationDto applicationDto) { return super.validateApplication(applicationDto); } + + @Override + public ApplicationResponse validateApplication(ApplicationDto applicationDto, ClientIdentificationDto clientIdentificationDto) { + return null; + } } diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson01/impl/ValidateApplicationLesson01Demo03.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson01/impl/ValidateApplicationLesson01Demo03.java index 2ba863d..0c00d3e 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson01/impl/ValidateApplicationLesson01Demo03.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson01/impl/ValidateApplicationLesson01Demo03.java @@ -1,6 +1,7 @@ package africa.skunkworks.training.drools.insurance.rule.lesson01.impl; import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.dto.ClientIdentificationDto; import africa.skunkworks.training.drools.insurance.domain.response.ApplicationResponse; import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; import africa.skunkworks.training.drools.insurance.rule.ValidateApplication; @@ -20,4 +21,9 @@ public ValidateApplicationLesson01Demo03(@Qualifier("kieContainerLesson01demo03" public ApplicationResponse validateApplication(ApplicationDto applicationDto) { return super.validateApplication(applicationDto); } + + @Override + public ApplicationResponse validateApplication(ApplicationDto applicationDto, ClientIdentificationDto clientIdentificationDto) { + return null; + } } diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson01/impl/ValidateApplicationLesson01Demo04.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson01/impl/ValidateApplicationLesson01Demo04.java index c7d4937..0629197 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson01/impl/ValidateApplicationLesson01Demo04.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson01/impl/ValidateApplicationLesson01Demo04.java @@ -1,6 +1,7 @@ package africa.skunkworks.training.drools.insurance.rule.lesson01.impl; import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.dto.ClientIdentificationDto; import africa.skunkworks.training.drools.insurance.domain.response.ApplicationResponse; import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; import africa.skunkworks.training.drools.insurance.rule.ValidateApplication; @@ -21,4 +22,9 @@ public ValidateApplicationLesson01Demo04(@Qualifier("kieContainerLesson01demo4") public ApplicationResponse validateApplication(ApplicationDto applicationDto) { return super.validateApplication(applicationDto); } + + @Override + public ApplicationResponse validateApplication(ApplicationDto applicationDto, ClientIdentificationDto clientIdentificationDto) { + return null; + } } diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson01/impl/ValidateApplicationLesson01Demo05.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson01/impl/ValidateApplicationLesson01Demo05.java index 4ebb5c2..4a1809f 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson01/impl/ValidateApplicationLesson01Demo05.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson01/impl/ValidateApplicationLesson01Demo05.java @@ -1,6 +1,7 @@ package africa.skunkworks.training.drools.insurance.rule.lesson01.impl; import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.dto.ClientIdentificationDto; import africa.skunkworks.training.drools.insurance.domain.response.ApplicationResponse; import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; import africa.skunkworks.training.drools.insurance.rule.ValidateApplication; @@ -20,4 +21,9 @@ public ValidateApplicationLesson01Demo05(@Qualifier("kieContainerLesson01demo05" public ApplicationResponse validateApplication(ApplicationDto applicationDto) { return super.validateApplication(applicationDto); } + + @Override + public ApplicationResponse validateApplication(ApplicationDto applicationDto, ClientIdentificationDto clientIdentificationDto) { + return null; + } } diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson02/impl/ValidateApplicationLesson02Demo01.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson02/impl/ValidateApplicationLesson02Demo01.java index 58f63a1..9e74213 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson02/impl/ValidateApplicationLesson02Demo01.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson02/impl/ValidateApplicationLesson02Demo01.java @@ -1,6 +1,7 @@ package africa.skunkworks.training.drools.insurance.rule.lesson02.impl; import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.dto.ClientIdentificationDto; import africa.skunkworks.training.drools.insurance.domain.response.ApplicationResponse; import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; import africa.skunkworks.training.drools.insurance.rule.ValidateApplication; @@ -21,4 +22,9 @@ public ValidateApplicationLesson02Demo01(@Qualifier("kieContainerLesson02demo01" public ApplicationResponse validateApplication(ApplicationDto applicationDto) { return super.validateApplication(applicationDto); } + + @Override + public ApplicationResponse validateApplication(ApplicationDto applicationDto, ClientIdentificationDto clientIdentificationDto) { + return null; + } } diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson02/impl/ValidateApplicationLesson02Demo02.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson02/impl/ValidateApplicationLesson02Demo02.java index 0ffaa73..6af7bbf 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson02/impl/ValidateApplicationLesson02Demo02.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson02/impl/ValidateApplicationLesson02Demo02.java @@ -1,6 +1,7 @@ package africa.skunkworks.training.drools.insurance.rule.lesson02.impl; import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.dto.ClientIdentificationDto; import africa.skunkworks.training.drools.insurance.domain.response.ApplicationResponse; import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; import africa.skunkworks.training.drools.insurance.rule.ValidateApplication; @@ -21,4 +22,9 @@ public ValidateApplicationLesson02Demo02(@Qualifier("kieContainerLesson02demo02" public ApplicationResponse validateApplication(ApplicationDto applicationDto) { return super.validateApplication(applicationDto); } + + @Override + public ApplicationResponse validateApplication(ApplicationDto applicationDto, ClientIdentificationDto clientIdentificationDto) { + return null; + } } diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson03/impl/ClaimValidationLesson02Demo01.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson03/impl/ClaimValidationLesson02Demo01.java new file mode 100644 index 0000000..7f4a85a --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson03/impl/ClaimValidationLesson02Demo01.java @@ -0,0 +1,35 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson03.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.kie.api.runtime.KieContainer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component("claimValidationLesson02Demo01") +public class ClaimValidationLesson02Demo01 extends AbstractValidateApplication implements ClaimValidation { + + @Autowired + public ClaimValidationLesson02Demo01(@Qualifier("kieContainerLesson03demo01") KieContainer kieContainer) { + super(kieContainer); + } + + @Override + public void validateClaim(ClaimDto claimDto) { + super.validateClaim(claimDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto) { + super.validateClaim(claimDto,policyDto); + + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto, String agendaGroup) { + super.validateClaim(claimDto,policyDto,agendaGroup); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson03/impl/ValidateApplicationAndClientIdentificationLesson03Demo02.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson03/impl/ValidateApplicationAndClientIdentificationLesson03Demo02.java new file mode 100644 index 0000000..37f9206 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson03/impl/ValidateApplicationAndClientIdentificationLesson03Demo02.java @@ -0,0 +1,30 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson03.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.dto.ClientIdentificationDto; +import africa.skunkworks.training.drools.insurance.domain.response.ApplicationResponse; +import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; +import africa.skunkworks.training.drools.insurance.rule.ValidateApplication; +import org.kie.api.runtime.KieContainer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component("validateApplicationAndClientIdentificationLesson03Demo02") +public class ValidateApplicationAndClientIdentificationLesson03Demo02 extends AbstractValidateApplication implements ValidateApplication { + + @Autowired + public ValidateApplicationAndClientIdentificationLesson03Demo02(@Qualifier("kieContainerLesson03demo02") KieContainer kieContainer) { + super(kieContainer); + } + + @Override + public ApplicationResponse validateApplication(ApplicationDto applicationDto) { + return null; + } + + @Override + public ApplicationResponse validateApplication(ApplicationDto applicationDto, ClientIdentificationDto clientIdentificationDto) { + return super.validateApplication(applicationDto,clientIdentificationDto); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson03/impl/ValidateApplicationAndClientIdentificationLesson03Demo03.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson03/impl/ValidateApplicationAndClientIdentificationLesson03Demo03.java new file mode 100644 index 0000000..5a7a507 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson03/impl/ValidateApplicationAndClientIdentificationLesson03Demo03.java @@ -0,0 +1,29 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson03.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.dto.ClientIdentificationDto; +import africa.skunkworks.training.drools.insurance.domain.response.ApplicationResponse; +import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; +import africa.skunkworks.training.drools.insurance.rule.ValidateApplication; +import org.kie.api.runtime.KieContainer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component("validateApplicationAndClientIdentificationLesson03Demo03") +public class ValidateApplicationAndClientIdentificationLesson03Demo03 extends AbstractValidateApplication implements ValidateApplication { + @Autowired + public ValidateApplicationAndClientIdentificationLesson03Demo03(@Qualifier("kieContainerLesson03demo03") KieContainer kieContainer) { + super(kieContainer); + } + + @Override + public ApplicationResponse validateApplication(ApplicationDto applicationDto) { + return null; + } + + @Override + public ApplicationResponse validateApplication(ApplicationDto applicationDto, ClientIdentificationDto clientIdentificationDto) { + return super.validateApplication(applicationDto,clientIdentificationDto); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson03/impl/ValidateApplicationLesson3Demo0202.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson03/impl/ValidateApplicationLesson3Demo0202.java new file mode 100644 index 0000000..e25cf0c --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson03/impl/ValidateApplicationLesson3Demo0202.java @@ -0,0 +1,30 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson03.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.dto.ClientIdentificationDto; +import africa.skunkworks.training.drools.insurance.domain.response.ApplicationResponse; +import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; +import africa.skunkworks.training.drools.insurance.rule.ValidateApplication; +import org.kie.api.runtime.KieContainer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component("validateApplicationLesson3Demo0202") +public class ValidateApplicationLesson3Demo0202 extends AbstractValidateApplication implements ValidateApplication { + + @Autowired + public ValidateApplicationLesson3Demo0202(@Qualifier("kieContainerLesson03demo0202") KieContainer kieContainer) { + super(kieContainer); + } + + @Override + public ApplicationResponse validateApplication(ApplicationDto applicationDto) { + return super.validateApplication(applicationDto); + } + + @Override + public ApplicationResponse validateApplication(ApplicationDto applicationDto, ClientIdentificationDto clientIdentificationDto) { + return null; + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson03/impl/ValidateApplicationLesson3Demo0302.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson03/impl/ValidateApplicationLesson3Demo0302.java new file mode 100644 index 0000000..29e4cfd --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson03/impl/ValidateApplicationLesson3Demo0302.java @@ -0,0 +1,29 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson03.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.dto.ClientIdentificationDto; +import africa.skunkworks.training.drools.insurance.domain.response.ApplicationResponse; +import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; +import africa.skunkworks.training.drools.insurance.rule.ValidateApplication; +import org.kie.api.runtime.KieContainer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component("validateApplicationLesson3Demo0302") +public class ValidateApplicationLesson3Demo0302 extends AbstractValidateApplication implements ValidateApplication { + @Autowired + public ValidateApplicationLesson3Demo0302(@Qualifier("kieContainerLesson03demo0302") KieContainer kieContainer) { + super(kieContainer); + } + + @Override + public ApplicationResponse validateApplication(ApplicationDto applicationDto) { + return super.validateApplication(applicationDto); + } + + @Override + public ApplicationResponse validateApplication(ApplicationDto applicationDto, ClientIdentificationDto clientIdentificationDto) { + return null; + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/ClaimValidationLesson04Demo01.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/ClaimValidationLesson04Demo01.java new file mode 100644 index 0000000..ab86600 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/ClaimValidationLesson04Demo01.java @@ -0,0 +1,35 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson04.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.kie.api.runtime.KieContainer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component("claimValidationLesson04Demo01") +public class ClaimValidationLesson04Demo01 extends AbstractValidateApplication implements ClaimValidation { + + @Autowired + public ClaimValidationLesson04Demo01(@Qualifier("kieContainerLesson04demo01") KieContainer kieContainer) { + super(kieContainer); + } + + @Override + public void validateClaim(ClaimDto claimDto) { + super.validateClaim(claimDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto) { + super.validateClaim(claimDto, policyDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto, String agendaGroup) { + super.validateClaim(claimDto,policyDto,agendaGroup); + + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/ClaimValidationLesson04Demo02.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/ClaimValidationLesson04Demo02.java new file mode 100644 index 0000000..b6a5d9f --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/ClaimValidationLesson04Demo02.java @@ -0,0 +1,34 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson04.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.kie.api.runtime.KieContainer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component("claimValidationLesson04Demo02") +public class ClaimValidationLesson04Demo02 extends AbstractValidateApplication implements ClaimValidation { + + @Autowired + public ClaimValidationLesson04Demo02(@Qualifier("kieContainerLesson04demo02") KieContainer kieContainer) { + super(kieContainer); + } + + @Override + public void validateClaim(ClaimDto claimDto) { + super.validateClaim(claimDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto) { + super.validateClaim(claimDto, policyDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto, String agendaGroup) { + super.validateClaim(claimDto,policyDto,agendaGroup); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/ClaimValidationLesson04Demo03.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/ClaimValidationLesson04Demo03.java new file mode 100644 index 0000000..0638ebe --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/ClaimValidationLesson04Demo03.java @@ -0,0 +1,35 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson04.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.kie.api.runtime.KieContainer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component("claimValidationLesson04Demo03") +public class ClaimValidationLesson04Demo03 extends AbstractValidateApplication implements ClaimValidation { + + @Autowired + public ClaimValidationLesson04Demo03(@Qualifier("kieContainerLesson04demo03") KieContainer kieContainer) { + super(kieContainer); + } + + @Override + public void validateClaim(ClaimDto claimDto) { + super.validateClaim(claimDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto) { + super.validateClaim(claimDto, policyDto); + + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto, String agendaGroup) { + super.validateClaim(claimDto, policyDto, agendaGroup); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/ClaimValidationLesson04Demo04.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/ClaimValidationLesson04Demo04.java new file mode 100644 index 0000000..4b00f13 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/ClaimValidationLesson04Demo04.java @@ -0,0 +1,35 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson04.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.kie.api.runtime.KieContainer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component("claimValidationLesson04Demo04") +public class ClaimValidationLesson04Demo04 extends AbstractValidateApplication implements ClaimValidation { + + @Autowired + public ClaimValidationLesson04Demo04(@Qualifier("kieContainerLesson04demo04") KieContainer kieContainer) { + super(kieContainer); + } + + @Override + public void validateClaim(ClaimDto claimDto) { + super.validateClaim(claimDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto) { + super.validateClaim(claimDto, policyDto); + + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto, String agendaGroup) { + super.validateClaim(claimDto, policyDto, agendaGroup); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/ClaimValidationLesson04Demo05.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/ClaimValidationLesson04Demo05.java new file mode 100644 index 0000000..a3c7d26 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/ClaimValidationLesson04Demo05.java @@ -0,0 +1,36 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson04.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.kie.api.runtime.KieContainer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component("claimValidationLesson04Demo05") +public class ClaimValidationLesson04Demo05 extends AbstractValidateApplication implements ClaimValidation { + + + @Autowired + public ClaimValidationLesson04Demo05(@Qualifier("kieContainerLesson04demo05") KieContainer kieContainer) { + super(kieContainer); + } + + @Override + public void validateClaim(ClaimDto claimDto) { + super.validateClaim(claimDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto) { + super.validateClaim(claimDto, policyDto); + + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto, String agendaGroup) { + super.validateClaim(claimDto, policyDto, agendaGroup); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/PayoutLesson4Demo0202.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/PayoutLesson4Demo0202.java new file mode 100644 index 0000000..2c557ee --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/PayoutLesson4Demo0202.java @@ -0,0 +1,33 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson04.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.kie.api.runtime.KieContainer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component("payoutLesson4Demo0202") +public class PayoutLesson4Demo0202 extends AbstractValidateApplication implements ClaimValidation { + @Autowired + public PayoutLesson4Demo0202(@Qualifier("kieContainerLesson04demo0202") KieContainer kieContainer) { + super(kieContainer); + } + + @Override + public void validateClaim(ClaimDto claimDto) { + super.validateClaim(claimDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto) { + super.validateClaim(claimDto,policyDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto, String agendaGroup) { + super.validateClaim(claimDto,policyDto,agendaGroup); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/PayoutLesson4Demo0302.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/PayoutLesson4Demo0302.java new file mode 100644 index 0000000..95008ae --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/PayoutLesson4Demo0302.java @@ -0,0 +1,34 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson04.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.kie.api.runtime.KieContainer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component("payoutLesson4Demo0302") +public class PayoutLesson4Demo0302 extends AbstractValidateApplication implements ClaimValidation { + @Autowired + public PayoutLesson4Demo0302(@Qualifier("kieContainerLesson04demo0302") KieContainer kieContainer) { + super(kieContainer); + } + + @Override + public void validateClaim(ClaimDto claimDto) { + super.validateClaim(claimDto); + + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto) { + super.validateClaim(claimDto,policyDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto, String agendaGroup) { + super.validateClaim(claimDto,policyDto,agendaGroup); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/PayoutLesson4Demo0402.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/PayoutLesson4Demo0402.java new file mode 100644 index 0000000..e928a16 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/PayoutLesson4Demo0402.java @@ -0,0 +1,34 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson04.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.kie.api.runtime.KieContainer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component("payoutLesson4Demo0402") +public class PayoutLesson4Demo0402 extends AbstractValidateApplication implements ClaimValidation { + @Autowired + public PayoutLesson4Demo0402(@Qualifier("kieContainerLesson04demo0402") KieContainer kieContainer) { + super(kieContainer); + } + + @Override + public void validateClaim(ClaimDto claimDto) { + super.validateClaim(claimDto); + + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto) { + super.validateClaim(claimDto,policyDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto, String agendaGroup) { + super.validateClaim(claimDto,policyDto,agendaGroup); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/PayoutLesson4Demo0502.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/PayoutLesson4Demo0502.java new file mode 100644 index 0000000..dd65589 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson04/impl/PayoutLesson4Demo0502.java @@ -0,0 +1,36 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson04.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.kie.api.runtime.KieContainer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component("payoutLesson4Demo0502") +public class PayoutLesson4Demo0502 extends AbstractValidateApplication implements ClaimValidation { + + + @Autowired + public PayoutLesson4Demo0502(@Qualifier("kieContainerLesson04demo0502") KieContainer kieContainer) { + super(kieContainer); + } + + @Override + public void validateClaim(ClaimDto claimDto) { + super.validateClaim(claimDto); + + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto) { + super.validateClaim(claimDto,policyDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto, String agendaGroup) { + super.validateClaim(claimDto,policyDto,agendaGroup); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson05/impl/ClaimValidationLesson05Demo01.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson05/impl/ClaimValidationLesson05Demo01.java new file mode 100644 index 0000000..c0924a4 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson05/impl/ClaimValidationLesson05Demo01.java @@ -0,0 +1,35 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson05.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.kie.api.runtime.KieContainer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component("claimValidationLesson05Demo01") +public class ClaimValidationLesson05Demo01 extends AbstractValidateApplication implements ClaimValidation { + + @Autowired + public ClaimValidationLesson05Demo01(@Qualifier("kieContainerLesson05demo01") KieContainer kieContainer) { + super(kieContainer); + } + + @Override + public void validateClaim(ClaimDto claimDto) { + super.validateClaim(claimDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto) { + super.validateClaim(claimDto, policyDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto, String agendaGroup) { + super.validateClaim(claimDto,policyDto,agendaGroup); + + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson05/impl/ClaimValidationLesson05Demo02.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson05/impl/ClaimValidationLesson05Demo02.java new file mode 100644 index 0000000..b395412 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson05/impl/ClaimValidationLesson05Demo02.java @@ -0,0 +1,32 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson05.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.kie.api.runtime.KieContainer; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component("claimValidationLesson05Demo02") +public class ClaimValidationLesson05Demo02 extends AbstractValidateApplication implements ClaimValidation { + public ClaimValidationLesson05Demo02(@Qualifier("kieContainerLesson05demo02") KieContainer kieContainer) { + super(kieContainer); + } + + @Override + public void validateClaim(ClaimDto claimDto) { + super.validateClaim(claimDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto) { + super.validateClaim(claimDto, policyDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto, String agendaGroup) { + super.validateClaim(claimDto,policyDto,agendaGroup); + + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson05/impl/ClaimValidationLesson05Demo03.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson05/impl/ClaimValidationLesson05Demo03.java new file mode 100644 index 0000000..51781dc --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson05/impl/ClaimValidationLesson05Demo03.java @@ -0,0 +1,35 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson05.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.kie.api.runtime.KieContainer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component("claimValidationLesson05Demo03") +public class ClaimValidationLesson05Demo03 extends AbstractValidateApplication implements ClaimValidation { + + @Autowired + public ClaimValidationLesson05Demo03(@Qualifier("kieContainerLesson05demo03") KieContainer kieContainer) { + super(kieContainer); + } + + @Override + public void validateClaim(ClaimDto claimDto) { + super.validateClaim(claimDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto) { + super.validateClaim(claimDto, policyDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto, String agendaGroup) { + super.validateClaim(claimDto,policyDto,agendaGroup); + + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson05/impl/ClaimValidationLesson05Demo04.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson05/impl/ClaimValidationLesson05Demo04.java new file mode 100644 index 0000000..bf7cc34 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson05/impl/ClaimValidationLesson05Demo04.java @@ -0,0 +1,35 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson05.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.kie.api.runtime.KieContainer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component("claimValidationLesson05Demo04") +public class ClaimValidationLesson05Demo04 extends AbstractValidateApplication implements ClaimValidation { + + @Autowired + public ClaimValidationLesson05Demo04(@Qualifier("kieContainerLesson05demo04") KieContainer kieContainer) { + super(kieContainer); + } + + @Override + public void validateClaim(ClaimDto claimDto) { + super.validateClaim(claimDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto) { + super.validateClaim(claimDto, policyDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto, String agendaGroup) { + super.validateClaim(claimDto,policyDto,agendaGroup); + + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson05/impl/PayoutLesson5Demo0202.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson05/impl/PayoutLesson5Demo0202.java new file mode 100644 index 0000000..ebb79c9 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson05/impl/PayoutLesson5Demo0202.java @@ -0,0 +1,33 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson05.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.kie.api.runtime.KieContainer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component("payoutLesson5Demo0202") +public class PayoutLesson5Demo0202 extends AbstractValidateApplication implements ClaimValidation { + @Autowired + public PayoutLesson5Demo0202(@Qualifier("kieContainerLesson05demo0202") KieContainer kieContainer) { + super(kieContainer); + } + + @Override + public void validateClaim(ClaimDto claimDto) { + super.validateClaim(claimDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto) { + super.validateClaim(claimDto,policyDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto, String agendaGroup) { + super.validateClaim(claimDto,policyDto,agendaGroup); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson05/impl/PayoutLesson5Demo0302.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson05/impl/PayoutLesson5Demo0302.java new file mode 100644 index 0000000..63fdd7f --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson05/impl/PayoutLesson5Demo0302.java @@ -0,0 +1,34 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson05.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.kie.api.runtime.KieContainer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component("payoutLesson5Demo0302") +public class PayoutLesson5Demo0302 extends AbstractValidateApplication implements ClaimValidation { + + @Autowired + public PayoutLesson5Demo0302(@Qualifier("kieContainerLesson05demo0202") KieContainer kieContainer) { + super(kieContainer); + } + + @Override + public void validateClaim(ClaimDto claimDto) { + super.validateClaim(claimDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto) { + super.validateClaim(claimDto,policyDto); + } + + @Override + public void validateClaim(ClaimDto claimDto, PolicyDto policyDto, String agendaGroup) { + super.validateClaim(claimDto,policyDto,agendaGroup); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson05/impl/PolicyValidationLesson5Demo0303.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson05/impl/PolicyValidationLesson5Demo0303.java new file mode 100644 index 0000000..17c5102 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/lesson05/impl/PolicyValidationLesson5Demo0303.java @@ -0,0 +1,25 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson05.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.InvalidPolicy; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.rule.AbstractValidateApplication; +import africa.skunkworks.training.drools.insurance.rule.PolicyValidation; +import org.kie.api.runtime.KieContainer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component("policyValidationLesson5Demo0303") +public class PolicyValidationLesson5Demo0303 extends AbstractValidateApplication implements PolicyValidation { + + @Autowired + public PolicyValidationLesson5Demo0303(@Qualifier("kieContainerLesson05demo0303") KieContainer kieContainer) { + super(kieContainer); + } + + @Override + public void validatePolicy(PolicyDto policyDto, InvalidPolicy invalidPolicy) { + super.validatePolicy(policyDto, invalidPolicy); + + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/policy/PolicyValidationRule.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/policy/PolicyValidationRule.java new file mode 100644 index 0000000..c017b03 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/policy/PolicyValidationRule.java @@ -0,0 +1,8 @@ +package africa.skunkworks.training.drools.insurance.rule.policy; + +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; + +public interface PolicyValidationRule { + + void validatePolicy(PolicyDto policyDto); +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/policy/impl/PolicyValidationRuleImpl.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/policy/impl/PolicyValidationRuleImpl.java new file mode 100644 index 0000000..e7fb74b --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/java/africa/skunkworks/training/drools/insurance/rule/policy/impl/PolicyValidationRuleImpl.java @@ -0,0 +1,29 @@ +package africa.skunkworks.training.drools.insurance.rule.policy.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.rule.policy.PolicyValidationRule; +import org.kie.api.runtime.KieContainer; +import org.kie.api.runtime.KieSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component +public class PolicyValidationRuleImpl implements PolicyValidationRule { + + private final KieContainer kieContainer; + + @Autowired + public PolicyValidationRuleImpl(@Qualifier("policyKieContainer") KieContainer kieContainer) { + this.kieContainer = kieContainer; + } + + @Override + public void validatePolicy(PolicyDto policyDto) { + KieSession kieSession = kieContainer.newKieSession(); + kieSession.insert(policyDto); + kieSession.fireAllRules(); + kieSession.dispose(); + + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/application/application_validation.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/application/application_validation.drl new file mode 100644 index 0000000..5991aed --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/application/application_validation.drl @@ -0,0 +1,53 @@ +package africa.skunkworks.training.drools.insurance.application; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; + +global africa.skunkworks.training.drools.insurance.domain.response.ApplicationResponse applicationResponse; + +dialect "java" + +rule "Invalidate application if not employed" + agenda-group "not-employed" + when + $application: ApplicationDto( !isEmployed ) + then + modify($application) { + setStatus(Status.DENIED), + setReason( $application.getApplicationNumber() + ": Invalid – Unemployed") + } +end + +rule "Invalidate application from minor" + agenda-group "application-minor" + when + $application: ApplicationDto( clientAge < 18 ) + + then + modify($application) { + setStatus(Status.DENIED), + setReason( $application.getApplicationNumber() + ": Invalid – Minor") + } +end + +rule "Invalid application – has pre-existing conditions" + agenda-group "application-pec" + when + $application: ApplicationDto( pec ) + then + modify($application) { + setStatus(Status.DENIED), + setReason( $application.getApplicationNumber() + ": Invalid – Client has PEC") + } +end + +rule "Valid Application" + agenda-group "valid-application" + when + $application: ApplicationDto( status == Status.PENDING ) + then + modify($application) { + setReason($application.getApplicationNumber() + ": Approval Granted!"), + setStatus(Status.APPROVED) + } +end diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/claim/claim_validation.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/claim/claim_validation.drl new file mode 100644 index 0000000..a68dd2a --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/claim/claim_validation.drl @@ -0,0 +1,30 @@ +package africa.skunkworks.training.drools.insurance.claim; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status +import africa.skunkworks.training.drools.insurance.domain.dto.Payout; + +dialect "java" + +rule "Valid Claims" + agenda-group "valid-claim" + when + $claim: ClaimDto( status == Status.PENDING ) + then + modify($claim) { + setReason($claim + ": not invalidated. Approval Granted"), + setStatus(Status.APPROVED) + } +end + +rule "Issue Payout" + agenda-group "issue-payout" + when + $claim: ClaimDto(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + insert( payout ); + modify($claim){ + setReason("New Payout: " + payout + " Issued") + } +end diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson02/demo01/application_validation_demo_01.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson02/demo01/application_validation_demo_01.drl index cc59969..130001a 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson02/demo01/application_validation_demo_01.drl +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson02/demo01/application_validation_demo_01.drl @@ -1,4 +1,4 @@ -package africa.skunkworks.training.drools.insurance.lesson01.demo01; +package africa.skunkworks.training.drools.insurance.lesson02.demo01; import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; import africa.skunkworks.training.drools.insurance.domain.enums.Status; diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson02/demo02/application_validation_demo_02.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson02/demo02/application_validation_demo_02.drl index 76987cf..17d84fb 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson02/demo02/application_validation_demo_02.drl +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson02/demo02/application_validation_demo_02.drl @@ -1,4 +1,4 @@ -package africa.skunkworks.training.drools.insurance.lesson01.demo02; +package africa.skunkworks.training.drools.insurance.lesson02.demo02; import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; import africa.skunkworks.training.drools.insurance.domain.enums.Status; diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson03/demo01/claim_validation_demo_01.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson03/demo01/claim_validation_demo_01.drl new file mode 100644 index 0000000..9b99d82 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson03/demo01/claim_validation_demo_01.drl @@ -0,0 +1,50 @@ +package africa.skunkworks.training.drools.insurance.lesson03.demo01; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; + +dialect "java" + +rule "Invalidate claim without matching policy" + when + $claim: ClaimDto( ) + not PolicyDto( policyNumber == $claim.getPolicyNumber() ) + then + modify($claim) { + setReason($claim + ": failed (no matching policy)"), + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim that exceeds coverage" + when + $claim: ClaimDto( ) + $policy: PolicyDto( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + modify($claim) { + setReason($claim + ": failed. Coverage in policy " + $policy + " insufficient."), + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + when + $claim: ClaimDto( ) + $policy: PolicyDto( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + modify($claim) { + setReason($claim + ": failed. Unpaid premiums in " + $policy), + setStatus(Status.DENIED) + } +end + +rule "Valid Claims" + when + $claim: ClaimDto( status == Status.PENDING ) + then + modify($claim) { + setReason($claim + ": not invalidated. Approval Granted"), + setStatus(Status.APPROVED) + } +end \ No newline at end of file diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson03/demo02/application_client_identification_validation_demo_02.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson03/demo02/application_client_identification_validation_demo_02.drl new file mode 100644 index 0000000..907bd7d --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson03/demo02/application_client_identification_validation_demo_02.drl @@ -0,0 +1,44 @@ +package africa.skunkworks.training.drools.insurance.lesson03.demo02; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.dto.ClientIdentificationDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import java.time.LocalDate; + +global africa.skunkworks.training.drools.insurance.domain.response.ApplicationResponse applicationResponse; + +dialect "java" + +rule "Invalidate applications with missing ID" + when + $application: ApplicationDto( ) + not ClientIdentificationDto( idNumber == $application.getClientIdentificationNumber() ) + then + applicationResponse.setResponse($application + " Invalid – No matching ID found"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate applications with incorrect name" + when + $application: ApplicationDto( ) + $clientID: ClientIdentificationDto( idNumber == $application.getClientIdentificationNumber(), name != $application.clientName ) + then + applicationResponse.setResponse($application + " Invalid – Name [" + $application.getClientName() + "] not matching name on ID [" + $clientID.getName() + "]"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate applications with Expired ID" + when + $application: ApplicationDto( ) + $clientid: ClientIdentificationDto( idNumber == $application.getClientIdentificationNumber(), expiryDate.isBefore(LocalDate.now())) + then + applicationResponse.setResponse($application + " Invalid – " + $clientid + " ID expired"); + modify($application) { + setStatus(Status.DENIED) + } +end + diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson03/demo02/validate_application_demo_02_2.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson03/demo02/validate_application_demo_02_2.drl new file mode 100644 index 0000000..743bb93 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson03/demo02/validate_application_demo_02_2.drl @@ -0,0 +1,56 @@ +package africa.skunkworks.training.drools.insurance.lesson03.demo02; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; + +global africa.skunkworks.training.drools.insurance.domain.response.ApplicationResponse applicationResponse; + +dialect "java" + + +rule "Invalidate application if not employed" + when + $application: ApplicationDto( !isEmployed ) + then + applicationResponse.setResponse($application + ": Invalid – Unemployed"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client unemployed") + } +end + +rule "Invalidate application from minor" + dialect "java" + when + $application: ApplicationDto( clientAge < 18 ) + + then + applicationResponse.setResponse($application + ": Invalid – Minor"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client underaged") + } +end + +rule "Invalid application – has pre-existing conditions" + dialect "java" + when + $application: ApplicationDto( pec ) + then + applicationResponse.setResponse($application + ": Invalid – Client has PEC"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client has PEC") + } +end + +rule "Valid Application" + dialect "java" + when + $application: ApplicationDto( status == Status.PENDING ) + then + applicationResponse.setResponse($application + ": Approval Granted!"); + modify($application) { + setStatus(Status.APPROVED) + } +end diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson03/demo03/application_client_identification_validation_demo_03.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson03/demo03/application_client_identification_validation_demo_03.drl new file mode 100644 index 0000000..ab6b901 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson03/demo03/application_client_identification_validation_demo_03.drl @@ -0,0 +1,47 @@ +package africa.skunkworks.training.drools.insurance.lesson03.demo03; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.dto.ClientIdentificationDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import java.time.LocalDate; + +global africa.skunkworks.training.drools.insurance.domain.response.ApplicationResponse applicationResponse; + +dialect "java" + +rule "Invalidate Applications with missing ID" + when + $application: ApplicationDto( status != Status.DENIED ) + not ClientIdentificationDto( idNumber == $application.getClientIdentificationNumber(), + status != Status.DENIED) + then + applicationResponse.setResponse($application + " Invalid – No matching ID found"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate applications with incorrect name" + when + $application: ApplicationDto( status != Status.DENIED ) + $clientID: ClientIdentificationDto( idNumber == $application.getClientIdentificationNumber(), name != $application.clientName ) + then + applicationResponse.setResponse($application + " Invalid – Name [" + $application.getClientName() + "] not matching name on ID [" + $clientID.getName() + "]"); + modify($application) { + setStatus(Status.DENIED) + } +end + +rule "Invalidate Applications with Expired ID" + when + $application: ApplicationDto( status != Status.DENIED ) + $clientid: ClientIdentificationDto( idNumber == $application.getClientIdentificationNumber(), + expiryDate.isBefore(LocalDate.now()), + status != Status.DENIED ) + then + applicationResponse.setResponse($application + " Invalid – " + $clientid + " ID expired"); + modify($application) { + setStatus(Status.DENIED) + } +end + diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson03/demo03/validate_application_demo_03_2.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson03/demo03/validate_application_demo_03_2.drl new file mode 100644 index 0000000..3776bc8 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson03/demo03/validate_application_demo_03_2.drl @@ -0,0 +1,59 @@ +package africa.skunkworks.training.drools.insurance.lesson03.demo03; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; + +global africa.skunkworks.training.drools.insurance.domain.response.ApplicationResponse applicationResponse; + +dialect "java" + +rule "Invalidate application if not employed" + dialect "java" + when + $application: ApplicationDto( !isEmployed, + status != Status.DENIED ) + then + applicationResponse.setResponse($application + ": Invalid – Unemployed"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client unemployed") + } +end + +rule "Invalidate application from minor" + dialect "java" + when + $application: ApplicationDto( clientAge < 18, + status != Status.DENIED ) + + then + applicationResponse.setResponse($application + ": Invalid – Minor"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client underaged") + } +end + +rule "Invalid application – has pre-existing conditions" + dialect "java" + when + $application: ApplicationDto( pec, + status != Status.DENIED ) + then + applicationResponse.setResponse($application + ": Invalid – Client has PEC"); + modify($application) { + setStatus(Status.DENIED), + setReason( "Client has PEC") + } +end + +rule "Valid Application" + dialect "java" + when + $application: ApplicationDto( status == Status.PENDING ) + then + applicationResponse.setResponse($application + ": Approval Granted!"); + modify($application) { + setStatus(Status.APPROVED) + } +end diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo01/claim_validation_demo_01.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo01/claim_validation_demo_01.drl new file mode 100644 index 0000000..bed15b5 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo01/claim_validation_demo_01.drl @@ -0,0 +1,54 @@ +package africa.skunkworks.training.drools.insurance.lesson04.demo01; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status +import africa.skunkworks.training.drools.insurance.domain.dto.Payout; + + +dialect "java" + +rule "Valid Claims" + when + $claim: ClaimDto( status == Status.PENDING ) + then + modify($claim) { + setReason($claim + ": not invalidated. Approval Granted"), + setStatus(Status.VALID) + } +end + +rule "Issue Payout" + when + $claim: ClaimDto(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + insert( payout ); + modify($claim){ + setReason("New Payout: " + payout + " Issued") + } +end + +rule "Invalidate claim that exceeds coverage" + when + + $claim: ClaimDto( status != Status.DENIED ) + $policy: PolicyDto( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + modify($claim) { + setReason($claim + ": failed. Coverage in policy " + $policy + " insufficient."), + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + when + $claim: ClaimDto( status != Status.DENIED ) + $policy: PolicyDto( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + modify($claim) { + setReason($claim + ": failed. Unpaid premiums in " + $policy), + setStatus(Status.DENIED) + } +end \ No newline at end of file diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo02/claim_validation_demo_02.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo02/claim_validation_demo_02.drl new file mode 100644 index 0000000..204a404 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo02/claim_validation_demo_02.drl @@ -0,0 +1,55 @@ +package africa.skunkworks.training.drools.insurance.lesson04.demo02; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status +import africa.skunkworks.training.drools.insurance.domain.dto.Payout; + +dialect "java" + +rule "Valid Claims" + salience 20 + when + $claim: ClaimDto( status == Status.PENDING ) + then + modify($claim) { + setReason($claim + ": not invalidated. Approval Granted"), + setStatus(Status.APPROVED) + } +end + +rule "Invalidate claim without matching policy" + salience 50 + when + $claim: ClaimDto( status != Status.DENIED ) + not PolicyDto( policyNumber == $claim.getPolicyNumber() ) + then + modify($claim) { + setReason($claim + ": failed (no matching policy)"), + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim that exceeds coverage" + salience 50 + when + $claim: ClaimDto( status != Status.DENIED ) + $policy: PolicyDto( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + modify($claim) { + setReason($claim + ": failed. Coverage in policy " + $policy + " insufficient."), + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + salience 50 + when + $claim: ClaimDto( status != Status.DENIED ) + $policy: PolicyDto( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + modify($claim) { + setReason($claim + ": failed. Unpaid premiums in " + $policy), + setStatus(Status.DENIED) + } +end \ No newline at end of file diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo02/payout_issue_demo_02.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo02/payout_issue_demo_02.drl new file mode 100644 index 0000000..9dacf48 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo02/payout_issue_demo_02.drl @@ -0,0 +1,19 @@ +package africa.skunkworks.training.drools.insurance.lesson04.demo02; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status +import africa.skunkworks.training.drools.insurance.domain.dto.Payout; + +rule "Issue Payout" + dialect "java" + salience 0 + when + $claim: ClaimDto(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + insert( payout ); + modify($claim){ + setReason("New Payout: " + payout + " Issued") + } +end \ No newline at end of file diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo03/claim_validation_demo_03.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo03/claim_validation_demo_03.drl new file mode 100644 index 0000000..aecfa39 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo03/claim_validation_demo_03.drl @@ -0,0 +1,57 @@ +package africa.skunkworks.training.drools.insurance.lesson04.demo03; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status +import africa.skunkworks.training.drools.insurance.domain.dto.Payout; + +dialect "java" + +rule "Valid Claims" + agenda-group "valid-claim" + when + $claim: ClaimDto( status == Status.PENDING ) + then + modify($claim) { + setReason($claim + ": not invalidated. Approval Granted"), + setStatus(Status.APPROVED) + } +end + +rule "Invalidate claim without matching policy" + agenda-group "invalid-claim-wrong-policy" + when + $claim: ClaimDto( status != Status.DENIED ) + not PolicyDto( policyNumber == $claim.getPolicyNumber() ) + then + modify($claim) { + setReason($claim + ": failed (no matching policy)"), + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim that exceeds coverage" + agenda-group "invalid-claim" + when + $claim: ClaimDto( status != Status.DENIED ) + $policy: PolicyDto( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + modify($claim) { + setReason($claim + ": failed. Coverage in policy " + $policy + " insufficient."), + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + agenda-group "invalid-claim-unpaid-premiums" + when + $claim: ClaimDto( status != Status.DENIED ) + $policy: PolicyDto( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + modify($claim) { + setReason($claim + ": failed. Unpaid premiums in " + $policy), + setStatus(Status.DENIED) + } +end + + diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo03/payout_issue_demo_03.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo03/payout_issue_demo_03.drl new file mode 100644 index 0000000..47bba29 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo03/payout_issue_demo_03.drl @@ -0,0 +1,20 @@ +package africa.skunkworks.training.drools.insurance.lesson04.demo03; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status +import africa.skunkworks.training.drools.insurance.domain.dto.Payout; + +rule "Issue Payout" + dialect "java" + agenda-group "issue-payout" + salience 0 + when + $claim: ClaimDto(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + insert( payout ); + modify($claim){ + setReason("New Payout: " + payout + " Issued") + } +end \ No newline at end of file diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo04/claim_validation_demo_04.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo04/claim_validation_demo_04.drl new file mode 100644 index 0000000..0c4af1e --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo04/claim_validation_demo_04.drl @@ -0,0 +1,60 @@ +package africa.skunkworks.training.drools.insurance.lesson04.demo04; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status +import africa.skunkworks.training.drools.insurance.domain.dto.Payout; + +dialect "java" + +rule "Valid Claims" + agenda-group "claim-validation" + salience 20 + when + $claim: ClaimDto( status == Status.PENDING ) + then + modify($claim) { + setReason($claim + ": not invalidated. Approval Granted"), + setStatus(Status.APPROVED) + } +end + +rule "Invalidate claim without matching policy" + agenda-group "claim-validation-wrong-policy" + salience 50 + when + $claim: ClaimDto( status != Status.DENIED ) + not PolicyDto( policyNumber == $claim.getPolicyNumber() ) + then + modify($claim) { + setReason($claim + ": failed (no matching policy)"), + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim that exceeds coverage" + agenda-group "claim-validation-coverage" + salience 50 + when + $claim: ClaimDto( status != Status.DENIED ) + $policy: PolicyDto( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + modify($claim) { + setReason($claim + ": failed. Coverage in policy " + $policy + " insufficient."), + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + dialect "java" + agenda-group "claim-validation-unpaid-premiums" + salience 50 + when + $claim: ClaimDto( status != Status.DENIED ) + $policy: PolicyDto( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + modify($claim) { + setReason($claim + ": failed. Unpaid premiums in " + $policy), + setStatus(Status.DENIED) + } +end diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo04/payout_issue_demo_04.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo04/payout_issue_demo_04.drl new file mode 100644 index 0000000..f757f5b --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo04/payout_issue_demo_04.drl @@ -0,0 +1,20 @@ +package africa.skunkworks.training.drools.insurance.lesson04.demo04; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status +import africa.skunkworks.training.drools.insurance.domain.dto.Payout; + +rule "Issue Payout" + dialect "java" + agenda-group "issue-payout" + salience 0 + when + $claim: ClaimDto(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + insert( payout ); + modify($claim){ + setReason("New Payout: " + payout + " Issued") + } +end \ No newline at end of file diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo05/claim_validation_demo_05.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo05/claim_validation_demo_05.drl new file mode 100644 index 0000000..3c7604c --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo05/claim_validation_demo_05.drl @@ -0,0 +1,59 @@ +package africa.skunkworks.training.drools.insurance.lesson04.demo05; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status +import africa.skunkworks.training.drools.insurance.domain.dto.Payout; + +dialect "java" + +rule "Valid Claims" + agenda-group "claim-validation" + salience 20 + when + $claim: ClaimDto( status == Status.PENDING ) + then + modify($claim) { + setReason($claim + ": not invalidated. Approval Granted"), + setStatus(Status.APPROVED) + } +end + +rule "Invalidate claim without matching policy" + agenda-group "claim-validation-wrong-policy" + salience 50 + when + $claim: ClaimDto( status != Status.DENIED ) + not PolicyDto( policyNumber == $claim.getPolicyNumber() ) + then + modify($claim) { + setReason($claim + ": failed (no matching policy)"), + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim that exceeds coverage" + agenda-group "claim-validation-coverage" + salience 50 + when + $claim: ClaimDto( status != Status.DENIED ) + $policy: PolicyDto( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + modify($claim) { + setReason($claim + ": failed. Coverage in policy " + $policy + " insufficient."), + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + agenda-group "claim-validation-unpaid-premiums" + salience 50 + when + $claim: ClaimDto( status != Status.DENIED ) + $policy: PolicyDto( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + modify($claim) { + setReason($claim + ": failed. Unpaid premiums in " + $policy), + setStatus(Status.DENIED) + } +end diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo05/payout_issue_demo_05.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo05/payout_issue_demo_05.drl new file mode 100644 index 0000000..af1cb9e --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson04/demo05/payout_issue_demo_05.drl @@ -0,0 +1,20 @@ +package africa.skunkworks.training.drools.insurance.lesson04.demo05; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status +import africa.skunkworks.training.drools.insurance.domain.dto.Payout; + +rule "Issue Payout" + dialect "java" + agenda-group "issue-payout" + salience 0 + when + $claim: ClaimDto(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + insert( payout ); + modify($claim){ + setReason("New Payout: " + payout + " Issued") + } +end \ No newline at end of file diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo01/claim_validation_demo_01.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo01/claim_validation_demo_01.drl new file mode 100644 index 0000000..2ae3c46 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo01/claim_validation_demo_01.drl @@ -0,0 +1,67 @@ +package africa.skunkworks.training.drools.insurance.lesson05.demo01; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status +import africa.skunkworks.training.drools.insurance.domain.dto.Payout; + +dialect "java" + +rule "Valid Claims" + agenda-group "valid-claims" + when + $claim: ClaimDto( status == Status.PENDING ) + then + modify($claim) { + setReason($claim + ": not invalidated. Approval Granted"), + setStatus(Status.APPROVED) + } +end + +rule "Issue Payout" + agenda-group "issue-payout" + when + $claim: ClaimDto(status == Status.APPROVED) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + insertLogical( payout ); + modify($claim){ + setReason("New Payout: " + payout + " Issued") + } +end + +rule "Invalidate claim without matching policy" + agenda-group "invalid-policy" + when + $claim: ClaimDto( status != Status.DENIED ) + not PolicyDto( policyNumber == $claim.getPolicyNumber() ) + then + modify($claim) { + setReason($claim + ": failed (no matching policy)"), + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim that exceeds coverage" + agenda-group "exceed-coverage" + when + $claim: ClaimDto( status != Status.DENIED ) + $policy: PolicyDto( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + modify($claim) { + setReason($claim + ": failed. Coverage in policy " + $policy + " insufficient."), + setStatus(Status.DENIED) + } +end + +rule "Invalidate claim with unpaid premiums" + agenda-group "unpaid-premiums" + when + $claim: ClaimDto( status != Status.DENIED ) + $policy: PolicyDto( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + modify($claim) { + setReason($claim + ": failed. Unpaid premiums in " + $policy), + setStatus(Status.DENIED) + } +end \ No newline at end of file diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo02/claim_validation_demo_02.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo02/claim_validation_demo_02.drl new file mode 100644 index 0000000..118481b --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo02/claim_validation_demo_02.drl @@ -0,0 +1,58 @@ +package africa.skunkworks.training.drools.insurance.lesson05.demo02; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status +import africa.skunkworks.training.drools.insurance.domain.dto.Payout; +import africa.skunkworks.training.drools.insurance.domain.dto.InvalidClaim; +import africa.skunkworks.training.drools.insurance.domain.dto.ValidClaim; + +dialect "java" + +rule "Valid Claims" + agenda-group "valid-claims" + when + $claim: ClaimDto( ) + not (InvalidClaim( claim == $claim) ) + then + modify($claim){ + setReason($claim + ": not invalidated. Approval Granted") + } + insertLogical( new ValidClaim($claim) ); +end + +rule "Invalidate claim without matching policy" + agenda-group "invalid-policy" + when + $claim: ClaimDto( ) + not PolicyDto( policyNumber == $claim.getPolicyNumber() ) + then + modify($claim){ + setReason($claim + ": failed (no matching policy)") + } + insert( new InvalidClaim($claim) ); +end + +rule "Invalidate claim that exceeds coverage" + agenda-group "exceed-coverage" + when + $claim: ClaimDto( ) + $policy: PolicyDto( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + modify($claim){ + setReason($claim + ": failed. Coverage in policy " + $policy + " insufficient.") + } + insert( new InvalidClaim($claim) ); +end + +rule "Invalidate claim with unpaid premiums" + agenda-group "unpaid-premiums" + when + $claim: ClaimDto( ) + $policy: PolicyDto( policyNumber == $claim.getPolicyNumber(), paymentStatus == "Unpaid" ) + then + modify($claim){ + setReason($claim + ": failed. Unpaid premiums in " + $policy) + } + insert( new InvalidClaim($claim) ); +end \ No newline at end of file diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo02/payout_issue_demo_02.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo02/payout_issue_demo_02.drl new file mode 100644 index 0000000..7f832da --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo02/payout_issue_demo_02.drl @@ -0,0 +1,23 @@ +package africa.skunkworks.training.drools.insurance.lesson05.demo02; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status +import africa.skunkworks.training.drools.insurance.domain.dto.Payout; +import africa.skunkworks.training.drools.insurance.domain.dto.InvalidClaim; +import africa.skunkworks.training.drools.insurance.domain.dto.ValidClaim; +import africa.skunkworks.training.drools.insurance.domain.dto.InvalidPolicy; + +dialect "java" + +rule "Issue Payout" + when + $claim: ClaimDto( ) + not ( InvalidClaim( claim == $claim)) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + modify($claim){ + setReason("New Payout: " + payout + " Issued") + } + insertLogical( payout ); +end \ No newline at end of file diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo03/claim_validation_demo_03.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo03/claim_validation_demo_03.drl new file mode 100644 index 0000000..24f4abc --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo03/claim_validation_demo_03.drl @@ -0,0 +1,62 @@ +package africa.skunkworks.training.drools.insurance.lesson05.demo03; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status +import africa.skunkworks.training.drools.insurance.domain.dto.Payout; +import africa.skunkworks.training.drools.insurance.domain.dto.InvalidClaim; +import africa.skunkworks.training.drools.insurance.domain.dto.ValidClaim; +import africa.skunkworks.training.drools.insurance.domain.dto.InvalidPolicy; + +dialect "java" + +rule "Valid Claims" + agenda-group "valid-claims" + when + $claim: ClaimDto( ) + not (InvalidClaim( claim == $claim) ) + then + modify($claim){ + setReason($claim + ": not invalidated. Approval Granted") + } + insertLogical( new ValidClaim($claim) ); +end + +rule "Invalidate claim without matching policy" + agenda-group "invalid-policy" + when + $claim: ClaimDto( ) + not PolicyDto( policyNumber == $claim.getPolicyNumber() ) + not InvalidClaim( $claim.policyNumber == $claim.policyNumber) + then + modify($claim){ + setReason($claim + ": failed (no matching policy)") + } + insert( new InvalidClaim($claim) ); +end + +rule "Invalidate claim that exceeds coverage" + agenda-group "exceed-coverage" + when + $claim: ClaimDto( ) + $policy: PolicyDto( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + not InvalidClaim( $claim.policyNumber == $claim.policyNumber) + then + modify($claim){ + setReason($claim + ": failed. Coverage in policy " + $policy + " insufficient.") + } + insert( new InvalidClaim($claim) ); +end + +rule "Invalidate claim with invalid policy" + agenda-group "unpaid-premiums" + when + $invalidPolicy: InvalidPolicy( ) + $claim: ClaimDto( policyNumber == $invalidPolicy.policy.policyNumber ) + not InvalidClaim( $claim.policyNumber == $claim.policyNumber) + then + modify($claim){ + setReason($claim + ": failed. " + $invalidPolicy + " Invalid") + } + insert( new InvalidClaim($claim) ); +end \ No newline at end of file diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo03/payout_issue_demo_03.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo03/payout_issue_demo_03.drl new file mode 100644 index 0000000..1a9fdab --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo03/payout_issue_demo_03.drl @@ -0,0 +1,23 @@ +package africa.skunkworks.training.drools.insurance.lesson05.demo03; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status +import africa.skunkworks.training.drools.insurance.domain.dto.Payout; +import africa.skunkworks.training.drools.insurance.domain.dto.InvalidClaim; +import africa.skunkworks.training.drools.insurance.domain.dto.ValidClaim; +import africa.skunkworks.training.drools.insurance.domain.dto.InvalidPolicy; + +dialect "java" + +rule "Issue Payout" + when + $claim: ClaimDto( ) + not ( InvalidClaim( claim == $claim)) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + modify($claim){ + setReason("New Payout: " + payout + " Issued") + } + insertLogical( payout ); +end \ No newline at end of file diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo03/policy_validation_demo_03.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo03/policy_validation_demo_03.drl new file mode 100644 index 0000000..3365bd4 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo03/policy_validation_demo_03.drl @@ -0,0 +1,17 @@ +package africa.skunkworks.training.drools.insurance.lesson05.demo03; + +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.dto.InvalidPolicy; + +dialect "java" + +rule "Invalidate unpaid Policy" + when + $policy: PolicyDto( paymentStatus == "Unpaid" ) + not InvalidPolicy( policy.policyNumber == $policy.policyNumber) + then + modify($policy){ + setReason("Policy [" + $policy + "] invalidated due to unpaid premiums") + } + insert( new InvalidPolicy($policy) ); +end diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo04/claim_validation_demo_04.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo04/claim_validation_demo_04.drl new file mode 100644 index 0000000..9253f0b --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo04/claim_validation_demo_04.drl @@ -0,0 +1,46 @@ +package africa.skunkworks.training.drools.insurance.lesson05.demo04; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status +import africa.skunkworks.training.drools.insurance.domain.dto.Payout; +import africa.skunkworks.training.drools.insurance.domain.dto.InvalidClaim; +import africa.skunkworks.training.drools.insurance.domain.dto.ValidClaim; +import africa.skunkworks.training.drools.insurance.domain.dto.InvalidPolicy; + +dialect "java" + +rule "Invalidate claim without matching policy" + when + $claim: ClaimDto( ) + not PolicyDto( policyNumber == $claim.getPolicyNumber() ) + not InvalidClaim( $claim.policyNumber == $claim.policyNumber) + then + modify($claim){ + setReason($claim + ": failed (no matching policy)") + } + insert( new InvalidClaim($claim) ); +end + +rule "Invalidate claim that exceeds coverage" + when + $claim: ClaimDto( ) + $policy: PolicyDto( policyNumber == $claim.getPolicyNumber(), coverage < $claim.getClaimAmount() ) + then + modify($claim){ + setReason($claim + ": failed. Coverage in policy " + $policy + " insufficient.") + } + insert( new InvalidClaim($claim) ); +end + +rule "Invalidate claim with invalid policy" + when + $invalidPolicy: InvalidPolicy( ) + $claim: ClaimDto( policyNumber == $invalidPolicy.policy.policyNumber ) + not InvalidClaim( $claim.policyNumber == $claim.policyNumber) + then + modify($claim){ + setReason($claim + ": failed. " + $invalidPolicy + " Invalid") + } + insert( new InvalidClaim($claim) ); +end \ No newline at end of file diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo04/payout_issue_demo_04.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo04/payout_issue_demo_04.drl new file mode 100644 index 0000000..b949536 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo04/payout_issue_demo_04.drl @@ -0,0 +1,23 @@ +package africa.skunkworks.training.drools.insurance.lesson05.demo04; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status +import africa.skunkworks.training.drools.insurance.domain.dto.Payout; +import africa.skunkworks.training.drools.insurance.domain.dto.InvalidClaim; +import africa.skunkworks.training.drools.insurance.domain.dto.ValidClaim; +import africa.skunkworks.training.drools.insurance.domain.dto.InvalidPolicy; + +dialect "java" + +rule "Issue Payout" + when + $claim: ClaimDto( ) + not ( InvalidClaim( claim == $claim)) + then + Payout payout = new Payout( $claim.getPolicyNumber(), $claim.getClaimAmount() ); + modify($claim){ + setReason("New Payout: " + payout + " Issued") + } + insertLogical( payout ); +end \ No newline at end of file diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo04/policy_validation_demo_04.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo04/policy_validation_demo_04.drl new file mode 100644 index 0000000..4f60e48 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/lesson05/demo04/policy_validation_demo_04.drl @@ -0,0 +1,17 @@ +package africa.skunkworks.training.drools.insurance.lesson05.demo04; + +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.dto.InvalidPolicy; + +dialect "java" + +rule "Invalidate unpaid Policy" + when + $policy: PolicyDto( paymentStatus == "Unpaid" ) + not InvalidPolicy( policy.policyNumber == $policy.policyNumber) + then + modify($policy){ + setReason("Policy [" + $policy + "] invalidated due to unpaid premiums") + } + insert( new InvalidPolicy($policy) ); +end diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/policy/policy_validation.drl b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/policy/policy_validation.drl new file mode 100644 index 0000000..8242269 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/main/resources/africa/skunkworks/training/drools/insurance/policy/policy_validation.drl @@ -0,0 +1,14 @@ +package africa.skunkworks.training.drools.insurance.policy; + +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; + +dialect "java" + +rule "Invalidate unpaid Policy" + when + $policy: PolicyDto( paymentStatus == "Unpaid" ) + then + modify($policy){ + setReason("Policy [" + $policy + "] invalidated due to unpaid premiums") + } +end \ No newline at end of file diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/AbstractRuleTest.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/AbstractRuleTest.java index d0bd59e..f9a399f 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/AbstractRuleTest.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/AbstractRuleTest.java @@ -1,9 +1,14 @@ package africa.skunkworks.training.drools.insurance.rule; import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.ClientIdentificationDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; import africa.skunkworks.training.drools.insurance.rule.config.RuleConfig; import org.springframework.boot.test.context.SpringBootTest; +import java.time.LocalDate; + @SpringBootTest(classes = {RuleConfig.class}) public abstract class AbstractRuleTest { protected ApplicationDto getApplication(Integer clientAge, Boolean pec, Boolean isEmployed){ @@ -13,4 +18,32 @@ protected ApplicationDto getApplication(Integer clientAge, Boolean pec, Boolean .isEmployed(isEmployed) .build(); } + + protected ClaimDto getClaim(String clientName, String policyNumber, LocalDate dateOfClaim, Double claimAmount){ + return ClaimDto.builder() + .clientName(clientName) + .policyNumber(policyNumber) + .dateOfClaim(dateOfClaim) + .claimAmount(claimAmount) + .build(); + + } + + protected PolicyDto getPolicy(String policyNumber, String clientName, Integer premium,Integer coverage, String paymentStatus ){ + return PolicyDto.builder() + .clientName(clientName) + .policyNumber(policyNumber) + .premium(premium) + .coverage(coverage) + .paymentStatus(paymentStatus) + .build(); + } + + protected ClientIdentificationDto getClientIdentification(String name, String idNumber,LocalDate expiryDate){ + return ClientIdentificationDto.builder() + .name(name) + .expiryDate(expiryDate) + .idNumber(idNumber) + .build(); + } } diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/application/ApplicationValidationTest.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/application/ApplicationValidationTest.java new file mode 100644 index 0000000..1a3b2c6 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/application/ApplicationValidationTest.java @@ -0,0 +1,65 @@ +package africa.skunkworks.training.drools.insurance.rule.application; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.rule.AbstractRuleTest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class ApplicationValidationTest extends AbstractRuleTest { + + + @Autowired + private ApplicationValidationRule applicationValidation; + + @Test + public void validateApplicationIfNotEmployed(){ + ApplicationDto application = getApplication(30, Boolean.FALSE,Boolean.FALSE); + application.setApplicationNumber("A-100"); + + applicationValidation.validateApplication(application,"not-employed"); + + assertNotNull(application); + assertEquals(Status.DENIED, application.getStatus()); + + } + + @Test + public void validateApplicationMinor(){ + ApplicationDto application = getApplication(15, Boolean.FALSE,Boolean.TRUE); + application.setApplicationNumber("A-101"); + + applicationValidation.validateApplication(application,"application-minor"); + + assertNotNull(application); + assertEquals(Status.DENIED, application.getStatus()); + + } + + @Test + public void validateApplicationPec(){ + ApplicationDto application = getApplication(25, Boolean.TRUE,Boolean.TRUE); + application.setApplicationNumber("A-101"); + + applicationValidation.validateApplication(application,"application-pec"); + + assertNotNull(application); + assertEquals(Status.DENIED, application.getStatus()); + + } + + @Test + public void validateApplication(){ + ApplicationDto application = getApplication(25, Boolean.FALSE,Boolean.TRUE); + application.setApplicationNumber("A-104"); + application.setStatus(Status.PENDING); + + applicationValidation.validateApplication(application,"valid-application"); + + assertNotNull(application); + assertEquals(Status.APPROVED, application.getStatus()); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/claim/ClaimValidationRuleTest.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/claim/ClaimValidationRuleTest.java new file mode 100644 index 0000000..be84395 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/claim/ClaimValidationRuleTest.java @@ -0,0 +1,41 @@ +package africa.skunkworks.training.drools.insurance.rule.claim; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.rule.AbstractRuleTest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class ClaimValidationRuleTest extends AbstractRuleTest { + + @Autowired + private ClaimValidationRule claimValidationRule; + + @Test + public void validateClaim(){ + ClaimDto claim = getClaim("Chuck Norry", "P-100", LocalDate.now(),19283D); + claim.setStatus(Status.PENDING); + + claimValidationRule.validateClaim(claim,"valid-claim"); + assertNotNull(claim); + assertNotNull(claim.getReason()); + assertEquals(Status.APPROVED, claim.getStatus()); + } + + @Test + public void validateClaimIssuePayout(){ + ClaimDto claim = getClaim("Chuck Norry", "P-100", LocalDate.now(),19283D); + claim.setStatus(Status.APPROVED); + + claimValidationRule.validateClaim(claim,"issue-payout"); + assertNotNull(claim); + assertNotNull(claim.getReason()); + assertEquals(Status.APPROVED, claim.getStatus()); + + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson03/ClaimValidationLesson02Demo01Test.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson03/ClaimValidationLesson02Demo01Test.java new file mode 100644 index 0000000..873c0cb --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson03/ClaimValidationLesson02Demo01Test.java @@ -0,0 +1,67 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson03; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.rule.AbstractRuleTest; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class ClaimValidationLesson02Demo01Test extends AbstractRuleTest { + + @Autowired + @Qualifier("claimValidationLesson02Demo01") + private ClaimValidation claimValidation; + + @Test + public void validateClaim(){ + //Invalidate claim without matching policy + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + + PolicyDto policyDto = getPolicy("P-102","John Smith",130,130000,"Paid"); + + claimValidation.validateClaim(claimDto,policyDto); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.DENIED, claimDto.getStatus()); + + //Invalidate claim that exceeds coverage + claimDto = getClaim("John Smith","P-101", LocalDate.now(),1239990D); + + policyDto = getPolicy("P-101","John Smith",130,130000,"UnPaid"); + + claimValidation.validateClaim(claimDto,policyDto); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.DENIED, claimDto.getStatus()); + + //Invalidate claim with unpaid premiums + claimDto = getClaim("John Smith","P-101", LocalDate.now(),1239990D); + + policyDto = getPolicy("P-101","John Smith",13000000,130000,"UnPaid"); + + claimValidation.validateClaim(claimDto,policyDto); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.DENIED, claimDto.getStatus()); + + //Valid Claims + claimDto = getClaim("John Smith","P-101", LocalDate.now(),1239D); + claimDto.setStatus(Status.PENDING); + + policyDto = getPolicy("P-101","John Smith",1300000,130000,"Paid"); + + claimValidation.validateClaim(claimDto,policyDto); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.APPROVED, claimDto.getStatus()); + + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson03/ValidateApplicationAndClientIdentificationLesson03Demo02Test.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson03/ValidateApplicationAndClientIdentificationLesson03Demo02Test.java new file mode 100644 index 0000000..09a4a76 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson03/ValidateApplicationAndClientIdentificationLesson03Demo02Test.java @@ -0,0 +1,72 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson03; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.dto.ClientIdentificationDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.domain.response.ApplicationResponse; +import africa.skunkworks.training.drools.insurance.rule.AbstractRuleTest; +import africa.skunkworks.training.drools.insurance.rule.ValidateApplication; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class ValidateApplicationAndClientIdentificationLesson03Demo02Test extends AbstractRuleTest { + + @Autowired + @Qualifier("validateApplicationAndClientIdentificationLesson03Demo02") + private ValidateApplication validateApplication; + + @Test + public void validateApplicationMissingId(){ + //Invalidate applications with missing ID + ApplicationDto applicationDto = getApplication(18, Boolean.FALSE, Boolean.TRUE); + applicationDto.setClientIdentificationNumber("ID-100"); + + ClientIdentificationDto clientIdentificationDto = getClientIdentification("John Smith", "ID-999", LocalDate.now()); + + ApplicationResponse response = validateApplication.validateApplication(applicationDto, clientIdentificationDto); + assertNotNull(response); + assertEquals(Status.DENIED, applicationDto.getStatus()); + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 1 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(response.getResponse()); + + + } + + @Test + public void validateApplicationIncorrectName(){ + ApplicationDto applicationDto = getApplication(18, Boolean.FALSE, Boolean.TRUE); + applicationDto.setClientIdentificationNumber("ID-100"); + applicationDto.setClientName("John Lennon"); + + ClientIdentificationDto clientIdentificationDto = getClientIdentification("John Smith", "ID-100", LocalDate.now()); + + ApplicationResponse response = validateApplication.validateApplication(applicationDto, clientIdentificationDto); + assertNotNull(response); + assertEquals(Status.DENIED, applicationDto.getStatus()); + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 2 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(response.getResponse()); + } + + @Test + public void validateApplicationExpiredId(){ + + //Invalidate applications with Expired ID + ApplicationDto applicationDto = getApplication(18, Boolean.FALSE, Boolean.TRUE); + applicationDto.setClientIdentificationNumber("ID-100"); + + ClientIdentificationDto clientIdentificationDto = getClientIdentification("John Lennon", "ID-100", LocalDate.of(2023,12,15)); + + ApplicationResponse response = validateApplication.validateApplication(applicationDto, clientIdentificationDto); + assertNotNull(response); + assertEquals(Status.DENIED, applicationDto.getStatus()); + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 3 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(response.getResponse()); + + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson03/ValidateApplicationAndClientIdentificationLesson03Demo03Test.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson03/ValidateApplicationAndClientIdentificationLesson03Demo03Test.java new file mode 100644 index 0000000..6213a8a --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson03/ValidateApplicationAndClientIdentificationLesson03Demo03Test.java @@ -0,0 +1,75 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson03; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.dto.ClientIdentificationDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.domain.response.ApplicationResponse; +import africa.skunkworks.training.drools.insurance.rule.AbstractRuleTest; +import africa.skunkworks.training.drools.insurance.rule.ValidateApplication; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class ValidateApplicationAndClientIdentificationLesson03Demo03Test extends AbstractRuleTest { + + @Autowired + @Qualifier("validateApplicationAndClientIdentificationLesson03Demo03") + private ValidateApplication validateApplication; + + @Test + public void validateApplicationMissingId(){ + //Invalidate applications with missing ID + ApplicationDto applicationDto = getApplication(18, Boolean.FALSE, Boolean.TRUE); + applicationDto.setClientIdentificationNumber("ID-100"); + applicationDto.setStatus(Status.VALID); + + ClientIdentificationDto clientIdentificationDto = getClientIdentification("John Smith", "ID-999", LocalDate.now()); + + ApplicationResponse response = validateApplication.validateApplication(applicationDto, clientIdentificationDto); + assertNotNull(response); + assertEquals(Status.DENIED, applicationDto.getStatus()); + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 1 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(response.getResponse()); + + + } + + @Test + public void validateApplicationIncorrectName(){ + ApplicationDto applicationDto = getApplication(18, Boolean.FALSE, Boolean.TRUE); + applicationDto.setClientIdentificationNumber("ID-100"); + applicationDto.setClientName("John Lennon"); + applicationDto.setStatus(Status.VALID); + + ClientIdentificationDto clientIdentificationDto = getClientIdentification("John Smith", "ID-100", LocalDate.now()); + + ApplicationResponse response = validateApplication.validateApplication(applicationDto, clientIdentificationDto); + assertNotNull(response); + assertEquals(Status.DENIED, applicationDto.getStatus()); + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 2 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(response.getResponse()); + } + + @Test + public void validateApplicationExpiredId(){ + + //Invalidate applications with Expired ID + ApplicationDto applicationDto = getApplication(18, Boolean.FALSE, Boolean.TRUE); + applicationDto.setClientIdentificationNumber("ID-100"); + applicationDto.setStatus(Status.VALID); + + ClientIdentificationDto clientIdentificationDto = getClientIdentification("John Lennon", "ID-100", LocalDate.of(2023,12,15)); + + ApplicationResponse response = validateApplication.validateApplication(applicationDto, clientIdentificationDto); + assertNotNull(response); + assertEquals(Status.DENIED, applicationDto.getStatus()); + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 3 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(response.getResponse()); + + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson03/ValidateApplicationLesson3Demo0202Test.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson03/ValidateApplicationLesson3Demo0202Test.java new file mode 100644 index 0000000..274c39d --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson03/ValidateApplicationLesson3Demo0202Test.java @@ -0,0 +1,72 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson03; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.dto.ClientIdentificationDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.domain.response.ApplicationResponse; +import africa.skunkworks.training.drools.insurance.rule.AbstractRuleTest; +import africa.skunkworks.training.drools.insurance.rule.ValidateApplication; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class ValidateApplicationLesson3Demo0202Test extends AbstractRuleTest { + + @Autowired + @Qualifier("validateApplicationLesson3Demo0202") + private ValidateApplication validateApplication; + + @Test + public void validateApplicationUnemployed(){ + //Invalidate application if not employed + ApplicationDto applicationDto = getApplication(18, Boolean.FALSE, Boolean.FALSE); + + ApplicationResponse response = validateApplication.validateApplication(applicationDto); + assertNotNull(response); + assertEquals(Status.DENIED, applicationDto.getStatus()); + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 1 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(response.getResponse()); + } + + @Test + public void validateApplicationMinor(){ + //Invalidate application from minor + ApplicationDto applicationDto = getApplication(15, Boolean.FALSE, Boolean.TRUE); + + ApplicationResponse response = validateApplication.validateApplication(applicationDto); + assertNotNull(response); + assertEquals(Status.DENIED, applicationDto.getStatus()); + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 2 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(response.getResponse()); + } + + @Test + public void validateApplicationPec(){ + //Invalid application – has pre-existing conditions + ApplicationDto applicationDto = getApplication(25, Boolean.TRUE, Boolean.TRUE); + + ApplicationResponse response = validateApplication.validateApplication(applicationDto); + assertNotNull(response); + assertEquals(Status.DENIED, applicationDto.getStatus()); + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 3 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(response.getResponse()); + } + + @Test + public void validateApplication(){ + //Invalid application – has pre-existing conditions + ApplicationDto applicationDto = getApplication(25, Boolean.FALSE, Boolean.TRUE); + applicationDto.setStatus(Status.PENDING); + + ApplicationResponse response = validateApplication.validateApplication(applicationDto); + assertNotNull(response); + assertEquals(Status.APPROVED, applicationDto.getStatus()); + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 4 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(response.getResponse()); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson03/ValidateApplicationLesson3Demo0302Test.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson03/ValidateApplicationLesson3Demo0302Test.java new file mode 100644 index 0000000..284aad1 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson03/ValidateApplicationLesson3Demo0302Test.java @@ -0,0 +1,72 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson03; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.domain.response.ApplicationResponse; +import africa.skunkworks.training.drools.insurance.rule.AbstractRuleTest; +import africa.skunkworks.training.drools.insurance.rule.ValidateApplication; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class ValidateApplicationLesson3Demo0302Test extends AbstractRuleTest { + + @Autowired + @Qualifier("validateApplicationLesson3Demo0302") + private ValidateApplication validateApplication; + + @Test + public void validateApplicationUnemployed(){ + //Invalidate application if not employed + ApplicationDto applicationDto = getApplication(18, Boolean.FALSE, Boolean.FALSE); + applicationDto.setStatus(Status.INVALID); + + ApplicationResponse response = validateApplication.validateApplication(applicationDto); + assertNotNull(response); + assertEquals(Status.DENIED, applicationDto.getStatus()); + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 1 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(response.getResponse()); + } + + @Test + public void validateApplicationMinor(){ + //Invalidate application from minor + ApplicationDto applicationDto = getApplication(15, Boolean.FALSE, Boolean.TRUE); + applicationDto.setStatus(Status.INVALID); + + ApplicationResponse response = validateApplication.validateApplication(applicationDto); + assertNotNull(response); + assertEquals(Status.DENIED, applicationDto.getStatus()); + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 2 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(response.getResponse()); + } + + @Test + public void validateApplicationPec(){ + //Invalid application – has pre-existing conditions + ApplicationDto applicationDto = getApplication(25, Boolean.TRUE, Boolean.TRUE); + applicationDto.setStatus(Status.INVALID); + + ApplicationResponse response = validateApplication.validateApplication(applicationDto); + assertNotNull(response); + assertEquals(Status.DENIED, applicationDto.getStatus()); + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 3 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(response.getResponse()); + } + + @Test + public void validateApplication(){ + //Invalid application – has pre-existing conditions + ApplicationDto applicationDto = getApplication(25, Boolean.FALSE, Boolean.TRUE); + applicationDto.setStatus(Status.PENDING); + + ApplicationResponse response = validateApplication.validateApplication(applicationDto); + assertNotNull(response); + assertEquals(Status.APPROVED, applicationDto.getStatus()); + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 4 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(response.getResponse()); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/ClaimValidationLesson04Demo01Test.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/ClaimValidationLesson04Demo01Test.java new file mode 100644 index 0000000..b7c6e39 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/ClaimValidationLesson04Demo01Test.java @@ -0,0 +1,93 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson04; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.rule.AbstractRuleTest; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class ClaimValidationLesson04Demo01Test extends AbstractRuleTest { + + @Autowired + @Qualifier("claimValidationLesson04Demo01") + private ClaimValidation claimValidation; + + @Test + public void validateClaim(){ + //rule "Valid Claims" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + claimDto.setStatus(Status.PENDING); + + assertEquals(Status.PENDING, claimDto.getStatus()); + + PolicyDto policyDto = getPolicy("P-101","John Smith",130,130000,"Paid"); + + claimValidation.validateClaim(claimDto, policyDto); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.VALID, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 1 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } + + @Test + public void validateClaimPayoutIssue(){ + //rule "Issue Payout" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + claimDto.setStatus(Status.APPROVED); + + PolicyDto policyDto = getPolicy("P-102","John Smith",130,130000,"Paid"); + + claimValidation.validateClaim(claimDto, policyDto); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals("New Payout: Payout(policyNumber=P-101, claimAmount=12399.0) Issued", claimDto.getReason()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 2 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } + + @Test + public void validateClaimExceedCoverage(){ + //rule "Invalidate claim that exceeds coverage" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),1239900000D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-101","John Smith",130,1300,"Paid"); + + claimValidation.validateClaim(claimDto, policyDto); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.DENIED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 3 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } + + @Test + public void validateClaimWithUnpaidPremium(){ + //rule "Invalidate claim with unpaid premiums" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),123D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-101","John Smith",130,1300000,"Unpaid"); + + claimValidation.validateClaim(claimDto, policyDto); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.DENIED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 4 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/ClaimValidationLesson04Demo02Test.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/ClaimValidationLesson04Demo02Test.java new file mode 100644 index 0000000..473d519 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/ClaimValidationLesson04Demo02Test.java @@ -0,0 +1,92 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson04; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.rule.AbstractRuleTest; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class ClaimValidationLesson04Demo02Test extends AbstractRuleTest { + + @Autowired + @Qualifier("claimValidationLesson04Demo02") + private ClaimValidation claimValidation; + + @Test + public void validateClaim(){ + //rule "Valid Claims" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + claimDto.setStatus(Status.PENDING); + + assertEquals(Status.PENDING, claimDto.getStatus()); + + PolicyDto policyDto = getPolicy("P-101","John Smith",130,130000,"Paid"); + + claimValidation.validateClaim(claimDto, policyDto); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.APPROVED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 1 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } + + @Test + public void validateClaimPayoutIssue(){ + //rule "Issue Payout" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + claimDto.setStatus(Status.APPROVED); + + PolicyDto policyDto = getPolicy("P-102","John Smith",130,130000,"Paid"); + + claimValidation.validateClaim(claimDto, policyDto); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 2 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } + + @Test + public void validateClaimExceedCoverage(){ + //rule "Invalidate claim that exceeds coverage" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),1239900000D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-101","John Smith",130,1300,"Paid"); + + claimValidation.validateClaim(claimDto, policyDto); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.DENIED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 3 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } + + @Test + public void validateClaimWithUnpaidPremium(){ + //rule "Invalidate claim with unpaid premiums" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),123D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-101","John Smith",130,1300000,"Unpaid"); + + claimValidation.validateClaim(claimDto, policyDto); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.DENIED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 4 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/ClaimValidationLesson04Demo03Test.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/ClaimValidationLesson04Demo03Test.java new file mode 100644 index 0000000..cca0f1e --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/ClaimValidationLesson04Demo03Test.java @@ -0,0 +1,118 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson04; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.rule.AbstractRuleTest; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + +public class ClaimValidationLesson04Demo03Test extends AbstractRuleTest { + + @Autowired + @Qualifier("claimValidationLesson04Demo03") + private ClaimValidation claimValidation; + + @Test + public void validateClaim(){ + //rule "Valid Claims" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + claimDto.setStatus(Status.PENDING); + + claimValidation.validateClaim(claimDto, null,"valid-claim"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.APPROVED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 1 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } + + @Test + public void validateClaimWrongPolicy(){ + //rule "Invalidate claim without matching policy" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-102","John Smith",130,130000,"Paid"); + + claimValidation.validateClaim(claimDto, policyDto,"invalid-claim-wrong-policy"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.DENIED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 2 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + + } + + @Test + public void validateClaimExceedCoverage(){ + //rule "Invalidate claim that exceeds coverage" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),1239900000D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-101","John Smith",130,1300,"Paid"); + + claimValidation.validateClaim(claimDto, policyDto,"invalid-claim"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.DENIED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 3 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } + + @Test + public void validateClaimExceedCoverageWrongPolicy(){ + //rule "Invalidate claim that exceeds coverage" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),1239900000D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-130","John Smith",130,1300,"Paid"); + + claimValidation.validateClaim(claimDto, policyDto,"invalid-claim"); + assertNotNull(claimDto.getStatus()); + assertNull(claimDto.getReason()); + + } + + @Test + public void validateClaimWithUnpaidPremium(){ + //rule "Invalidate claim with unpaid premiums" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),123D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-101","John Smith",130,1300000,"Unpaid"); + + claimValidation.validateClaim(claimDto, policyDto,"invalid-claim-unpaid-premiums"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.DENIED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 4 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + + } + + @Test + public void validateClaimWithUnpaidPremiumWrongPolicy(){ + //rule "Invalidate claim with unpaid premiums" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),123D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-151","John Smith",130,1300000,"Unpaid"); + + claimValidation.validateClaim(claimDto, policyDto,"invalid-claim-unpaid-premiums"); + assertNotNull(claimDto.getStatus()); + assertNull(claimDto.getReason()); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/ClaimValidationLesson04Demo04Test.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/ClaimValidationLesson04Demo04Test.java new file mode 100644 index 0000000..753187c --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/ClaimValidationLesson04Demo04Test.java @@ -0,0 +1,118 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson04; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.rule.AbstractRuleTest; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + +public class ClaimValidationLesson04Demo04Test extends AbstractRuleTest { + + @Autowired + @Qualifier("claimValidationLesson04Demo04") + private ClaimValidation claimValidation; + + @Test + public void validateClaim(){ + //rule "Valid Claims" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + claimDto.setStatus(Status.PENDING); + + claimValidation.validateClaim(claimDto, null,"claim-validation"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.APPROVED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 1 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } + + @Test + public void validateClaimWrongPolicy(){ + //rule "Invalidate claim without matching policy" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-102","John Smith",130,130000,"Paid"); + + claimValidation.validateClaim(claimDto, policyDto,"claim-validation-wrong-policy"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.DENIED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 2 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + + } + + @Test + public void validateClaimExceedCoverage(){ + //rule "Invalidate claim that exceeds coverage" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),1239900000D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-101","John Smith",130,1300,"Paid"); + + claimValidation.validateClaim(claimDto, policyDto,"claim-validation-coverage"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.DENIED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 3 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } + + @Test + public void validateClaimExceedCoverageWrongPolicy(){ + //rule "Invalidate claim that exceeds coverage" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),1239900000D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-130","John Smith",130,1300,"Paid"); + + claimValidation.validateClaim(claimDto, policyDto,"claim-validation-coverage"); + assertNotNull(claimDto.getStatus()); + assertNull(claimDto.getReason()); + + } + + @Test + public void validateClaimWithUnpaidPremium(){ + //rule "Invalidate claim with unpaid premiums" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),123D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-101","John Smith",130,1300000,"Unpaid"); + + claimValidation.validateClaim(claimDto, policyDto,"claim-validation-unpaid-premiums"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.DENIED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 4 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + + } + + @Test + public void validateClaimWithUnpaidPremiumWrongPolicy(){ + //rule "Invalidate claim with unpaid premiums" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),123D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-151","John Smith",130,1300000,"Unpaid"); + + claimValidation.validateClaim(claimDto, policyDto,"claim-validation-unpaid-premiums"); + assertNotNull(claimDto.getStatus()); + assertNull(claimDto.getReason()); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/ClaimValidationLesson04Demo05Test.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/ClaimValidationLesson04Demo05Test.java new file mode 100644 index 0000000..794f07c --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/ClaimValidationLesson04Demo05Test.java @@ -0,0 +1,118 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson04; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.rule.AbstractRuleTest; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + +public class ClaimValidationLesson04Demo05Test extends AbstractRuleTest { + + @Autowired + @Qualifier("claimValidationLesson04Demo05") + private ClaimValidation claimValidation; + + @Test + public void validateClaim(){ + //rule "Valid Claims" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + claimDto.setStatus(Status.PENDING); + + claimValidation.validateClaim(claimDto, null,"claim-validation"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.APPROVED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 1 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } + + @Test + public void validateClaimWrongPolicy(){ + //rule "Invalidate claim without matching policy" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-102","John Smith",130,130000,"Paid"); + + claimValidation.validateClaim(claimDto, policyDto,"claim-validation-wrong-policy"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.DENIED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 2 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + + } + + @Test + public void validateClaimExceedCoverage(){ + //rule "Invalidate claim that exceeds coverage" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),1239900000D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-101","John Smith",130,1300,"Paid"); + + claimValidation.validateClaim(claimDto, policyDto,"claim-validation-coverage"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.DENIED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 3 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } + + @Test + public void validateClaimExceedCoverageWrongPolicy(){ + //rule "Invalidate claim that exceeds coverage" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),1239900000D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-130","John Smith",130,1300,"Paid"); + + claimValidation.validateClaim(claimDto, policyDto,"claim-validation-coverage"); + assertNotNull(claimDto.getStatus()); + assertNull(claimDto.getReason()); + + } + + @Test + public void validateClaimWithUnpaidPremium(){ + //rule "Invalidate claim with unpaid premiums" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),123D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-101","John Smith",130,1300000,"Unpaid"); + + claimValidation.validateClaim(claimDto, policyDto,"claim-validation-unpaid-premiums"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.DENIED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 4 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + + } + + @Test + public void validateClaimWithUnpaidPremiumWrongPolicy(){ + //rule "Invalidate claim with unpaid premiums" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),123D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-151","John Smith",130,1300000,"Unpaid"); + + claimValidation.validateClaim(claimDto, policyDto,"claim-validation-unpaid-premiums"); + assertNotNull(claimDto.getStatus()); + assertNull(claimDto.getReason()); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/PayoutLesson4Demo0202Test.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/PayoutLesson4Demo0202Test.java new file mode 100644 index 0000000..60d9fdd --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/PayoutLesson4Demo0202Test.java @@ -0,0 +1,38 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson04; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.rule.AbstractRuleTest; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class PayoutLesson4Demo0202Test extends AbstractRuleTest { + + @Autowired + @Qualifier("payoutLesson4Demo0202") + private ClaimValidation claimValidation; + + @Test + public void validateClaim(){ + //rule "Issue Payout" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + claimDto.setStatus(Status.APPROVED); + + PolicyDto policyDto = getPolicy("P-101","John Smith",130,130000,"Paid"); + claimValidation.validateClaim(claimDto, policyDto); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.APPROVED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 1 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/PayoutLesson4Demo0302Test.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/PayoutLesson4Demo0302Test.java new file mode 100644 index 0000000..ba83de5 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/PayoutLesson4Demo0302Test.java @@ -0,0 +1,38 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson04; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.rule.AbstractRuleTest; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class PayoutLesson4Demo0302Test extends AbstractRuleTest { + + @Autowired + @Qualifier("payoutLesson4Demo0302") + private ClaimValidation claimValidation; + + @Test + public void validateClaim(){ + //rule "Issue Payout" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + claimDto.setStatus(Status.APPROVED); + + PolicyDto policyDto = getPolicy("P-101","John Smith",130,130000,"Paid"); + claimValidation.validateClaim(claimDto, policyDto, "issue-payout"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.APPROVED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 1 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/PayoutLesson4Demo0402Test.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/PayoutLesson4Demo0402Test.java new file mode 100644 index 0000000..2fedbdd --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/PayoutLesson4Demo0402Test.java @@ -0,0 +1,38 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson04; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.rule.AbstractRuleTest; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class PayoutLesson4Demo0402Test extends AbstractRuleTest { + + @Autowired + @Qualifier("payoutLesson4Demo0402") + private ClaimValidation claimValidation; + + @Test + public void validateClaim(){ + //rule "Issue Payout" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + claimDto.setStatus(Status.APPROVED); + + PolicyDto policyDto = getPolicy("P-101","John Smith",130,130000,"Paid"); + claimValidation.validateClaim(claimDto, policyDto, "issue-payout"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.APPROVED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 1 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/PayoutLesson4Demo0502Test.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/PayoutLesson4Demo0502Test.java new file mode 100644 index 0000000..4f49894 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson04/PayoutLesson4Demo0502Test.java @@ -0,0 +1,38 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson04; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.rule.AbstractRuleTest; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class PayoutLesson4Demo0502Test extends AbstractRuleTest { + + @Autowired + @Qualifier("payoutLesson4Demo0502") + private ClaimValidation claimValidation; + + @Test + public void validateClaim(){ + //rule "Issue Payout" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + claimDto.setStatus(Status.APPROVED); + + PolicyDto policyDto = getPolicy("P-101","John Smith",130,130000,"Paid"); + claimValidation.validateClaim(claimDto, policyDto, "issue-payout"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.APPROVED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 1 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson05/ClaimValidationLesson05Demo01Test.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson05/ClaimValidationLesson05Demo01Test.java new file mode 100644 index 0000000..15ff5e5 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson05/ClaimValidationLesson05Demo01Test.java @@ -0,0 +1,105 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson05; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.rule.AbstractRuleTest; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class ClaimValidationLesson05Demo01Test extends AbstractRuleTest { + + @Autowired + @Qualifier("claimValidationLesson05Demo01") + private ClaimValidation claimValidation; + + @Test + public void validateClaim(){ + //"Valid Claims" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + claimDto.setStatus(Status.PENDING); + + claimValidation.validateClaim(claimDto, null, "valid-claims"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.APPROVED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 1 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } + + @Test + public void validateClaimPayoutIssue(){ + //rule "Issue Payout" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + claimDto.setStatus(Status.APPROVED); + + PolicyDto policyDto = getPolicy("P-102","John Smith",130,130000,"Paid"); + + claimValidation.validateClaim(claimDto, policyDto,"issue-payout"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals("New Payout: Payout(policyNumber=P-101, claimAmount=12399.0) Issued", claimDto.getReason()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 2 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } + + @Test + public void validateClaimInvalidPolicy(){ + //rule "Issue Payout" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + claimDto.setStatus(Status.APPROVED); + + PolicyDto policyDto = getPolicy("P-102","John Smith",130,130000,"Paid"); + + claimValidation.validateClaim(claimDto, policyDto,"invalid-policy"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 3 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } + + @Test + public void validateClaimExceedCoverage(){ + //rule "Invalidate claim that exceeds coverage" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),1239900000D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-101","John Smith",130,1300,"Paid"); + + claimValidation.validateClaim(claimDto, policyDto,"exceed-coverage"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.DENIED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 4 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } + + @Test + public void validateClaimWithUnpaidPremium(){ + //rule "Invalidate claim with unpaid premiums" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),123D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-101","John Smith",130,1300000,"Unpaid"); + + claimValidation.validateClaim(claimDto, policyDto,"unpaid-premiums"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.DENIED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 5 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson05/ClaimValidationLesson05Demo02Test.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson05/ClaimValidationLesson05Demo02Test.java new file mode 100644 index 0000000..20cf677 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson05/ClaimValidationLesson05Demo02Test.java @@ -0,0 +1,86 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson05; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.rule.AbstractRuleTest; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class ClaimValidationLesson05Demo02Test extends AbstractRuleTest { + + + @Autowired + @Qualifier("claimValidationLesson05Demo02") + private ClaimValidation claimValidation; + + @Test + public void validateClaim(){ + //"Valid Claims" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + claimDto.setStatus(Status.PENDING); + + claimValidation.validateClaim(claimDto, null, "valid-claims"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 1 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } + + @Test + public void validateClaimInvalidPolicy(){ + //rule "Issue Payout" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + claimDto.setStatus(Status.APPROVED); + + PolicyDto policyDto = getPolicy("P-102","John Smith",130,130000,"Paid"); + + claimValidation.validateClaim(claimDto, policyDto,"invalid-policy"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 2 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } + + @Test + public void validateClaimExceedCoverage(){ + //rule "Invalidate claim that exceeds coverage" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),1239900000D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-101","John Smith",130,1300,"Paid"); + + claimValidation.validateClaim(claimDto, policyDto,"exceed-coverage"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 3 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } + + @Test + public void validateClaimWithUnpaidPremium(){ + //rule "Invalidate claim with unpaid premiums" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),123D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-101","John Smith",130,1300000,"Unpaid"); + + claimValidation.validateClaim(claimDto, policyDto,"unpaid-premiums"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 4 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson05/ClaimValidationLesson05Demo03Test.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson05/ClaimValidationLesson05Demo03Test.java new file mode 100644 index 0000000..f8ebcb2 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson05/ClaimValidationLesson05Demo03Test.java @@ -0,0 +1,84 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson05; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.rule.AbstractRuleTest; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class ClaimValidationLesson05Demo03Test extends AbstractRuleTest { + + @Autowired + @Qualifier("claimValidationLesson05Demo03") + private ClaimValidation claimValidation; + + @Test + public void validateClaim(){ + //"Valid Claims" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + claimDto.setStatus(Status.PENDING); + + claimValidation.validateClaim(claimDto, null, "valid-claims"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 1 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } + + @Test + public void validateClaimInvalidPolicy(){ + //rule "Issue Payout" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + claimDto.setStatus(Status.APPROVED); + + PolicyDto policyDto = getPolicy("P-102","John Smith",130,130000,"Paid"); + + claimValidation.validateClaim(claimDto, policyDto,"invalid-policy"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 2 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } + + @Test + public void validateClaimExceedCoverage(){ + //rule "Invalidate claim that exceeds coverage" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),1239900000D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-101","John Smith",130,1300,"Paid"); + + claimValidation.validateClaim(claimDto, policyDto,"exceed-coverage"); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 3 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } + + @Test + public void validateClaimWithUnpaidPremium(){ + //rule "Invalidate claim with unpaid premiums" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),123D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-101","John Smith",130,1300000,"Unpaid"); + + claimValidation.validateClaim(claimDto, policyDto,"unpaid-premiums"); + assertNotNull(claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 4 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson05/ClaimValidationLesson05Demo04Test.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson05/ClaimValidationLesson05Demo04Test.java new file mode 100644 index 0000000..b32bd6d --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson05/ClaimValidationLesson05Demo04Test.java @@ -0,0 +1,53 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson05; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.rule.AbstractRuleTest; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class ClaimValidationLesson05Demo04Test extends AbstractRuleTest { + + @Autowired + @Qualifier("claimValidationLesson05Demo04") + private ClaimValidation claimValidation; + + @Test + public void validateClaimInvalidPolicy(){ + //rule "Issue Payout" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + claimDto.setStatus(Status.APPROVED); + + PolicyDto policyDto = getPolicy("P-102","John Smith",130,130000,"Paid"); + + claimValidation.validateClaim(claimDto, policyDto); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 1 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } + + @Test + public void validateClaimExceedCoverage() { + //rule "Invalidate claim that exceeds coverage" + ClaimDto claimDto = getClaim("John Smith", "P-101", LocalDate.now(), 1239900000D); + claimDto.setStatus(Status.VALID); + + PolicyDto policyDto = getPolicy("P-101", "John Smith", 130, 1300, "Paid"); + + claimValidation.validateClaim(claimDto, policyDto); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 2 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson05/PayoutLesson5Demo0202Test.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson05/PayoutLesson5Demo0202Test.java new file mode 100644 index 0000000..b850b17 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson05/PayoutLesson5Demo0202Test.java @@ -0,0 +1,38 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson05; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.rule.AbstractRuleTest; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class PayoutLesson5Demo0202Test extends AbstractRuleTest { + + @Autowired + @Qualifier("payoutLesson5Demo0202") + private ClaimValidation claimValidation; + + @Test + public void validateClaim(){ + //rule "Issue Payout" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + claimDto.setStatus(Status.APPROVED); + + PolicyDto policyDto = getPolicy("P-101","John Smith",130,130000,"Paid"); + claimValidation.validateClaim(claimDto, policyDto); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.APPROVED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 1 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson05/PayoutLesson5Demo0302Test.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson05/PayoutLesson5Demo0302Test.java new file mode 100644 index 0000000..017e7f1 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson05/PayoutLesson5Demo0302Test.java @@ -0,0 +1,38 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson05; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.rule.AbstractRuleTest; +import africa.skunkworks.training.drools.insurance.rule.ClaimValidation; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class PayoutLesson5Demo0302Test extends AbstractRuleTest { + + @Autowired + @Qualifier("payoutLesson5Demo0302") + private ClaimValidation claimValidation; + + @Test + public void validateClaim(){ + //rule "Issue Payout" + ClaimDto claimDto = getClaim("John Smith","P-101", LocalDate.now(),12399D); + claimDto.setStatus(Status.APPROVED); + + PolicyDto policyDto = getPolicy("P-101","John Smith",130,130000,"Paid"); + claimValidation.validateClaim(claimDto, policyDto); + assertNotNull(claimDto.getStatus()); + assertNotNull(claimDto.getReason()); + assertEquals(Status.APPROVED, claimDto.getStatus()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 1 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(claimDto.getReason()); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson05/PolicyValidationLesson4Demo0303Test.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson05/PolicyValidationLesson4Demo0303Test.java new file mode 100644 index 0000000..7dde63e --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/lesson05/PolicyValidationLesson4Demo0303Test.java @@ -0,0 +1,32 @@ +package africa.skunkworks.training.drools.insurance.rule.lesson05; + +import africa.skunkworks.training.drools.insurance.domain.dto.InvalidPolicy; +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.rule.AbstractRuleTest; +import africa.skunkworks.training.drools.insurance.rule.PolicyValidation; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class PolicyValidationLesson4Demo0303Test extends AbstractRuleTest { + + @Autowired + @Qualifier("policyValidationLesson5Demo0303") + private PolicyValidation policyValidation; + + @Test + public void validatePolicy(){ + + PolicyDto policyDto = getPolicy("P-100","John Smith",199999,200000,"Unpaid"); + InvalidPolicy invalidPolicy = new InvalidPolicy(PolicyDto.builder().build()); + + policyValidation.validatePolicy(policyDto,invalidPolicy); + assertNotNull(policyDto.getReason()); + + System.out.println("++++++++++++++++++++++++++++++++++++++++ SCENARIO 3 ++++++++++++++++++++++++++++++++++++++++++++++"); + System.out.println(policyDto.getReason()); + + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/policy/PolicyValidationRuleTest.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/policy/PolicyValidationRuleTest.java new file mode 100644 index 0000000..60c2a03 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-rule/src/test/java/africa/skunkworks/training/drools/insurance/rule/policy/PolicyValidationRuleTest.java @@ -0,0 +1,26 @@ +package africa.skunkworks.training.drools.insurance.rule.policy; + +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.rule.AbstractRuleTest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class PolicyValidationRuleTest extends AbstractRuleTest { + + @Autowired + private PolicyValidationRule policyValidationRule; + + @Test + public void validatePolicy(){ + + PolicyDto policyDto = getPolicy("P-101","Some Name",19191,200,"Unpaid"); + + policyValidationRule.validatePolicy(policyDto); + + assertNotNull(policyDto); + assertNotNull(policyDto.getReason()); + + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/ApplicationService.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/ApplicationService.java new file mode 100644 index 0000000..263b7b0 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/ApplicationService.java @@ -0,0 +1,10 @@ +package africa.skunkworks.training.drools.insurance.service; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; + +import java.util.List; + +public interface ApplicationService { + + List validateAllApplications(); +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/ClaimValidationService.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/ClaimValidationService.java new file mode 100644 index 0000000..a54d327 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/ClaimValidationService.java @@ -0,0 +1,10 @@ +package africa.skunkworks.training.drools.insurance.service; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; + +import java.util.List; + +public interface ClaimValidationService { + + List validateAllClaims(); +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/PolicyService.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/PolicyService.java new file mode 100644 index 0000000..82d5548 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/PolicyService.java @@ -0,0 +1,10 @@ +package africa.skunkworks.training.drools.insurance.service; + +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; + +import java.util.List; + +public interface PolicyService { + + List validateAllPolicies(); +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/impl/ApplicationServiceImpl.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/impl/ApplicationServiceImpl.java new file mode 100644 index 0000000..e680e55 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/impl/ApplicationServiceImpl.java @@ -0,0 +1,56 @@ +package africa.skunkworks.training.drools.insurance.service.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.service.ApplicationService; +import africa.skunkworks.training.drools.insurance.service.repository.ApplicationRepositoryService; +import africa.skunkworks.training.drools.insurance.service.rule.ApplicationRuleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class ApplicationServiceImpl implements ApplicationService { + + private final ApplicationRepositoryService applicationService; + + + private final ApplicationRuleService applicationRuleService; + + @Autowired + public ApplicationServiceImpl(ApplicationRepositoryService applicationService, ApplicationRuleService applicationRuleService) { + this.applicationService = applicationService; + this.applicationRuleService = applicationRuleService; + } + + + @Override + public List validateAllApplications() { + List applications = new ArrayList<>(); + + applicationService.listAllApplications().forEach(application ->{ + if(application.getIsEmployed()){ + applicationRuleService.validateApplication(application,"not-employed"); + + } + + if(application.getClientAge() < 18){ + applicationRuleService.validateApplication(application,"application-minor"); + } + + if(application.getPec()){ + applicationRuleService.validateApplication(application,"application-pec"); + } + + if(Status.PENDING == application.getStatus()){ + applicationRuleService.validateApplication(application,"valid-application"); + } + + applications.add(application); + + }); + return applications; + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/impl/ClaimValidationServiceImpl.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/impl/ClaimValidationServiceImpl.java new file mode 100644 index 0000000..ae12ac2 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/impl/ClaimValidationServiceImpl.java @@ -0,0 +1,44 @@ +package africa.skunkworks.training.drools.insurance.service.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.service.ClaimValidationService; +import africa.skunkworks.training.drools.insurance.service.repository.ClaimRepositoryService; +import africa.skunkworks.training.drools.insurance.service.rule.ClaimRuleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class ClaimValidationServiceImpl implements ClaimValidationService { + + private final ClaimRuleService claimRuleService; + + private final ClaimRepositoryService claimRepositoryService; + + @Autowired + public ClaimValidationServiceImpl(ClaimRuleService claimRuleService, ClaimRepositoryService claimRepositoryService) { + this.claimRuleService = claimRuleService; + this.claimRepositoryService = claimRepositoryService; + } + + @Override + public List validateAllClaims() { + List claimDtos = new ArrayList<>(); + + claimRepositoryService.listAllClaims().forEach(claim ->{ + if(Status.PENDING == claim.getStatus()){ + claimRuleService.validateClaim(claim, "valid-claim"); + } + + if(Status.APPROVED == claim.getStatus()){ + claimRuleService.validateClaim(claim, "issue-payout"); + } + + claimDtos.add(claim); + }); + return claimDtos; + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/impl/PolicyServiceImpl.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/impl/PolicyServiceImpl.java new file mode 100644 index 0000000..30f4da6 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/impl/PolicyServiceImpl.java @@ -0,0 +1,38 @@ +package africa.skunkworks.training.drools.insurance.service.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.service.PolicyService; +import africa.skunkworks.training.drools.insurance.service.repository.PolicyRepositoryService; +import africa.skunkworks.training.drools.insurance.service.rule.PolicyRuleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class PolicyServiceImpl implements PolicyService { + + + private final PolicyRepositoryService policyRepositoryService; + + private final PolicyRuleService policyRuleService; + + @Autowired + public PolicyServiceImpl(PolicyRepositoryService policyRepositoryService, PolicyRuleService policyRuleService) { + this.policyRepositoryService = policyRepositoryService; + this.policyRuleService = policyRuleService; + } + + @Override + public List validateAllPolicies() { + List policies = new ArrayList<>(); + + policyRepositoryService.listAllPolicies().forEach(policy ->{ + policyRuleService.validatePolicy(policy); + policies.add(policy); + }); + + return policies; + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/ApplicationService.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/ApplicationRepositoryService.java similarity index 82% rename from Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/ApplicationService.java rename to Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/ApplicationRepositoryService.java index f3f9e7c..aaa098e 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/ApplicationService.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/ApplicationRepositoryService.java @@ -4,7 +4,7 @@ import java.util.List; -public interface ApplicationService { +public interface ApplicationRepositoryService { List listAllApplications(); } diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/ClaimService.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/ClaimRepositoryService.java similarity index 83% rename from Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/ClaimService.java rename to Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/ClaimRepositoryService.java index c6b5449..ecb9eb9 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/ClaimService.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/ClaimRepositoryService.java @@ -4,7 +4,7 @@ import java.util.List; -public interface ClaimService { +public interface ClaimRepositoryService { List listAllClaims(); } diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/PolicyService.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/PolicyRepositoryService.java similarity index 83% rename from Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/PolicyService.java rename to Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/PolicyRepositoryService.java index 7947220..748b2aa 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/PolicyService.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/PolicyRepositoryService.java @@ -4,7 +4,7 @@ import java.util.List; -public interface PolicyService { +public interface PolicyRepositoryService { List listAllPolicies(); } diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/impl/ApplicationServiceImpl.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/impl/ApplicationRepositoryServiceImpl.java similarity index 84% rename from Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/impl/ApplicationServiceImpl.java rename to Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/impl/ApplicationRepositoryServiceImpl.java index ec6358f..564bcef 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/impl/ApplicationServiceImpl.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/impl/ApplicationRepositoryServiceImpl.java @@ -3,7 +3,7 @@ import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; import africa.skunkworks.training.drools.insurance.domain.repository.Client; import africa.skunkworks.training.drools.insurance.repository.ApplicationRepository; -import africa.skunkworks.training.drools.insurance.service.repository.ApplicationService; +import africa.skunkworks.training.drools.insurance.service.repository.ApplicationRepositoryService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -13,12 +13,12 @@ import java.util.List; @Service -public class ApplicationServiceImpl implements ApplicationService { +public class ApplicationRepositoryServiceImpl implements ApplicationRepositoryService { private final ApplicationRepository applicationRepository; @Autowired - public ApplicationServiceImpl(ApplicationRepository applicationRepository) { + public ApplicationRepositoryServiceImpl(ApplicationRepository applicationRepository) { this.applicationRepository = applicationRepository; } @@ -38,6 +38,8 @@ public List listAllApplications() { .bmi(Integer.valueOf(application.getBmi())) .pec(application.getPec()) .risk(application.getRisk()) + .reason(application.getReason()) + .status(application.getStatus()) .build() ); }); diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/impl/ClaimServiceImpl.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/impl/ClaimRepositoryServiceImpl.java similarity index 80% rename from Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/impl/ClaimServiceImpl.java rename to Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/impl/ClaimRepositoryServiceImpl.java index 9ac481a..4bb9e27 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/impl/ClaimServiceImpl.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/impl/ClaimRepositoryServiceImpl.java @@ -2,7 +2,7 @@ import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; import africa.skunkworks.training.drools.insurance.repository.ClaimRepository; -import africa.skunkworks.training.drools.insurance.service.repository.ClaimService; +import africa.skunkworks.training.drools.insurance.service.repository.ClaimRepositoryService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -10,13 +10,13 @@ import java.util.List; @Service -public class ClaimServiceImpl implements ClaimService { +public class ClaimRepositoryServiceImpl implements ClaimRepositoryService { private final ClaimRepository claimRepository; @Autowired - public ClaimServiceImpl(ClaimRepository claimRepository) { + public ClaimRepositoryServiceImpl(ClaimRepository claimRepository) { this.claimRepository = claimRepository; } @@ -31,6 +31,8 @@ public List listAllClaims() { .claimAmount(claim.getClaimAmount().doubleValue()) .dateOfClaim(claim.getDateOfClaim()) .policyNumber(claim.getPolicy().getPolicyNumber()) + .reason(claim.getReason()) + .status(claim.getStatus()) .build() ); }); diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/impl/PolicyServiceImpl.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/impl/PolicyRepositoryServiceImpl.java similarity index 83% rename from Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/impl/PolicyServiceImpl.java rename to Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/impl/PolicyRepositoryServiceImpl.java index f65b0a5..94d100d 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/impl/PolicyServiceImpl.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/repository/impl/PolicyRepositoryServiceImpl.java @@ -2,18 +2,18 @@ import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; import africa.skunkworks.training.drools.insurance.repository.PolicyRepository; -import africa.skunkworks.training.drools.insurance.service.repository.PolicyService; +import africa.skunkworks.training.drools.insurance.service.repository.PolicyRepositoryService; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; @Service -public class PolicyServiceImpl implements PolicyService { +public class PolicyRepositoryServiceImpl implements PolicyRepositoryService { private final PolicyRepository policyRepository; - public PolicyServiceImpl(PolicyRepository policyRepository) { + public PolicyRepositoryServiceImpl(PolicyRepository policyRepository) { this.policyRepository = policyRepository; } @@ -29,7 +29,7 @@ public List listAllPolicies() { .paymentStatus(policy.getStatus()) .premium(policy.getPremium().intValue()) .coverage(policy.getCoverage().intValue()) - .reason("N/A") + .reason(policy.getReason()) .build() ); }); diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/rule/ApplicationRuleService.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/rule/ApplicationRuleService.java new file mode 100644 index 0000000..40b8081 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/rule/ApplicationRuleService.java @@ -0,0 +1,8 @@ +package africa.skunkworks.training.drools.insurance.service.rule; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; + +public interface ApplicationRuleService { + + void validateApplication(ApplicationDto applicationDto, String agendaGroup); +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/rule/ClaimRuleService.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/rule/ClaimRuleService.java new file mode 100644 index 0000000..4abb797 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/rule/ClaimRuleService.java @@ -0,0 +1,8 @@ +package africa.skunkworks.training.drools.insurance.service.rule; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; + +public interface ClaimRuleService { + + void validateClaim(ClaimDto claimDto, String agendaGroup); +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/rule/PolicyRuleService.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/rule/PolicyRuleService.java new file mode 100644 index 0000000..5961787 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/rule/PolicyRuleService.java @@ -0,0 +1,10 @@ +package africa.skunkworks.training.drools.insurance.service.rule; + +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; + +public interface PolicyRuleService { + + void validatePolicy(PolicyDto policyDto); + + +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/rule/impl/ApplicationRuleServiceImpl.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/rule/impl/ApplicationRuleServiceImpl.java new file mode 100644 index 0000000..f0a5607 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/rule/impl/ApplicationRuleServiceImpl.java @@ -0,0 +1,22 @@ +package africa.skunkworks.training.drools.insurance.service.rule.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.rule.application.ApplicationValidationRule; +import africa.skunkworks.training.drools.insurance.service.rule.ApplicationRuleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class ApplicationRuleServiceImpl implements ApplicationRuleService { + private final ApplicationValidationRule applicationValidationRule; + + @Autowired + public ApplicationRuleServiceImpl(ApplicationValidationRule applicationValidationRule) { + this.applicationValidationRule = applicationValidationRule; + } + + @Override + public void validateApplication(ApplicationDto applicationDto, String agendaGroup) { + applicationValidationRule.validateApplication(applicationDto,agendaGroup); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/rule/impl/ClaimRuleServiceImpl.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/rule/impl/ClaimRuleServiceImpl.java new file mode 100644 index 0000000..a3de154 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/rule/impl/ClaimRuleServiceImpl.java @@ -0,0 +1,23 @@ +package africa.skunkworks.training.drools.insurance.service.rule.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.rule.claim.ClaimValidationRule; +import africa.skunkworks.training.drools.insurance.service.rule.ClaimRuleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class ClaimRuleServiceImpl implements ClaimRuleService { + private final ClaimValidationRule claimValidationRule; + + @Autowired + public ClaimRuleServiceImpl(ClaimValidationRule claimValidationRule) { + this.claimValidationRule = claimValidationRule; + } + + @Override + public void validateClaim(ClaimDto claimDto, String agendaGroup) { + claimValidationRule.validateClaim(claimDto, agendaGroup); + + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/rule/impl/PolicyRuleServiceImpl.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/rule/impl/PolicyRuleServiceImpl.java new file mode 100644 index 0000000..1daed0e --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/main/java/africa/skunkworks/training/drools/insurance/service/rule/impl/PolicyRuleServiceImpl.java @@ -0,0 +1,23 @@ +package africa.skunkworks.training.drools.insurance.service.rule.impl; + +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.rule.policy.PolicyValidationRule; +import africa.skunkworks.training.drools.insurance.service.rule.PolicyRuleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class PolicyRuleServiceImpl implements PolicyRuleService { + + private final PolicyValidationRule policyValidationRule; + + @Autowired + public PolicyRuleServiceImpl(PolicyValidationRule policyValidationRule) { + this.policyValidationRule = policyValidationRule; + } + + @Override + public void validatePolicy(PolicyDto policyDto) { + policyValidationRule.validatePolicy(policyDto); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/ApplicationServiceTest.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/ApplicationServiceTest.java new file mode 100644 index 0000000..bfce042 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/ApplicationServiceTest.java @@ -0,0 +1,34 @@ +package africa.skunkworks.training.drools.insurance.service; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class ApplicationServiceTest extends AbstractServiceTest{ + + @Autowired + private ApplicationService applicationService; + + @Test + public void validateAllApplications(){ + + List applications = applicationService.validateAllApplications(); + assertNotNull(applications); + assertFalse(applications.isEmpty()); + assertEquals(10,applications.size()); + + ApplicationDto application = applications.get(0); + assertNotNull(application); + assertEquals("A-100", application.getApplicationNumber()); + assertEquals(Status.DENIED, application.getStatus()); + + } + +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/ClaimValidationServiceTest.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/ClaimValidationServiceTest.java new file mode 100644 index 0000000..4882945 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/ClaimValidationServiceTest.java @@ -0,0 +1,25 @@ +package africa.skunkworks.training.drools.insurance.service; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class ClaimValidationServiceTest extends AbstractServiceTest{ + + @Autowired + private ClaimValidationService claimValidationService; + + @Test + public void validateAllClaims(){ + List claimDtos = claimValidationService.validateAllClaims(); + assertNotNull(claimDtos); + assertFalse(claimDtos.isEmpty()); + assertEquals(5, claimDtos.size()); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/PolicyServiceTest.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/PolicyServiceTest.java new file mode 100644 index 0000000..7b8ba3e --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/PolicyServiceTest.java @@ -0,0 +1,25 @@ +package africa.skunkworks.training.drools.insurance.service; + +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class PolicyServiceTest extends AbstractServiceTest{ + + @Autowired + private PolicyService policyService; + + @Test + public void validateAllPolicies(){ + List policies = policyService.validateAllPolicies(); + assertNotNull(policies); + assertFalse(policies.isEmpty()); + assertEquals(10, policies.size()); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/repository/ApplicationServiceTest.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/repository/ApplicationRepositoryServiceTest.java similarity index 93% rename from Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/repository/ApplicationServiceTest.java rename to Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/repository/ApplicationRepositoryServiceTest.java index 5fa744e..d0ea3cc 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/repository/ApplicationServiceTest.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/repository/ApplicationRepositoryServiceTest.java @@ -16,13 +16,13 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -public class ApplicationServiceTest extends AbstractServiceTest { +public class ApplicationRepositoryServiceTest extends AbstractServiceTest { @MockBean private ApplicationRepository applicationRepository; @Autowired - private ApplicationService applicationService; + private ApplicationRepositoryService applicationService; @Test public void listAllApplications(){ diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/repository/ClaimServiceTest.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/repository/ClaimRepositoryServiceTest.java similarity index 93% rename from Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/repository/ClaimServiceTest.java rename to Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/repository/ClaimRepositoryServiceTest.java index 9203c11..35994c9 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/repository/ClaimServiceTest.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/repository/ClaimRepositoryServiceTest.java @@ -4,7 +4,6 @@ import africa.skunkworks.training.drools.insurance.domain.repository.Claim; import africa.skunkworks.training.drools.insurance.repository.ClaimRepository; import africa.skunkworks.training.drools.insurance.service.AbstractServiceTest; -import org.checkerframework.checker.units.qual.C; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.mock.mockito.MockBean; @@ -19,13 +18,13 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -public class ClaimServiceTest extends AbstractServiceTest { +public class ClaimRepositoryServiceTest extends AbstractServiceTest { @MockBean private ClaimRepository claimRepository; @Autowired - private ClaimService claimService; + private ClaimRepositoryService claimService; @Test public void listAllClaims(){ diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/repository/PolicyServiceTest.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/repository/PolicyServiceTest.java index 45ca347..0e2c469 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/repository/PolicyServiceTest.java +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/repository/PolicyServiceTest.java @@ -24,7 +24,7 @@ public class PolicyServiceTest extends AbstractServiceTest { private PolicyRepository policyRepository; @Autowired - private PolicyService policyService; + private PolicyRepositoryService policyService; @Test public void listAllPolicies(){ diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/rule/ApplicationRuleServiceTest.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/rule/ApplicationRuleServiceTest.java new file mode 100644 index 0000000..e534d48 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/rule/ApplicationRuleServiceTest.java @@ -0,0 +1,47 @@ +package africa.skunkworks.training.drools.insurance.service.rule; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.rule.application.ApplicationValidationRule; +import africa.skunkworks.training.drools.insurance.service.AbstractServiceTest; +import org.apache.commons.lang.StringUtils; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; + +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.verify; + +public class ApplicationRuleServiceTest extends AbstractServiceTest { + + @MockBean + private ApplicationValidationRule applicationValidationRule; + + @Autowired + private ApplicationRuleService applicationRuleService; + + @Test + public void validateApplication(){ + ApplicationDto applicationDto = getApplication(); + + doNothing().when(applicationValidationRule).validateApplication(applicationDto,"valid-application"); + + applicationRuleService.validateApplication(applicationDto, "valid-application"); + + verify(applicationValidationRule).validateApplication(applicationDto,"valid-application"); + } + + private ApplicationDto getApplication(){ + return ApplicationDto.builder() + .applicationNumber("A-100") + .bmi(24) + .pec(Boolean.FALSE) + .isEmployed(Boolean.TRUE) + .risk("Medium") + .clientAge(30) + .isSmoker(Boolean.FALSE) + .clientIdentificationNumber("ID-100") + .clientName("Quentin Tarantino") + .reason(StringUtils.EMPTY) + .build(); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/rule/ClaimRuleServiceTest.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/rule/ClaimRuleServiceTest.java new file mode 100644 index 0000000..48eb17f --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/rule/ClaimRuleServiceTest.java @@ -0,0 +1,43 @@ +package africa.skunkworks.training.drools.insurance.service.rule; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.enums.Status; +import africa.skunkworks.training.drools.insurance.rule.claim.ClaimValidationRule; +import africa.skunkworks.training.drools.insurance.service.AbstractServiceTest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; + +import java.time.LocalDate; + +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.verify; + +public class ClaimRuleServiceTest extends AbstractServiceTest { + + @MockBean + private ClaimValidationRule claimValidationRule; + + @Autowired + private ClaimRuleService claimRuleService; + + @Test + public void validateClaim(){ + ClaimDto claimDto = getClaim(); + + doNothing().when(claimValidationRule).validateClaim(claimDto,"valid-claim"); + + claimRuleService.validateClaim(claimDto, "valid-claim"); + + verify(claimValidationRule).validateClaim(claimDto,"valid-claim"); + } + + private ClaimDto getClaim(){ + return ClaimDto.builder() + .status(Status.PENDING) + .claimAmount(29908D) + .dateOfClaim(LocalDate.now()) + .policyNumber("P-109") + .build(); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/rule/PolicyRuleServiceTest.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/rule/PolicyRuleServiceTest.java new file mode 100644 index 0000000..9adefc1 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/java/africa/skunkworks/training/drools/insurance/service/rule/PolicyRuleServiceTest.java @@ -0,0 +1,41 @@ +package africa.skunkworks.training.drools.insurance.service.rule; + +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.rule.policy.PolicyValidationRule; +import africa.skunkworks.training.drools.insurance.service.AbstractServiceTest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; + +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.verify; + +public class PolicyRuleServiceTest extends AbstractServiceTest { + + @MockBean + private PolicyValidationRule policyValidationRule; + + @Autowired + private PolicyRuleService policyRuleService; + + @Test + public void validatePolicy(){ + PolicyDto policy = getPolicy(); + + doNothing().when(policyValidationRule).validatePolicy(policy); + + policyRuleService.validatePolicy(policy); + + verify(policyValidationRule).validatePolicy(policy); + } + + private PolicyDto getPolicy(){ + return PolicyDto.builder() + .policyNumber("P-100") + .paymentStatus("Unpaid") + .coverage(19000) + .premium(18000) + .clientName("John Wayne") + .build(); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/resources/schema.sql b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/resources/schema.sql index eea3788..5766db3 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/resources/schema.sql +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-service/src/test/resources/schema.sql @@ -37,6 +37,8 @@ CREATE TABLE DROOLS_TRAINING_INSURANCE.APPLICATION( PEC BOOLEAN, RISK VARCHAR(20), BMI VARCHAR(20), + REASON VARCHAR(50) DEFAULT 'N/A', + STATUS VARCHAR(20) DEFAULT 'UNKNOWN', CONSTRAINT APPLICATION_PK PRIMARY KEY (APPLICATION_NUMBER), CONSTRAINT APPLICATION_FK FOREIGN KEY (CLIENT_ID) REFERENCES DROOLS_TRAINING_INSURANCE.CLIENT ); @@ -47,7 +49,8 @@ CREATE TABLE DROOLS_TRAINING_INSURANCE.POLICY( CLIENT_ID VARCHAR(20), PREMIUM NUMERIC (14,4), COVERAGE NUMERIC(14,4), - STATUS VARCHAR(10), + REASON VARCHAR(50) DEFAULT 'N/A', + STATUS VARCHAR(20) DEFAULT 'UNKNOWN', CONSTRAINT POLICY_PK PRIMARY KEY (POLICY_NUMBER), CONSTRAINT POLICY_FK FOREIGN KEY (CLIENT_ID) REFERENCES DROOLS_TRAINING_INSURANCE.CLIENT ); @@ -58,6 +61,8 @@ CREATE TABLE DROOLS_TRAINING_INSURANCE.CLAIM( POLICY_NUMBER VARCHAR(20), DATE_OF_CLAIM DATE, CLAIM_AMOUNT NUMERIC(14,4), + REASON VARCHAR(50) DEFAULT 'N/A', + STATUS VARCHAR(20) DEFAULT 'UNKNOWN', CONSTRAINT CLAIM_PK PRIMARY KEY (CLAIM_ID), CONSTRAINT CLAIM_FK FOREIGN KEY (POLICY_NUMBER) REFERENCES DROOLS_TRAINING_INSURANCE.POLICY ); \ No newline at end of file diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/main/java/africa/skunkworks/training/drools/insurance/web/controller/ApplicationController.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/main/java/africa/skunkworks/training/drools/insurance/web/controller/ApplicationController.java new file mode 100644 index 0000000..8fe4da9 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/main/java/africa/skunkworks/training/drools/insurance/web/controller/ApplicationController.java @@ -0,0 +1,35 @@ +package africa.skunkworks.training.drools.insurance.web.controller; + +import africa.skunkworks.training.drools.insurance.domain.dto.ApplicationDto; +import africa.skunkworks.training.drools.insurance.domain.web.response.Response; +import africa.skunkworks.training.drools.insurance.manager.rule.ApplicationRuleManager; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/application") +@Tag(name = "Application Controller", description = "Application Controller") +public class ApplicationController { + + private final ApplicationRuleManager applicationRuleManager; + + @Autowired + public ApplicationController(ApplicationRuleManager applicationRuleManager) { + this.applicationRuleManager = applicationRuleManager; + } + + @GetMapping("/all") + @Operation(summary = "Fires All Application Rules", description = "Fires All Application Rules", tags = {"Application"}) + public ResponseEntity>> fireApplicationRules(){ + Response> response = applicationRuleManager.fireApplicationRules(); + return new ResponseEntity<>(response, HttpStatus.OK); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/main/java/africa/skunkworks/training/drools/insurance/web/controller/ClaimController.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/main/java/africa/skunkworks/training/drools/insurance/web/controller/ClaimController.java new file mode 100644 index 0000000..d161e5d --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/main/java/africa/skunkworks/training/drools/insurance/web/controller/ClaimController.java @@ -0,0 +1,35 @@ +package africa.skunkworks.training.drools.insurance.web.controller; + +import africa.skunkworks.training.drools.insurance.domain.dto.ClaimDto; +import africa.skunkworks.training.drools.insurance.domain.web.response.Response; +import africa.skunkworks.training.drools.insurance.manager.rule.ClaimRuleManager; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/claim") +@Tag(name = "Claim Controller", description = "Claim Controller") +public class ClaimController { + + private final ClaimRuleManager claimRuleManager; + + @Autowired + public ClaimController(ClaimRuleManager claimRuleManager) { + this.claimRuleManager = claimRuleManager; + } + + @GetMapping("/all") + @Operation(summary = "Fires All Claims Rules", description = "Fires All Claims Rules", tags = {"Claim"}) + public ResponseEntity>> fireClaimRules(){ + Response> response = claimRuleManager.fireClaimRules(); + return new ResponseEntity<>(response, HttpStatus.OK); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/main/java/africa/skunkworks/training/drools/insurance/web/controller/PolicyController.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/main/java/africa/skunkworks/training/drools/insurance/web/controller/PolicyController.java new file mode 100644 index 0000000..4bfe588 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/main/java/africa/skunkworks/training/drools/insurance/web/controller/PolicyController.java @@ -0,0 +1,35 @@ +package africa.skunkworks.training.drools.insurance.web.controller; + +import africa.skunkworks.training.drools.insurance.domain.dto.PolicyDto; +import africa.skunkworks.training.drools.insurance.domain.web.response.Response; +import africa.skunkworks.training.drools.insurance.manager.rule.PolicyRuleManager; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/policy") +@Tag(name = "Policy Controller", description = "Policy Controller") +public class PolicyController { + + private final PolicyRuleManager policyRuleManager; + + @Autowired + public PolicyController(PolicyRuleManager policyRuleManager) { + this.policyRuleManager = policyRuleManager; + } + + @GetMapping("/all") + @Operation(summary = "Fires All Policy Rules", description = "Fires All Policy Rules", tags = {"Policy"}) + public ResponseEntity>> fireAllRulePolicies(){ + Response> response = policyRuleManager.fireAllRulePolicies(); + return new ResponseEntity<>(response, HttpStatus.OK); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/main/resources/i18n/messages_en_ZA.properties b/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/main/resources/i18n/messages_en_ZA.properties index f85edf2..f4276b0 100644 --- a/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/main/resources/i18n/messages_en_ZA.properties +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/main/resources/i18n/messages_en_ZA.properties @@ -1,2 +1,8 @@ # Drools Training Messages +application.list.success=Listed +application.list.error=Error {0} +claim.list.success=Listed +claim.list.error=Error {0} +policy.list.success=Listed +policy.list.error=Error {0} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/test/java/africa/skunkworks/training/drools/insurance/web/controller/ApplicationControllerTest.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/test/java/africa/skunkworks/training/drools/insurance/web/controller/ApplicationControllerTest.java new file mode 100644 index 0000000..43188ce --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/test/java/africa/skunkworks/training/drools/insurance/web/controller/ApplicationControllerTest.java @@ -0,0 +1,24 @@ +package africa.skunkworks.training.drools.insurance.web.controller; + +import africa.skunkworks.training.drools.insurance.web.AbstractWebTest; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +public class ApplicationControllerTest extends AbstractWebTest { + + @Test + public void fireApplicationRules() throws Exception{ + + mockMvc.perform(get("/application/all") + .accept(MediaType.APPLICATION_JSON) + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isOk()) + .andReturn(); + + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/test/java/africa/skunkworks/training/drools/insurance/web/controller/ClaimControllerTest.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/test/java/africa/skunkworks/training/drools/insurance/web/controller/ClaimControllerTest.java new file mode 100644 index 0000000..19ff942 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/test/java/africa/skunkworks/training/drools/insurance/web/controller/ClaimControllerTest.java @@ -0,0 +1,24 @@ +package africa.skunkworks.training.drools.insurance.web.controller; + +import africa.skunkworks.training.drools.insurance.web.AbstractWebTest; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +public class ClaimControllerTest extends AbstractWebTest { + + @Test + public void fireApplicationRules() throws Exception{ + + mockMvc.perform(get("/claim/all") + .accept(MediaType.APPLICATION_JSON) + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isOk()) + .andReturn(); + + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/test/java/africa/skunkworks/training/drools/insurance/web/controller/PolicyControllerTest.java b/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/test/java/africa/skunkworks/training/drools/insurance/web/controller/PolicyControllerTest.java new file mode 100644 index 0000000..8e93d04 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/test/java/africa/skunkworks/training/drools/insurance/web/controller/PolicyControllerTest.java @@ -0,0 +1,23 @@ +package africa.skunkworks.training.drools.insurance.web.controller; + +import africa.skunkworks.training.drools.insurance.web.AbstractWebTest; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +public class PolicyControllerTest extends AbstractWebTest { + + @Test + public void firePolicyRules() throws Exception{ + + mockMvc.perform(get("/policy/all") + .accept(MediaType.APPLICATION_JSON) + .contentType(MediaType.APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isOk()) + .andReturn(); + } +} diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/test/resources/data.sql b/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/test/resources/data.sql new file mode 100644 index 0000000..72c674c --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/test/resources/data.sql @@ -0,0 +1,57 @@ +-- Client Sample Data6 +INSERT INTO DROOLS_TRAINING_INSURANCE.CLIENT(CLIENT_ID, CLIENT_NAME, BIRTHDATE, IS_SMOKER, IS_EMPLOYED, ANNUAL_INCOME) +VALUES +( '01','James Smith', CURRENT_DATE,FALSE,TRUE,138000), +( '02','Maria Smith', CURRENT_DATE,FALSE,TRUE,57000), +( '03','Robert Johnson', CURRENT_DATE,FALSE,TRUE,90000), +( '04','Linda Johnson', CURRENT_DATE,FALSE,TRUE,120000), +( '05','Michael Wilson', CURRENT_DATE,FALSE,TRUE,21000), +( '06','Elizabeth Anderson', CURRENT_DATE,FALSE,TRUE,119000), +( '07','David Lee', CURRENT_DATE,FALSE,TRUE,75000), +( '08','Emily Taylor', CURRENT_DATE,FALSE,TRUE,147000), +( '09','William Brown', CURRENT_DATE,FALSE,TRUE,135000), +( '10','Jessica Thompson', CURRENT_DATE,FALSE,TRUE,89000); +-- Client Ids +INSERT INTO DROOLS_TRAINING_INSURANCE.CLIENT_IDENTIFICATION(IDENTIFICATION_NUMBER, CLIENT_ID, IS_EXPIRED) +VALUES ('ID-100','01',FALSE ), + ('ID-101','02',TRUE ), + ('ID-102','03',FALSE ), + ('ID-103','04',FALSE ), + ('ID-104','05',FALSE ), + ('ID-105','06',FALSE ), + ('ID-106','07',FALSE ), + ('ID-107','08',FALSE ), + ('ID-108','09',FALSE ), + ('ID-109','10',FALSE ); +-- Applications +INSERT INTO DROOLS_TRAINING_INSURANCE.APPLICATION(APPLICATION_NUMBER, CLIENT_ID, PEC, RISK, BMI) +VALUES ('A-100', '01',FALSE,'High','21' ), + ('A-101', '02',TRUE,'Medium','23' ), + ('A-102', '03',FALSE,'High','25'), + ('A-103', '04',FALSE,'Low','32'), + ('A-104', '05',TRUE,'Low','20' ), + ('A-105', '06',FALSE,'Medium','27' ), + ('A-106', '07',TRUE,'High','31' ), + ('A-107', '08',FALSE,'Low','18' ), + ('A-108', '09',TRUE,'Low','28'), + ('A-109', '10',FALSE,'Medium','23' ); + +-- Policies +INSERT INTO DROOLS_TRAINING_INSURANCE.POLICY(POLICY_NUMBER, CLIENT_ID, PREMIUM, COVERAGE, STATUS) +VALUES ('P-100','01',140,14000,'Paid' ), + ('P-101','02',220,22000,'Unpaid' ), + ('P-102','03',150,15000,'Unpaid' ), + ('P-103','04',90,9000,'Paid' ), + ('P-104','05',400,40000,'Paid' ), + ('P-105','06',230,23000,'Paid' ), + ('P-106','07',180,18000,'Paid' ), + ('P-107','08',240,24000,'Paid' ), + ('P-108','09',120,12000,'Unpaid' ), + ('P-109','10',210,21000,'Paid' ); + +INSERT INTO DROOLS_TRAINING_INSURANCE.CLAIM(CLAIM_ID, POLICY_NUMBER, DATE_OF_CLAIM, CLAIM_AMOUNT) +VALUES ('CLID-100','P-101',CURRENT_DATE,25000 ), + ('CLID-102','P-102',CURRENT_DATE,40000 ), + ('CLID-103','P-103',CURRENT_DATE,8000 ), + ('CLID-104','P-104',CURRENT_DATE,50000 ), + ('CLID-105','P-105',CURRENT_DATE,10000 ); \ No newline at end of file diff --git a/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/test/resources/schema.sql b/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/test/resources/schema.sql new file mode 100644 index 0000000..5766db3 --- /dev/null +++ b/Course Material/labs/drools-training-insurance/drools-training-insurance-web/src/test/resources/schema.sql @@ -0,0 +1,68 @@ +DROP SCHEMA IF EXISTS DROOLS_TRAINING_INSURANCE CASCADE; + +-- create schema +CREATE SCHEMA IF NOT EXISTS DROOLS_TRAINING_INSURANCE; + +-- Drop Tables +DROP TABLE IF EXISTS DROOLS_TRAINING_INSURANCE.APPLICATION; +DROP TABLE IF EXISTS DROOLS_TRAINING_INSURANCE.POLICY; +DROP TABLE IF EXISTS DROOLS_TRAINING_INSURANCE.CLAIM; +DROP TABLE IF EXISTS DROOLS_TRAINING_INSURANCE.CLIENT_IDENTIFICATION; +DROP TABLE IF EXISTS DROOLS_TRAINING_INSURANCE.CLIENT; + +-- CREATE TABLES +CREATE TABLE DROOLS_TRAINING_INSURANCE.CLIENT ( + CLIENT_ID VARCHAR(20), + CLIENT_NAME VARCHAR(100), + BIRTHDATE DATE, + IS_SMOKER BOOLEAN, + IS_EMPLOYED BOOLEAN, + ANNUAL_INCOME NUMERIC(14,4), + CONSTRAINT CLIENT_PK PRIMARY KEY (CLIENT_ID) +); + +-- CLIENT IDENTIFICATION +CREATE TABLE DROOLS_TRAINING_INSURANCE.CLIENT_IDENTIFICATION( + IDENTIFICATION_NUMBER VARCHAR(20), + CLIENT_ID VARCHAR(20), + IS_EXPIRED BOOLEAN, + CONSTRAINT IDENTIFICATION_PK PRIMARY KEY (IDENTIFICATION_NUMBER), + CONSTRAINT IDENTIFICATION_FK FOREIGN KEY (CLIENT_ID) REFERENCES DROOLS_TRAINING_INSURANCE.CLIENT +); + +-- APPLICATION +CREATE TABLE DROOLS_TRAINING_INSURANCE.APPLICATION( + APPLICATION_NUMBER VARCHAR(20), + CLIENT_ID VARCHAR(20), + PEC BOOLEAN, + RISK VARCHAR(20), + BMI VARCHAR(20), + REASON VARCHAR(50) DEFAULT 'N/A', + STATUS VARCHAR(20) DEFAULT 'UNKNOWN', + CONSTRAINT APPLICATION_PK PRIMARY KEY (APPLICATION_NUMBER), + CONSTRAINT APPLICATION_FK FOREIGN KEY (CLIENT_ID) REFERENCES DROOLS_TRAINING_INSURANCE.CLIENT +); + +-- POLICY +CREATE TABLE DROOLS_TRAINING_INSURANCE.POLICY( + POLICY_NUMBER VARCHAR(20), + CLIENT_ID VARCHAR(20), + PREMIUM NUMERIC (14,4), + COVERAGE NUMERIC(14,4), + REASON VARCHAR(50) DEFAULT 'N/A', + STATUS VARCHAR(20) DEFAULT 'UNKNOWN', + CONSTRAINT POLICY_PK PRIMARY KEY (POLICY_NUMBER), + CONSTRAINT POLICY_FK FOREIGN KEY (CLIENT_ID) REFERENCES DROOLS_TRAINING_INSURANCE.CLIENT +); + +-- CLAIMS +CREATE TABLE DROOLS_TRAINING_INSURANCE.CLAIM( + CLAIM_ID VARCHAR(20), + POLICY_NUMBER VARCHAR(20), + DATE_OF_CLAIM DATE, + CLAIM_AMOUNT NUMERIC(14,4), + REASON VARCHAR(50) DEFAULT 'N/A', + STATUS VARCHAR(20) DEFAULT 'UNKNOWN', + CONSTRAINT CLAIM_PK PRIMARY KEY (CLAIM_ID), + CONSTRAINT CLAIM_FK FOREIGN KEY (POLICY_NUMBER) REFERENCES DROOLS_TRAINING_INSURANCE.POLICY +); \ No newline at end of file diff --git a/Course Material/labs/drools-training-insurance/pom.xml b/Course Material/labs/drools-training-insurance/pom.xml index 5d70c99..29301ad 100644 --- a/Course Material/labs/drools-training-insurance/pom.xml +++ b/Course Material/labs/drools-training-insurance/pom.xml @@ -174,6 +174,12 @@ ${drools.version} + + org.drools + drools-tms + ${drools.version} + + org.kie kie-spring @@ -234,17 +240,17 @@ INSTRUCTION COVEREDRATIO - 0.8 + 0.5 LINE COVEREDRATIO - 0.8 + 0.5 BRANCH COVEREDRATIO - 0.7 + 0.5 diff --git a/Course Material/labs/drools-training-scripts/sql/drools-training-insurance-data.sql b/Course Material/labs/drools-training-scripts/sql/drools-training-insurance-data.sql new file mode 100644 index 0000000..57951a1 --- /dev/null +++ b/Course Material/labs/drools-training-scripts/sql/drools-training-insurance-data.sql @@ -0,0 +1,57 @@ +-- Client Sample Data6 +INSERT INTO DROOLS_TRAINING_INSURANCE.CLIENT(CLIENT_ID, CLIENT_NAME, BIRTHDATE, IS_SMOKER, IS_EMPLOYED, ANNUAL_INCOME) +VALUES +( '01','James Smith', '19790103',FALSE,TRUE,138000), +( '02','Maria Smith', '20171103',FALSE,TRUE,57000), +( '03','Robert Johnson', '20100103',FALSE,FALSE,90000), +( '04','Linda Johnson', '20170103',FALSE,TRUE,120000), +( '05','Michael Wilson', '20170103',FALSE,TRUE,21000), +( '06','Elizabeth Anderson', '20170103',FALSE,TRUE,119000), +( '07','David Lee', '20170103',FALSE,TRUE,75000), +( '08','Emily Taylor', '20170103',FALSE,TRUE,147000), +( '09','William Brown','20170103',FALSE,TRUE,135000), +( '10','Jessica Thompson','20170103',FALSE,TRUE,89000); +-- Client Ids +INSERT INTO DROOLS_TRAINING_INSURANCE.CLIENT_IDENTIFICATION(IDENTIFICATION_NUMBER, CLIENT_ID, IS_EXPIRED) +VALUES ('ID-100','01',FALSE ), + ('ID-101','02',TRUE ), + ('ID-102','03',FALSE ), + ('ID-103','04',FALSE ), + ('ID-104','05',FALSE ), + ('ID-105','06',FALSE ), + ('ID-106','07',FALSE ), + ('ID-107','08',FALSE ), + ('ID-108','09',FALSE ), + ('ID-109','10',FALSE ); +-- Applications +INSERT INTO DROOLS_TRAINING_INSURANCE.APPLICATION(APPLICATION_NUMBER, CLIENT_ID, PEC, RISK, BMI) +VALUES ('A-100', '01',FALSE,'High','21' ), + ('A-101', '02',TRUE,'Medium','23' ), + ('A-102', '03',FALSE,'High','25'), + ('A-103', '04',FALSE,'Low','32'), + ('A-104', '05',TRUE,'Low','20' ), + ('A-105', '06',FALSE,'Medium','27' ), + ('A-106', '07',TRUE,'High','31' ), + ('A-107', '08',FALSE,'Low','18' ), + ('A-108', '09',TRUE,'Low','28'), + ('A-109', '10',FALSE,'Medium','23' ); + +-- Policies +INSERT INTO DROOLS_TRAINING_INSURANCE.POLICY(POLICY_NUMBER, CLIENT_ID, PREMIUM, COVERAGE, STATUS) +VALUES ('P-100','01',140,14000,'Paid' ), + ('P-101','02',220,22000,'Unpaid' ), + ('P-102','03',150,15000,'Unpaid' ), + ('P-103','04',90,9000,'Paid' ), + ('P-104','05',400,40000,'Paid' ), + ('P-105','06',230,23000,'Paid' ), + ('P-106','07',180,18000,'Paid' ), + ('P-107','08',240,24000,'Paid' ), + ('P-108','09',120,12000,'Unpaid' ), + ('P-109','10',210,21000,'Paid' ); + +INSERT INTO DROOLS_TRAINING_INSURANCE.CLAIM(CLAIM_ID, POLICY_NUMBER, DATE_OF_CLAIM, CLAIM_AMOUNT) +VALUES ('CLID-100','P-101','20230226',25000 ), + ('CLID-102','P-102','20231011',40000 ), + ('CLID-103','P-103','20231111',8000 ), + ('CLID-104','P-104','20230720',50000 ), + ('CLID-105','P-105','20230501',10000 ); \ No newline at end of file diff --git a/Course Material/labs/drools-training-scripts/sql/drools-training-insurance-schema.sql b/Course Material/labs/drools-training-scripts/sql/drools-training-insurance-schema.sql new file mode 100644 index 0000000..7f34250 --- /dev/null +++ b/Course Material/labs/drools-training-scripts/sql/drools-training-insurance-schema.sql @@ -0,0 +1,68 @@ +DROP SCHEMA IF EXISTS DROOLS_TRAINING_INSURANCE CASCADE; + +-- create schema +CREATE SCHEMA IF NOT EXISTS DROOLS_TRAINING_INSURANCE; + +-- Drop Tables +DROP TABLE IF EXISTS DROOLS_TRAINING_INSURANCE.APPLICATION; +DROP TABLE IF EXISTS DROOLS_TRAINING_INSURANCE.POLICY; +DROP TABLE IF EXISTS DROOLS_TRAINING_INSURANCE.CLAIM; +DROP TABLE IF EXISTS DROOLS_TRAINING_INSURANCE.CLIENT_IDENTIFICATION; +DROP TABLE IF EXISTS DROOLS_TRAINING_INSURANCE.CLIENT; + +-- CREATE TABLES +CREATE TABLE DROOLS_TRAINING_INSURANCE.CLIENT ( + CLIENT_ID VARCHAR(20), + CLIENT_NAME VARCHAR(100), + BIRTHDATE DATE, + IS_SMOKER BOOLEAN, + IS_EMPLOYED BOOLEAN, + ANNUAL_INCOME NUMERIC(14,4), + CONSTRAINT CLIENT_PK PRIMARY KEY (CLIENT_ID) +); + +-- CLIENT IDENTIFICATION +CREATE TABLE DROOLS_TRAINING_INSURANCE.CLIENT_IDENTIFICATION( + IDENTIFICATION_NUMBER VARCHAR(20), + CLIENT_ID VARCHAR(20), + IS_EXPIRED BOOLEAN, + CONSTRAINT IDENTIFICATION_PK PRIMARY KEY (IDENTIFICATION_NUMBER), + CONSTRAINT IDENTIFICATION_FK FOREIGN KEY (CLIENT_ID) REFERENCES DROOLS_TRAINING_INSURANCE.CLIENT +); + +-- APPLICATION +CREATE TABLE DROOLS_TRAINING_INSURANCE.APPLICATION( + APPLICATION_NUMBER VARCHAR(20), + CLIENT_ID VARCHAR(20), + PEC BOOLEAN, + RISK VARCHAR(20), + BMI VARCHAR(20), + REASON VARCHAR(50) DEFAULT 'N/A', + STATUS VARCHAR(20) DEFAULT 'UNKNOWN', + CONSTRAINT APPLICATION_PK PRIMARY KEY (APPLICATION_NUMBER), + CONSTRAINT APPLICATION_FK FOREIGN KEY (CLIENT_ID) REFERENCES DROOLS_TRAINING_INSURANCE.CLIENT +); + +-- POLICY +CREATE TABLE DROOLS_TRAINING_INSURANCE.POLICY( + POLICY_NUMBER VARCHAR(20), + CLIENT_ID VARCHAR(20), + PREMIUM NUMERIC (14,4), + COVERAGE NUMERIC(14,4), + STATUS VARCHAR(10), + REASON VARCHAR(50) DEFAULT 'N/A', + CONSTRAINT POLICY_PK PRIMARY KEY (POLICY_NUMBER), + CONSTRAINT POLICY_FK FOREIGN KEY (CLIENT_ID) REFERENCES DROOLS_TRAINING_INSURANCE.CLIENT +); + +-- CLAIMS +CREATE TABLE DROOLS_TRAINING_INSURANCE.CLAIM( + CLAIM_ID VARCHAR(20), + POLICY_NUMBER VARCHAR(20), + DATE_OF_CLAIM DATE, + CLAIM_AMOUNT NUMERIC(14,4), + REASON VARCHAR(50) DEFAULT 'N/A', + STATUS VARCHAR(20) DEFAULT 'UNKNOWN', + CONSTRAINT CLAIM_PK PRIMARY KEY (CLAIM_ID), + CONSTRAINT CLAIM_FK FOREIGN KEY (POLICY_NUMBER) REFERENCES DROOLS_TRAINING_INSURANCE.POLICY +); \ No newline at end of file diff --git a/README.md b/README.md index cdece1c..bb709e3 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # 📘 Course Outline -![Drools (1)](https://github.com/Course-Monster/Drools/assets/126121348/9354596f-4af0-4183-9039-8bb31a5bae6d) +![Drools Course](https://github.com/Course-Monster/Drools/assets/126121348/9354596f-4af0-4183-9039-8bb31a5bae6d) --- ## **🌟 Mastering Drools 8: Comprehensive Training Course** @@ -44,22 +44,22 @@ _"Mastering Drools 8"_ is an intensive 3-day program focused on equipping partic ### **Day 1: _Foundation of Drools_** -- **Module 1:** Introduction to Drools _(1hr)_ -- **Module 2:** Drools Environment Setup _(2hrs)_ -- **Module 3:** Advanced Drools Project Handling _(3hrs)_ +- **Module 1:** [Introduction to Drools](#module-1-introduction-to-drools) _(1hr)_ +- **Module 2:** [Drools Environment Setup](#module-2-drools-environment-setup) _(2hrs)_ +- **Module 3:** [Advanced Drools Project Handling](#module-3-advanced-drools-project-handling) _(3hrs)_ ### **Day 2: _Advanced Features & Language_** -- **Module 4:** KIE Sessions & Basic Rule Logic & Cross Products _(2hrs)_ -- **Module 5:** Fact Objects, Execution Control, and Truth Maintenance _(2hrs)_ -- **Module 6:** Working with Object Groups _(2hrs)_ +- **Module 4:** [KIE Sessions & Basic Rule Logic & Cross Products](#module-4-kie-sessions-basic-rule-logic-cross-products) _(2hrs)_ +- **Module 5:** [Fact Objects, Execution Control, and Truth Maintenance](#module-5-fact-objects-execution-control-truth-maintenance) _(2hrs)_ +- **Module 6:** [Working with Object Groups](#module-6-working-with-object-groups) _(2hrs)_ ### **Day 3: _AI Integration & Skills Upgrade_** -- **Module 7:** Complex Event Processing _(1hrs)_ -- **Module 8:** DMN Models and Spreadsheet Decision Tables _(1hr)_ -- **Module 9:** Rule Templates & Dynamic Rule Creation _(1hrs)_ -- **Module 10:** Capstone Project _(3hrs)_ +- **Module 7:** [Complex Event Processing](#module-7-complex-event-processing) _(1hrs)_ +- **Module 8:** [DMN Models and Spreadsheet Decision Tables](#module-8-dmn-models-spreadsheet-decision-tables) _(1hr)_ +- **Module 9:** [Rule Templates & Dynamic Rule Creation](#module-9-rule-templates-dynamic-rule-creation) _(1hrs)_ +- **Module 10:** [Capstone Project](#module-10-capstone-project) _(3hrs)_ --- ## **🖥️ Delivery Method** @@ -87,50 +87,15 @@ Welcome to the first module of our journey into Drools and Rule Engines. This mo **Subtopics:** -1. **Overview** -- _Objective_: Outline course structure, objectives, and expected outcomes. -- _Challenge_: Setting clear expectations. -- _Solution_: Provide a detailed course roadmap. - -2. **Defining Rule Engines: Concepts and Functions** -- _Objective_: Introduction to rule engines, key concepts, and terminology. -- _Challenge_: Making complex technical jargon accessible. -- _Solution_: Use analogies and real-life examples. - -3. **Historical Context and Evolution of Rule Engines** -- _Objective_: Explore the history and modern use cases of rule engines. -- _Challenge_: Connecting historical development to current technologies. -- _Solution_: Use timeline visuals and case studies. - -4. **Introduction to Drools** -- _Objective_: Understanding Drools and its advantages. -- _Challenge_: Demonstrating the uniqueness of Drools. -- _Solution_: Comparison with other rule engines. - -5. **AI and Rule Engines: A Symbiotic Relationship** -- _Objective_: Explore the interaction between AI and rule-based systems. -- _Challenge_: Making AI concepts accessible. -- _Solution_: Simple AI use cases integrated with rule engines. - -6. **Setting up for Drools Development** -- _Objective_: Guide through tools and software requirements for Drools. -- _Challenge_: Managing diverse participant technical environments. -- _Solution_: Step-by-step guide for different setups. - -7. **Real-world Case Studies in Drools** -- _Objective_: Discuss practical implementations of Drools. -- _Challenge_: Relating theory to practice. -- _Solution_: Diverse industry case studies. - -8. **Practical Activity: Environment Setup** -- _Objective_: Hands-on Drools setup. -- _Challenge_: Technical setup issues. -- _Solution_: Detailed guide and real-time support. - -9. **Assessment: Quiz on Rule Engines and Drools Basics** -- _Objective_: Evaluate understanding of Drools basics. -- _Challenge_: Designing an effective assessment. -- _Solution_: Multiple-choice questions with immediate feedback. +1. **[Overview](#module-1-introduction-to-drools)** +2. **[Defining Rule Engines: Concepts and Functions](#module-1-introduction-to-drools)** +3. **[Historical Context and Evolution of Rule Engines](#module-1-introduction-to-drools)** +4. **[Introduction to Drools](#module-1-introduction-to-drools)** +5. **[AI and Rule Engines: A Symbiotic Relationship](#module-1-introduction-to-drools)** +6. **[Setting up for Drools Development](#module-1-introduction-to-drools)** +7. **[Real-world Case Studies in Drools](#module-1-introduction-to-drools)** +8. **[Practical Activity: Environment Setup](#module-1-introduction-to-drools)** +9. **[Assessment: Quiz on Rule Engines and Drools Basics](#module-1-introduction-to-drools)** **Additional Instructional Materials:** - Slide Decks @@ -143,8 +108,8 @@ Welcome to the first module of our journey into Drools and Rule Engines. This mo - Office Hours - Online Resources - --- + ### Module 2: Getting Started with Drools Welcome to Module 2 where we dive into the practical aspects of working with Drools. This module aims to give you hands-on experience and foundational knowledge to start building with Drools. @@ -162,46 +127,21 @@ This module focuses on setting up your Drools environment, exploring its project **Subtopics:** -1. **Setting Up Your Drools Environment** -- _Objective_: Guide through the initial setup of the Drools development environment. -- _Challenge_: Ensuring a smooth setup process for all participants. -- _Solution_: Provide a detailed, step-by-step setup guide. - -2. **Exploring the Drools Project Structure** -- _Objective_: Understand the typical structure of a Drools project. -- _Challenge_: Familiarizing with the Drools project conventions and architecture. -- _Solution_: Walkthrough of a sample Drools project with explanations of key components. - -3. Crafting Your First Rule with Drools -- _Objective_: Learn to create basic rules in Drools. -- _Challenge_: Simplifying the concepts of rule writing for beginners. -- _Solution_: Step-by-step guide to writing and testing a simple rule. - -4. Understanding Decision Model and Notation (DMN) -- _Objective_: Introduce Decision Model and Notation in the context of Drools. -- _Challenge_: Explaining DMN concepts in an easy-to-understand manner. -- _Solution_: Use real-world examples to demonstrate how DMN is used in Drools. - -5. Practical Exercise: Develop a Traffic Violation Decision Service -- _Objective_: Apply learned concepts in a real-world simulation. -- _Challenge_: Integrating various components of Drools to create a functional service. -- _Solution_: Stepwise development of a traffic violation decision service with guidance. - -6. Best Practices and Common Pitfalls in Drools -- _Objective_: Share best practices and common mistakes in Drools projects. -- _Challenge_: Highlighting the do's and don'ts in a practical context. -- _Solution_: Discuss real-world scenarios and case studies. - -7. Assessment: Traffic Violation Service Review -- _Objective_: Evaluate the understanding and application of Drools in developing a service. -- _Challenge_: Creating an assessment that is comprehensive yet not overwhelming. -- _Solution_: Review exercise with specific focus areas and feedback session. +1. **[Setting Up Your Drools Environment](#module-2-drools-environment-setup)** +2. **[Exploring the Drools Project Structure](#module-2-drools-environment-setup)** +3. **[Crafting Your First Rule with Drools](#module-2-drools-environment-setup)** +4. **[Understanding Decision Model and Notation (DMN)](#module-2-drools-environment-setup)** +5. **[Practical Exercise: Develop a Traffic Violation Decision Service](#module-2-drools-environment-setup)** +6. **[Best Practices and Common Pitfalls in Drools](#module-2-drools-environment-setup)** +7. **[Assessment: Traffic Violation Service Review](#module-2-drools-environment-setup)** **Additional Instructional Materials:** -Interactive Demos: Demonstrating rule creation and DMN usage. -Hands-On Lab Workbook: Detailed exercises and solutions. -Cheat Sheets: Quick references for Drools syntax and commands. -Discussion Prompts: Encouraging collaborative learning and sharing experiences. +- Interactive Demos: Demonstrating rule creation and DMN usage. +- Hands-On Lab Workbook: Detailed exercises and solutions. +- Cheat Sheets: Quick references for Drools syntax and + + commands. +- Discussion Prompts: Encouraging collaborative learning and sharing experiences. **Post-Module Support:** @@ -211,8 +151,8 @@ Community Forum Access: Providing a platform for continuous learning and support > We hope you find this module engaging and informative. Your journey with Drools is just getting started! - --- + ## ⏰ **Day 2: Deep Dive into Drools Features and Language** #### **Course Overview** @@ -227,44 +167,16 @@ Gain comprehensive expertise in the Drools Rule Engine, with a specific focus on **Topics Covered:** -1. **KIE Sessions Setup** - - Learn to configure KIE sessions tailored specifically for the Health Insurance case study. - - Understand the crucial role of KIE sessions in efficient rule execution. - -2. **Advanced Rule Execution Control** - - Explore advanced rule execution control mechanisms such as inference, truth maintenance, and agenda groups. - - Apply these advanced techniques to manage complex insurance coverage decisions effectively. - -3. **Inference and Truth Maintenance** - - Dive deep into the concept of inference in rule engines and how Drools maintains the accuracy of facts. - - Examine real-world use cases, like automatically retracting a health insurance offer when an applicant's eligibility changes. - -4. **Agenda Groups and Salience** - - Define agenda groups and their significance in organizing and prioritizing rules. - - Implement salience values to ensure critical rules take precedence in health insurance rule execution. - -5. **Complex Event Processing (CEP)** - - Understand CEP within Drools and its applications in tracking and analyzing health insurance claims over time. - - Explore CEP operators and temporal reasoning in Drools. - -6. **Building a CEP Application for Health Insurance** - - Develop a CEP application within Drools to monitor and dynamically adjust health insurance claims in real-time. - - Step-by-step construction of a CEP rule to detect unusual patterns in claim submissions. - -7. **Lab Exercise Series: Health Insurance** - - Practical hands-on exercises to reinforce your understanding of the concepts learned. - -8. **Configuring KIE Sessions for Health Insurance** - - Set up and utilize KIE sessions specifically tailored to health insurance rules. - - Create a dedicated environment for rule execution in the health insurance domain. - -9. **Implementing Advanced Rule Controls** - - Apply advanced rule execution control techniques, including agenda groups and salience, to effectively manage health insurance rule execution. - - Observe the impact of these controls on rule execution order and efficiency. - -10. **Building a CEP Application for Health Insurance** - - Develop a comprehensive CEP application to monitor, analyze, and adapt health insurance claims in real-time. - - Use Drools to detect and respond to emerging claim patterns. +1. **[KIE Sessions Setup](#module-4-kie-sessions-basic-rule-logic-cross-products)** +2. **[Advanced Rule Execution Control](#module-4-kie-sessions-basic-rule-logic-cross-products)** +3. **[Inference and Truth Maintenance](#module-4-kie-sessions-basic-rule-logic-cross-products)** +4. **[Agenda Groups and Salience](#module-4-kie-sessions-basic-rule-logic-cross-products)** +5. **[Complex Event Processing (CEP)](#module-4-kie-sessions-basic-rule-logic-cross-products)** +6. **[Building a CEP Application for Health Insurance](#module-4-kie-sessions-basic-rule-logic-cross-products)** +7. **[Lab Exercise Series: Health Insurance](#module-4-kie-sessions-basic-rule-logic-cross-products)** +8. **[Configuring KIE Sessions for Health Insurance](#module-4-kie-sessions-basic-rule-logic-cross-products)** +9. **[Implementing Advanced Rule Controls](#module-4-kie-sessions-basic-rule-logic-cross-products)** +10. **[Building a CEP Application for Health Insurance](#module-4-kie-sessions-basic-rule-logic-cross-products)** By exploring these subtopics, you will gain a deep understanding of how to leverage the Drools Rule Engine's advanced capabilities for rule execution and event processing within the context of health insurance, ultimately enhancing decision-making processes in the industry. @@ -277,26 +189,12 @@ Delve into the syntax and structure of DRL, learning to write effective rules an **Topics Covered:** -1. **DRL Syntax and Structure** - - Explore the foundational syntax and structure of DRL as it applies specifically to health insurance. - - Understand the key elements that make up DRL rules, ensuring clarity and correctness. - -2. **Writing Effective Rules** - - Learn best practices for crafting clear, efficient, and maintainable health insurance rules in DRL. - - Discover techniques to enhance the readability and usability of your rulebase. - -3. **Rule Units and Queries** - - Utilize DRL to segment health insurance rules into manageable units, improving rulebase organization. - - Learn how to create and use queries to efficiently retrieve information from the knowledge base. - -4. **Lab Exercise Series: Health Insurance** - - Practical hands-on exercises to reinforce your understanding of DRL syntax and advanced rule writing within the health insurance domain. - -5. **Syntax Practice with Health Insurance Rules** - - Write DRL rules that determine insurance coverage based on applicant details, applying the syntax and structure concepts learned. - -6. **Advanced Rule Writing for Health Insurance** - - Explore rule units and queries to create a sophisticated set of rules for various health insurance scenarios, solving complex insurance-related challenges. +1. **[DRL Syntax and Structure](#module-5-fact-objects-execution-control-truth-maintenance)** +2. **[Writing Effective Rules](#module-5-fact-objects-execution-control-truth-maintenance)** +3. **[Rule Units and Queries](#module-5-fact-objects-execution-control-truth-maintenance)** +4. **[Lab Exercise Series: Health Insurance](#module-5-fact-objects-execution-control-truth-maintenance)** +5. **[Syntax Practice with Health Insurance Rules](#module-5-fact-objects-execution-control-truth-maintenance)** +6. **[Advanced Rule Writing for Health Insurance](#module-5-fact-objects-execution-control-truth-maintenance)** By exploring these subtopics and completing the lab exercises, you will gain proficiency in writing effective DRL rules for health insurance applications, enhancing your ability to model and manage complex insurance scenarios using Drools. @@ -309,27 +207,12 @@ Explore how Decision Model and Notation (DMN) can be used to encapsulate decisio **Topics Covered:** -1. **DMN Overview** - - Introduction to DMN in Drools, emphasizing its application in health insurance decision-making. - - Understand the foundational concepts of DMN and its role in simplifying complex decisions. - -2. **Building Effective DMN Models** - - Learn how to construct DMN models that accurately represent the decision-making process for determining insurance coverage and premiums. - - Utilize DMN elements to create clear and transparent decision models. - -3. **Advanced DMN Modeling Techniques** - - Dive deeper into DMN modeling, exploring advanced techniques for modeling complex health insurance decisions. - - Discover strategies for handling intricate decision scenarios effectively. - -4. **Lab Exercise Series: Health Insurance** - - Practical hands-on exercises to reinforce your understanding of DMN modeling within the health insurance domain. - -5. **DMN Modeling for Insurance Eligibility** - - Create DMN models to evaluate eligibility criteria for health insurance, applying the concepts learned in the module. - -6. **Integrating DMN Models with Drools** - - Embed and execute DMN models within the Drools environment for the health insurance scenario. - - Analyze the effectiveness of DMN in simplifying decision logic and enhancing transparency in health insurance determinations. +1. **[DMN Overview](#module-6-working-with-object-groups)** +2. **[Building Effective DMN Models](#module-6-working-with-object-groups)** +3. **[Advanced DMN Modeling Techniques](#module-6-working-with-object-groups)** +4. **[Lab Exercise Series: Health Insurance](#module-6-working-with-object-groups)** +5. **[DMN Modeling for Insurance Eligibility](#module-6-working-with-object-groups)** +6. **[Integrating DMN Models with Drools](#module-6-working-with-object-groups)** By exploring these subtopics and completing the lab exercises, you will gain proficiency in using DMN to model and simplify complex decision-making processes in the context of health insurance using Drools. @@ -354,7 +237,9 @@ By the end of Day 2, you'll have a deep understanding of Drools' advanced featur Focusing on the enhancement of decision automation with AI, this module uses a loan application processing scenario to illustrate the use of predictive models within Drools. - **Introduction to Pragmatic AI**: Understanding AI's role in decision-making within business processes. -- **Basics of Machine Learning in Drools**: How machine learning models can predict outcomes like loan default risk. +- **Basics + + of Machine Learning in Drools**: How machine learning models can predict outcomes like loan default risk. - **Utilizing PMML Models with Drools**: Incorporating Predictive Model Markup Language (PMML) models into Drools for loan approval predictions. - **Advanced Integration of ML Models with DMN**: Merging complex ML predictions with decision tables in the loan application process. - **Practical Exercise: AI-Enhanced Decision Service**: Construct an AI-enhanced decision service for loan application processing. @@ -420,22 +305,3 @@ For each case, document your code, note any assumptions or decisions, and reflec > [!NOTE] > This structured approach ties together the advanced features of Drools 8 with practical, real-world applications, ensuring that participants not only learn about the latest developments in rule engines but also apply them to tangible use cases like loan processing and fraud detection. 😄 - ---- - -## 🐙 **GitHub Integration for Course Management** - -- **Repository Setup:** Create a GitHub repository for course materials and exercises. -- **Code Management:** Use branches for different modules and exercises. -- **Collaboration:** Leverage GitHub Issues and Discussions for Q&A and collaborative learning. -- **Version Control:** Teach best practices in Git for managing and submitting code. - - 🐧 **Continuous Learning Resources** - -- Provide links to relevant GitHub repositories (e.g., kiegroup/drools, droolsjbpm-integration) for continuous learning and updates. - ---- - -> [!NOTE] -> This comprehensive course curriculum, combined with a structured lab environment setup guide and a revised pricing strategy, offers participants a rich learning experience in mastering Drools 8. The course is designed to provide a balance of theoretical knowledge and practical skills, making it valuable for professionals in various industries. - diff --git a/course-site/CHANGELOG.md b/course-site/CHANGELOG.md new file mode 100644 index 0000000..1caa29b --- /dev/null +++ b/course-site/CHANGELOG.md @@ -0,0 +1,28 @@ +# Changelog + +## 1.0.0 — 2026-08-26 + +### Added + +- Docusaurus 3.10.2 self-paced delivery site. +- Drools 10.2.0 technical baseline. +- eight-module mastery-based learning path; +- eight hands-on labs; +- diagnostic and final assessment specifications; +- capstone project and rubric; +- student note template, glossary, cheat sheet and troubleshooting guide; +- controlled instructor/assessor notes outside public docs; +- standards alignment, accessibility and publishing controls; +- outcome/assessment and evidence matrices; +- automated course-content validation and GitHub Actions quality workflow. + +### Changed + +- Reframed the legacy three-day Drools 8 instructor-led material as preserved source/archive rather than canonical learner content. + +### Known work before production launch + +- SME must execute all labs from clean starter repositories. +- Controlled assessment item bank must be loaded into the LMS. +- Accessibility test evidence must be recorded against the deployed production build. +- Learner analytics/evaluation integration must be configured in the host learning platform. diff --git a/course-site/README.md b/course-site/README.md new file mode 100644 index 0000000..85016ac --- /dev/null +++ b/course-site/README.md @@ -0,0 +1,29 @@ +# Drools Self-Paced Course Site + +Canonical learner-facing course source. + +## Local use + +```bash +cd course-site +npm install +npm run validate:content +npm run build +npm start +``` + +Docusaurus 3.10.2 requires Node.js 20 or later. + +## Content boundaries + +- `docs/` — public learner material. +- `instructor-notes/` — controlled assessor/SME guidance; not routed by Docusaurus. +- `governance/` — course-design and evidence controls. +- `slides/` — editable Markdown slide source. +- repository `Course Material/` — preserved legacy material. + +## Publishing + +Production host: `https://drools.skunkworksacademy.com`. + +The GitHub Actions workflow validates structure and builds the static site. Deployment should be enabled only after branch protection, domain/DNS and release approval are confirmed. diff --git a/course-site/course-manifest.json b/course-site/course-manifest.json new file mode 100644 index 0000000..5d7e416 --- /dev/null +++ b/course-site/course-manifest.json @@ -0,0 +1,24 @@ +{ + "courseId": "SWA-DROOLS-SELF-PACED", + "title": "Drools Decision Automation", + "version": "1.0.0", + "status": "release-candidate", + "provider": "Skunkworks Academy", + "deliveryMode": "self-paced", + "technicalBaseline": { + "drools": "10.2.0", + "docusaurus": "3.10.2", + "javaMinimum": "17", + "nodeMinimum": "20" + }, + "nominalHours": {"minimum": 32, "maximum": 40}, + "language": "en", + "completion": { + "moduleMasteryPercent": 80, + "finalAssessmentPercent": 75, + "capstonePercent": 70 + }, + "standardsAlignment": ["ISO 21001:2025","ISO 29993:2017","ISO/IEC 40180:2017","ISO/PAS 25171:2026","WCAG 2.2 AA"], + "canonicalUrl": "https://drools.skunkworksacademy.com", + "sourceRepository": "https://github.com/skunkworks-academy/drools" +} diff --git a/course-site/docs/assessment/diagnostic.md b/course-site/docs/assessment/diagnostic.md new file mode 100644 index 0000000..165b13b --- /dev/null +++ b/course-site/docs/assessment/diagnostic.md @@ -0,0 +1,33 @@ +--- +title: Diagnostic Assessment +description: Ungraded readiness and prior-knowledge check used to tailor the self-paced path. +sidebar_position: 1 +--- + +# Diagnostic Assessment + +This is ungraded. Attempt it before reading the modules. + +## Questions + +1. Explain the difference between imperative control flow and declarative rules. +2. What is a fact in a rule engine? +3. What does a Maven dependency tree help diagnose? +4. Write a Java unit-test assertion for a boundary condition of 18 years. +5. When would you prefer a stateless execution model? +6. What risk can a cross-product of two large fact groups create? +7. What is a decision table? +8. What is the purpose of DMN? +9. Why should a test for a time window use a controllable clock? +10. Name two reasons not to perform HTTP calls directly in a rule consequence. +11. What information would you record to reproduce a production decision? +12. What does “least data necessary” mean in a decision service? + +## Interpretation + +- **0–4:** complete prerequisites and modules in sequence. +- **5–8:** normal course path. +- **9–10:** skim familiar explanations but complete all labs. +- **11–12:** discuss recognition/prior-learning options if available; still complete summative evidence required for this course version. + +Do not use the diagnostic score as proof of course completion. diff --git a/course-site/docs/assessment/final-assessment.md b/course-site/docs/assessment/final-assessment.md new file mode 100644 index 0000000..74d7e36 --- /dev/null +++ b/course-site/docs/assessment/final-assessment.md @@ -0,0 +1,48 @@ +--- +title: Final Assessment +description: Summative knowledge and application assessment for the Drools self-paced course. +sidebar_position: 2 +--- + +# Final Assessment + +**Pass mark:** 75% +**Recommended time:** 60 minutes +**Format:** 20 selected/short-response items plus two scenario responses +**Attempt policy:** defined by the publishing LMS; remediation should precede a retake. + +The public course contains the assessment specification and sample-style prompts. The controlled item bank and marking key must remain outside the public Docusaurus content tree. + +## Assessment blueprint + +| Domain | Weight | +|---|---:| +| Engine concepts and DRL | 25% | +| Runtime, inference and execution | 20% | +| Decision models | 15% | +| CEP | 10% | +| Testing/troubleshooting | 15% | +| Integration/security/operations | 15% | + +## Sample-style prompts + +1. A quote API evaluates each request independently. Explain why stateless execution may be suitable. +2. A rule joins every `Applicant` to every `Policy`. Identify the likely defect and missing relationship. +3. A rule updates a fact and repeatedly reactivates itself. Give two design remedies. +4. Choose DRL, a decision table or DMN for a visible premium matrix and justify the choice. +5. A CEP test uses `Thread.sleep(600000)`. Explain why this is unsuitable and propose an alternative. +6. Identify four non-sensitive metadata fields that improve decision traceability. +7. Explain why rule assets require change control even when non-developers author them. +8. Describe minimum evidence proving a boundary bug is fixed. + +## Scenario A + +A decision service returns more “manual review” outcomes after a rule release. Describe the investigation sequence, evidence to collect and rollback conditions. + +## Scenario B + +A team proposes an HTTP fraud-check call inside a Drools consequence. Evaluate the design and propose a safer architecture. + +## Remediation + +Map missed items to outcomes, revisit the relevant module/lab evidence, then retake using a different controlled item set. diff --git a/course-site/docs/capstone.md b/course-site/docs/capstone.md new file mode 100644 index 0000000..d78c84a --- /dev/null +++ b/course-site/docs/capstone.md @@ -0,0 +1,62 @@ +--- +title: Capstone — Governed Decision Service +description: End-to-end performance assessment combining rules, decision modeling, testing and operational controls. +sidebar_position: 20 +--- + +# Capstone — Governed Decision Service + +## Scenario + +Build a synthetic **commercial insurance quotation and review decision service**. It receives an applicant/request model, determines eligibility, calculates a risk band, applies a policy adjustment and produces a traceable decision. A small event component flags suspicious quote activity using synthetic events. + +You may substitute another approved domain if it demonstrates the same outcomes. + +## Required capabilities + +1. At least one maintainable DRL rule set. +2. At least one tabular or DMN decision. +3. A justified runtime/session model. +4. An explicit inference or multi-rule interaction. +5. A bounded event/CEP rule. +6. Automated positive, negative, boundary and interaction tests. +7. A service/application boundary with input validation. +8. Version/trace metadata in the response. +9. Secure configuration with no embedded secrets. +10. A concise operational runbook and rollback plan. + +## Required submission + +- source repository/branch and commit SHA; +- `README.md` with architecture and local execution; +- requirements-to-test traceability table; +- automated test report; +- decision/rule inventory; +- architecture decision record; +- security/privacy checklist; +- operational runbook; +- 5–8 minute demonstration or equivalent platform evidence; +- final reflection. + +## Rubric + +| Criterion | Weight | Excellent | Competent | Not demonstrated | +|---|---:|---|---|---| +| Requirements and traceability | 10% | Complete bidirectional trace | Main requirements traced | Material gaps | +| Rule/model correctness | 20% | Clear, deterministic, boundary-safe | Meets stated policy | Incorrect/ambiguous | +| Drools architecture | 15% | Runtime model strongly justified | Appropriate and functional | Misused/uncontrolled state | +| Testing evidence | 20% | Deep positive/negative/boundary/interaction suite | Key cases covered | Insufficient evidence | +| Maintainability/explainability | 10% | Intent, naming and representation exemplary | Understandable | Opaque/fragile | +| Security/privacy | 10% | Threat-aware, minimal data, no secrets | Baseline controls present | Critical unsafe practice | +| Operations/observability | 10% | Versioned rollout/rollback + telemetry | Basic operational readiness | No operational plan | +| Communication/reflection | 5% | Clear, evidence-based | Adequate | Cannot explain work | + +**Pass:** 70% overall and no critical failure in correctness, testing or security/privacy. + +## Critical fail conditions + +A submission cannot pass if it contains real sensitive learner/customer data, committed secrets, no executable verification, intentionally deceptive evidence, or a decision implementation the learner cannot explain. + +## Assessor calibration + +Assessors should use the private `instructor-notes/assessment-guide.md` and record comments against this rubric, not unstated preferences. diff --git a/course-site/docs/course-map.md b/course-site/docs/course-map.md new file mode 100644 index 0000000..8804815 --- /dev/null +++ b/course-site/docs/course-map.md @@ -0,0 +1,45 @@ +--- +title: Course Map +description: Module sequence, outcomes, labs, assessment evidence and nominal learning hours. +sidebar_position: 3 +--- + +# Course Map + +| Module | Focus | Nominal effort | Performance evidence | +|---|---|---:|---| +| 1 | Decision automation foundations | 3 h | First rule project + concept check | +| 2 | DRL rule authoring | 4 h | Insurance eligibility rule set | +| 3 | KIE runtime and sessions | 4 h | Stateful/stateless comparison | +| 4 | Inference and execution control | 4 h | Truth-maintained decision scenario | +| 5 | Decision tables and DMN | 5 h | Decision model + tests | +| 6 | Complex event processing | 4 h | Fraud/event detection rules | +| 7 | Testing, performance and troubleshooting | 4 h | Automated verification + defect analysis | +| 8 | Integration, security and operations | 4 h | Service-ready decision component | +| Capstone | End-to-end decision service | 6–8 h | Assessed portfolio | + +## Outcome-to-evidence traceability + +| Course outcome | Taught/practised | Primary evidence | +|---|---|---| +| CO1 Explain engine concepts | M1, M3 | Diagnostic + M1 check | +| CO2 Author maintainable DRL | M1, M2 | Labs 1–2 | +| CO3 Select runtime approach | M3 | Lab 3 | +| CO4 Control and explain execution | M4 | Lab 4 | +| CO5 Model decisions | M5 | Lab 5 | +| CO6 Implement event reasoning | M6 | Lab 6 | +| CO7 Test and troubleshoot | M7 | Lab 7 | +| CO8 Integrate and operate safely | M8 | Lab 8 | +| CO9 Deliver traceable solution | all | Capstone | + +## Assessment model + +- **Diagnostic:** ungraded; identifies prior knowledge. +- **Module checks:** formative; target 80%; repeat after remediation. +- **Labs:** evidence-based practice; self-check against acceptance criteria. +- **Final assessment:** summative knowledge/application check; pass mark 75%. +- **Capstone:** summative performance assessment; pass mark 70% plus critical criteria. + +## Suggested pacing + +A four-week plan uses two modules per week plus the capstone. An eight-week plan uses one module per week, then capstone and remediation. Completion is based on demonstrated outcomes, not time spent. diff --git a/course-site/docs/environment-setup.md b/course-site/docs/environment-setup.md new file mode 100644 index 0000000..041ae60 --- /dev/null +++ b/course-site/docs/environment-setup.md @@ -0,0 +1,50 @@ +--- +title: Environment Setup +description: Reproducible development environment for the Drools 10.2 labs. +sidebar_position: 4 +--- + +# Environment Setup + +## Baseline + +Use JDK 17 or later, Apache Maven 3.9.6 or later, Git, an editor/IDE with Java support, and Drools / Apache KIE 10.2.0 dependencies for lab projects. The course uses a Maven-first workflow because it is reproducible and maps directly to the Java/Drools build model. + +## Verify the workstation + +```bash +java -version +mvn -version +git --version +``` + +Record the output in your learner notes. + +## Minimal Maven version pattern + +Pin the Drools release used for assessment evidence and manage versions centrally. + +```xml + + 17 + 10.2.0 + +``` + +A production project should follow the Apache KIE 10.2 dependency guidance and should not silently mix release families. + +## Clean-environment check + +1. Create a disposable Maven project. +2. Run `mvn -q test`. +3. Confirm the IDE uses the same JDK as Maven. +4. Confirm the repository has no credentials. +5. Create a lab branch and make one test commit. + +## Troubleshooting baseline + +If Maven resolves incompatible artifacts, run `mvn dependency:tree`. If runtime behaviour differs from the course, confirm exact Drools/Java/Maven versions, run from a clean checkout, remove IDE-specific assumptions, and reduce the scenario to one fact and one rule. + +## Lab safety + +Use only synthetic data. Never store secrets in source, configuration, screenshots or logs. Do not expose a local development endpoint to the public internet merely to complete a course exercise. diff --git a/course-site/docs/index.md b/course-site/docs/index.md new file mode 100644 index 0000000..086d470 --- /dev/null +++ b/course-site/docs/index.md @@ -0,0 +1,31 @@ +--- +title: Drools Decision Automation +description: Home page for the Skunkworks Academy self-paced Drools 10.2 decision automation course. +sidebar_position: 0 +slug: / +--- + +# Drools Decision Automation + +Build practical competence in rule-driven decision automation with **Drools 10.2** through structured modules, executable labs, formative mastery checks and an end-to-end capstone. + +## Course at a glance + +- 8 technical modules +- 8 hands-on labs +- 32–40 nominal learning hours +- diagnostic and summative assessment +- capstone performance assessment +- learner notes, glossary, cheat sheet and troubleshooting guide +- standards-aligned quality and accessibility controls +- versioned technical baseline and publishing evidence + +## Begin + +Go to **[Start Here](./start-here)** for outcomes, completion rules and the learning contract. + +Then complete the **[Diagnostic Assessment](./assessment/diagnostic)** and **[Environment Setup](./environment-setup)**. + +## Technical baseline + +The learning content is modernized from the repository's original Drools 8 instructor-led course and targets the current Apache KIE/Drools 10.2 documentation family. Legacy PDFs and course source assets are preserved outside this canonical learner site. diff --git a/course-site/docs/labs/lab-01-first-rules.md b/course-site/docs/labs/lab-01-first-rules.md new file mode 100644 index 0000000..ae72eb6 --- /dev/null +++ b/course-site/docs/labs/lab-01-first-rules.md @@ -0,0 +1,42 @@ +--- +title: Lab 1 — Build and Explain Your First Rules +description: Hands-on lab 1 for the Drools self-paced course. +sidebar_position: 1 +--- + +# Lab 1 — Build and Explain Your First Rules + +## Goal + +Create a small Maven-based Drools project that classifies synthetic orders and prove the result with tests. + +**Expected effort:** 90–150 minutes. + +## Tasks + +1. Create a clean project pinned to Drools 10.2.0. +2. Model `Order` with `total`, `customerTier` and `reviewRequired`. +3. Write at least three rules with non-overlapping business intent. +4. Add positive, negative and boundary tests. +5. Run tests from the command line. +6. Explain which facts matched and why. + +## Required evidence + +Retain source commit SHA, rule/model files, automated test results and `LAB-NOTES.md` explaining design choices/problems. + +## Acceptance criteria + +- [ ] Project builds from a clean checkout. +- [ ] Rules have intent-revealing names. +- [ ] A 9,999.99 / 10,000 boundary is tested. +- [ ] Tests prove match and no-match cases. +- [ ] No credentials or external services are required. + +## Reflection + +In 100–200 words: what assumption did you test rather than believe, what changes before production, and which course outcome did this lab demonstrate? + +## Integrity + +Do not use instructor solution files while completing the lab. AI-generated code, if allowed by the publishing platform, must be reviewed, tested and explainable by you. diff --git a/course-site/docs/labs/lab-02-rule-authoring.md b/course-site/docs/labs/lab-02-rule-authoring.md new file mode 100644 index 0000000..7e2cc8e --- /dev/null +++ b/course-site/docs/labs/lab-02-rule-authoring.md @@ -0,0 +1,38 @@ +--- +title: Lab 2 — Insurance Eligibility Rule Set +description: Hands-on lab 2 for the Drools self-paced course. +sidebar_position: 2 +--- + +# Lab 2 — Insurance Eligibility Rule Set + +## Goal + +Implement a maintainable synthetic insurance eligibility rule set with joins and review controls. + +**Expected effort:** 90–150 minutes. + +## Tasks + +1. Define synthetic `Applicant`, `PolicyRequest` and `Alert` facts. +2. Implement eligibility rules using explicit constraints and bindings. +3. Use `exists` or `not` where it better expresses intent. +4. Create a manual-review rule for open alerts. +5. Add a conflicting-policy test and resolve the ambiguity in the rule design. +6. Document one rejected design and why it was rejected. + +## Required evidence + +Retain source commit SHA, relevant rules, automated test output and `LAB-NOTES.md`. + +## Acceptance criteria + +- [ ] No real health/financial data. +- [ ] Rule overlap is intentional or eliminated. +- [ ] A join is constrained by a shared identifier. +- [ ] At least six automated tests. +- [ ] Consequences contain no network/database calls. + +## Reflection + +Explain the most important ambiguity you discovered and how tests made it visible. diff --git a/course-site/docs/labs/lab-03-kie-sessions.md b/course-site/docs/labs/lab-03-kie-sessions.md new file mode 100644 index 0000000..b32d940 --- /dev/null +++ b/course-site/docs/labs/lab-03-kie-sessions.md @@ -0,0 +1,36 @@ +--- +title: Lab 3 — Compare Runtime Models +description: Hands-on lab 3 comparing stateless and stateful Drools execution. +sidebar_position: 3 +--- + +# Lab 3 — Compare Runtime Models + +## Goal + +Implement the same simple decision with stateless and stateful execution and justify the production choice. + +**Expected effort:** 90–150 minutes. + +## Tasks + +1. Create an independent quote decision suited to stateless execution. +2. Create a small evolving-case scenario where state changes over several steps. +3. Record lifecycle/disposal responsibilities. +4. Run tests appropriate to each design. +5. Write a one-page architecture decision record (ADR). + +## Required evidence + +Source commit, tests, ADR and learner notes. + +## Acceptance criteria + +- [ ] Choice is justified from state lifetime, not preference. +- [ ] Stateful facts are explicitly updated/retracted. +- [ ] Test isolation is clear. +- [ ] ADR identifies concurrency and failure/recovery implications. + +## Reflection + +What operational responsibility appears when state survives longer than one request? diff --git a/course-site/docs/labs/lab-04-inference.md b/course-site/docs/labs/lab-04-inference.md new file mode 100644 index 0000000..0793e96 --- /dev/null +++ b/course-site/docs/labs/lab-04-inference.md @@ -0,0 +1,32 @@ +--- +title: Lab 4 — Inference and Truth Maintenance +description: Hands-on lab 4 for multi-rule inference, derived facts and execution stability. +sidebar_position: 4 +--- + +# Lab 4 — Inference and Truth Maintenance + +## Goal + +Build a multi-rule classification where derived conclusions change when supporting evidence changes. + +**Expected effort:** 90–150 minutes. + +## Tasks + +1. Model a case with primary evidence and a derived risk marker. +2. Create at least two rules forming a clear inference chain. +3. Demonstrate removal/change of supporting evidence. +4. Prevent accidental execution loops. +5. Test initial, derived, changed and stable states. + +## Acceptance criteria + +- [ ] Inference chain is explainable. +- [ ] No reliance on source-file ordering. +- [ ] Termination is tested. +- [ ] Derived state follows declared support semantics. + +## Required evidence + +Source commit, interaction tests, activation/diagnostic evidence where useful, and reflection. diff --git a/course-site/docs/labs/lab-05-dmn.md b/course-site/docs/labs/lab-05-dmn.md new file mode 100644 index 0000000..def9e59 --- /dev/null +++ b/course-site/docs/labs/lab-05-dmn.md @@ -0,0 +1,33 @@ +--- +title: Lab 5 — Model a Decision Service +description: Hands-on lab 5 using a decision table or DMN with explicit boundary tests. +sidebar_position: 5 +--- + +# Lab 5 — Model a Decision Service + +## Goal + +Represent eligibility/risk logic in a decision table or DMN and test boundaries. + +**Expected effort:** 90–150 minutes. + +## Tasks + +1. Define inputs, outputs and decision ownership. +2. Create an eligibility decision plus a risk-band decision. +3. Use explicit boundary values. +4. Add coverage for missing/invalid inputs. +5. Compare the model to an equivalent DRL approach. +6. Record why the selected representation is easier to govern. + +## Acceptance criteria + +- [ ] Decision dependencies are explicit. +- [ ] 17/18/19 and risk-band boundaries are tested where applicable. +- [ ] No ambiguous overlapping table rows. +- [ ] Outputs have stable names/types. + +## Required evidence + +Decision model/table, tests, comparison note and source commit. diff --git a/course-site/docs/labs/lab-06-cep.md b/course-site/docs/labs/lab-06-cep.md new file mode 100644 index 0000000..c087d06 --- /dev/null +++ b/course-site/docs/labs/lab-06-cep.md @@ -0,0 +1,33 @@ +--- +title: Lab 6 — Detect an Event Pattern +description: Hands-on lab 6 implementing bounded temporal reasoning with synthetic events. +sidebar_position: 6 +--- + +# Lab 6 — Detect an Event Pattern + +## Goal + +Implement synthetic transaction-event detection over a bounded time period. + +**Expected effort:** 90–150 minutes. + +## Tasks + +1. Create a transaction event with event time and amount. +2. Detect three qualifying events within a ten-minute window. +3. Use a controlled/pseudo clock in tests where supported by the chosen implementation. +4. Test late/duplicate assumptions explicitly. +5. Ensure a flagged account does not generate uncontrolled repeated alerts. + +## Acceptance criteria + +- [ ] Time source is documented. +- [ ] Window is bounded. +- [ ] Tests do not sleep for real time. +- [ ] Duplicate/replay policy is stated. +- [ ] Session/state lifecycle is bounded. + +## Required evidence + +Source commit, temporal tests, rule/model source and event-lifecycle note. diff --git a/course-site/docs/labs/lab-07-testing.md b/course-site/docs/labs/lab-07-testing.md new file mode 100644 index 0000000..ad5ec51 --- /dev/null +++ b/course-site/docs/labs/lab-07-testing.md @@ -0,0 +1,33 @@ +--- +title: Lab 7 — Break, Diagnose and Repair a Rule Set +description: Hands-on lab 7 using test-first defect isolation and permanent regression evidence. +sidebar_position: 7 +--- + +# Lab 7 — Break, Diagnose and Repair a Rule Set + +## Goal + +Use tests and diagnostics to find a deliberately introduced rule defect and create permanent regression evidence. + +**Expected effort:** 90–150 minutes. + +## Tasks + +1. Introduce/select one realistic defect: boundary, overlap, missing update or broad join. +2. Capture the failing test first. +3. Use logs/listeners or activation evidence to localize the problem. +4. Repair the smallest responsible rule/model. +5. Add regression coverage. +6. Run the complete test suite. + +## Acceptance criteria + +- [ ] Failing evidence precedes the fix. +- [ ] Root cause is stated, not only the symptom. +- [ ] Regression test would fail if the defect returned. +- [ ] Diagnostic code does not add business side effects. + +## Required evidence + +Before/after commit references, failing/passing test output and root-cause note. diff --git a/course-site/docs/labs/lab-08-service.md b/course-site/docs/labs/lab-08-service.md new file mode 100644 index 0000000..6ce5d55 --- /dev/null +++ b/course-site/docs/labs/lab-08-service.md @@ -0,0 +1,34 @@ +--- +title: Lab 8 — Service-Ready Decision Component +description: Hands-on lab 8 wrapping a Drools decision behind a secure and observable application boundary. +sidebar_position: 8 +--- + +# Lab 8 — Service-Ready Decision Component + +## Goal + +Wrap a Drools decision behind a clean application boundary with trace metadata and safe configuration. + +**Expected effort:** 90–150 minutes. + +## Tasks + +1. Define a request/response contract using synthetic data. +2. Validate input before rule invocation. +3. Return outcome plus rule/model/application version metadata. +4. Keep external side effects outside rules. +5. Add structured logging without sensitive values. +6. Document rollout and rollback steps. + +## Acceptance criteria + +- [ ] Invalid input fails predictably. +- [ ] Decision version is traceable. +- [ ] Secrets are not in source. +- [ ] Rule assets are immutable in the built artifact. +- [ ] Rollback is documented. + +## Required evidence + +Source commit, automated tests, sample sanitized response and rollout/rollback runbook. diff --git a/course-site/docs/learner-guide.md b/course-site/docs/learner-guide.md new file mode 100644 index 0000000..5ceae89 --- /dev/null +++ b/course-site/docs/learner-guide.md @@ -0,0 +1,44 @@ +--- +title: Learner Guide +description: How to study, obtain support, document evidence and recover from difficulties in the self-paced Drools course. +sidebar_position: 2 +--- + +# Learner Guide + +## Study method + +Each module follows the same learning cycle: **Orient → Learn → Inspect → Practise → Check → Reflect**. + +- **Orient:** review outcomes, prerequisites and estimated effort. +- **Learn:** read the concept sections and inspect the examples. +- **Inspect:** explain the example before running it. +- **Practise:** complete the linked lab without using the solution key. +- **Check:** complete the module knowledge check. +- **Reflect:** write a short note describing what changed in your mental model. + +Plan focused sessions of 45–90 minutes. For a technical self-paced course, small repeated sessions usually produce better retention than a single long session. + +## Prerequisite knowledge + +You should be able to read/write basic Java, use Maven from a terminal, understand unit-test assertions, work with Git branches/commits, distinguish source/config/build/runtime artifacts, and understand basic HTTP/service concepts. + +## Getting help + +When blocked, record the intended outcome, exact command/test, complete error, Java/Maven/Drools versions, smallest reproducible rule/model, and what you already tried. Use the troubleshooting guide before escalating and never post credentials, tokens, customer data or assessment answers. + +## Assessment integrity + +Formative checks are for learning. The final assessment and capstone are evidence of competence. Your submission must be your own explainable work. External references and AI assistance may be used only within the policy set by the publishing learning platform. + +## Accessibility and accommodations + +The canonical material is text-first and is designed toward WCAG 2.2 AA. Learners who require an alternative format, additional time, keyboard-only interaction, captions/transcripts or another reasonable accommodation should use the Academy accessibility/support process configured with the published course. If a diagram conveys information, surrounding text must convey the same essential information. Do not rely on colour alone. + +## Privacy and safe lab data + +All labs use synthetic data. Never copy real personal, health, financial or customer records into a course repository. Do not commit secrets. If a secret is exposed, revoke it; deleting the latest file is not sufficient. + +## Version policy + +The canonical technical baseline is shown on Start Here. Course maintainers should compare examples with referenced Apache KIE documentation, review the baseline at least every six months and review immediately after a major Drools release. diff --git a/course-site/docs/modules/01-foundations.md b/course-site/docs/modules/01-foundations.md new file mode 100644 index 0000000..507fabd --- /dev/null +++ b/course-site/docs/modules/01-foundations.md @@ -0,0 +1,68 @@ +--- +title: Module 1 — Decision Automation Foundations +description: Self-paced Drools course module 1 with concepts, examples, checks and practice guidance. +sidebar_position: 1 +--- + +# Module 1 — Decision Automation Foundations + +
+ +**Nominal effort:** 3–5 hours +**Prerequisite:** Environment Setup +**Evidence:** linked lab + knowledge-check responses + +
+ +## Learning outcomes + +By the end of this module, you can: + +- Differentiate procedural control flow from declarative rule evaluation. +- Explain rules, facts, working memory, production memory, activations and agenda. +- Create and execute a minimal rule project. +- Recognize suitable and unsuitable rule-engine use cases. + +## Why a rule engine? + +A rule engine externalizes decision logic that would otherwise become scattered conditional code. The value is not simply “fewer `if` statements”; it is the ability to represent changing policy in a form that can be reviewed, tested, versioned and evaluated against facts. + +A strong use case has explicit decision policy, frequent rule change, many interacting conditions, a need for explanation or business/technical collaboration, or a requirement to apply the same policy consistently across channels. A weak use case is a trivial deterministic transformation with no policy volatility. + +## Core engine model + +Drools evaluates **facts** against **rules**. Rules are stored in production memory. Facts are inserted into working memory. Matching conditions create activations coordinated through the agenda. A consequence can change state or derive new facts, potentially creating more matches. + +Think: *declare what conditions make a rule applicable, then let the engine determine matches and execution according to runtime semantics.* + +## First DRL + +```text +package academy.pricing + +rule "Flag high value order" +when + $o : Order(total >= 10000) +then + $o.setReviewRequired(true); +end +``` + +The left-hand side describes the pattern; the right-hand side describes the consequence. `$o` binds the matched fact. + +## Design discipline + +Use intent-revealing rule names. Keep conditions side-effect free and consequences small. Keep external I/O out of rule consequences; use application/service boundaries for network calls and durable side effects. + +## Scenario + +The course reuses the legacy repository's insurance theme with synthetic data. You will progressively automate eligibility, risk classification, premium adjustments and event-driven fraud indicators without processing real health or financial records. + +## Knowledge check + +1. Why is “many `if` statements” not by itself a sufficient reason to introduce Drools? +2. What changes in working memory can cause new activations? +3. Why should external REST calls normally not occur inside a rule consequence? +4. Describe one decision that benefits from traceable policy rules. + +**Mastery target:** 4/4 with explanations in your own words. diff --git a/course-site/docs/modules/02-drl.md b/course-site/docs/modules/02-drl.md new file mode 100644 index 0000000..df09ef4 --- /dev/null +++ b/course-site/docs/modules/02-drl.md @@ -0,0 +1,74 @@ +--- +title: Module 2 — DRL Rule Authoring +description: Self-paced Drools course module 2 with concepts, examples, checks and practice guidance. +sidebar_position: 2 +--- + +# Module 2 — DRL Rule Authoring + +
+ +**Nominal effort:** 4–5 hours +**Prerequisite:** Module 1 +**Evidence:** Lab 2 + knowledge-check responses + +
+ +## Learning outcomes + +- Write readable DRL patterns, constraints and bindings. +- Use collections, logical composition and rule attributes deliberately. +- Separate domain intent from technical side effects. +- Review rule sets for ambiguity, overlap and maintainability. + +## Rule anatomy + +```text +rule "Adult applicant with standard risk" +when + $a : Applicant(age >= 18, riskScore < 60) +then + $a.setBand("STANDARD"); +end +``` + +Constraints narrow matches. Bindings make matched objects available to later patterns or consequences. + +## Constraint composition + +Use explicit conditions a reviewer can reason about. If a rule represents regulatory/commercial policy, include a traceable policy identifier in metadata or comments. Consider overlap: two valid rules may match the same fact and create contradictory outcomes. + +## `exists`, `not`, collections and joins + +```text +rule "Require manual review for applicant with open alert" +when + $a : Applicant($id : id) + exists Alert(applicantId == $id, status == "OPEN") +then + $a.setManualReview(true); +end +``` + +When joining fact types, constrain relationships. Broad patterns can create cross-products and performance problems. + +## Consequence hygiene + +Prefer consequences that update domain state or emit a decision result. Do not hide database access, HTTP calls, credential use or retry loops in consequences. + +## Rule attributes + +Salience and agenda grouping can control execution, but they should not substitute for a clear model. A web of numeric priorities is difficult to maintain. Where ordering is essential, document why and test it. + +## Language level + +Drools 10 includes newer language capabilities. Record the chosen language level and avoid mixing examples from incompatible documentation versions. + +## Knowledge check + +1. What problem can an unconstrained join create? +2. How does `exists` differ from binding every matching fact? +3. Why can extensive salience values become a maintenance smell? +4. How would you move an HTTP side effect outside a consequence? + +**Mastery target:** 80%. diff --git a/course-site/docs/modules/03-kie-runtime.md b/course-site/docs/modules/03-kie-runtime.md new file mode 100644 index 0000000..d5f35c3 --- /dev/null +++ b/course-site/docs/modules/03-kie-runtime.md @@ -0,0 +1,58 @@ +--- +title: Module 3 — KIE Runtime and Sessions +description: Self-paced Drools course module 3 covering KIE runtime, stateful/stateless sessions and Rule Units. +sidebar_position: 3 +--- + +# Module 3 — KIE Runtime and Sessions + +
+ +**Nominal effort:** 4–5 hours +**Prerequisite:** Module 2 +**Evidence:** Lab 3 + architecture decision note + +
+ +## Learning outcomes + +- Explain KIE base/container/session responsibilities. +- Choose stateless versus stateful execution from requirements. +- Describe lifecycle obligations of a stateful session. +- Compare traditional KIE session and Rule Unit-oriented designs. + +## Runtime layers + +A KIE base represents compiled knowledge. A KIE session is the runtime context that accepts data and executes rules. Applications may work through KIE containers/sessions or newer Rule Unit-oriented APIs. The decision is based on runtime state and isolation, not API brevity. + +## Stateless sessions + +A stateless session fits validation, calculation, routing and filtering when requests are independent and no prior invocation state is required. + +## Stateful sessions + +A stateful session retains facts and supports iterative inference/event scenarios. Define session ownership, concurrency boundaries, fact update/retraction, disposal, memory bounds and recovery/persistence behaviour. + +## Rule Units + +Drools 10 supports Rule Unit style; official getting-started guidance recommends it for microservice/cloud-native-oriented applications. Treat it as an architectural option, not a mandatory rewrite of every KIE session application. + +## Selection exercise + +Choose and justify an execution model for: + +- one independent insurance quote; +- transaction events correlated over a rolling period; +- a batch of independent validations; +- an evolving eligibility case with inserted/retracted evidence. + +Your justification must mention state lifetime, concurrency, explainability and recovery. + +## Knowledge check + +1. Why is a long-lived stateful session an operational resource? +2. What does stateless execution simplify? +3. What evidence would justify a stateful design? +4. When might Rule Units be preferable? + +**Mastery target:** 80%. diff --git a/course-site/docs/modules/04-inference.md b/course-site/docs/modules/04-inference.md new file mode 100644 index 0000000..5ddc93b --- /dev/null +++ b/course-site/docs/modules/04-inference.md @@ -0,0 +1,63 @@ +--- +title: Module 4 — Inference, Truth Maintenance and Execution Control +description: Self-paced Drools module on forward chaining, truth maintenance, agenda behaviour and loop prevention. +sidebar_position: 4 +--- + +# Module 4 — Inference, Truth Maintenance and Execution Control + +
+ +**Nominal effort:** 4–5 hours +**Prerequisite:** Module 3 +**Evidence:** Lab 4 + interaction tests + +
+ +## Learning outcomes + +- Explain forward chaining and inference. +- Use logical insertion/truth maintenance conceptually and safely. +- Analyse agenda/conflict behaviour rather than assuming source order. +- Design tests that prove rule interaction. + +## Forward chaining + +A matched rule can change state, satisfy another rule and continue until no relevant activations remain or execution is controlled. This is inference. Test the rule set as a system, not only rule-by-rule. + +## Truth maintenance + +Truth maintenance links logically derived facts to the evidence supporting them. When support disappears, derived conclusions can be retracted. Use this only where derivation semantics are explicit. + +## Conflict and agenda reasoning + +Multiple rules can be eligible simultaneously. Do not assume visual file order is business ordering. Model and test essential control explicitly. + +## Avoiding loops + +A rule update can reactivate itself. Design stable transitions and state guards: + +```text +rule "Classify unprocessed applicant" +when + $a : Applicant(classification == null, riskScore >= 80) +then + $a.setClassification("HIGH"); + update($a); +end +``` + +The null guard helps make the transition one-way. + +## Interaction tests + +Cover single-rule firing, cooperative multiple rules, conflict, evidence removal, repeated evaluation and termination/no-loop behaviour. + +## Knowledge check + +1. What is inference? +2. Why is source-file order a poor business control? +3. What problem does truth maintenance solve? +4. How can a state guard prevent a loop? + +**Mastery target:** 80%. diff --git a/course-site/docs/modules/05-decision-models.md b/course-site/docs/modules/05-decision-models.md new file mode 100644 index 0000000..ef253a8 --- /dev/null +++ b/course-site/docs/modules/05-decision-models.md @@ -0,0 +1,53 @@ +--- +title: Module 5 — Decision Tables and DMN +description: Self-paced module on choosing DRL, decision tables or DMN and validating decision boundaries. +sidebar_position: 5 +--- + +# Module 5 — Decision Tables and DMN + +
+ +**Nominal effort:** 4–5 hours +**Prerequisite:** Module 4 +**Evidence:** Lab 5 + decision-model tests + +
+ +## Learning outcomes + +- Select DRL, decision tables or DMN based on decision structure and audience. +- Explain DMN decision requirements and FEEL expressions at a practical level. +- Create tabular logic with coverage/overlap review. +- Test decision models with representative boundaries. + +## Choose a representation deliberately + +- **DRL** fits expressive rule interactions and fact-centric reasoning. +- **Decision tables** fit repetitive condition/action matrices reviewers naturally understand as policy tables. +- **DMN** fits explicit decision requirements, business-readable decision logic and portable decision-service models. + +The best representation makes policy easiest to understand, validate, test and change without losing technical control. + +## Decision tables + +Define input columns, output/action columns, hit expectations and boundaries. Review uncovered combinations, overlap, defaults and null/missing-input behaviour. + +## DMN + +DMN is an OMG standard for operational decision modeling. A model can show input data, decisions and dependencies, with logic expressed using FEEL or decision tables. + +Example chain: `Applicant data → Eligibility → Risk Band → Premium Adjustment → Decision`. + +## Boundary testing + +For an age threshold of 18, test 17, 18 and 19. For a band ending at 79, test 78, 79 and 80. Boundary tests reveal specification defects efficiently. + +## Knowledge check + +1. When is a decision table preferable to DRL? +2. What does a DMN decision-requirements view communicate? +3. Why are boundary tests essential? +4. What is the risk of hiding policy in Java helpers? + +**Mastery target:** 80%. diff --git a/course-site/docs/modules/06-cep.md b/course-site/docs/modules/06-cep.md new file mode 100644 index 0000000..fef9af1 --- /dev/null +++ b/course-site/docs/modules/06-cep.md @@ -0,0 +1,49 @@ +--- +title: Module 6 — Complex Event Processing +description: Self-paced Drools module on events, stream reasoning, temporal constraints and bounded state. +sidebar_position: 6 +--- + +# Module 6 — Complex Event Processing + +
+ +**Nominal effort:** 4–5 hours +**Prerequisite:** Module 5 +**Evidence:** Lab 6 + temporal tests + +
+ +## Learning outcomes + +- Distinguish state facts from occurrence events. +- Explain stream-oriented processing and temporal reasoning. +- Use windows/temporal constraints to express bounded event patterns. +- Identify operational risks in long-lived event sessions. + +## Facts versus events + +A fact often represents current state; an event represents something that occurred at a point/interval in time. CEP is valuable when a decision depends on what happened, when, and in what sequence/frequency. + +## Stream reasoning + +Temporal operators and windows allow bounded reasoning rather than retaining every event forever. + +Example intent: flag an account when at least three high-value transactions occur within ten minutes and it is not already under review. Define timestamp source, threshold, bounded window, duplicate/replay behaviour and stable action semantics. + +## Time semantics + +Specify ingestion time vs event time vs test clock. Production systems must account for late, duplicate and out-of-order events. Tests should control time rather than sleep. + +## Memory and lifecycle + +Long-running sessions can accumulate state. Use expiration/window semantics and monitoring. A correct rule set that grows without bound is unsafe. + +## Knowledge check + +1. Why is a time window both business and resource-management policy? +2. What happens when duplicate events replay? +3. Why should tests control time? +4. How does CEP state differ operationally from a stateless quote decision? + +**Mastery target:** 80%. diff --git a/course-site/docs/modules/07-quality.md b/course-site/docs/modules/07-quality.md new file mode 100644 index 0000000..3f711fe --- /dev/null +++ b/course-site/docs/modules/07-quality.md @@ -0,0 +1,58 @@ +--- +title: Module 7 — Testing, Performance and Troubleshooting +description: Self-paced Drools module on automated verification, diagnostics, performance risks and root-cause analysis. +sidebar_position: 7 +--- + +# Module 7 — Testing, Performance and Troubleshooting + +
+ +**Nominal effort:** 4–5 hours +**Prerequisite:** Module 6 +**Evidence:** Lab 7 + regression test + +
+ +## Learning outcomes + +- Build positive, negative, boundary and interaction tests. +- Use logs/listeners/diagnostics without business side effects. +- Identify broad joins, unbounded state and activation churn. +- Use a systematic defect-isolation workflow. + +## Rule quality is executable evidence + +Compilation proves syntax/packaging, not business correctness. Build tests for positive, negative, boundary, null/missing, interaction, repeated evaluation and regression cases. + +## Testing levels + +Use fast rule-level tests, integration tests for packaging/configuration, and a small number of critical end-to-end tests. Every production policy defect should become a regression test. + +## Diagnostics + +Use runtime event listeners/logging to understand activations while keeping diagnostic code simple and side-effect free. + +## Performance + +Watch for broad cross-products, expensive constraints, unnecessary updates, activation churn, unbounded sessions and excessive hot-path logging. Measure with representative data before optimizing. + +## Defect isolation + +1. Capture input and expected decision. +2. Pin versions. +3. Reduce to the smallest failing test. +4. Inspect matches/activations. +5. Verify fact lifecycle. +6. Check control mechanisms. +7. Fix the responsible policy/implementation. +8. Add regression evidence. + +## Knowledge check + +1. What does a compilation test fail to prove? +2. Why use representative facts for performance testing? +3. Why can unnecessary `update()` calls be expensive? +4. What is the value of one smallest failing test? + +**Mastery target:** 80%. diff --git a/course-site/docs/modules/08-operations.md b/course-site/docs/modules/08-operations.md new file mode 100644 index 0000000..cbba706 --- /dev/null +++ b/course-site/docs/modules/08-operations.md @@ -0,0 +1,51 @@ +--- +title: Module 8 — Integration, Security and Operations +description: Self-paced Drools module on service boundaries, version traceability, security, observability and rollout controls. +sidebar_position: 8 +--- + +# Module 8 — Integration, Security and Operations + +
+ +**Nominal effort:** 4–5 hours +**Prerequisite:** Module 7 +**Evidence:** Lab 8 + rollout/rollback note + +
+ +## Learning outcomes + +- Place Drools behind a clear application/service boundary. +- Version decision assets and expose trace metadata. +- Apply secure development and data minimization. +- Design observability and safe rollout controls. + +## Integration boundary + +A service boundary should validate/normalize input, map transport models to domain facts, invoke the decision runtime, capture outcome/version metadata, perform approved external side effects outside rules, and return a stable contract. + +## Versioning and explainability + +Record application release, rule/model version or commit, timestamp, correlation identifier and non-sensitive reason/outcome codes. Do not dump secrets or unnecessary personal data for traceability. + +## Security + +Authenticate/authorize callers, validate input, minimize data, protect data in transit/at rest, keep credentials outside source, restrict rule/model changes, review dependencies, separate environments and preserve an auditable change trail. “Business editable” rules still require governance. + +## Deployment and rollback + +Use immutable versioned artifacts. Promote tested versions through environments and define rollback before rollout. For high-impact changes, use canary/shadow comparison when architecture permits. + +## Observability + +Measure decision count/latency, errors/timeouts, rule/model version distribution, unexpected defaults/no-decisions, domain outcome shifts and state/session resource indicators where relevant. + +## Knowledge check + +1. Why avoid network side effects inside rules? +2. Which metadata supports traceability without full input logging? +3. Why do rule assets require change control? +4. What is the value of shadow/canary comparison? + +**Mastery target:** 80%. diff --git a/course-site/docs/quality/accessibility.md b/course-site/docs/quality/accessibility.md new file mode 100644 index 0000000..0c3b93e --- /dev/null +++ b/course-site/docs/quality/accessibility.md @@ -0,0 +1,48 @@ +--- +title: Accessibility and Inclusive Publishing +description: WCAG 2.2 AA authoring and QA requirements for the course. +sidebar_position: 2 +--- + +# Accessibility and Inclusive Publishing + +## Target + +Learner-facing web content targets **WCAG 2.2 Level AA**. + +## Authoring requirements + +- Use headings in logical hierarchy. +- Give links meaningful text; avoid repeated “click here”. +- Provide text alternatives for informative images. +- Do not encode meaning by colour alone. +- Ensure tables have understandable headers and avoid layout tables. +- Provide captions/transcripts for instructional audio/video. +- Keep code examples available as selectable text. +- Explain diagrams in surrounding prose. +- Avoid timed interactions for ordinary learning content. +- Use plain language without removing necessary terminology. +- Expand acronyms at first use. + +## Interaction requirements + +- All site navigation/controls must be operable by keyboard. +- Focus must remain visible and not be obscured. +- Custom touch/click targets should satisfy WCAG 2.2 target-size expectations. +- Host-platform authentication should follow accessible-authentication criteria. +- Error messages must identify the error and recovery guidance. + +## QA procedure before release + +1. Build the production site. +2. Navigate every route keyboard-only. +3. Test responsive layouts at 320 px and common desktop widths. +4. Run automated accessibility scanning on representative page types. +5. Manually inspect headings, landmarks, link purpose, code and table semantics. +6. Verify captions/transcripts for media. +7. Check contrast for authored/custom styles. +8. Test zoom/reflow at 200–400% as applicable. +9. Record defects and corrective commits. +10. Retain the accessibility review with release evidence. + +Automated scanning is necessary but not sufficient; manual testing remains required. diff --git a/course-site/docs/quality/publishing-checklist.md b/course-site/docs/quality/publishing-checklist.md new file mode 100644 index 0000000..9d10a6b --- /dev/null +++ b/course-site/docs/quality/publishing-checklist.md @@ -0,0 +1,64 @@ +--- +title: Publishing Checklist +description: Release gate for technical, instructional, accessibility and governance quality. +sidebar_position: 3 +--- + +# Publishing Checklist + +A release owner must complete this checklist for each public course version. + +## Technical + +- [ ] Drools baseline/version verified against current Apache KIE documentation. +- [ ] All lab projects execute from a clean environment. +- [ ] Docusaurus production build passes. +- [ ] Content validation script passes. +- [ ] Internal Markdown links and routes pass. +- [ ] No secrets or credentials are present. +- [ ] Dependency changes reviewed. + +## Instructional design + +- [ ] Outcomes use measurable performance verbs. +- [ ] Every course outcome has learning activity and assessment evidence. +- [ ] Labs contain goal, tasks, evidence and acceptance criteria. +- [ ] Final assessment blueprint matches stated outcomes. +- [ ] Capstone rubric is calibrated by a second reviewer. +- [ ] Estimated effort is checked against pilot learner evidence. + +## Content + +- [ ] Technical SME approves examples. +- [ ] Terminology is consistent. +- [ ] Deprecated Drools patterns are identified or removed. +- [ ] References are current. +- [ ] Legacy PDF content is not the sole source of required learning. + +## Accessibility + +- [ ] WCAG 2.2 AA review completed for representative pages and custom interactions. +- [ ] Keyboard navigation verified. +- [ ] Images/diagrams have alternatives. +- [ ] Media has captions/transcripts. +- [ ] Contrast/reflow/zoom checks completed. +- [ ] Accessibility defects are closed or accepted with remediation plan. + +## Governance + +- [ ] Course owner identified. +- [ ] Version/release date recorded. +- [ ] Next review date recorded. +- [ ] Changes summarized in `CHANGELOG.md`. +- [ ] Controlled assessment keys are not published in learner docs. +- [ ] Learner support/feedback channels are configured. +- [ ] Completion/certificate rules are configured in the host learning platform. +- [ ] Release approval recorded. + +## Post-release + +- [ ] Monitor learner completion and assessment difficulty. +- [ ] Review accessibility/support incidents. +- [ ] Review broken/external links. +- [ ] Analyse evaluation feedback. +- [ ] Open corrective actions for material defects. diff --git a/course-site/docs/quality/standards-alignment.md b/course-site/docs/quality/standards-alignment.md new file mode 100644 index 0000000..7044564 --- /dev/null +++ b/course-site/docs/quality/standards-alignment.md @@ -0,0 +1,60 @@ +--- +title: Standards Alignment +description: Evidence-oriented mapping from the course design to current education, e-learning and learning-service quality standards. +sidebar_position: 1 +--- + +# Standards Alignment + +This page is a **design and evidence map**, not a certification statement. Exact ISO conformity must be assessed against legitimately obtained standard text and the organization's wider management system. + +## Current standards baseline + +### ISO 21001:2025 + +The current Educational Organizations Management Systems standard. Course evidence supports learner-centred competence development through defined outcomes, inclusive delivery expectations, assessment, feedback, traceability, review and continual improvement. + +**Evidence:** Start Here, Learner Guide, Course Map, assessment blueprint, capstone rubric, accessibility page, publishing checklist and governance files. + +### ISO 29993:2017 + +Addresses learning services outside formal education, including technology-mediated learning, with emphasis on defined learning goals and evaluation. + +**Evidence:** target audience/prerequisites, measurable outcomes, service/course information, structured activities, assessment and learner evaluation requirements. + +### ISO/IEC 40180:2017 + +Provides a quality reference framework for ICT-enhanced learning. + +**Evidence:** design process, learning-resource structure, technology/publishing controls, quality review, accessibility, learner support and improvement evidence. + +### ISO/PAS 25171:2026 + +Provides audit guidance for ISO 21001:2025 using questions, evidence and measures. + +**Evidence:** repository version history, review records, evidence register, release checklist and measurable completion/evaluation criteria. + +### WCAG 2.2 AA + +The current web accessibility target adopted for authored course pages. + +**Evidence:** text-first material, keyboard/focus requirements, semantic Markdown, accessible alternatives, contrast/responsive CSS and accessibility QA checklist. + +## Design control matrix + +| Quality concern | Implemented control | Evidence location | +|---|---|---| +| Defined competence | Measurable course/module outcomes | Start Here + modules | +| Learner information | scope, effort, prerequisites, completion rules | Start Here + Learner Guide | +| Constructive alignment | outcome-to-evidence map | Course Map | +| Practical competence | eight labs + capstone | Labs + Capstone | +| Assessment validity | blueprint, pass standards, rubric | Assessment + private assessor guide | +| Accessibility | WCAG 2.2 AA target + QA procedure | Accessibility | +| Version control | Git + course/release metadata | repository + changelog | +| Continual improvement | review cadence + evaluation + corrective actions | governance | +| Publishing integrity | build/content/link/accessibility gates | workflow + checklist | +| Confidentiality/integrity | answer keys outside public docs; synthetic lab data | instructor notes + learner guide | + +## Required organizational evidence not supplied by code + +An ISO audit may also require organization-level evidence such as leadership commitments, documented processes, responsibilities, personnel competence, complaints handling, supplier controls, management review, internal audits and corrective-action records. Those are outside the scope of a single course repository. diff --git a/course-site/docs/resources/cheat-sheet.md b/course-site/docs/resources/cheat-sheet.md new file mode 100644 index 0000000..e1019e2 --- /dev/null +++ b/course-site/docs/resources/cheat-sheet.md @@ -0,0 +1,62 @@ +--- +title: Drools Cheat Sheet +description: Compact reference for course labs and troubleshooting. +sidebar_position: 2 +--- + +# Drools Cheat Sheet + +## DRL pattern + +```text +package academy.example + +rule "Intent-revealing business rule" +when + $fact : DomainFact(field >= 10) +then + $fact.setOutcome("VALUE"); + update($fact); +end +``` + +## Condition reminders + +- Bind a fact: `$a : Applicant(...)` +- Relate facts using a shared key. +- Use `exists` when only existence matters. +- Use `not` when absence is the condition. +- Guard state transitions to avoid loops. +- Treat broad joins as a performance warning. + +## Test checklist + +- positive match +- negative/no-match +- lower boundary +- exact boundary +- upper boundary +- null/missing input +- multi-rule interaction +- repeat/idempotency +- regression case + +## Reproduction commands + +```bash +java -version +mvn -version +mvn -q test +mvn dependency:tree +git status +git rev-parse HEAD +``` + +## Review questions + +- What business statement does this rule represent? +- Could two rules write contradictory outcomes? +- Does the consequence contain hidden I/O? +- What causes this rule to stop matching? +- Which test proves the boundary? +- Which artifact/version produced the decision? diff --git a/course-site/docs/resources/glossary.md b/course-site/docs/resources/glossary.md new file mode 100644 index 0000000..5291440 --- /dev/null +++ b/course-site/docs/resources/glossary.md @@ -0,0 +1,26 @@ +--- +title: Glossary +description: Key Drools, decision automation and course quality terminology. +sidebar_position: 1 +--- + +# Glossary + +**Activation** — a rule instance eligible for execution because its conditions matched. +**Agenda** — runtime mechanism coordinating eligible rule executions. +**CEP** — Complex Event Processing; reasoning about event patterns, timing and sequences. +**Decision table** — tabular representation of conditions and outcomes/actions. +**DMN** — Decision Model and Notation, an OMG standard for operational decision modeling. +**DRL** — Drools Rule Language. +**Fact** — data made available to the rule engine for matching/evaluation. +**FEEL** — Friendly Enough Expression Language used in DMN. +**Inference** — deriving new conclusions/state through rule interactions. +**KIE base** — compiled knowledge repository used to create runtime sessions. +**KIE session** — runtime context for inserting data and executing rules. +**Production memory** — conceptual storage of rule definitions in the engine. +**Rule Unit** — model for grouping rule data and execution, useful in modern/cloud-native patterns. +**Salience** — rule priority control; use sparingly and test explicitly. +**Stateful session** — session retaining runtime state across interactions. +**Stateless session** — execution model that does not retain prior invocation state. +**Truth maintenance** — management of logically derived facts relative to supporting evidence. +**WCAG** — Web Content Accessibility Guidelines. diff --git a/course-site/docs/resources/references.md b/course-site/docs/resources/references.md new file mode 100644 index 0000000..ffff8cc --- /dev/null +++ b/course-site/docs/resources/references.md @@ -0,0 +1,24 @@ +--- +title: References +description: Primary technical, accessibility and quality references for course maintenance. +sidebar_position: 5 +--- + +# References + +## Technical + +- Apache KIE / Drools 10.2 documentation: `https://kie.apache.org/docs/10.2.x/` +- Apache KIE downloads/current release information: `https://kie.apache.org/docs/start/download/` +- Docusaurus documentation: `https://docusaurus.io/docs/` +- DMN specification/resources: Object Management Group (OMG), `https://www.omg.org/dmn/` + +## Quality and accessibility + +- ISO 21001:2025 — Educational organizations — Management systems for educational organizations — Requirements with guidance for use. +- ISO 29993:2017 — Learning services outside formal education — Service requirements. +- ISO/IEC 40180:2017 — Information technology — Quality for learning, education and training — Fundamentals and reference framework. +- ISO/PAS 25171:2026 — Educational organizations — Management systems — Guidance for auditing ISO 21001. +- W3C Web Content Accessibility Guidelines (WCAG) 2.2. + +The repository records alignment intent and evidence locations. It does not reproduce copyrighted ISO standards and does not assert certification. diff --git a/course-site/docs/resources/student-notes.md b/course-site/docs/resources/student-notes.md new file mode 100644 index 0000000..8468dcf --- /dev/null +++ b/course-site/docs/resources/student-notes.md @@ -0,0 +1,52 @@ +--- +title: Student Notes Template +description: Structured learner-note format for reflection, evidence and spaced retrieval. +sidebar_position: 4 +--- + +# Student Notes Template + +Copy this structure into your private learning journal for each module. + +## Module + +**Date:** +**Course version:** +**Commit/lab SHA:** + +### Three ideas I can explain without notes + +1. +2. +3. + +### One misconception I corrected + +- + +### One example I can reproduce + +```text +# Write the smallest useful example here. +``` + +### Evidence generated + +- tests: +- lab files: +- screenshots/logs if required: +- decision/architecture note: + +### Questions or uncertainties + +- + +### Retrieval prompts for later + +1. +2. +3. + +### Production transfer + +What would need stronger security, scalability, observability or governance before I used this pattern in a real system? diff --git a/course-site/docs/resources/troubleshooting.md b/course-site/docs/resources/troubleshooting.md new file mode 100644 index 0000000..c6fe797 --- /dev/null +++ b/course-site/docs/resources/troubleshooting.md @@ -0,0 +1,56 @@ +--- +title: Troubleshooting Guide +description: Structured root-cause workflow for Drools lab and runtime failures. +sidebar_position: 3 +--- + +# Troubleshooting Guide + +## Build failure + +Capture `java -version`, `mvn -version`, the full Maven error and `mvn dependency:tree`. Confirm the project uses the intended Drools release family and that the IDE is not silently running a different JDK. + +## Rule compiles but does not fire + +Check: + +1. Is the expected fact inserted? +2. Does its runtime type match the pattern? +3. Do all constraints evaluate as expected? +4. Is a field null or differently normalized? +5. Is the rule in the expected KIE base/session? +6. Is an agenda/rule attribute suppressing execution? +7. Does the test actually execute/fire rules? + +Reduce to one fact and one rule. + +## Rule fires repeatedly + +Look for a consequence updating a fact without moving it out of the condition. Add a stable transition/guard and test termination. + +## Unexpected multiple matches + +Search for overlapping rules and unconstrained joins. Record all matched rule names for the smallest reproducible input. + +## Decision model boundary defect + +Write three tests around the threshold: below, equal and above. Verify hit/overlap semantics and missing-input handling. + +## CEP test is flaky + +Replace real waiting with a controllable clock/test time source. Make event timestamps explicit and define ordering/replay/duplicate assumptions. + +## Production-style incident worksheet + +- correlation ID: +- application version: +- rule/model version: +- sanitized input class: +- expected outcome: +- actual outcome: +- first known bad version: +- reproducible test: +- root cause: +- corrective change: +- regression test: +- rollback/forward-fix decision: diff --git a/course-site/docs/start-here.md b/course-site/docs/start-here.md new file mode 100644 index 0000000..2e01124 --- /dev/null +++ b/course-site/docs/start-here.md @@ -0,0 +1,63 @@ +--- +title: Start Here +description: Orientation, scope, completion requirements and learning contract for the Drools self-paced course. +sidebar_position: 1 +--- + +# Drools Decision Automation — Self-Paced + +
+ +**Technical baseline:** Drools / Apache KIE 10.2.0 +**Delivery:** asynchronous, self-paced, lab-driven +**Nominal effort:** 32–40 hours +**Recommended pacing:** 4–8 weeks +**Difficulty:** intermediate +**Language:** English +**Version:** 1.0.0 + +
+ +This course develops the ability to design, implement, test, explain and operate business decision automation with Drools. It replaces the repository's legacy three-day, Drools 8 instructor-led structure with a mastery-oriented path designed for independent learners. + +## What you will be able to do + +On successful completion you will be able to: + +1. **Explain** the role of rules, facts, working memory, production memory and the agenda in the Drools engine. +2. **Implement** maintainable DRL rules using appropriate constraints, bindings and consequences. +3. **Select and configure** stateful, stateless and Rule Unit-oriented execution approaches for a stated use case. +4. **Control and explain** rule execution using inference, truth maintenance, agenda concepts and rule attributes. +5. **Model decisions** with decision tables and DMN, and justify when each representation is appropriate. +6. **Implement** event-driven rules using event processing, temporal reasoning and windows. +7. **Verify and troubleshoot** rule behaviour with automated tests, logging, diagnostics and performance evidence. +8. **Integrate and operate** Drools safely in a service-oriented application with versioning, observability and change controls. +9. **Deliver** a capstone decision service whose requirements, rules, tests and operational decisions are traceable. + +## Completion standard + +To earn course completion status, a learner should: + +- complete all eight modules and eight labs; +- score **80% or higher** on each module knowledge check after remediation; +- score **75% or higher** on the final assessment; +- achieve **70% or higher** on the capstone rubric, with no critical criterion marked “Not demonstrated”; +- submit the learner evidence described in each lab; +- complete the end-of-course evaluation. + +The Docusaurus site itself does not issue credentials. Completion tracking, identity verification, retakes and certificates must be enforced by the LMS or Academy platform used to publish this content. + +## Evidence you should retain + +Keep a learning portfolio containing lab repositories or commit SHAs, test output, design notes and decision records, knowledge-check remediation notes, capstone requirements-to-test traceability, and a final reflection. + +## Learning contract + +You may use official documentation and your own notes during labs. Do not copy model answers or assessment keys. Treat code generated by AI tools as untrusted input: review it, explain it, test it and cite assistance according to the Academy's assessment policy. + +## Where to go next + +1. Read the **Learner Guide**. +2. Run the **Diagnostic Assessment**. +3. Complete **Environment Setup**. +4. Follow the **Course Map** in sequence unless the diagnostic recommends a tailored path. diff --git a/course-site/docusaurus.config.js b/course-site/docusaurus.config.js new file mode 100644 index 0000000..9a025eb --- /dev/null +++ b/course-site/docusaurus.config.js @@ -0,0 +1,84 @@ +const config = { + title: 'Drools Decision Automation', + tagline: 'Self-paced, lab-driven training for Drools 10.2', + favicon: 'img/favicon.svg', + url: 'https://drools.skunkworksacademy.com', + baseUrl: '/', + organizationName: 'skunkworks-academy', + projectName: 'drools', + onBrokenLinks: 'throw', + markdown: { + hooks: { + onBrokenMarkdownLinks: 'throw' + } + }, + trailingSlash: false, + presets: [ + [ + 'classic', + { + docs: { + sidebarPath: require.resolve('./sidebars.js'), + routeBasePath: '/', + showLastUpdateAuthor: true, + showLastUpdateTime: true, + editUrl: 'https://github.com/skunkworks-academy/drools/edit/main/course-site/' + }, + blog: false, + theme: { + customCss: require.resolve('./src/css/custom.css') + } + } + ] + ], + themeConfig: { + metadata: [ + {name: 'course-provider', content: 'Skunkworks Academy'}, + {name: 'course-version', content: '1.0.0'}, + {name: 'drools-version', content: '10.2.0'}, + {name: 'delivery-mode', content: 'self-paced'} + ], + navbar: { + title: 'Drools Self-Paced', + items: [ + {to: '/start-here', label: 'Start Here', position: 'left'}, + {to: '/course-map', label: 'Course Map', position: 'left'}, + {to: '/capstone', label: 'Capstone', position: 'left'}, + {to: '/resources/glossary', label: 'Resources', position: 'left'}, + {href: 'https://github.com/skunkworks-academy/drools', label: 'GitHub', position: 'right'} + ] + }, + footer: { + style: 'dark', + links: [ + { + title: 'Course', + items: [ + {label: 'Start Here', to: '/start-here'}, + {label: 'Course Map', to: '/course-map'}, + {label: 'Final Assessment', to: '/assessment/final-assessment'} + ] + }, + { + title: 'References', + items: [ + {label: 'Apache KIE / Drools', href: 'https://kie.apache.org/'}, + {label: 'Docusaurus', href: 'https://docusaurus.io/'}, + {label: 'WCAG 2.2', href: 'https://www.w3.org/TR/WCAG22/'} + ] + } + ], + copyright: `Copyright © ${new Date().getFullYear()} Skunkworks Academy. Course source is version controlled.` + }, + prism: { + additionalLanguages: ['java', 'markup', 'bash', 'yaml'] + }, + colorMode: { + defaultMode: 'light', + disableSwitch: false, + respectPrefersColorScheme: true + } + } +}; + +module.exports = config; diff --git a/course-site/governance/COURSE_DESIGN_SPEC.md b/course-site/governance/COURSE_DESIGN_SPEC.md new file mode 100644 index 0000000..3440a7b --- /dev/null +++ b/course-site/governance/COURSE_DESIGN_SPEC.md @@ -0,0 +1,36 @@ +# Course Design Specification + +## Identity + +- Title: Drools Decision Automation — Self-Paced +- Provider: Skunkworks Academy +- Course version: 1.0.0 +- Technical baseline: Drools 10.2.0 +- Delivery: asynchronous online +- Nominal learning effort: 32–40 hours +- Target level: intermediate +- Review cycle: six-month technical review; annual full design review + +## Target audience + +Java developers, solution architects, technical business analysts, integration engineers and decision-automation practitioners. + +## Learning strategy + +Outcome-first alignment: every module contains measurable outcomes, concise concept material, a practical lab, mastery check and reflection. The capstone integrates technical and operational competence. + +## Assessment strategy + +Diagnostic → formative checks → labs → final assessment → capstone. Mastery thresholds are published. Controlled marking material remains outside learner-facing Docusaurus docs. + +## Learning environment + +Text-first Docusaurus site plus a Java/Maven lab environment. The host Academy/LMS supplies authenticated learner identity, progress tracking, submissions, retakes, feedback and credentials. + +## Data classification + +Course examples use synthetic/public technical data only. Course repositories must not solicit real health, financial or customer data. + +## Change control + +Material changes require: issue/change rationale; SME review; instructional/assessment impact check; accessibility impact check; build/validation; version/changelog update; release approval. diff --git a/course-site/governance/EVIDENCE_REGISTER.md b/course-site/governance/EVIDENCE_REGISTER.md new file mode 100644 index 0000000..bc0def8 --- /dev/null +++ b/course-site/governance/EVIDENCE_REGISTER.md @@ -0,0 +1,17 @@ +# Quality Evidence Register + +This register identifies evidence expected for each published course version. + +| Evidence | Owner | Location | Frequency | +|---|---|---|---| +| Course design specification | Course owner | `governance/COURSE_DESIGN_SPEC.md` | version change | +| Outcome/assessment matrix | Instructional designer | `governance/OUTCOME_ASSESSMENT_MATRIX.md` | material design change | +| Technical SME review | SME | PR review / issue | each release | +| Accessibility review | QA/accessibility reviewer | release issue/artifact | each release | +| Build/content validation | CI | GitHub Actions | every PR | +| Changelog | Course owner | `course-site/CHANGELOG.md` | each release | +| Learner evaluation summary | Course owner | learning platform | per cohort/quarter | +| Corrective actions | Course owner | GitHub issues / QMS | as required | +| Assessment calibration | Lead assessor | controlled record | each assessment version | + +Do not store sensitive learner records in this public repository. diff --git a/course-site/governance/OUTCOME_ASSESSMENT_MATRIX.md b/course-site/governance/OUTCOME_ASSESSMENT_MATRIX.md new file mode 100644 index 0000000..ed7c726 --- /dev/null +++ b/course-site/governance/OUTCOME_ASSESSMENT_MATRIX.md @@ -0,0 +1,13 @@ +# Outcome and Assessment Matrix + +| Outcome | Module | Lab | Formative | Final | Capstone | +|---|---|---|---|---|---| +| CO1 Engine concepts | 1,3 | 1,3 | yes | yes | yes | +| CO2 DRL authoring | 1,2 | 1,2 | yes | yes | yes | +| CO3 Runtime selection | 3 | 3 | yes | yes | yes | +| CO4 Inference/control | 4 | 4 | yes | yes | yes | +| CO5 Decision models | 5 | 5 | yes | yes | yes | +| CO6 CEP | 6 | 6 | yes | yes | yes | +| CO7 Testing/troubleshooting | 7 | 7 | yes | yes | yes | +| CO8 Integration/operations | 8 | 8 | yes | yes | yes | +| CO9 End-to-end delivery | all | all | reflection | scenario | primary | diff --git a/course-site/instructor-notes/assessment-guide.md b/course-site/instructor-notes/assessment-guide.md new file mode 100644 index 0000000..5d4b7ad --- /dev/null +++ b/course-site/instructor-notes/assessment-guide.md @@ -0,0 +1,39 @@ +# Controlled Assessment and Assessor Guide + +> This directory is intentionally outside the Docusaurus `docs/` tree. Do not copy controlled answers into public learner pages. + +## Purpose + +Maintain consistent marking, remediation and evidence practices. + +## Assessment principles + +- Assess stated outcomes only. +- Use the published rubric and blueprint. +- Require executable/inspectable evidence for technical claims. +- Do not award marks for unexplained complexity. +- Accept alternate correct implementations when they satisfy requirements and are explainable. +- Record the reason for any critical fail. +- Use a different item set for a retake where the platform supports an item bank. + +## Capstone calibration questions + +1. What constitutes sufficient automated testing? +2. Which security failures are critical? +3. How much trace metadata is sufficient without unnecessary input collection? +4. What evidence proves session-lifecycle understanding? +5. What decision-model complexity is appropriate for the course level? + +## Suggested oral verification + +- Explain one rule line-by-line. +- Change a boundary and predict failing tests. +- Explain why the chosen session type fits. +- Identify one production risk. +- Show the exact commit assessed. + +Do not use oral verification to introduce new unstated requirements. + +## Remediation + +Map missed evidence to outcomes, specify the minimum corrective activity, and allow reassessment according to controlled Academy policy. diff --git a/course-site/instructor-notes/course-notes.md b/course-site/instructor-notes/course-notes.md new file mode 100644 index 0000000..66083f3 --- /dev/null +++ b/course-site/instructor-notes/course-notes.md @@ -0,0 +1,34 @@ +# Course Owner / SME Notes + +## Technical baseline + +- Course target: Drools / Apache KIE 10.2.0 +- Minimum learner Java baseline: JDK 17+ +- Maven baseline used in course setup: 3.9.6+ +- Docusaurus: 3.10.2 + +## Legacy material policy + +`Course Material/` remains a source archive. It contains a Drools 8 course outline, student handbook, day-based slide PDFs, lab PDFs and case material. Do not remove it until copyright, accessibility, technical currency and records-retention requirements have been reviewed. + +Canonical learner content is `course-site/docs/`. + +## SME review hotspots + +Review these first after any Drools upgrade: + +- Maven artifacts/dependencies and archetype guidance; +- DRL language-level changes; +- deprecated engine/MVEL patterns; +- Rule Unit APIs; +- DMN version support; +- CEP temporal APIs; +- Quarkus/integration guidance. + +## Maintenance cadence + +- link/build check: every change; +- content quality review: each release; +- technical baseline review: at least every 6 months; +- full course review: annually or on a major Drools release; +- immediate corrective review after a material learner/production defect. diff --git a/course-site/instructor-notes/lab-solutions-outline.md b/course-site/instructor-notes/lab-solutions-outline.md new file mode 100644 index 0000000..15acdc2 --- /dev/null +++ b/course-site/instructor-notes/lab-solutions-outline.md @@ -0,0 +1,35 @@ +# Lab Solutions Outline — Controlled + +This file deliberately provides **solution criteria rather than copy-ready complete solutions** so assessors can validate alternate learner implementations. + +## Lab 1 + +Expect a clean Maven project, pinned Drools baseline, three intent-revealing rules and boundary tests. + +## Lab 2 + +Expect constrained joins using shared identifiers, explicit manual-review policy, no real sensitive data, and evidence overlap was considered. + +## Lab 3 + +Expect a defensible stateless choice for independent decisions and explicit lifecycle handling for stateful work. + +## Lab 4 + +Expect a testable inference chain and termination safeguards. The learner must explain support/retraction behaviour. + +## Lab 5 + +Expect visible decision dependencies, boundary tests and rationale for DRL/table/DMN representation. + +## Lab 6 + +Expect controlled time, bounded windows and documented duplicate/replay assumptions. + +## Lab 7 + +Evidence should show failing test → diagnosis → minimal fix → regression pass. + +## Lab 8 + +Expect validation outside the engine, version metadata, no embedded secrets, external side effects outside consequences, and rollback guidance. diff --git a/course-site/package.json b/course-site/package.json new file mode 100644 index 0000000..72e2011 --- /dev/null +++ b/course-site/package.json @@ -0,0 +1,29 @@ +{ + "name": "@skunkworks-academy/drools-self-paced", + "version": "1.0.0", + "private": true, + "description": "Standards-aligned self-paced Drools 10.2 course built with Docusaurus.", + "scripts": { + "start": "docusaurus start", + "build": "docusaurus build", + "serve": "docusaurus serve", + "clear": "docusaurus clear", + "validate:content": "node scripts/validate-course.mjs" + }, + "dependencies": { + "@docusaurus/core": "3.10.2", + "@docusaurus/preset-classic": "3.10.2", + "@mdx-js/react": "^3.1.0", + "clsx": "^2.1.1", + "prism-react-renderer": "^2.4.1", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "3.10.2", + "@docusaurus/types": "3.10.2" + }, + "engines": { + "node": ">=20.0" + } +} diff --git a/course-site/scripts/validate-course.mjs b/course-site/scripts/validate-course.mjs new file mode 100644 index 0000000..e321aba --- /dev/null +++ b/course-site/scripts/validate-course.mjs @@ -0,0 +1,29 @@ +import fs from 'node:fs'; +import path from 'node:path'; + +const root = path.resolve(process.cwd(), 'docs'); +const requiredFrontMatter = ['title:', 'description:', 'sidebar_position:']; +const requiredPages = ['start-here.md','learner-guide.md','course-map.md','environment-setup.md','capstone.md','assessment/diagnostic.md','assessment/final-assessment.md','quality/standards-alignment.md','quality/accessibility.md','quality/publishing-checklist.md']; +let failed = false; +for (const relative of requiredPages) { + const target = path.join(root, relative); + if (!fs.existsSync(target)) { console.error(`Missing required course page: ${relative}`); failed = true; } +} +const moduleFiles = fs.readdirSync(path.join(root, 'modules')).filter((f) => f.endsWith('.md')); +const labFiles = fs.readdirSync(path.join(root, 'labs')).filter((f) => f.endsWith('.md')); +if (moduleFiles.length !== 8) { console.error(`Expected 8 module pages; found ${moduleFiles.length}.`); failed = true; } +if (labFiles.length !== 8) { console.error(`Expected 8 lab pages; found ${labFiles.length}.`); failed = true; } +function walk(dir) { + for (const entry of fs.readdirSync(dir, {withFileTypes: true})) { + const full = path.join(dir, entry.name); + if (entry.isDirectory()) walk(full); + if (entry.isFile() && /\.mdx?$/.test(entry.name)) { + const text = fs.readFileSync(full, 'utf8'); + if (!text.startsWith('---')) { console.error(`Missing front matter: ${path.relative(root, full)}`); failed = true; } + for (const marker of requiredFrontMatter) if (!text.includes(marker)) { console.error(`Missing "${marker}" in ${path.relative(root, full)}`); failed = true; } + } + } +} +walk(root); +if (failed) process.exit(1); +console.log(`Course validation passed: ${moduleFiles.length} modules, ${labFiles.length} labs, required governance pages present.`); diff --git a/course-site/sidebars.js b/course-site/sidebars.js new file mode 100644 index 0000000..d482ce8 --- /dev/null +++ b/course-site/sidebars.js @@ -0,0 +1,20 @@ +module.exports = { + courseSidebar: [ + 'start-here', + 'learner-guide', + 'course-map', + 'environment-setup', + {type: 'category', label: 'Module 1 — Decision Automation Foundations', items: ['modules/foundations', 'labs/lab-01-first-rules']}, + {type: 'category', label: 'Module 2 — DRL Rule Authoring', items: ['modules/drl', 'labs/lab-02-rule-authoring']}, + {type: 'category', label: 'Module 3 — KIE Runtime and Sessions', items: ['modules/kie-runtime', 'labs/lab-03-kie-sessions']}, + {type: 'category', label: 'Module 4 — Inference and Execution Control', items: ['modules/inference', 'labs/lab-04-inference']}, + {type: 'category', label: 'Module 5 — Decision Tables and DMN', items: ['modules/decision-models', 'labs/lab-05-dmn']}, + {type: 'category', label: 'Module 6 — Complex Event Processing', items: ['modules/cep', 'labs/lab-06-cep']}, + {type: 'category', label: 'Module 7 — Testing, Performance and Troubleshooting', items: ['modules/quality', 'labs/lab-07-testing']}, + {type: 'category', label: 'Module 8 — Integration, Security and Operations', items: ['modules/operations', 'labs/lab-08-service']}, + 'capstone', + {type: 'category', label: 'Assessment', items: ['assessment/diagnostic', 'assessment/final-assessment']}, + {type: 'category', label: 'Learning Aids', items: ['resources/glossary','resources/cheat-sheet','resources/troubleshooting','resources/student-notes','resources/references']}, + {type: 'category', label: 'Quality and Publishing', items: ['quality/standards-alignment','quality/accessibility','quality/publishing-checklist']} + ] +}; diff --git a/course-site/slides/01-01-foundations.md b/course-site/slides/01-01-foundations.md new file mode 100644 index 0000000..48f259f --- /dev/null +++ b/course-site/slides/01-01-foundations.md @@ -0,0 +1,45 @@ +--- +marp: true +title: "Decision Automation Foundations" +paginate: true +--- + +# Decision Automation Foundations + +Drools Decision Automation — Self-Paced + +--- + +## Outcomes + +- Rule engines externalize changing policy +- Facts + rules → activations → decisions +- Declarative reasoning is not file-order execution +- Lab: first rules + +--- + +## Explain it + +Pause and explain the module's central concept without reading your notes. + +--- + +## Apply it + +Open **Lab 1** in the course site and produce executable evidence. + +--- + +## Review + +- What can go wrong? +- Which test proves the boundary? +- What evidence would operations need? +- What would make this design easier to change? + +--- + +# Module 1 complete + +Return to the course site for the knowledge check and reflection. diff --git a/course-site/slides/02-02-drl.md b/course-site/slides/02-02-drl.md new file mode 100644 index 0000000..bbc8860 --- /dev/null +++ b/course-site/slides/02-02-drl.md @@ -0,0 +1,43 @@ +--- +marp: true +title: "DRL Rule Authoring" +paginate: true +--- + +# DRL Rule Authoring + +Drools Decision Automation — Self-Paced + +--- + +## Outcomes + +- Intent-revealing conditions +- Bindings, joins, exists/not +- Consequence hygiene +- Overlap and execution controls + +--- + +## Explain it + +Pause and explain the module's central concept without reading your notes. + +--- + +## Apply it + +Open **Lab 2** in the course site and produce executable evidence. + +--- + +## Review + +- What can go wrong? +- Which test proves the boundary? +- What evidence would operations need? +- What would make this design easier to change? + +--- + +# Module 2 complete diff --git a/course-site/slides/03-03-runtime.md b/course-site/slides/03-03-runtime.md new file mode 100644 index 0000000..b26feff --- /dev/null +++ b/course-site/slides/03-03-runtime.md @@ -0,0 +1,43 @@ +--- +marp: true +title: "KIE Runtime and Sessions" +paginate: true +--- + +# KIE Runtime and Sessions + +Drools Decision Automation — Self-Paced + +--- + +## Outcomes + +- KIE base/container/session +- Stateless vs stateful +- Lifecycle and concurrency +- Rule Units as modern option + +--- + +## Explain it + +Pause and explain the runtime choice without notes. + +--- + +## Apply it + +Open **Lab 3** and produce executable evidence plus an architecture decision record. + +--- + +## Review + +- What state survives? +- Who owns the session? +- How does failure recovery work? +- Which evidence justifies the choice? + +--- + +# Module 3 complete diff --git a/course-site/slides/04-04-inference.md b/course-site/slides/04-04-inference.md new file mode 100644 index 0000000..777de17 --- /dev/null +++ b/course-site/slides/04-04-inference.md @@ -0,0 +1,43 @@ +--- +marp: true +title: "Inference and Execution" +paginate: true +--- + +# Inference and Execution + +Drools Decision Automation — Self-Paced + +--- + +## Outcomes + +- Forward chaining +- Truth maintenance +- Agenda reasoning +- Loop prevention + +--- + +## Explain it + +Explain how a fact update can create a new activation. + +--- + +## Apply it + +Open **Lab 4** and prove the inference chain with interaction tests. + +--- + +## Review + +- What supports the derived conclusion? +- What removes it? +- What prevents a loop? +- Which test proves termination? + +--- + +# Module 4 complete diff --git a/course-site/slides/05-05-decisions.md b/course-site/slides/05-05-decisions.md new file mode 100644 index 0000000..cea7a16 --- /dev/null +++ b/course-site/slides/05-05-decisions.md @@ -0,0 +1,37 @@ +--- +marp: true +title: "Decision Tables and DMN" +paginate: true +--- + +# Decision Tables and DMN + +Drools Decision Automation — Self-Paced + +--- + +## Outcomes + +- Choose representation by decision structure +- Coverage and overlap +- DMN requirements/dependencies +- Boundary tests + +--- + +## Apply it + +Open **Lab 5** and create a decision model with boundary evidence. + +--- + +## Review + +- Who must understand the policy? +- Are combinations covered? +- Are overlapping outcomes intentional? +- Which boundaries require explicit tests? + +--- + +# Module 5 complete diff --git a/course-site/slides/06-06-cep.md b/course-site/slides/06-06-cep.md new file mode 100644 index 0000000..340ca95 --- /dev/null +++ b/course-site/slides/06-06-cep.md @@ -0,0 +1,37 @@ +--- +marp: true +title: "Complex Event Processing" +paginate: true +--- + +# Complex Event Processing + +Drools Decision Automation — Self-Paced + +--- + +## Outcomes + +- Events have time semantics +- Temporal patterns and windows +- Controlled clocks in tests +- Bound state and replay assumptions + +--- + +## Apply it + +Open **Lab 6** and prove a bounded event pattern without real-time sleeps. + +--- + +## Review + +- Which time source is authoritative? +- What happens to late or duplicate events? +- How is state bounded? +- What prevents repeated alerts? + +--- + +# Module 6 complete diff --git a/course-site/slides/07-07-quality.md b/course-site/slides/07-07-quality.md new file mode 100644 index 0000000..4347b7d --- /dev/null +++ b/course-site/slides/07-07-quality.md @@ -0,0 +1,37 @@ +--- +marp: true +title: "Testing and Troubleshooting" +paginate: true +--- + +# Testing and Troubleshooting + +Drools Decision Automation — Self-Paced + +--- + +## Outcomes + +- Compile ≠ correct +- Positive/negative/boundary/interaction tests +- Activation diagnostics +- Measure before optimizing + +--- + +## Apply it + +Open **Lab 7** and preserve failing evidence before the fix. + +--- + +## Review + +- What is the smallest failing case? +- Which rule actually matched? +- What evidence proves the root cause? +- Would the regression test catch recurrence? + +--- + +# Module 7 complete diff --git a/course-site/slides/08-08-operations.md b/course-site/slides/08-08-operations.md new file mode 100644 index 0000000..bacf261 --- /dev/null +++ b/course-site/slides/08-08-operations.md @@ -0,0 +1,37 @@ +--- +marp: true +title: "Integration and Operations" +paginate: true +--- + +# Integration and Operations + +Drools Decision Automation — Self-Paced + +--- + +## Outcomes + +- Decision component boundary +- Traceable versions +- Security and data minimization +- Observable rollout and rollback + +--- + +## Apply it + +Open **Lab 8** and create a service-ready decision component. + +--- + +## Review + +- Which version made the decision? +- Where do side effects occur? +- Which data is actually necessary? +- How would you rollback safely? + +--- + +# Module 8 complete diff --git a/course-site/slides/README.md b/course-site/slides/README.md new file mode 100644 index 0000000..bfd848f --- /dev/null +++ b/course-site/slides/README.md @@ -0,0 +1,14 @@ +# Slide Source + +These Markdown files are editable slide-source outlines suitable for rendering with Marp or adapting into the Academy slide system. + +Slides are **learning aids**, not the canonical source of technical detail. The Docusaurus module pages and executable labs are canonical. + +Accessibility requirements for rendered decks: + +- preserve reading order; +- use adequate contrast and large text; +- provide alt text for informative images; +- do not communicate meaning by colour alone; +- provide speaker notes/transcript-equivalent text for narrated recordings; +- ensure exported PDFs are tagged and manually checked if PDF becomes a required learner format. diff --git a/course-site/src/css/custom.css b/course-site/src/css/custom.css new file mode 100644 index 0000000..2519a25 --- /dev/null +++ b/course-site/src/css/custom.css @@ -0,0 +1,19 @@ +:root { + --ifm-color-primary: #155eef; + --ifm-color-primary-dark: #0f52da; + --ifm-color-primary-darker: #0e4dce; + --ifm-color-primary-darkest: #0c3fa9; + --ifm-color-primary-light: #2d6ff1; + --ifm-color-primary-lighter: #3977f2; + --ifm-color-primary-lightest: #6293f5; + --ifm-code-font-size: 95%; + --course-border: #d0d5dd; +} +html[data-theme='dark'] { --ifm-color-primary: #84adff; --course-border: #475467; } +.theme-doc-markdown h1 { line-height: 1.15; } +.theme-doc-markdown h2 { margin-top: 2.25rem; } +.course-meta { border: 1px solid var(--course-border); border-radius: 0.75rem; padding: 1rem; margin: 1rem 0 1.5rem; } +.checkpoint { border-left: 4px solid var(--ifm-color-primary); padding: .75rem 1rem; background: var(--ifm-background-surface-color); } +table { display: table; width: 100%; } +@media (max-width: 700px) { table { display: block; overflow-x: auto; } } +*:focus-visible { outline: 3px solid var(--ifm-color-primary); outline-offset: 3px; } diff --git a/course-site/static/CNAME b/course-site/static/CNAME new file mode 100644 index 0000000..8e1ef0c --- /dev/null +++ b/course-site/static/CNAME @@ -0,0 +1 @@ +drools.skunkworksacademy.com diff --git a/course-site/static/img/favicon.svg b/course-site/static/img/favicon.svg new file mode 100644 index 0000000..9d6df2f --- /dev/null +++ b/course-site/static/img/favicon.svg @@ -0,0 +1 @@ +