Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/CodexaCP/DG_APK/llms.txt

Use this file to discover all available pages before exploring further.

The Dragon Guard Handheld client communicates with the Dragon Guard backend API exclusively through plain C# POCOs decorated with System.Text.Json attributes. These data transfer objects (DTOs) are the authoritative contract between the .NET MAUI Android client and the server: no business logic, no EF navigation properties — only the exact fields the API sends or expects. This reference documents every DTO grouped by functional domain so you can quickly locate any model used in authentication flows, item inquiries, warehouse operations, RFID scanning, or shared utility wrappers.

Authentication Models

Authentication DTOs handle login, session state, company access, and new-user registration flows.

AuthLoginRequestDto

Submitted to the login endpoint to initiate a session.
namespace Handheld.Models;

public class AuthLoginRequestDto
{
    public string Email { get; set; } = string.Empty;
    public string Password { get; set; } = string.Empty;
    public string? DeviceId { get; set; }
    public string? DeviceName { get; set; }
    public bool IsHandheld { get; set; }
}
Email
string
required
The user’s email address used as the login identifier. Maps to the username concept in the backend identity system.
Password
string
required
The user’s plain-text password. Transmitted over HTTPS and never stored on-device after the request completes.
DeviceId
string | null
Optional hardware or OS-generated device identifier. Used by the backend to associate the session with a registered handheld device for RFID profile resolution.
DeviceName
string | null
Optional human-readable device name (e.g., "HANDHELD-03"). Displayed in the admin console alongside the active session.
IsHandheld
bool
required
Must be true for all Dragon Guard Handheld client requests. Signals the backend to apply handheld-specific policies and to return the Companies list in the response.

AuthSessionResponseDto

Returned by the login endpoint on a successful authentication. Contains the bearer token and the list of companies the user may access.
namespace Handheld.Models;

public class AuthSessionResponseDto
{
    public string Token { get; set; } = string.Empty;
    public Guid UserId { get; set; }
    public string Email { get; set; } = string.Empty;
    public string FullName { get; set; } = string.Empty;
    public List<AuthCompanyAccessDto> Companies { get; set; } = new();
}
Token
string
The JWT bearer token to attach as Authorization: Bearer <token> on all subsequent API requests. The handheld stores this in secure local storage.
UserId
Guid
Unique identifier of the authenticated user record in the backend.
Email
string
The authenticated user’s email address, echoed back for display and local caching purposes.
FullName
string
The user’s display name shown in the handheld UI header and audit trails.
Companies
List<AuthCompanyAccessDto>
All tenant companies the user is authorized to access, each entry carrying the company identifier and the user’s role within that company.

AuthCompanyAccessDto

Minimal company-access record embedded inside AuthSessionResponseDto.Companies.
namespace Handheld.Models;

public class AuthCompanyAccessDto
{
    public Guid CompanyId { get; set; }
    public string RoleCode { get; set; } = string.Empty;
}
CompanyId
Guid
The tenant company’s unique identifier. Passed as a route or query parameter in every company-scoped API call.
RoleCode
string
Role assigned to this user in this company. Common values: "OPERATOR", "SUPERVISOR", "ADMIN".

AuthRegistrationOptionsDto

Returned by the registration options endpoint to populate the company-selection picker shown during new-user self-registration.
namespace Handheld.Models;

public class AuthRegistrationOptionsDto
{
    public List<AuthRegistrationCompanyDto> Companies { get; set; } = new();
    public string DefaultRoleCode { get; set; } = "OPERATOR";
}
Companies
List<AuthRegistrationCompanyDto>
The list of companies available for self-registration. Displayed in the handheld picker so a new user can choose which tenant to join.
DefaultRoleCode
string
The role code that will be assigned to newly registered users if the backend does not override it. Defaults to "OPERATOR".

AuthRegistrationCompanyDto

A single company entry within AuthRegistrationOptionsDto.Companies.
namespace Handheld.Models;

public class AuthRegistrationCompanyDto
{
    public Guid Id { get; set; }
    public string Code { get; set; } = string.Empty;
    public string Name { get; set; } = string.Empty;

    public override string ToString() => Name;
}
Id
Guid
The company’s unique identifier. Used as CompanyId when submitting the registration request.
Code
string
Short alphanumeric company code displayed alongside the full name.
Name
string
Human-readable company name rendered in the picker. Also returned by ToString() for MAUI binding compatibility.

RegisterUserRequestDto

Posted to the user-registration endpoint when a new operator signs up from the handheld.
namespace Handheld.Models;

public class RegisterUserRequestDto
{
    public string Email { get; set; } = string.Empty;
    public string Password { get; set; } = string.Empty;
    public string FullName { get; set; } = string.Empty;
    public Guid? CompanyId { get; set; }
}
Email
string
required
The new user’s email address. Must be unique across the tenant.
Password
string
required
Plain-text password for the new account. The backend hashes this before storage.
FullName
string
required
The user’s display name shown in the handheld UI and audit logs.
CompanyId
Guid | null
The target tenant company. When null, the backend may assign the user to a default company or require an administrator to complete the assignment.

Item Models

Item DTOs expose product master data, per-bin stock levels, and full item detail for inquiry screens.

ItemInquiryDto

Represents a single item–bin stock record returned by the item inquiry endpoint. Each row describes the item’s attributes alongside the specific bin where stock resides.
namespace Handheld.Models
{
    public class ItemInquiryDto
    {
        public string CompanyId { get; set; }
        public string ItemId { get; set; }
        public string ItemNo { get; set; }
        public string ItemDescription { get; set; }
        public string ItemUOM { get; set; }
        public string ItemType { get; set; }
        public bool ItemIsActive { get; set; }

        public bool IsLotTracked { get; set; }
        public bool IsSerialTracked { get; set; }
        public bool IsExpirationTracked { get; set; }

        public decimal? UnitWeight { get; set; }
        public decimal? UnitVolume { get; set; }

        public string BinId { get; set; }
        public string BinCode { get; set; }
        public string BinDescription { get; set; }
        public string BinType { get; set; }
        public bool BinIsActive { get; set; }

        public bool IsBlocked { get; set; }
        public bool AllowPicking { get; set; }
        public bool AllowPutaway { get; set; }

        public decimal StockQty { get; set; }
    }
}
CompanyId
string
Tenant company identifier that owns this inventory record.
ItemId
string
Internal surrogate key for the item in the backend database.
ItemNo
string
Business-facing item number (SKU). Displayed prominently in all handheld inquiry screens.
ItemDescription
string
Full item description text.
ItemUOM
string
Unit of measure code for this item (e.g., "EA", "CASE", "KG").
ItemType
string
Classification of the item (e.g., "PRODUCT", "SERVICE").
ItemIsActive
bool
Whether the item is active and eligible for warehouse transactions.
IsLotTracked
bool
true if the item requires lot number assignment during receiving and picking.
IsSerialTracked
bool
true if each unit must be assigned a unique serial number.
IsExpirationTracked
bool
true if the item must have an expiration date recorded on each transaction.
UnitWeight
decimal | null
Weight per unit. Used for weight-based quantity validation when applicable.
UnitVolume
decimal | null
Volume per unit. Used for capacity planning.
BinId
string
Surrogate key of the bin where this stock quantity resides.
BinCode
string
Human-readable bin location code (e.g., "A-01-01").
BinDescription
string
Descriptive label for the bin location.
BinType
string
Bin classification code (e.g., "PICK", "BULK", "STAGE").
BinIsActive
bool
Whether the bin is currently active and accepting transactions.
IsBlocked
bool
true if transactions are blocked for this item–bin combination.
AllowPicking
bool
Whether the handheld may present this bin as a pick source for this item.
AllowPutaway
bool
Whether the handheld may suggest this bin as a put-away destination for this item.
StockQty
decimal
Current on-hand quantity for this item at this bin.

ItemSummaryDto

An aggregated stock summary for an item across all bins within a location. Contains the rolled-up total plus the per-bin breakdown.
namespace Handheld.Models;

