Certification Exam Preparation
Overview
- What you’ll learn:
- How the iDempiere Developer Certification exam is structured, what topics it covers, and how to prepare effectively
- How to review key concepts from each module — Architecture, Plugin Development, Production, and Financial Management — with targeted practice scenarios
- How to approach exam questions strategically, manage your time, and connect certification to career development
- Prerequisites: Lessons 1-46 (complete iDempiere learning curriculum across all paths)
- Estimated reading time: 25 minutes
Introduction
You have reached the final lesson of the iDempiere learning curriculum. Over the previous 46 lessons, you have built comprehensive knowledge spanning iDempiere’s architecture, data model, configuration, customization, production, financial management, performance optimization, integration, and implementation methodology. This lesson helps you consolidate that knowledge and prepare for the certification exam that validates your expertise.
Certification serves multiple purposes: it validates your skills to employers and clients, it forces a comprehensive review that deepens your understanding, and it connects you to a community of certified professionals. Whether or not you plan to take the exam immediately, the review process in this lesson will strengthen your command of the material.
Exam Overview and Format
The iDempiere Developer Certification exam tests both theoretical knowledge and practical skills. Understanding the format helps you prepare efficiently.
Exam Structure
- Section 1: Multiple-Choice Questions (60% of the exam). These test conceptual understanding, architectural knowledge, and decision-making ability. Questions range from straightforward factual recall to scenario-based questions that require analysis and judgment.
- Section 2: Hands-On Coding Exercises (40% of the exam). These require you to write actual Java code — implementing model validators, callouts, processes, or plugin configurations. You will work in a provided iDempiere development environment.
Exam Topics Distribution
| Module | Weight | Key Topics |
|---|---|---|
| Architecture | 25% | Three-tier architecture, OSGi, Application Dictionary, database design, system administration |
| Plugin Development | 30% | Model validators, callouts, processes, forms, event handlers, packaging, deployment |
| Production | 20% | BOM, MProduction, phantom assemblies, costing, production reporting |
| Financial Management | 25% | Chart of accounts, accounting schema, GL, AP, AR, costing, reporting |
Passing Criteria
You must achieve a passing score on both sections — the multiple-choice section and the hands-on section — to earn certification. A strong performance in one section cannot compensate for a failing score in the other. This ensures that certified developers have both theoretical knowledge and practical coding ability.
Architecture Module Review
The Architecture module covers the foundational knowledge of how iDempiere is built and operates. This is tested primarily through multiple-choice questions.
Key Concepts to Review
- Three-tier architecture: Be able to describe the database tier (PostgreSQL/Oracle), application tier (Java/OSGi/Equinox), and presentation tier (ZK Framework). Understand the responsibilities of each tier and how they communicate.
- OSGi and Eclipse Equinox: Understand bundles, services, extension points, and the lifecycle of OSGi components. Know how iDempiere uses OSGi for modularity and plugin architecture.
- Application Dictionary: Understand the AD tables (AD_Table, AD_Column, AD_Window, AD_Tab, AD_Field, AD_Process, AD_Reference) and how they define the user interface and behavior. Be able to explain model-driven development — how changes in the AD automatically reflect in the UI without code changes.
- Database design patterns: Understand the standard columns (AD_Client_ID, AD_Org_ID, IsActive, Created/Updated/CreatedBy/UpdatedBy), the multi-tenant data model, soft delete pattern, and the document processing framework (DocAction, DocStatus).
- Caching: Understand how iDempiere caches Application Dictionary metadata and reference data. Know the CCache class and cache invalidation patterns.
Common Exam Questions (Architecture)
Q: What is the primary advantage of iDempiere’s Application Dictionary approach compared to hardcoded UI definitions?
A: The Application Dictionary stores UI definitions (windows, tabs, fields, processes) as data in the database rather than in code. This enables runtime modification of the user interface through configuration changes without recompiling or redeploying the application. It also enables features like role-based field visibility, dynamic validation, and metadata-driven code generation.
Q: Explain the difference between an OSGi extension point and an OSGi service. How does iDempiere use each?
A: An extension point is a declared place where plugins can contribute functionality (e.g., adding a new process factory, model factory, or form factory). Extensions are typically declared in plugin.xml files. An OSGi service is a Java object registered in the OSGi service registry that implements a defined interface, allowing other bundles to discover and use it at runtime. iDempiere uses extension points for UI contributions (forms, processes, infopanels) and services for business logic extensions (model validators, event handlers, callouts).
Q: Why does every iDempiere table include AD_Client_ID and AD_Org_ID columns?
A: These columns implement multi-tenant data isolation. AD_Client_ID separates data between completely independent business entities (tenants). AD_Org_ID further segments data by organizational unit within a client. The security framework uses these columns to enforce data access rules — users can only see and modify records belonging to their authorized clients and organizations. This enables a single database to securely serve multiple tenants.
Plugin Development Module Review
The Plugin Development module is the most heavily weighted section and includes both multiple-choice questions and hands-on coding exercises.
Key Concepts to Review
- Model Validators: Know how to implement
IModelValidatorand register it as an OSGi component. Understand the timing constants (TIMING_BEFORE_SAVE, TIMING_AFTER_SAVE, TIMING_BEFORE_DELETE, etc.) and document validation timings (TIMING_BEFORE_COMPLETE, TIMING_AFTER_COMPLETE, etc.). Know when to return null (success) vs. a string (error message). - Callouts: Understand the difference between callouts and model validators. Know how to implement
IColumnCalloutand register it. Remember that callouts are UI-level events — they fire when a user changes a field, not during programmatic saves. - Processes: Be able to implement a
SvrProcesssubclass. Know how to declare process parameters (in the Application Dictionary and retrieved viagetParameter()), log progress, and return success or failure. - Event Handlers: Understand iDempiere’s event system based on OSGi EventAdmin. Know the event topics (e.g.,
IEventTopics.PO_BEFORE_NEW) and how to register event handlers using Declarative Services. - Plugin packaging: Understand MANIFEST.MF (bundle name, version, imports, exports), component.xml (OSGi Declarative Services), and 2Pack for deploying Application Dictionary changes.
Practice Scenario: Model Validator
Task: Write a model validator that prevents a sales order from being completed if the total exceeds the customer’s credit limit.
@Component(name = "com.example.CreditLimitValidator",
immediate = true,
service = IModelValidator.class)
public class CreditLimitValidator implements IModelValidator {
private int clientId = -1;
@Override
public void initialize(ModelValidationEngine engine, MClient client) {
if (client != null) clientId = client.getAD_Client_ID();
engine.addDocValidate(MOrder.Table_Name, this);
}
@Override
public int getAD_Client_ID() {
return clientId;
}
@Override
public String login(int AD_Org_ID, int AD_Role_ID, int AD_User_ID) {
return null;
}
@Override
public String modelChange(PO po, int type) throws Exception {
return null;
}
@Override
public String docValidate(PO po, int timing) {
if (timing == TIMING_BEFORE_COMPLETE) {
MOrder order = (MOrder) po;
// Only check sales orders
if (!order.isSOTrx()) return null;
MBPartner bp = new MBPartner(order.getCtx(),
order.getC_BPartner_ID(), order.get_TrxName());
BigDecimal creditLimit = bp.getSO_CreditLimit();
if (creditLimit == null || creditLimit.signum() == 0)
return null; // No limit set
BigDecimal creditUsed = bp.getSO_CreditUsed();
BigDecimal orderTotal = order.getGrandTotal();
BigDecimal totalExposure = creditUsed.add(orderTotal);
if (totalExposure.compareTo(creditLimit) > 0) {
return "Credit limit exceeded. Limit: " +
creditLimit + ", Current exposure: " +
creditUsed + ", Order total: " + orderTotal;
}
}
return null;
}
}
This example demonstrates the essential patterns: component annotation for OSGi registration, implementing the interface methods, registering for specific document events, and returning null for success or an error message for failure.
Practice Scenario: Process
Task: Write a process that updates the credit status of all business partners based on their payment history.
public class UpdateCreditStatusProcess extends SvrProcess {
private int daysOverdue = 30;
@Override
protected void prepare() {
for (ProcessInfoParameter param : getParameter()) {
if ("DaysOverdue".equals(param.getParameterName())) {
daysOverdue = param.getParameterAsInt();
}
}
}
@Override
protected String doIt() throws Exception {
int updated = 0;
int total = 0;
String sql = "SELECT DISTINCT C_BPartner_ID FROM C_Invoice " +
"WHERE IsSOTrx='Y' AND IsPaid='N' AND " +
"PaymentTermDueDate(C_PaymentTerm_ID, DateInvoiced) " +
"< addDays(getDate(), -?) " +
"AND AD_Client_ID = ?";
PreparedStatement pstmt = DB.prepareStatement(sql, get_TrxName());
pstmt.setInt(1, daysOverdue);
pstmt.setInt(2, getAD_Client_ID());
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
total++;
int bpId = rs.getInt(1);
MBPartner bp = new MBPartner(getCtx(), bpId, get_TrxName());
if (!"X".equals(bp.getSOCreditStatus())) {
bp.setSOCreditStatus("X"); // Credit Hold
bp.saveEx();
updated++;
addLog("Set credit hold: " + bp.getName());
}
}
DB.close(rs, pstmt);
return "Reviewed " + total + " partners, " +
updated + " placed on credit hold";
}
}
Production Module Review
The Production module tests your understanding of production planning, execution, and costing within iDempiere.
Key Concepts to Review
- Bill of Materials (BOM): Understand multi-level BOMs, BOM types (make-to-order, make-to-stock), phantom assemblies, component quantity calculations, and BOM versioning. Know the difference between
PP_Product_BOM(header) andPP_Product_BOMLine(components). - Material Requirements Planning (MRP): Understand the MRP calculation logic — gross requirements, scheduled receipts, projected on-hand, net requirements, planned orders. Know MRP parameters (lead time, safety stock, order quantity policies) and how MRP handles multi-level BOMs (explosion).
- Production Orders: Understand the production order lifecycle (drafted, in progress, completed, closed). Know how material issues (component consumption) and receipts (finished goods output) are recorded. Understand cost collection on production orders.
- Costing methods: Understand standard cost (predefined cost used for variance analysis), average cost (weighted moving average), and actual cost (specific job costing). Know how each method values inventory and recognizes production variances.
Common Exam Questions (Production)
Q: Explain the difference between a phantom BOM and a regular BOM. When would you use a phantom BOM?
A: A phantom BOM (also called a pseudo-BOM) represents a sub-assembly that is not physically stocked as a separate item. When MRP encounters a phantom BOM, it “explodes through” the phantom — instead of planning a production order for the phantom, it adds the phantom’s components directly to the parent’s material requirements. Use phantom BOMs for logical groupings of components that are always consumed together but never independently manufactured or stocked (e.g., a “hardware kit” that is always part of a larger assembly).
Q: A production order for 100 units of Product A was completed. Standard cost per unit is $50. Actual material cost was $4,800 and actual labor cost was $700. What is the total production variance and how is it classified?
A: Standard cost for 100 units = 100 x $50 = $5,000. Actual cost = $4,800 + $700 = $5,500. Total variance = $5,500 – $5,000 = $500 unfavorable. This can be further broken down into material variance (actual material minus standard material) and labor variance (actual labor minus standard labor), depending on the standard cost breakdown.
Financial Management Module Review
The Financial Management module covers accounting configuration, transaction processing, and financial reporting.
Key Concepts to Review
- Chart of Accounts: Understand account elements (
C_ElementValue), account types (Asset, Liability, Owner’s Equity, Revenue, Expense), natural accounts versus dimension accounts, and summary accounts versus posting accounts. - Accounting Schema: Understand the purpose of
C_AcctSchema, GAAP settings, costing level (client, organization, batch/lot), currency, and the role of accounting dimensions (Account, Organization, BPartner, Product, Activity, Campaign, Project). - Document processing and accounting: Understand how document completion triggers the accounting engine. Know the relationship between source documents (invoices, payments, shipments) and their accounting consequences (
Fact_Acctentries). Understand the posting logic for key document types. - Accounts Payable: Vendor invoice processing, three-way matching (PO, receipt, invoice), payment terms, payment selection, payment generation.
- Accounts Receivable: Customer invoicing, credit management, dunning, payment receipt, allocation.
- Financial reporting: Trial balance, balance sheet, income statement. Understand how iDempiere’s report engine aggregates Fact_Acct data to produce financial statements.
- Multi-currency accounting: Exchange rate types, currency conversion at transaction time, realized and unrealized gain/loss calculation, revaluation processes.
Common Exam Questions (Financial Management)
Q: Describe the accounting entries generated when a vendor invoice is matched to a purchase order and material receipt in iDempiere.
A: When a vendor invoice is completed with a matching PO and receipt: (1) Debit the expense or inventory account for the invoice line amount. (2) Credit the Accounts Payable liability account. If the invoice amount differs from the PO amount (and the PO was the basis for the receipt valuation), a price variance entry is generated: debit or credit the Purchase Price Variance account for the difference. The inventory was initially valued at PO cost upon receipt; the invoice adjusts for any price difference.
Q: What is the difference between realized and unrealized foreign exchange gain/loss?
A: Realized gain/loss occurs when a foreign currency transaction is settled (e.g., a payment is received for a foreign currency invoice). The difference between the exchange rate at invoice date and payment date creates a realized gain or loss that is posted to the Exchange Gain/Loss account. Unrealized gain/loss occurs at period-end when open foreign currency balances are revalued using the current exchange rate. This adjusts the balance sheet to reflect current values but is reversed at the start of the next period. Unrealized gains/losses are calculated by a revaluation process and do not represent actual cash flow differences.
Practice Scenario: Accounting Analysis
Scenario: A company sells goods to a customer. The sales order has 10 units of Product X at $100 each. The product’s average cost is $60 per unit. Tax rate is 10%. Trace the accounting entries through the full order-to-cash cycle.
- Shipment (Material Receipt from customer perspective):
- Debit: Cost of Goods Sold $600 (10 x $60)
- Credit: Inventory $600
- Customer Invoice:
- Debit: Accounts Receivable $1,100 ($1,000 + $100 tax)
- Credit: Revenue $1,000
- Credit: Tax Payable $100
- Payment Receipt:
- Debit: Bank/Cash $1,100
- Credit: Payment Selection/Unallocated $1,100
- Payment Allocation:
- Debit: Payment Selection/Unallocated $1,100
- Credit: Accounts Receivable $1,100
Gross profit on this transaction: Revenue ($1,000) minus COGS ($600) = $400 (40% margin).
Study Strategies and Time Management
Preparing effectively for the certification exam requires a structured approach.
Study Plan
- Review all lessons: Re-read each lesson, focusing on the concepts you find least familiar. Take notes on topics that require additional practice.
- Hands-on practice: Set up a development environment and practice writing model validators, callouts, processes, and event handlers. The coding exercises require fluency, not just understanding.
- Practice with Garden World: Use the Garden World demo environment to walk through business processes end-to-end: creating orders, completing shipments, generating invoices, processing payments, running MRP, and creating production orders.
- Study the source code: Read the source code for key classes —
MOrder,MInvoice,MPayment,Doc_Invoice,MPPMRP. Understanding how the core code works deepens your ability to extend it. - Practice scenarios: Work through the practice scenarios in this lesson and create your own. The ability to analyze a business scenario and determine the correct iDempiere configuration or code is the core skill being tested.
Time Management During the Exam
- Allocate time proportionally to each section’s weight. Do not spend too long on any single question.
- For multiple-choice questions: read all options before selecting. Eliminate obviously wrong answers first. If unsure, mark the question for review and move on.
- For coding exercises: read the entire problem statement before starting to code. Plan your approach (which classes to extend, which methods to implement) before writing code. Leave time for testing.
- Reserve 10-15 minutes at the end for review — check for unanswered questions and re-read your code for obvious errors.
Common Exam Pitfalls
Candidates commonly lose points on the following patterns:
- Confusing model validators and callouts: Remember that callouts fire on UI events (user changes a field) while model validators fire on data events (record save/delete, document processing). Callouts do not fire during programmatic saves.
- Forgetting null checks: In coding exercises, failing to check for null values on optional fields or lookup results causes NullPointerExceptions. Always handle null defensively.
- Incorrect document timing: Using TIMING_AFTER_COMPLETE when you need TIMING_BEFORE_COMPLETE (or vice versa) is a common error. Before-complete can prevent completion (by returning an error); after-complete cannot prevent it but can perform follow-up actions.
- Confusing debit and credit: In accounting questions, remember the fundamental rules: assets and expenses increase with debits; liabilities, equity, and revenue increase with credits. An easy mnemonic: DEALER (Debits increase Expenses, Assets, Losses; credits increase Equity, Revenue).
- Overlooking multi-tenant implications: When writing code, always consider AD_Client_ID and AD_Org_ID. Queries that forget to filter by client may return data from other tenants.
Resources for Further Study
Beyond this curriculum, the following resources support continued learning:
- iDempiere Wiki: The official wiki contains detailed documentation on configuration, development, and administration.
- Source code: The GitHub repository is the ultimate reference. Reading the source code for core functionality teaches patterns and conventions that no documentation can fully convey.
- Community mailing lists: The idempiere-developers and idempiere-users mailing lists contain years of discussions, solutions, and design rationale.
- iDempiere Conference recordings: Past conference presentations cover advanced topics and real-world implementation experiences.
- Practice environment: Maintain a personal iDempiere development environment for experimentation. The best way to learn is by doing.
Certification and Career Development
iDempiere certification positions you as a validated expert in an open-source ERP platform that serves organizations worldwide.
Career Paths
- iDempiere Consultant: Implement and configure iDempiere for client organizations. Requires broad functional knowledge and strong communication skills.
- iDempiere Developer: Build custom plugins, integrations, and extensions. Requires strong Java skills and deep knowledge of iDempiere’s architecture and APIs.
- ERP Architect: Design iDempiere deployments for enterprise-scale organizations. Requires expertise in system architecture, performance, and integration.
- Open-Source Contributor: Build a reputation by contributing to iDempiere core, potentially leading to committer status and influence over the platform’s direction.
Continuing Education
The ERP landscape evolves continuously. Stay current by:
- Following iDempiere releases and understanding new features and changes.
- Participating in community discussions and contributing to the project.
- Expanding into adjacent areas: database administration, cloud infrastructure, business analysis, project management.
- Attending the annual iDempiere World Conference.
Summary
This lesson — and the certification it prepares you for — represents the culmination of a comprehensive journey through the iDempiere platform. You have studied the architecture that makes iDempiere work, the development patterns that extend it, the business processes it supports, and the methodology that delivers successful implementations. The certification exam tests this knowledge through both conceptual questions and practical coding exercises.
Remember that certification is a milestone, not a destination. The most valuable iDempiere professionals combine certified knowledge with real-world experience, continuous learning, and active community participation. Take what you have learned in these 47 lessons and apply it — configure systems, write plugins, solve business problems, contribute to the community, and keep learning.
Good luck on your exam, and welcome to the community of iDempiere experts.
繁體中文翻譯
概述
- 學習內容:
- iDempiere 開發者認證考試的結構、涵蓋的主題以及如何有效準備
- 如何回顧每個模組的關鍵概念 — 架構、外掛開發、製造和財務管理 — 附帶針對性的練習情境
- 如何策略性地應對考試題目、管理時間,並將認證與職涯發展連結
- 先備知識:第 1-46 課(完成所有路徑的 iDempiere 完整學習課程)
- 預估閱讀時間:25 分鐘
簡介
您已到達 iDempiere 學習課程的最後一課。在前 46 課中,您已建立了涵蓋 iDempiere 架構、資料模型、設定、客製化、製造、財務管理、效能優化、整合和導入方法論的全面知識。本課幫助您鞏固這些知識,並為驗證您專業技能的認證考試做準備。
認證有多重目的:它向雇主和客戶驗證您的技能,它透過全面回顧加深您的理解,並將您連結到認證專業人士的社群。無論您是否計劃立即參加考試,本課中的回顧過程都將強化您對教材的掌握。
考試概述與格式
iDempiere 開發者認證考試測試理論知識和實務技能。了解格式有助於您有效準備。
考試結構
- 第一部分:選擇題(佔考試的 60%)。這些測試概念理解、架構知識和決策能力。題目範圍從直接的事實回憶到需要分析和判斷的情境式問題。
- 第二部分:實作程式碼練習(佔考試的 40%)。這些要求您撰寫實際的 Java 程式碼 — 實作模型驗證器、Callout、流程或外掛設定。您將在提供的 iDempiere 開發環境中工作。
考試主題分佈
| 模組 | 比重 | 關鍵主題 |
|---|---|---|
| 架構 | 25% | 三層架構、OSGi、Application Dictionary、資料庫設計、系統管理 |
| 外掛開發 | 30% | 模型驗證器、Callout、流程、表單、事件處理器、打包、部署 |
| 製造 | 20% | BOM、MRP、生產訂單、成本計算、品質管理 |
| 財務管理 | 25% | 會計科目表、會計模式、總帳、應付帳款、應收帳款、成本計算、報表 |
及格標準
您必須在兩個部分 — 選擇題部分和實作部分 — 都達到及格分數才能獲得認證。一個部分的強勁表現不能彌補另一個部分的不及格分數。這確保了認證開發者同時具備理論知識和實務程式碼能力。
架構模組回顧
架構模組涵蓋 iDempiere 建構和運作方式的基礎知識。這主要透過選擇題進行測試。
需要回顧的關鍵概念
- 三層架構:能夠描述資料庫層(PostgreSQL/Oracle)、應用程式層(Java/OSGi/Equinox)和展示層(ZK Framework)。了解每一層的職責及它們如何通訊。
- OSGi 和 Eclipse Equinox:了解套件、服務、擴展點和 OSGi 元件的生命週期。知道 iDempiere 如何使用 OSGi 實現模組化和外掛架構。
- Application Dictionary:了解 AD 表(AD_Table、AD_Column、AD_Window、AD_Tab、AD_Field、AD_Process、AD_Reference)及它們如何定義使用者介面和行為。能夠解釋模型驅動開發 — AD 中的變更如何在不修改程式碼的情況下自動反映在 UI 中。
- 資料庫設計模式:了解標準欄位(AD_Client_ID、AD_Org_ID、IsActive、Created/Updated/CreatedBy/UpdatedBy)、多租戶資料模型、軟刪除模式和單據處理框架(DocAction、DocStatus)。
- 快取:了解 iDempiere 如何快取 Application Dictionary 中繼資料和參考資料。知道 CCache 類別和快取失效模式。
常見考試題目(架構)
Q:與硬編碼的 UI 定義相比,iDempiere 的 Application Dictionary 方法的主要優勢是什麼?
A:Application Dictionary 將 UI 定義(視窗、頁籤、欄位、流程)作為資料儲存在資料庫中,而非在程式碼中。這使得透過設定變更在執行時修改使用者介面成為可能,而無需重新編譯或重新部署應用程式。它還啟用了基於角色的欄位可見性、動態驗證和中繼資料驅動的程式碼生成等功能。
Q:解釋 OSGi 擴展點和 OSGi 服務之間的區別。iDempiere 如何使用它們?
A:擴展點是一個已宣告的位置,外掛可以在此貢獻功能(例如新增新的流程工廠、模型工廠或表單工廠)。擴展通常在 plugin.xml 檔案中宣告。OSGi 服務是在 OSGi 服務註冊表中註冊的 Java 物件,它實作了定義的介面,允許其他套件在執行時發現和使用它。iDempiere 使用擴展點用於 UI 貢獻(表單、流程、資訊面板),使用服務用於業務邏輯擴展(模型驗證器、事件處理器、Callout)。
Q:為什麼每個 iDempiere 表都包含 AD_Client_ID 和 AD_Org_ID 欄位?
A:這些欄位實作多租戶資料隔離。AD_Client_ID 在完全獨立的業務實體(租戶)之間分隔資料。AD_Org_ID 進一步按用戶端內的組織單位分隔資料。安全框架使用這些欄位來執行資料存取規則 — 使用者只能查看和修改屬於其授權用戶端和組織的記錄。這使得單一資料庫能夠安全地為多個租戶提供服務。
外掛開發模組回顧
外掛開發模組是比重最高的部分,包括選擇題和實作程式碼練習。
需要回顧的關鍵概念
- 模型驗證器:知道如何實作
IModelValidator並將其註冊為 OSGi 元件。了解時間常數(TIMING_BEFORE_SAVE、TIMING_AFTER_SAVE、TIMING_BEFORE_DELETE 等)和單據驗證時間(TIMING_BEFORE_COMPLETE、TIMING_AFTER_COMPLETE 等)。知道何時傳回 null(成功)與字串(錯誤訊息)。 - Callout:了解 Callout 和模型驗證器之間的區別。知道如何實作
IColumnCallout並註冊它。記住 Callout 是 UI 層級事件 — 它們在使用者變更欄位時觸發,而非在程式化儲存期間。 - 流程:能夠實作
SvrProcess子類別。知道如何宣告流程參數(在 Application Dictionary 中,並透過getParameter()擷取)、記錄進度,並傳回成功或失敗。 - 事件處理器:了解 iDempiere 基於 OSGi EventAdmin 的事件系統。知道事件主題(例如
IEventTopics.PO_BEFORE_NEW)以及如何使用 Declarative Services 註冊事件處理器。 - 外掛打包:了解 MANIFEST.MF(套件名稱、版本、匯入、匯出)、component.xml(OSGi Declarative Services)和用於部署 Application Dictionary 變更的 2Pack。
練習情境:模型驗證器
任務:撰寫一個模型驗證器,在銷售訂單總額超過客戶信用額度時阻止訂單完成。
@Component(name = "com.example.CreditLimitValidator",
immediate = true,
service = IModelValidator.class)
public class CreditLimitValidator implements IModelValidator {
private int clientId = -1;
@Override
public void initialize(ModelValidationEngine engine, MClient client) {
if (client != null) clientId = client.getAD_Client_ID();
engine.addDocValidate(MOrder.Table_Name, this);
}
@Override
public int getAD_Client_ID() {
return clientId;
}
@Override
public String login(int AD_Org_ID, int AD_Role_ID, int AD_User_ID) {
return null;
}
@Override
public String modelChange(PO po, int type) throws Exception {
return null;
}
@Override
public String docValidate(PO po, int timing) {
if (timing == TIMING_BEFORE_COMPLETE) {
MOrder order = (MOrder) po;
// 僅檢查銷售訂單
if (!order.isSOTrx()) return null;
MBPartner bp = new MBPartner(order.getCtx(),
order.getC_BPartner_ID(), order.get_TrxName());
BigDecimal creditLimit = bp.getSO_CreditLimit();
if (creditLimit == null || creditLimit.signum() == 0)
return null; // 未設定額度
BigDecimal creditUsed = bp.getSO_CreditUsed();
BigDecimal orderTotal = order.getGrandTotal();
BigDecimal totalExposure = creditUsed.add(orderTotal);
if (totalExposure.compareTo(creditLimit) > 0) {
return "Credit limit exceeded. Limit: " +
creditLimit + ", Current exposure: " +
creditUsed + ", Order total: " + orderTotal;
}
}
return null;
}
}
此範例展示了基本模式:用於 OSGi 註冊的元件註解、實作介面方法、註冊特定單據事件,以及成功時傳回 null 或失敗時傳回錯誤訊息。
練習情境:流程
任務:撰寫一個流程,根據付款歷史更新所有業務夥伴的信用狀態。
public class UpdateCreditStatusProcess extends SvrProcess {
private int daysOverdue = 30;
@Override
protected void prepare() {
for (ProcessInfoParameter param : getParameter()) {
if ("DaysOverdue".equals(param.getParameterName())) {
daysOverdue = param.getParameterAsInt();
}
}
}
@Override
protected String doIt() throws Exception {
int updated = 0;
int total = 0;
String sql = "SELECT DISTINCT C_BPartner_ID FROM C_Invoice " +
"WHERE IsSOTrx='Y' AND IsPaid='N' AND " +
"PaymentTermDueDate(C_PaymentTerm_ID, DateInvoiced) " +
"< addDays(getDate(), -?) " +
"AND AD_Client_ID = ?";
PreparedStatement pstmt = DB.prepareStatement(sql, get_TrxName());
pstmt.setInt(1, daysOverdue);
pstmt.setInt(2, getAD_Client_ID());
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
total++;
int bpId = rs.getInt(1);
MBPartner bp = new MBPartner(getCtx(), bpId, get_TrxName());
if (!"X".equals(bp.getSOCreditStatus())) {
bp.setSOCreditStatus("X"); // 信用保留
bp.saveEx();
updated++;
addLog("Set credit hold: " + bp.getName());
}
}
DB.close(rs, pstmt);
return "Reviewed " + total + " partners, " +
updated + " placed on credit hold";
}
}
製造模組回顧
製造模組測試您對 iDempiere 內生產規劃、執行和成本計算的理解。
需要回顧的關鍵概念
- 物料清單(BOM):了解多層級 BOM、BOM 類型(接單生產、存貨生產)、虛擬組件、元件數量計算和 BOM 版本管理。知道
PP_Product_BOM(表頭)和PP_Product_BOMLine(元件)之間的區別。 - 物料需求規劃(MRP):了解 MRP 計算邏輯 — 毛需求、排程收貨、預計在庫、淨需求、計劃訂單。知道 MRP 參數(前置時間、安全庫存、訂購數量策略)以及 MRP 如何處理多層級 BOM(展開)。
- 生產訂單:了解生產訂單生命週期(草稿、進行中、完成、關閉)。知道物料發出(元件消耗)和收貨(成品產出)如何記錄。了解生產訂單上的成本歸集。
- 成本計算方法:了解標準成本(用於差異分析的預定成本)、平均成本(加權移動平均)和實際成本(特定作業成本計算)。知道每種方法如何評價庫存和認列生產差異。
常見考試題目(製造)
Q:解釋虛擬 BOM 和常規 BOM 之間的區別。何時使用虛擬 BOM?
A:虛擬 BOM(也稱為偽 BOM)代表不作為獨立品項實際庫存的子組件。當 MRP 遇到虛擬 BOM 時,它會「穿透展開」虛擬件 — 而不是為虛擬件規劃生產訂單,它直接將虛擬件的元件加到父件的物料需求中。當邏輯上的元件組合總是一起消耗但從不獨立製造或庫存時(例如始終是較大組件一部分的「五金套件」),使用虛擬 BOM。
Q:一個生產 100 單位產品 A 的生產訂單已完成。每單位標準成本為 $50。實際材料成本為 $4,800,實際人工成本為 $700。總生產差異是多少?如何分類?
A:100 單位的標準成本 = 100 x $50 = $5,000。實際成本 = $4,800 + $700 = $5,500。總差異 = $5,500 – $5,000 = $500 不利差異。根據標準成本明細,這可以進一步分解為材料差異(實際材料減標準材料)和人工差異(實際人工減標準人工)。
財務管理模組回顧
財務管理模組涵蓋會計設定、交易處理和財務報表。
需要回顧的關鍵概念
- 會計科目表:了解科目元素(
C_ElementValue)、帳戶類型(資產、負債、業主權益、收入、費用)、自然科目與維度科目,以及彙總科目與過帳科目。 - 會計模式:了解
C_AcctSchema的目的、GAAP 設定、成本層級(用戶端、組織、批次/批號)、幣別,以及會計維度(科目、組織、業務夥伴、產品、活動、行銷活動、專案)的角色。 - 單據處理和會計:了解單據完成如何觸發會計引擎。知道來源單據(發票、付款、出貨)與其會計結果(
Fact_Acct分錄)之間的關係。了解關鍵單據類型的過帳邏輯。 - 應付帳款:供應商發票處理、三向比對(採購訂單、收貨、發票)、付款條件、付款選擇、付款生成。
- 應收帳款:客戶開立發票、信用管理、催收、收款、沖銷。
- 財務報表:試算表、資產負債表、損益表。了解 iDempiere 的報表引擎如何彙總 Fact_Acct 資料以產出財務報表。
- 多幣別會計:匯率類型、交易時的幣別轉換、已實現和未實現匯兌損益計算、重估流程。
常見考試題目(財務管理)
Q:描述在 iDempiere 中供應商發票與採購訂單和物料收貨比對時產生的會計分錄。
A:當供應商發票完成且有相符的採購訂單和收貨時:(1) 借記費用或庫存科目,金額為發票明細金額。(2) 貸記應付帳款負債科目。如果發票金額與採購訂單金額不同(且採購訂單是收貨評價的基礎),則生成價格差異分錄:借記或貸記採購價格差異科目作為差額。庫存在收貨時最初按採購訂單成本估值;發票調整任何價格差異。
Q:已實現和未實現外匯損益之間有什麼區別?
A:已實現損益發生在外幣交易結算時(例如收到外幣發票的付款)。發票日期和付款日期的匯率差異產生已實現損益,過帳到匯兌損益科目。未實現損益發生在期末,當未結外幣餘額使用當前匯率重估時。這將資產負債表調整為反映當前價值,但在下一期間開始時回轉。未實現損益由重估流程計算,不代表實際的現金流差異。
練習情境:會計分析
情境:一家公司向客戶銷售貨物。銷售訂單為 10 單位產品 X,每單位 $100。產品的平均成本為每單位 $60。稅率為 10%。追蹤整個訂單到收款循環中的會計分錄。
- 出貨(從客戶角度的物料收貨):
- 借記:銷貨成本 $600(10 x $60)
- 貸記:庫存 $600
- 客戶發票:
- 借記:應收帳款 $1,100($1,000 + $100 稅金)
- 貸記:收入 $1,000
- 貸記:應付稅金 $100
- 收款:
- 借記:銀行/現金 $1,100
- 貸記:付款選擇/未分配 $1,100
- 付款沖銷:
- 借記:付款選擇/未分配 $1,100
- 貸記:應收帳款 $1,100
此交易的毛利:收入($1,000)減去銷貨成本($600)= $400(40% 毛利率)。
學習策略和時間管理
有效準備認證考試需要結構化的方法。
學習計劃
- 回顧所有課程:重新閱讀每一課,專注於您最不熟悉的概念。記下需要額外練習的主題。
- 實作練習:設定開發環境並練習撰寫模型驗證器、Callout、流程和事件處理器。程式碼練習需要的是流暢度,而非僅僅是理解。
- 使用 Garden World 練習:使用 Garden World 展示環境端到端地演練業務流程:建立訂單、完成出貨、生成發票、處理付款、執行 MRP 和建立生產訂單。
- 研究原始碼:閱讀關鍵類別的原始碼 —
MOrder、MInvoice、MPayment、Doc_Invoice、MPPMRP。了解核心程式碼的運作方式能加深您擴展它的能力。 - 練習情境:完成本課中的練習情境並建立您自己的情境。分析業務情境並確定正確的 iDempiere 設定或程式碼的能力是被測試的核心技能。
考試期間的時間管理
- 按每個部分的比重按比例分配時間。不要在任何單一題目上花費過多時間。
- 對於選擇題:在選擇前閱讀所有選項。先排除明顯錯誤的答案。如果不確定,標記該題目以供審查並繼續前進。
- 對於程式碼練習:在開始寫程式碼前閱讀整個題目描述。在撰寫程式碼前規劃您的方法(要擴展哪些類別、要實作哪些方法)。留出時間進行測試。
- 在最後保留 10-15 分鐘進行審查 — 檢查未回答的問題並重新閱讀您的程式碼以找出明顯的錯誤。
常見考試陷阱
考生通常在以下模式中失分:
- 混淆模型驗證器和 Callout:記住 Callout 在 UI 事件(使用者變更欄位)時觸發,而模型驗證器在資料事件(記錄儲存/刪除、單據處理)時觸發。Callout 在程式化儲存期間不會觸發。
- 忘記 null 檢查:在程式碼練習中,未能對可選欄位或查找結果檢查 null 值會導致 NullPointerException。始終防禦性地處理 null。
- 不正確的單據時間:當您需要 TIMING_BEFORE_COMPLETE 時使用 TIMING_AFTER_COMPLETE(或反之)是常見錯誤。Before-complete 可以阻止完成(透過傳回錯誤);After-complete 不能阻止完成但可以執行後續動作。
- 混淆借貸:在會計題目中,記住基本規則:資產和費用隨借記增加;負債、權益和收入隨貸記增加。簡單的記憶口訣:DEALER(Debits 增加 Expenses、Assets、Losses;Credits 增加 Equity、Revenue)。
- 忽視多租戶影響:撰寫程式碼時,始終考慮 AD_Client_ID 和 AD_Org_ID。忘記按用戶端篩選的查詢可能傳回其他租戶的資料。
進一步學習資源
除了本課程外,以下資源支援持續學習:
- iDempiere Wiki:官方 Wiki 包含有關設定、開發和管理的詳細文件。
- 原始碼:GitHub 儲存庫是終極參考。閱讀核心功能的原始碼能教您任何文件都無法完全傳達的模式和慣例。
- 社群郵件列表:idempiere-developers 和 idempiere-users 郵件列表包含多年的討論、解決方案和設計理由。
- iDempiere 大會錄影:過去的大會演講涵蓋進階主題和真實世界的導入經驗。
- 練習環境:維護個人的 iDempiere 開發環境以進行實驗。最好的學習方式是透過實作。
認證與職涯發展
iDempiere 認證將您定位為在全球服務組織的開源 ERP 平台中經過驗證的專家。
職涯路徑
- iDempiere 顧問:為客戶組織導入和設定 iDempiere。需要廣泛的功能知識和良好的溝通技巧。
- iDempiere 開發者:建構自訂外掛、整合和擴展。需要強大的 Java 技能和對 iDempiere 架構和 API 的深入了解。
- ERP 架構師:為企業規模的組織設計 iDempiere 部署。需要系統架構、效能和整合方面的專業知識。
- 開源貢獻者:透過貢獻 iDempiere 核心建立聲譽,有可能成為 Committer 並影響平台的方向。
持續教育
ERP 領域持續演進。透過以下方式保持最新:
- 關注 iDempiere 版本發佈並了解新功能和變更。
- 參與社群討論並貢獻專案。
- 擴展到相鄰領域:資料庫管理、雲端基礎設施、業務分析、專案管理。
- 參加一年一度的 iDempiere 世界大會。
總結
本課 — 以及它所準備的認證 — 代表了貫穿 iDempiere 平台的完整學習旅程的頂點。您已學習了使 iDempiere 運作的架構、擴展它的開發模式、它支援的業務流程,以及交付成功導入的方法論。認證考試透過概念題目和實作程式碼練習測試這些知識。
記住認證是里程碑,而非終點。最有價值的 iDempiere 專業人員將認證知識與真實世界經驗、持續學習和積極的社群參與相結合。將您在這 47 課中學到的知識付諸實踐 — 設定系統、撰寫外掛、解決業務問題、貢獻社群,並持續學習。
祝您考試順利,歡迎加入 iDempiere 專家社群。
日本語翻訳
概要
- 学習内容:
- iDempiere 開発者認定試験の構成、カバーするトピック、効果的な準備方法
- 各モジュール(アーキテクチャ、プラグイン開発、製造、財務管理)の主要概念を対象を絞った練習シナリオで復習する方法
- 試験問題への戦略的なアプローチ、時間管理、認定とキャリア開発の関連付け方法
- 前提知識:レッスン 1〜46(すべてのパスにわたる iDempiere の完全な学習カリキュラム)
- 推定読了時間:25 分
はじめに
iDempiere 学習カリキュラムの最終レッスンに到達しました。前の 46 レッスンを通じて、iDempiere のアーキテクチャ、データモデル、設定、カスタマイズ、製造、財務管理、パフォーマンス最適化、統合、導入方法論にまたがる包括的な知識を構築してきました。このレッスンは、その知識を統合し、専門知識を検証する認定試験の準備を支援します。
認定は複数の目的を果たします:雇用主やクライアントに対してスキルを検証し、理解を深める包括的なレビューを促し、認定プロフェッショナルのコミュニティとつながります。すぐに試験を受ける予定があるかどうかにかかわらず、このレッスンのレビュープロセスは教材の習熟度を高めます。
試験の概要とフォーマット
iDempiere 開発者認定試験は、理論的知識と実践的スキルの両方をテストします。フォーマットを理解することで効率的に準備できます。
試験構成
- セクション 1:多肢選択問題(試験の 60%)。概念理解、アーキテクチャの知識、意思決定能力をテストします。問題は、直接的な事実の想起からシナリオベースの分析・判断を必要とする問題まで多岐にわたります。
- セクション 2:ハンズオンコーディング演習(試験の 40%)。実際の Java コードの記述が求められます — モデルバリデーター、コールアウト、プロセス、プラグイン設定の実装。提供された iDempiere 開発環境で作業します。
試験トピックの配分
| モジュール | 比重 | 主要トピック |
|---|---|---|
| アーキテクチャ | 25% | 三層アーキテクチャ、OSGi、Application Dictionary、データベース設計、システム管理 |
| プラグイン開発 | 30% | モデルバリデーター、コールアウト、プロセス、フォーム、イベントハンドラー、パッケージング、デプロイ |
| 製造 | 20% | BOM、MRP、生産指図、原価計算、品質管理 |
| 財務管理 | 25% | 勘定科目表、会計スキーマ、GL、AP、AR、原価計算、レポート |
合格基準
認定を取得するには、多肢選択セクションとハンズオンセクションの両方で合格スコアを達成する必要があります。一方のセクションでの強い成績は、もう一方のセクションでの不合格を補うことはできません。これにより、認定開発者が理論的知識と実践的なコーディング能力の両方を持っていることが保証されます。
アーキテクチャモジュールのレビュー
アーキテクチャモジュールは、iDempiere がどのように構築され、動作するかの基礎知識をカバーします。主に多肢選択問題でテストされます。
レビューすべき主要概念
- 三層アーキテクチャ:データベース層(PostgreSQL/Oracle)、アプリケーション層(Java/OSGi/Equinox)、プレゼンテーション層(ZK Framework)を説明できること。各層の責任とそれらがどのように通信するかを理解すること。
- OSGi と Eclipse Equinox:バンドル、サービス、拡張ポイント、OSGi コンポーネントのライフサイクルを理解すること。iDempiere がモジュラリティとプラグインアーキテクチャに OSGi をどのように使用しているかを知ること。
- Application Dictionary:AD テーブル(AD_Table、AD_Column、AD_Window、AD_Tab、AD_Field、AD_Process、AD_Reference)と、それらがユーザーインターフェースと動作をどのように定義するかを理解すること。モデル駆動開発 — AD の変更がコード変更なしに UI に自動的に反映される仕組み — を説明できること。
- データベース設計パターン:標準カラム(AD_Client_ID、AD_Org_ID、IsActive、Created/Updated/CreatedBy/UpdatedBy)、マルチテナントデータモデル、ソフト削除パターン、伝票処理フレームワーク(DocAction、DocStatus)を理解すること。
- キャッシング:iDempiere が Application Dictionary メタデータと参照データをどのようにキャッシュするかを理解すること。CCache クラスとキャッシュ無効化パターンを知ること。
一般的な試験問題(アーキテクチャ)
Q:ハードコードされた UI 定義と比較して、iDempiere の Application Dictionary アプローチの主な利点は何ですか?
A:Application Dictionary は、UI 定義(ウィンドウ、タブ、フィールド、プロセス)をコードではなくデータベースのデータとして保存します。これにより、アプリケーションの再コンパイルや再デプロイなしに、設定変更によるユーザーインターフェースの実行時変更が可能になります。また、ロールベースのフィールド可視性、動的バリデーション、メタデータ駆動のコード生成などの機能も実現します。
Q:OSGi 拡張ポイントと OSGi サービスの違いを説明してください。iDempiere はそれぞれをどのように使用していますか?
A:拡張ポイントは、プラグインが機能を提供できる宣言された場所です(例:新しいプロセスファクトリ、モデルファクトリ、フォームファクトリの追加)。拡張は通常 plugin.xml ファイルで宣言されます。OSGi サービスは、定義されたインターフェースを実装する OSGi サービスレジストリに登録された Java オブジェクトであり、他のバンドルが実行時にそれを発見して使用できます。iDempiere は UI の貢献(フォーム、プロセス、情報パネル)に拡張ポイントを、ビジネスロジックの拡張(モデルバリデーター、イベントハンドラー、コールアウト)にサービスを使用します。
Q:なぜすべての iDempiere テーブルに AD_Client_ID と AD_Org_ID カラムが含まれているのですか?
A:これらのカラムはマルチテナントデータ分離を実装します。AD_Client_ID は完全に独立したビジネスエンティティ(テナント)間でデータを分離します。AD_Org_ID はクライアント内の組織単位でさらにデータをセグメント化します。セキュリティフレームワークはこれらのカラムを使用してデータアクセスルールを適用します — ユーザーは許可されたクライアントと組織に属するレコードのみを表示・変更できます。これにより、単一のデータベースで複数のテナントに安全にサービスを提供できます。
プラグイン開発モジュールのレビュー
プラグイン開発モジュールは最も比重の高いセクションで、多肢選択問題とハンズオンコーディング演習の両方が含まれます。
レビューすべき主要概念
- モデルバリデーター:
IModelValidatorの実装方法と OSGi コンポーネントとしての登録方法を知ること。タイミング定数(TIMING_BEFORE_SAVE、TIMING_AFTER_SAVE、TIMING_BEFORE_DELETE など)と伝票バリデーションのタイミング(TIMING_BEFORE_COMPLETE、TIMING_AFTER_COMPLETE など)を理解すること。null を返す場合(成功)と文字列を返す場合(エラーメッセージ)を知ること。 - コールアウト:コールアウトとモデルバリデーターの違いを理解すること。
IColumnCalloutの実装方法と登録方法を知ること。コールアウトは UI レベルのイベントであることを覚えておくこと — プログラマティックな保存中ではなく、ユーザーがフィールドを変更した時に発火します。 - プロセス:
SvrProcessサブクラスを実装できること。プロセスパラメータの宣言方法(Application Dictionary で宣言し、getParameter()で取得)、進捗のログ記録、成功または失敗の返却方法を知ること。 - イベントハンドラー:OSGi EventAdmin に基づく iDempiere のイベントシステムを理解すること。イベントトピック(例:
IEventTopics.PO_BEFORE_NEW)と Declarative Services を使用してイベントハンドラーを登録する方法を知ること。 - プラグインパッケージング:MANIFEST.MF(バンドル名、バージョン、インポート、エクスポート)、component.xml(OSGi Declarative Services)、Application Dictionary の変更をデプロイするための 2Pack を理解すること。
練習シナリオ:モデルバリデーター
タスク:販売注文の合計が顧客の与信限度額を超えた場合に注文の完了を防止するモデルバリデーターを作成してください。
@Component(name = "com.example.CreditLimitValidator",
immediate = true,
service = IModelValidator.class)
public class CreditLimitValidator implements IModelValidator {
private int clientId = -1;
@Override
public void initialize(ModelValidationEngine engine, MClient client) {
if (client != null) clientId = client.getAD_Client_ID();
engine.addDocValidate(MOrder.Table_Name, this);
}
@Override
public int getAD_Client_ID() {
return clientId;
}
@Override
public String login(int AD_Org_ID, int AD_Role_ID, int AD_User_ID) {
return null;
}
@Override
public String modelChange(PO po, int type) throws Exception {
return null;
}
@Override
public String docValidate(PO po, int timing) {
if (timing == TIMING_BEFORE_COMPLETE) {
MOrder order = (MOrder) po;
// 販売注文のみチェック
if (!order.isSOTrx()) return null;
MBPartner bp = new MBPartner(order.getCtx(),
order.getC_BPartner_ID(), order.get_TrxName());
BigDecimal creditLimit = bp.getSO_CreditLimit();
if (creditLimit == null || creditLimit.signum() == 0)
return null; // 限度額未設定
BigDecimal creditUsed = bp.getSO_CreditUsed();
BigDecimal orderTotal = order.getGrandTotal();
BigDecimal totalExposure = creditUsed.add(orderTotal);
if (totalExposure.compareTo(creditLimit) > 0) {
return "Credit limit exceeded. Limit: " +
creditLimit + ", Current exposure: " +
creditUsed + ", Order total: " + orderTotal;
}
}
return null;
}
}
この例は、基本的なパターンを示しています:OSGi 登録用のコンポーネントアノテーション、インターフェースメソッドの実装、特定の伝票イベントへの登録、成功時に null を返すかエラーメッセージを返すこと。
練習シナリオ:プロセス
タスク:支払履歴に基づいてすべてのビジネスパートナーの与信ステータスを更新するプロセスを作成してください。
public class UpdateCreditStatusProcess extends SvrProcess {
private int daysOverdue = 30;
@Override
protected void prepare() {
for (ProcessInfoParameter param : getParameter()) {
if ("DaysOverdue".equals(param.getParameterName())) {
daysOverdue = param.getParameterAsInt();
}
}
}
@Override
protected String doIt() throws Exception {
int updated = 0;
int total = 0;
String sql = "SELECT DISTINCT C_BPartner_ID FROM C_Invoice " +
"WHERE IsSOTrx='Y' AND IsPaid='N' AND " +
"PaymentTermDueDate(C_PaymentTerm_ID, DateInvoiced) " +
"< addDays(getDate(), -?) " +
"AND AD_Client_ID = ?";
PreparedStatement pstmt = DB.prepareStatement(sql, get_TrxName());
pstmt.setInt(1, daysOverdue);
pstmt.setInt(2, getAD_Client_ID());
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
total++;
int bpId = rs.getInt(1);
MBPartner bp = new MBPartner(getCtx(), bpId, get_TrxName());
if (!"X".equals(bp.getSOCreditStatus())) {
bp.setSOCreditStatus("X"); // 与信保留
bp.saveEx();
updated++;
addLog("Set credit hold: " + bp.getName());
}
}
DB.close(rs, pstmt);
return "Reviewed " + total + " partners, " +
updated + " placed on credit hold";
}
}
製造モジュールのレビュー
製造モジュールは、iDempiere 内の生産計画、実行、原価計算の理解をテストします。
レビューすべき主要概念
- 部品表(BOM):多階層 BOM、BOM タイプ(受注生産、見込み生産)、ファントムアセンブリ、構成品数量計算、BOM のバージョニングを理解すること。
PP_Product_BOM(ヘッダー)とPP_Product_BOMLine(構成品)の違いを知ること。 - 資材所要量計画(MRP):MRP の計算ロジック — 総所要量、予定入庫、予想手持在庫、正味所要量、計画オーダー — を理解すること。MRP パラメータ(リードタイム、安全在庫、発注数量ポリシー)と MRP が多階層 BOM をどのように処理するか(展開)を知ること。
- 生産指図:生産指図のライフサイクル(ドラフト、処理中、完了、クローズ)を理解すること。資材の払出(構成品消費)と入庫(完成品出力)がどのように記録されるかを知ること。生産指図でのコスト収集を理解すること。
- 原価計算方法:標準原価(差異分析に使用される事前定義原価)、平均原価(加重移動平均)、実際原価(特定ジョブ原価計算)を理解すること。各方法が在庫をどのように評価し、生産差異をどのように認識するかを知ること。
一般的な試験問題(製造)
Q:ファントム BOM と通常の BOM の違いを説明してください。ファントム BOM はいつ使用しますか?
A:ファントム BOM(疑似 BOM とも呼ばれる)は、独立した品目として物理的に在庫されないサブアセンブリを表します。MRP がファントム BOM に遭遇すると、ファントムを「通過展開」します — ファントムの生産指図を計画するのではなく、ファントムの構成品を親の資材所要量に直接追加します。常に一緒に消費されるが独立して製造または在庫されない構成品の論理的なグループ化(例:常に大きなアセンブリの一部である「ハードウェアキット」)にファントム BOM を使用します。
Q:製品 A の 100 ユニットの生産指図が完了しました。ユニットあたりの標準原価は $50 です。実際の材料費は $4,800、実際の労務費は $700 でした。総生産差異はいくらで、どのように分類されますか?
A:100 ユニットの標準原価 = 100 x $50 = $5,000。実際原価 = $4,800 + $700 = $5,500。総差異 = $5,500 – $5,000 = $500 不利差異。標準原価の内訳に応じて、これは材料差異(実際材料費マイナス標準材料費)と労務差異(実際労務費マイナス標準労務費)にさらに分解できます。
財務管理モジュールのレビュー
財務管理モジュールは、会計設定、トランザクション処理、財務報告をカバーします。
レビューすべき主要概念
- 勘定科目表:勘定科目要素(
C_ElementValue)、勘定科目タイプ(資産、負債、純資産、収益、費用)、自然勘定科目とディメンション勘定科目、集計勘定科目と転記勘定科目を理解すること。 - 会計スキーマ:
C_AcctSchemaの目的、GAAP 設定、原価レベル(クライアント、組織、バッチ/ロット)、通貨、会計ディメンション(勘定科目、組織、ビジネスパートナー、製品、活動、キャンペーン、プロジェクト)の役割を理解すること。 - 伝票処理と会計:伝票の完了が会計エンジンをどのようにトリガーするかを理解すること。ソース伝票(請求書、支払、出荷)とその会計結果(
Fact_Acctエントリ)の関係を知ること。主要な伝票タイプの転記ロジックを理解すること。 - 買掛金:仕入先請求書処理、三方照合(PO、入荷、請求書)、支払条件、支払選択、支払生成。
- 売掛金:顧客請求、与信管理、督促、入金、消込。
- 財務報告:試算表、貸借対照表、損益計算書。iDempiere のレポートエンジンが Fact_Acct データを集計して財務諸表を生成する仕組みを理解すること。
- 多通貨会計:為替レートタイプ、取引時の通貨換算、実現・未実現の為替損益計算、再評価プロセス。
一般的な試験問題(財務管理)
Q:iDempiere で仕入先請求書が購買注文と入荷に照合された際に生成される会計仕訳を説明してください。
A:照合する PO と入荷がある状態で仕入先請求書が完了すると:(1) 請求書明細金額で費用または在庫勘定科目を借方記入。(2) 買掛金負債勘定科目を貸方記入。請求書金額が PO 金額と異なる場合(PO が入荷の評価の基礎であった場合)、価格差異仕訳が生成されます:差額分の購買価格差異勘定科目を借方または貸方記入。在庫は入荷時に PO 原価で初期評価されており、請求書が価格差異を調整します。
Q:実現為替損益と未実現為替損益の違いは何ですか?
A:実現損益は、外貨建て取引が決済された時に発生します(例:外貨建て請求書の支払を受領した場合)。請求書日付と支払日付の為替レートの差異が実現損益を生み、為替損益勘定科目に転記されます。未実現損益は期末に、未決の外貨建て残高が現在の為替レートで再評価された時に発生します。これは現在の価値を反映するように貸借対照表を調整しますが、次の期間の開始時に戻入されます。未実現損益は再評価プロセスで計算され、実際のキャッシュフローの差異を表すものではありません。
練習シナリオ:会計分析
シナリオ:企業が顧客に商品を販売します。販売注文は製品 X を 10 ユニット、各 $100 です。製品の平均原価はユニットあたり $60 です。税率は 10% です。注文から入金までの完全なサイクルの会計仕訳を追跡してください。
- 出荷(顧客の観点からの入荷):
- 借方:売上原価 $600(10 x $60)
- 貸方:在庫 $600
- 顧客請求書:
- 借方:売掛金 $1,100($1,000 + $100 税金)
- 貸方:売上 $1,000
- 貸方:未払税金 $100
- 入金:
- 借方:銀行/現金 $1,100
- 貸方:支払選択/未消込 $1,100
- 支払消込:
- 借方:支払選択/未消込 $1,100
- 貸方:売掛金 $1,100
この取引の粗利益:売上($1,000)マイナス売上原価($600)= $400(40% マージン)。
学習戦略と時間管理
認定試験の効果的な準備には構造化されたアプローチが必要です。
学習計画
- すべてのレッスンをレビュー:各レッスンを再読し、最も馴染みのない概念に焦点を当てます。追加の練習が必要なトピックをメモします。
- ハンズオン練習:開発環境をセットアップし、モデルバリデーター、コールアウト、プロセス、イベントハンドラーの記述を練習します。コーディング演習には、理解だけでなく流暢さが必要です。
- Garden World で練習:Garden World デモ環境を使用して、ビジネスプロセスをエンドツーエンドで実行します:注文の作成、出荷の完了、請求書の生成、支払の処理、MRP の実行、生産指図の作成。
- ソースコードを学習:主要クラスのソースコードを読みます —
MOrder、MInvoice、MPayment、Doc_Invoice、MPPMRP。コアコードの動作を理解することで、拡張能力が深まります。 - 練習シナリオ:このレッスンの練習シナリオに取り組み、独自のシナリオを作成します。ビジネスシナリオを分析し、正しい iDempiere の設定またはコードを決定する能力が、テストされるコアスキルです。
試験中の時間管理
- 各セクションの比重に応じて時間を配分します。単一の問題に時間をかけすぎないようにします。
- 多肢選択問題の場合:選択する前にすべての選択肢を読みます。まず明らかに間違っている回答を排除します。不確かな場合は、レビュー用に問題をマークして先に進みます。
- コーディング演習の場合:コードを書き始める前に、問題文全体を読みます。コードを記述する前にアプローチを計画します(どのクラスを拡張するか、どのメソッドを実装するか)。テストの時間を残します。
- 最後に 10〜15 分をレビュー用に確保します — 未回答の問題をチェックし、コードの明らかなエラーを再読します。
一般的な試験の落とし穴
受験者が一般的に失点するパターンは以下の通りです:
- モデルバリデーターとコールアウトの混同:コールアウトは UI イベント(ユーザーがフィールドを変更)で発火し、モデルバリデーターはデータイベント(レコードの保存/削除、伝票処理)で発火することを覚えておいてください。コールアウトはプログラマティックな保存中には発火しません。
- null チェックの忘れ:コーディング演習で、オプションフィールドやルックアップ結果の null 値チェックを怠ると NullPointerException が発生します。常に防御的に null を処理してください。
- 不正確な伝票タイミング:TIMING_BEFORE_COMPLETE が必要な時に TIMING_AFTER_COMPLETE を使用する(またはその逆)は一般的なエラーです。Before-complete は完了を防止できます(エラーを返すことで)。After-complete は完了を防止できませんが、フォローアップアクションを実行できます。
- 借方と貸方の混同:会計問題では、基本ルールを覚えてください:資産と費用は借方で増加し、負債、資本、収益は貸方で増加します。簡単な記憶法:DEALER(Debits は Expenses、Assets、Losses を増加させ、Credits は Equity、Revenue を増加させる)。
- マルチテナントの影響の見落とし:コードを記述する際は、常に AD_Client_ID と AD_Org_ID を考慮してください。クライアントでフィルタリングし忘れたクエリは、他のテナントのデータを返す可能性があります。
さらなる学習のためのリソース
このカリキュラムの他に、以下のリソースが継続的な学習をサポートします:
- iDempiere Wiki:公式 Wiki には設定、開発、管理に関する詳細なドキュメントが含まれています。
- ソースコード:GitHub リポジトリは究極のリファレンスです。コア機能のソースコードを読むことで、ドキュメントでは完全に伝えられないパターンと規約を学べます。
- コミュニティメーリングリスト:idempiere-developers と idempiere-users のメーリングリストには、長年にわたる議論、ソリューション、設計の根拠が含まれています。
- iDempiere カンファレンスの録画:過去のカンファレンスプレゼンテーションは、高度なトピックと実際の導入経験をカバーしています。
- 練習環境:実験用に個人の iDempiere 開発環境を維持してください。学ぶ最良の方法は実践です。
認定とキャリア開発
iDempiere 認定は、世界中の組織にサービスを提供するオープンソース ERP プラットフォームの検証済みエキスパートとしてあなたを位置づけます。
キャリアパス
- iDempiere コンサルタント:クライアント組織に iDempiere を導入・設定します。幅広い機能知識と強力なコミュニケーションスキルが必要です。
- iDempiere 開発者:カスタムプラグイン、統合、拡張を構築します。強力な Java スキルと iDempiere のアーキテクチャと API の深い知識が必要です。
- ERP アーキテクト:エンタープライズ規模の組織向けに iDempiere のデプロイメントを設計します。システムアーキテクチャ、パフォーマンス、統合の専門知識が必要です。
- オープンソースコントリビューター:iDempiere コアへの貢献を通じて評判を築き、コミッターステータスとプラットフォームの方向性への影響力につながる可能性があります。
継続教育
ERP のランドスケープは継続的に進化しています。以下の方法で最新の状態を保ちます:
- iDempiere のリリースをフォローし、新機能と変更を理解する。
- コミュニティの議論に参加し、プロジェクトに貢献する。
- 隣接する分野に拡張する:データベース管理、クラウドインフラストラクチャ、ビジネス分析、プロジェクト管理。
- 年次の iDempiere World Conference に参加する。
まとめ
このレッスン — そしてそれが準備する認定 — は、iDempiere プラットフォーム全体にわたる包括的な旅の集大成を表しています。iDempiere を動かすアーキテクチャ、それを拡張する開発パターン、それがサポートするビジネスプロセス、成功した導入を提供する方法論を学びました。認定試験は、概念的な問題と実践的なコーディング演習の両方を通じてこの知識をテストします。
認定はマイルストーンであり、到達点ではないことを覚えてください。最も価値のある iDempiere プロフェッショナルは、認定された知識と実際の経験、継続的な学習、積極的なコミュニティ参加を組み合わせています。これらの 47 レッスンで学んだことを応用してください — システムを設定し、プラグインを書き、ビジネスの問題を解決し、コミュニティに貢献し、学び続けてください。
試験での成功をお祈りします。iDempiere エキスパートのコミュニティへようこそ。