Skip to main content

Overview

Inventory Transfers allow you to move items between different warehouse locations within EnvaSistema. This operation maintains accurate location-based inventory tracking and ensures proper stock allocation across multiple storage areas or warehouses.
Transfers require both an origin and destination location to be specified before the operation can be completed.

Purpose

The Transferencia de Inventario feature enables:
  • Moving inventory between different warehouse locations
  • Reallocating stock for operational efficiency
  • Balancing inventory across multiple sites
  • Tracking item movement history
  • Maintaining location-based inventory accuracy

Use Cases

Location Rebalancing

Redistribute inventory to balance stock levels across warehouses

Operational Transfers

Move items to locations where they’re needed for production or fulfillment

Storage Optimization

Relocate items to more appropriate storage areas

Site Consolidation

Transfer inventory when consolidating or reorganizing warehouse spaces

Available Locations

EnvaSistema supports transfers between the following warehouse locations:

CUAVES

Primary warehouse location

MUEBLE

Furniture storage area

JOSE GALVEZ

José Gálvez facility

ENVA

ENVA main location
The locations are defined in TransferenciaInventarioScreen.kt:29:
val locations = listOf("CUAVES", "MUEBLE", "JOSE GALVEZ", "ENVA")
These locations appear in dropdown menus for origin and destination selection.

Transfer Workflow

1

Navigate to Transfers

From the main menu, tap Movimientos to go directly to the Transferencia de Inventario screen.
Unlike Ingresos and Salidas which have sub-menus, Movimientos goes directly to the transfer screen.
2

Select Origin Location

In the white “UBICACIONES” card:
  1. Tap the Origen dropdown (marked with a green location icon)
  2. Select the location where items currently reside
  3. The dropdown displays ”— Origen —” until a selection is made
The origin field is required (marked with red asterisk *)
3

Select Destination Location

In the same card:
  1. Tap the Destino dropdown (marked with a blue location icon)
  2. Choose where items will be transferred to
  3. The dropdown shows ”— Destino —” as placeholder text
  • The destination field is required (marked with red asterisk *)
  • Origin and destination must be different locations
4

Scan Items to Transfer

Press the lateral button to scan QR codes of items being transferred. The info banner reads: “Escanee los códigos QR de las piezas o mangas a transferir”The counter label shows: “Ítems a transferir” (Items to transfer)
5

Review Transfer Details

Before confirming, verify:
  • Origin location is correct
  • Destination location is correct
  • Origin ≠ Destination
  • Scanned item count is accurate
  • A transfer icon (⇄) appears between the location fields
6

Confirm Transfer

Tap the “Confirmar Transferencia” button (with SyncAlt icon) to execute the transfer.The button is only enabled when:
  • At least one item is scanned
  • Origin is selected
  • Destination is selected
  • Origin ≠ Destination

Screen Layout

The Transferencia de Inventario screen (TransferenciaInventarioScreen.kt:23-204) features a unique dual-location selector layout.

Header Section

  • Title: “Transferencia de Inventario”
  • Subtitle: “MOVIMIENTOS INTERNOS” (Internal Movements)
  • Color: Standard blue (Color(0xFF0061A6))

Location Selector Card

A white elevated card contains:Card Header
  • “UBICACIONES” label in gray
  • 12sp font size with bold weight
  • 0.5sp letter spacing
Two-Column Layout
  • Left column: Origin (Origen)
  • Right column: Destination (Destino)
  • Transfer icon (⇄) centered between columns
  • Each column has equal width (modifier = Modifier.weight(1f))
Each location field uses Material 3 DropdownMenu components:
var showOrigenMenu by remember { mutableStateOf(false) }
var showDestinoMenu by remember { mutableStateOf(false) }
The dropdowns:
  • Show all four locations as options
  • Close automatically after selection
  • Update the respective field value
  • Trigger validation for the save button
The fields use OutlinedCard with clickable modifier to trigger dropdown display:
.clickable { showOrigenMenu = true }

Scanning Interface

Below the location card, the standard scanning interface includes:
  • Info banner: “Escanee los códigos QR de las piezas o mangas a transferir”
  • Large scan area with QR code icon
  • Counter badge with “Ítems a transferir” label
  • Empty state message when no items scanned

Action Button

“Confirmar Transferencia” button features:
  • SyncAlt icon (⇄ arrows)
  • 56dp height
  • Full width with 16dp rounded corners
  • Conditional enabling based on validation logic

Validation Rules

The transfer operation enforces several validation rules to ensure data integrity:
All three components must be completed:
  1. Origin location must be selected
  2. Destination location must be selected
  3. At least one item must be scanned
