Skip to content

iDempiere 梱包記録伝票の使い方|販売管理 操作マニュアル・技術仕様

This content is not available in your language yet.

📖 販売管理の全体像: 販売管理の全体図 も合わせてご覧ください。

梱包記録伝票(Package)は、1件の出荷伝票をどの箱に、どの明細を、いくつ詰めたかを記録する伝票です。運送会社・出荷日・追跡情報を保持し、運送会社とのオンライン連携(送料照会・出荷登録・出荷取消・ラベル印刷)の実行単位にもなります。

⚠️ 注意: このウィンドウ(AD_Window_ID: 319)は iDempiere 13 標準では無効化されており、標準メニューにも登録されていません(旧バージョンからの互換用)。実際の梱包データは、出荷伝票からの梱包作成処理や配送トランザクション経由で間接的に生成・参照されるのが標準的な使い方です。

📌 ポイント: 「箱数(BoxCount)」を増やして保存すると、その差分だけ M_PackageMPS(複数梱包)レコードが自動生成されます。梱包明細(M_PackageLine)は箱(MPS)に紐づくため、箱数を先に確定してから明細を割り当てるのが正しい順序です。

  • 出荷伝票(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

梱包記録伝票ウィンドウ(Window ID: 319) 梱包 M_Package 11項目 梱包詳細 M_PackageLine 6項目

タブ名テーブル項目数役割
梱包M_Package11項目ヘッダー(伝票番号・出荷伝票・運送会社・出荷日・追跡情報)
梱包詳細M_PackageLine6項目梱包に詰めた出荷明細と数量

💡 ヒント: ウィンドウ上に表示される項目は上記のとおり少数ですが、M_Package テーブル自体は重量・寸法・配送オプション・オンライン処理ボタンなど 80 近いカラムを持っています。運送会社連携で使われる項目の多くは配送トランザクション画面側から操作します。

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 を追加し、ロールにアクセス権を付与する必要があります。

  1. 新規」ボタンをクリック
  2. ヘッダー情報を入力:
    • 伝票番号(必須): 梱包記録の伝票番号
    • 入荷伝票(必須): 対象の出荷/入荷伝票(M_InOut
    • 運送会社(必須): 配送を委託する運送会社
    • 出荷日: 新規作成時は当日日付が自動セットされます
    • 説明: 補足説明
  3. 保存」をクリック

💡 ヒント: 新規レコードでは、重量単位(C_UOM_Weight_ID)と長さ単位(C_UOM_Length_ID)がクライアント情報(AD_ClientInfo)の既定値から自動セットされます。単位がセットされない場合は、システム管理者にクライアント情報の設定を確認してください。

  1. 梱包詳細」タブに移動
  2. 新規」ボタンをクリック
  3. 明細情報を入力:
    • 入荷明細(必須): 対象の出荷明細行(M_InOutLine
    • 数量(必須): この箱に詰めた数量
    • 説明: 補足説明
  4. 保存」をクリック

📌 ポイント: 出荷明細を選択すると、内部的には出荷明細の移動数量(MovementQty)が数量へコピーされます(MPackageLine.setInOutLine())。分割梱包する場合は、コピーされた数量を実際に詰めた数へ修正してください。

運送会社とのオンライン連携を使わない場合は、以下を手入力して追跡情報を残します。

  • 追跡情報: 追跡用の URL や説明
  • 受取日付: 相手先に到着した日付
  • 受付情報: 受領確認の内容
項目名カラム必須説明
クライアントAD_Client_ID必須選択テナント
組織AD_Org_ID必須選択組織
伝票番号DocumentNo必須文字列(30)梱包記録の伝票番号(更新不可)
入荷伝票M_InOut_ID必須検索対象の出荷/入荷伝票(更新不可)
運送会社M_Shipper_ID必須選択配送方法・運送会社
出荷日ShipDate-日付出荷日(新規時は当日が自動セット)
追跡情報TrackingInfo-文字列(255)追跡情報
受取日付DateReceived-日付到着日
受付情報ReceivedInfo-文字列(255)受領確認の内容
説明Description-文字列(255)補足説明
有効IsActive必須チェックレコードが有効か(既定: Y)
項目名カラム必須説明
梱包M_Package_ID必須検索親の梱包(更新不可)
入荷明細M_InOutLine_ID必須選択出荷/入荷明細行(更新不可)
数量Qty必須数量詰めた数量(既定: 0)
説明Description-文字列(255)補足説明
有効IsActive必須チェックレコードが有効か

全項目一覧はリファレンス参照

主なテーブル専用カラム(画面非表示)

Section titled “主なテーブル専用カラム(画面非表示)”
カラム説明
BoxCountInteger箱数(既定 1)。保存時に差分だけ M_PackageMPS を自動生成
Weight / Length / Width / HeightQuantity重量・長さ・幅・高さ
C_UOM_Weight_ID / C_UOM_Length_IDTable重量単位・長さ単位(クライアント情報から既定値をセット)
TrackingNoString(255)運送会社から返却された追跡番号
InsuredAmount / HandlingCharge / Surcharges / Price / TotalPriceAmount保険金額・手数料・付加料金・送料
CashOnDelivery / IsSaturdayDelivery / IsHazMat / IsDryIceYes-NoCOD・土曜配達・危険物・ドライアイスなどの配送オプション
ShippingRespMessage / RateInquiryMessageText(2000)運送会社からの応答メッセージ
ProcessedYes-No処理済フラグ
ShippingRateInquiry / OProcessing / VoidIt / LabelPrintButton送料照会・オンライン処理・取消・ラベル印刷

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 フラグです。

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["💴 売上請求書"]

受注伝票 出荷伝票 M_InOut 梱包記録伝票 M_Package 梱包単位 M_PackageMPS 梱包詳細 M_PackageLine 配送トランザクション M_ShippingTransaction 追跡番号・送料 売上請求書


🛠 技術仕様(開発者向け)

梱包記録伝票は M_Package(ヘッダー)と M_PackageLine(明細)で構成されるトランザクション型のウィンドウ(AD_Window_ID: 319)です。MPackage クラス(667行)が梱包の自動生成・重量集計・箱数に応じた M_PackageMPS 生成・運送会社とのオンライン処理を担い、MPackageLine クラス(102行)は出荷明細からの数量コピーを担当します。DocStatus / DocAction を持つ Document 型ではなく、Processed フラグと処理ボタンで状態を管理します。

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

+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 +setInOutLine(MInOutLine) <> <> > X_M_Package MPackageLine -- > PO X_M_PackageLine --

パッケージ: org.compiere.model ソースファイル: org.adempiere.base/src/org/compiere/model/MPackage.java(667行)、MPackageLine.java(102行)

テーブル属性: 削除可(IsDeleteable=Y)/大量データ扱いなし/アクセスレベル=組織/ビューではない。全カラム数は約80。

カラム名必須説明備考
M_Package_IDIDPK梱包ID主キー
M_Package_UUUUID(36)NUUIDキー
AD_Client_IDTable DirectYクライアント既定 @#AD_Client_ID@
AD_Org_IDTable DirectY組織既定 @#AD_Org_ID@
DocumentNoString(30)Y伝票番号更新不可
M_InOut_IDSearchY出荷/入荷伝票更新不可
M_Shipper_IDTableY運送会社callout あり
ShipDateDateN出荷日新規時に当日をセット
BoxCountIntegerN箱数既定 1afterSave で MPS 生成
Weight / Length / Width / HeightQuantity(14)N重量・長さ・幅・高さ重量は beforeSave で自動集計
C_UOM_Weight_ID / C_UOM_Length_IDTableN重量単位・長さ単位クライアント情報から既定値
TrackingNoString(255)N追跡番号
TrackingInfoString(255)N追跡情報
DateReceivedDateN受取日付
ReceivedInfoString(255)N受付情報
NotificationMessageString(255)N通知メッセージ出荷コンストラクタで自動生成
InsuredAmount / HandlingChargeAmount(14)N保険金額・手数料
Price / PriceActual / SurchargesCosts+Prices(14)N送料・単価・付加料金オンライン処理で更新
TotalPriceCosts+Prices(14)N合計金額更新不可
ShippingRespMessageText(2000)N応答メッセージオンライン処理結果
RateInquiryMessageText(2000)N送料照会メッセージ
M_ShippingProcessor_IDTableN配送プロセッサ更新不可
ProcessedYes-NoY処理済既定 N
IsActiveYes-NoY有効既定 Y

テーブル属性: 削除可/アクセスレベル=組織。

カラム名必須説明備考
M_PackageLine_IDIDPK梱包詳細ID主キー
M_PackageLine_UUUUID(36)NUUIDキー
M_Package_IDSearchY梱包FK更新不可
M_InOutLine_IDTable DirectY出荷/入荷明細FK更新不可
M_PackageMPS_IDSearchN梱包単位(箱)FKcreate() で自動セット
M_Product_IDSearchN品目BOM 展開時は構成品がセットされる
QtyQuantityY数量既定 0、setInOutLine() で移動数量をコピー
DescriptionString(255)N説明
IsActiveYes-NoY有効既定 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"

packed as packed line online request

出荷伝票からの梱包自動生成(create)

Section titled “出荷伝票からの梱包自動生成(create)”

MPackage.create(MInOut shipment, MShipper shipper, Timestamp shipDate) の処理:

  1. createPackage() でヘッダーを作成(BoxCount=0 で保存)
  2. M_PackageMPS を1件生成(SeqNo=10
  3. 出荷明細(MInOut.getLines(false))を走査
    • 品目未設定の行、およびクライアント情報の運賃品目(M_ProductFreight_ID)と一致する行はスキップ
    • 品目が isBOM() かつ isVerified() かつ isPickListPrintDetails() の場合、既定 BOM(MPPProductBOM.getDefault())の構成品ごとに梱包明細を生成し、数量は 出荷明細の入力数量 × BOM数量
    • それ以外は出荷明細1行につき梱包明細1行を生成
  4. BoxCount=1 をセットして再保存

出荷コンストラクタでの初期化

Section titled “出荷コンストラクタでの初期化”

MPackage(MInOut shipment, MShipper shipper) は、クライアント/組織・出荷伝票・運送会社をセットしたうえで、関連する受注伝票を特定します。M_InOut.C_Order_ID があればそれを、無ければ MMatchPO.getInOut() から発注明細経由で受注伝票をたどります。特定できた伝票番号を使って NotificationMessageNotification for shipment ○○ / order ○○ を自動セットします。

重量(Weight)が未設定または 0 の場合、ビュー X_PackageLineWeight から SUM(LineWeight) を取得して重量へセットします(取得できない場合は 0)。

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["何もしない"]

保存 beforeSave 重量が空 or 0? X_PackageLineWeight から SUM(LineWeight) を取得 そのまま DB 保存 afterSave 既存 M_PackageMPS 件数を取得 BoxCount - 既存件数 > 0? 差分だけ M_PackageMPS を生成 何もしない

  1. M_PackageMPS に属する M_PackageLine を SQL で一括削除
  2. 当該梱包の M_PackageMPS を一括削除
  3. その後にヘッダーが削除される

processOnline(String action, boolean isPriviledgedRate) は、専用トランザクション(プレフィックス spt-)を開始し、createShippingTransaction()MShippingTransaction を生成して processOnline() を実行します。アクションが ACTION_ProcessShipment の場合、応答メッセージ(ShippingRespMessage)を保存し、成功時は送料(Price)と付加料金(Surcharges)を梱包へ書き戻します。エラー内容は getErrorMessage() で取得できます。

  • 新規行の数量は 0(Env.ZERO
  • MPackageLine(MPackage parent) はクライアント/組織と M_Package_ID をセット
  • setInOutLine(MInOutLine line)M_InOutLine_ID と、出荷明細の移動数量(MovementQty)を数量へセット

拡張ポイント(カスタマイズ箇所)

Section titled “拡張ポイント(カスタマイズ箇所)”

M_Package.M_Shipper_ID には以下の callout が AD 上で定義されています。

カラムCallout
M_Shipper_IDorg.compiere.model.CalloutPackage.afterShipperSetDefaultsorg.compiere.model.CalloutPackage.afterShipper

運送会社の選択時に、その運送会社に応じた既定値(配送オプション等)を補完します。他のカラムには AD 上の callout 定義はありません。

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;
}
}

国内運送会社との連携を追加する場合は、M_Package を直接改変せず、MShippingTransaction が利用する配送プロセッサ(M_ShippingProcessor)の実装を OSGi サービスとして追加するのが安全です。梱包側は processOnline() を呼ぶだけで新しいプロセッサを利用できます。

BOM 展開条件(isBOM / isVerified / isPickListPrintDetails)や運賃品目の除外はコアの MPackage.create() に固定実装されています。異なる分割ルールが必要な場合は、create() を使わず独自プロセスで MPackage / MPackageMPS / MPackageLine を組み立てる実装を推奨します。

ボタン/カラム説明
送料照会(ShippingRateInquiry)運送会社へオンラインで送料を照会
オンライン処理(OProcessing)出荷登録などのオンライン処理を実行
取消(VoidIt)登録済みのオンライン出荷を取消
ラベル印刷(LabelPrint)配送ラベルを出力

梱包記録伝票は、箱単位の梱包明細・重量集計・運送会社オンライン処理という物流実務の骨格を備えています。 国内運送会社の送り状 API 連携や、独自の梱包分割ルールも配送プロセッサや Model Validator でコア改変なしに追加できます。

As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。

OSS ERP導入・カスタマイズサービスの詳細はこちら