public class ItemSummaryDto
{
    public string ItemNo { get; set; } = string.Empty;
    public string LocationCode { get; set; } = string.Empty;
    public decimal TotalQty { get; set; }
    public List<ItemInquiryDto> BinQuantities { get; set; } = new();
}
ItemNo
string
The item number (SKU) being summarized.
LocationCode
string
Warehouse location code scoping the summary (e.g., "MAIN", "ZONE-A").
TotalQty
decimal
Sum of StockQty across all bins in the location for this item.
BinQuantities
List<ItemInquiryDto>
Per-bin breakdown rows. Each element is an ItemInquiryDto describing stock at a specific bin. See ItemInquiryDto for field details.

ItemDetailApiDto

Full item master record returned by the item detail endpoint. Includes UOM conversions, tracking flags, quantity positions, and associated images.
namespace Handheld.Models;

public class ItemDetailApiDto
{
    public Guid Id { get; set; }
    public string ItemNo { get; set; } = string.Empty;
    public string? Description { get; set; }
    public string? UOM { get; set; }
    public string? BaseUOM { get; set; }
    public string? SalesUOM { get; set; }
    public string? PurchaseUOM { get; set; }
    public string? Part_No { get; set; }
    public string? Alternative_Code { get; set; }
    public decimal? ConversionFactor { get; set; }
    public bool IsActive { get; set; }
    public string? ItemType { get; set; }
    public string? Barcode { get; set; }
    public string? AltBarcode { get; set; }
    public bool IsLotTracked { get; set; }
    public bool IsSerialTracked { get; set; }
    public bool IsExpirationTracked { get; set; }
    public bool AllowNegativeAvailable { get; set; }
    public decimal? UnitWeight { get; set; }
    public decimal? UnitVolume { get; set; }
    public string? CategoryCode { get; set; }
    public string? Brand { get; set; }
    public string? ABCClass { get; set; }
    public string? AccountingCollection { get; set; }
    public string? BranchCode { get; set; }
    public string? CostingMethod { get; set; }
    public string CreatedBy { get; set; } = string.Empty;
    public DateTime CreatedAt { get; set; }
    public string? UpdatedBy { get; set; }
    public DateTime? UpdatedAt { get; set; }
    public decimal QuantityOnHand { get; set; }
    public decimal QtyOnPurchOrder { get; set; }
    public decimal QtyOnSalesOrder { get; set; }
    public decimal QtyAvailable { get; set; }
    public decimal QtyOnProdOrder { get; set; }
    public bool StockoutWarning { get; set; }
    public List<ItemImageApiDto> Images { get; set; } = new();
}

public class ItemImageApiDto
{
    public Guid Id { get; set; }
    public string Url { get; set; } = string.Empty;
    public bool IsPrimary { get; set; }
}
Id
Guid
Unique backend identifier of the item record.
ItemNo
string
Business-facing item number (SKU).
Description
string | null
Full item description text.
UOM
string | null
Default unit of measure code.
BaseUOM
string | null
Base (inventory) unit of measure used for all stock quantity calculations.
SalesUOM
string | null
Unit of measure used on sales orders.
PurchaseUOM
string | null
Unit of measure used on purchase orders.
Part_No
string | null
Manufacturer or supplier part number.
Alternative_Code
string | null
Secondary item code used for cross-referencing with external systems.
ConversionFactor
decimal | null
Conversion multiplier between the purchase/sales UOM and the base UOM.
IsActive
bool
Whether the item is active and available for warehouse transactions.
ItemType
string | null
Item classification (e.g., "PRODUCT", "SERVICE", "COMPONENT").
Barcode
string | null
Primary barcode (e.g., EAN-13, UPC-A) used for barcode scanning on the handheld.
AltBarcode
string | null
Alternate barcode for items with multiple scannable codes.
IsLotTracked
bool
Requires lot number on all inventory transactions.
IsSerialTracked
bool
Requires a unique serial number per unit on all inventory transactions.
IsExpirationTracked
bool
Requires an expiration date on all inventory transactions.
AllowNegativeAvailable
bool
When true, the system permits QtyAvailable to go below zero for this item.
UnitWeight
decimal | null
Weight per base unit.
UnitVolume
decimal | null
Volume per base unit.
CategoryCode
string | null
Product category classification code.
Brand
string | null
Item brand name.
ABCClass
string | null
ABC inventory classification ("A", "B", or "C").
AccountingCollection
string | null
Accounting or product group assignment for ledger posting rules.
BranchCode
string | null
Branch or division code when the item belongs to a specific organizational unit.
CostingMethod
string | null
Inventory costing method (e.g., "FIFO", "AVERAGE", "STANDARD").
CreatedBy
string
Username or email of the user who created this item record.
CreatedAt
DateTime
UTC timestamp when the item record was created.
UpdatedBy
string | null
Username of the user who last modified this item record.
UpdatedAt
DateTime | null
UTC timestamp of the most recent modification.
QuantityOnHand
decimal
Total quantity physically present in the warehouse across all bins.
QtyOnPurchOrder
decimal
Quantity on open purchase orders (inbound, not yet received).
QtyOnSalesOrder
decimal
Quantity committed to open sales orders (outbound, not yet shipped).
QtyAvailable
decimal
Quantity available to promise: QuantityOnHand − QtyOnSalesOrder + QtyOnPurchOrder (backend formula may vary).
QtyOnProdOrder
decimal
Quantity allocated to open production orders.
StockoutWarning
bool
true when the item’s available quantity has fallen below its reorder threshold.
Images
List<ItemImageApiDto>
Product images associated with this item. The primary image is marked with IsPrimary = true.

ProductInquiryPageDto

Paginated response returned by the product inquiry list endpoint. Extends standard pagination with an aggregated quantity total.
namespace Handheld.Models;

public class ProductInquiryPageDto
{
    [JsonPropertyName("pageNumber")]
    public int PageNumber { get; set; }

    [JsonPropertyName("pageSize")]
    public int PageSize { get; set; }

    [JsonPropertyName("totalRecords")]
    public int TotalRecords { get; set; }

    [JsonPropertyName("totalPages")]
    public int TotalPages { get; set; }

    [JsonPropertyName("totalQuantity")]
    public decimal TotalQuantity { get; set; }

    [JsonPropertyName("quantityLabel")]
    public string QuantityLabel { get; set; } = "Cantidad";

    [JsonPropertyName("items")]
    public List<ProductInquiryRowDto> Items { get; set; } = new();
}
pageNumber
int
The current page number (1-based).
pageSize
int
Number of rows per page.
totalRecords
int
Total number of product rows matching the query across all pages.
totalPages
int
Total page count: ceil(totalRecords / pageSize).
totalQuantity
decimal
Sum of Quantity across all rows matching the query (not just the current page). Displayed in the inquiry screen footer.
quantityLabel
string
Display label for the quantity column / footer, localized by the backend (e.g., "Cantidad", "Quantity").
items
List<ProductInquiryRowDto>
The page’s data rows. See ProductInquiryRowDto for field details.

ProductInquiryRowDto

A single row in the product inquiry result set, representing an item–location–bin stock position.
namespace Handheld.Models;

public class ProductInquiryRowDto
{
    public Guid? Id { get; set; }
    public string ItemNo { get; set; } = string.Empty;
    public string? Description { get; set; }
    public string? AlternateItemNo { get; set; }
    public string? Barcode { get; set; }
    public string? UnitOfMeasure { get; set; }
    public string? SecondaryUnitOfMeasure { get; set; }
    public bool? IsActive { get; set; }
    public bool? AllowNegativeAvailable { get; set; }
    public string? Status { get; set; }
    public string? DefaultLocationCode { get; set; }
    public string? ShelfCode { get; set; }
    public string? LocationCode { get; set; }
    public string? LocationDescription { get; set; }
    public string? BinCode { get; set; }
    public string? BinDescription { get; set; }
    public decimal? Quantity { get; set; }
    public string? QuantityType { get; set; }
    public DateTime? AsOfUtc { get; set; }
}
Id
Guid | null
Optional row identifier. May reference the item record or a ledger entry depending on the query mode.
ItemNo
string
Item number (SKU) for this row.
Description
string | null
Item description text.
AlternateItemNo
string | null
Secondary item number from the item master’s Alternative_Code.
Barcode
string | null
Scannable barcode for this item.
UnitOfMeasure
string | null
Primary unit of measure.
SecondaryUnitOfMeasure
string | null
Secondary UOM when the item has a purchase/sales UOM that differs from the base UOM.
IsActive
bool | null
Item active flag.
AllowNegativeAvailable
bool | null
Whether the item may carry a negative available balance.
Status
string | null
Item status descriptor from the backend (e.g., "Active", "Blocked").
DefaultLocationCode
string | null
The item’s default warehouse location code from the item master.
ShelfCode
string | null
Shelf or zone code within the location.
LocationCode
string | null
Warehouse location code for this stock position.
LocationDescription
string | null
Human-readable location description.
BinCode
string | null
Bin code where the quantity is stored.
BinDescription
string | null
Human-readable bin description.
Quantity
decimal | null
Stock quantity at this item–location–bin position.
QuantityType
string | null
Describes what the quantity represents (e.g., "OnHand", "Available", "Committed").
AsOfUtc
DateTime | null
UTC timestamp when this quantity snapshot was calculated.

