Skip to content

iDempiere 経費精算伝票(顧客請求前チェック)の使い方|取引先管理 操作マニュアル・技術仕様

This content is not available in your language yet.

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

経費精算伝票(Expenses (to be invoiced))は、顧客へまだ請求していない経費・作業時間の明細を、取引先ごとに一覧して確認・修正する照会ウィンドウです。経費報告(Expense Report)から起票された明細のうち、受注伝票がまだ生成されていないものだけが表示されます。

📌 ポイント: このウィンドウは新規の経費を入力する画面ではありません。入力は 経費報告(Expense Report) で行い、こちらは顧客請求へ回す直前の最終チェックに使います。請求価格(PriceInvoiced)や品目をここで直しておくと、受注伝票生成の結果が正しくなります。

  • 顧客へ未請求の経費・作業時間明細を、取引先(得意先)ごとに絞って確認する
  • 明細ごとの請求品目(M_Product_ID)・数量・請求価格を請求前に修正する
  • 時間単位レポート(IsTimeReport)と実費経費を区別して確認する
  • 請求対象の経費金額・換算金額・請求済数量を照会する
  • 取引先タブで価格表・支払条件・債権債務残高を確認し、請求条件を事前に検証する
  • プロジェクト・フェーズ・タスク・営業活動への紐付けを確認・修正する

親子2タブ構成です。親タブで請求先の取引先を選び、子タブでその取引先の未請求明細を見る、という流れになります。

タブ名テーブル項目数役割
経費精算伝票C_BPartner7項目請求対象の得意先を選択(価格表・支払条件・残高を確認)
経費精算伝票明細S_TimeExpenseLine28項目当該取引先の未請求経費・作業時間明細を照会・修正

💡 ヒント: 親タブは取引先マスタ(C_BPartner)そのものですが、この画面では得意先(IsCustomer)で請求対象となるものに絞った選択用ビューとして機能します。取引先マスタ全体の編集は 取引先マスタ で行ってください。

graph TD
    A["🚀 メニューから開く<br/>取引先管理 > サービス > 経費精算伝票"] --> B["🔍 経費精算伝票タブで<br/>請求対象の得意先を選択"]
    B --> C["📋 経費精算伝票明細タブへ移動<br/>未請求の明細一覧を表示"]
    C --> D{"明細の内容は正しいか"}
    D -->|修正が必要| E["✏️ 品目・数量・請求価格<br/>(PriceInvoiced)を修正"]
    D -->|問題なし| F["✅ 請求内容を確定"]
    E --> G["💾 保存<br/>(金額が自動再計算される)"]
    G --> F
    F --> H["🧾 受注伝票の生成処理へ<br/>(経費からの受注生成)"]

メニューから開く 取引先管理 > サービス > 経費精算伝票 経費精算伝票タブで 請求対象の得意先を選択 経費精算伝票明細タブへ移動 未請求の明細一覧を表示 明細の内容は正しいか 品目・数量・請求価格 (PriceInvoiced)を修正 請求内容を確定 保存 (金額が自動再計算される) 受注伝票の生成処理へ (経費からの受注生成) 修正が必要 問題なし

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

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

メニューから「取引先管理 > サービス > 経費精算伝票」を開きます(AD_Window_ID: 242)。

  1. 経費精算伝票」タブで請求先の得意先を検索・選択します
    • 検索キー / 名称: 取引先の特定に使用
    • 価格表: 請求時に適用される売価表
    • 支払条件: 請求書に引き継がれる支払条件
    • 債権債務残高: 現在の与信状況の確認に使用
  2. 経費精算伝票明細」タブに移動し、未請求明細を確認します
  3. 必要に応じて明細を修正します
    • 品目: 請求する品目・サービス
    • 数量 / 数量単位: 請求数量
    • 請求額(InvoicePrice: 請求単価。0 の場合は価格表の既定価格が使用されます
    • 説明 / メモ: 請求書に載せる補足
  4. 保存」をクリックします
    • 保存時に換算金額ConvertedAmt)と行合計LineNetAmt)が自動再計算されます
  5. 内容確定後、経費から受注伝票を生成する処理を実行します

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