The save button remains disabled (gray) until all requirements are met.
Origin ≠ Destination RuleThe system prevents transferring items to the same location:
isSaveButtonEnabled = { count ->
  count > 0 && origen.isNotEmpty() && destino.isNotEmpty() && origen != destino
}
This validation ensures logical transfers and prevents database inconsistencies.
The confirmation button dynamically changes based on validation:Disabled State (Gray)
  • No items scanned, OR
  • Origin not selected, OR
  • Destination not selected, OR
  • Origin equals Destination
Enabled State (Blue)
  • All validation rules pass
  • Button becomes tappable
  • Background changes to primary blue

Visual Design Elements

Color Coding

The transfer screen uses strategic color coding for clarity:
ElementColorHex CodePurpose
Origin IconGreen#4CAF50Indicates source location
Destination IconBlue#0061A6Indicates target location
Transfer IconGray#BDBDBDNeutral connector between locations
Required AsteriskRed#FF0000Highlights mandatory fields
Enabled ButtonBlue#0061A6Ready for action
Disabled ButtonGray#B0BEC5Not ready for action

Icon Usage

  • LocationOn Icon: Used for both origin and destination
  • SyncAlt Icon: Bidirectional arrows for transfer action and button
  • ArrowDropDown Icon: Indicates dropdown functionality
  • QrCodeScanner Icon: Standard scanning interface

Spacing and Layout

Key measurements from the implementation:
  • Card padding: 16dp
  • Section spacing: 16dp vertical gaps
  • Icon size: 16dp for location pins, 20dp for transfer icon
  • Icon spacing: 4dp between icon and text
  • Dropdown padding: 12dp inside cards
  • Button height: 56dp
  • Border radius: 12dp for fields, 16dp for cards and buttons

Best Practices

Before starting:
  • Verify destination has physical space for items
  • Confirm items are at the origin location
  • Coordinate with staff at destination location
  • Check if items need special handling during transfer
During selection:
  • Select origin first, then destination
  • Double-check location names before confirming
  • Ensure you have the correct location identifiers
For accuracy:
  • Scan all items being physically transferred
  • Verify each scan registers (watch the counter)
  • Match digital count with physical item count
  • Group related items together when possible
Quality checks:
  • Ensure QR codes are readable
  • Confirm items belong to the origin location
  • Verify items are authorized for transfer
Before confirming:
  • Review origin and destination selections
  • Verify item count is correct
  • Ensure the transfer icon appears between locations
  • Confirm the button is enabled (blue)
After confirmation:
  • Physically move items to destination
  • Update any external documentation
  • Verify items appear in destination inventory
  • File any required paperwork
Common mistakes to avoid:
  • Don’t select the same location for origin and destination
  • Don’t start scanning before selecting locations
  • Don’t transfer items not physically present at origin
  • Don’t confirm without verifying the item count
If you make an error:
  • Use the back button to cancel and restart
  • Reselect locations if needed
  • The system prevents same-location transfers automatically

Technical Implementation

State Management

The screen uses Compose state management:
var origen by remember { mutableStateOf("") }
var destino by remember { mutableStateOf("") }
var showOrigenMenu by remember { mutableStateOf(false) }
var showDestinoMenu by remember { mutableStateOf(false) }
State changes trigger UI recomposition, enabling reactive validation and button state updates.

Reusable Component

The transfer screen extends ScanningLayout with custom:
  • isSaveButtonEnabled lambda for complex validation
  • extraContent parameter for the location selector card
  • Custom counter label: “Ítems a transferir”
  • Custom button text and icon

Validation Lambda

isSaveButtonEnabled = { count ->
    count > 0 && 
    origen.isNotEmpty() && 
    destino.isNotEmpty() && 
    origen != destino
}
This lambda:
  • Receives the current scan count
  • Evaluates all validation rules
  • Returns boolean for button state
  • Runs on every state change

Direct Access: Unlike Ingresos and Salidas which have sub-menus, the Movimientos option in the main menu navigates directly to the Transferencia de Inventario screen.From AppNavigation.kt:96-98:
composable(Screen.Movimientos.route) {
    TransferenciaInventarioScreen(onBackClick = { navController.popBackStack() })
}
  1. Home Screen → Tap “Movimientos” button
  2. Transfer Screen → Appears immediately (no sub-menu)
  3. Back Button → Returns to home screen
The header displays:
  • Title: “Transferencia de Inventario”
  • Subtitle: “MOVIMIENTOS INTERNOS”
  • Back arrow in top-left

Example Scenarios

Scenario: CUAVES has excess inventory that’s needed at MUEBLESteps:
  1. Select Origen: CUAVES
  2. Select Destino: MUEBLE
  3. Scan 15 items at CUAVES location
  4. Confirm transfer shows “15 Ítems a transferir”
  5. Tap “Confirmar Transferencia”
  6. Physically move the 15 items to MUEBLE
  7. Inventory updates automatically

Inbound Operations

Add inventory to locations

Outbound Operations

Remove inventory from locations

Transformations

Change inventory composition

Build docs developers (and LLMs) love