Compare commits

...
37 Commits
Author SHA1 Message Date
james.maes 30565f9381 Merge pull request 'build(deps): align with Gitea registry (parent 2.2.1, QQQ 4.1.0-RC.26)' (#24) from deps/align-gitea into develop
build / maven (push) Successful in 3m11s
maven / build (push) Successful in 3m11s
2026-11-07 18:22:07 +00:00
james.maesandClaude Opus 5.5 80b623ac45 build(deps): align with Gitea registry (parent 2.2.1, QQQ 4.1.0-RC.26)
build / maven (push) Successful in 3m38s
maven / build (push) Successful in 3m39s
pom.xml: parent -> 2.2.1
pom.xml: qqq.version: 4.1.0-RC.21 -> 4.1.0-RC.26

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 18:12:53 +00:00
james.maes 39477b2602 Merge pull request 'ci: pin shared workflow to v1' (#23) from ci/pin-v1-develop into develop
QRun-IO/ci-policy: native / dotnet-0 (push) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (push) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (push) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (push) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (push) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (push) Skipped
QRun-IO/ci-policy: ci / source-config-14 (push) Skipped
QRun-IO/ci-policy: ci / original-voyage (push) Skipped
QRun-IO/ci-policy: ci / original-cli (push) Skipped
QRun-IO/ci-policy: ci / ci-result (push) Successful in 12s
build / maven (push) Successful in 3m50s
QRun-IO/ci-policy: ci / fork-guard (push) Skipped
QRun-IO/ci-policy: native / fork-deny (push) Skipped
QRun-IO/ci-policy: ci / Scoped workflow [workflow 1e25bb5a243dfdcd95d4b9a4f780200ff8c8778a] (push) Successful in 13s
QRun-IO/ci-policy: ci / head-profile (push) Skipped
QRun-IO/ci-policy: ci / repository-policy (push) Skipped
QRun-IO/ci-policy: ci / application-template-0 (push) Skipped
QRun-IO/ci-policy: ci / gradle-1 (push) Skipped
QRun-IO/ci-policy: ci / java-maven-6 (push) Skipped
QRun-IO/ci-policy: ci / node-8 (push) Skipped
QRun-IO/ci-policy: ci / node-9 (push) Skipped
QRun-IO/ci-policy: ci / node-10 (push) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (push) Skipped
QRun-IO/ci-policy: ci / source-config-13 (push) Skipped
QRun-IO/ci-policy: ci / original-business (push) Skipped
QRun-IO/ci-policy: ci / shared-pipeline (push) Skipped
QRun-IO/ci-policy: native / native-result (push) Successful in 7s
QRun-IO/ci-policy: ci / java-docker-3-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (push) Skipped
QRun-IO/ci-policy: ci / android-0 (push) Skipped
QRun-IO/ci-policy: ci / original-mcp (push) Skipped
QRun-IO/ci-policy: ci / not-enrolled (push) Skipped
maven / build (push) Successful in 3m49s
2026-11-06 16:12:28 +00:00
james.maesandClaude Opus 5.5 a498b02651 ci: pin shared workflow to v1
build / maven (push) Successful in 2m39s
QRun-IO/ci-policy: ci / fork-guard (pull_request) Skipped
QRun-IO/ci-policy: ci / head-profile (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy (pull_request) Skipped
QRun-IO/ci-policy: ci / application-template-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (pull_request) Skipped
QRun-IO/ci-policy: ci / node-8 (pull_request) Skipped
QRun-IO/ci-policy: ci / original-business (pull_request) Skipped
QRun-IO/ci-policy: ci / original-voyage (pull_request) Skipped
QRun-IO/ci-policy: ci / original-cli (pull_request) Skipped
QRun-IO/ci-policy: ci / ci-result (pull_request) Successful in 6s
QRun-IO/ci-policy: native / fork-deny (pull_request) Skipped
QRun-IO/ci-policy: native / dotnet-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / Scoped workflow [workflow 1e25bb5a243dfdcd95d4b9a4f780200ff8c8778a] (pull_request) Successful in 6s
QRun-IO/ci-policy: native / native-result (pull_request) Successful in 5s
QRun-IO/ci-policy: ci / gradle-1 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-10 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-13 (pull_request) Skipped
QRun-IO/ci-policy: ci / android-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / original-mcp (pull_request) Skipped
QRun-IO/ci-policy: ci / not-enrolled (pull_request) Skipped
QRun-IO/ci-policy: ci / shared-pipeline (pull_request) Skipped
maven / build (push) Successful in 2m39s
QRun-IO/ci-policy: ci / java-frontend-browser-5 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-9 (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-14 (pull_request) Skipped
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 14:16:10 +00:00
james.maes 47ba2ff3b7 Merge pull request 'ci: use shared ci-workflows Maven workflow' (#22) from ci/ci-workflows into develop
QRun-IO/ci-policy: native / dotnet-0 (push) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (push) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (push) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (push) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (push) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (push) Skipped
QRun-IO/ci-policy: ci / source-config-14 (push) Skipped
QRun-IO/ci-policy: ci / original-voyage (push) Skipped
QRun-IO/ci-policy: ci / original-cli (push) Skipped
QRun-IO/ci-policy: ci / ci-result (push) Successful in 4s
build / maven (push) Successful in 2m29s
QRun-IO/ci-policy: ci / fork-guard (push) Skipped
QRun-IO/ci-policy: native / fork-deny (push) Skipped
QRun-IO/ci-policy: ci / head-profile (push) Skipped
QRun-IO/ci-policy: ci / repository-policy (push) Skipped
QRun-IO/ci-policy: ci / application-template-0 (push) Skipped
QRun-IO/ci-policy: ci / gradle-1 (push) Skipped
QRun-IO/ci-policy: native / native-result (push) Successful in 6s
QRun-IO/ci-policy: ci / java-maven-6 (push) Skipped
QRun-IO/ci-policy: ci / node-8 (push) Skipped
QRun-IO/ci-policy: ci / node-9 (push) Skipped
QRun-IO/ci-policy: ci / node-10 (push) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (push) Skipped
QRun-IO/ci-policy: ci / source-config-13 (push) Skipped
QRun-IO/ci-policy: ci / original-business (push) Skipped
QRun-IO/ci-policy: ci / shared-pipeline (push) Skipped
QRun-IO/ci-policy: ci / Scoped workflow [workflow d20a578c7d818bc7ca32a2ac2c675da4e4f27385] (push) Successful in 9s
QRun-IO/ci-policy: ci / java-docker-3-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (push) Skipped
QRun-IO/ci-policy: ci / android-0 (push) Skipped
QRun-IO/ci-policy: ci / original-mcp (push) Skipped
QRun-IO/ci-policy: ci / not-enrolled (push) Skipped
maven / build (push) Successful in 2m29s
2026-11-05 23:18:47 +00:00
CI 9bb90f468d ci: rerun shared workflow
QRun-IO/ci-policy: ci / fork-guard (pull_request) Skipped
QRun-IO/ci-policy: ci / Scoped workflow [workflow 1b3648d9421543350067e95e54959dfb471b26d5] (pull_request) Successful in 8s
QRun-IO/ci-policy: ci / head-profile (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy (pull_request) Skipped
QRun-IO/ci-policy: ci / application-template-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (pull_request) Skipped
QRun-IO/ci-policy: ci / node-8 (pull_request) Skipped
QRun-IO/ci-policy: ci / original-business (pull_request) Skipped
QRun-IO/ci-policy: ci / original-voyage (pull_request) Skipped
QRun-IO/ci-policy: ci / original-cli (pull_request) Skipped
QRun-IO/ci-policy: Shared Java Maven CI / secrets (pull_request) Failing after 1s
build / maven (push) Successful in 1m39s
QRun-IO/ci-policy: Shared Java Maven CI / verify (pull_request) Successful in 1m35s
QRun-IO/ci-policy: Shared Java Maven CI / gate (pull_request) Failing after 17s
QRun-IO/ci-policy: ci / java-maven-6 (pull_request) Failing after 19m14s
QRun-IO/ci-policy: ci / ci-result (pull_request) Failing after 5s
QRun-IO/ci-policy: native / fork-deny (pull_request) Skipped
QRun-IO/ci-policy: native / dotnet-0 (pull_request) Skipped
QRun-IO/ci-policy: native / native-result (pull_request) Failing after 1s
QRun-IO/ci-policy: ci / gradle-1 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-10 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-13 (pull_request) Skipped
QRun-IO/ci-policy: ci / android-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / original-mcp (pull_request) Skipped
QRun-IO/ci-policy: ci / not-enrolled (pull_request) Skipped
QRun-IO/ci-policy: ci / shared-pipeline (pull_request) Skipped
QRun-IO/ci-policy: ci / node-9 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-14 (pull_request) Skipped
maven / build (push) Successful in 1m39s
2026-11-05 16:28:26 -06:00
james.maesandClaude Opus 5.5 02dc55d826 ci: use shared ci-workflows Maven workflow
build / maven (push) Failing after 1s
QRun-IO/ci-policy: ci / fork-guard (pull_request) Skipped
QRun-IO/ci-policy: ci / Scoped workflow [workflow 1b3648d9421543350067e95e54959dfb471b26d5] (pull_request) Failing after 2s
QRun-IO/ci-policy: ci / head-profile (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy (pull_request) Skipped
QRun-IO/ci-policy: ci / application-template-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (pull_request) Skipped
QRun-IO/ci-policy: ci / node-8 (pull_request) Skipped
QRun-IO/ci-policy: ci / original-business (pull_request) Skipped
QRun-IO/ci-policy: ci / original-voyage (pull_request) Skipped
QRun-IO/ci-policy: ci / original-cli (pull_request) Skipped
QRun-IO/ci-policy: ci / ci-result (pull_request) Failing after 6s
QRun-IO/ci-policy: native / fork-deny (pull_request) Skipped
QRun-IO/ci-policy: native / dotnet-0 (pull_request) Skipped
QRun-IO/ci-policy: native / native-result (pull_request) Failing after 1s
QRun-IO/ci-policy: ci / gradle-1 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-10 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-13 (pull_request) Skipped
QRun-IO/ci-policy: ci / android-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / original-mcp (pull_request) Skipped
QRun-IO/ci-policy: ci / not-enrolled (pull_request) Skipped
QRun-IO/ci-policy: ci / shared-pipeline (pull_request) Skipped
maven / build (push) Failing after 1s
QRun-IO/ci-policy: ci / node-9 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-14 (pull_request) Skipped
Replace the platform-ci release callers with one caller of
KofTwentyTwo/ci-workflows maven.yaml (qqq-orb port).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 22:10:12 +00:00
james.maes bb3ffc01a8 Merge pull request 'Align with published QQQ 4.1 and preserve KOF22 integration' (#21) from feature/kof22-wms-canonical into develop
QRun-IO/ci-policy: native / dotnet-0 (push) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (push) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (push) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (push) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (push) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (push) Skipped
QRun-IO/ci-policy: ci / source-config-14 (push) Skipped
QRun-IO/ci-policy: ci / original-voyage (push) Skipped
QRun-IO/ci-policy: ci / original-cli (push) Skipped
Shared Java Maven CI / secrets (push) Successful in 39s
Shared Java Maven CI / verify (push) Successful in 2m30s
QRun-IO/ci-policy: Shared Java Maven CI / verify (push) Successful in 2m2s
QRun-IO/ci-policy: ci / ci-result (push) Successful in 6s
qrun-release / postpublish (push) Successful in 4m57s
QRun-IO/ci-policy: ci / fork-guard (push) Skipped
QRun-IO/ci-policy: native / fork-deny (push) Skipped
QRun-IO/ci-policy: ci / Scoped workflow [workflow 5e6bfd71ee8a5674882f7680c695a0ada599622f] (push) Successful in 8s
QRun-IO/ci-policy: ci / head-profile (push) Skipped
QRun-IO/ci-policy: ci / repository-policy (push) Skipped
QRun-IO/ci-policy: ci / application-template-0 (push) Skipped
QRun-IO/ci-policy: ci / gradle-1 (push) Skipped
QRun-IO/ci-policy: ci / node-8 (push) Skipped
QRun-IO/ci-policy: ci / node-9 (push) Skipped
QRun-IO/ci-policy: ci / node-10 (push) Skipped
QRun-IO/ci-policy: native / native-result (push) Successful in 9s
QRun-IO/ci-policy: ci / repository-policy-12 (push) Skipped
QRun-IO/ci-policy: ci / source-config-13 (push) Skipped
QRun-IO/ci-policy: ci / original-business (push) Skipped
QRun-IO/ci-policy: ci / shared-pipeline (push) Skipped
QRun-IO/ci-policy: Shared Java Maven CI / secrets (push) Successful in 29s
Shared Java Maven CI / gate (push) Successful in 20s
qrun-release / release (push) Successful in 7m20s
QRun-IO/ci-policy: ci / java-maven-6 (push) Successful in 8m0s
QRun-IO/ci-policy: ci / java-docker-3-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (push) Skipped
QRun-IO/ci-policy: ci / android-0 (push) Skipped
QRun-IO/ci-policy: ci / original-mcp (push) Skipped
QRun-IO/ci-policy: ci / not-enrolled (push) Skipped
QRun-IO/ci-policy: Shared Java Maven CI / gate (push) Successful in 13s
Shared QRun source version / version (push) Successful in 4m56s
2026-11-05 16:16:43 +00:00
james.maesandClaude Sonnet 5.5 278c357e28 build: converge JUnit on the parent's 5.10.0 so tests are discovered with the QQQ 4.1 BOM
QRun-IO/ci-policy: ci / fork-guard (pull_request) Skipped
QRun-IO/ci-policy: ci / head-profile (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy (pull_request) Skipped
QRun-IO/ci-policy: ci / application-template-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (pull_request) Skipped
QRun-IO/ci-policy: ci / node-8 (pull_request) Skipped
QRun-IO/ci-policy: ci / original-business (pull_request) Skipped
QRun-IO/ci-policy: ci / original-voyage (pull_request) Skipped
QRun-IO/ci-policy: ci / original-cli (pull_request) Skipped
Shared Java Maven CI / secrets (push) Successful in 44s
QRun-IO/ci-policy: Shared Java Maven CI / secrets (pull_request) Successful in 35s
Shared Java Maven CI / verify (push) Canceled after 0s
qrun-release / postpublish (push) Canceled after 0s
QRun-IO/ci-policy: Shared Java Maven CI / verify (pull_request) Successful in 2m11s
QRun-IO/ci-policy: Shared Java Maven CI / gate (pull_request) Successful in 20s
QRun-IO/ci-policy: ci / java-maven-6 (pull_request) Successful in 31m2s
QRun-IO/ci-policy: ci / ci-result (pull_request) Successful in 6s
Release candidate / release-rc (pull_request) Skipped
QRun-IO/ci-policy: native / fork-deny (pull_request) Skipped
QRun-IO/ci-policy: native / dotnet-0 (pull_request) Skipped
QRun-IO/ci-policy: native / native-result (pull_request) Successful in 12s
QRun-IO/ci-policy: ci / gradle-1 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-10 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-13 (pull_request) Skipped
QRun-IO/ci-policy: ci / android-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / original-mcp (pull_request) Skipped
QRun-IO/ci-policy: ci / not-enrolled (pull_request) Skipped
QRun-IO/ci-policy: ci / shared-pipeline (pull_request) Skipped
Shared Java Maven CI / gate (push) Canceled after 0s
qrun-release / release (push) Canceled after 12m56s
QRun-IO/ci-policy: ci / Scoped workflow [workflow cf802461ca4ebfcf5c500440715cb333d92ea606] (pull_request) Successful in 10s
QRun-IO/ci-policy: ci / node-9 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-14 (pull_request) Skipped
CI 4712 verify 74837 ran 0 tests: "TestEngine with ID 'junit-jupiter' failed to discover tests". The cause (reproduced with
the CI Maven 3.9.11 image and read from the surefire dump) is a mixed JUnit stack: qbit-build-parent 1.4.0 manages
junit-jupiter and the platform at 5.10.0, while the imported qqq-bom-pom 4.1.0-RC.21 manages junit-jupiter-engine and
-params at 6.0.2, so Jupiter engine 6.0.2 runs on platform-engine 1.10.0 and fails with NoClassDefFoundError
org.junit.platform.engine.support.discovery.DiscoveryIssueReporter. Import the parent's own junit-bom 5.10.0 before the QQQ
BOM (first import wins) so every JUnit artifact is 5.10.0. No version is upgraded or downgraded beyond that convergence;
no test, assertion, production code, JaCoCo or surefire setting changes.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 07:52:56 -06:00
James MaesandClaude Sonnet 5.5 9f07db4990 build: require the published QQQ 4.1 core (4.1.0-RC.21)
QRun-IO/ci-policy: Shared Java Maven CI / secrets (pull_request) Successful in 30s
QRun-IO/ci-policy: ci / fork-guard (pull_request) Skipped
QRun-IO/ci-policy: ci / head-profile (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy (pull_request) Skipped
QRun-IO/ci-policy: ci / application-template-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (pull_request) Skipped
QRun-IO/ci-policy: ci / node-8 (pull_request) Skipped
QRun-IO/ci-policy: ci / original-business (pull_request) Skipped
QRun-IO/ci-policy: ci / original-voyage (pull_request) Skipped
QRun-IO/ci-policy: ci / original-cli (pull_request) Skipped
Shared Java Maven CI / verify (push) Canceled after 0s
qrun-release / postpublish (push) Canceled after 0s
Shared Java Maven CI / secrets (push) Successful in 42s
QRun-IO/ci-policy: Shared Java Maven CI / verify (pull_request) Failing after 1m3s
QRun-IO/ci-policy: Shared Java Maven CI / gate (pull_request) Failing after 22s
QRun-IO/ci-policy: ci / java-maven-6 (pull_request) Failing after 42m36s
QRun-IO/ci-policy: ci / ci-result (pull_request) Failing after 11s
QRun-IO/ci-policy: ci / Scoped workflow [workflow 60e5a80ed7a5a67877bfb3e129b1929c83464b6e] (pull_request) Successful in 9s
QRun-IO/ci-policy: ci / gradle-1 (pull_request) Skipped
QRun-IO/ci-policy: native / fork-deny (pull_request) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (pull_request) Skipped
QRun-IO/ci-policy: native / dotnet-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-10 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-13 (pull_request) Skipped
QRun-IO/ci-policy: ci / android-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / original-mcp (pull_request) Skipped
QRun-IO/ci-policy: ci / not-enrolled (pull_request) Skipped
QRun-IO/ci-policy: ci / shared-pipeline (pull_request) Skipped
Shared Java Maven CI / gate (push) Canceled after 0s
qrun-release / release (push) Canceled after 4m40s
QRun-IO/ci-policy: native / native-result (pull_request) Successful in 11s
QRun-IO/ci-policy: ci / node-9 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-14 (pull_request) Skipped
Import qqq-bom-pom 4.1.0-RC.21 unconditionally ahead of the parent's BOM
and port the test base to the 4.1 API: QInstance.setAuthentication no
longer exists, so BaseTest uses withInstanceDefaultAuthentication. The
development revision and the parent are unchanged.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 05:46:46 -06:00
forge-recovery 9e90307aa3 ci: enroll shared Gitea lifecycle
qrun-release / postpublish (push) Failing after 10m18s
Shared Java Maven CI / verify (push) Successful in 2m27s
QRun-IO/ci-policy: ci / ci-result (push) Successful in 3s
QRun-IO/ci-policy: ci / java-docker-3 (push) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (push) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (push) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (push) Skipped
QRun-IO/ci-policy: ci / source-config-14 (push) Skipped
QRun-IO/ci-policy: native / dotnet-0 (push) Skipped
QRun-IO/ci-policy: Shared Java Maven CI / verify (push) Successful in 1m37s
Shared Java Maven CI / secrets (push) Successful in 40s
QRun-IO/ci-policy: ci / java-core-2-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (push) Skipped
Shared Java Maven CI / gate (push) Successful in 12s
qrun-release / release (push) Successful in 55m42s
QRun-IO/ci-policy: ci / java-maven-6 (push) Successful in 50m1s
QRun-IO/ci-policy: ci / fork-guard (push) Skipped
QRun-IO/ci-policy: ci / head-profile (push) Skipped
QRun-IO/ci-policy: ci / application-template-0 (push) Skipped
QRun-IO/ci-policy: ci / gradle-1 (push) Skipped
QRun-IO/ci-policy: ci / node-8 (push) Skipped
QRun-IO/ci-policy: ci / node-9 (push) Skipped
QRun-IO/ci-policy: ci / node-10 (push) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (push) Skipped
QRun-IO/ci-policy: ci / source-config-13 (push) Skipped
QRun-IO/ci-policy: native / fork-deny (push) Skipped
QRun-IO/ci-policy: Shared Java Maven CI / secrets (push) Successful in 42s
QRun-IO/ci-policy: ci / repository-policy (push) Skipped
QRun-IO/ci-policy: native / native-result (push) Successful in 8s
Shared QRun source version / version (push) Failing after 10m18s
QRun-IO/ci-policy: Shared Java Maven CI / gate (push) Successful in 8s
QRun-IO/ci-policy: ci / java-maven-7 (push) Skipped
QRun-IO/ci-policy: ci / android-0 (push) Skipped
QRun-IO/ci-policy: ci / original-mcp (push) Skipped
QRun-IO/ci-policy: ci / not-enrolled (push) Skipped
QRun-IO/ci-policy: ci / java-docker-3-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (push) Skipped
2026-11-02 22:25:40 +00:00
forge-recovery ca02700a2f ci: enroll shared Gitea lifecycle
QRun-IO/ci-policy: ci / java-docker-3 (push) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (push) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (push) Skipped
QRun-IO/ci-policy: ci / source-config-14 (push) Skipped
QRun-IO/ci-policy: native / dotnet-0 (push) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (push) Skipped
QRun-IO/ci-policy: Shared Java Maven CI / verify (push) Successful in 1m58s
QRun-IO/ci-policy: ci / ci-result (push) Successful in 4s
QRun-IO/ci-policy: ci / fork-guard (push) Skipped
QRun-IO/ci-policy: ci / head-profile (push) Skipped
QRun-IO/ci-policy: ci / application-template-0 (push) Skipped
QRun-IO/ci-policy: ci / gradle-1 (push) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (push) Skipped
QRun-IO/ci-policy: ci / node-8 (push) Skipped
QRun-IO/ci-policy: ci / node-9 (push) Skipped
QRun-IO/ci-policy: ci / node-10 (push) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (push) Skipped
QRun-IO/ci-policy: ci / source-config-13 (push) Skipped
QRun-IO/ci-policy: native / fork-deny (push) Skipped
QRun-IO/ci-policy: Shared Java Maven CI / secrets (push) Successful in 36s
QRun-IO/ci-policy: ci / repository-policy (push) Skipped
QRun-IO/ci-policy: native / native-result (push) Successful in 12s
QRun-IO/ci-policy: ci / java-maven-6 (push) Successful in 23m33s
QRun-IO/ci-policy: ci / java-maven-7 (push) Skipped
QRun-IO/ci-policy: ci / android-0 (push) Skipped
QRun-IO/ci-policy: ci / original-mcp (push) Skipped
QRun-IO/ci-policy: ci / not-enrolled (push) Skipped
QRun-IO/ci-policy: ci / java-docker-3-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (push) Skipped
QRun-IO/ci-policy: Shared Java Maven CI / gate (push) Successful in 14s
2026-11-02 21:37:12 +00:00
forge-recoveryandCodex f2f59a0aaf ci: enroll shared Gitea release-candidate lifecycle
QRun-IO/ci-policy: Shared Java Maven CI / secrets (pull_request) Successful in 19s
QRun-IO/ci-policy: ci / repository-policy (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (pull_request) Skipped
QRun-IO/ci-policy: ci / fork-guard (pull_request) Skipped
QRun-IO/ci-policy: ci / head-profile (pull_request) Skipped
QRun-IO/ci-policy: ci / application-template-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-8 (pull_request) Skipped
QRun-IO/ci-policy: Shared Java Maven CI / verify (pull_request) Successful in 2m2s
QRun-IO/ci-policy: Shared Java Maven CI / gate (pull_request) Successful in 22s
QRun-IO/ci-policy: ci / java-maven-6 (pull_request) Successful in 1h6m7s
QRun-IO/ci-policy: ci / ci-result (pull_request) Successful in 7s
Release candidate / release-rc (pull_request) Skipped
QRun-IO/ci-policy: native / native-result (pull_request) Successful in 5s
QRun-IO/ci-policy: ci / java-core-2-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3-head (pull_request) Skipped
QRun-IO/ci-policy: ci / gradle-1 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (pull_request) Skipped
QRun-IO/ci-policy: ci / not-enrolled (pull_request) Skipped
QRun-IO/ci-policy: ci / node-10 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-13 (pull_request) Skipped
QRun-IO/ci-policy: ci / android-0 (pull_request) Skipped
QRun-IO/ci-policy: native / fork-deny (pull_request) Skipped
QRun-IO/ci-policy: native / dotnet-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-14 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-9 (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (pull_request) Skipped
Co-Authored-By: Codex <noreply@openai.com>
2026-11-02 20:23:02 +00:00
ac1144b87e ci: add the isolated postpublish job to the QRun release caller
QRun-IO/ci-policy: ci / fork-guard (pull_request) Skipped
QRun-IO/ci-policy: ci / head-profile (pull_request) Skipped
QRun-IO/ci-policy: ci / application-template-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-8 (pull_request) Skipped
Shared Java Maven CI / secrets (push) Successful in 16s
QRun-IO/ci-policy: Shared Java Maven CI / secrets (pull_request) Successful in 18s
QRun-IO/ci-policy: ci / repository-policy (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (pull_request) Skipped
Shared Java Maven CI / verify (push) Canceled after 0s
qrun-release / postpublish (push) Canceled after 0s
QRun-IO/ci-policy: Shared Java Maven CI / verify (pull_request) Successful in 1m42s
QRun-IO/ci-policy: Shared Java Maven CI / gate (pull_request) Successful in 13s
QRun-IO/ci-policy: ci / java-maven-6 (pull_request) Successful in 3h10m36s
QRun-IO/ci-policy: ci / ci-result (pull_request) Successful in 7s
Release candidate / release-rc (pull_request) Skipped
QRun-IO/ci-policy: ci / gradle-1 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-10 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-13 (pull_request) Skipped
QRun-IO/ci-policy: ci / not-enrolled (pull_request) Skipped
QRun-IO/ci-policy: native / fork-deny (pull_request) Skipped
QRun-IO/ci-policy: native / dotnet-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3-head (pull_request) Skipped
QRun-IO/ci-policy: native / native-result (pull_request) Successful in 5s
Shared Java Maven CI / gate (push) Canceled after 0s
qrun-release / release (push) Canceled after 2h24m48s
QRun-IO/ci-policy: ci / java-frontend-browser-5 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-9 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-14 (pull_request) Skipped
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Codex <noreply@openai.com>
2026-11-02 15:56:18 +00:00
7a0bb719cf ci: move the QRun release caller to the thin v2 contract
QRun-IO/ci-policy: Shared Java Maven CI / gate (pull_request) Canceled after 0s
Shared Java Maven CI / verify (push) Canceled after 0s
Shared Java Maven CI / secrets (push) Successful in 20s
QRun-IO/ci-policy: Shared Java Maven CI / secrets (pull_request) Successful in 22s
QRun-IO/ci-policy: Shared Java Maven CI / verify (pull_request) Successful in 2m25s
QRun-IO/ci-policy: ci / fork-guard (pull_request) Skipped
QRun-IO/ci-policy: ci / application-template-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-5 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-6 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-playwright-8 (pull_request) Skipped
QRun-IO/ci-policy: ci / ci-result (pull_request) Failing after 7s
Shared Java Maven CI / gate (push) Canceled after 0s
qrun-release / release (push) Canceled after 6m57s
QRun-IO/ci-policy: native / native-result (pull_request) Successful in 5s
QRun-IO/ci-policy: ci / gradle-1 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-2 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-3 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-9 (pull_request) Skipped
QRun-IO/ci-policy: ci / not-enrolled (pull_request) Skipped
QRun-IO/ci-policy: native / fork-deny (pull_request) Skipped
QRun-IO/ci-policy: native / dotnet-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-4 (pull_request) Canceled after 6m50s
QRun-IO/ci-policy: ci / node-7 (pull_request) Skipped
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Codex <noreply@openai.com>
2026-11-02 06:22:37 +00:00
forge-recoveryandCodex 5e9d3b697c ci: add the identical QRun release caller
QRun-IO/ci-policy: ci / ci-result (pull_request) Failing after 5s
QRun-IO/ci-policy: ci / fork-guard (pull_request) Skipped
QRun-IO/ci-policy: ci / application-template-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-5 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-6 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-playwright-7 (pull_request) Skipped
QRun-IO/ci-policy: Shared Java Maven CI / verify (pull_request) Failing after 1s
QRun-IO/ci-policy: Shared Java Maven CI / secrets (pull_request) Failing after 0s
QRun-IO/ci-policy: Shared Java Maven CI / gate (pull_request) Failing after 1s
QRun-IO/ci-policy: ci / gradle-1 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-2 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-3 (pull_request) Skipped
QRun-IO/ci-policy: ci / not-enrolled (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-8 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-4 (pull_request) Failing after 1m9s
Co-Authored-By: Codex <noreply@openai.com>
2026-11-02 04:17:40 +00:00
james.maesandCodex fabe5e13ed ci: adopt managed orb 0.8 patch track (#16)
Co-authored-by: Codex <noreply@openai.com>
2026-10-21 15:26:06 -05:00
james.maesandCodex 6969ededc1 ci: adopt shared orb 0.7.18 (#15)
Co-authored-by: Codex <noreply@openai.com>
2026-10-21 14:41:02 -05:00
james.maesandCodex 5f8b7e901b ci: adopt shared orb 0.7.17 (#14)
Co-authored-by: Codex <noreply@openai.com>
2026-10-21 14:17:09 -05:00
james.maesandCodex a45f015eeb ci: centralize QBit source scanning (#12)
Co-authored-by: Codex <noreply@openai.com>
2026-10-21 10:40:00 -05:00
james.maesandCodex 0a91e27ce8 ci: adopt central orb 0.7.12 and stable gates (#11)
Co-authored-by: Codex <noreply@openai.com>
2026-10-21 08:51:26 -05:00
james.maesandCodex df1608eb6f ci: centralize rc release completion in qqq orb (#10)
Co-authored-by: Codex <noreply@openai.com>
2026-10-21 02:23:42 -05:00
james.maesandCodex 72430fd030 ci: publish GA artifacts only from stable tags (#9)
Co-authored-by: Codex <noreply@openai.com>
2026-10-21 01:11:03 -05:00
james.maesandCodex 6ed2716042 ci: adopt shared orb 0.7.11 (#8)
Co-authored-by: Codex <noreply@openai.com>
2026-10-21 00:57:26 -05:00
CircleCI 5c3d4e6e7f Bump version to 0.2.0-SNAPSHOT [skip ci] 2026-10-21 00:33:02 +00:00
james.maes cd64b09ed9 Merge pull request #7 from QRun-IO/feature/central-ci
ci: adopt shared QQQ orb 0.7.4
2026-10-20 19:30:31 -05:00
james.maesandCodex 40f45596df ci: adopt central QQQ orb 0.7.4
Co-Authored-By: Codex <noreply@openai.com>
2026-10-20 19:26:35 -05:00
james.maes 82907e0cd2 Merge pull request #6 from QRun-IO/ci/release-rc-secrets-inherit
ci(release-rc): pass secrets so the shared workflow can sign the RC tag
2026-10-16 08:04:28 -05:00
james.maesandClaude Opus 5.5 fb2496aac5 ci(release-rc): pass secrets to the shared workflow so it can sign the RC tag
QRun-IO/.github#2 adds a tag-and-release job that signs vX with the
QRUN_TAG_SIGNING_KEY secret after Maven Central confirms the artifact.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 16:22:38 -05:00
james.maes a9b7becc4b Merge pull request #5 from QRun-IO/feature/contingent-possible-values
feat: contingent possible values (warehouse, client and item scoping)
2026-10-14 07:09:09 -05:00
james.maesandClaude Opus 5.5 758c39c727 feat: contingent possible values for scoped foreign keys
Dependent choices follow their parent selection on the same form (QQQ possibleValueSourceFilter with ${input.x}); filter builders still list everything.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 20:25:14 -05:00
james.maes bd4f0cda93 Merge pull request #4 from QRun-IO/feature/release-rc-automation
ci: automate RC releases; hotfix/* pushes no longer publish
2026-10-13 15:01:08 -05:00
james.maesandClaude Opus 5.5 1e96e15d3e ci: automate RC releases; hotfix/* pushes no longer publish
Removes publish_hotfix_release: a hotfix/* branch push published a GA
release to Maven Central with no tag or review (QRun-IO/qbit-cdn#12,
QRun-IO/qqq#1121). hotfix/* branches now run test_only; a hotfix
release publishes from a reviewed vX.Y.Z tag through publish_release.
Adds .github/workflows/release-rc.yml (reusable QRun-IO/.github
qbit-release-rc): a manual dispatch, or merging a develop PR labelled
release:rc, merges develop into the release line and the release/* push
runs the existing CircleCI RC publish.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 14:37:41 -05:00
james.maes 335e36fad5 Merge pull request #3 from QRun-IO/feature/ga-only-release-tags
ci: publish only GA tags (vX.Y.Z), never RC tags
2026-10-12 16:08:09 -05:00
james.maesandClaude Opus 5.5 761d2364d7 ci: publish only GA tags (vX.Y.Z), never RC tags
An RC tag matched /v.*/ and the orb republished it as the next RC.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 16:00:56 -05:00
James MaesandClaude Opus 4.8 7a36c6120e docs: add CLAUDE.md pointer to QQQ knowledge-base dossier + hub
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 05:31:30 -05:00
james.maesandClaude Opus 4.7 f8c2551489 chore: add CODEOWNERS pointing to sole maintainer
Architecture audit pass 2026-05-21. Minimal CODEOWNERS file
making the implicit ownership explicit.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 17:14:03 -05:00
31 changed files with 778 additions and 137 deletions

No files matched your search

+10 -53
View File
@@ -1,57 +1,14 @@
version: 2.1
setup: true
orbs:
qqq-orb: kingsrook/qqq-orb@0.3.8
qqq-orb: kingsrook/qqq-orb@0.8
workflows:
test_only:
setup:
jobs:
- qqq-orb/mvn_test_only:
context: [ qqq-maven-registry-credentials ]
filters:
branches:
ignore: /(develop|main|release/.*|hotfix/.*|integration.*)/
tags:
only: []
publish_snapshot:
jobs:
- qqq-orb/mvn_publish:
context: [ qqq-maven-registry-credentials ]
branch_type: snapshot
filters:
branches:
only:
- develop
publish_release_candidate:
jobs:
- qqq-orb/mvn_publish:
context: [ qqq-maven-registry-credentials ]
branch_type: release_candidate
filters:
branches:
only:
- /release\/.*/
publish_release:
jobs:
- qqq-orb/mvn_publish:
context: [ qqq-maven-registry-credentials ]
branch_type: release
filters:
branches:
only: [ main ]
tags:
only: [ /v.*/ ]
publish_hotfix_release:
jobs:
- qqq-orb/mvn_publish:
context: [ qqq-maven-registry-credentials ]
branch_type: hotfix
filters:
branches:
only:
- /hotfix\/.*/
- qqq-orb/generate_pipeline:
orb_version: '0.8'
filters:
branches:
ignore: automation/qbit-rc-pending
tags:
only: /^v\d+\.\d+\.\d+$/
+7
View File
@@ -0,0 +1,7 @@
name: build
on:
push:
jobs:
maven:
uses: self:KofTwentyTwo/ci-workflows/.gitea/workflows/maven.yaml@v1
secrets: inherit
+1
View File
@@ -0,0 +1 @@
* @KofTwentyTwo
+23
View File
@@ -0,0 +1,23 @@
name: CodeQL
'on':
push:
branches:
- main
- develop
- release/**
- hotfix/**
pull_request: {}
schedule:
- cron: 41 16 * * 0
workflow_dispatch: {}
permissions:
contents: read
actions: read
security-events: write
packages: read
concurrency:
group: codeql-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
jobs:
analyze:
uses: QRun-IO/qqq-orb/.github/workflows/qbit-codeql.yml@c288a8864fe9054f68410e1d78f5863aea4c4d22
+74
View File
@@ -0,0 +1,74 @@
name: Release candidate
'on':
workflow_dispatch:
inputs:
dry_run:
description: Plan a cut without changing release state
type: boolean
default: false
finalize:
description: Retry finalization of an existing cut; do not cut another RC
type: boolean
default: false
recover:
description: Recover the same published RC after a deployment timeout; never
reupload
type: boolean
default: false
circle_build:
description: Original Circle publisher build number (recovery only)
type: string
default: ''
merge_sha:
description: Existing cut merge_sha (finalize retry only)
type: string
default: ''
bump_sha:
description: Existing cut bump_sha (finalize retry only)
type: string
default: ''
branch:
description: Existing cut branch (finalize retry only)
type: string
default: ''
version:
description: Existing cut version (finalize retry only)
type: string
default: ''
pull_request:
types:
- closed
branches:
- develop
repository_dispatch:
types:
- qbit-rc-published
permissions:
contents: write
actions: read
checks: read
jobs:
release-rc:
if: github.event_name == 'workflow_dispatch' || github.event_name == 'repository_dispatch'
|| (github.event_name == 'pull_request' && github.event.pull_request.merged
== true && github.event.pull_request.base.ref == 'develop' && contains(github.event.pull_request.labels.*.name,
'release:rc'))
uses: QRun-IO/qqq-orb/.github/workflows/qbit-release-rc.yml@cc30f599e63c8e41629c99d23395bac1adb8bc44
with:
dry_run: ${{ github.event_name == 'workflow_dispatch' && inputs.dry_run || false
}}
finalize: ${{ github.event_name == 'repository_dispatch' || (github.event_name
== 'workflow_dispatch' && inputs.finalize) }}
recover: ${{ github.event_name == 'workflow_dispatch' && inputs.recover || false
}}
circle_build: ${{ github.event_name == 'workflow_dispatch' && inputs.circle_build
|| '' }}
merge_sha: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.merge_sha
|| inputs.merge_sha || '' }}
bump_sha: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.bump_sha
|| inputs.bump_sha || '' }}
branch: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.branch
|| inputs.branch || '' }}
version: ${{ github.event_name == 'repository_dispatch' && github.event.client_payload.version
|| inputs.version || '' }}
secrets: inherit
+16
View File
@@ -0,0 +1,16 @@
profile: qbit
orb_version: '0.8'
default_branch: develop
java_version: '21'
browsers: true
api_checks: false
docs_only: false
release_on_main: false
release_tag_policy: stable
test_branch_policy: non-release
publish:
snapshot: true
release_candidate: true
release: true
asciidoc: false
release_completion: true
+13
View File
@@ -0,0 +1,13 @@
# qbit-wms
QBit plugin for the QQQ platform: a complete Warehouse Management System (46 tables, 47 processes, 11 widgets, task-centric work engine, perpetual inventory ledger).
## Knowledge base
Reviewed dossiers for this repo and the wider QQQ platform live in the second-brain vault:
- Platform hub: `R:/Git.Local/KofTwentyTwo/second-brain/knowledge/qqq/qqq-hub.md`
- QBit mechanics: `R:/Git.Local/KofTwentyTwo/second-brain/knowledge/qqq/architecture/metadata-model.md`
- This repo's dossier: `R:/Git.Local/KofTwentyTwo/second-brain/knowledge/qqq/repos/qbit-wms.md`
Dossier reviewed at commit `f8c255148974` (branch `develop`, 2026-07-04). Key facts captured there: qqq pin 0.27.9 via `qbit-build-parent:1.4.0`, AGPL-3.0 licensing (no source headers), Gen-2 `QBitMetaDataProducer` contract, dead-config findings (only `backendName` + `recordSecurityLocks` consumed), phase plan tracked in QRun-IO/qqq issues #420-431, and v4.0 upgrade exposure (test-only BREAK-04-11 hit; Java 17 vs 21 floor).
+27 -2
View File
@@ -7,7 +7,7 @@
<parent>
<groupId>com.kingsrook</groupId>
<artifactId>qbit-build-parent</artifactId>
<version>1.4.0</version>
<version>2.2.1</version>
</parent>
<groupId>com.kingsrook.qbits</groupId>
@@ -28,10 +28,35 @@
</licenses>
<properties>
<revision>0.1.0</revision>
<revision>0.2.0-SNAPSHOT</revision>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<qqq.version>4.1.0-RC.26</qqq.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- One JUnit line. The QQQ 4.1 BOM manages junit-jupiter-engine/params at 6.0.2 while the parent's JUnit BOM
manages junit-jupiter and the platform at 5.10.0; the mixed engine then fails with
NoClassDefFoundError org.junit.platform.engine.support.discovery.DiscoveryIssueReporter and no test is found.
Import the parent's own JUnit version first (first import wins) so every JUnit artifact converges. -->
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>5.10.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Published QQQ 4.1 core (minimum QQQ 4.1), imported ahead of the parent's BOM. -->
<dependency>
<groupId>com.kingsrook.qqq</groupId>
<artifactId>qqq-bom-pom</artifactId>
<version>${qqq.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- QQQ Backend Core -->
<dependency>
@@ -7,7 +7,14 @@ package com.kingsrook.qbits.wms.advanced.model;
import java.time.Instant;
import com.kingsrook.qbits.wms.core.model.WmsItem;
import com.kingsrook.qbits.wms.core.model.WmsLocation;
import com.kingsrook.qbits.wms.core.model.WmsWarehouse;
import com.kingsrook.qbits.wms.core.model.WmsZone;
import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
@@ -19,10 +26,6 @@ import com.kingsrook.qqq.backend.core.model.metadata.tables.QFieldSection;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
import com.kingsrook.qbits.wms.core.model.WmsItem;
import com.kingsrook.qbits.wms.core.model.WmsLocation;
import com.kingsrook.qbits.wms.core.model.WmsWarehouse;
import com.kingsrook.qbits.wms.core.model.WmsZone;
@QMetaDataProducingEntity(
@@ -59,6 +62,14 @@ public class WmsReplenishmentRule extends QRecordEntity
java.util.List.of("sourceZoneId")))
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
// Scope pickLocationId choices to the selected warehouseId.
table.getField("pickLocationId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("warehouseId", QCriteriaOperator.EQUALS, "${input.warehouseId}")));
// Scope sourceZoneId choices to the selected warehouseId.
table.getField("sourceZoneId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("warehouseId", QCriteriaOperator.EQUALS, "${input.warehouseId}")));
return (table);
}
}
@@ -7,21 +7,50 @@ package com.kingsrook.qbits.wms.billing.model;
import java.math.BigDecimal;
import java.time.Instant;
import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
import com.kingsrook.qqq.backend.core.model.metadata.producers.annotations.QMetaDataProducingEntity;
import com.kingsrook.qbits.wms.core.enums.BillingActivityType;
import com.kingsrook.qbits.wms.core.model.WmsClient;
import com.kingsrook.qbits.wms.core.model.WmsTask;
import com.kingsrook.qbits.wms.core.model.WmsWarehouse;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
import com.kingsrook.qqq.backend.core.model.metadata.producers.MetaDataCustomizerInterface;
import com.kingsrook.qqq.backend.core.model.metadata.producers.annotations.QMetaDataProducingEntity;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
@QMetaDataProducingEntity(produceTableMetaData = true)
@QMetaDataProducingEntity(tableMetaDataCustomizer = WmsBillingActivity.TableMetaDataCustomizer.class, produceTableMetaData = true)
public class WmsBillingActivity extends QRecordEntity
{
public static final String TABLE_NAME = "wmsBillingActivity";
/*******************************************************************************
** Customize dependent choices after entity fields have been produced.
*******************************************************************************/
public static class TableMetaDataCustomizer implements MetaDataCustomizerInterface<QTableMetaData>
{
/***************************************************************************
** Restrict possible values to the current form scope.
***************************************************************************/
@Override
public QTableMetaData customizeMetaData(QInstance qInstance, QTableMetaData table)
{
// Scope rateId choices to the selected activityTypeId.
table.getField("rateId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("activityTypeId", QCriteriaOperator.EQUALS, "${input.activityTypeId}")));
return (table);
}
}
@QField(isEditable = false, isPrimaryKey = true)
private Integer id;
@@ -7,7 +7,11 @@ package com.kingsrook.qbits.wms.core.model;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import com.kingsrook.qbits.wms.core.enums.InventoryStatus;
import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
@@ -16,10 +20,9 @@ import com.kingsrook.qqq.backend.core.model.metadata.layout.QIcon;
import com.kingsrook.qqq.backend.core.model.metadata.producers.MetaDataCustomizerInterface;
import com.kingsrook.qqq.backend.core.model.metadata.producers.annotations.QMetaDataProducingEntity;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QFieldSection;
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
import com.kingsrook.qbits.wms.core.enums.InventoryStatus;
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
@QMetaDataProducingEntity(
@@ -59,6 +62,18 @@ public class WmsInventory extends QRecordEntity
java.util.List.of("holdReason", "lastCountDate")))
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
// Scope locationId choices to the selected warehouseId.
table.getField("locationId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("warehouseId", QCriteriaOperator.EQUALS, "${input.warehouseId}")));
// Scope lpnId choices to the selected warehouseId.
table.getField("lpnId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("warehouseId", QCriteriaOperator.EQUALS, "${input.warehouseId}")));
// Scope itemId choices to the selected clientId.
table.getField("itemId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("clientId", QCriteriaOperator.EQUALS, "${input.clientId}")));
return (table);
}
}
@@ -5,18 +5,51 @@ package com.kingsrook.qbits.wms.core.model;
import java.time.Instant;
import com.kingsrook.qbits.wms.core.enums.HoldType;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
import com.kingsrook.qqq.backend.core.model.metadata.producers.MetaDataCustomizerInterface;
import com.kingsrook.qqq.backend.core.model.metadata.producers.annotations.QMetaDataProducingEntity;
import com.kingsrook.qbits.wms.core.enums.HoldType;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
@QMetaDataProducingEntity(producePossibleValueSource = true, produceTableMetaData = true)
@QMetaDataProducingEntity(tableMetaDataCustomizer = WmsInventoryHold.TableMetaDataCustomizer.class, producePossibleValueSource = true, produceTableMetaData = true)
public class WmsInventoryHold extends QRecordEntity
{
public static final String TABLE_NAME = "wmsInventoryHold";
/*******************************************************************************
** Customize dependent choices after entity fields have been produced.
*******************************************************************************/
public static class TableMetaDataCustomizer implements MetaDataCustomizerInterface<QTableMetaData>
{
/***************************************************************************
** Restrict possible values to the current form scope.
***************************************************************************/
@Override
public QTableMetaData customizeMetaData(QInstance qInstance, QTableMetaData table)
{
// Scope locationId choices to the selected warehouseId.
table.getField("locationId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("warehouseId", QCriteriaOperator.EQUALS, "${input.warehouseId}")));
// Scope itemId choices to the selected clientId.
table.getField("itemId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("clientId", QCriteriaOperator.EQUALS, "${input.clientId}")));
return (table);
}
}
@QField(isEditable = false, isPrimaryKey = true)
private Integer id;
@@ -5,18 +5,47 @@ package com.kingsrook.qbits.wms.core.model;
import java.time.Instant;
import com.kingsrook.qbits.wms.core.enums.LpnStatus;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
import com.kingsrook.qqq.backend.core.model.metadata.producers.MetaDataCustomizerInterface;
import com.kingsrook.qqq.backend.core.model.metadata.producers.annotations.QMetaDataProducingEntity;
import com.kingsrook.qbits.wms.core.enums.LpnStatus;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
@QMetaDataProducingEntity(producePossibleValueSource = true, produceTableMetaData = true)
@QMetaDataProducingEntity(tableMetaDataCustomizer = WmsLicensePlate.TableMetaDataCustomizer.class, producePossibleValueSource = true, produceTableMetaData = true)
public class WmsLicensePlate extends QRecordEntity
{
public static final String TABLE_NAME = "wmsLicensePlate";
/*******************************************************************************
** Customize dependent choices after entity fields have been produced.
*******************************************************************************/
public static class TableMetaDataCustomizer implements MetaDataCustomizerInterface<QTableMetaData>
{
/***************************************************************************
** Restrict possible values to the current form scope.
***************************************************************************/
@Override
public QTableMetaData customizeMetaData(QInstance qInstance, QTableMetaData table)
{
// Scope locationId choices to the selected warehouseId.
table.getField("locationId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("warehouseId", QCriteriaOperator.EQUALS, "${input.warehouseId}")));
return (table);
}
}
@QField(isEditable = false, isPrimaryKey = true)
private Integer id;
@@ -6,7 +6,11 @@ package com.kingsrook.qbits.wms.core.model;
import java.math.BigDecimal;
import java.time.Instant;
import com.kingsrook.qbits.wms.core.enums.LocationType;
import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
@@ -15,10 +19,9 @@ import com.kingsrook.qqq.backend.core.model.metadata.layout.QIcon;
import com.kingsrook.qqq.backend.core.model.metadata.producers.MetaDataCustomizerInterface;
import com.kingsrook.qqq.backend.core.model.metadata.producers.annotations.QMetaDataProducingEntity;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QFieldSection;
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
import com.kingsrook.qbits.wms.core.enums.LocationType;
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
@QMetaDataProducingEntity(
@@ -54,6 +57,10 @@ public class WmsLocation extends QRecordEntity
java.util.List.of("maxWeightLbs", "maxVolumeCubicFt", "currentWeightLbs", "currentVolumeCubicFt", "isMixedSkuAllowed")))
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
// Scope zoneId choices to the selected warehouseId.
table.getField("zoneId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("warehouseId", QCriteriaOperator.EQUALS, "${input.warehouseId}")));
return (table);
}
}
@@ -6,7 +6,13 @@ package com.kingsrook.qbits.wms.core.model;
import java.math.BigDecimal;
import java.time.Instant;
import com.kingsrook.qbits.wms.core.enums.EquipmentType;
import com.kingsrook.qbits.wms.core.enums.TaskStatus;
import com.kingsrook.qbits.wms.core.enums.TaskType;
import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
@@ -15,12 +21,9 @@ import com.kingsrook.qqq.backend.core.model.metadata.layout.QIcon;
import com.kingsrook.qqq.backend.core.model.metadata.producers.MetaDataCustomizerInterface;
import com.kingsrook.qqq.backend.core.model.metadata.producers.annotations.QMetaDataProducingEntity;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QFieldSection;
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
import com.kingsrook.qbits.wms.core.enums.EquipmentType;
import com.kingsrook.qbits.wms.core.enums.TaskStatus;
import com.kingsrook.qbits.wms.core.enums.TaskType;
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
@QMetaDataProducingEntity(
@@ -67,6 +70,22 @@ public class WmsTask extends QRecordEntity
java.util.List.of("notes", "shortReason")))
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
// Scope lpnId choices to the selected warehouseId.
table.getField("lpnId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("warehouseId", QCriteriaOperator.EQUALS, "${input.warehouseId}")));
// Scope sourceLocationId choices to the selected warehouseId.
table.getField("sourceLocationId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("warehouseId", QCriteriaOperator.EQUALS, "${input.warehouseId}")));
// Scope destinationLocationId choices to the selected warehouseId.
table.getField("destinationLocationId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("warehouseId", QCriteriaOperator.EQUALS, "${input.warehouseId}")));
// Scope zoneId choices to the selected warehouseId.
table.getField("zoneId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("warehouseId", QCriteriaOperator.EQUALS, "${input.warehouseId}")));
return (table);
}
}
@@ -6,7 +6,13 @@ package com.kingsrook.qbits.wms.fulfillment.model;
import java.time.Instant;
import com.kingsrook.qbits.wms.core.model.WmsClient;
import com.kingsrook.qbits.wms.core.model.WmsItem;
import com.kingsrook.qbits.wms.core.model.WmsUnitOfMeasure;
import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
@@ -18,9 +24,6 @@ import com.kingsrook.qqq.backend.core.model.metadata.tables.QFieldSection;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
import com.kingsrook.qbits.wms.core.model.WmsClient;
import com.kingsrook.qbits.wms.core.model.WmsItem;
import com.kingsrook.qbits.wms.core.model.WmsUnitOfMeasure;
@QMetaDataProducingEntity(
@@ -54,6 +57,18 @@ public class WmsKitBom extends QRecordEntity
java.util.List.of("componentUomId", "clientId")))
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
// Scope componentUomId choices to the selected componentItemId.
table.getField("componentUomId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("itemId", QCriteriaOperator.EQUALS, "${input.componentItemId}")));
// Scope kitItemId choices to the selected clientId.
table.getField("kitItemId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("clientId", QCriteriaOperator.EQUALS, "${input.clientId}")));
// Scope componentItemId choices to the selected clientId.
table.getField("componentItemId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("clientId", QCriteriaOperator.EQUALS, "${input.clientId}")));
return (table);
}
}
@@ -7,7 +7,15 @@ package com.kingsrook.qbits.wms.fulfillment.model;
import java.time.Instant;
import com.kingsrook.qbits.wms.core.enums.KitWorkOrderStatus;
import com.kingsrook.qbits.wms.core.enums.KitWorkOrderType;
import com.kingsrook.qbits.wms.core.model.WmsClient;
import com.kingsrook.qbits.wms.core.model.WmsItem;
import com.kingsrook.qbits.wms.core.model.WmsWarehouse;
import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
@@ -19,11 +27,6 @@ import com.kingsrook.qqq.backend.core.model.metadata.tables.QFieldSection;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
import com.kingsrook.qbits.wms.core.enums.KitWorkOrderStatus;
import com.kingsrook.qbits.wms.core.enums.KitWorkOrderType;
import com.kingsrook.qbits.wms.core.model.WmsClient;
import com.kingsrook.qbits.wms.core.model.WmsItem;
import com.kingsrook.qbits.wms.core.model.WmsWarehouse;
@QMetaDataProducingEntity(
@@ -57,6 +60,10 @@ public class WmsKitWorkOrder extends QRecordEntity
java.util.List.of("warehouseId", "clientId", "assignedTo", "completedDate")))
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
// Scope kitItemId choices to the selected clientId.
table.getField("kitItemId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("clientId", QCriteriaOperator.EQUALS, "${input.clientId}")));
return (table);
}
}
@@ -7,7 +7,13 @@ package com.kingsrook.qbits.wms.fulfillment.model;
import java.math.BigDecimal;
import java.time.Instant;
import com.kingsrook.qbits.wms.core.enums.OrderStatus;
import com.kingsrook.qbits.wms.core.model.WmsClient;
import com.kingsrook.qbits.wms.core.model.WmsWarehouse;
import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
@@ -22,9 +28,6 @@ import com.kingsrook.qqq.backend.core.model.metadata.tables.QFieldSection;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
import com.kingsrook.qbits.wms.core.enums.OrderStatus;
import com.kingsrook.qbits.wms.core.model.WmsClient;
import com.kingsrook.qbits.wms.core.model.WmsWarehouse;
@QMetaDataProducingEntity(
@@ -75,6 +78,10 @@ public class WmsOrder extends QRecordEntity
"totalLineCount", "totalUnitCount", "orderValue", "specialInstructions")))
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
// Scope waveId choices to the selected warehouseId.
table.getField("waveId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("warehouseId", QCriteriaOperator.EQUALS, "${input.warehouseId}")));
return (table);
}
}
@@ -6,7 +6,13 @@ package com.kingsrook.qbits.wms.fulfillment.model;
import java.time.Instant;
import com.kingsrook.qbits.wms.core.enums.OrderLineStatus;
import com.kingsrook.qbits.wms.core.model.WmsItem;
import com.kingsrook.qbits.wms.core.model.WmsUnitOfMeasure;
import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
@@ -18,9 +24,6 @@ import com.kingsrook.qqq.backend.core.model.metadata.tables.QFieldSection;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
import com.kingsrook.qbits.wms.core.enums.OrderLineStatus;
import com.kingsrook.qbits.wms.core.model.WmsItem;
import com.kingsrook.qbits.wms.core.model.WmsUnitOfMeasure;
@QMetaDataProducingEntity(
@@ -57,6 +60,10 @@ public class WmsOrderLine extends QRecordEntity
java.util.List.of("uomId", "lotPreference")))
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
// Scope uomId choices to the selected itemId.
table.getField("uomId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("itemId", QCriteriaOperator.EQUALS, "${input.itemId}")));
return (table);
}
}
@@ -6,7 +6,14 @@
package com.kingsrook.qbits.wms.inventory.processes;
import com.kingsrook.qbits.wms.core.enums.CycleCountType;
import com.kingsrook.qbits.wms.core.model.WmsCycleCount;
import com.kingsrook.qbits.wms.core.model.WmsWarehouse;
import com.kingsrook.qbits.wms.core.model.WmsZone;
import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.metadata.MetaDataProducerInterface;
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference;
@@ -18,10 +25,6 @@ import com.kingsrook.qqq.backend.core.model.metadata.processes.QComponentType;
import com.kingsrook.qqq.backend.core.model.metadata.processes.QFrontendComponentMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.processes.QFrontendStepMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.processes.QProcessMetaData;
import com.kingsrook.qbits.wms.core.enums.CycleCountType;
import com.kingsrook.qbits.wms.core.model.WmsCycleCount;
import com.kingsrook.qbits.wms.core.model.WmsWarehouse;
import com.kingsrook.qbits.wms.core.model.WmsZone;
public class CycleCountProcessMetaDataProducer implements MetaDataProducerInterface<QProcessMetaData>
@@ -51,7 +54,9 @@ public class CycleCountProcessMetaDataProducer implements MetaDataProducerInterf
.withComponent(new QFrontendComponentMetaData().withType(QComponentType.EDIT_FORM))
.withFormField(new QFieldMetaData("warehouseId", QFieldType.INTEGER).withLabel("Warehouse").withPossibleValueSourceName(WmsWarehouse.TABLE_NAME).withIsRequired(true))
.withFormField(new QFieldMetaData("countTypeId", QFieldType.INTEGER).withLabel("Count Type").withPossibleValueSourceName(CycleCountType.NAME).withIsRequired(true))
.withFormField(new QFieldMetaData("zoneId", QFieldType.INTEGER).withLabel("Target Zone").withPossibleValueSourceName(WmsZone.TABLE_NAME))
// Scope zone choices to the warehouse selected on this process form.
.withFormField(new QFieldMetaData("zoneId", QFieldType.INTEGER).withLabel("Target Zone").withPossibleValueSourceName(WmsZone.TABLE_NAME)
.withPossibleValueSourceFilter(new QQueryFilter(new QFilterCriteria("warehouseId", QCriteriaOperator.EQUALS, "${input.warehouseId}"))))
.withFormField(new QFieldMetaData("assignedTo", QFieldType.STRING).withLabel("Assign To")))
//////////////////////////////////////////////////////////////////////////
@@ -7,19 +7,48 @@ package com.kingsrook.qbits.wms.receiving.model;
import java.time.Instant;
import java.time.LocalDate;
import com.kingsrook.qbits.wms.core.model.WmsItem;
import com.kingsrook.qbits.wms.core.model.WmsUnitOfMeasure;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
import com.kingsrook.qqq.backend.core.model.metadata.producers.MetaDataCustomizerInterface;
import com.kingsrook.qqq.backend.core.model.metadata.producers.annotations.QMetaDataProducingEntity;
import com.kingsrook.qbits.wms.core.model.WmsItem;
import com.kingsrook.qbits.wms.core.model.WmsUnitOfMeasure;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
@QMetaDataProducingEntity(produceTableMetaData = true)
@QMetaDataProducingEntity(tableMetaDataCustomizer = WmsAsnLine.TableMetaDataCustomizer.class, produceTableMetaData = true)
public class WmsAsnLine extends QRecordEntity
{
public static final String TABLE_NAME = "wmsAsnLine";
/*******************************************************************************
** Customize dependent choices after entity fields have been produced.
*******************************************************************************/
public static class TableMetaDataCustomizer implements MetaDataCustomizerInterface<QTableMetaData>
{
/***************************************************************************
** Restrict possible values to the current form scope.
***************************************************************************/
@Override
public QTableMetaData customizeMetaData(QInstance qInstance, QTableMetaData table)
{
// Scope uomId choices to the selected itemId.
table.getField("uomId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("itemId", QCriteriaOperator.EQUALS, "${input.itemId}")));
return (table);
}
}
@QField(isEditable = false, isPrimaryKey = true)
private Integer id;
@@ -7,7 +7,15 @@ package com.kingsrook.qbits.wms.receiving.model;
import java.time.Instant;
import java.time.LocalDate;
import com.kingsrook.qbits.wms.core.enums.PurchaseOrderStatus;
import com.kingsrook.qbits.wms.core.model.WmsClient;
import com.kingsrook.qbits.wms.core.model.WmsLocation;
import com.kingsrook.qbits.wms.core.model.WmsVendor;
import com.kingsrook.qbits.wms.core.model.WmsWarehouse;
import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
@@ -22,11 +30,6 @@ import com.kingsrook.qqq.backend.core.model.metadata.tables.QFieldSection;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
import com.kingsrook.qbits.wms.core.enums.PurchaseOrderStatus;
import com.kingsrook.qbits.wms.core.model.WmsClient;
import com.kingsrook.qbits.wms.core.model.WmsLocation;
import com.kingsrook.qbits.wms.core.model.WmsVendor;
import com.kingsrook.qbits.wms.core.model.WmsWarehouse;
@QMetaDataProducingEntity(
@@ -73,6 +76,10 @@ public class WmsPurchaseOrder extends QRecordEntity
java.util.List.of("notes")))
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
// Scope dockDoorId choices to the selected warehouseId.
table.getField("dockDoorId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("warehouseId", QCriteriaOperator.EQUALS, "${input.warehouseId}")));
return (table);
}
}
@@ -7,20 +7,49 @@ package com.kingsrook.qbits.wms.receiving.model;
import java.math.BigDecimal;
import java.time.Instant;
import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
import com.kingsrook.qqq.backend.core.model.metadata.producers.annotations.QMetaDataProducingEntity;
import com.kingsrook.qbits.wms.core.enums.PurchaseOrderStatus;
import com.kingsrook.qbits.wms.core.model.WmsItem;
import com.kingsrook.qbits.wms.core.model.WmsUnitOfMeasure;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
import com.kingsrook.qqq.backend.core.model.metadata.producers.MetaDataCustomizerInterface;
import com.kingsrook.qqq.backend.core.model.metadata.producers.annotations.QMetaDataProducingEntity;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
@QMetaDataProducingEntity(producePossibleValueSource = true, produceTableMetaData = true)
@QMetaDataProducingEntity(tableMetaDataCustomizer = WmsPurchaseOrderLine.TableMetaDataCustomizer.class, producePossibleValueSource = true, produceTableMetaData = true)
public class WmsPurchaseOrderLine extends QRecordEntity
{
public static final String TABLE_NAME = "wmsPurchaseOrderLine";
/*******************************************************************************
** Customize dependent choices after entity fields have been produced.
*******************************************************************************/
public static class TableMetaDataCustomizer implements MetaDataCustomizerInterface<QTableMetaData>
{
/***************************************************************************
** Restrict possible values to the current form scope.
***************************************************************************/
@Override
public QTableMetaData customizeMetaData(QInstance qInstance, QTableMetaData table)
{
// Scope uomId choices to the selected itemId.
table.getField("uomId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("itemId", QCriteriaOperator.EQUALS, "${input.itemId}")));
return (table);
}
}
@QField(isEditable = false, isPrimaryKey = true)
private Integer id;
@@ -7,10 +7,6 @@ package com.kingsrook.qbits.wms.receiving.model;
import java.time.Instant;
import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
import com.kingsrook.qqq.backend.core.model.metadata.producers.annotations.QMetaDataProducingEntity;
import com.kingsrook.qbits.wms.core.enums.StorageRequirements;
import com.kingsrook.qbits.wms.core.enums.VelocityClass;
import com.kingsrook.qbits.wms.core.enums.ZoneType;
@@ -18,13 +14,46 @@ import com.kingsrook.qbits.wms.core.model.WmsClient;
import com.kingsrook.qbits.wms.core.model.WmsItemCategory;
import com.kingsrook.qbits.wms.core.model.WmsWarehouse;
import com.kingsrook.qbits.wms.core.model.WmsZone;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
import com.kingsrook.qqq.backend.core.model.metadata.producers.MetaDataCustomizerInterface;
import com.kingsrook.qqq.backend.core.model.metadata.producers.annotations.QMetaDataProducingEntity;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
@QMetaDataProducingEntity(produceTableMetaData = true)
@QMetaDataProducingEntity(tableMetaDataCustomizer = WmsPutawayRule.TableMetaDataCustomizer.class, produceTableMetaData = true)
public class WmsPutawayRule extends QRecordEntity
{
public static final String TABLE_NAME = "wmsPutawayRule";
/*******************************************************************************
** Customize dependent choices after entity fields have been produced.
*******************************************************************************/
public static class TableMetaDataCustomizer implements MetaDataCustomizerInterface<QTableMetaData>
{
/***************************************************************************
** Restrict possible values to the current form scope.
***************************************************************************/
@Override
public QTableMetaData customizeMetaData(QInstance qInstance, QTableMetaData table)
{
// Scope targetZoneId choices to the selected warehouseId.
table.getField("targetZoneId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("warehouseId", QCriteriaOperator.EQUALS, "${input.warehouseId}")));
return (table);
}
}
@QField(isEditable = false, isPrimaryKey = true)
private Integer id;
@@ -6,7 +6,14 @@ package com.kingsrook.qbits.wms.receiving.model;
import java.time.Instant;
import com.kingsrook.qbits.wms.core.enums.ReceiptStatus;
import com.kingsrook.qbits.wms.core.enums.ReceiptType;
import com.kingsrook.qbits.wms.core.model.WmsClient;
import com.kingsrook.qbits.wms.core.model.WmsWarehouse;
import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
@@ -21,10 +28,6 @@ import com.kingsrook.qqq.backend.core.model.metadata.tables.QFieldSection;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
import com.kingsrook.qbits.wms.core.enums.ReceiptStatus;
import com.kingsrook.qbits.wms.core.enums.ReceiptType;
import com.kingsrook.qbits.wms.core.model.WmsClient;
import com.kingsrook.qbits.wms.core.model.WmsWarehouse;
@QMetaDataProducingEntity(
@@ -73,6 +76,11 @@ public class WmsReceipt extends QRecordEntity
java.util.List.of("notes")))
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
// Scope purchaseOrderId choices to the selected warehouseId and clientId.
table.getField("purchaseOrderId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("warehouseId", QCriteriaOperator.EQUALS, "${input.warehouseId}"),
new QFilterCriteria("clientId", QCriteriaOperator.EQUALS, "${input.clientId}")));
return (table);
}
}
@@ -7,23 +7,52 @@ package com.kingsrook.qbits.wms.receiving.model;
import java.time.Instant;
import java.time.LocalDate;
import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
import com.kingsrook.qqq.backend.core.model.metadata.producers.annotations.QMetaDataProducingEntity;
import com.kingsrook.qbits.wms.core.enums.ConditionCode;
import com.kingsrook.qbits.wms.core.enums.QcStatus;
import com.kingsrook.qbits.wms.core.enums.ReceiptStatus;
import com.kingsrook.qbits.wms.core.model.WmsItem;
import com.kingsrook.qbits.wms.core.model.WmsLicensePlate;
import com.kingsrook.qbits.wms.core.model.WmsUnitOfMeasure;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
import com.kingsrook.qqq.backend.core.model.metadata.producers.MetaDataCustomizerInterface;
import com.kingsrook.qqq.backend.core.model.metadata.producers.annotations.QMetaDataProducingEntity;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
@QMetaDataProducingEntity(produceTableMetaData = true)
@QMetaDataProducingEntity(tableMetaDataCustomizer = WmsReceiptLine.TableMetaDataCustomizer.class, produceTableMetaData = true)
public class WmsReceiptLine extends QRecordEntity
{
public static final String TABLE_NAME = "wmsReceiptLine";
/*******************************************************************************
** Customize dependent choices after entity fields have been produced.
*******************************************************************************/
public static class TableMetaDataCustomizer implements MetaDataCustomizerInterface<QTableMetaData>
{
/***************************************************************************
** Restrict possible values to the current form scope.
***************************************************************************/
@Override
public QTableMetaData customizeMetaData(QInstance qInstance, QTableMetaData table)
{
// Scope uomId choices to the selected itemId.
table.getField("uomId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("itemId", QCriteriaOperator.EQUALS, "${input.itemId}")));
return (table);
}
}
@QField(isEditable = false, isPrimaryKey = true)
private Integer id;
@@ -7,7 +7,15 @@ package com.kingsrook.qbits.wms.returns.model;
import java.time.Instant;
import com.kingsrook.qbits.wms.core.enums.ReturnAuthorizationStatus;
import com.kingsrook.qbits.wms.core.enums.ReturnReasonCode;
import com.kingsrook.qbits.wms.core.model.WmsClient;
import com.kingsrook.qbits.wms.core.model.WmsWarehouse;
import com.kingsrook.qbits.wms.fulfillment.model.WmsOrder;
import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
@@ -22,11 +30,6 @@ import com.kingsrook.qqq.backend.core.model.metadata.tables.QFieldSection;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
import com.kingsrook.qbits.wms.core.enums.ReturnAuthorizationStatus;
import com.kingsrook.qbits.wms.core.enums.ReturnReasonCode;
import com.kingsrook.qbits.wms.core.model.WmsClient;
import com.kingsrook.qbits.wms.core.model.WmsWarehouse;
import com.kingsrook.qbits.wms.fulfillment.model.WmsOrder;
@QMetaDataProducingEntity(
@@ -76,6 +79,11 @@ public class WmsReturnAuthorization extends QRecordEntity
java.util.List.of("notes")))
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
// Scope originalOrderId choices to the selected warehouseId and clientId.
table.getField("originalOrderId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("warehouseId", QCriteriaOperator.EQUALS, "${input.warehouseId}"),
new QFilterCriteria("clientId", QCriteriaOperator.EQUALS, "${input.clientId}")));
return (table);
}
}
@@ -7,7 +7,14 @@ package com.kingsrook.qbits.wms.shipping.model;
import java.time.Instant;
import java.time.LocalDate;
import com.kingsrook.qbits.wms.core.enums.DockAppointmentStatus;
import com.kingsrook.qbits.wms.core.enums.DockAppointmentType;
import com.kingsrook.qbits.wms.core.model.WmsLocation;
import com.kingsrook.qbits.wms.core.model.WmsWarehouse;
import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
@@ -19,10 +26,6 @@ import com.kingsrook.qqq.backend.core.model.metadata.tables.QFieldSection;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
import com.kingsrook.qbits.wms.core.enums.DockAppointmentStatus;
import com.kingsrook.qbits.wms.core.enums.DockAppointmentType;
import com.kingsrook.qbits.wms.core.model.WmsLocation;
import com.kingsrook.qbits.wms.core.model.WmsWarehouse;
@QMetaDataProducingEntity(
@@ -60,6 +63,10 @@ public class WmsDockAppointment extends QRecordEntity
java.util.List.of("referenceType", "referenceId", "notes")))
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
// Scope dockDoorId choices to the selected warehouseId.
table.getField("dockDoorId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("warehouseId", QCriteriaOperator.EQUALS, "${input.warehouseId}")));
return (table);
}
}
@@ -9,7 +9,15 @@ package com.kingsrook.qbits.wms.shipping.model;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import com.kingsrook.qbits.wms.core.enums.ShipmentStatus;
import com.kingsrook.qbits.wms.core.enums.ShippingMode;
import com.kingsrook.qbits.wms.core.model.WmsClient;
import com.kingsrook.qbits.wms.core.model.WmsLocation;
import com.kingsrook.qbits.wms.core.model.WmsWarehouse;
import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
@@ -21,11 +29,6 @@ import com.kingsrook.qqq.backend.core.model.metadata.tables.QFieldSection;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
import com.kingsrook.qbits.wms.core.enums.ShipmentStatus;
import com.kingsrook.qbits.wms.core.enums.ShippingMode;
import com.kingsrook.qbits.wms.core.model.WmsClient;
import com.kingsrook.qbits.wms.core.model.WmsLocation;
import com.kingsrook.qbits.wms.core.model.WmsWarehouse;
@QMetaDataProducingEntity(
@@ -66,6 +69,14 @@ public class WmsShipment extends QRecordEntity
java.util.List.of("labelUrl", "commercialInvoiceUrl")))
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
// Scope dockDoorId choices to the selected warehouseId.
table.getField("dockDoorId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("warehouseId", QCriteriaOperator.EQUALS, "${input.warehouseId}")));
// Scope manifestId choices to the selected warehouseId.
table.getField("manifestId").withPossibleValueSourceFilter(new QQueryFilter(
new QFilterCriteria("warehouseId", QCriteriaOperator.EQUALS, "${input.warehouseId}")));
return (table);
}
}
@@ -131,7 +131,7 @@ public class BaseTest
{
QInstance qInstance = new QInstance();
qInstance.setAuthentication(new QAuthenticationMetaData().withType(QAuthenticationType.FULLY_ANONYMOUS));
qInstance.withInstanceDefaultAuthentication(new QAuthenticationMetaData().withType(QAuthenticationType.FULLY_ANONYMOUS));
qInstance.addBackend(new QBackendMetaData()
.withName(BACKEND_NAME)
@@ -0,0 +1,184 @@
/*******************************************************************************
** Metadata and memory-backend regression tests for contingent possible values.
*******************************************************************************/
package com.kingsrook.qbits.wms;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import com.kingsrook.qbits.wms.inventory.processes.CycleCountProcessMetaDataProducer;
import com.kingsrook.qqq.backend.core.actions.values.SearchPossibleValueSourceAction;
import com.kingsrook.qqq.backend.core.context.QContext;
import com.kingsrook.qqq.backend.core.model.actions.tables.insert.InsertInput;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.actions.values.SearchPossibleValueSourceInput;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.possiblevalues.PossibleValueSearchFilterUseCase;
import com.kingsrook.qqq.backend.core.model.metadata.processes.QFrontendStepMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
import com.kingsrook.qqq.backend.core.modules.backend.implementations.memory.MemoryRecordStore;
import com.kingsrook.qqq.backend.core.utils.collections.MapBuilder;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
/*******************************************************************************
** Verify declared dependencies and their behavior through real possible-value searches.
*******************************************************************************/
public class ContingentPossibleValuesTest extends BaseTest
{
/*******************************************************************************
** Verify every dependent field and its referenced table, then search two scopes.
*******************************************************************************/
@ParameterizedTest
@CsvSource({
"wmsLocation,zoneId,warehouseId,warehouseId,,",
"wmsOrderLine,uomId,itemId,itemId,,",
"wmsAsnLine,uomId,itemId,itemId,,",
"wmsPurchaseOrderLine,uomId,itemId,itemId,,",
"wmsReceiptLine,uomId,itemId,itemId,,",
"wmsKitBom,componentUomId,itemId,componentItemId,,",
"wmsKitBom,kitItemId,clientId,clientId,,",
"wmsKitBom,componentItemId,clientId,clientId,,",
"wmsReceipt,purchaseOrderId,warehouseId,warehouseId,clientId,clientId",
"wmsOrder,waveId,warehouseId,warehouseId,,",
"wmsPurchaseOrder,dockDoorId,warehouseId,warehouseId,,",
"wmsDockAppointment,dockDoorId,warehouseId,warehouseId,,",
"wmsShipment,dockDoorId,warehouseId,warehouseId,,",
"wmsShipment,manifestId,warehouseId,warehouseId,,",
"wmsInventory,locationId,warehouseId,warehouseId,,",
"wmsInventory,lpnId,warehouseId,warehouseId,,",
"wmsInventory,itemId,clientId,clientId,,",
"wmsInventoryHold,locationId,warehouseId,warehouseId,,",
"wmsInventoryHold,itemId,clientId,clientId,,",
"wmsLicensePlate,locationId,warehouseId,warehouseId,,",
"wmsReplenishmentRule,pickLocationId,warehouseId,warehouseId,,",
"wmsReplenishmentRule,sourceZoneId,warehouseId,warehouseId,,",
"wmsPutawayRule,targetZoneId,warehouseId,warehouseId,,",
"wmsTask,lpnId,warehouseId,warehouseId,,",
"wmsTask,sourceLocationId,warehouseId,warehouseId,,",
"wmsTask,destinationLocationId,warehouseId,warehouseId,,",
"wmsTask,zoneId,warehouseId,warehouseId,,",
"wmsKitWorkOrder,kitItemId,clientId,clientId,,",
"wmsReturnAuthorization,originalOrderId,warehouseId,warehouseId,clientId,clientId",
"wmsBillingActivity,rateId,activityTypeId,activityTypeId,,"
})
void tableFilters(String tableName, String fieldName, String column, String input, String secondColumn, String secondInput) throws Exception
{
QTableMetaData table = QContext.getQInstance().getTable(tableName);
QFieldMetaData field = table.getField(fieldName);
assertTrue(field.getIsEditable());
assertTrue(table.getField(input).getIsEditable());
assertCriterion(field, 0, column, input);
assertEquals(secondColumn == null ? 1 : 2, field.getPossibleValueSourceFilter().getCriteria().size());
if(secondColumn != null)
{
assertTrue(table.getField(secondInput).getIsEditable());
assertCriterion(field, 1, secondColumn, secondInput);
}
assertSearchScopes(field, column, input, secondColumn, secondInput);
}
/*******************************************************************************
** The process field must carry its own filter, independent of table fields.
*******************************************************************************/
@Test
void cycleCountForm() throws Exception
{
QFrontendStepMetaData step = (QFrontendStepMetaData) QContext.getQInstance()
.getProcess(CycleCountProcessMetaDataProducer.NAME).getStep("selectCountType");
QFieldMetaData field = step.getFormField("zoneId");
assertTrue(step.getFormField("warehouseId").getIsEditable());
assertTrue(field.getIsEditable());
assertCriterion(field, 0, "warehouseId", "warehouseId");
assertEquals(1, field.getPossibleValueSourceFilter().getCriteria().size());
assertSearchScopes(field, "warehouseId", "warehouseId", null, null);
}
/*******************************************************************************
** Validate the expression and the actual column on the possible-value table.
*******************************************************************************/
private void assertCriterion(QFieldMetaData field, int index, String column, String input)
{
assertNotNull(field.getPossibleValueSourceFilter());
QFilterCriteria criterion = field.getPossibleValueSourceFilter().getCriteria().get(index);
assertEquals(column, criterion.getFieldName());
assertEquals(QCriteriaOperator.EQUALS, criterion.getOperator());
assertEquals(List.of("${input." + input + "}"), criterion.getValues());
String target = QContext.getQInstance().getPossibleValueSource(field.getPossibleValueSourceName()).getTableName();
assertNotNull(QContext.getQInstance().getTable(target).getField(column));
}
/*******************************************************************************
** Seed both scopes; paired filters also get rows matching only one criterion.
*******************************************************************************/
private void assertSearchScopes(QFieldMetaData field, String column, String input, String secondColumn, String secondInput) throws Exception
{
String target = QContext.getQInstance().getPossibleValueSource(field.getPossibleValueSourceName()).getTableName();
// Isolate contingent filtering from record-security authorization in this test.
QContext.getQInstance().getTable(target).setRecordSecurityLocks(List.of());
seed(target, 101, column, 1, secondColumn, 1);
seed(target, 102, column, 2, secondColumn, 2);
Map<String, Serializable> values = Map.of(input, 1);
Set<Serializable> all = Set.of(101, 102);
if(secondColumn != null)
{
seed(target, 103, column, 1, secondColumn, 2);
seed(target, 104, column, 2, secondColumn, 1);
values = Map.of(input, 1, secondInput, 1);
all = Set.of(101, 102, 103, 104);
assertEquals(Set.of(), search(field, Map.of(input, 1), PossibleValueSearchFilterUseCase.FORM));
assertEquals(Set.of(), search(field, Map.of(secondInput, 1), PossibleValueSearchFilterUseCase.FORM));
}
assertEquals(Set.of(101), search(field, values, PossibleValueSearchFilterUseCase.FORM));
assertEquals(Set.of(), search(field, Map.of(), PossibleValueSearchFilterUseCase.FORM));
assertEquals(all, search(field, Map.of(), PossibleValueSearchFilterUseCase.FILTER));
assertCriterion(field, 0, column, input);
}
/*******************************************************************************
** Seed the memory backend directly so unrelated required fields do not interfere.
*******************************************************************************/
private void seed(String table, int id, String column, int scope, String secondColumn, int secondScope) throws Exception
{
QRecord record = new QRecord().withTableName(table).withValue("id", id).withValue(column, scope);
if(secondColumn != null)
{
record.setValue(secondColumn, secondScope);
}
MemoryRecordStore.getInstance().insert(new InsertInput(table).withRecord(record), true);
}
/*******************************************************************************
** Interpret a clone exactly as the UI does before invoking the real PVS action.
*******************************************************************************/
private Set<Serializable> search(QFieldMetaData field, Map<String, Serializable> values, PossibleValueSearchFilterUseCase useCase) throws Exception
{
QQueryFilter filter = field.getPossibleValueSourceFilter().clone();
filter.interpretValues(MapBuilder.of("input", values), useCase);
return new SearchPossibleValueSourceAction().execute(new SearchPossibleValueSourceInput()
.withPossibleValueSourceName(field.getPossibleValueSourceName())
.withDefaultQueryFilter(filter))
.getResults().stream().map(value -> (Serializable) value.getId()).collect(Collectors.toSet());
}
}