Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
30565f9381
|
||
|
|
80b623ac45
|
||
|
|
39477b2602
|
||
|
|
a498b02651
|
||
|
|
47ba2ff3b7
|
||
|
|
9bb90f468d | ||
|
|
02dc55d826
|
||
|
|
bb3ffc01a8
|
||
|
|
278c357e28
|
||
|
|
9f07db4990 | ||
|
|
9e90307aa3
|
||
|
|
ca02700a2f
|
||
|
|
f2f59a0aaf
|
||
|
|
ac1144b87e
|
||
|
|
7a0bb719cf
|
||
|
|
5e9d3b697c
|
||
|
|
fabe5e13ed | ||
|
|
6969ededc1 | ||
|
|
5f8b7e901b | ||
|
|
a45f015eeb | ||
|
|
0a91e27ce8 | ||
|
|
df1608eb6f | ||
|
|
72430fd030 | ||
|
|
6ed2716042 | ||
|
|
5c3d4e6e7f | ||
|
|
cd64b09ed9 | ||
|
|
40f45596df
|
||
|
|
82907e0cd2 | ||
|
|
fb2496aac5
|
||
|
|
a9b7becc4b | ||
|
|
758c39c727
|
||
|
|
bd4f0cda93 | ||
|
|
1e96e15d3e
|
||
|
|
335e36fad5 | ||
|
|
761d2364d7 | ||
|
|
7a36c6120e | ||
|
|
f8c2551489 |
No files matched your search
@@ -11,4 +11,4 @@ workflows:
|
|||||||
branches:
|
branches:
|
||||||
ignore: automation/qbit-rc-pending
|
ignore: automation/qbit-rc-pending
|
||||||
tags:
|
tags:
|
||||||
only: /v.*/
|
only: /^v\d+\.\d+\.\d+$/
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
name: build
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
jobs:
|
||||||
|
maven:
|
||||||
|
uses: self:KofTwentyTwo/ci-workflows/.gitea/workflows/maven.yaml@v1
|
||||||
|
secrets: inherit
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
# Standard QRun release caller (v2, thin contract): every push and manual dispatch delegates to the protected qrun-release-v1 channel. Do not edit per repository.
|
|
||||||
name: qrun-release
|
|
||||||
on:
|
|
||||||
push: {}
|
|
||||||
workflow_dispatch: {}
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
actions: read
|
|
||||||
jobs:
|
|
||||||
release:
|
|
||||||
uses: self:KofTwentyTwo/platform-ci/.gitea/workflows/java-maven.yaml@qrun-release-v1
|
|
||||||
with:
|
|
||||||
runner: linux-small
|
|
||||||
browsers: true
|
|
||||||
browser-runner: browser-build
|
|
||||||
postpublish:
|
|
||||||
if: ${{ needs.release.outputs.capture == 'true' }}
|
|
||||||
needs: release
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
actions: write
|
|
||||||
uses: self:KofTwentyTwo/platform-ci/.gitea/workflows/qrun-source-version.yaml@qrun-release-v1
|
|
||||||
with:
|
|
||||||
runner: linux-small
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
* @KofTwentyTwo
|
||||||
@@ -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
|
||||||
+4
-4
@@ -5,12 +5,12 @@ java_version: '21'
|
|||||||
browsers: true
|
browsers: true
|
||||||
api_checks: false
|
api_checks: false
|
||||||
docs_only: false
|
docs_only: false
|
||||||
release_on_main: true
|
release_on_main: false
|
||||||
release_tag_policy: v-prefix
|
release_tag_policy: stable
|
||||||
test_branch_policy: feature-no-hotfix
|
test_branch_policy: non-release
|
||||||
publish:
|
publish:
|
||||||
snapshot: true
|
snapshot: true
|
||||||
release_candidate: true
|
release_candidate: true
|
||||||
release: true
|
release: true
|
||||||
hotfix: true
|
|
||||||
asciidoc: false
|
asciidoc: false
|
||||||
|
release_completion: true
|
||||||
@@ -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).
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.kingsrook</groupId>
|
<groupId>com.kingsrook</groupId>
|
||||||
<artifactId>qbit-build-parent</artifactId>
|
<artifactId>qbit-build-parent</artifactId>
|
||||||
<version>1.4.0</version>
|
<version>2.2.1</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<groupId>com.kingsrook.qbits</groupId>
|
<groupId>com.kingsrook.qbits</groupId>
|
||||||
@@ -28,10 +28,35 @@
|
|||||||
</licenses>
|
</licenses>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<revision>0.1.1</revision>
|
<revision>0.2.0-SNAPSHOT</revision>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<qqq.version>4.1.0-RC.26</qqq.version>
|
||||||
</properties>
|
</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>
|
<dependencies>
|
||||||
<!-- QQQ Backend Core -->
|
<!-- QQQ Backend Core -->
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@@ -7,7 +7,14 @@ package com.kingsrook.qbits.wms.advanced.model;
|
|||||||
|
|
||||||
|
|
||||||
import java.time.Instant;
|
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.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.QField;
|
||||||
import com.kingsrook.qqq.backend.core.model.data.QRecord;
|
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.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.QTableMetaData;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
|
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
|
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(
|
@QMetaDataProducingEntity(
|
||||||
@@ -59,6 +62,14 @@ public class WmsReplenishmentRule extends QRecordEntity
|
|||||||
java.util.List.of("sourceZoneId")))
|
java.util.List.of("sourceZoneId")))
|
||||||
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
|
.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);
|
return (table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,21 +7,50 @@ package com.kingsrook.qbits.wms.billing.model;
|
|||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.Instant;
|
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.enums.BillingActivityType;
|
||||||
import com.kingsrook.qbits.wms.core.model.WmsClient;
|
import com.kingsrook.qbits.wms.core.model.WmsClient;
|
||||||
import com.kingsrook.qbits.wms.core.model.WmsTask;
|
import com.kingsrook.qbits.wms.core.model.WmsTask;
|
||||||
import com.kingsrook.qbits.wms.core.model.WmsWarehouse;
|
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 class WmsBillingActivity extends QRecordEntity
|
||||||
{
|
{
|
||||||
public static final String TABLE_NAME = "wmsBillingActivity";
|
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)
|
@QField(isEditable = false, isPrimaryKey = true)
|
||||||
private Integer id;
|
private Integer id;
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,11 @@ package com.kingsrook.qbits.wms.core.model;
|
|||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.LocalDate;
|
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.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.QField;
|
||||||
import com.kingsrook.qqq.backend.core.model.data.QRecord;
|
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.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.MetaDataCustomizerInterface;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.producers.annotations.QMetaDataProducingEntity;
|
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.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.QTableMetaData;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
|
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(
|
@QMetaDataProducingEntity(
|
||||||
@@ -59,6 +62,18 @@ public class WmsInventory extends QRecordEntity
|
|||||||
java.util.List.of("holdReason", "lastCountDate")))
|
java.util.List.of("holdReason", "lastCountDate")))
|
||||||
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
|
.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);
|
return (table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,18 +5,51 @@ package com.kingsrook.qbits.wms.core.model;
|
|||||||
|
|
||||||
|
|
||||||
import java.time.Instant;
|
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.QField;
|
||||||
import com.kingsrook.qqq.backend.core.model.data.QRecord;
|
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.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.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 class WmsInventoryHold extends QRecordEntity
|
||||||
{
|
{
|
||||||
public static final String TABLE_NAME = "wmsInventoryHold";
|
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)
|
@QField(isEditable = false, isPrimaryKey = true)
|
||||||
private Integer id;
|
private Integer id;
|
||||||
|
|
||||||
|
|||||||
@@ -5,18 +5,47 @@ package com.kingsrook.qbits.wms.core.model;
|
|||||||
|
|
||||||
|
|
||||||
import java.time.Instant;
|
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.QField;
|
||||||
import com.kingsrook.qqq.backend.core.model.data.QRecord;
|
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.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.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 class WmsLicensePlate extends QRecordEntity
|
||||||
{
|
{
|
||||||
public static final String TABLE_NAME = "wmsLicensePlate";
|
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)
|
@QField(isEditable = false, isPrimaryKey = true)
|
||||||
private Integer id;
|
private Integer id;
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,11 @@ package com.kingsrook.qbits.wms.core.model;
|
|||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.Instant;
|
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.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.QField;
|
||||||
import com.kingsrook.qqq.backend.core.model.data.QRecord;
|
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.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.MetaDataCustomizerInterface;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.producers.annotations.QMetaDataProducingEntity;
|
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.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.QTableMetaData;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
|
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(
|
@QMetaDataProducingEntity(
|
||||||
@@ -54,6 +57,10 @@ public class WmsLocation extends QRecordEntity
|
|||||||
java.util.List.of("maxWeightLbs", "maxVolumeCubicFt", "currentWeightLbs", "currentVolumeCubicFt", "isMixedSkuAllowed")))
|
java.util.List.of("maxWeightLbs", "maxVolumeCubicFt", "currentWeightLbs", "currentVolumeCubicFt", "isMixedSkuAllowed")))
|
||||||
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
|
.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);
|
return (table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,13 @@ package com.kingsrook.qbits.wms.core.model;
|
|||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.Instant;
|
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.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.QField;
|
||||||
import com.kingsrook.qqq.backend.core.model.data.QRecord;
|
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.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.MetaDataCustomizerInterface;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.producers.annotations.QMetaDataProducingEntity;
|
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.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.QTableMetaData;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
|
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
|
||||||
import com.kingsrook.qbits.wms.core.enums.EquipmentType;
|
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
|
||||||
import com.kingsrook.qbits.wms.core.enums.TaskStatus;
|
|
||||||
import com.kingsrook.qbits.wms.core.enums.TaskType;
|
|
||||||
|
|
||||||
|
|
||||||
@QMetaDataProducingEntity(
|
@QMetaDataProducingEntity(
|
||||||
@@ -67,6 +70,22 @@ public class WmsTask extends QRecordEntity
|
|||||||
java.util.List.of("notes", "shortReason")))
|
java.util.List.of("notes", "shortReason")))
|
||||||
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
|
.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);
|
return (table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,13 @@ package com.kingsrook.qbits.wms.fulfillment.model;
|
|||||||
|
|
||||||
|
|
||||||
import java.time.Instant;
|
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.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.QField;
|
||||||
import com.kingsrook.qqq.backend.core.model.data.QRecord;
|
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.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.QTableMetaData;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
|
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
|
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(
|
@QMetaDataProducingEntity(
|
||||||
@@ -54,6 +57,18 @@ public class WmsKitBom extends QRecordEntity
|
|||||||
java.util.List.of("componentUomId", "clientId")))
|
java.util.List.of("componentUomId", "clientId")))
|
||||||
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
|
.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);
|
return (table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,15 @@ package com.kingsrook.qbits.wms.fulfillment.model;
|
|||||||
|
|
||||||
|
|
||||||
import java.time.Instant;
|
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.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.QField;
|
||||||
import com.kingsrook.qqq.backend.core.model.data.QRecord;
|
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.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.QTableMetaData;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
|
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
|
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(
|
@QMetaDataProducingEntity(
|
||||||
@@ -57,6 +60,10 @@ public class WmsKitWorkOrder extends QRecordEntity
|
|||||||
java.util.List.of("warehouseId", "clientId", "assignedTo", "completedDate")))
|
java.util.List.of("warehouseId", "clientId", "assignedTo", "completedDate")))
|
||||||
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
|
.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);
|
return (table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,13 @@ package com.kingsrook.qbits.wms.fulfillment.model;
|
|||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.Instant;
|
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.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.QField;
|
||||||
import com.kingsrook.qqq.backend.core.model.data.QRecord;
|
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.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.QTableMetaData;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
|
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
|
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(
|
@QMetaDataProducingEntity(
|
||||||
@@ -75,6 +78,10 @@ public class WmsOrder extends QRecordEntity
|
|||||||
"totalLineCount", "totalUnitCount", "orderValue", "specialInstructions")))
|
"totalLineCount", "totalUnitCount", "orderValue", "specialInstructions")))
|
||||||
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
|
.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);
|
return (table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,13 @@ package com.kingsrook.qbits.wms.fulfillment.model;
|
|||||||
|
|
||||||
|
|
||||||
import java.time.Instant;
|
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.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.QField;
|
||||||
import com.kingsrook.qqq.backend.core.model.data.QRecord;
|
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.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.QTableMetaData;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
|
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
|
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(
|
@QMetaDataProducingEntity(
|
||||||
@@ -57,6 +60,10 @@ public class WmsOrderLine extends QRecordEntity
|
|||||||
java.util.List.of("uomId", "lotPreference")))
|
java.util.List.of("uomId", "lotPreference")))
|
||||||
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
|
.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);
|
return (table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-5
@@ -6,7 +6,14 @@
|
|||||||
package com.kingsrook.qbits.wms.inventory.processes;
|
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.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.MetaDataProducerInterface;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
|
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference;
|
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.QFrontendComponentMetaData;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.processes.QFrontendStepMetaData;
|
import com.kingsrook.qqq.backend.core.model.metadata.processes.QFrontendStepMetaData;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.processes.QProcessMetaData;
|
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>
|
public class CycleCountProcessMetaDataProducer implements MetaDataProducerInterface<QProcessMetaData>
|
||||||
@@ -51,7 +54,9 @@ public class CycleCountProcessMetaDataProducer implements MetaDataProducerInterf
|
|||||||
.withComponent(new QFrontendComponentMetaData().withType(QComponentType.EDIT_FORM))
|
.withComponent(new QFrontendComponentMetaData().withType(QComponentType.EDIT_FORM))
|
||||||
.withFormField(new QFieldMetaData("warehouseId", QFieldType.INTEGER).withLabel("Warehouse").withPossibleValueSourceName(WmsWarehouse.TABLE_NAME).withIsRequired(true))
|
.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("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")))
|
.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.Instant;
|
||||||
import java.time.LocalDate;
|
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.QField;
|
||||||
import com.kingsrook.qqq.backend.core.model.data.QRecord;
|
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.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.producers.annotations.QMetaDataProducingEntity;
|
||||||
import com.kingsrook.qbits.wms.core.model.WmsItem;
|
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
|
||||||
import com.kingsrook.qbits.wms.core.model.WmsUnitOfMeasure;
|
|
||||||
|
|
||||||
|
|
||||||
@QMetaDataProducingEntity(produceTableMetaData = true)
|
@QMetaDataProducingEntity(tableMetaDataCustomizer = WmsAsnLine.TableMetaDataCustomizer.class, produceTableMetaData = true)
|
||||||
public class WmsAsnLine extends QRecordEntity
|
public class WmsAsnLine extends QRecordEntity
|
||||||
{
|
{
|
||||||
public static final String TABLE_NAME = "wmsAsnLine";
|
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)
|
@QField(isEditable = false, isPrimaryKey = true)
|
||||||
private Integer id;
|
private Integer id;
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,15 @@ package com.kingsrook.qbits.wms.receiving.model;
|
|||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.LocalDate;
|
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.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.QField;
|
||||||
import com.kingsrook.qqq.backend.core.model.data.QRecord;
|
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.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.QTableMetaData;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
|
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
|
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(
|
@QMetaDataProducingEntity(
|
||||||
@@ -73,6 +76,10 @@ public class WmsPurchaseOrder extends QRecordEntity
|
|||||||
java.util.List.of("notes")))
|
java.util.List.of("notes")))
|
||||||
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
|
.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);
|
return (table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,20 +7,49 @@ package com.kingsrook.qbits.wms.receiving.model;
|
|||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.Instant;
|
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.enums.PurchaseOrderStatus;
|
||||||
import com.kingsrook.qbits.wms.core.model.WmsItem;
|
import com.kingsrook.qbits.wms.core.model.WmsItem;
|
||||||
import com.kingsrook.qbits.wms.core.model.WmsUnitOfMeasure;
|
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 class WmsPurchaseOrderLine extends QRecordEntity
|
||||||
{
|
{
|
||||||
public static final String TABLE_NAME = "wmsPurchaseOrderLine";
|
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)
|
@QField(isEditable = false, isPrimaryKey = true)
|
||||||
private Integer id;
|
private Integer id;
|
||||||
|
|
||||||
|
|||||||
@@ -7,10 +7,6 @@ package com.kingsrook.qbits.wms.receiving.model;
|
|||||||
|
|
||||||
|
|
||||||
import java.time.Instant;
|
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.StorageRequirements;
|
||||||
import com.kingsrook.qbits.wms.core.enums.VelocityClass;
|
import com.kingsrook.qbits.wms.core.enums.VelocityClass;
|
||||||
import com.kingsrook.qbits.wms.core.enums.ZoneType;
|
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.WmsItemCategory;
|
||||||
import com.kingsrook.qbits.wms.core.model.WmsWarehouse;
|
import com.kingsrook.qbits.wms.core.model.WmsWarehouse;
|
||||||
import com.kingsrook.qbits.wms.core.model.WmsZone;
|
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 class WmsPutawayRule extends QRecordEntity
|
||||||
{
|
{
|
||||||
public static final String TABLE_NAME = "wmsPutawayRule";
|
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)
|
@QField(isEditable = false, isPrimaryKey = true)
|
||||||
private Integer id;
|
private Integer id;
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,14 @@ package com.kingsrook.qbits.wms.receiving.model;
|
|||||||
|
|
||||||
|
|
||||||
import java.time.Instant;
|
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.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.QField;
|
||||||
import com.kingsrook.qqq.backend.core.model.data.QRecord;
|
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.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.QTableMetaData;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
|
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
|
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(
|
@QMetaDataProducingEntity(
|
||||||
@@ -73,6 +76,11 @@ public class WmsReceipt extends QRecordEntity
|
|||||||
java.util.List.of("notes")))
|
java.util.List.of("notes")))
|
||||||
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
|
.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);
|
return (table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,23 +7,52 @@ package com.kingsrook.qbits.wms.receiving.model;
|
|||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.LocalDate;
|
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.ConditionCode;
|
||||||
import com.kingsrook.qbits.wms.core.enums.QcStatus;
|
import com.kingsrook.qbits.wms.core.enums.QcStatus;
|
||||||
import com.kingsrook.qbits.wms.core.enums.ReceiptStatus;
|
import com.kingsrook.qbits.wms.core.enums.ReceiptStatus;
|
||||||
import com.kingsrook.qbits.wms.core.model.WmsItem;
|
import com.kingsrook.qbits.wms.core.model.WmsItem;
|
||||||
import com.kingsrook.qbits.wms.core.model.WmsLicensePlate;
|
import com.kingsrook.qbits.wms.core.model.WmsLicensePlate;
|
||||||
import com.kingsrook.qbits.wms.core.model.WmsUnitOfMeasure;
|
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 class WmsReceiptLine extends QRecordEntity
|
||||||
{
|
{
|
||||||
public static final String TABLE_NAME = "wmsReceiptLine";
|
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)
|
@QField(isEditable = false, isPrimaryKey = true)
|
||||||
private Integer id;
|
private Integer id;
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,15 @@ package com.kingsrook.qbits.wms.returns.model;
|
|||||||
|
|
||||||
|
|
||||||
import java.time.Instant;
|
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.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.QField;
|
||||||
import com.kingsrook.qqq.backend.core.model.data.QRecord;
|
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.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.QTableMetaData;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
|
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
|
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(
|
@QMetaDataProducingEntity(
|
||||||
@@ -76,6 +79,11 @@ public class WmsReturnAuthorization extends QRecordEntity
|
|||||||
java.util.List.of("notes")))
|
java.util.List.of("notes")))
|
||||||
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
|
.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);
|
return (table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,14 @@ package com.kingsrook.qbits.wms.shipping.model;
|
|||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.LocalDate;
|
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.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.QField;
|
||||||
import com.kingsrook.qqq.backend.core.model.data.QRecord;
|
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.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.QTableMetaData;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
|
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
|
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(
|
@QMetaDataProducingEntity(
|
||||||
@@ -60,6 +63,10 @@ public class WmsDockAppointment extends QRecordEntity
|
|||||||
java.util.List.of("referenceType", "referenceId", "notes")))
|
java.util.List.of("referenceType", "referenceId", "notes")))
|
||||||
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
|
.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);
|
return (table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,15 @@ package com.kingsrook.qbits.wms.shipping.model;
|
|||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.LocalDate;
|
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.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.QField;
|
||||||
import com.kingsrook.qqq.backend.core.model.data.QRecord;
|
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.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.QTableMetaData;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
|
import com.kingsrook.qqq.backend.core.model.metadata.tables.SectionFactory;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.tables.Tier;
|
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(
|
@QMetaDataProducingEntity(
|
||||||
@@ -66,6 +69,14 @@ public class WmsShipment extends QRecordEntity
|
|||||||
java.util.List.of("labelUrl", "commercialInvoiceUrl")))
|
java.util.List.of("labelUrl", "commercialInvoiceUrl")))
|
||||||
.withSection(SectionFactory.defaultT3("createDate", "modifyDate"));
|
.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);
|
return (table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ public class BaseTest
|
|||||||
{
|
{
|
||||||
QInstance qInstance = new QInstance();
|
QInstance qInstance = new QInstance();
|
||||||
|
|
||||||
qInstance.setAuthentication(new QAuthenticationMetaData().withType(QAuthenticationType.FULLY_ANONYMOUS));
|
qInstance.withInstanceDefaultAuthentication(new QAuthenticationMetaData().withType(QAuthenticationType.FULLY_ANONYMOUS));
|
||||||
|
|
||||||
qInstance.addBackend(new QBackendMetaData()
|
qInstance.addBackend(new QBackendMetaData()
|
||||||
.withName(BACKEND_NAME)
|
.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());
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user