Skip to content

iDempiere 経費(未払い)の使い方|取引先管理 操作マニュアル・技術仕様

This content is not available in your language yet.

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

経費(未払い)(Expenses (not reimbursed))は、従業員や仕入先へまだ払い戻していない立替経費の明細を、取引先ごとに一覧して確認・調整する照会ウィンドウです。経費報告(Expense Report)で起票された明細のうち、仕入請求伝票がまだ生成されていないものだけが表示されます。

📌 ポイント: 払い戻しの前に、このウィンドウで**精算価格(PriceReimbursed)と精算数量(QtyReimbursed)**を必ず確認してください。ここで確定した内容が、そのまま従業員・仕入先への仕入請求伝票(買掛)に反映されます。

  • 未精算の立替経費を、従業員・仕入先ごとに絞って確認する
  • 明細ごとの精算価格(PriceReimbursed)・精算数量(QtyReimbursed)を払い戻し前に調整する
  • 時間単位レポート(作業時間のみの記録)と実費経費を区別して確認する
  • 経費金額・換算金額(基軸通貨換算)を照会する
  • 従業員/仕入先タブで購買側の支払条件・債権債務残高を確認する
  • プロジェクト・フェーズ・タスク・営業活動への原価配賦状況を確認する

親子2タブ構成です。親タブで払い戻し先を選び、子タブでその相手の未精算明細を見ます。

タブ名テーブル項目数役割
従業員/仕入先C_BPartner7項目払い戻し対象の取引先を選択(仕入先・従業員フラグと支払条件を確認)
レポート詳細S_TimeExpenseLine27項目当該取引先の未精算経費明細を照会・修正