項目名必須説明
検索キー必須文字列取引先コード(一意)
名称必須文字列取引先名
読み方-文字列補助名称(カナ等)
得意先必須チェック得意先かどうか
価格表-選択請求時に適用する価格表
支払条件-選択請求書に適用される支払条件
債権債務残高-金額基軸通貨換算の未決済残高

経費精算伝票明細タブ(S_TimeExpenseLine)主要項目

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

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

graph TD
    A["経費報告<br/>S_TimeExpense"] --> B["経費明細<br/>S_TimeExpenseLine"]
    B --> C{"顧客に請求するか"}
    C -->|請求する| D["経費精算伝票<br/>(本ウィンドウ)で内容確認"]
    C -->|社内負担| E["経費(未払い)で<br/>従業員へ精算"]
    D --> F["受注伝票の生成"]
    F --> G["売上請求伝票"]
    G --> H["入金消込"]

経費報告 S_TimeExpense 経費明細 S_TimeExpenseLine 顧客に請求するか 経費精算伝票 (本ウィンドウ)で内容確認 経費(未払い)で 従業員へ精算 受注伝票の生成 売上請求伝票 入金消込 請求する 社内負担

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

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

親の経費報告(S_TimeExpense)が既に処理済み(Processed=Y)になっています。MTimeExpenseLine.beforeSave() は、新規行の追加時に親伝票が処理済みかどうかを確認し、処理済みなら保存を拒否します。追加が必要な場合は、新しい経費報告を起票してください。

Q. 「時間単位レポート」にチェックを入れると金額が消えるのはなぜですか?

Section titled “Q. 「時間単位レポート」にチェックを入れると金額が消えるのはなぜですか?”

beforeSave() の仕様です。IsTimeReport=Y の明細は「作業時間のみの記録で費用を伴わない」という位置づけのため、経費金額(ExpenseAmt)・換算金額(ConvertedAmt)・行合計(LineNetAmt)が強制的に 0 にセットされます。金額を計上したい場合はチェックを外してください。

Q. 換算金額(ConvertedAmt)はいつ再計算されますか?

Section titled “Q. 換算金額(ConvertedAmt)はいつ再計算されますか?”

新規登録時、または経費金額(ExpenseAmt)か通貨(C_Currency_ID)が変更されたときbeforeSave() で再計算されます。明細の通貨と報告通貨が同じ場合は経費金額がそのまま入り、異なる場合は MConversionRate.convert() により作業日付(DateExpense)時点のレートで換算されます。

Q. 行合計(LineNetAmt)はどう計算されますか?

Section titled “Q. 行合計(LineNetAmt)はどう計算されますか?”

経費金額 × 数量 です。新規登録時、または数量(Qty)・経費金額(ExpenseAmt)が変更されたときに自動再計算されます。手入力しても保存時に上書きされます。

Q. 「経費(未払い)」ウィンドウとの違いは何ですか?

Section titled “Q. 「経費(未払い)」ウィンドウとの違いは何ですか?”

本ウィンドウは顧客への請求が目的で、受注伝票がまだ生成されていない明細を対象にします。一方 経費(未払い) は**従業員・仕入先への精算(立替金の払い戻し)**が目的で、仕入請求伝票が未生成の明細を対象にします。同じ S_TimeExpenseLine を別の切り口で見ています。

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

経費精算伝票(AD_Window_ID: 242)は照会・修正型のウィンドウで、親タブに C_BPartner、子タブに S_TimeExpenseLine を持ちます。実体テーブルの新規作成は行わず、経費報告(S_TimeExpense)から起票済みの明細を「顧客未請求」という条件で絞り込んで表示します。明細のロジックは MTimeExpenseLine クラス(360行)が担い、金額計算・リソースアサイン同期・ヘッダー金額の更新を行います。親ヘッダーの MTimeExpense(613行)が伝票処理(DocAction / DocStatus)を持ちますが、このウィンドウには伝票アクションのフィールドは含まれません。

