> ## Documentation Index
> Fetch the complete documentation index at: https://muveya.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Android app operations

> Scan a box or a supplier code, record a use, move a box and receive a delivery from the muveya Android app, with every label, rule and message.

This page describes each task of the muveya Android app, step by step, with the labels exactly as the app shows them in English. To install the app, sign in and choose your dental clinic, see [Android app](/docs/en/android/overview).

The app acts with the same session, permissions and warehouse access as the console, and muveya checks every action again on the server. The movements it records are the same ones the console records, and they appear in the box history in the console.

## Permissions at a glance

| Task | Permission | Console label |
| - | - | - |
| Scan a box label and see the box | `inventory.read` | **View inventory** |
| Record a use | `inventory.consume` or `inventory.adjust`, plus `inventory.read` | **Record usage** or **Adjust and count stock**, plus **View inventory** |
| Move a box | `inventory.transfer` or `inventory.adjust`, plus `inventory.read` | **Move boxes between warehouses** or **Adjust and count stock**, plus **View inventory** |
| Receive a delivery by GS1 DataMatrix or by name | `inventory.receive` or `inventory.adjust` | **Receive deliveries** or **Adjust and count stock** |
| Receive by scanning any other supplier barcode | `inventory.receive` or `inventory.adjust`, plus `inventory.read` | As above, plus **View inventory** |

Each task also needs access to the warehouses involved. A box in a warehouse outside your access is treated as if it did not exist. See [Roles and permissions](/docs/en/account/roles-and-permissions).

## How the screens behave

* **Back** at the top left, or the phone's back gesture, goes one step back: from **Record use** or **Move box** to the box, and from any other screen to **Home**. **Menu** then **Home** goes straight to **Home**.
* While the app waits for muveya, it shows **Working…** and ignores a second press of the same button.
* A problem appears in a box at the top of the screen with **Dismiss**. When muveya refuses an action, the app shows muveya's own explanation in the app's language (see **Messages from muveya** at the end of this page).
* Every action needs a connection. Without one, the app shows **No connection. Check the network and try again.**

## Scan or type a code

**Who can do it:** anyone with at least one inventory permission (`inventory.read`, `inventory.receive`, `inventory.consume`, `inventory.transfer` or `inventory.adjust`). Without any of them, **Home** shows **Your access in this organization does not include inventory. Ask an administrator for it.**

**Where:** **Home**.

<Steps>
  <Step title="Scan">
    Press **Scan a code** (**A box label or a supplier barcode.**). The Google code scanner opens full screen. Point it at a box label, a product barcode or a GS1 DataMatrix; it zooms in by itself. Closing the scanner without reading anything changes nothing.
  </Step>

  <Step title="Or type it">
    Type the code in **Or type the code** (up to 64 characters) and press **Look up** or the keyboard's search key.
  </Step>

  <Step title="See where the code takes you">
    The app opens the box, the receiving form, a choice between supplies, or **Code not recognized**, as described below.
  </Step>
</Steps>

The same scanner opens from **Scan another code** on the box screen and on **Code not recognized**, and from **Receive another** after a receipt.

### What the app does with a code

```mermaid theme={null}
flowchart TD
  A[Code scanned or typed] --> B{GS1 DataMatrix?}
  B -- No --> C{A box in your warehouses has this code?}
  C -- Yes --> D[Box screen]
  C -- No --> E{Can you receive?}
  B -- Yes --> E
  E -- No --> U[Code not recognized]
  E -- Yes --> F{Supplier code registered in the catalog?}
  F -- One active presentation --> R[Receive screen]
  F -- Several presentations --> H[Which supply is it?]
  H --> R
  F -- None or retired --> U
```