💡 ヒント: 従業員への立替精算を行うには、対象の人物が取引先マスタで**従業員(IsEmployeeまたは仕入先(IsVendor)**として登録されている必要があります。人事側の登録は 従業員マスタ を参照してください。

graph TD
    A["🚀 メニューから開く<br/>取引先管理 > サービス > 経費(未払い)"] --> B["🔍 従業員/仕入先タブで<br/>払い戻し対象を選択"]
    B --> C["📋 レポート詳細タブへ移動<br/>未精算の明細一覧を表示"]
    C --> D{"精算内容は妥当か"}
    D -->|調整が必要| E["✏️ 精算価格 PriceReimbursed<br/>精算数量 QtyReimbursed を修正"]
    D -->|問題なし| F["✅ 精算内容を確定"]
    E --> G["💾 保存<br/>(換算金額・行合計を自動再計算)"]
    G --> F
    F --> H["🧾 仕入請求伝票の生成<br/>(C_InvoiceLine_ID がセットされる)"]
    H --> I["💴 支払処理で払い戻し"]

メニューから開く 取引先管理 > サービス > 経費(未払い) 従業員/仕入先タブで 払い戻し対象を選択 レポート詳細タブへ移動 未精算の明細一覧を表示 精算内容は妥当か 精算価格 PriceReimbursed 精算数量 QtyReimbursed を修正 精算内容を確定 保存 (換算金額・行合計を自動再計算) 仕入請求伝票の生成 (C_InvoiceLine_ID がセットされる) 支払処理で払い戻し 調整が必要 問題なし

アクセス方法(メニューパス)

Section titled “アクセス方法(メニューパス)”

メニューから「取引先管理 > サービス > 経費(未払い)」を開きます(AD_Window_ID: 254)。

  1. 従業員/仕入先」タブで払い戻し先の取引先を検索・選択します
    • 検索キー / 名称: 取引先の特定に使用
    • 仕入先 / 従業員: どちらの区分で登録されているかを確認
    • 支払条件(購買)(PO_PaymentTerm_ID: 払い戻し時に適用される支払条件
    • 債権債務残高: 現在の未決済残高
  2. レポート詳細」タブに移動し、未精算明細を確認します
  3. 必要に応じて明細を調整します
    • 精算数量(QtyReimbursed: 実際に払い戻す数量
    • 請求価格(PriceReimbursed: 従業員の購買価格表通貨での精算単価
    • 経費金額 / 通貨: 立替額と通貨
    • 説明 / メモ: 精算理由の補足
  4. 保存」をクリックします
  5. 内容確定後、経費から仕入請求伝票を生成する処理を実行します

⚠️ 注意: 親の経費報告が処理済み(Processed=Y)の場合、その報告に新しい明細を追加できませんMTimeExpenseLine.beforeSave()ParentComplete エラーで拒否します。

項目名必須説明
検索キー必須文字列取引先コード(一意)
名称必須文字列取引先名
読み方-文字列補助名称(カナ等)
仕入先必須チェック仕入先として扱うか
従業員必須チェック従業員として扱うか
支払条件(購買)-選択購買側(払い戻し側)の支払条件
債権債務残高-金額基軸通貨換算の未決済残高

レポート詳細タブ(S_TimeExpenseLine)主要項目

Section titled “レポート詳細タブ(S_TimeExpenseLine)主要項目”
項目名必須説明
経費報告必須検索親となる経費報告(S_TimeExpense
明細番号必須整数伝票内の一意な行番号(既定は最大値+10)
作業日付必須日付経費・作業の発生日
取引先-検索払い戻し先の取引先
品目-検索経費に対応する品目・サービス
数量-数量立替数量(既定 1)
数量単位-選択数量の単位
経費金額-金額1単位あたりの立替額
通貨-選択経費金額の通貨
換算金額-金額報告通貨へ換算した金額(自動計算)
請求数量(精算数量)-数量実際に払い戻す数量
請求価格(精算単価)-単価従業員の購買価格表通貨での精算単価
時間タイプ-選択作業時間の分類(S_TimeType
時間単位レポート必須チェックON の場合は時間のみの記録(金額は 0 に強制)
請求済み必須チェック請求・精算処理済みか
仕入請求伝票明細-検索生成された仕入請求明細への参照
処理済み必須チェック親伝票が処理済みか
プロジェクト-選択原価を配賦するプロジェクト

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

同じ S_TimeExpenseLine を扱いますが、目的が逆方向です。

観点経費精算伝票(未請求)経費(未払い)(本ページ)
相手得意先(顧客)従業員・仕入先
目的立替経費を顧客へ請求する立替経費を本人へ払い戻す
主な金額項目PriceInvoiced / QtyInvoicedPriceReimbursed / QtyReimbursed
生成される伝票受注伝票 → 売上請求伝票仕入請求伝票(買掛)
参照カラムC_OrderLine_IDC_InvoiceLine_ID
graph TD
    A["従業員が立替払い"] --> B["経費報告<br/>S_TimeExpense を起票"]
    B --> C["経費明細<br/>S_TimeExpenseLine"]
    C --> D["経費(未払い)<br/>(本ウィンドウ)で精算内容を確認"]
    D --> E["仕入請求伝票の生成"]
    E --> F["支払処理<br/>(従業員へ払い戻し)"]

従業員が立替払い 経費報告 S_TimeExpense を起票 経費明細 S_TimeExpenseLine 経費(未払い) (本ウィンドウ)で精算内容を確認 仕入請求伝票の生成 支払処理 (従業員へ払い戻し)

Q. 対象の従業員が「従業員/仕入先」タブに出てきません

Section titled “Q. 対象の従業員が「従業員/仕入先」タブに出てきません”

その人物が取引先マスタに登録されていないか、従業員(IsEmployee)または仕入先(IsVendor)のチェックが入っていない可能性があります。取引先マスタ で該当取引先を開き、区分フラグを確認してください。

Q. 明細を追加しようとすると「ParentComplete」エラーになります

Section titled “Q. 明細を追加しようとすると「ParentComplete」エラーになります”

親の経費報告(S_TimeExpense)が処理済み(Processed=Y)です。MTimeExpenseLine.beforeSave() は新規行追加時に親の処理済み判定を行い、処理済みなら保存を拒否します。追加分は新しい経費報告として起票してください。

Q. 「時間単位レポート」の明細が 0 円で表示されます

Section titled “Q. 「時間単位レポート」の明細が 0 円で表示されます”

仕様です。IsTimeReport=Y の明細は作業時間のみを記録するもので、beforeSave() により経費金額・換算金額・行合計が強制的に 0 にセットされます。払い戻し対象の実費であればチェックを外してください。

Q. 経費の通貨と精算通貨が異なる場合はどうなりますか?

Section titled “Q. 経費の通貨と精算通貨が異なる場合はどうなりますか?”

明細の通貨(C_Currency_ID)と報告通貨(getC_Currency_Report_ID())が異なる場合、beforeSave()MConversionRate.convert() を呼び、作業日付(DateExpense)時点の為替レートで換算金額(ConvertedAmt)を算出します。該当日のレートが未登録だと換算に失敗するため、為替レートの整備が必要です。

Q. 精算価格を空欄のままにするとどうなりますか?

Section titled “Q. 精算価格を空欄のままにするとどうなりますか?”

精算単価が決まらないため、払い戻し金額が意図と異なる可能性があります。PriceReimbursed従業員の購買(AP)価格表の通貨で入力する項目です。価格表から自動で決めたい場合は、対象取引先に購買価格表を設定しておいてください。

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

経費(未払い)(AD_Window_ID: 254)は照会・修正型のウィンドウで、親タブに C_BPartner、子タブに S_TimeExpenseLine を持ちます。窓口としては AD_Window_ID 242(経費精算伝票)と対になっており、同じ S_TimeExpenseLine を「仕入請求伝票が未生成」という条件で絞り込みます。ロジックは MTimeExpenseLine クラス(360行)が担当し、親の MTimeExpense(613行)が伝票処理を保持します。

classDiagram
    class MTimeExpense {
        +getLines(boolean) MTimeExpenseLine[]
        +getC_Currency_ID() int
    }
    class MTimeExpenseLine {
        +getParent() MTimeExpense
        +getQtyReimbursed() BigDecimal
        +getPriceReimbursed() BigDecimal
        +getApprovalAmt() BigDecimal
        +getLaborCost(MAcctSchema) BigDecimal
        #beforeSave(boolean) boolean
        #afterSave(boolean, boolean) boolean
        #afterDelete(boolean) boolean
    }
    class X_S_TimeExpenseLine {
        <<generated>>
    }
    class PO {
        <<abstract>>
    }
    MTimeExpenseLine --|> X_S_TimeExpenseLine
    X_S_TimeExpenseLine --|> PO
    MTimeExpense --> MTimeExpenseLine : has many
    MTimeExpenseLine --> MResourceAssignment : syncs
    MTimeExpenseLine --> MConversionRate : uses

+getLines(boolean) MTimeExpenseLine[] +getC_Currency_ID() int +getParent() MTimeExpense +getQtyReimbursed() BigDecimal +getPriceReimbursed() BigDecimal +getApprovalAmt() BigDecimal +getLaborCost(MAcctSchema) BigDecimal #beforeSave(boolean) boolean #afterSave(boolean, boolean) boolean #afterDelete(boolean) boolean <> <> > X_S_TimeExpenseLine X_S_TimeExpenseLine --

パッケージ: org.compiere.model ソースファイル: org.adempiere.base/src/org/compiere/model/MTimeExpenseLine.java

S_TimeExpense(経費報告ヘッダー・参考)

Section titled “S_TimeExpense(経費報告ヘッダー・参考)”

このウィンドウには表示されませんが、明細の親として動作を左右します。

カラム名必須説明備考
S_TimeExpense_IDIDPK経費報告ID主キー
DocumentNoStringY伝票番号
C_BPartner_IDSearchY取引先経費の申請者
DateReportDateY報告日付既定 @#Date@
M_PriceList_IDTableDirectY価格表精算通貨の基準
M_Warehouse_IDTableDirectY倉庫
DocStatusListY伝票状態既定 DR
DocActionButtonY伝票アクション既定 CO
IsApprovedYesNoY承認済み
ApprovalAmtAmountN承認金額
ProcessedYesNoY処理済み明細追加の可否を決定

S_TimeExpenseLine(経費明細)精算側の主要カラム

Section titled “S_TimeExpenseLine(経費明細)精算側の主要カラム”
カラム名必須説明備考
S_TimeExpenseLine_IDIDPK経費明細ID主キー
S_TimeExpense_IDSearchY経費報告FK親伝票
LineIntegerY明細番号既定 SQL(MAX+10)
DateExpenseDateY作業日付換算レートの基準日
C_BPartner_IDSearchN取引先払い戻し先
M_Product_IDSearchN品目callout: CalloutTimeExpense.product
QtyQuantityN数量既定 1 / callout あり
ExpenseAmtAmountN経費金額callout: CalloutTimeExpense.amount
C_Currency_IDTableDirectN通貨callout: CalloutTimeExpense.amount
ConvertedAmtAmountN換算金額beforeSave で自動算出
LineNetAmtAmountN行合計ExpenseAmt × Qty
QtyReimbursedQuantityN精算数量払い戻し数量
PriceReimbursedCosts+PricesN精算単価従業員 AP 価格表通貨
C_InvoiceLine_IDSearchN仕入請求明細精算後にセットされる
IsTimeReportYesNoY時間単位レポートY なら金額を 0 に強制
IsInvoicedYesNoY請求済み
ProcessedYesNoY処理済み
S_ResourceAssignment_IDAssignmentNリソースアサインcallout: CalloutAssignment.product
erDiagram
    C_BPartner ||--o{ S_TimeExpense : "reported by"
    S_TimeExpense ||--o{ S_TimeExpenseLine : "lines"
    S_TimeExpenseLine }o--o| C_InvoiceLine : "reimbursed via"
    S_TimeExpenseLine }o--o| M_Product : "product"
    S_TimeExpenseLine }o--o| S_TimeType : "time type"
    S_TimeExpenseLine }o--o| C_Project : "cost allocation"

reported by reimbursed via time type cost allocation

  1. 親伝票の完了チェック: 新規行かつ親が Processed=Y なら ParentComplete エラーで保存中止
  2. 換算金額の算出: 新規、または ExpenseAmt / C_Currency_ID が変更された場合に再計算。明細通貨=報告通貨なら ExpenseAmt をそのまま、異なる場合は MConversionRate.convert()DateExpense 時点のレートを適用
  3. 行合計の算出: 新規、または Qty / ExpenseAmt 変更時に LineNetAmt = ExpenseAmt × Qty
  4. 時間レポートのゼロ化: IsTimeReport=Y なら ExpenseAmt / ConvertedAmt / LineNetAmt をすべて Env.ZERO
  • どちらも updateHeader() を呼び、親の経費報告の集計金額を更新します
  • afterSave() はリソースアサイン(S_ResourceAssignment_ID)の差し替えを検知し、旧レコードを削除して新レコードへ数量・説明を同期します
  • afterDelete() は紐付いていたリソースアサインを削除します

getLaborCost(MAcctSchema as) は、会計スキーマを引数に当該明細の労務原価を返します。プロジェクト原価や会計仕訳の生成側から参照されます。

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

Section titled “拡張ポイント(カスタマイズ箇所)”
カラムCallout クラス
ExpenseAmt / Qty / C_Currency_IDorg.compiere.model.CalloutTimeExpense.amount
M_Product_IDorg.compiere.model.CalloutTimeExpense.product
S_ResourceAssignment_IDorg.compiere.model.CalloutAssignment.product

精算上限や勘定区分の強制など、社内規程のチェックは Model Validator が適しています。

public class CustomReimbursementValidator implements ModelValidator {
@Override
public int modelChange(PO po, int type) throws Exception {
if (po instanceof MTimeExpenseLine) {
MTimeExpenseLine line = (MTimeExpenseLine) po;
if (type == TYPE_BEFORE_NEW || type == TYPE_BEFORE_CHANGE) {
// 例: 1明細あたりの精算上限チェック
if (line.getConvertedAmt().compareTo(new BigDecimal("50000")) > 0) {
throw new AdempiereException("1明細あたりの精算額が上限を超えています");
}
}
}
return null;
}
@Override
public String docValidate(PO po, int timing) {
return null; // S_TimeExpenseLine は Document 型ではない
}
}

親の S_TimeExpenseDocStatus / DocAction を持つ Document 型テーブルです。金額に応じた多段承認を組む場合は、S_TimeExpense に対してワークフロー(Document Process)を割り当てるか、docValidate()TIMING_BEFORE_COMPLETE でチェックを追加します。

プロセス名説明
経費からの仕入請求生成未精算の経費明細から買掛側の仕入請求伝票を生成(C_InvoiceLine_ID がセットされる)

立替経費の精算は、上限額・承認段数・勘定科目の割り当てなど社内規程に強く依存する領域です。 Model Validator とワークフローの組み合わせで、コア改変なしに規程どおりの運用を実現できます。

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

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