Receiving Models

Receiving DTOs represent inbound warehouse receipts — the header document and its individual product lines.

ReceivingHeaderDto

The top-level receipt document returned by the receiving list and detail endpoints. Tracks vendor, location, lifecycle dates, and a three-tier status model.
namespace Handheld.Models;

public class ReceivingHeaderDto
{
    public Guid Id { get; set; }
    public Guid CompanyId { get; set; }
    public string ReceiptNo { get; set; } = string.Empty;
    public string? ExternalDocumentNo { get; set; }
    public string? VendorCode { get; set; }
    public string? VendorName { get; set; }
    public string? LocationCode { get; set; }
    public string Status { get; set; } = string.Empty;
    public string DocumentStatus { get; set; } = string.Empty;
    public string ProcessingStatus { get; set; } = string.Empty;
    public DateTime ReceiptDate { get; set; }
    public DateTime CreatedAt { get; set; }
    public DateTime? PostedAt { get; set; }
    public string CreatedBy { get; set; } = string.Empty;
    public string? PostedBy { get; set; }
}
Id
Guid
Unique identifier of the receiving header record.
CompanyId
Guid
Tenant company that owns this receipt.
ReceiptNo
string
System-generated receipt document number displayed in the handheld list and header.
ExternalDocumentNo
string | null
Vendor or purchase order number from the external ERP or supplier document.
VendorCode
string | null
Supplier/vendor code from the business partner master.
VendorName
string | null
Supplier display name shown on the receipt header card.
LocationCode
string | null
Warehouse location code where goods are being received. The computed DisplayLocationCode falls back to "MAIN" when this is blank.
Status
string
Raw internal status field.
DocumentStatus
string
Document-level lifecycle status (e.g., "Open", "Released", "Posted").
ProcessingStatus
string
Handheld-side processing status (e.g., "Pending", "Partial", "Complete"). When non-empty, takes precedence over DocumentStatus for display via the computed VisibleStatus property.
ReceiptDate
DateTime
The date the receipt is expected or was recorded.
CreatedAt
DateTime
UTC timestamp when the receiving header was created in the system.
PostedAt
DateTime | null
UTC timestamp when the receipt was posted to the ledger. null if not yet posted.
CreatedBy
string
Username of the user who created the receiving header.
PostedBy
string | null
Username of the user who posted the receipt. null if not yet posted.

ReceivingLineDto

A single product line within a receiving header. Tracks expected, received, and posted quantities along with bin assignment.
namespace Handheld.Models;

public class ReceivingLineDto
{
    public Guid Id { get; set; }
    public Guid ReceivingHeaderId { get; set; }
    public Guid CompanyId { get; set; }
    public Guid ItemId { get; set; }
    public Guid? BinId { get; set; }
    public string BinCode { get; set; } = string.Empty;
    public string ItemCode { get; set; } = string.Empty;
    public decimal QuantityExpected { get; set; }
    public decimal QuantityReceived { get; set; }
    public string UOM { get; set; } = string.Empty;
    public DateTime CreatedAt { get; set; }
    public decimal PostedQuantityReceived { get; set; }
    public decimal RemainingQuantity { get; set; }
    public string SuggestedBinCode { get; set; } = "MAIN";
}
Id
Guid
Unique identifier of this receiving line.
ReceivingHeaderId
Guid
Foreign key linking this line to its parent ReceivingHeaderDto.
CompanyId
Guid
Tenant company identifier.
ItemId
Guid
Backend identifier of the item being received on this line.
BinId
Guid | null
Backend identifier of the bin assigned to receive this line. null if not yet assigned.
BinCode
string
Human-readable bin location code.
ItemCode
string
Item number (SKU) for this line.
QuantityExpected
decimal
Quantity ordered / expected on this receipt line (sourced from the purchase order).
QuantityReceived
decimal
Quantity confirmed as received on the handheld in the current session (not yet posted).
UOM
string
Unit of measure for all quantities on this line.
CreatedAt
DateTime
UTC timestamp when this line was created.
PostedQuantityReceived
decimal
Quantity that has already been posted to the inventory ledger from previous sessions.
RemainingQuantity
decimal
Quantity still to be received: QuantityExpected − PostedQuantityReceived. Drives the ShortStatusLabel computed property ("Done" / "Part" / "Pend").
SuggestedBinCode
string
Bin code suggested by the backend as the optimal put-away destination. Defaults to "MAIN".

UpdateReceivingLineDto

Payload posted to the update-line endpoint when the operator confirms a received quantity or changes the bin assignment.
namespace Handheld.Models
{
    public class UpdateReceivingLineDto
    {
        public decimal QuantityReceived { get; set; }
        public Guid? BinId { get; set; }
    }
}
QuantityReceived
decimal
required
The quantity the operator has counted and confirmed as received for this line.
BinId
Guid | null
The bin where the goods were placed. When null, the backend retains the previously assigned bin or uses the suggested bin.

Shipment Models

Shipment DTOs represent outbound warehouse shipments — the header document and its individual pick/ship lines.

ShipmentHeaderDto

The top-level outbound shipment document. Tracks customer, warehouse, planned/actual ship dates, and a three-tier status model.
public class ShipmentHeaderDto
{
    public Guid Id { get; set; }
    public Guid CompanyId { get; set; }
    public string CompanyCode { get; set; } = string.Empty;
    public string ShipmentNo { get; set; } = string.Empty;
    public string? ExternalShipmentNo { get; set; }
    public string ShipmentType { get; set; } = string.Empty;
    public string ShipmentStatus { get; set; } = string.Empty;
    public string DocumentStatus { get; set; } = string.Empty;
    public string ProcessingStatus { get; set; } = string.Empty;
    public string WarehouseCode { get; set; } = string.Empty;
    public string CustomerCode { get; set; } = string.Empty;
    public string CustomerName { get; set; } = string.Empty;
    public DateTime? PlannedShipDate { get; set; }
    public DateTime? ActualShipDate { get; set; }
    public int TotalLines { get; set; }
    public decimal TotalQty { get; set; }
    public bool IsClosed { get; set; }
    public DateTime CreatedAt { get; set; }
}
Id
Guid
Unique identifier of the shipment header.
CompanyId
Guid
Tenant company identifier.
CompanyCode
string
Short company code displayed alongside the shipment in multi-company environments.
ShipmentNo
string
System-generated shipment document number displayed in the handheld shipment list.
ExternalShipmentNo
string | null
Customer reference or external sales order number.
ShipmentType
string
Shipment classification (e.g., "SALES", "TRANSFER", "RETURN").
ShipmentStatus
string
Domain-specific shipment status (e.g., "Pending", "Picking", "Shipped").
DocumentStatus
string
Document-level lifecycle status (e.g., "Open", "Released", "Posted").
ProcessingStatus
string
Handheld-side processing status. When non-empty, takes precedence over DocumentStatus for display via VisibleStatus.
WarehouseCode
string
Originating warehouse location code. The computed LocationCode falls back to "MAIN" when empty.
CustomerCode
string
Customer/business partner code from the master data.
CustomerName
string
Customer display name shown on the shipment card.
PlannedShipDate
DateTime | null
Scheduled ship date from the sales order.
ActualShipDate
DateTime | null
Date the shipment was physically dispatched. null until the shipment is confirmed.
TotalLines
int
Total number of shipment lines on this document.
TotalQty
decimal
Sum of ordered quantities across all lines.
IsClosed
bool
true when the shipment has been fully processed and closed against further changes.
CreatedAt
DateTime
UTC timestamp when the shipment header was created.

