--- title: "Predefined validation rules" slug: "predefined-validation-rules" tags: ["Concept topic"] updated: 2026-07-28T05:24:12Z published: 2026-07-28T05:24:12Z canonical: "docs.staedean.com/predefined-validation-rules" --- > ## Documentation Index > Fetch the complete documentation index at: https://docs.staedean.com/llms.txt > Use this file to discover all available pages before exploring further. # Predefined validation rules If you use staging journals, you can set up the applicable journal validations. For each staging journal-related table, you can define the applicable validation rules. For several tables, predefined validation rules are standard available. | Table | Validation class | Description | | --- | --- | --- | | BisEdiPurchaseJour | BisCheckBisEdiPurchaseJour | Base validation class. Do not use as validation rule. | | | BisEdiCheckOriginIdPurchase | Checks if a party setup exists for this **VendAccount** and **OriginId**. | | | BisEdiCheckPurchJourDeliveryDate | Checks if the **DeliveryDate** of the **PurchTable** is equal to the **ConfirmedDlv** of the journal header. | | | BisEdiCheckPurchaseDiscPercent | Checks if the discount percentage is equal to the discount percentage of the related purchase order. On the journal validation setup, you can use the validation parameter to allow a small difference. | | | BisEdiCheckPurchPurchId | Checks if the **PurchId** exists in the **PurchTable**. | | | BisEdiCheckVendorExist | Checks if the vendor exists for the purchase order, using the **vendAccount** field. | | | BisEdiCheckVendorDocumentFlowExists | Checks if a document flow is defined for the vendor of to the purchase order. | | BisEdiPurchaseTrans | BisCheckBisEdiPurchaseTrans | Base validation class. Do not use as validation rule. | | | BisEdiCheckPurchaseLineDiscPercent | Checks if the discount percentage is equal to the discount percentage of the related **PurchLine**. On the journal validation setup, you can use a parameter to allow a small difference. | | | BisEdiCheckPurchaseLineDiscAmount | Checks if the discount amount is equal to the discount amount of the related **PurchLine**. On the journal validation setup, you can use the validation parameter to allow a small difference. | | | BisEdiCheckPurchItemEanCode | Checks if the **BarCode** exists in the **InventItemBarcode** table. | | | BisEdiCheckPurchPrice | Checks if the **PurchPrice** is equal to the **PurchPrice** of the related **PurchLine**. The related **PurchLine** is found using the **PurchId** and the **LineNumber**. | | | BisEdiCheckPurchLineAmount | Checks if the **LineAmount** is equal to the **LineAmount** of the related **PurchLine**. The related **PurchLine** is found using the **PurchId** and the **LineNumber**. | | | BisEdiCheckPurchDeliveryDate | Checks if the **DeliveryDate** of the **PurchLine** is equal to the **ConfirmedDlv** of the journal line. | | | BisEdiCheckPurchDeliveryDateUsingLineNum | Checks if the **DeliveryDate** of the **PurchLine** is equal to the **ConfirmedDlv** of the journal line and uses the journal **LineNum** in the validation warning text. | | | BisEdiCheckPurchQty | Checks if the **PurchQty** is equal to the **PurchQty** of the related **PurchLine**. The related **PurchLine** is found using the **PurchId** and the **LineNumber**. | | | BisEDICheckPurchaseLineNumberUsage | Checks if the same purchase line number is used more than once. | | | BisEdiCheckPurchItemId | Checks if the **ItemId** exists in the **InventTable**. | | BisEdiPurchaseArrivalJour | BisEdiCheckPurchArrivalPurchOrderExists | Checks if the purchase order exists. | | | BisEdiCheckPurchaseArrivalPackingSlipExists | Checks if the purchase arrival packing slip number exists. | | | BisEdiCheckPurchaseArrivalVendorExist | Checks if the vendor for the purchase arrival exists. | | | BisEdiCheckPurchaseArrivalVendorDocumentFlowExists | Checks if a document flow is defined for the vendor of to the purchase arrival. | | BisEdiPurchaseArrivalTrans | BisEdiCheckPurchArrivalDeliveryDate | Checks if the purchase order has a line for this item with the same delivery date. | | | BisEdiCheckPurchArrivalExternalItem | Checks if the barcode is linked to the correct internal item definition. It uses the EDI party setup to check the barcode, GTIN, external code, or the standard item. | | | BisEdiCheckPurchArrivalItemId | Checks if the purchase order has a line for the item ID. | | | BisEdiCheckPurchArrivalQty | Checks if the purchase order has a line for the same item ID with the same quantity. | | | BisEdiCheckPurchArrivalUnitConversion | Checks if the original unit can be converted to the purchase order unit. | | | BisEdiCheckPurchArrivalOriginalUnit | Checks if the original unit exists in D365 F&SCM. | | BisEdiSalesJour | BisCheckBisEdiSalesJour | Base validation class. Do not use as validation rule. | | | BisEdiCheckCustomerIsBlocked | Checks if the field **CustTable.Blocked** is '**Yes**'. The customer is found using the **CustAccount** field. | | | BisEdiCheckLinesExist | Checks if the journal has lines. | | | BisEdiCheckOrderAlreadyExist | Checks if **CustomerRref** or the **PurchOrderFormNum** exists in the **SalesTable**. | | | BisEdiCheckOrderAlreadyExistsForCustomer | Checks if the **PurchOrderFormNum** exists in the **SalesTable** for the customer. | | | BisEdiCheckEDIOrderAlreadyExistsForCustomer | Checks if an EDI sales order exists for the same **purchOrderFormNum** and the customer. | | | BisEdiCheckOrderAlreadyExistsForCustomerAndReference | Checks if the **CustomerRef** exists in the **SalesTable** for the customer. | | | BisEdiCheckEDIOrderAlreadyExistsForCustomerAndReference | Checks if another EDI sales order already exists for the **customerRef** and customer. | | | BisEdiCheckOrderDeliveryDate | Checks if the **ReceiptDateRequested** field is in the past. | | | BisEdiCheckOrderWeightLimit | Checks if the sum of the **NetWeight** (**InventTable**) for this journal does not exceed the maximum weight. The maximum weight is defined as a parameter in the validation line. | | | BisEdiCheckOriginIdSales | Checks if a party setup exists for this **CustAccount** and **OriginId**. | | | BisEdiCheckSalesPool | Checks if the **SalesPoolId** exists in the **SalesPool** table. | | | BisEdiCheckWarehouseExist | Checks if the warehouse on the sales order exists in the **InventLocation** table, using the **InventLocationId** field. | | | BisEdiCheckWarehouseDocumentFlowExists | Checks if a document flow is defined for the warehouse of the sales order. | | | BisEdiCheckCustomerExist | Checks if the customer exists for the sales order, using the **CustAccount** field. | | | BisEdiCheckCustomerDocumentFlowExists | Checks if a document flow is defined for the customer of the sales order. | | | BisEdiCheckCustomerClosedOnReceivedDate | Checks if the customer is closed on the requested receipt date as per the customer’s receipt calendar. If a calendar is assigned, a check is done if the requested date is valid. This prevents orders from being scheduled on closed days. | | BisEdiSalesTrans | BisCheckBisEdiSalesTrans | Base validation class. Do not use as validation rule. | | | BisEdiCheckATPItemAvailableQty | Checks the ATP for each EDI sales order line: - Item is determined using the **BarCode** field. If the **BarCode** field is empty, the check uses the **ItemId** field. - Delivery date is determined using the **ReceiptDateRequested** from the line. If the **ReceiptDateRequested** is empty, the check uses the **ReceiptDateRequested** from the header. If the **ReceiptDateRequested** from the header is empty, the current date is used. | | | BisEdiCheckExternalItem | Checks in D365 F&SCM if the external item ID exists for the item. | | | BisEdiCheckItemBarcode | Checks if the **OriginalBarCode** exists. The check uses the item setup from the party setup. | | | BisEdiCheckItemCanBeConverted | Checks if the **UnitId** field can be converted to the unit defined in the **InventTableModule** for sales. | | | BisEdiCheckItemEanCode | Checks if the **BarCode** exists in the **InventItemBarcode** table. | | | BisEdiCheckItemGTIN | Checks if the **BarCode** exists in the **InventItemGTIN** table. | | | BisEdiCheckItemHighestQty | Checks if the **SalesQty** field is less than the **HighestQty** defined in the **InventTableModule** for sales. | | | BisEdiCheckItemId | Checks if the **ItemId** exists in the **InventTable**. | | | BisEdiCheckItemInPricelist | Checks if the **ItemId** exists in the **PriceDiscTable**. | | | BisEdiCheckItemLowestQty | Checks if the **OrderedQty** is greater than the **LowestQty** defined in the **InventTableModule** for sales. | | | BisEdiCheckItemLowestsalesQty | Checks if the **SalesQty** is greater than the **LowestQty** defined in the **InventTableModule** for sales. | | | BisEdiCheckItemMultiplyQty | Checks if the **SalesQty** is less than the **MultipleQty** defined in the **InventTableModule** for sales. | | | BisEdiCheckItemRestrictedForCountry | Checks if the item is restricted for sale to the country of the delivery address. This validation rule uses the **Restricted products** setup as defined for the **Released products**. | | | BisEdiCheckItemStopped | Checks if the **Stopped** field is disabled in the **InventTableModule** for sales. | | | BisEdiCheckLifecycleStatus | Checks the **isActiveForPlanning** property of the product lifecycle. Validation fails when the property is set to **No**. | | | BisEdiCheckSalesInventOnHand | Checks if the inventory on-hand is enough for the sum of the **RemainInventPhysical** per **ItemId** in this journal. | | | BisEdiCheckSalesLinePrice | Checks and calculates the expected sales line amount and compares it with the EDI sales line amount. It checks if the EDI sales line amount is different from the calculated amount. You can allow a difference between the calculated amount and the EDI sales line amount. To do so, on the **Journal validation** setup, in the **Validation parameter** field, define the desired percentage. This percentage indicates the maximum allowed difference between the EDI sales line amount and the calculated amount. > [!NOTE] > Note > > The expected sales line amount is calculated based on the trade agreements or default sales price. | | | BisEdiCheckSalesLinePriceUnitConversion | Checks and calculates the expected sales line amount and compares it with the EDI sales line amount. It checks if the EDI sales line amount is different from the calculated amount, taking into account unit conversions. You can allow a difference between the calculated amount and the EDI sales line amount. To do so, on the **Journal validation** setup, in the **Validation parameter** field, define the desired percentage. This percentage indicates the maximum allowed difference between the EDI sales line amount and the calculated amount. > [!NOTE] > Note > > The expected sales line amount is calculated based on the trade agreements or default sales price. | | | BisEdiCheckSalesPriceLineAmount | Checks if the **LineAmount** is equal to the expected **LineAmount**, considering discounts. | | | BisEdiCheckSalesUnit | Checks if the sales unit exists. | | | BisEdiCheckSalesQuantity | Checks if the **SalesQty** is not 0. | | | BisEdiCheckSalesOriginalSalesUnitConversion | Checks if the original unit can be converted to the sales order unit. | | | BisEdiCheckSalesOriginalSalesUnit | Checks if the original unit exists in D365 F&SCM. | | BisEdiSalesAddresses | BisCheckBisEdiSalesAddresses | Base validation class. Do not use as validation rule. | | | BisEdiCheckAddressEanCode | Checks if the addresses exist, using the field **BisEanCodeId (GLN)**. | | BisEdiInventoryOrderJour | BisCheckBisEdiInventoryOrderJour | Base validation class. Do not use as validation rule. | | | BisEdiCheckPurchPackingSlip | Base validation class. Do not use as validation rule. | | | BisEdiCheckInventoryOrderJourCustHold | Checks if the **CustTable.Blocked** is '**All**', '**Invoice**', or '**Requisition**' for the **OrderType** '**Sales order**'. The check searches the related sales order using the **InventTransRefId** field on the header. | | | BisEdiCheckInventoryOrderJourHasOpenLine | Checks the status and the open lines for the different order types: - Production order: **ProdStatus** is not '**Completed**'. - Purchase order: **PurchStatus** is not '**Invoiced**', **DocumentState** is not '**Confirmed**', and the purchase order line **RemainInventPhysical** is greater than or equal to the **InventQty** from the journal line. - Sales order: **SalesStatus** is not 'Invoiced', and the sales order line **RemainInventPhysical** is greater than or equal to the **InventQty** from the journal line. - Transfer order: **TransferStatus** is not '**Received**', and the transfer order line **QtyRemainReceive** is greater than or equal to the **InventQty** from the journal line. | | | BisEdiCheckInventoryOrderJourHold | This check always returns false to avoid automatically processing the journal. | | | BisEdiCheckInventoryOrderJourPending | Checks if pending journals exist using the **InventTransRefId**, OrderType, and **TransDateTime** field. The journal is pending if the **messageStatus** is '**To be processed**' or '**Error**'. | | | BisEdiCheckInventoryOrderJourPeriodOpen | Checks if an open period exists in the **LedgerFiscalCalendarPeriod**, using the **TransDateTime** field from the journal header. | | | BisEdiCheckInventoryOrderJourQty | Checks if the sum of the **InventQty** is less than the **Qty** in the **InventTrans** table for the current **InventTransId**. This check is only applied if the **ReferenceType** is '**Sales order delivery**', '**Sales order return**', or '**Transfer order shipment**'. | | | BisEdiCheckInventoryOrderJourReqRef | Checks the existence of purchase orders or sales orders: - Checks for a sales order using the **InventTransRefId**, **RequisitionReference**, and **CustAccount**. The **RequisitionReference** is compared to the **PurchOrderFormNum** on the **SalesTable**. - Checks for a purchase order using the **InventTransRefId**, **RequisitionReference**, and **CustAccount**. The **RequisitionReference** is compared to the **VendorRef** field on the **PurchTable**. | | | BisEdiCheckInventoryOrderJourReserveOK | Checks if enough inventory on-hand is available to reserve. This check is only applied to **OrderType** '**Sales order**' or '**Transfer order**' | | | BisEdiCheckInventoryOrderJourTransDate | Checks if the **TransDateTime** is defined and is not in the future. | | | BisEdiCheckInventoryOrderJourTransRefId | Checks if the **InventTransRefId** exists. | | | BisEdiCheckProdStarted | Checks if the **ProdStatus** of the **ProdTable** is '**Started**' or '**Finished**'. | | | BisEdiCheckPurchaseConfirmed | Checks if the **DocumentState** of the **PurchTable** is '**Confirmed**'. | | | BisEdiCheckInventoryOrderWarehouseExists | Checks if the warehouse for the inventory order exists, using the **inventlocationId** field. | | | BisEdiCheckInventoryOrderDocumentFlowExists | Checks if a document flow is defined for the warehouse of the inventory order. | | BisEdiInventoryOrderTrans | BisCheckBisEdiInventoryOrderTrans | Base validation class. Do not use as validation rule. | | | BisEdiCheckInventoryInventtransIdAlreadyReceived | Checks if one purchase receipt was made on this inventory transaction Id. | | | BisEdiCheckInventoryInventTransIdExists | Checks if the current inventory transaction ID exists. | | | BisEdiCheckInventoryOrderItemEanCode | Checks if the **BarCode** exists in the **InventItemBarCode** table. The check is not applied if the **ItemId** field is filled. | | | BisEdiCheckInventoryOrderItemGTIN | Checks if the **BarCode** exists in the **InventItemBarGTIN** table. The check is not applied if the **ItemId** field is filled. | | | BisEdiCheckInventoryOrderTransBatch | Checks if the **InventBatchId** or **EndJob** field exists on the journal line. | | | BisEdiCheckInventoryOrderTransBatchExp | Checks if the **ExpirationDate** (including the **PdsBestBefore** from the **InventTable**) is equal to the **ExpDate** from the **InventBatch** table. | | | BisEdiCheckInventoryOrderTransId | Checks if the **InventTransId** exists for sales or purchase orders. | | | BisEdiCheckInventoryOrderTransInventOK | Checks if the **TransInvent** is OK: - Open transactions for the item and location. - Batch exists for the item. - Batch expiry date is different. - License plate exists. - Physical quantity. - Batch unavailable. | | | BisEdiCheckInventoryOrderTransItemId | Checks if the **ItemId** exists in the **InventTable**. In case of production orders, the **ProdTable** is also used. | | | BisEdiCheckInventoryOrderTransLP | Checks if the **LicensPlateId** is according to the rules. | | | BisEdiCheckInventoryOrderTransLPShipped | Checks if the **TransLPShipped** is OK. | | | BisEdiCheckInventoryOrderTransNoSplitLP | Checks if enough inventory on-hand is available for a specific license plate to avoid splitting the sales or transfer order. | | | BisEdiCheckInventoryOrderTransPurchConfirmed | Checks if the purchase order is confirmed. | | | BisEdiCheckInventoryOrderTransQtyOnHand | Checks if enough inventory on-hand is available for this inventory order journal. | | | BisEdiCheckInventoryOrderTransQtyPositiv | Checks if the **InventQty** is positive. | | | BisEdiCheckInventoryOrderTransTotalQty | Checks if enough inventory on-hand is available for all the journals with **MessageStatus** '**To be processed**'. | | | BisEdiCheckTransferHasShipped | Checks if the **InventQty** is less than the **QtyRemainReceive** on the **InventoryOrderTrans**. This check only applies to **InventTransType** '**Transfer order receive**'. | | | BisEdiCheckWMSJournal | Checks if a **WMSJournalTrans** exists for this **ItemId**, **LicensePlateId**, **InventBatchId**, **InventLocationId**. | | BisEdiTransferOrderJour | BisCheckBisEdiTransferOrderJour | Base validation class. Do not use as validation rule. | | | BisEdiCheckTransferOrderDeliveryDate | Checks if the **InventTransferReceiveDate** deviates from other journals with the same **TransferId**. | | | BisEdiCheckTransferFromLocationExists | Checks if the from warehouse of the transfer order exists, using the **inventlocationFrom** field. | | | BisEdiCheckTransferFromWarehouseDocumentFlowExists | Checks if a document flow is defined for the from warehouse of the transfer order. | | | BisEdiCheckTransferToLocationExists | Checks if the to warehouse of the transfer order exists, using the **inventlocationIdTo** field. | | | BisEdiCheckTransFerToWarehouseDocumentFlowExists | Checks if a document flow is defined for the to warehouse of the transfer order. | | BisEdiTransferOrderTrans | BisCheckBisEdiTransferOrderTrans | Base validation class. Do not use as validation rule. | | | BisEdiCheckTransferLineItemId | Checks if the **ItemId** exists in the **InventTable**. | | | BisEdiCheckTransferLineQty | Checks if the **InventQty** is not **0**. | | BisStagingJournal | BisCheckBisEdiPurchaseTransDelivery | Base validation class. Do not use as validation rule. | | | BisEdiCheckPurchSplitDeliveryDate | Checks if the **ConfirmedDlv** differs from the related records in the **BisEdiPurchaseTransDelivery**. | | | BisEdiCheckPurchSplitDeliveryQty | Checks if the **PurchQty** differs from the related records in the **BisEdiPurchaseTransDelivery**. | | BisEdiPurchaseMarkupTrans | BisCheckBisEdiPurchaseMarkupTrans | Base validation class. Do not use as validation rule. | | | BisEdiCheckPuchaseMarkupCode | Checks if the charges code of the purchase confirmation line exists in the **Charges codes (MarkupTable)** table. | | | BisEdiCheckPuchaseMarkupTaxGroup | Checks if the sales tax group of the purchase confirmation line exists in the **Sales tax groups (TaxGroup)** table. | | | BisEdiCheckPuchaseMarkupTaxItemGroup | Checks if the tax item group of the purchase confirmation line exists in the **Item sales tax groups (TaxItemGroup)** table. | | BisEdiSalesMarkupTrans | BisCheckBisEdiSalesMarkupTrans | Base validation class. Do not use as validation rule. | | | BisEdiCheckSalesMarkupCode | Checks if the charges code of the sales order line exists in the **Charges codes (MarkupTable)** table. | | | BisEdiCheckSalesMarkupTaxGroup | Checks if the sales tax group of the sales order line exists in the **Sales tax groups (TaxGroup)** table. | | | BisEdiCheckSalesMarkupTaxItemGroup | Checks if the tax item group of the sales order line exists in the **Item sales tax groups (TaxItemGroup)** table. | | BisEdiTransportTenderJour | BisCheckEdiTmsTransTenderBase | Base validation class for the BisEdiTransportTenderJour table. Do not use as validation rule. | | | BisEdiCheckTransportTenderLoadNumberExists | Checks if the transportation order number exists. | | | BisCheckTransportTenderConfirmedPickupDateLowerLimit | Checks if the confirmed pickup date, not the datetime, is before the requested pickup date. Use the parameter to define the maximum allowed difference in days. If no parameter is used the date must match. | | | BisCheckTransportTenderConfirmedPickUpDateUpperLimit | Checks if the confirmed pickup date, not the datetime, is later then the requested pickup date. It only compares the date. Use the parameter to define the maximum allowed difference in days. If no parameter is used the date must match. | | | BisCheckTransportTenderConfirmedRate | Compares the confirmed rate against the requested rate of the original tender. It fails if the rate is less then the original rate. If no parameter is used the rates must match. | | | BisCheckediTransportTenderCarrierExists | Checks if the shipping carrier exists. | | | BisCheckEdiTransportTenderReferenceExists | Checks if the EDI reference ID exists in the Transportation tender info table. | | | BisEdiCheckTransportTenderLoadIdExists | Checks if the load ID exists. | ## Related - [Set up validation rules - EDI Studio](/set-up-validation-rules.md)