Odoo 17で倉庫管理を極める | 第3回: 入出庫と内部移動の管理

## 記事の概要
Odoo 17の**Inventoryモジュール**は、**入出庫**や**内部移動**といった倉庫管理の基本プロセスを効率化します。第2回ではOdoo 17のインストールと基本設定を学びました。第3回では、**入出庫**と**内部移動**の具体的な運用方法を詳細に解説します。**購買**や**販売**との連携、**バーコード**を活用した作業の高速化、そしてプロセス自動化の設定も紹介します。実践を通じて、OdooのWMSがどのように業務を効率化するかを体験します。

---

## 入庫プロセスの設定と運用

**入庫**は、仕入先から商品を受け取り、倉庫に登録するプロセスです。Odoo 17では、**購買モジュール**と連携することで、入庫作業をスムーズに管理できます。

### 入庫の手順
1. **購買オーダーの作成**:
   - 「購買」→「発注書」→「新規」に移動。
   - 仕入先、製品、数量（例: Tシャツ100個）を入力。
   - 「確認」をクリックして**発注書**を確定。
2. **商品の受け取り**:
   - 発注書に紐づく「入庫」ボタンが表示されるのでクリック。
   - 入庫画面で、受け取った**数量**を確認・入力（例: 100個）。
   - 「検証」をクリックして**在庫**を更新。
3. **在庫の確認**:
   - 「在庫」→「製品」に移動し、Tシャツの在庫数量が更新されたことを確認。

### バーコードを使った入庫
Odoo 17の**バーコード機能**（Enterprise版推奨）を使用すると、入庫作業を高速化できます。
- **設定**:
  - 「在庫」→「設定」→「**バーコード**」を有効化。
  - 製品に**バーコード**（例: EAN13）を登録。
- **操作**:
  - **バーコードスキャナー**で製品をスキャン。
  - 数量を入力し、自動で入庫レコードを更新。

以下は、製品にバーコードをプログラムで追加する例です：
```python
from odoo import models, fields

class ProductTemplate(models.Model):
    _inherit = 'product.template'

    barcode = fields.Char('バーコード')
    
    def assign_barcode(self, product_id, barcode):
        product = self.browse(product_id)
        product.write({'barcode': barcode})
```

**注意点**:
- Community版では**バーコード機能**が制限されるため、Enterprise版の試用を推奨。
- スキャナーはUSB接続またはBluetooth対応のものを選択。

---

## 出庫プロセスの設定と運用
**出庫**は、顧客への商品発送や販売に伴う在庫の引き出しを管理します。**販売モジュール**と連携することで、出庫を効率化できます。

### 出庫の手順
1. **販売オーダーの作成**:
   - 「販売」→「販売オーダー」→「新規」に移動。
   - 顧客、製品、数量（例: Tシャツ50個）を入力。
   - 「確認」をクリックして**販売オーダー**を確定。
2. **商品の発送**:
   - 販売オーダーに紐づく「配送」ボタンをクリック。
   - 出庫画面で、発送する**数量**を確認・入力。
   - 「検証」をクリックして**在庫**を更新。
3. **在庫の確認**:
   - 「在庫」→「製品」に移動し、Tシャツの在庫が50個減ったことを確認。

### バーコードを使った出庫
入庫と同様、**バーコードスキャナー**で出庫作業を迅速化できます。
- 出庫画面で製品の**バーコード**をスキャン。
- 数量を入力し、自動で出庫レコードを更新。

**実践例**:
- **販売オーダー**でTシャツ50個を顧客Aに販売。
- **バーコードスキャナー**でTシャツをスキャンし、50個を出庫。
- 在庫が100個から50個に更新される。

---

## 内部移動の設定と運用
**内部移動**は、同一倉庫内の異なる保管場所間や、異なる倉庫間で商品を移動するプロセスです。たとえば、棚Aから棚Bへの移動や、**東京倉庫**から**大阪倉庫**への移動を管理します。

### 内部移動の手順
1. **内部移動の作成**:
   - 「在庫」→「オペレーション」→「**内部移動**」→「新規」に移動。
   - 以下を入力：
     - 移動元（例: **東京倉庫**/棚A）
     - 移動先（例: **東京倉庫**/棚B）
     - 製品と数量（例: Tシャツ20個）
   - 「検証」をクリックして移動を完了。
2. **在庫の確認**:
   - 「在庫」→「在庫評価」に移動し、棚Aと棚Bの**在庫数量**を確認。

### バーコードを使った内部移動
- 内部移動画面で、移動元の製品を**スキャン**。
- 移動先の**保管場所**をスキャン（場所にもバーコードを設定可能）。
- 数量を入力し、移動を確定。