ShipmentLineDto

A single product line within a shipment. Implements INotifyPropertyChanged so the MAUI binding layer updates in real time when ShippedQty changes.
namespace Handheld.Models
{
    public class ShipmentLineDto : INotifyPropertyChanged
    {
        public string CompanyId { get; set; }
        public string ShipmentId { get; set; }
        public string Id { get; set; }
        public int LineNo { get; set; }
        public string LineStatus { get; set; }
        public string ItemId { get; set; }
        public string ItemNo { get; set; }
        public string ItemDescription { get; set; }
        public string UnitOfMeasure { get; set; }
        public string WarehouseId { get; set; }
        public string BinId { get; set; }
        public string BinCode { get; set; }
        public decimal OrderedQty { get; set; }
        public decimal PickedQty { get; set; }
        public decimal ShippedQty { get; set; }   // clamped 0…OrderedQty
        public decimal? BaseUomQty { get; set; }
        public decimal RemainingQty { get; set; }
        public decimal RemainingQuantity { get; set; }
        public string LotNo { get; set; }
        public string SerialNo { get; set; }
        public DateTime? ExpirationDate { get; set; }
        public decimal? UnitWeight { get; set; }
        public decimal? UnitVolume { get; set; }
        public bool IsCompleted { get; set; }
        public DateTime CreatedAt { get; set; }
        public DateTime? UpdatedAt { get; set; }
        public decimal AlreadyPostedQty { get; set; }
        public decimal PostedQuantity { get; set; }
    }
}
CompanyId
string
Tenant company identifier for this line.
ShipmentId
string
Parent shipment header identifier.
Id
string
Unique identifier of this shipment line.
LineNo
int
Sequential line number within the shipment document.
LineStatus
string
Current status of this individual line (e.g., "Pending", "Picked", "Shipped").
ItemId
string
Backend identifier of the item to be shipped on this line.
ItemNo
string
Item number (SKU) displayed on the handheld pick/ship screen.
ItemDescription
string
Item description text.
UnitOfMeasure
string
Unit of measure for all quantities on this line.
WarehouseId
string
Warehouse location identifier for pick source.
BinId
string
Pick source bin identifier.
BinCode
string
Pick source bin code displayed to the operator.
OrderedQty
decimal
Quantity ordered on the sales/transfer order. Acts as the upper bound for ShippedQty on the handheld.
PickedQty
decimal
Quantity confirmed as picked in the pick-to-ship workflow.
ShippedQty
decimal
Quantity entered by the operator as shipped. Automatically clamped to [0, OrderedQty] by the property setter. Triggers INotifyPropertyChanged for MAUI binding updates.
BaseUomQty
decimal | null
Quantity expressed in the item’s base unit of measure (for UOM-conversion scenarios).
RemainingQty
decimal
Remaining quantity from the backend’s perspective (may be pre-computed).
RemainingQuantity
decimal
Remaining quantity from a second backend source. The computed RemainingBalance uses RemainingQuantity > 0 ? RemainingQuantity : RemainingQty.
LotNo
string
Lot number assigned to this line for lot-tracked items.
SerialNo
string
Serial number for serial-tracked items.
ExpirationDate
DateTime | null
Expiration date for expiration-tracked items.
UnitWeight
decimal | null
Weight per unit, used for manifest generation.
UnitVolume
decimal | null
Volume per unit, used for manifest generation.
IsCompleted
bool
true when this line has been fully processed.
CreatedAt
DateTime
UTC timestamp when this line was created.
UpdatedAt
DateTime | null
UTC timestamp of the most recent update.
AlreadyPostedQty
decimal
Quantity posted to the ledger in previous sessions. Used together with PostedQuantity to compute the ShortStatusLabel.
PostedQuantity
decimal
Quantity posted to the ledger (may come from a different API field than AlreadyPostedQty).

UpdateShipmentLineDto

Minimal payload sent to the update-line endpoint when the operator confirms a shipped quantity.
namespace Handheld.Models;

public class UpdateShipmentLineDto
{
    public decimal ShippedQty { get; set; }
}
ShippedQty
decimal
required
The quantity the operator has confirmed as shipped for this line.

Movements & Journals

These DTOs support the warehouse movements log, product journal management, and location selection.

MovementsPageDto

A single row in the movements history feed, representing one inventory movement event.
namespace Handheld.Models;

public class MovementsPageDto
{
    [JsonPropertyName("id")]
    public string? Id { get; set; }

    [JsonPropertyName("movementNo")]
    public string? MovementNo { get; set; }

    [JsonPropertyName("itemId")]
    public string? ItemId { get; set; }

    [JsonPropertyName("itemNo")]
    public string? ItemNo { get; set; }

    [JsonPropertyName("itemDescription")]
    public string? ItemDescription { get; set; }

    [JsonPropertyName("description")]
    public string? Description
    {
        get => ItemDescription;
        set => ItemDescription = value;
    }

    [JsonPropertyName("binId")]
    public string? BinId { get; set; }

    [JsonPropertyName("binCode")]
    public string? BinCode { get; set; }

    [JsonPropertyName("locationCode")]
    public string? LocationCode { get; set; }

    [JsonPropertyName("targetLocationCode")]
    public string? TargetLocationCode { get; set; }

    [JsonPropertyName("quantity")]
    public decimal Quantity { get; set; }

    [JsonPropertyName("movementType")]
    public string? MovementType { get; set; }

    [JsonPropertyName("referenceNo")]
    public string? ReferenceNo { get; set; }

    [JsonPropertyName("externalDocumentNo")]
    public string? ExternalDocumentNo { get; set; }

    [JsonPropertyName("userId")]
    public string? UserId { get; set; }

    [JsonPropertyName("createdAt")]
    public DateTime CreatedAt { get; set; }
}
id
string | null
Unique identifier of the movement record.
movementNo
string | null
System-generated movement document number.
itemId
string | null
Backend identifier of the item that moved.
itemNo
string | null
Item number (SKU) of the moved item.
itemDescription
string | null
Item description text. The class also exposes a Description property ([JsonPropertyName("description")]) that reads and writes the same backing field, allowing the backend to send either JSON key.
binId
string | null
Source bin identifier.
binCode
string | null
Source bin code.
locationCode
string | null
Source warehouse location code.
targetLocationCode
string | null
Destination warehouse location code for inter-location transfers. null for intra-location moves.
quantity
decimal
Quantity moved. Positive for receipts/inbound; negative for issues/outbound (convention depends on movementType).
movementType
string | null
Classifier for the movement (e.g., "RECEIPT", "SHIPMENT", "TRANSFER", "ADJUSTMENT").
referenceNo
string | null
Internal reference document number (e.g., a receipt or shipment number).
externalDocumentNo
string | null
External reference document number (e.g., vendor PO or customer SO).
userId
string | null
Identifier of the user who recorded this movement.
createdAt
DateTime
UTC timestamp when the movement was recorded.

ProductJournalHeaderDto

Header record for a product journal batch. Journals group multiple inventory adjustments into a single document.
public class ProductJournalHeaderDto
{
    [JsonPropertyName("id")]
    public string? Id { get; set; }

    [JsonPropertyName("journalNo")]
    public string? JournalNo { get; set; }

    [JsonPropertyName("description")]
    public string? Description { get; set; }

    [JsonPropertyName("movementType")]
    public string? MovementType { get; set; }

    [JsonPropertyName("postingDate")]
    public DateTime? PostingDate { get; set; }

    [JsonPropertyName("externalDocumentNo")]
    public string? ExternalDocumentNo { get; set; }

    [JsonPropertyName("transitLocationCode")]
    public string? TransitLocationCode { get; set; }

    [JsonPropertyName("status")]
    public string? Status { get; set; }

    [JsonPropertyName("lineCount")]
    public int LineCount { get; set; }
}
id
string | null
Unique identifier of the journal header.
journalNo
string | null
System-generated journal document number.
description
string | null
Free-text description of the journal batch.
movementType
string | null
Default movement type applied to all lines (e.g., "ADJUSTMENT", "TRANSFER").
postingDate
DateTime | null
Accounting date for the journal posting. null if not yet set.
externalDocumentNo
string | null
External reference document number.
transitLocationCode
string | null
Transit location used for in-transit inventory during inter-location transfers.
status
string | null
Journal lifecycle status (e.g., "Open", "Posted").
lineCount
int
Number of lines in this journal batch.

