iDempiere 梱包記録伝票の使い方|販売管理 操作マニュアル・技術仕様
📖 販売管理の全体像: 販売管理の全体図 も合わせてご覧ください。
梱包記録伝票(Package)は、1件の出荷伝票をどの箱に、どの明細を、いくつ詰めたかを記録する伝票です。運送会社・出荷日・追跡情報を保持し、運送会社とのオンライン連携(送料照会・出荷登録・出荷取消・ラベル印刷)の実行単位にもなります。
⚠️ 注意: このウィンドウ(AD_Window_ID: 319)は iDempiere 13 標準では無効化されており、標準メニューにも登録されていません(旧バージョンからの互換用)。実際の梱包データは、出荷伝票からの梱包作成処理や配送トランザクション経由で間接的に生成・参照されるのが標準的な使い方です。
📌 ポイント: 「箱数(
BoxCount)」を増やして保存すると、その差分だけM_PackageMPS(複数梱包)レコードが自動生成されます。梱包明細(M_PackageLine)は箱(MPS)に紐づくため、箱数を先に確定してから明細を割り当てるのが正しい順序です。
梱包記録伝票でできること
Section titled “梱包記録伝票でできること”- 出荷伝票(
M_InOut)に紐づく梱包単位の登録 - 運送会社(Shipper)と出荷日の指定
- 箱数(BoxCount)の指定と、箱ごとの梱包単位(
M_PackageMPS)の自動生成 - 梱包明細への出荷明細・品目・数量の割り当て(BOM 構成品への展開を含む)
- 重量・長さ・幅・高さ、重量単位/長さ単位の記録
- 追跡番号(トラックNo)・追跡情報・受付情報の記録
- 保険金額・代金引換(COD)・土曜配達・危険物などの配送オプション指定
- 運送会社とのオンライン処理(送料照会・出荷登録・出荷取消・ラベル印刷)
梱包記録伝票はヘッダー+明細の2タブ構成です。
graph TD
subgraph "梱包記録伝票ウィンドウ(Window ID: 319)"
T1["📦 梱包<br/>M_Package<br/>11項目"]
T2["📋 梱包詳細<br/>M_PackageLine<br/>6項目"]
end
T1 --> T2
| タブ名 | テーブル | 項目数 | 役割 |
|---|---|---|---|
| 梱包 | M_Package | 11項目 | ヘッダー(伝票番号・出荷伝票・運送会社・出荷日・追跡情報) |
| 梱包詳細 | M_PackageLine | 6項目 | 梱包に詰めた出荷明細と数量 |
💡 ヒント: ウィンドウ上に表示される項目は上記のとおり少数ですが、
M_Packageテーブル自体は重量・寸法・配送オプション・オンライン処理ボタンなど 80 近いカラムを持っています。運送会社連携で使われる項目の多くは配送トランザクション画面側から操作します。
基本操作手順
Section titled “基本操作手順”graph TD
A["🚚 出荷伝票を作成・完了"] --> B["🚀 梱包記録伝票を開く<br/>(標準メニュー未登録のため<br/>ロール設定でメニュー追加が必要)"]
B --> C["➕ 新規ボタンをクリック"]
C --> D["📄 伝票番号・出荷伝票・<br/>運送会社を入力"]
D --> E["📅 出荷日を確認<br/>(新規時は当日が自動セット)"]
E --> F["💾 保存<br/>→ 箱数分の梱包単位が自動生成"]
F --> G["📋 梱包詳細タブで<br/>出荷明細と数量を割り当て"]
G --> H{運送会社と<br/>オンライン連携?}
H -->|する| I["🌐 送料照会・出荷登録を実行<br/>→ 追跡番号・送料を取得"]
H -->|しない| J["✏️ 追跡情報を手入力"]
I --> K["✅ 梱包記録完了"]
J --> K
アクセス方法(メニューパス)
Section titled “アクセス方法(メニューパス)”このウィンドウは iDempiere 13 標準ではメニューに登録されていません。利用する場合はシステム管理者がメニュー(AD_Menu)へウィンドウ ID 319 を追加し、ロールにアクセス権を付与する必要があります。
- 「新規」ボタンをクリック
- ヘッダー情報を入力:
- 伝票番号(必須): 梱包記録の伝票番号
- 入荷伝票(必須): 対象の出荷/入荷伝票(
M_InOut) - 運送会社(必須): 配送を委託する運送会社
- 出荷日: 新規作成時は当日日付が自動セットされます
- 説明: 補足説明
- 「保存」をクリック
💡 ヒント: 新規レコードでは、重量単位(
C_UOM_Weight_ID)と長さ単位(C_UOM_Length_ID)がクライアント情報(AD_ClientInfo)の既定値から自動セットされます。単位がセットされない場合は、システム管理者にクライアント情報の設定を確認してください。
梱包明細の登録
Section titled “梱包明細の登録”- 「梱包詳細」タブに移動
- 「新規」ボタンをクリック
- 明細情報を入力:
- 入荷明細(必須): 対象の出荷明細行(
M_InOutLine) - 数量(必須): この箱に詰めた数量
- 説明: 補足説明
- 入荷明細(必須): 対象の出荷明細行(
- 「保存」をクリック
📌 ポイント: 出荷明細を選択すると、内部的には出荷明細の移動数量(
MovementQty)が数量へコピーされます(MPackageLine.setInOutLine())。分割梱包する場合は、コピーされた数量を実際に詰めた数へ修正してください。
追跡情報の記録
Section titled “追跡情報の記録”運送会社とのオンライン連携を使わない場合は、以下を手入力して追跡情報を残します。
- 追跡情報: 追跡用の URL や説明
- 受取日付: 相手先に到着した日付
- 受付情報: 受領確認の内容
項目リファレンス
Section titled “項目リファレンス”梱包タブ(画面表示項目)
Section titled “梱包タブ(画面表示項目)”| 項目名 | カラム | 必須 | 型 | 説明 |
|---|---|---|---|---|
| クライアント | AD_Client_ID | 必須 | 選択 | テナント |
| 組織 | AD_Org_ID | 必須 | 選択 | 組織 |
| 伝票番号 | DocumentNo | 必須 | 文字列(30) | 梱包記録の伝票番号(更新不可) |
| 入荷伝票 | M_InOut_ID | 必須 | 検索 | 対象の出荷/入荷伝票(更新不可) |
| 運送会社 | M_Shipper_ID | 必須 | 選択 | 配送方法・運送会社 |
| 出荷日 | ShipDate | - | 日付 | 出荷日(新規時は当日が自動セット) |
| 追跡情報 | TrackingInfo | - | 文字列(255) | 追跡情報 |
| 受取日付 | DateReceived | - | 日付 | 到着日 |
| 受付情報 | ReceivedInfo | - | 文字列(255) | 受領確認の内容 |
| 説明 | Description | - | 文字列(255) | 補足説明 |
| 有効 | IsActive | 必須 | チェック | レコードが有効か(既定: Y) |
梱包詳細タブ
Section titled “梱包詳細タブ”| 項目名 | カラム | 必須 | 型 | 説明 |
|---|---|---|---|---|
| 梱包 | M_Package_ID | 必須 | 検索 | 親の梱包(更新不可) |
| 入荷明細 | M_InOutLine_ID | 必須 | 選択 | 出荷/入荷明細行(更新不可) |
| 数量 | Qty | 必須 | 数量 | 詰めた数量(既定: 0) |
| 説明 | Description | - | 文字列(255) | 補足説明 |
| 有効 | IsActive | 必須 | チェック | レコードが有効か |
主なテーブル専用カラム(画面非表示)
Section titled “主なテーブル専用カラム(画面非表示)”| カラム | 型 | 説明 |
|---|---|---|
| BoxCount | Integer | 箱数(既定 1)。保存時に差分だけ M_PackageMPS を自動生成 |
| Weight / Length / Width / Height | Quantity | 重量・長さ・幅・高さ |
| C_UOM_Weight_ID / C_UOM_Length_ID | Table | 重量単位・長さ単位(クライアント情報から既定値をセット) |
| TrackingNo | String(255) | 運送会社から返却された追跡番号 |
| InsuredAmount / HandlingCharge / Surcharges / Price / TotalPrice | Amount | 保険金額・手数料・付加料金・送料 |
| CashOnDelivery / IsSaturdayDelivery / IsHazMat / IsDryIce | Yes-No | COD・土曜配達・危険物・ドライアイスなどの配送オプション |
| ShippingRespMessage / RateInquiryMessage | Text(2000) | 運送会社からの応答メッセージ |
| Processed | Yes-No | 処理済フラグ |
| ShippingRateInquiry / OProcessing / VoidIt / LabelPrint | Button | 送料照会・オンライン処理・取消・ラベル印刷 |
よくある質問(FAQ)
Section titled “よくある質問(FAQ)”Q. 箱数(BoxCount)を増やすとどうなりますか?
Section titled “Q. 箱数(BoxCount)を増やすとどうなりますか?”保存後の afterSave() で、現在の M_PackageMPS レコード件数と BoxCount を比較し、不足分だけ M_PackageMPS レコードが自動生成されます。逆に箱数を減らしても既存の M_PackageMPS は自動削除されません。
Q. 重量を空欄のまま保存するとどうなりますか?
Section titled “Q. 重量を空欄のまま保存するとどうなりますか?”beforeSave() で重量が未入力または 0 の場合、ビュー X_PackageLineWeight から当該梱包の明細重量合計(SUM(LineWeight))を取得して自動セットします。合計が取得できない場合は 0 がセットされます。
Q. 梱包記録伝票を削除すると明細も消えますか?
Section titled “Q. 梱包記録伝票を削除すると明細も消えますか?”消えます。beforeDelete() で、その梱包に属する M_PackageMPS 配下の M_PackageLine を先に削除し、続いて M_PackageMPS を削除してから本体が削除されます。
Q. 出荷伝票から梱包を一括作成できますか?
Section titled “Q. 出荷伝票から梱包を一括作成できますか?”MPackage.create() を呼ぶ実装からは可能です。この処理では出荷明細を走査して梱包明細を自動生成し、BoxCount=1 をセットします。運賃品目(クライアント情報の M_ProductFreight_ID)は明細から除外され、BOM 品目のうち「検証済み」かつ「ピッキングリストに明細を印字する」設定のものは構成品へ展開されます。
Q. 伝票処理(完了・取消)のボタンはありますか?
Section titled “Q. 伝票処理(完了・取消)のボタンはありますか?”DocStatus / DocAction を用いた標準の伝票処理はありません。M_Package が持つのは運送会社連携用のボタン(送料照会・オンライン処理・取消・ラベル印刷)と Processed フラグです。
業務フロー上の位置づけ
Section titled “業務フロー上の位置づけ”graph TD
A["📋 受注伝票"] --> B["🚚 出荷伝票<br/>M_InOut"]
B --> C["📦 梱包記録伝票<br/>M_Package"]
C --> D["📮 梱包単位<br/>M_PackageMPS"]
D --> E["📋 梱包詳細<br/>M_PackageLine"]
C --> F["🌐 配送トランザクション<br/>M_ShippingTransaction"]
F --> G["🏷 追跡番号・送料"]
B --> H["💴 売上請求書"]
- 出荷伝票(Shipment)の使い方
- 配送トランザクション(Shipping Transaction)の使い方
- 受注伝票(Sales Order)の使い方
- 入荷伝票(Material Receipt)の使い方
- 画面リファレンス: 梱包記録伝票
🛠 技術仕様(開発者向け)
梱包記録伝票は M_Package(ヘッダー)と M_PackageLine(明細)で構成されるトランザクション型のウィンドウ(AD_Window_ID: 319)です。MPackage クラス(667行)が梱包の自動生成・重量集計・箱数に応じた M_PackageMPS 生成・運送会社とのオンライン処理を担い、MPackageLine クラス(102行)は出荷明細からの数量コピーを担当します。DocStatus / DocAction を持つ Document 型ではなく、Processed フラグと処理ボタンで状態を管理します。
アーキテクチャ概要
Section titled “アーキテクチャ概要”classDiagram
class MPackage {
+create(MInOut, MShipper, Timestamp)$ MPackage
+createPackage(MInOut, MShipper, Timestamp)$ MPackage
#beforeSave(boolean) boolean
#afterSave(boolean, boolean) boolean
#beforeDelete() boolean
+processOnline(String, boolean) boolean
+createShippingTransaction(String, boolean, String) MShippingTransaction
+setErrorMessage(String)
+getErrorMessage() String
}
class MPackageLine {
+setInOutLine(MInOutLine)
}
class X_M_Package {
<<generated>>
}
class X_M_PackageLine {
<<generated>>
}
class PO {
<<abstract>>
}
MPackage --|> X_M_Package
MPackageLine --|> X_M_PackageLine
X_M_Package --|> PO
X_M_PackageLine --|> PO
MPackage --> MPackageMPS : generates
MPackage --> MPackageLine : has many
MPackage --> MShippingTransaction : online processing
MPackage --> MInOut : shipment
MPackage --> MShipper : carrier
パッケージ: org.compiere.model
ソースファイル: org.adempiere.base/src/org/compiere/model/MPackage.java(667行)、MPackageLine.java(102行)
関連DBテーブル
Section titled “関連DBテーブル”M_Package(梱包)
Section titled “M_Package(梱包)”テーブル属性: 削除可(IsDeleteable=Y)/大量データ扱いなし/アクセスレベル=組織/ビューではない。全カラム数は約80。
| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| M_Package_ID | ID | PK | 梱包ID | 主キー |
| M_Package_UU | UUID(36) | N | UUIDキー | |
| AD_Client_ID | Table Direct | Y | クライアント | 既定 @#AD_Client_ID@ |
| AD_Org_ID | Table Direct | Y | 組織 | 既定 @#AD_Org_ID@ |
| DocumentNo | String(30) | Y | 伝票番号 | 更新不可 |
| M_InOut_ID | Search | Y | 出荷/入荷伝票 | 更新不可 |
| M_Shipper_ID | Table | Y | 運送会社 | callout あり |
| ShipDate | Date | N | 出荷日 | 新規時に当日をセット |
| BoxCount | Integer | N | 箱数 | 既定 1。afterSave で MPS 生成 |
| Weight / Length / Width / Height | Quantity(14) | N | 重量・長さ・幅・高さ | 重量は beforeSave で自動集計 |
| C_UOM_Weight_ID / C_UOM_Length_ID | Table | N | 重量単位・長さ単位 | クライアント情報から既定値 |
| TrackingNo | String(255) | N | 追跡番号 | |
| TrackingInfo | String(255) | N | 追跡情報 | |
| DateReceived | Date | N | 受取日付 | |
| ReceivedInfo | String(255) | N | 受付情報 | |
| NotificationMessage | String(255) | N | 通知メッセージ | 出荷コンストラクタで自動生成 |
| InsuredAmount / HandlingCharge | Amount(14) | N | 保険金額・手数料 | |
| Price / PriceActual / Surcharges | Costs+Prices(14) | N | 送料・単価・付加料金 | オンライン処理で更新 |
| TotalPrice | Costs+Prices(14) | N | 合計金額 | 更新不可 |
| ShippingRespMessage | Text(2000) | N | 応答メッセージ | オンライン処理結果 |
| RateInquiryMessage | Text(2000) | N | 送料照会メッセージ | |
| M_ShippingProcessor_ID | Table | N | 配送プロセッサ | 更新不可 |
| Processed | Yes-No | Y | 処理済 | 既定 N |
| IsActive | Yes-No | Y | 有効 | 既定 Y |
M_PackageLine(梱包詳細)
Section titled “M_PackageLine(梱包詳細)”テーブル属性: 削除可/アクセスレベル=組織。
| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| M_PackageLine_ID | ID | PK | 梱包詳細ID | 主キー |
| M_PackageLine_UU | UUID(36) | N | UUIDキー | |
| M_Package_ID | Search | Y | 梱包FK | 更新不可 |
| M_InOutLine_ID | Table Direct | Y | 出荷/入荷明細FK | 更新不可 |
| M_PackageMPS_ID | Search | N | 梱包単位(箱)FK | create() で自動セット |
| M_Product_ID | Search | N | 品目 | BOM 展開時は構成品がセットされる |
| Qty | Quantity | Y | 数量 | 既定 0、setInOutLine() で移動数量をコピー |
| Description | String(255) | N | 説明 | |
| IsActive | Yes-No | Y | 有効 | 既定 Y |
erDiagram
M_InOut ||--o{ M_Package : "packed as"
M_Package ||--o{ M_PackageMPS : "boxes"
M_PackageMPS ||--o{ M_PackageLine : "contents"
M_Package ||--o{ M_PackageLine : "contents"
M_InOutLine ||--o{ M_PackageLine : "packed line"
M_Package }o--|| M_Shipper : "carrier"
M_Package ||--o{ M_ShippingTransaction : "online request"
ビジネスロジック
Section titled “ビジネスロジック”出荷伝票からの梱包自動生成(create)
Section titled “出荷伝票からの梱包自動生成(create)”MPackage.create(MInOut shipment, MShipper shipper, Timestamp shipDate) の処理:
createPackage()でヘッダーを作成(BoxCount=0で保存)M_PackageMPSを1件生成(SeqNo=10)- 出荷明細(
MInOut.getLines(false))を走査- 品目未設定の行、およびクライアント情報の運賃品目(
M_ProductFreight_ID)と一致する行はスキップ - 品目が
isBOM()かつisVerified()かつisPickListPrintDetails()の場合、既定 BOM(MPPProductBOM.getDefault())の構成品ごとに梱包明細を生成し、数量は出荷明細の入力数量 × BOM数量 - それ以外は出荷明細1行につき梱包明細1行を生成
- 品目未設定の行、およびクライアント情報の運賃品目(
BoxCount=1をセットして再保存
出荷コンストラクタでの初期化
Section titled “出荷コンストラクタでの初期化”MPackage(MInOut shipment, MShipper shipper) は、クライアント/組織・出荷伝票・運送会社をセットしたうえで、関連する受注伝票を特定します。M_InOut.C_Order_ID があればそれを、無ければ MMatchPO.getInOut() から発注明細経由で受注伝票をたどります。特定できた伝票番号を使って NotificationMessage に Notification for shipment ○○ / order ○○ を自動セットします。
beforeSave()
Section titled “beforeSave()”重量(Weight)が未設定または 0 の場合、ビュー X_PackageLineWeight から SUM(LineWeight) を取得して重量へセットします(取得できない場合は 0)。
afterSave()
Section titled “afterSave()”M_PackageMPS の既存件数を数え、BoxCount - 既存件数 > 0 の場合、その差分だけ M_PackageMPS レコードを新規生成します。
flowchart TD
A["保存"] --> B["beforeSave<br/>重量が空 or 0?"]
B -->|Yes| C["X_PackageLineWeight から<br/>SUM(LineWeight) を取得"]
B -->|No| D["そのまま"]
C --> E["DB 保存"]
D --> E
E --> F["afterSave<br/>既存 M_PackageMPS 件数を取得"]
F --> G{"BoxCount - 既存件数 > 0?"}
G -->|Yes| H["差分だけ M_PackageMPS を生成"]
G -->|No| I["何もしない"]
beforeDelete()
Section titled “beforeDelete()”M_PackageMPSに属するM_PackageLineを SQL で一括削除- 当該梱包の
M_PackageMPSを一括削除 - その後にヘッダーが削除される
オンライン処理(processOnline)
Section titled “オンライン処理(processOnline)”processOnline(String action, boolean isPriviledgedRate) は、専用トランザクション(プレフィックス spt-)を開始し、createShippingTransaction() で MShippingTransaction を生成して processOnline() を実行します。アクションが ACTION_ProcessShipment の場合、応答メッセージ(ShippingRespMessage)を保存し、成功時は送料(Price)と付加料金(Surcharges)を梱包へ書き戻します。エラー内容は getErrorMessage() で取得できます。
MPackageLine の初期化
Section titled “MPackageLine の初期化”- 新規行の数量は 0(
Env.ZERO) MPackageLine(MPackage parent)はクライアント/組織とM_Package_IDをセットsetInOutLine(MInOutLine line)はM_InOutLine_IDと、出荷明細の移動数量(MovementQty)を数量へセット
拡張ポイント(カスタマイズ箇所)
Section titled “拡張ポイント(カスタマイズ箇所)”Callout(このテーブル固有)
Section titled “Callout(このテーブル固有)”M_Package.M_Shipper_ID には以下の callout が AD 上で定義されています。
| カラム | Callout |
|---|---|
| M_Shipper_ID | org.compiere.model.CalloutPackage.afterShipperSetDefaults、org.compiere.model.CalloutPackage.afterShipper |
運送会社の選択時に、その運送会社に応じた既定値(配送オプション等)を補完します。他のカラムには AD 上の callout 定義はありません。
OSGi Model Validator(推奨)
Section titled “OSGi Model Validator(推奨)”public class CustomPackageValidator implements ModelValidator { @Override public int modelChange(PO po, int type) throws Exception { if (po instanceof MPackage && (type == TYPE_BEFORE_NEW || type == TYPE_BEFORE_CHANGE)) { MPackage pkg = (MPackage) po; // 例: 運送会社ごとの上限重量チェック if (pkg.getWeight() != null && pkg.getWeight().compareTo(new BigDecimal("30")) > 0) { throw new AdempiereException("1梱包あたりの重量は30kg以内にしてください"); } } return null; }}運送会社連携の追加
Section titled “運送会社連携の追加”国内運送会社との連携を追加する場合は、M_Package を直接改変せず、MShippingTransaction が利用する配送プロセッサ(M_ShippingProcessor)の実装を OSGi サービスとして追加するのが安全です。梱包側は processOnline() を呼ぶだけで新しいプロセッサを利用できます。
梱包自動生成のカスタマイズ
Section titled “梱包自動生成のカスタマイズ”BOM 展開条件(isBOM / isVerified / isPickListPrintDetails)や運賃品目の除外はコアの MPackage.create() に固定実装されています。異なる分割ルールが必要な場合は、create() を使わず独自プロセスで MPackage / MPackageMPS / MPackageLine を組み立てる実装を推奨します。
関連プロセス
Section titled “関連プロセス”| ボタン/カラム | 説明 |
|---|---|
| 送料照会(ShippingRateInquiry) | 運送会社へオンラインで送料を照会 |
| オンライン処理(OProcessing) | 出荷登録などのオンライン処理を実行 |
| 取消(VoidIt) | 登録済みのオンライン出荷を取消 |
| ラベル印刷(LabelPrint) | 配送ラベルを出力 |
関連ドキュメント
Section titled “関連ドキュメント”iDempiereカスタマイズのご相談
Section titled “iDempiereカスタマイズのご相談”梱包記録伝票は、箱単位の梱包明細・重量集計・運送会社オンライン処理という物流実務の骨格を備えています。 国内運送会社の送り状 API 連携や、独自の梱包分割ルールも配送プロセッサや Model Validator でコア改変なしに追加できます。
As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。