1. The app removes spaces at either end of the code. A code that is empty, longer than 64 characters or contains control characters shows **That code cannot be read. Scan it again or type it.**
2. If the code is not a GS1 DataMatrix, the app looks for a box with exactly that code in the warehouses you can reach. A box code must match the label exactly. If one is found, the box screen opens.
3. Otherwise, if you can receive, the app looks the code up among the supplier codes registered on the catalog's presentations. That lookup ignores spaces, hyphens and upper or lower case, and only active codes count.
4. One active presentation opens the receiving form with that presentation chosen. Several presentations open **Which supply is it?**: **The code 7501234567893 names more than one presentation.**, with one row per active presentation (supply name, then presentation name). Press the one that arrived.
5. Anything else, or a code whose presentation is retired, opens **Code not recognized**.

<Warning>
  Looking for a box needs `inventory.read`. Without it, scanning a box label or a supplier barcode that is not a GS1 DataMatrix shows **The operation is not allowed.** Ask for **View inventory**, or receive the supply by name.
</Warning>

### Code not recognized

The screen says **No box or supply you can reach has the code** followed by the code. If you can receive, it adds **Ask an administrator to register this code in the web app, or receive the supply by name.** and the **Receive a supply without a code** button. **Scan another code** opens the scanner again.

A code is not recognized when no box in your warehouses has it and, for people who can receive, no active presentation carries it. To make a supplier code scannable, a catalog manager registers it on the presentation in the console; see [Presentations and codes](/docs/en/catalog/presentations-and-codes).

### GS1 DataMatrix codes

Many dental supplies carry a GS1 DataMatrix, a small square code that holds the product's GTIN and often its lot and expiry date. The app recognizes one when the code starts with `01` followed by 14 digits and carries more data after them.

| Part of the code | What the app does |
| - | - |
| `01` and 14 digits (GTIN) | Looks up the supply by those 14 digits. It does not look for a box. |
| `17` and a date as YYMMDD (expiry) | Fills **Expiry date (YYYY-MM-DD)**. A day of `00` means the last day of that month. |
| `10` and up to 20 characters (lot) | Fills **Lot**. |
| `11`, `13`, `15`, `16` (other dates) and `21` (serial number) | Skipped. The serial number is not filled in. |
| Anything else | The app stops reading at that point. |

When the lot or the expiry date was read, the receiving form says **The lot and expiry date were read from the label. Check them before receiving.** They are suggestions: check them against the package before you press **Receive**.

<Warning>
  The GTIN is looked up with the 14 digits the DataMatrix holds, leading zero included (for example `07501234567893`). If the presentation's GTIN is registered in the catalog in its 13-digit form (`7501234567893`), the DataMatrix is not recognized: register the 14-digit form on the same presentation as well.
</Warning>

## See a box

**Who can do it:** `inventory.read`, with access to the box's warehouse.

The box screen is titled **Box** followed by the box code, for example **Box BX-000123**, with the supply name below it.

| Field | Content |
| - | - |
| **Available** | What can still be used: on hand minus units reserved for orders, with the unit, for example `40 Unit`. |
| **Location** | The name of the box's warehouse. |
| **Status** | **Active**, **In quarantine**, **Expired**, **Used up**, **Disposed** or **In transit**. |
| **Lot** | Shown only if the box has a lot. |
| **Expires** | The expiry date as YYYY-MM-DD, if the box has one. When the date has passed on your phone's calendar, the screen shows **Expired on 2026-08-31** instead. |

Units are shown as **Unit**, **Box**, **Pack**, **Bottle**, **Ampoule**, **Milliliter**, **Liter**, **Gram**, **Kilogram**, **Pair** or **Kit**. When a name cannot be read, the screen shows **Name not available**. If the box's unit is waiting for a review, the screen says **This box's unit needs a review in the web app before it is used.**

The actions below the details depend on the box and on your permissions:

| Button | Shown when |
| - | - |
| **Record use** | You can consume, the box is **Active**, its unit needs no review and **Available** is above zero. |
| **Move to another warehouse** | You can move boxes and the box is **Active**. |
| **Scan another code** | Always. |

The app does not show the box's movements, its separated containers or its label. Open the box in the console for those; see [Boxes and labels](/docs/en/inventory/boxes).

## Record a use

**Who can do it:** `inventory.consume` (**Record usage**) or `inventory.adjust`, plus `inventory.read`, with access to the box's warehouse.