ProductJournalDetailDto

Extends ProductJournalHeaderDto with the full collection of journal lines.
public class ProductJournalDetailDto : ProductJournalHeaderDto
{
    [JsonPropertyName("lines")]
    public List<ProductJournalLineDto> Lines { get; set; } = new();
}
lines
List<ProductJournalLineDto>
The individual inventory movement lines within this journal. Inherits all header fields from ProductJournalHeaderDto.

ProductJournalLineDto

A single inventory movement line within a product journal.
public class ProductJournalLineDto
{
    [JsonPropertyName("id")]
    public string? Id { get; set; }

    [JsonPropertyName("itemNo")]
    public string? ItemNo { get; set; }

    [JsonPropertyName("description")]
    public string? Description { get; set; }

    [JsonPropertyName("quantity")]
    public decimal Quantity { get; set; }

    [JsonPropertyName("unitOfMeasure")]
    public string? UnitOfMeasure { get; set; }

    [JsonPropertyName("packageQuantity")]
    public decimal PackageQuantity { get; set; }

    [JsonPropertyName("purchaseUnitOfMeasure")]
    public string? PurchaseUnitOfMeasure { get; set; }

    [JsonPropertyName("sourceLocationCode")]
    public string? SourceLocationCode { get; set; }

    [JsonPropertyName("targetLocationCode")]
    public string? TargetLocationCode { get; set; }

    [JsonPropertyName("sourceBinCode")]
    public string? SourceBinCode { get; set; }

    [JsonPropertyName("targetBinCode")]
    public string? TargetBinCode { get; set; }

    [JsonPropertyName("lotNo")]
    public string? LotNo { get; set; }

    [JsonPropertyName("variantCode")]
    public string? VariantCode { get; set; }

    [JsonPropertyName("qualityCode")]
    public string? QualityCode { get; set; }

    [JsonPropertyName("movementType")]
    public string? MovementType { get; set; }
}
id
string | null
Unique identifier of this journal line.
itemNo
string | null
Item number (SKU) being adjusted or transferred.
description
string | null
Item description text.
quantity
decimal
Quantity for this adjustment or movement.
unitOfMeasure
string | null
Unit of measure code for the quantity.
packageQuantity
decimal
Quantity expressed in package units (e.g., cases, pallets).
purchaseUnitOfMeasure
string | null
Purchase UOM for this line when different from the base UOM.
sourceLocationCode
string | null
Origin warehouse location code.
targetLocationCode
string | null
Destination warehouse location code.
sourceBinCode
string | null
Origin bin code.
targetBinCode
string | null
Destination bin code.
lotNo
string | null
Lot number for lot-tracked items.
variantCode
string | null
Item variant code (e.g., size, color).
qualityCode
string | null
Quality classification code (e.g., "PASS", "HOLD", "REJECT").
movementType
string | null
Movement type override for this specific line. When set, supersedes the header’s movementType.

ProductJournalSaveRequestDto

Request body for creating or updating a product journal, including its lines.
public class ProductJournalSaveRequestDto
{
    [JsonPropertyName("description")]
    public string? Description { get; set; }

    [JsonPropertyName("movementType")]
    public string? MovementType { get; set; }

    [JsonPropertyName("postingDate")]
    public DateTime? PostingDate { get; set; }

    [JsonPropertyName("externalDocumentNo")]
    public string? ExternalDocumentNo { get; set; }

    [JsonPropertyName("transitLocationCode")]
    public string? TransitLocationCode { get; set; }

    [JsonPropertyName("lines")]
    public List<ProductJournalLineDto> Lines { get; set; } = new();
}
description
string | null
Free-text description of the journal.
movementType
string | null
Default movement type for all lines in this save request.
postingDate
DateTime | null
Accounting date; if null, the backend uses the current business date.
externalDocumentNo
string | null
External reference document number.
transitLocationCode
string | null
Transit location for inter-location transfer journals.
lines
List<ProductJournalLineDto>
The inventory movement lines to create or replace for this journal.

ProductLocationOptionDto

A single warehouse location option used to populate the location picker on journal and movement screens.
public class ProductLocationOptionDto
{
    [JsonPropertyName("locationCode")]
    public string LocationCode { get; set; } = string.Empty;

    [JsonPropertyName("locationDescription")]
    public string? LocationDescription { get; set; }

    [JsonPropertyName("isDefaultSelection")]
    public bool IsDefaultSelection { get; set; }
}
locationCode
string
Warehouse location code (e.g., "MAIN", "ZONE-A"). The computed DisplayLabel falls back to LocationDescription ?? "Todos" when this is empty.
locationDescription
string | null
Human-readable description for the location.
isDefaultSelection
bool
true for the location that should be pre-selected when the picker opens.

ProductLocationListDto

Container returned by the location-list endpoint, wrapping available locations and the default selection.
public class ProductLocationListDto
{
    [JsonPropertyName("defaultLocationCode")]
    public string? DefaultLocationCode { get; set; }

    [JsonPropertyName("locations")]
    public List<ProductLocationOptionDto> Locations { get; set; } = new();
}
defaultLocationCode
string | null
The location code that should be selected by default in the UI. Matches the LocationCode of the entry with IsDefaultSelection = true.
locations
List<ProductLocationOptionDto>
All locations available for selection. See ProductLocationOptionDto.

RFID Models

RFID DTOs drive tag resolution, device profile initialization, and operational policy enforcement for the integrated RFID reader.

RfidTagResolveDto

Response returned when the handheld resolves a single EPC tag against the backend inventory.
namespace Handheld.Models;

public class RfidTagResolveDto
{
    public string Epc { get; set; } = string.Empty;
    public string ObjectType { get; set; } = string.Empty;
    public string Status { get; set; } = string.Empty;
    public Guid? ItemId { get; set; }
    public string ItemNo { get; set; } = string.Empty;
    public string ItemDescription { get; set; } = string.Empty;
    public decimal Quantity { get; set; }
    public string LocationCode { get; set; } = string.Empty;
    public string BinCode { get; set; } = string.Empty;
    public bool IsResolved { get; set; }
    public bool IsActive { get; set; }
    public string Message { get; set; } = string.Empty;
}
Epc
string
The Electronic Product Code read from the RFID tag. Unique tag identifier in hexadecimal format.
ObjectType
string
Type of inventory object the EPC represents (e.g., "ITEM", "PALLET", "CONTAINER").
Status
string
Tag registration status in the backend (e.g., "ACTIVE", "INACTIVE", "UNKNOWN").
ItemId
Guid | null
Backend item identifier linked to this EPC. null if the tag is not associated with any item.
ItemNo
string
Item number (SKU) resolved from this EPC.
ItemDescription
string
Item description text for display in the scan-result overlay.
Quantity
decimal
Quantity encoded on or associated with this RFID tag.
LocationCode
string
Warehouse location code where this tag’s item is registered.
BinCode
string
Bin code associated with this tag.
IsResolved
bool
true when the EPC was successfully matched to a known item in the backend.
IsActive
bool
true when the RFID tag is active and eligible for warehouse transactions.
Message
string
Human-readable message from the backend, shown to the operator when IsResolved is false or when the tag has a warning condition.

RfidHandheldContextDto

Full RFID initialization context returned by GET /api/rfid/handheld/context. Drives all RFID capability decisions on the handheld, including fallback modes and device SDK initialization.
public sealed class RfidHandheldContextDto
{
    [JsonPropertyName("success")]
    public bool Success { get; init; }

    [JsonPropertyName("module")]
    public string Module { get; init; } = string.Empty;

    [JsonPropertyName("deviceId")]
    public string DeviceId { get; init; } = string.Empty;

    [JsonPropertyName("isDeviceAuthorized")]
    public bool IsDeviceAuthorized { get; init; }

    [JsonPropertyName("hasDeviceProfile")]
    public bool HasDeviceProfile { get; init; }

    [JsonPropertyName("supportsRfid")]
    public bool SupportsRfid { get; init; }

    [JsonPropertyName("supportsBarcode")]
    public bool SupportsBarcode { get; init; }

    [JsonPropertyName("rfidEnabledForModule")]
    public bool RfidEnabledForModule { get; init; }

