@llm4ts/shell 0.17.0 → 0.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Cli.d.ts +4 -0
- package/dist/Cli.d.ts.map +1 -1
- package/dist/Cli.js +69 -8
- package/dist/Cli.js.map +1 -1
- package/dist/FlowCatalog.d.ts +10 -4
- package/dist/FlowCatalog.d.ts.map +1 -1
- package/dist/FlowCatalog.js +25 -14
- package/dist/FlowCatalog.js.map +1 -1
- package/flows/epic-stories.js +1 -8
- package/flows/hello.js +15 -0
- package/flows/implement.js +1 -8
- package/flows/issue-pr.js +1 -8
- package/flows/judge-suite.js +1 -4
- package/flows/lib/epic-stories.js +3 -4
- package/flows/local.js +2 -5
- package/flows/modernize-bench.js +3 -12
- package/flows/modernize-extract.js +38 -20
- package/flows/modernize-implement.js +4 -15
- package/flows/modernize-pack-check.js +1 -8
- package/flows/modernize-review.js +4 -13
- package/flows/modernize-seed.js +3 -11
- package/flows/modernize-survey.js +0 -0
- package/flows/modernize-verify.js +5 -13
- package/flows/sdd.js +2 -12
- package/kits/j2ee-nextjs/README.md +29 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/RUNBOOK.md +232 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/PAGES.md +67 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/pom.xml +49 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/dto/AcctOvwDTO.java +58 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/dto/BenfDTO.java +49 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/dto/TrfDTO.java +70 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/esb/EsbAcctListService.java +53 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/esb/EsbBenfListService.java +58 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/esb/EsbBenfMaintService.java +58 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/esb/EsbException.java +21 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/esb/EsbGateway.java +44 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/esb/EsbTrfExecService.java +53 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/esb/EsbTrfValidateService.java +45 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/web/AccountOverviewServlet.java +90 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/web/BeneficiaryServlet.java +195 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/web/TransferDraft.java +62 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/java/com/demobank/legacy/web/TransferServlet.java +223 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/WEB-INF/web.xml +59 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/accountOverview.jsp +65 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/beneficiaryEdit.jsp +70 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/beneficiaryList.jsp +43 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/css/bank.css +132 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/dashboard.jsp +28 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/footer.jsp +8 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/header.jsp +22 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/help.jsp +32 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/js/jquery-1.12.4.min.js +1 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/js/validate.js +79 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/login.jsp +29 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/messages.jsp +34 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/nav.jsp +14 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/oldTransfer.jsp +34 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/profile.jsp +26 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/promoQ3.jsp +23 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/settings.jsp +34 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/testHarness.jsp +39 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/transferConfirm.jsp +35 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/transferStep1.jsp +73 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/legacy-j2ee/src/main/webapp/transferStep2.jsp +40 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/CONTRIBUTING.md +76 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/README.md +46 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/contracts/cards.openapi.yaml +57 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/contracts/profile.openapi.yaml +73 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/eslint.config.mjs +24 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/next-env.d.ts +5 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/next.config.mjs +10 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/package.json +29 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/pnpm-lock.yaml +2895 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/app/cards/page.tsx +62 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/app/layout.tsx +41 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/app/page.tsx +26 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/app/profile/page.tsx +134 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/app/signed-in-badge.tsx +9 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/auth/AuthProvider.tsx +36 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/components/Button.tsx +27 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/components/Card.tsx +18 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/components/DataTable.tsx +57 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/components/Field.tsx +34 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/components/Form.tsx +70 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/components/PageLayout.tsx +39 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/components/Stepper.tsx +29 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/components/index.ts +19 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/services/cards/mock.ts +47 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/services/cards/port.ts +31 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/services/profile/mock.ts +45 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/services/profile/port.ts +24 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/services/registry.ts +20 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/theme/components.css +269 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/src/theme/tokens.css +38 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/tests/cards.page.test.tsx +81 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/tests/profile.page.test.tsx +87 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/tsconfig.json +54 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/nextjs/vitest.config.ts +17 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/preflight.mjs +53 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/reset-demo.mjs +40 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/seed-legacy-j2ee.mjs +71 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/seed-nextjs.mjs +111 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/smoke-legacy-j2ee.mjs +144 -0
- package/kits/j2ee-nextjs/fixtures/demo-bank/smoke-nextjs.mjs +118 -0
- package/{flows → kits/j2ee-nextjs/flows}/convert-all.js +1 -7
- package/{flows → kits/j2ee-nextjs/flows}/convert-page.js +2 -6
- package/{flows → kits/j2ee-nextjs/flows}/lib/convert.js +6 -16
- package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/pack.md +2 -1
- package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/prompts/spec.md +5 -1
- package/{flows → kits/j2ee-nextjs}/packs/jsp-bff-nextjs/pack.md +1 -1
- package/{flows → kits/j2ee-nextjs}/packs/jsp-nextjs/pack.md +1 -1
- package/kits/mainframe-java/README.md +31 -0
- package/{flows → kits/mainframe-java}/packs/ace-integration/pack.md +1 -1
- package/{flows → kits/mainframe-java}/packs/ace-kafka/pack.md +1 -1
- package/{flows → kits/mainframe-java}/packs/cobol-kafka/pack.md +1 -1
- package/{flows → kits/mainframe-java}/packs/cobol-springboot/pack.md +1 -1
- package/package.json +6 -6
- package/src/Cli.ts +92 -9
- package/src/FlowCatalog.ts +29 -13
- /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/patterns/PAT-J2EE-001-jstl-table.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/patterns/PAT-J2EE-002-jquery-validation.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/patterns/PAT-J2EE-003-session-stepper.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/patterns/PAT-J2EE-004-esb-port.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/patterns/PAT-J2EE-005-include-shell.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/prompts/analysis.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/prompts/bdd.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/prompts/implement.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/prompts/plan.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/prompts/review.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/prompts/survey-refine.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/prompts/survey-triage.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/reviewers/acl-purity.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/j2ee-nextjs-spa/reviewers/house-style.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/jsp-bff-nextjs/lessons.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/jsp-bff-nextjs/prompts/analysis.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/jsp-bff-nextjs/prompts/bdd.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/jsp-bff-nextjs/prompts/implement.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/jsp-bff-nextjs/prompts/plan.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/jsp-bff-nextjs/prompts/review.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/jsp-bff-nextjs/prompts/spec.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/jsp-bff-nextjs/prompts/survey-refine.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/jsp-bff-nextjs/prompts/survey-triage.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/jsp-bff-nextjs/reviewers/bff-boundary.md +0 -0
- /package/{flows/packs/ace-integration → kits/j2ee-nextjs/packs/jsp-bff-nextjs}/reviewers/traceability.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/jsp-nextjs/lessons.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/jsp-nextjs/prompts/analysis.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/jsp-nextjs/prompts/bdd.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/jsp-nextjs/prompts/implement.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/jsp-nextjs/prompts/plan.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/jsp-nextjs/prompts/review.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/jsp-nextjs/prompts/spec.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/jsp-nextjs/prompts/survey-refine.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/jsp-nextjs/prompts/survey-triage.md +0 -0
- /package/{flows/packs/ace-kafka → kits/j2ee-nextjs/packs/jsp-nextjs}/reviewers/traceability.md +0 -0
- /package/{flows → kits/j2ee-nextjs}/packs/jsp-nextjs/reviewers/ux-fidelity.md +0 -0
- /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/nextjs-spa/README.md +0 -0
- /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/nextjs-spa/app/layout.js +0 -0
- /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/nextjs-spa/app/page.js +0 -0
- /package/{flows/fixtures/scaffolds/kafka-streams-service/src/test/resources/features → kits/j2ee-nextjs/scaffolds/nextjs-spa/docs/specs}/.gitkeep +0 -0
- /package/{flows/fixtures/scaffolds/nextjs-spa/docs/specs → kits/j2ee-nextjs/scaffolds/nextjs-spa/features}/.gitkeep +0 -0
- /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/nextjs-spa/next.config.js +0 -0
- /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/nextjs-spa/package.json +0 -0
- /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/nextjs-spa/tests/smoke.test.js +0 -0
- /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/spring-bff/README.md +0 -0
- /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/spring-bff/frontend/app/layout.js +0 -0
- /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/spring-bff/frontend/app/page.js +0 -0
- /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/spring-bff/frontend/next.config.js +0 -0
- /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/spring-bff/frontend/package.json +0 -0
- /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/spring-bff/frontend/tests/smoke.test.js +0 -0
- /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/spring-bff/pom.xml +0 -0
- /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/spring-bff/scripts/test.sh +0 -0
- /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/spring-bff/src/main/java/com/meridian/bff/Application.java +0 -0
- /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/spring-bff/src/main/resources/application.yaml +0 -0
- /package/{flows/fixtures → kits/j2ee-nextjs}/scaffolds/spring-bff/src/test/java/com/meridian/bff/ApplicationTests.java +0 -0
- /package/{flows/fixtures/scaffolds/nextjs-spa → kits/j2ee-nextjs/scaffolds/spring-bff/src/test/resources}/features/.gitkeep +0 -0
- /package/{flows → kits/mainframe-java}/packs/ace-integration/lessons.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/ace-integration/prompts/analysis.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/ace-integration/prompts/bdd.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/ace-integration/prompts/implement.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/ace-integration/prompts/plan.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/ace-integration/prompts/review.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/ace-integration/prompts/spec.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/ace-integration/reviewers/routing-fidelity.md +0 -0
- /package/{flows/packs/cobol-kafka → kits/mainframe-java/packs/ace-integration}/reviewers/traceability.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/ace-kafka/lessons.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/ace-kafka/prompts/analysis.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/ace-kafka/prompts/bdd.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/ace-kafka/prompts/implement.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/ace-kafka/prompts/plan.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/ace-kafka/prompts/review.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/ace-kafka/prompts/spec.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/ace-kafka/prompts/vectors.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/ace-kafka/reviewers/event-contracts.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/ace-kafka/reviewers/routing-fidelity.md +0 -0
- /package/{flows/packs/cobol-springboot → kits/mainframe-java/packs/ace-kafka}/reviewers/traceability.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-kafka/lessons.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-kafka/patterns/PAT-STREAM-001-record-to-event.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-kafka/patterns/PAT-STREAM-002-job-step-topology.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-kafka/patterns/PAT-STREAM-003-checkpoint-idempotence.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-kafka/patterns/PAT-STREAM-004-eod-totals-window.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-kafka/patterns/PAT-STREAM-005-reject-topic.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-kafka/patterns/PAT-STREAM-006-keyed-state-store.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-kafka/patterns/PAT-STREAM-007-outbox.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-kafka/patterns/PAT-STREAM-008-partition-key.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-kafka/patterns/PAT-STREAM-009-batch-window-cutoff.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-kafka/patterns/PAT-STREAM-010-replay-backfill.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-kafka/prompts/analysis.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-kafka/prompts/bdd.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-kafka/prompts/implement.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-kafka/prompts/plan.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-kafka/prompts/review.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-kafka/prompts/spec.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-kafka/prompts/survey-refine.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-kafka/prompts/survey-triage.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-kafka/prompts/vectors.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-kafka/reviewers/cobol-fidelity.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-kafka/reviewers/pattern-conformance.md +0 -0
- /package/{flows/packs/jsp-bff-nextjs → kits/mainframe-java/packs/cobol-kafka}/reviewers/traceability.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-springboot/lessons.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-springboot/prompts/analysis.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-springboot/prompts/bdd.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-springboot/prompts/implement.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-springboot/prompts/plan.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-springboot/prompts/review.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-springboot/prompts/spec.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-springboot/prompts/survey-refine.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-springboot/prompts/survey-triage.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-springboot/prompts/vectors.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-springboot/reviewers/cobol-fidelity.md +0 -0
- /package/{flows → kits/mainframe-java}/packs/cobol-springboot/reviewers/pattern-conformance.md +0 -0
- /package/{flows/packs/jsp-nextjs → kits/mainframe-java/packs/cobol-springboot}/reviewers/traceability.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-001-comp3-money.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-002-redefines.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-003-88-levels.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-004-perform-thru.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-005-file-status.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-006-sqlcode.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-007-validation-order.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-008-zoned-decimal.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-009-occurs-table.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-010-copybook-record.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-011-batch-counters.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-012-commit-frequency.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-013-abend.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-014-reject-file.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-015-accept-date.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-016-string-building.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-017-cursor-loop.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-018-yn-switches.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-019-shared-accumulators.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-020-tiered-fees.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-021-overdraft-floor.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-022-jcl-job-net.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-023-sort-step.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-024-fixed-width-records.md +0 -0
- /package/{flows → kits/mainframe-java}/patterns/PAT-COBOL-025-audit-rows.md +0 -0
- /package/{flows/fixtures → kits/mainframe-java}/scaffolds/kafka-streams-service/README.md +0 -0
- /package/{flows/fixtures → kits/mainframe-java}/scaffolds/kafka-streams-service/pom.xml +0 -0
- /package/{flows/fixtures → kits/mainframe-java}/scaffolds/kafka-streams-service/scripts/replay.sh +0 -0
- /package/{flows/fixtures → kits/mainframe-java}/scaffolds/kafka-streams-service/src/main/java/com/meridian/scaffold/Application.java +0 -0
- /package/{flows/fixtures → kits/mainframe-java}/scaffolds/kafka-streams-service/src/test/java/com/meridian/scaffold/ApplicationTests.java +0 -0
- /package/{flows/fixtures/scaffolds/spring-bff → kits/mainframe-java/scaffolds/kafka-streams-service}/src/test/resources/features/.gitkeep +0 -0
- /package/{flows/fixtures → kits/mainframe-java}/scaffolds/spring-boot-service/README.md +0 -0
- /package/{flows/fixtures → kits/mainframe-java}/scaffolds/spring-boot-service/pom.xml +0 -0
- /package/{flows/fixtures → kits/mainframe-java}/scaffolds/spring-boot-service/scripts/replay.sh +0 -0
- /package/{flows/fixtures → kits/mainframe-java}/scaffolds/spring-boot-service/src/main/java/com/meridian/scaffold/Application.java +0 -0
- /package/{flows/fixtures → kits/mainframe-java}/scaffolds/spring-boot-service/src/main/resources/application.yaml +0 -0
- /package/{flows/fixtures → kits/mainframe-java}/scaffolds/spring-boot-service/src/test/java/com/meridian/scaffold/ApplicationTests.java +0 -0
- /package/{flows/fixtures → kits/mainframe-java}/scaffolds/spring-boot-service/src/test/resources/features/.gitkeep +0 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
package com.demobank.legacy.web;
|
|
2
|
+
|
|
3
|
+
import java.io.IOException;
|
|
4
|
+
import java.util.ArrayList;
|
|
5
|
+
import java.util.List;
|
|
6
|
+
|
|
7
|
+
import javax.servlet.RequestDispatcher;
|
|
8
|
+
import javax.servlet.ServletException;
|
|
9
|
+
import javax.servlet.http.HttpServlet;
|
|
10
|
+
import javax.servlet.http.HttpServletRequest;
|
|
11
|
+
import javax.servlet.http.HttpServletResponse;
|
|
12
|
+
import javax.servlet.http.HttpSession;
|
|
13
|
+
|
|
14
|
+
import com.demobank.legacy.dto.BenfDTO;
|
|
15
|
+
import com.demobank.legacy.esb.EsbBenfListService;
|
|
16
|
+
import com.demobank.legacy.esb.EsbBenfMaintService;
|
|
17
|
+
import com.demobank.legacy.esb.EsbException;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* HERO 2 controller. Mapped on /beneficiary.
|
|
21
|
+
*
|
|
22
|
+
* GET ?action=list (default) -> beneficiaryList.jsp ("benfList")
|
|
23
|
+
* GET ?action=new -> beneficiaryEdit.jsp (empty "benf")
|
|
24
|
+
* GET ?action=edit&benfId=.. -> beneficiaryEdit.jsp (loaded "benf")
|
|
25
|
+
* GET ?action=delete&benfId= -> delete then redirect to list [sic: GET
|
|
26
|
+
* with side effect, kept legacy-faithful]
|
|
27
|
+
* POST -> server-side validation + ESB_BENF_MAINT
|
|
28
|
+
*
|
|
29
|
+
* Server-side validation deliberately overlaps but does not match the
|
|
30
|
+
* client rules in beneficiaryEdit.jsp / validate.js (see DB-2988, DB-3302):
|
|
31
|
+
* - name required, max 60 chars (client allows 70)
|
|
32
|
+
* - IBAN required, shape check, AND country must be IT/DE/FR (client
|
|
33
|
+
* checks shape only)
|
|
34
|
+
* - bank name required when ccy != EUR (client treats it as optional)
|
|
35
|
+
*
|
|
36
|
+
* ESB dependencies: ESB_BENF_LIST, ESB_BENF_MAINT.
|
|
37
|
+
*/
|
|
38
|
+
public class BeneficiaryServlet extends HttpServlet {
|
|
39
|
+
|
|
40
|
+
private static final long serialVersionUID = 1L;
|
|
41
|
+
|
|
42
|
+
private final EsbBenfListService listService = new EsbBenfListService();
|
|
43
|
+
private final EsbBenfMaintService maintService = new EsbBenfMaintService();
|
|
44
|
+
|
|
45
|
+
protected void doGet(HttpServletRequest request, HttpServletResponse response)
|
|
46
|
+
throws ServletException, IOException {
|
|
47
|
+
|
|
48
|
+
String custId = custId(request);
|
|
49
|
+
String action = request.getParameter("action");
|
|
50
|
+
if (action == null) action = "list";
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
if ("new".equals(action)) {
|
|
54
|
+
BenfDTO empty = new BenfDTO();
|
|
55
|
+
empty.setCcyCd("EUR");
|
|
56
|
+
request.setAttribute("benf", empty);
|
|
57
|
+
forward(request, response, "/beneficiaryEdit.jsp");
|
|
58
|
+
} else if ("edit".equals(action)) {
|
|
59
|
+
BenfDTO benf = listService.getBeneficiary(custId,
|
|
60
|
+
request.getParameter("benfId"));
|
|
61
|
+
if (benf == null) {
|
|
62
|
+
response.sendRedirect("beneficiary");
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
request.setAttribute("benf", benf);
|
|
66
|
+
forward(request, response, "/beneficiaryEdit.jsp");
|
|
67
|
+
} else if ("delete".equals(action)) {
|
|
68
|
+
maintService.delete(custId, request.getParameter("benfId"));
|
|
69
|
+
request.getSession().setAttribute("flashOnce", "Beneficiary deleted.");
|
|
70
|
+
response.sendRedirect("beneficiary");
|
|
71
|
+
} else {
|
|
72
|
+
renderList(request, response, custId);
|
|
73
|
+
}
|
|
74
|
+
} catch (EsbException e) {
|
|
75
|
+
System.out.println("BENF esb failure rc=" + e.getEsbRc());
|
|
76
|
+
request.setAttribute("benfList", new ArrayList());
|
|
77
|
+
forward(request, response, "/beneficiaryList.jsp");
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
protected void doPost(HttpServletRequest request, HttpServletResponse response)
|
|
82
|
+
throws ServletException, IOException {
|
|
83
|
+
|
|
84
|
+
String custId = custId(request);
|
|
85
|
+
|
|
86
|
+
BenfDTO benf = new BenfDTO();
|
|
87
|
+
benf.setBenfId(trim(request.getParameter("benfId")));
|
|
88
|
+
benf.setBenfNm(trim(request.getParameter("benfNm")));
|
|
89
|
+
benf.setBenfIban(trim(request.getParameter("benfIban")));
|
|
90
|
+
benf.setBankNm(trim(request.getParameter("bankNm")));
|
|
91
|
+
benf.setCcyCd(trim(request.getParameter("ccyCd")));
|
|
92
|
+
|
|
93
|
+
List errs = validate(benf);
|
|
94
|
+
if (!errs.isEmpty()) {
|
|
95
|
+
request.setAttribute("srvErrs", errs);
|
|
96
|
+
request.setAttribute("benf", benf);
|
|
97
|
+
forward(request, response, "/beneficiaryEdit.jsp");
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
try {
|
|
102
|
+
String rc = maintService.save(custId, benf);
|
|
103
|
+
if (!"0000".equals(rc)) {
|
|
104
|
+
errs.add(hostMessage(rc));
|
|
105
|
+
request.setAttribute("srvErrs", errs);
|
|
106
|
+
request.setAttribute("benf", benf);
|
|
107
|
+
forward(request, response, "/beneficiaryEdit.jsp");
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
} catch (EsbException e) {
|
|
111
|
+
errs.add("Service temporarily unavailable, please retry (rc "
|
|
112
|
+
+ e.getEsbRc() + ").");
|
|
113
|
+
request.setAttribute("srvErrs", errs);
|
|
114
|
+
request.setAttribute("benf", benf);
|
|
115
|
+
forward(request, response, "/beneficiaryEdit.jsp");
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
request.getSession().setAttribute("flashOnce", "Beneficiary saved.");
|
|
120
|
+
response.sendRedirect("beneficiary");
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** Server-side rules. Compare with the jQuery rules in the JSP. */
|
|
124
|
+
private List validate(BenfDTO benf) {
|
|
125
|
+
List errs = new ArrayList();
|
|
126
|
+
if (isEmpty(benf.getBenfNm())) {
|
|
127
|
+
errs.add("Beneficiary name is required.");
|
|
128
|
+
} else if (benf.getBenfNm().length() > 60) {
|
|
129
|
+
// client-side allows 70 -- host field is CHAR(60), see DB-2988
|
|
130
|
+
errs.add("Beneficiary name must not exceed 60 characters.");
|
|
131
|
+
}
|
|
132
|
+
String iban = benf.getBenfIban() == null
|
|
133
|
+
? "" : benf.getBenfIban().replaceAll(" ", "").toUpperCase();
|
|
134
|
+
if (iban.length() == 0) {
|
|
135
|
+
errs.add("IBAN is required.");
|
|
136
|
+
} else if (!iban.matches("[A-Z]{2}[0-9]{2}[A-Z0-9]{10,30}")) {
|
|
137
|
+
errs.add("IBAN format is not valid.");
|
|
138
|
+
} else {
|
|
139
|
+
String country = iban.substring(0, 2);
|
|
140
|
+
// client checks shape only; SEPA scheme subset enforced here
|
|
141
|
+
if (!"IT".equals(country) && !"DE".equals(country) && !"FR".equals(country)) {
|
|
142
|
+
errs.add("Only IT, DE and FR IBANs are accepted online.");
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (!"EUR".equals(benf.getCcyCd()) && isEmpty(benf.getBankNm())) {
|
|
146
|
+
// client treats bank name as always optional
|
|
147
|
+
errs.add("Bank name is required for non-EUR beneficiaries.");
|
|
148
|
+
}
|
|
149
|
+
return errs;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
private void renderList(HttpServletRequest request, HttpServletResponse response,
|
|
153
|
+
String custId) throws EsbException, ServletException, IOException {
|
|
154
|
+
List benfList = listService.listBeneficiaries(custId);
|
|
155
|
+
request.setAttribute("benfList", benfList);
|
|
156
|
+
HttpSession session = request.getSession();
|
|
157
|
+
Object flash = session.getAttribute("flashOnce");
|
|
158
|
+
if (flash != null) {
|
|
159
|
+
request.setAttribute("flashMsg", flash);
|
|
160
|
+
session.removeAttribute("flashOnce");
|
|
161
|
+
}
|
|
162
|
+
forward(request, response, "/beneficiaryList.jsp");
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
private String hostMessage(String rc) {
|
|
166
|
+
if ("0102".equals(rc)) return "A beneficiary with this IBAN already exists.";
|
|
167
|
+
if ("0107".equals(rc)) return "Beneficiary refused by compliance vetting.";
|
|
168
|
+
if ("0110".equals(rc)) return "Beneficiary book is full (max 50 entries).";
|
|
169
|
+
return "Operation refused by the bank host (code " + rc + ").";
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
private void forward(HttpServletRequest request, HttpServletResponse response,
|
|
173
|
+
String jsp) throws ServletException, IOException {
|
|
174
|
+
RequestDispatcher rd = request.getRequestDispatcher(jsp);
|
|
175
|
+
rd.forward(request, response);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
private String custId(HttpServletRequest request) {
|
|
179
|
+
HttpSession session = request.getSession(true);
|
|
180
|
+
String custId = (String) session.getAttribute("custId");
|
|
181
|
+
if (custId == null) {
|
|
182
|
+
custId = "CUST0042";
|
|
183
|
+
session.setAttribute("custId", custId);
|
|
184
|
+
}
|
|
185
|
+
return custId;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
private String trim(String s) {
|
|
189
|
+
return s == null ? null : s.trim();
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
private boolean isEmpty(String s) {
|
|
193
|
+
return s == null || s.trim().length() == 0;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
package com.demobank.legacy.web;
|
|
2
|
+
|
|
3
|
+
import java.io.Serializable;
|
|
4
|
+
import java.math.BigDecimal;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Wire transfer wizard state, held in HttpSession under attribute
|
|
8
|
+
* "trfDraft" between step 1 (entry), step 2 (review) and step 3
|
|
9
|
+
* (execution). Cleared by TransferServlet after execution or abandon.
|
|
10
|
+
*
|
|
11
|
+
* Serializable because the app servers replicate sessions across the
|
|
12
|
+
* cluster (session-timeout 10, see web.xml).
|
|
13
|
+
*
|
|
14
|
+
* @author lgreco (2011)
|
|
15
|
+
*/
|
|
16
|
+
public class TransferDraft implements Serializable {
|
|
17
|
+
|
|
18
|
+
private static final long serialVersionUID = 1L;
|
|
19
|
+
|
|
20
|
+
private String benfId;
|
|
21
|
+
private String benfNm;
|
|
22
|
+
private String benfIban;
|
|
23
|
+
private BigDecimal trfAmt;
|
|
24
|
+
private String trfCcy;
|
|
25
|
+
private String trfDesc;
|
|
26
|
+
private String valDt;
|
|
27
|
+
/** Fee computed by ESB_TRF_VAL, shown on the review screen. */
|
|
28
|
+
private BigDecimal feeAmt;
|
|
29
|
+
/** Validation token from ESB_TRF_VAL, required by ESB_TRF_EXEC. */
|
|
30
|
+
private String valToken;
|
|
31
|
+
|
|
32
|
+
public TransferDraft() {
|
|
33
|
+
// bean constructor
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
public String getBenfId() { return benfId; }
|
|
37
|
+
public void setBenfId(String benfId) { this.benfId = benfId; }
|
|
38
|
+
|
|
39
|
+
public String getBenfNm() { return benfNm; }
|
|
40
|
+
public void setBenfNm(String benfNm) { this.benfNm = benfNm; }
|
|
41
|
+
|
|
42
|
+
public String getBenfIban() { return benfIban; }
|
|
43
|
+
public void setBenfIban(String benfIban) { this.benfIban = benfIban; }
|
|
44
|
+
|
|
45
|
+
public BigDecimal getTrfAmt() { return trfAmt; }
|
|
46
|
+
public void setTrfAmt(BigDecimal trfAmt) { this.trfAmt = trfAmt; }
|
|
47
|
+
|
|
48
|
+
public String getTrfCcy() { return trfCcy; }
|
|
49
|
+
public void setTrfCcy(String trfCcy) { this.trfCcy = trfCcy; }
|
|
50
|
+
|
|
51
|
+
public String getTrfDesc() { return trfDesc; }
|
|
52
|
+
public void setTrfDesc(String trfDesc) { this.trfDesc = trfDesc; }
|
|
53
|
+
|
|
54
|
+
public String getValDt() { return valDt; }
|
|
55
|
+
public void setValDt(String valDt) { this.valDt = valDt; }
|
|
56
|
+
|
|
57
|
+
public BigDecimal getFeeAmt() { return feeAmt; }
|
|
58
|
+
public void setFeeAmt(BigDecimal feeAmt) { this.feeAmt = feeAmt; }
|
|
59
|
+
|
|
60
|
+
public String getValToken() { return valToken; }
|
|
61
|
+
public void setValToken(String valToken) { this.valToken = valToken; }
|
|
62
|
+
}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
package com.demobank.legacy.web;
|
|
2
|
+
|
|
3
|
+
import java.io.IOException;
|
|
4
|
+
import java.math.BigDecimal;
|
|
5
|
+
import java.util.List;
|
|
6
|
+
|
|
7
|
+
import javax.servlet.RequestDispatcher;
|
|
8
|
+
import javax.servlet.ServletException;
|
|
9
|
+
import javax.servlet.http.HttpServlet;
|
|
10
|
+
import javax.servlet.http.HttpServletRequest;
|
|
11
|
+
import javax.servlet.http.HttpServletResponse;
|
|
12
|
+
import javax.servlet.http.HttpSession;
|
|
13
|
+
|
|
14
|
+
import com.demobank.legacy.dto.BenfDTO;
|
|
15
|
+
import com.demobank.legacy.dto.TrfDTO;
|
|
16
|
+
import com.demobank.legacy.esb.EsbBenfListService;
|
|
17
|
+
import com.demobank.legacy.esb.EsbException;
|
|
18
|
+
import com.demobank.legacy.esb.EsbTrfExecService;
|
|
19
|
+
import com.demobank.legacy.esb.EsbTrfValidateService;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* HERO 3 controller. Mapped on /transfer. Drives the 3-step wizard and
|
|
23
|
+
* keeps the in-flight TransferDraft in HttpSession ("trfDraft") -- the
|
|
24
|
+
* hardest conversion case in the fixture.
|
|
25
|
+
*
|
|
26
|
+
* GET /transfer -> start (or resume) at step 1; loads the
|
|
27
|
+
* beneficiary combo via ESB_BENF_LIST
|
|
28
|
+
* POST step=1 -> parse + validate entry, store draft in
|
|
29
|
+
* session, ESB_TRF_VAL, forward to step 2
|
|
30
|
+
* POST step=3 -> ESB_TRF_EXEC with the session draft, clear
|
|
31
|
+
* the draft, forward to confirmation
|
|
32
|
+
*
|
|
33
|
+
* (There is no POST step=2: the review page holds no fields, it re-posts
|
|
34
|
+
* only the confirmation. Numbering kept for the ops runbook.)
|
|
35
|
+
*
|
|
36
|
+
* ESB dependencies: ESB_BENF_LIST, ESB_TRF_VAL, ESB_TRF_EXEC.
|
|
37
|
+
*/
|
|
38
|
+
public class TransferServlet extends HttpServlet {
|
|
39
|
+
|
|
40
|
+
private static final long serialVersionUID = 1L;
|
|
41
|
+
|
|
42
|
+
private final EsbBenfListService benfListService = new EsbBenfListService();
|
|
43
|
+
private final EsbTrfValidateService validateService = new EsbTrfValidateService();
|
|
44
|
+
private final EsbTrfExecService execService = new EsbTrfExecService();
|
|
45
|
+
|
|
46
|
+
protected void doGet(HttpServletRequest request, HttpServletResponse response)
|
|
47
|
+
throws ServletException, IOException {
|
|
48
|
+
// Entry point and "Back" target: always renders step 1, keeping any
|
|
49
|
+
// draft already in session so the fields come back pre-filled.
|
|
50
|
+
renderStep1(request, response, null);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
protected void doPost(HttpServletRequest request, HttpServletResponse response)
|
|
54
|
+
throws ServletException, IOException {
|
|
55
|
+
|
|
56
|
+
String step = request.getParameter("step");
|
|
57
|
+
if ("1".equals(step)) {
|
|
58
|
+
handleStep1(request, response);
|
|
59
|
+
} else if ("3".equals(step)) {
|
|
60
|
+
handleStep3(request, response);
|
|
61
|
+
} else {
|
|
62
|
+
// Unknown step: restart the wizard (legacy catch-all).
|
|
63
|
+
response.sendRedirect("transfer");
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Parse the entry form, ESB-validate, park the draft in session. */
|
|
68
|
+
private void handleStep1(HttpServletRequest request, HttpServletResponse response)
|
|
69
|
+
throws ServletException, IOException {
|
|
70
|
+
|
|
71
|
+
HttpSession session = request.getSession(true);
|
|
72
|
+
String custId = custId(session);
|
|
73
|
+
|
|
74
|
+
String benfId = trim(request.getParameter("benfId"));
|
|
75
|
+
String amtRaw = trim(request.getParameter("trfAmt"));
|
|
76
|
+
|
|
77
|
+
if (isEmpty(benfId) || isEmpty(amtRaw)) {
|
|
78
|
+
renderStep1(request, response, "Beneficiary and amount are required.");
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
BigDecimal amt;
|
|
83
|
+
try {
|
|
84
|
+
// Server accepts the dot only; the client tolerates a comma and
|
|
85
|
+
// rewrites it -- known mismatch DB-3302, users with JS disabled
|
|
86
|
+
// hit this branch.
|
|
87
|
+
amt = new BigDecimal(amtRaw);
|
|
88
|
+
} catch (NumberFormatException e) {
|
|
89
|
+
renderStep1(request, response, "Amount format not valid (use 1234.56).");
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (amt.compareTo(BigDecimal.ZERO) <= 0 || amt.scale() > 2) {
|
|
93
|
+
renderStep1(request, response, "Amount must be positive with max 2 decimals.");
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
TransferDraft draft = new TransferDraft();
|
|
98
|
+
draft.setBenfId(benfId);
|
|
99
|
+
draft.setTrfAmt(amt);
|
|
100
|
+
draft.setTrfCcy("EUR"); // only EUR online, combo is decorative
|
|
101
|
+
draft.setTrfDesc(sanitizeDesc(request.getParameter("trfDesc")));
|
|
102
|
+
draft.setValDt(trim(request.getParameter("valDt")));
|
|
103
|
+
|
|
104
|
+
try {
|
|
105
|
+
BenfDTO benf = benfListService.getBeneficiary(custId, benfId);
|
|
106
|
+
if (benf == null) {
|
|
107
|
+
renderStep1(request, response, "Selected beneficiary no longer exists.");
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
draft.setBenfNm(benf.getBenfNm());
|
|
111
|
+
draft.setBenfIban(benf.getBenfIban());
|
|
112
|
+
|
|
113
|
+
String rc = validateService.validate(custId, draft);
|
|
114
|
+
if (!"0000".equals(rc)) {
|
|
115
|
+
renderStep1(request, response, validationMessage(rc));
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
// Real portal: VAL-TOKEN comes back inside ESB_TRF_VAL response;
|
|
119
|
+
// wrapper keeps it on the draft via this setter since rel. 2.5.
|
|
120
|
+
if (draft.getValToken() == null) {
|
|
121
|
+
draft.setValToken("VT-" + session.getId());
|
|
122
|
+
}
|
|
123
|
+
} catch (EsbException e) {
|
|
124
|
+
renderStep1(request, response,
|
|
125
|
+
"Service temporarily unavailable, please retry (rc " + e.getEsbRc() + ").");
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Park the draft for step 2/3. THE session attribute of this app.
|
|
130
|
+
session.setAttribute("trfDraft", draft);
|
|
131
|
+
|
|
132
|
+
request.setAttribute("draft", draft);
|
|
133
|
+
forward(request, response, "/transferStep2.jsp");
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** Execute against the host using the session draft, then clear it. */
|
|
137
|
+
private void handleStep3(HttpServletRequest request, HttpServletResponse response)
|
|
138
|
+
throws ServletException, IOException {
|
|
139
|
+
|
|
140
|
+
HttpSession session = request.getSession(true);
|
|
141
|
+
TransferDraft draft = (TransferDraft) session.getAttribute("trfDraft");
|
|
142
|
+
if (draft == null) {
|
|
143
|
+
// Session expired between review and confirm: restart.
|
|
144
|
+
response.sendRedirect("transfer");
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
TrfDTO res;
|
|
149
|
+
try {
|
|
150
|
+
res = execService.execute(custId(session), draft);
|
|
151
|
+
} catch (EsbException e) {
|
|
152
|
+
res = new TrfDTO();
|
|
153
|
+
res.setStatus("KO");
|
|
154
|
+
res.setHostRc(e.getEsbRc());
|
|
155
|
+
res.setHostMsg("HOST UNREACHABLE - TRANSFER NOT EXECUTED");
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Draft must not survive execution (double-submit guard is host-side
|
|
159
|
+
// via VAL-TOKEN, but keep the session clean anyway).
|
|
160
|
+
session.removeAttribute("trfDraft");
|
|
161
|
+
|
|
162
|
+
request.setAttribute("trfRes", res);
|
|
163
|
+
forward(request, response, "/transferConfirm.jsp");
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
private void renderStep1(HttpServletRequest request, HttpServletResponse response,
|
|
167
|
+
String stepErr) throws ServletException, IOException {
|
|
168
|
+
|
|
169
|
+
HttpSession session = request.getSession(true);
|
|
170
|
+
try {
|
|
171
|
+
List combo = benfListService.listBeneficiaries(custId(session));
|
|
172
|
+
request.setAttribute("benfCombo", combo);
|
|
173
|
+
} catch (EsbException e) {
|
|
174
|
+
request.setAttribute("benfCombo", new java.util.ArrayList());
|
|
175
|
+
}
|
|
176
|
+
// Pre-fill from any draft still in session (Back from review).
|
|
177
|
+
TransferDraft draft = (TransferDraft) session.getAttribute("trfDraft");
|
|
178
|
+
if (draft != null) {
|
|
179
|
+
request.setAttribute("draft", draft);
|
|
180
|
+
}
|
|
181
|
+
if (stepErr != null) {
|
|
182
|
+
request.setAttribute("stepErr", stepErr);
|
|
183
|
+
}
|
|
184
|
+
forward(request, response, "/transferStep1.jsp");
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** Host charset is restrictive; strip what SEPA remittance rejects. */
|
|
188
|
+
private String sanitizeDesc(String desc) {
|
|
189
|
+
if (desc == null) return null;
|
|
190
|
+
String cleaned = desc.replaceAll("[^A-Za-z0-9 .,/()-]", " ").trim();
|
|
191
|
+
return cleaned.length() > 140 ? cleaned.substring(0, 140) : cleaned;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
private String validationMessage(String rc) {
|
|
195
|
+
if ("0201".equals(rc)) return "Insufficient available balance.";
|
|
196
|
+
if ("0205".equals(rc)) return "Daily online transfer limit exceeded (EUR 5,000.00).";
|
|
197
|
+
if ("0207".equals(rc)) return "Transfer refused by compliance screening.";
|
|
198
|
+
return "Transfer refused by the bank host (code " + rc + ").";
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
private void forward(HttpServletRequest request, HttpServletResponse response,
|
|
202
|
+
String jsp) throws ServletException, IOException {
|
|
203
|
+
RequestDispatcher rd = request.getRequestDispatcher(jsp);
|
|
204
|
+
rd.forward(request, response);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
private String custId(HttpSession session) {
|
|
208
|
+
String custId = (String) session.getAttribute("custId");
|
|
209
|
+
if (custId == null) {
|
|
210
|
+
custId = "CUST0042";
|
|
211
|
+
session.setAttribute("custId", custId);
|
|
212
|
+
}
|
|
213
|
+
return custId;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
private String trim(String s) {
|
|
217
|
+
return s == null ? null : s.trim();
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
private boolean isEmpty(String s) {
|
|
221
|
+
return s == null || s.trim().length() == 0;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="ISO-8859-1"?>
|
|
2
|
+
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
|
|
3
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
4
|
+
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
|
|
5
|
+
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
|
|
6
|
+
version="2.5">
|
|
7
|
+
|
|
8
|
+
<display-name>DemoBank Internet Banking Portal</display-name>
|
|
9
|
+
|
|
10
|
+
<context-param>
|
|
11
|
+
<param-name>demobank.esb.endpoint</param-name>
|
|
12
|
+
<param-value>http://esb-gw.internal.demobank.example:7801/esb/router</param-value>
|
|
13
|
+
</context-param>
|
|
14
|
+
<context-param>
|
|
15
|
+
<param-name>demobank.esb.timeoutMs</param-name>
|
|
16
|
+
<param-value>12000</param-value>
|
|
17
|
+
</context-param>
|
|
18
|
+
|
|
19
|
+
<servlet>
|
|
20
|
+
<servlet-name>AccountOverviewServlet</servlet-name>
|
|
21
|
+
<servlet-class>com.demobank.legacy.web.AccountOverviewServlet</servlet-class>
|
|
22
|
+
</servlet>
|
|
23
|
+
<servlet-mapping>
|
|
24
|
+
<servlet-name>AccountOverviewServlet</servlet-name>
|
|
25
|
+
<url-pattern>/accountOverview</url-pattern>
|
|
26
|
+
</servlet-mapping>
|
|
27
|
+
|
|
28
|
+
<servlet>
|
|
29
|
+
<servlet-name>BeneficiaryServlet</servlet-name>
|
|
30
|
+
<servlet-class>com.demobank.legacy.web.BeneficiaryServlet</servlet-class>
|
|
31
|
+
</servlet>
|
|
32
|
+
<servlet-mapping>
|
|
33
|
+
<servlet-name>BeneficiaryServlet</servlet-name>
|
|
34
|
+
<url-pattern>/beneficiary</url-pattern>
|
|
35
|
+
</servlet-mapping>
|
|
36
|
+
|
|
37
|
+
<servlet>
|
|
38
|
+
<servlet-name>TransferServlet</servlet-name>
|
|
39
|
+
<servlet-class>com.demobank.legacy.web.TransferServlet</servlet-class>
|
|
40
|
+
</servlet>
|
|
41
|
+
<servlet-mapping>
|
|
42
|
+
<servlet-name>TransferServlet</servlet-name>
|
|
43
|
+
<url-pattern>/transfer</url-pattern>
|
|
44
|
+
</servlet-mapping>
|
|
45
|
+
|
|
46
|
+
<session-config>
|
|
47
|
+
<session-timeout>10</session-timeout>
|
|
48
|
+
</session-config>
|
|
49
|
+
|
|
50
|
+
<welcome-file-list>
|
|
51
|
+
<welcome-file>login.jsp</welcome-file>
|
|
52
|
+
</welcome-file-list>
|
|
53
|
+
|
|
54
|
+
<error-page>
|
|
55
|
+
<error-code>500</error-code>
|
|
56
|
+
<location>/help.jsp</location>
|
|
57
|
+
</error-page>
|
|
58
|
+
|
|
59
|
+
</web-app>
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
<%@ page contentType="text/html; charset=ISO-8859-1" %>
|
|
2
|
+
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
|
|
3
|
+
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
|
|
4
|
+
<%-- HERO 1: account overview. Server-rendered from AccountOverviewServlet
|
|
5
|
+
("accts" request attribute, list of AcctOvwDTO) plus an AJAX refresh
|
|
6
|
+
that re-reads balances as JSON. --%>
|
|
7
|
+
<jsp:include page="header.jsp" />
|
|
8
|
+
|
|
9
|
+
<h1>Account Overview</h1>
|
|
10
|
+
<p>Position as of <c:out value="${asOfTs}" />
|
|
11
|
+
<input type="button" id="btnRefresh" class="btn" value="Refresh balances" />
|
|
12
|
+
<span id="refreshMsg"></span>
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
<table class="data" id="acctTable">
|
|
16
|
+
<tr>
|
|
17
|
+
<th>Account</th>
|
|
18
|
+
<th>Description</th>
|
|
19
|
+
<th>Ccy</th>
|
|
20
|
+
<th class="num">Current balance</th>
|
|
21
|
+
<th class="num">Available balance</th>
|
|
22
|
+
</tr>
|
|
23
|
+
<c:forEach var="a" items="${accts}" varStatus="st">
|
|
24
|
+
<tr class="${st.index % 2 == 1 ? 'odd' : ''}">
|
|
25
|
+
<td><c:out value="${a.acctNo}" /></td>
|
|
26
|
+
<td><c:out value="${a.acctDesc}" /></td>
|
|
27
|
+
<td><c:out value="${a.ccyCd}" /></td>
|
|
28
|
+
<td class="num curBal"><fmt:formatNumber value="${a.curBal}" minFractionDigits="2" maxFractionDigits="2" /></td>
|
|
29
|
+
<td class="num avlBal"><fmt:formatNumber value="${a.avlBal}" minFractionDigits="2" maxFractionDigits="2" /></td>
|
|
30
|
+
</tr>
|
|
31
|
+
</c:forEach>
|
|
32
|
+
<c:if test="${empty accts}">
|
|
33
|
+
<tr><td colspan="5">No accounts found for customer.</td></tr>
|
|
34
|
+
</c:if>
|
|
35
|
+
</table>
|
|
36
|
+
|
|
37
|
+
<script type="text/javascript">
|
|
38
|
+
$(document).ready(function() {
|
|
39
|
+
$("#btnRefresh").click(function() {
|
|
40
|
+
$("#refreshMsg").text("Refreshing...");
|
|
41
|
+
$.ajax({
|
|
42
|
+
url: "accountOverview",
|
|
43
|
+
type: "GET",
|
|
44
|
+
data: { fmt: "json" },
|
|
45
|
+
dataType: "json",
|
|
46
|
+
cache: false,
|
|
47
|
+
success: function(data) {
|
|
48
|
+
// Row order from the ESB matches the rendered table (host keeps
|
|
49
|
+
// acct order stable per customer), so update positionally.
|
|
50
|
+
var rows = $("#acctTable tr").not(":first");
|
|
51
|
+
for (var i = 0; i < data.accts.length && i < rows.length; i++) {
|
|
52
|
+
$(rows[i]).find("td.curBal").text(data.accts[i].curBal);
|
|
53
|
+
$(rows[i]).find("td.avlBal").text(data.accts[i].avlBal);
|
|
54
|
+
}
|
|
55
|
+
$("#refreshMsg").text("Updated " + data.asOfTs).removeClass("msgErr").addClass("msgOk");
|
|
56
|
+
},
|
|
57
|
+
error: function() {
|
|
58
|
+
$("#refreshMsg").text("Refresh failed, please retry.").removeClass("msgOk").addClass("msgErr");
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
</script>
|
|
64
|
+
|
|
65
|
+
<jsp:include page="footer.jsp" />
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<%@ page contentType="text/html; charset=ISO-8859-1" %>
|
|
2
|
+
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
|
|
3
|
+
<%-- HERO 2 (form): add/edit beneficiary. Client-side jQuery validation
|
|
4
|
+
(inline + validate.js) AND server-side validation in BeneficiaryServlet.
|
|
5
|
+
The two rule sets overlap but are NOT identical on purpose:
|
|
6
|
+
- client allows 70 chars for name, server allows 60 (DB-2988)
|
|
7
|
+
- client IBAN check is shape-only, server also checks country IT/DE/FR
|
|
8
|
+
- client tolerates decimal comma, server does not (DB-3302 pattern)
|
|
9
|
+
"benf" request attribute holds the BenfDTO being edited (may be new). --%>
|
|
10
|
+
<jsp:include page="header.jsp" />
|
|
11
|
+
|
|
12
|
+
<h1><c:choose><c:when test="${empty benf.benfId}">Add beneficiary</c:when><c:otherwise>Edit beneficiary</c:otherwise></c:choose></h1>
|
|
13
|
+
|
|
14
|
+
<c:if test="${not empty srvErrs}">
|
|
15
|
+
<ul>
|
|
16
|
+
<c:forEach var="e" items="${srvErrs}">
|
|
17
|
+
<li class="msgErr"><c:out value="${e}" /></li>
|
|
18
|
+
</c:forEach>
|
|
19
|
+
</ul>
|
|
20
|
+
</c:if>
|
|
21
|
+
|
|
22
|
+
<form id="benfForm" class="legacy" method="post" action="beneficiary">
|
|
23
|
+
<input type="hidden" name="benfId" value="<c:out value='${benf.benfId}' />" />
|
|
24
|
+
<div class="row">
|
|
25
|
+
<label for="benfNm">Beneficiary name</label>
|
|
26
|
+
<input type="text" id="benfNm" name="benfNm" size="50" maxlength="70"
|
|
27
|
+
value="<c:out value='${benf.benfNm}' />" />
|
|
28
|
+
</div>
|
|
29
|
+
<div class="row">
|
|
30
|
+
<label for="benfIban">IBAN</label>
|
|
31
|
+
<input type="text" id="benfIban" name="benfIban" size="40"
|
|
32
|
+
value="<c:out value='${benf.benfIban}' />" />
|
|
33
|
+
</div>
|
|
34
|
+
<div class="row">
|
|
35
|
+
<label for="bankNm">Bank name</label>
|
|
36
|
+
<input type="text" id="bankNm" name="bankNm" size="40"
|
|
37
|
+
value="<c:out value='${benf.bankNm}' />" />
|
|
38
|
+
</div>
|
|
39
|
+
<div class="row">
|
|
40
|
+
<label for="ccyCd">Currency</label>
|
|
41
|
+
<select id="ccyCd" name="ccyCd">
|
|
42
|
+
<option value="EUR" <c:if test="${benf.ccyCd == 'EUR'}">selected="selected"</c:if>>EUR</option>
|
|
43
|
+
<option value="USD" <c:if test="${benf.ccyCd == 'USD'}">selected="selected"</c:if>>USD</option>
|
|
44
|
+
<option value="GBP" <c:if test="${benf.ccyCd == 'GBP'}">selected="selected"</c:if>>GBP</option>
|
|
45
|
+
</select>
|
|
46
|
+
</div>
|
|
47
|
+
<div class="row">
|
|
48
|
+
<input type="submit" class="btn" value="Save" />
|
|
49
|
+
<input type="button" class="btn btnGrey" value="Cancel"
|
|
50
|
+
onclick="window.location='beneficiary';" />
|
|
51
|
+
</div>
|
|
52
|
+
</form>
|
|
53
|
+
|
|
54
|
+
<script type="text/javascript">
|
|
55
|
+
$(document).ready(function() {
|
|
56
|
+
$("#benfForm").submit(function() {
|
|
57
|
+
var ok = true;
|
|
58
|
+
// NB: client allows up to 70 chars, the host field is CHAR(60) --
|
|
59
|
+
// servlet rejects instead of truncating. Kept as-is since 2011, see DB-2988.
|
|
60
|
+
if (!dbRequired("#benfNm", "Beneficiary name is required")) ok = false;
|
|
61
|
+
else if (!dbMaxLen("#benfNm", 70)) ok = false;
|
|
62
|
+
if (!dbRequired("#benfIban", "IBAN is required")) ok = false;
|
|
63
|
+
else if (!dbIbanShape("#benfIban")) ok = false;
|
|
64
|
+
// bankNm optional on the client; server requires it for non-EUR.
|
|
65
|
+
return ok;
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
</script>
|
|
69
|
+
|
|
70
|
+
<jsp:include page="footer.jsp" />
|