iDempiere 課題プロジェクトの使い方|取引先管理 操作マニュアル・技術仕様
📖 取引先管理の全体像: 取引先管理の全体図 も合わせてご覧ください。
課題プロジェクトは、自動課題レポート(Issue Reporting)が課題の発生元となる導入プロジェクトを記録するマスタです。課題が報告されるたびに MIssueProject.get() が名称をキーに自動で検索・作成するため、原則としてユーザーが手入力する画面ではありません。
📌 ポイント: このウィンドウは iDempiere 13 標準では無効化されています(AD_Window_ID: 370、標準メニュー未登録)。レコードはコード側から自動生成される想定で、テーブル定義も削除不可(
IsDeleteable=N)です。案件・工数の管理には プロジェクト(Project) をご利用ください。
課題プロジェクトでできること
Section titled “課題プロジェクトでできること”- 課題の発生元プロジェクトを名称(120文字)で識別
- システムステータス(評価中/導入中/本番稼働)の保持
- 資産(Asset) との紐づけによる導入環境の特定
- プロジェクト(Project) との紐づけによる会計プロジェクトへの接続
- 統計情報(60文字)・プロファイル情報(4000文字)の保持
- 説明欄への運用メモの記載
⚠️ 注意: レコードは
MIssueProject.get(MIssue)によって自動作成・自動更新されます。手動で「システムステータス」「統計情報」「プロファイル」を編集しても、次に同名の課題が報告された時点で課題側の値に上書きされます。
課題プロジェクトは単一タブの構成です。
| タブ名 | テーブル | 項目数 | 役割 |
|---|---|---|---|
| 課題プロジェクト | R_IssueProject | 10項目 | プロジェクト名・システムステータス・資産/プロジェクト紐づけ |
基本操作手順
Section titled “基本操作手順”graph TD
A["🐞 課題が発生<br/>MIssue が生成される"] --> B{"課題の Name が<br/>設定されているか"}
B -->|null| C["⏹ 何もしない<br/>(null を返す)"]
B -->|あり| D["🔎 R_IssueProject を<br/>Name で検索"]
D --> E{ヒットしたか}
E -->|あり| F["📄 既存レコードを読み込み"]
E -->|なし| G["➕ 新規レコードを作成<br/>Name をセット"]
F --> H["🔄 システムステータス・統計情報<br/>プロファイルを課題の値で更新"]
G --> H
H --> I["💾 保存"]
I --> J["🔗 課題側に<br/>R_IssueProject_ID と<br/>A_Asset_ID を書き戻し"]
アクセス方法(メニューパス)
Section titled “アクセス方法(メニューパス)”iDempiere 13 標準ではメニューに登録されていません。内容を確認したい場合は、システム管理者が「システム管理 > 一般ルール > システムルール > メニュー」で AD_Window_ID 370(Issue Project)のメニュー項目を追加し、ロールにウィンドウアクセス権を付与します。
新規登録(手動で登録する場合)
Section titled “新規登録(手動で登録する場合)”- ツールバーの「新規」ボタンをクリック
- 必須項目を入力:
- 名称: プロジェクト名(120文字まで)
- システムステータス:
評価中(E)/導入中(I)/本番稼働(P)から選択
- 必要に応じて紐づけを設定:
- 資産: 導入環境を表す資産レコード
- プロジェクト: 会計プロジェクト(
C_Project)
- 統計情報(60文字)・プロファイル(4000文字)・説明(255文字)を入力
- 「保存」をクリック
💡 ヒント: 名称は自動照合のキーです。手動登録する場合も、課題側で使われる名称と完全一致させないと自動更新の対象になりません。
項目リファレンス
Section titled “項目リファレンス”課題プロジェクト タブ
Section titled “課題プロジェクト タブ”| 項目名 | 必須 | 型 | 説明 |
|---|---|---|---|
| クライアント | 必須 | Table Direct | 対象クライアント(テナント) |
| 組織 | 必須 | Table Direct | 対象組織 |
| 名称 | 必須 | 文字列(120) | プロジェクト名。自動照合のキー |
| 説明 | - | 文字列(255) | 補足説明 |
| システムステータス | 必須 | リスト | 評価中(E) / 導入中(I) / 本番稼働(P) |
| 資産 | - | Search | 導入環境を表す資産(A_Asset) |
| プロジェクト | - | Search | 会計プロジェクト(C_Project) |
| 統計情報 | - | 文字列(60) | 障害分析用の統計情報 |
| プロファイル | - | 文字列(4000) | 障害分析用のプロファイル情報 |
| 有効 | 必須 | チェック | レコードが有効かどうか |
よくある質問(FAQ)
Section titled “よくある質問(FAQ)”Q. 課題プロジェクトを削除できません
Section titled “Q. 課題プロジェクトを削除できません”R_IssueProject は削除不可テーブル(IsDeleteable=N)として定義されています。課題履歴の参照整合性を守るための仕様です。使わなくなったレコードは「有効」チェックを外して無効化してください。
Q. 資産(Asset)が自動でセットされません
Section titled “Q. 資産(Asset)が自動でセットされません”MIssueProject.setA_Asset_ID(MIssue) の実装は、内部変数を 0 に初期化してそのまま設定するだけで、課題からの資産の引き当ては行いません。つまり新規作成時に資産は必ず未設定(0)になります。資産を紐づけたい場合は手動で設定してください。なお、既存レコードに資産が設定されている場合は、get() の最後で課題側(MIssue.A_Asset_ID)へ書き戻されます。
Q. システムステータスを手で変えても元に戻ってしまいます
Section titled “Q. システムステータスを手で変えても元に戻ってしまいます”MIssueProject.get() は、既存レコードを見つけた場合でも setSystemStatus() / setStatisticsInfo() / setProfileInfo() を課題側の値で毎回上書きしてから保存します。この3項目は自動同期される設計です。
Q. システムステータスが空欄の課題はどう扱われますか?
Section titled “Q. システムステータスが空欄の課題はどう扱われますか?”MIssue.getSystemStatus() は値が未設定または空文字の場合、既定値として SYSTEMSTATUS_Evaluation("E" = 評価中)を返します。したがって課題プロジェクト側にも「評価中」がセットされます。
Q. 会計プロジェクト(C_Project)と何が違いますか?
Section titled “Q. 会計プロジェクト(C_Project)と何が違いますか?”R_IssueProject は課題レポート専用のマスタで、予算・工数・請求といった機能を一切持ちません。案件管理は プロジェクト を使用し、課題プロジェクトの「プロジェクト」項目でリンクさせる構成になります。
- 課題システム(Issue System)の使い方
- 課題ユーザー(Issue User)の使い方
- 既知課題(Known Issue)の使い方
- プロジェクト(Project)の使い方
- 資産(Asset)の使い方
- 画面リファレンス: 課題プロジェクト
🛠 技術仕様(開発者向け)
課題プロジェクトは R_IssueProject テーブルに格納され、MIssueProject クラス(155行、X_R_IssueProject(302行)を継承)が自動照合・自動生成のロジックを担います。
| 項目 | 値 |
|---|---|
| テーブル | R_IssueProject |
| ウィンドウ | AD_Window_ID: 370(Issue Project、iDempiere 13 では無効化) |
| モデルクラス | MIssueProject(155行) / X_R_IssueProject(302行) |
| インターフェース | I_R_IssueProject |
| アクセスレベル | 6(システム+クライアント) |
| 削除可否 | 不可(IsDeleteable=N) |
| 大量データ | はい(IsHighVolume=Y) |
アーキテクチャ概要
Section titled “アーキテクチャ概要”classDiagram
class MIssueProject {
+get(MIssue) MIssueProject$
+setA_Asset_ID(MIssue) void
+toString() String
}
class X_R_IssueProject {
<<generated>>
+getSystemStatus() String
+getStatisticsInfo() String
+getProfileInfo() String
+getC_Project_ID() int
+getA_Asset_ID() int
}
class PO {
<<abstract>>
}
MIssueProject --|> X_R_IssueProject
X_R_IssueProject --|> PO
MIssue --> MIssueProject : "get(issue)"
MIssueProject --> C_Project : links
MIssueProject --> A_Asset : links
パッケージ: org.compiere.model
ソースファイル: org.adempiere.base/src/org/compiere/model/MIssueProject.java
関連DBテーブル
Section titled “関連DBテーブル”R_IssueProject(課題プロジェクト)
Section titled “R_IssueProject(課題プロジェクト)”| カラム名 | 型 | 必須 | 説明 | 備考 |
|---|---|---|---|---|
| R_IssueProject_ID | ID(10) | PK | 課題プロジェクトID | 主キー。説明は「Implementation Projects」 |
| R_IssueProject_UU | UUID(36) | N | UUID | |
| AD_Client_ID | Table Direct | Y | クライアント | |
| AD_Org_ID | Table Direct | Y | 組織 | |
| Name | String(120) | Y | 名称 | 識別子・自動照合キー |
| Description | String(255) | N | 説明 | |
| SystemStatus | List(1) | Y | システムステータス | E/I/P。get() で自動上書き |
| A_Asset_ID | Search | N | 資産 | 新規作成時は常に 0 |
| C_Project_ID | Search | N | プロジェクト | C_Project 参照 |
| StatisticsInfo | String(60) | N | 統計情報 | get() で自動上書き |
| ProfileInfo | String(4000) | N | プロファイル | get() で自動上書き |
| IsActive | Yes-No(1) | Y | 有効 |
SystemStatus のリスト値
Section titled “SystemStatus のリスト値”X_R_IssueSystem / X_R_IssueProject で定義される定数(AD_Reference_ID: 374)は次の3種です。
| 値 | 定数 | 意味 |
|---|---|---|
| E | SYSTEMSTATUS_Evaluation | 評価中(既定値) |
| I | SYSTEMSTATUS_Implementation | 導入中 |
| P | SYSTEMSTATUS_Production | 本番稼働 |
erDiagram
AD_Issue ||--o| R_IssueProject : "reported from project"
R_IssueProject ||--o| C_Project : "financial project"
R_IssueProject ||--o| A_Asset : "installed asset"
AD_Issue ||--o| R_IssueSystem : "reporting system"
AD_Issue ||--o| R_IssueUser : "reporting user"
ビジネスロジック
Section titled “ビジネスロジック”自動照合・自動生成(MIssueProject.get(MIssue))
Section titled “自動照合・自動生成(MIssueProject.get(MIssue))”static public MIssueProject get(MIssue issue) の処理順序は次のとおりです。
issue.getName()がnullなら 即nullを返す(何も作らない)SELECT * FROM R_IssueProject WHERE Name=?で名称完全一致検索(トランザクションなし=trxNameはnull)- ヒットしなければ新規インスタンスを生成し、
setName(issue.getName())とsetA_Asset_ID(issue)を実行 - ヒットの有無にかかわらず
setSystemStatus()/setStatisticsInfo()/setProfileInfo()を課題の値で上書き save()に失敗した場合はnullを返す- 成功時は課題側に
setR_IssueProject_ID()を書き戻し、レコードに資産がセットされていればissue.setA_Asset_ID()も書き戻す
検索は
AD_Client_IDで絞り込まず、Name単独で行われます。マルチテナント環境では同名プロジェクトが混在しうる点に注意してください。
資産設定(setA_Asset_ID(MIssue))
Section titled “資産設定(setA_Asset_ID(MIssue))”public void setA_Asset_ID (MIssue issue){ int A_Asset_ID = 0; super.setA_Asset_ID (A_Asset_ID);}引数 issue を参照せず常に 0 を設定する実装です。新規作成時に資産が自動で引き当てられないのはこのためです。
拡張ポイント
Section titled “拡張ポイント”このテーブルにはカラム単位の Callout は定義されていません。自動生成時の挙動を変えたい場合は、OSGi プラグインの Model Validator で補完するのが安全です。
public class IssueProjectEnricher implements ModelValidator { @Override public String modelChange(PO po, int type) throws Exception { if (po instanceof MIssueProject && type == TYPE_BEFORE_NEW) { MIssueProject pj = (MIssueProject) po; // 例: 命名規則から会計プロジェクトを自動で紐づける int projectId = DB.getSQLValue(po.get_TrxName(), "SELECT C_Project_ID FROM C_Project WHERE Value=? AND AD_Client_ID=?", pj.getName(), pj.getAD_Client_ID()); if (projectId > 0) pj.setC_Project_ID(projectId); } return null; }
@Override public String docValidate(PO po, int timing) { return null; // R_IssueProject は伝票型ではないため不要 }}関連プロセス
Section titled “関連プロセス”このウィンドウに紐づく標準プロセス・レポートはありません(標準メニュー未登録)。
関連ドキュメント
Section titled “関連ドキュメント”iDempiereカスタマイズのご相談
Section titled “iDempiereカスタマイズのご相談”課題プロジェクトは自動生成される一方で、資産や会計プロジェクトとの紐づけはコア実装では補完されません。 As-Link株式会社では、命名規則からの自動リンクなど、運用に合わせた補完ロジックの実装をご支援します。
As-Link株式会社では、OSGiプラグインによる安全なカスタマイズを提供しています。