    [JsonPropertyName("canUseRfid")]
    public bool CanUseRfid { get; init; }

    [JsonPropertyName("canFallbackToManual")]
    public bool CanFallbackToManual { get; init; }

    [JsonPropertyName("canFallbackToBarcode")]
    public bool CanFallbackToBarcode { get; init; }

    [JsonPropertyName("canOperateWithoutRfid")]
    public bool CanOperateWithoutRfid { get; init; }

    [JsonPropertyName("rfidHardwareStatus")]
    public string RfidHardwareStatus { get; init; } = "NO_RFID_PROFILE";

    [JsonPropertyName("deviceResolutionSource")]
    public string DeviceResolutionSource { get; init; } = string.Empty;

    [JsonPropertyName("policySource")]
    public string PolicySource { get; init; } = string.Empty;

    [JsonPropertyName("effectiveMode")]
    public string EffectiveMode { get; init; } = string.Empty;

    [JsonPropertyName("message")]
    public string? Message { get; init; }

    [JsonPropertyName("policy")]
    public RfidEffectivePolicyContextDto Policy { get; init; } = new();

    [JsonPropertyName("deviceProfile")]
    public RfidEffectiveDeviceProfileContextDto DeviceProfile { get; init; } = new();
}
success
bool
true when the backend successfully resolved the context for this device and module.
module
string
The WMS module for which this context was requested (e.g., "RECEIVING", "SHIPMENT", "INQUIRY").
deviceId
string
The device identifier used to look up the device profile.
isDeviceAuthorized
bool
true when the device is registered and authorized in the tenant.
hasDeviceProfile
bool
true when a matching RFID device profile was found for this device.
supportsRfid
bool
true when the device profile indicates RFID hardware support.
supportsBarcode
bool
true when the device profile indicates barcode scanning support.
rfidEnabledForModule
bool
true when the tenant’s RFID policy enables RFID for the requested module.
canUseRfid
bool
Computed authorization gate: true only when the device is authorized, has a profile, supports RFID, and the module is RFID-enabled.
canFallbackToManual
bool
true when operators may enter quantities manually instead of scanning.
canFallbackToBarcode
bool
true when operators may use barcode scanning as a fallback to RFID.
canOperateWithoutRfid
bool
true when the module can proceed without any RFID scanning (manual or barcode only). Always true in the static Fallback() context.
rfidHardwareStatus
string
Enumerated hardware status code. Values: "READY", "NO_RFID_PROFILE", "RFID_NOT_SUPPORTED", "RFID_DISABLED_BY_POLICY", "DEVICE_NOT_AUTHORIZED".
deviceResolutionSource
string
Indicates how the device was identified (e.g., "REGISTERED_DEVICE", "DEFAULT_PROFILE", "NONE").
policySource
string
Indicates the source of the effective policy (e.g., "MODULE_OVERRIDE", "TENANT_DEFAULT", "TENANT_DISABLED").
effectiveMode
string
The resolved operational mode for this module session (e.g., "RFID", "BARCODE", "MANUAL", "DISABLED").
message
string | null
Optional human-readable message from the backend, shown as a warning or info banner on the handheld.
policy
RfidEffectivePolicyContextDto
The effective RFID operation policy for the module. See RfidEffectivePolicyContextDto.
deviceProfile
RfidEffectiveDeviceProfileContextDto
The effective device profile, containing SDK initialization parameters. See RfidEffectiveDeviceProfileContextDto.

RfidEffectiveDeviceProfileContextDto

The resolved RFID device profile containing all SDK initialization parameters for the handheld reader.
public sealed class RfidEffectiveDeviceProfileContextDto
{
    [JsonPropertyName("hasProfile")]
    public bool HasProfile { get; init; }

    [JsonPropertyName("supportsRfid")]
    public bool SupportsRfid { get; init; }

    [JsonPropertyName("supportsBarcode")]
    public bool SupportsBarcode { get; init; }

    [JsonPropertyName("resolutionSource")]
    public string ResolutionSource { get; init; } = "NONE";

    [JsonPropertyName("message")]
    public string? Message { get; init; }

    [JsonPropertyName("deviceId")]
    public string? DeviceId { get; init; }

    [JsonPropertyName("handheldDeviceId")]
    public Guid? HandheldDeviceId { get; init; }

    [JsonPropertyName("rfidDeviceProfileId")]
    public Guid? RfidDeviceProfileId { get; init; }

    [JsonPropertyName("code")]
    public string? Code { get; init; }

    [JsonPropertyName("name")]
    public string? Name { get; init; }

    [JsonPropertyName("vendor")]
    public string? Vendor { get; init; }

    [JsonPropertyName("model")]
    public string? Model { get; init; }

    [JsonPropertyName("platform")]
    public string? Platform { get; init; }

    [JsonPropertyName("connectionType")]
    public string? ConnectionType { get; init; }

    [JsonPropertyName("readerTransport")]
    public string? ReaderTransport { get; init; }

    [JsonPropertyName("triggerMode")]
    public string? TriggerMode { get; init; }

    [JsonPropertyName("defaultPowerLevel")]
    public int? DefaultPowerLevel { get; init; }

    [JsonPropertyName("defaultTimeoutMs")]
    public int? DefaultTimeoutMs { get; init; }

    [JsonPropertyName("defaultInventoryMode")]
    public string? DefaultInventoryMode { get; init; }

    [JsonPropertyName("capabilitiesJson")]
    public string? CapabilitiesJson { get; init; }

    [JsonPropertyName("settingsJson")]
    public string? SettingsJson { get; init; }

    [JsonPropertyName("isDefault")]
    public bool IsDefault { get; init; }
}
hasProfile
bool
true when a matching device profile was found in the tenant.
supportsRfid
bool
true when this profile’s device supports RFID reading.
supportsBarcode
bool
true when this profile’s device supports barcode scanning.
resolutionSource
string
How the profile was matched: "REGISTERED_DEVICE", "DEFAULT_PROFILE", or "NONE".
message
string | null
Optional diagnostic message about the profile resolution.
deviceId
string | null
Raw device identifier string from the registration.
handheldDeviceId
Guid | null
Backend identifier of the registered handheld device record.
rfidDeviceProfileId
Guid | null
Backend identifier of the RFID device profile record.
code
string | null
Short code for the device profile (e.g., "ZEBRA-RFD90").
name
string | null
Display name for the device profile.
vendor
string | null
Hardware vendor name (e.g., "Zebra", "Honeywell").
model
string | null
Hardware model identifier.
platform
string | null
OS or firmware platform string.
connectionType
string | null
Physical connection type: "UART" or "USB". Determines which SDK transport class is instantiated.
readerTransport
string | null
Reader transport class selector: "UART" or "USB".
triggerMode
string | null
Read trigger mode: "Manual" (single-press trigger) or "Continuous" (scan until released).
defaultPowerLevel
int | null
Transmit power level in dBm passed to setPower(). null means use the SDK default.
defaultTimeoutMs
int | null
Single-tag inventory session timeout in milliseconds.
defaultInventoryMode
string | null
Tag data to read per scan: "EPC_ONLY", "EPC_TID", or "EPC_TID_USER".
capabilitiesJson
string | null
JSON blob of extended device capability flags.
settingsJson
string | null
JSON blob of additional device-specific settings.
isDefault
bool
true when this is the tenant’s default fallback profile (not device-specific).

RfidEffectivePolicyContextDto

The effective RFID operation policy for the requested module. Controls fallback permissions, blocking rules, deduplication windows, and behavior for unknown or duplicate tags.
public sealed class RfidEffectivePolicyContextDto
{
    [JsonPropertyName("success")]
    public bool Success { get; init; }

    [JsonPropertyName("isRfidEnabled")]
    public bool IsRfidEnabled { get; init; }

    [JsonPropertyName("isModuleEnabled")]
    public bool IsModuleEnabled { get; init; }

    [JsonPropertyName("module")]
    public string Module { get; init; } = string.Empty;

    [JsonPropertyName("effectiveMode")]
    public string EffectiveMode { get; init; } = "DISABLED";

    [JsonPropertyName("policySource")]
    public string PolicySource { get; init; } = "TENANT_DISABLED";

    [JsonPropertyName("allowManualFallback")]
    public bool AllowManualFallback { get; init; }