**Where:** the box screen, **Record use**.

<Steps>
  <Step title="Open the box">
    Scan its label or type its code on **Home**.
  </Step>

  <Step title="Press Record use">
    The **Record use** screen shows the supply and **Box** with its code.
  </Step>

  <Step title="Quantity">
    Type how many units left in **Quantity**. It starts at 1 and accepts digits only. The hint shows the limit, for example **Up to 40 available**.
  </Step>

  <Step title="Room or area">
    Choose one under **Room or area**. When the location has only one active room or area, it is already chosen.
  </Step>

  <Step title="What happened">
    For a room that is not counted, choose **Handed to the room or area** (chosen by default) or **Used right away** under **What happened**.
  </Step>

  <Step title="Purpose">
    Choose the **Purpose**: **Not specified** (default), **Procedure**, **Cleaning**, **Administrative** or **Other**.
  </Step>

  <Step title="Responsible">
    Under **Responsible**, **You** is chosen. You can choose another active team member by name.
  </Step>

  <Step title="Record use">
    Press **Record use**. The app returns to the box and confirms, for example, **5 recorded. 35 left in this box.**
  </Step>
</Steps>

The **Record use** button stays disabled until the quantity is between 1 and the available quantity and, when the location has rooms or areas, one is chosen.

### When the room counts its own stock

A room or area with counted stock accepts only direct uses, and only from a box that is already at its stock point. If you choose such a room and the box is somewhere else, the screen says, for example, **Room 2 counts its own stock. Take the whole box there first.** and **Record use** stays disabled.

* If you can move boxes, press **Take this box to Room 2**. The whole box moves to the room's stock point and you stay on **Record use**, now able to record the use.
* If you cannot, the screen says **Ask someone who can move boxes to take this box to Room 2.**

When the box is already at the room's stock point, the screen says **Used from this room's counted stock.** and the use is recorded as a direct use. See [Rooms and areas](/docs/en/locations/destinations).

### When no room or area is offered

The screen says **This clinic has no rooms or areas yet, so this use will not say where it went.** **What happened**, **Purpose** and **Responsible** are not shown, and the use is recorded without a room, a purpose or a responsible. Such uses do not appear in **Usage by room** in the console.

You also see this message for a box in a **Central** warehouse: the app offers rooms only for boxes in an express warehouse, those of that warehouse's location. To record where a use from a central warehouse went, use the console, which offers the rooms of every location. See [Record use and move boxes](/docs/en/inventory/use-and-moves).

### Rules

| Rule | Detail |
| - | - |
| Quantity | Whole number from 1 to the box's **Available** quantity (up to 1,000,000). The app does not let you use units reserved for an order. |
| Box | **Active**, not past its expiry date, and with a confirmed unit. |
| Room or area | Active and from the box's location. A counted room accepts only direct use from its stock point. |
| Responsible | An active member of the dental clinic. |
| Care reference | Not available in the app. To record one, use the console. |

### What the system records

One `consume` movement that subtracts the quantity from the box, with you as the person who recorded it and, when you chose a room, the room or area, what happened (`issue` or `use`), the purpose and the responsible. When on hand reaches zero, the box becomes **Used up**. The movement appears in the box history and in the [consumption report](/docs/en/reports/consumption).

### What can go wrong

| Message | Cause | What to do |
| - | - | - |
| **That use was already recorded; nothing changed. 35 left in this box.** | The same use was already sent, for example after a lost answer. | Nothing. It was recorded once. |
| **This room keeps counted stock of its own. Move the box to the room's stock first, then record the use there.** | The room counts its own stock and the box is not at its stock point. | Take the box to the room first. |
| **This box belongs to a different location than the chosen room or area, or it moved while you were recording. Check where the box is and try again.** | The box moved while the form was open. | Go back, open the box again and repeat. |
| **The chosen room or area does not exist in this workspace or is no longer active.** | The room was deactivated. | Go back and choose another room. |
| **The responsible person must be an active member of this workspace.** | The responsible left the team. | Choose another person. |
| **The box does not have enough on-hand quantity for this operation.** | Someone used units from the box meanwhile. | Open the box again and check **Available**. |
| **This box has expired. Choose another box to continue.** | The box is past its expiry date. | Use another box. See [Boxes and labels](/docs/en/inventory/boxes) to take it out of use. |
| **The box is in a state that does not allow this movement.** | The box is no longer **Active**. | Open the box again to see its status. |
| **This stock has no verified unit identity. Review it before recording another movement.** | The box's unit needs a review. | Ask a catalog manager to review it in the console. |