classDiagram
    class MTimeExpenseLine {
        +getParent() MTimeExpense
        +getQtyInvoiced() BigDecimal
        +getQtyReimbursed() BigDecimal
        +getPriceInvoiced() BigDecimal
        +getPriceReimbursed() BigDecimal
        +getApprovalAmt() BigDecimal
        +getC_Currency_Report_ID() int
        +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
    MTimeExpenseLine --> MTimeExpense : parent
    MTimeExpenseLine --> MResourceAssignment : syncs
    MTimeExpenseLine --> MConversionRate : uses

+getParent() MTimeExpense +getQtyInvoiced() BigDecimal +getQtyReimbursed() BigDecimal +getPriceInvoiced() BigDecimal +getPriceReimbursed() BigDecimal +getApprovalAmt() BigDecimal +getC_Currency_Report_ID() int +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(親: MTimeExpense.java

カラム名必須説明備考
S_TimeExpenseLine_IDIDPK経費明細ID主キー
AD_Client_IDTableDirectYクライアント既定 @AD_Client_ID@
AD_Org_IDTableDirectY組織既定 @AD_Org_ID@
S_TimeExpense_IDSearchY経費報告FK親伝票
LineIntegerY明細番号既定 SQL(MAX+10)
DateExpenseDateY作業日付既定 @DateExpense@;@DateReport@
C_BPartner_IDSearchN取引先請求先
M_Product_IDSearchN品目callout: CalloutTimeExpense.product
QtyQuantityN数量既定 1 / callout: CalloutTimeExpense.amount
C_UOM_IDTableDirectN数量単位
ExpenseAmtAmountN経費金額callout: CalloutTimeExpense.amount
C_Currency_IDTableDirectN通貨既定 @$C_Currency_ID@ / callout あり
ConvertedAmtAmountN換算金額beforeSave で自動算出
LineNetAmtAmountN行合計ExpenseAmt × Qty
InvoicePriceCosts+PricesN請求額0 で価格表既定
PriceInvoicedCosts+PricesN請求価格得意先 AR 価格表通貨
QtyInvoicedQuantityN請求済数量
PriceReimbursedCosts+PricesN精算価格従業員 AP 価格表通貨
QtyReimbursedQuantityN精算数量
IsTimeReportYesNoY時間単位レポートY なら金額を 0 に強制
IsInvoicedYesNoY請求済み
ProcessedYesNoY処理済み
S_TimeType_IDTableDirectN時間タイプ
S_ResourceAssignment_IDAssignmentNリソースアサインcallout: CalloutAssignment.product
C_OrderLine_IDSearchN受注明細生成された受注明細
C_InvoiceLine_IDSearchN仕入請求明細精算側で使用
C_Project_ID / C_ProjectPhase_ID / C_ProjectTask_IDTableDirectNプロジェクト関連
C_Campaign_ID / C_Activity_IDTableDirectN営業活動・アクティビティ
erDiagram
    S_TimeExpense ||--o{ S_TimeExpenseLine : "lines"
    C_BPartner ||--o{ S_TimeExpenseLine : "billed to"
    S_TimeExpenseLine }o--o| M_Product : "product"
    S_TimeExpenseLine }o--o| S_TimeType : "time type"
    S_TimeExpenseLine }o--o| S_ResourceAssignment : "assignment"
    S_TimeExpenseLine }o--o| C_OrderLine : "invoiced via"
    S_TimeExpenseLine }o--o| C_Project : "project"

billed to time type invoiced via