    [JsonPropertyName("allowBarcodeFallback")]
    public bool AllowBarcodeFallback { get; init; }

    [JsonPropertyName("blockOnUnknownTag")]
    public bool BlockOnUnknownTag { get; init; }

    [JsonPropertyName("blockOnInactiveTag")]
    public bool BlockOnInactiveTag { get; init; }

    [JsonPropertyName("blockOnValidationMismatch")]
    public bool BlockOnValidationMismatch { get; init; }

    [JsonPropertyName("recordAuditEvents")]
    public bool RecordAuditEvents { get; init; }

    [JsonPropertyName("requireRfidEvidence")]
    public bool RequireRfidEvidence { get; init; }

    [JsonPropertyName("duplicateReadWindowSeconds")]
    public int DuplicateReadWindowSeconds { get; init; }

    [JsonPropertyName("maxReadsPerOperation")]
    public int? MaxReadsPerOperation { get; init; }

    [JsonPropertyName("unknownTagBehavior")]
    public string UnknownTagBehavior { get; init; } = "ALLOW";

    [JsonPropertyName("duplicateTagBehavior")]
    public string DuplicateTagBehavior { get; init; } = "ALLOW";

    [JsonPropertyName("policyScope")]
    public string? PolicyScope { get; init; }

    [JsonPropertyName("message")]
    public string? Message { get; init; }
}
success
bool
true when the policy was successfully resolved for the module.
isRfidEnabled
bool
true when RFID is globally enabled for the tenant.
isModuleEnabled
bool
true when RFID is specifically enabled for the requested module.
module
string
The WMS module this policy applies to.
effectiveMode
string
Resolved operational mode: "RFID", "BARCODE", "MANUAL", or "DISABLED".
policySource
string
How the policy was resolved: "MODULE_OVERRIDE", "TENANT_DEFAULT", or "TENANT_DISABLED".
allowManualFallback
bool
true when the policy permits operators to enter quantities manually.
allowBarcodeFallback
bool
true when the policy permits barcode scanning as a fallback to RFID.
blockOnUnknownTag
bool
true when the handheld must stop and alert the operator if an unregistered EPC is scanned.
blockOnInactiveTag
bool
true when the handheld must block processing of tags marked inactive in the backend.
blockOnValidationMismatch
bool
true when the handheld must block processing when the scanned item does not match the expected item on the current document line.
recordAuditEvents
bool
true when every RFID read must be recorded as an audit event in the backend.
requireRfidEvidence
bool
true when at least one RFID scan must be recorded before the operator can confirm/post a transaction.
duplicateReadWindowSeconds
int
Window in seconds within which the same EPC is suppressed as a duplicate read. 0 means no deduplication is applied.
maxReadsPerOperation
int | null
Maximum number of distinct EPCs that may be collected in a single inventory session. null means unlimited.
unknownTagBehavior
string
Action when an unregistered EPC is scanned: "ALLOW", "WARN", "BLOCK", or "REGISTER".
duplicateTagBehavior
string
Action when the same EPC is scanned again within the deduplication window: "ALLOW", "WARN", or "BLOCK".
policyScope
string | null
Scope descriptor for the policy record (e.g., "MODULE", "TENANT").
message
string | null
Optional informational message from the policy resolver.

SandboxResolvedItem

A lightweight resolved item record used in the RFID sandbox / simulation mode. Carries only the fields needed to render a scan result without a live backend connection.
namespace Handheld.Models;

public sealed class SandboxResolvedItem
{
    public string ItemNo { get; init; } = string.Empty;
    public string? Description { get; init; }
    public string DisplayRssi { get; init; } = "-";
    public string Mode { get; init; } = string.Empty;
}
ItemNo
string
Item number (SKU) resolved from the simulated EPC read.
Description
string | null
Item description text for display in the sandbox scan overlay.
DisplayRssi
string
Formatted RSSI signal-strength display string (e.g., "-65 dBm"). Defaults to "-" when signal data is unavailable.
Mode
string
Scan mode indicator shown in the sandbox result (e.g., "RFID", "BARCODE", "MANUAL").

Common Models

Shared utility DTOs used across multiple domains.

PagedResponse<T>

Generic pagination wrapper returned by all list endpoints that support server-side paging.
public class PagedResponse<T>
{
    [JsonPropertyName("pageNumber")]
    public int PageNumber { get; set; }

    [JsonPropertyName("pageSize")]
    public int PageSize { get; set; }

    [JsonPropertyName("totalRecords")]
    public int TotalRecords { get; set; }

    [JsonPropertyName("totalPages")]
    public int TotalPages { get; set; }

    [JsonPropertyName("data")]
    public List<T> Data { get; set; } = new();

    [JsonPropertyName("hasPrevious")]
    public bool HasPrevious { get; set; }

    [JsonPropertyName("hasNext")]
    public bool HasNext { get; set; }
}
pageNumber
int
The current page number (1-based). Pass this value incremented by 1 to fetch the next page.
pageSize
int
The number of records returned per page.
totalRecords
int
The total number of records in the full result set across all pages.
totalPages
int
Total page count: ceil(totalRecords / pageSize).
data
List<T>
The page’s data payload. T is the domain-specific DTO for the endpoint being called.
hasPrevious
bool
true when pageNumber > 1 and a previous page exists.
hasNext
bool
true when pageNumber < totalPages and a next page exists.

BinDto

Warehouse bin (storage location) record used in bin-selection pickers and bin-assignment flows.
namespace Handheld.Models;

public class BinDto
{
    public Guid Id { get; set; }
    public string BinCode { get; set; } = string.Empty;
    public string? Description { get; set; }
    public bool IsActive { get; set; }
    public bool IsBlocked { get; set; }
    public bool IsDefault { get; set; }
    public string? BinType { get; set; }
    public bool AllowPicking { get; set; }
    public bool AllowPutaway { get; set; }
}
Id
Guid
Unique backend identifier of the bin record.
BinCode
string
Human-readable bin code displayed in pickers and on transaction lines (e.g., "A-01-01", "STAGE-01").
Description
string | null
Optional longer description of the bin location.
IsActive
bool
true when the bin is active and accepting inventory transactions.
IsBlocked
bool
true when the bin is blocked — transactions referencing this bin will be rejected.
IsDefault
bool
true when this bin is the default location for its parent warehouse or zone.
BinType
string | null
Bin classification code (e.g., "PICK", "BULK", "RECEIVE", "SHIP").
AllowPicking
bool
true when the handheld may present this bin as a valid pick source.
AllowPutaway
bool
true when the handheld may suggest this bin as a valid put-away destination.

CompanyResponse

Tenant company record returned by company-management endpoints.
namespace Handheld.Models;

public class CompanyResponse
{
    public Guid Id { get; set; }
    public string Code { get; set; } = string.Empty;
    public string Name { get; set; } = string.Empty;
    public bool IsActive { get; set; }
    public string? CompanyType { get; set; }
    public string CurrencyCode { get; set; } = string.Empty;
    public string TimeZone { get; set; } = string.Empty;
    public bool IsWmsEnabled { get; set; }
    public DateTime CreatedAt { get; set; }
}
Id
Guid
Unique identifier of the company. Used as the CompanyId in all company-scoped API requests.
Code
string
Short alphanumeric company code (e.g., "ACME").
Name
string
Full legal or trading name of the company.
IsActive
bool
true when the company is active and users may log in to it.
CompanyType
string | null
Company type classification (e.g., "MANUFACTURER", "DISTRIBUTOR", "RETAILER").
CurrencyCode
string
ISO 4217 currency code for the company’s functional currency (e.g., "USD", "MXN", "EUR").
TimeZone
string
IANA time zone identifier for the company (e.g., "America/Mexico_City", "UTC").
IsWmsEnabled
bool
true when the WMS module is activated for this tenant company.
CreatedAt
DateTime
UTC timestamp when the company record was created.

CreateCompanyRequestDto

Request body posted to the company-creation endpoint when provisioning a new tenant.
namespace Handheld.Models;

