# M18 `udfProducttype` → MTMS `items.type` _Generated: 2026-08-01 10:01 UTC_ **Source of truth** - Enums: `NewItemRequest.kt` → `ItemType`, `M18ItemType` - Sync: `M18MasterDataService.saveProduct` / `saveProducts` (`when (pro.udfProducttype)`) - UI labels (inventory): `FPSMS-frontend/src/i18n/zh/inventory.json` ## Sync mapping | M18 `udfProducttype` (exact string) | `M18ItemType` | MTMS `items.type` | `ItemType` | Inventory UI (zh) | |---|---|---|---|---| | `Consumable Material` | `CONSUMABLES` | `consumables` | `CONSUMABLES` | 消耗品 | | `Non-consumable Material` | `NONCONSUMABLES` | `non-consumables` | `NONCONSUMABLES` | 非消耗品 | | `Product` | `FG` | `fg` | `FG` | 成品 | | `WIP` | `SFG` | `sfg` | `SFG` | 半成品 | | `Item` | `ITEM` | `item` | `ITEM` | 貨品 | | *(any other value / empty)* | — | `mat` | `MATERIAL` | 原料 | ## Enum inventories ### `M18ItemType` | Constant | String value | Used in sync `when`? | |---|---|---| | `CONSUMABLES` | `Consumable Material` | yes | | `NONCONSUMABLES` | `Non-consumable Material` | yes | | `FG` | `Product` | yes | | `SFG` | `WIP` | yes | | `ITEM` | `Item` | yes | ### `ItemType` (MTMS stored values) | Constant | `items.type` | Inventory UI (zh) | |---|---|---| | `MATERIAL` | `mat` | 原料 | | `CONSUMABLES` | `consumables` | 消耗品 | | `NONCONSUMABLES` | `non-consumables` | 非消耗品 | | `FG` | `fg` | 成品 | | `SFG` | `sfg` | 半成品 | | `ITEM` | `item` | 貨品 | ## Known gaps (not auto-mapped) | M18 value seen | Effect | Notes | |---|---|---| | `CMB` | → `mat` (else) | Seen on M18 pro.udfProducttype (e.g. MG1852). Falls through to mat. | Frontend Settings → Items edit also offers `cmb` / `wip` / `nm` as local types; those are **not** written by the current M18 `udfProducttype` mapper. ## Regenerate ```bash python scripts/generate_m18_mapping_docs.py ```