以下は、内部移動をプログラムで実行する例です：
```python
from odoo import models, fields, api

class StockMove(models.Model):
    _inherit = 'stock.move'

    @api.model
    def create_internal_move(self, product_id, qty, source_loc, dest_loc):
        move = self.create({
            'name': '内部移動',
            'product_id': product_id,
            'product_uom_qty': qty,
            'location_id': source_loc,
            'location_dest_id': dest_loc,
        })
        move._action_confirm()
        move._action_done()
```

**実践例**:
- **東京倉庫**/棚Aから**大阪倉庫**/棚1へTシャツ30個を移動。
- **バーコード**で製品と移動先をスキャンし、移動を確定。
- 在庫評価で、両倉庫の在庫が正しく更新されたことを確認。

---

## 入出庫と内部移動の自動化
Odoo 17では、ルール設定によりプロセスを**自動化**できます。以下は簡単な例です：

### 自動入庫の設定
- 「購買」→「設定」→「**発注ルール**」を有効化。
- 発注が確定すると、自動で**入庫オペレーション**を生成。

### 自動出庫の設定
- 「販売」→「設定」→「**自動配送**」を有効化。
- 販売オーダーの確認後、**配送オペレーション**が自動生成。

### 内部移動の自動化
- 「在庫」→「設定」→「**ルート**」に移動。
- 例: 特定の製品が**東京倉庫**に入庫したら、自動で棚Aに移動するルールを設定。

**コード例**（自動ルートの設定）:
```python
from odoo import models, fields

class StockRoute(models.Model):
    _inherit = 'stock.route'

    name = fields.Char('ルート名')
    rule_ids = fields.One2many('stock.rule', 'route_id', 'ルール')

    def create_auto_move_rule(self):
        self.env['stock.rule'].create({
            'name': '東京倉庫→棚A',
            'route_id': self.id,
            'location_src_id': self.env.ref('stock.stock_location_stock').id,
            'location_dest_id': self.env.ref('custom.shelf_a').id,
            'action': 'push',
        })
```

**注意点**:
- **自動化ルール**は慎重にテストし、意図しない在庫移動を防ぐ。
- Enterprise版では、より複雑な**ルーティング**が可能。

---

## 実践: 入出庫と内部移動のシナリオ
以下のシナリオで、プロセスを一通り実行します：

1. **入庫**:
   - 仕入先から**スマートフォン**200台を**東京倉庫**/棚Aに受け入れる。
   - **バーコードスキャナー**で製品をスキャンし、200台を登録。
2. **内部移動**:
   - **スマートフォン**100台を**東京倉庫**/棚Aから**大阪倉庫**/棚1に移動。
   - 移動元と移動先を**バーコード**でスキャン。
3. **出庫**:
   - 顧客Bに**スマートフォン**50台を**大阪倉庫**から発送。
   - **販売オーダー**を確認後、**バーコード**で出庫を完了。

**結果確認**:
- 「在庫」→「在庫評価」で、以下を確認：
  - **東京倉庫**/ SCP shelfA: **スマートフォン**100台
  - **大阪倉庫**/棚1: **スマートフォン**50台

---

## トラブルシューティング
**入出庫**や**内部移動**で発生しがちな問題と解決策を以下にまとめます：
- **在庫数量の不一致**: 入出庫の検証前に**数量**を再確認。キャンセル済みのオペレーションがないかチェック。
- **バーコードが認識されない**: **バーコード形式**（EAN13など）を確認。スキャナーの設定を調整。
- **自動化ルールの失敗**: **ルート**の条件（場所、製品など）が正しいか確認。ログでエラーを調査。
- **パフォーマンス低下**: 大量の移動データがある場合、インデックスを最適化。

Odooの[公式ドキュメント](https://www.odoo.com/documentation/17.0/)やフォーラムを参照すると、詳細な解決策が見つかります。

---

## まとめと次回予告
Odoo 17の**Inventoryモジュール**を使い、**入出庫**と**内部移動**の基本プロセスを習得しました。**バーコード**による作業の高速化や、**自動化ルール**の設定により、倉庫業務の効率が飛躍的に向上します。実践シナリオを通じて、**購買**や**販売**との連携も理解できたはずです。

次回は、**在庫戦略**（FIFO、FEFO）、**自動補充**、**ロット/シリアル番号追跡**など、Odoo WMSの高度な機能を解説します。よりスマートな倉庫管理を目指して、ぜひお楽しみに！

---

この記事が役に立ったら、**いいね**や**ストック**をお願いします！Odoo WMSのシリーズを一緒に学びましょう！