public class CreateCompanyRequest
{
    public string Code { get; set; } = string.Empty;
    public string Name { get; set; } = string.Empty;
    public string CurrencyCode { get; set; } = string.Empty;
    public string TimeZone { get; set; } = string.Empty;
    public string? CompanyType { get; set; }
    public string? LegalName { get; set; }
    public string? TaxId { get; set; }
    public string? Address1 { get; set; }
    public string? City { get; set; }
    public string? Country { get; set; }
}
Code
string
required
Short unique company code (e.g., "ACME"). Must be unique across all tenants.
Name
string
required
Trading or display name for the company.
CurrencyCode
string
required
ISO 4217 functional currency code (e.g., "USD").
TimeZone
string
required
IANA time zone for date/time calculations (e.g., "America/New_York").
CompanyType
string | null
Optional company type classification.
Legal registered name, if different from the trading name.
TaxId
string | null
Tax identification number (e.g., RFC for Mexico, EIN for USA).
Address1
string | null
Primary street address line.
City
string | null
City name for the company’s registered address.
Country
string | null
ISO 3166-1 alpha-2 country code (e.g., "MX", "US").

TransferDto

The TransferDto.cs file defines four DTOs that together model the complete inter-location transfer workflow.

TransferHeaderDto

The top-level transfer document header, returned by the transfer list and detail endpoints.
public class TransferHeaderDto
{
    public string ExternalDocumentNo { get; set; } = string.Empty;
    public string EventId { get; set; } = string.Empty;
    public string IdempotencyKey { get; set; } = string.Empty;
    public string CorrelationId { get; set; } = string.Empty;
    public string OperationType { get; set; } = string.Empty;
    public string Status { get; set; } = string.Empty;
    public string LocationCode { get; set; } = string.Empty;
    public string? BusinessPartnerCode { get; set; }
    public string? BusinessPartnerName { get; set; }
    public DateTime ReleasedAtUtc { get; set; }
    public List<TransferLineDto> Lines { get; set; } = new();
}
ExternalDocumentNo
string
External reference document number (e.g., an ERP transfer order number).
EventId
string
Unique event identifier for this transfer document in the event-sourcing model.
IdempotencyKey
string
Key used to safely retry POST operations without creating duplicate transfers.
CorrelationId
string
Distributed tracing correlation identifier for cross-service log correlation.
OperationType
string
Transfer operation type (e.g., "TRANSFER", "RELOCATION").
Status
string
Transfer lifecycle status (e.g., "PENDIENTE", "ENVIADO", "RECIBIDO_PARCIAL", "COMPLETADO"). The computed StatusShortLabel and StatusBadgeColor derive from this value.
LocationCode
string
Source warehouse location code. The computed DisplayLocation falls back to "MAIN" when empty.
BusinessPartnerCode
string | null
Business partner (vendor/customer) code associated with this transfer.
BusinessPartnerName
string | null
Business partner display name.
ReleasedAtUtc
DateTime
UTC timestamp when the transfer was released for warehouse processing.
Lines
List<TransferLineDto>
Individual product lines within this transfer document.

TransferLineDto

A single product line in a transfer document.
public class TransferLineDto
{
    public string ExternalLineNo { get; set; } = string.Empty;
    public string ItemNo { get; set; } = string.Empty;
    public string? ItemDescription { get; set; }
    public decimal ExpectedQuantity { get; set; }
    public decimal? ActualQuantity { get; set; }
    public decimal? SentQuantity { get; set; }
    public decimal? ReceivedQuantity { get; set; }
    public string Uom { get; set; } = string.Empty;
    public string? BinCode { get; set; }
    public string? SourceBinCode { get; set; }
    public string? TargetBinCode { get; set; }
    public string HeaderStatus { get; set; } = string.Empty;
}
ExternalLineNo
string
External line number from the originating ERP transfer order.
ItemNo
string
Item number (SKU) being transferred on this line.
ItemDescription
string | null
Item description text.
ExpectedQuantity
decimal
Quantity ordered for transfer. Used as the reference when HeaderStatus is not "ENVIADO" or "RECIBIDO_PARCIAL".
ActualQuantity
decimal | null
Quantity actually processed by the operator on the handheld.
SentQuantity
decimal | null
Quantity confirmed as sent (dispatched). Used as the reference quantity when HeaderStatus is "ENVIADO" or "RECIBIDO_PARCIAL".
ReceivedQuantity
decimal | null
Quantity confirmed as received at the destination.
Uom
string
Unit of measure code for all quantities on this line.
BinCode
string | null
Generic bin code associated with this line. DisplaySourceBin falls back to this when SourceBinCode is null.
SourceBinCode
string | null
Origin bin code where stock is picked from.
TargetBinCode
string | null
Destination bin code where stock is put away.
HeaderStatus
string
Injected by the ViewModel after the header loads so computed properties (DisplayQty, Remaining) can adapt their reference quantity to the transfer state.

PostTransferDto

Request body for posting a completed transfer back to the backend.
public class PostTransferDto
{
    public string EventId { get; set; } = string.Empty;
    public string IdempotencyKey { get; set; } = string.Empty;
    public string CorrelationId { get; set; } = string.Empty;
    public string ExternalDocumentNo { get; set; } = string.Empty;
    public string OperationType { get; set; } = "TRANSFER";
    public string Status { get; set; } = "Posted";
    public string LocationCode { get; set; } = string.Empty;
    public List<PostTransferLineDto> Lines { get; set; } = new();
}
EventId
string
Event identifier echoed from the originating transfer header.
IdempotencyKey
string
Key to guarantee at-most-once semantics on the POST request.
CorrelationId
string
Correlation identifier for distributed tracing.
ExternalDocumentNo
string
External reference document number being posted.
OperationType
string
Operation type. Defaults to "TRANSFER".
Status
string
Target status after posting. Defaults to "Posted".
LocationCode
string
Source warehouse location code.
Lines
List<PostTransferLineDto>
The confirmed transfer lines with actual quantities.

PostTransferLineDto

A single confirmed transfer line sent in a PostTransferDto request.
public class PostTransferLineDto
{
    public string ExternalLineNo { get; set; } = string.Empty;
    public string ItemNo { get; set; } = string.Empty;
    public decimal ExpectedQuantity { get; set; }
    public decimal ActualQuantity { get; set; }
    public string Uom { get; set; } = string.Empty;
    public string? SourceBinCode { get; set; }
    public string? TargetBinCode { get; set; }
}
ExternalLineNo
string
External line number identifying the corresponding line in the originating ERP document.
ItemNo
string
Item number (SKU) being transferred.
ExpectedQuantity
decimal
The originally expected quantity, echoed for reconciliation.
ActualQuantity
decimal
The quantity actually processed and confirmed by the operator.
Uom
string
Unit of measure for both quantity fields.
SourceBinCode
string | null
Origin bin code where stock was picked.
TargetBinCode
string | null
Destination bin code where stock was put away.

PickPageDto

Pick header record used on the pick-list screen. Links a pick document to its sales order and warehouse shipment.
namespace Handheld.Models;

public class PickHeaderDto
{
    [JsonPropertyName("id")]
    public Guid Id { get; set; }

    [JsonPropertyName("pickNo")]
    public string PickNo { get; set; } = string.Empty;

    [JsonPropertyName("status")]
    public string Status { get; set; } = string.Empty;

    [JsonPropertyName("assignedUserName")]
    public string? AssignedUserName { get; set; }

    [JsonPropertyName("salesOrderNo")]
    public string? SalesOrderNo { get; set; }

    [JsonPropertyName("warehouseShipmentNo")]
    public string? WarehouseShipmentNo { get; set; }

    [JsonPropertyName("createdAt")]
    public DateTime CreatedAt { get; set; }

    [JsonPropertyName("completedAt")]
    public DateTime? CompletedAt { get; set; }
}
id
Guid
Unique identifier of the pick header.
pickNo
string
System-generated pick document number displayed in the pick-list view.
status
string
Pick lifecycle status (e.g., "Open", "InProgress", "Completed").
assignedUserName
string | null
Display name of the user to whom this pick is assigned. null if unassigned.
salesOrderNo
string | null
Source sales order number. Links the pick document back to its originating sales order.
warehouseShipmentNo
string | null
Warehouse shipment number associated with this pick. Links to the outbound ShipmentHeaderDto.
createdAt
DateTime
UTC timestamp when the pick document was created.
completedAt
DateTime | null
UTC timestamp when all lines were confirmed picked. null if not yet complete.

Build docs developers (and LLMs) love