## Move a box

**Who can do it:** `inventory.transfer` (**Move boxes between warehouses**) or `inventory.adjust`, plus `inventory.read`, with access to both warehouses.

**Where:** the box screen, **Move to another warehouse**.

<Steps>
  <Step title="Open the box">
    Scan its label or type its code, then press **Move to another warehouse**.
  </Step>

  <Step title="Choose where to">
    The **Move box** screen shows the supply and the box code. Under **Where to**, choose one of the active warehouses you can reach. The box's current warehouse is not listed. When only one is possible, it is already chosen.
  </Step>

  <Step title="Move">
    Press **Move box**. There is no confirmation step. The app returns to the box and says, for example, **The box is now in Express Norte.**
  </Step>
</Steps>

When no other warehouse is available, the screen says **There is no other warehouse you can move this box to.**

**Rules:** a move takes the whole box, with its code, lot, expiry date and quantities; units reserved for an order stay reserved. The box must be **Active** and not past its expiry date, and the destination must be active. To move only part of a box, separate it first in the console. Moving a box is marked as a sensitive action; in the current release a second factor is optional and does not block it (see [Account security](/docs/en/account/security)).

**What the system records:** two movements with a change of `0` and a shared transfer identity, `transfer_out` from the origin and `transfer_in` into the destination, and the box's new warehouse. The same happens when you press **Take this box to** a room on **Record use**.

| Message | Cause | What to do |
| - | - | - |
| **This warehouse is deactivated: stock can no longer be received into it or moved to it.** | The destination was deactivated. | Choose another warehouse. |
| **A transfer must target a warehouse different from the box's current one.** | The box is already there, for example after another move. | Open the box again. |
| **The box is in a state that does not allow this movement.** | The box is no longer **Active**. | Open the box again to see its status. |
| **This box has expired. Choose another box to continue.** | The box is past its expiry date. | Take it out of use in the console. |

## Receive a delivery

**Who can do it:** `inventory.receive` (**Receive deliveries**) or `inventory.adjust`, with access to the warehouse you receive into. Scanning a supplier barcode that is not a GS1 DataMatrix also needs `inventory.read` (see **What the app does with a code** above).

Each receipt creates **one new box** in one warehouse. If a delivery brings several containers you want to track separately, receive each one as its own box.

**Before you start:** the supply must be active in the catalog, and to receive by scanning, the supplier code must be registered on one of its presentations. See [Presentations and codes](/docs/en/catalog/presentations-and-codes).

### Open the receiving form

<Tabs>
  <Tab title="Scan the supplier code">
    On **Home**, press **Scan a code** and scan the barcode or the GS1 DataMatrix on the package, or type the code in **Or type the code**. One match opens the **Receive** form with that presentation chosen. If the code names several presentations, choose one on **Which supply is it?**.
  </Tab>

  <Tab title="Choose the supply by name">
    On **Home**, press **Receive a supply without a code** (it also appears on **Code not recognized**). The **Receive a supply** screen lists active supplies in alphabetical order, each with its unit. Type in **Supply name** to narrow the list: the search looks at names only, ignores upper case and accents, and shows at most 50 results. With no match, it says **No active supply matches.** Press a supply to open the **Receive** form.
  </Tab>
</Tabs>

### Fill in the form