flowchart TD
    A["beforeSave"] --> B{"新規 かつ 親が Processed?"}
    B -->|Yes| C["saveError ParentComplete<br/>→ false"]
    B -->|No| D{"新規 or ExpenseAmt/通貨 変更?"}
    D -->|Yes| E["ConvertedAmt を算出<br/>同一通貨ならそのまま<br/>異なれば MConversionRate.convert"]
    D -->|No| F
    E --> F{"新規 or Qty/ExpenseAmt 変更?"}
    F -->|Yes| G["LineNetAmt = ExpenseAmt × Qty"]
    F -->|No| H
    G --> H{"IsTimeReport = Y?"}
    H -->|Yes| I["ExpenseAmt / ConvertedAmt<br/>/ LineNetAmt を 0 に"]
    H -->|No| J["true を返す"]
    I --> J

新規 かつ 親が Processed? saveError ParentComplete → false 新規 or ExpenseAmt/通貨 変更? ConvertedAmt を算出 同一通貨ならそのまま 異なれば MConversionRate.convert 新規 or Qty/ExpenseAmt 変更? LineNetAmt = ExpenseAmt × Qty IsTimeReport = Y? ExpenseAmt / ConvertedAmt / LineNetAmt を 0 に true を返す

  1. 親伝票の完了チェック: 新規行かつ getParent().isProcessed() の場合、ParentComplete エラーで保存を中止
  2. 換算金額の算出: 明細通貨と報告通貨(getC_Currency_Report_ID())が同一なら ExpenseAmt をそのままセット。異なる場合は MConversionRate.convert()DateExpense 時点のレートを適用
  3. 行合計の算出: LineNetAmt = ExpenseAmt × Qty
  4. 時間レポートの金額ゼロ化: isTimeReport() が true の場合、経費金額・換算金額・行合計をすべて Env.ZERO にセット
  1. updateHeader() を呼び、親の経費報告のヘッダー金額を再集計
  2. 新規、または S_ResourceAssignment_ID が変更された場合:
    • 変更前のリソースアサインが存在すれば MResourceAssignment.delete() で削除
    • 新しいリソースアサインに対し、明細の数量(Qty)と説明(Description)を同期して saveEx()
  1. updateHeader() でヘッダー金額を再集計
  2. 紐付いていたリソースアサイン(S_ResourceAssignment_ID)を削除

⚠️ 注意: リソースアサインは明細に従属して削除されます。同一のリソースアサインを他の伝票から参照している設計にすると、明細削除時に予期せず消える可能性があります。

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

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

このテーブルに登録されている Callout

Section titled “このテーブルに登録されている Callout”
カラムCallout クラス
ExpenseAmtorg.compiere.model.CalloutTimeExpense.amount
Qtyorg.compiere.model.CalloutTimeExpense.amount
C_Currency_IDorg.compiere.model.CalloutTimeExpense.amount
M_Product_IDorg.compiere.model.CalloutTimeExpense.product
S_ResourceAssignment_IDorg.compiere.model.CalloutAssignment.product

品目や数量を変更したときの金額・単価の初期セットはこれらの Callout が行います。入力時の自動セット挙動を変えたい場合は、AD_Column.Callout を独自クラスに差し替えるか、後述の Model Validator で最終値を補正します。

請求前チェックの独自ルールは Model Validator で追加できます。

public class CustomTimeExpenseLineValidator 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) {
// 例: 顧客請求する明細は品目必須
if (!line.isTimeReport() && line.getM_Product_ID() == 0) {
throw new AdempiereException("請求対象の経費明細には品目を指定してください");
}
}
}
return null;
}
}

請求価格(PriceInvoiced)は得意先の売価表に基づいて決まります。数量割引や得意先別単価を追加する場合は、価格計算側(IPricingRule の OSGi サービス実装)で対応するとコア改変を避けられます。

プロセス名説明
経費からの受注生成未請求の経費明細から売上側の受注伝票を生成(C_OrderLine_ID がセットされる)

経費の顧客請求は、請求単価の決定ルールや承認フローに各社固有の要件が出やすい領域です。 Callout と Model Validator を組み合わせることで、コアを変更せずに自社ルールを反映できます。

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

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