<Steps>
  <Step title="Received as">
    Under **Received as**, choose one of the supply's active presentations, shown as name and content, for example `Box of 100 (100 Unit)`, or **Loose units** followed by the unit, for example **Loose units (Unit)**. A scanned presentation is already chosen. When you choose the supply by name, the only presentation is chosen if there is one; otherwise **Loose units** is chosen, so check this first.
  </Step>

  <Step title="How many">
    Type the count in **How many**. It starts at 1. The hint shows the result in base units, for example **Total: 300 Unit** for three boxes of 100. This total is what enters the ledger.
  </Step>

  <Step title="Warehouse">
    Under **Warehouse**, choose where the box goes among the active warehouses you can reach. With only one, the screen says **Into** followed by its name. With none, it says **You cannot receive into any warehouse. Ask an administrator.**
  </Step>

  <Step title="Tracking data">
    Fill in **Lot**, **Expiry date (YYYY-MM-DD)** and **Serial numbers, one per line** when they appear. They appear only for supplies that track them. See the rules below.
  </Step>

  <Step title="Box label (optional)">
    Type the code written on the container in **Box label (optional)**, or press **Scan label** to read it. Leave it empty and muveya creates a code: **Leave it empty and Muveya creates one you can print from the web app.**
  </Step>

  <Step title="Receive">
    Press **Receive**. The button stays disabled until the count is above zero and a warehouse is chosen.
  </Step>

  <Step title="Check the result">
    The **Received** screen says, for example, **Nitrile gloves M is in box BX-7K3QM9.** Press **View box** to open it, **Receive another** to scan the next code, or **Home**.
  </Step>
</Steps>

Label the new box: print its label from the box screen in the console, or write the code on the container. See [Boxes and labels](/docs/en/inventory/boxes).

### Tracking data and box label

| Field | Shown when | Rules |
| - | - | - |
| **Lot** | The supply tracks lots. | Required, not blank, up to 120 characters. |
| **Expiry date (YYYY-MM-DD)** | The supply tracks expiry. | Required, a real date written as YYYY-MM-DD, today or later (UTC). |
| **Serial numbers, one per line** | The supply tracks serial numbers. | One per base unit received; the hint says how many are needed, for example **3 needed**. Separate them with new lines or commas. No blanks, no repeats, up to 120 characters each, and never a serial already received for this supply. |
| **Box label (optional)** | Always. | Up to 64 characters, spaces at either end removed, unique in your dental clinic. |

The app checks some of these before sending and shows:

| Message | Meaning |
| - | - |
| **Enter a whole quantity greater than zero.** | The count is not between 1 and 1,000,000. |
| **Choose how it was received.** | The chosen presentation is no longer available. |
| **Choose a warehouse.** | No valid warehouse is chosen. |
| **Enter the lot.** | The supply tracks lots and **Lot** is empty. |
| **Enter the expiry date as YYYY-MM-DD.** | The supply tracks expiry and the date is missing or not a real date. |
| **Enter one serial number per unit received.** | The number of serials is not the count multiplied by the presentation's content. |

### What the system records

A new **Active** box with its code, supply, warehouse, quantity in base units, reception time and unit and, when they apply, the presentation (with its version and count), lot, serial numbers and expiry date. One `receive` movement adds the quantity to on hand, with you as the person who recorded it. This is the same receipt the console records; see [Receive stock](/docs/en/inventory/receive).

### What can go wrong

| Message | Cause | What to do |
| - | - | - |
| **This receipt was already recorded; nothing changed.** | The same receipt was already sent, for example after a lost answer. The **Received** screen names the existing box. | Nothing. Only one box was created. |
| **Enter a valid expiry date that is today or later in UTC.** | The date is in the past, for example one read from an old label. | Check the package and correct the date. |
| **Enter a lot number with at least one non-space character.** | The lot is only spaces. | Type the lot. |
| **These serial numbers were already received for this supply: SN-0042. A serial number identifies one unit: check the package, or correct the original box with an adjustment.** | A serial belongs to an existing box of the supply. Nothing was received. | Check the serials. If the earlier box is wrong, see [Corrections](/docs/en/inventory/corrections). |
| **Use a whole quantity and one distinct, non-empty serial number for each unit.** | The serials are repeated or blank. | Correct the list. |
| **Another stock box in this workspace already uses this code.** | The box label is already in use. | Type another label or leave it empty. |
| **This presentation was corrected after you reviewed it. Nothing was received: review its current content and confirm again.** | The presentation's content changed while the form was open. | Go back, open the form again and check the count. |
| **This presentation no longer accepts new entries. Its past movements are unchanged.** | The presentation was retired. | Choose another presentation or **Loose units**. |
| **The unit changed or is already fixed for use. Reload the item and review its unit before continuing.** | The supply's unit changed while the form was open. | Go back and open the form again. |
| **This item has no verified unit configuration. Review the catalog configuration before continuing.** | The supply's unit is not confirmed in the catalog. | Ask a catalog manager to confirm it in the console. |
| **This warehouse is deactivated: stock can no longer be received into it or moved to it.** | The warehouse was deactivated. | Choose another warehouse. |

## Sending twice and lost connections

Every use, move and receipt carries an internal operation key, so muveya never records it twice.

* If the connection drops or muveya does not answer in time, the app shows **No connection. Check the network and try again.** and keeps the key. Press the same button again **without changing anything**. Either the action is recorded now, or the app tells you it was already recorded.
* If you change the details before pressing again and the first attempt had in fact been recorded, the app shows **This action changed while it was being sent. Check it and send it again.** Check the box first: open it again, or look at it in the console. After this message, the next press counts as a new action.
* After a successful action, the next press is a new action. Two identical deliveries received one after the other are two boxes, as they should be.

## Messages from muveya

When muveya refuses an action, the app shows the explanation muveya sends, in the app's language. The most common ones, besides those listed in each task:

| Message | Meaning | What to do |
| - | - | - |
| **The operation is not allowed.** | You lack the permission for this action, for example `inventory.read` to look up a box. | Ask an administrator for it in **Team**, then refresh your access (**Menu**, **Change organization**, **Refresh access**). |
| **The requested stock box does not exist in this workspace.** | The box no longer exists or is outside your warehouses. | Check the code, or ask for access to its warehouse. |
| **The warehouse to receive into does not exist in this workspace.** | The warehouse is outside your access or no longer exists. | Choose another warehouse. |
| **The request cannot be processed.** | A value is out of range. | Check what you entered. |
| **Too many requests. Try again later.** | Too many requests in a short time. | Wait a moment and try again. |
| **The service is temporarily unavailable.** | muveya is briefly unavailable. | Try again in a few minutes. |
| **It could not be completed. Try again.** | muveya gave no explanation. | Try again. If it persists, write to [team@muveya.com](mailto:team@muveya.com). |
| **Your access does not allow this. Ask an administrator.** | A permission refusal without an explanation. | Ask an administrator. |
| **The scanner is not available on this phone. Type the code instead.** | The Google code scanner could not start, for example without Google Play services. | Type the code in **Or type the code**. |
| **We could not open a browser. Check that one is available and try again.** | A **Waiting for you** row could not open the console. | Install or enable a browser. |

If muveya reports that your session ended, the app returns to the sign-in screen; see **Sessions and signing out** in [Android app](/docs/en/android/overview). For other cases, see [Troubleshooting](/docs/en/help/troubleshooting).

## Related pages

<CardGroup cols={2}>
  <Card title="Android app" icon="android" href="/docs/en/android/overview">
    Availability, requirements, sign-in, language and privacy.
  </Card>

  <Card title="Receive stock" icon="truck-ramp-box" href="/docs/en/inventory/receive">
    The console receipt, with every option.
  </Card>

  <Card title="Record use and move boxes" icon="arrow-right-arrow-left" href="/docs/en/inventory/use-and-moves">
    Rooms, care references, usage by room and later attribution.
  </Card>

  <Card title="Boxes and labels" icon="box-open" href="/docs/en/inventory/boxes">
    Box history, labels and taking a box out of use.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.