<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.idempiere.org/w-en/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sjg</id>
	<title>iDempiere en - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.idempiere.org/w-en/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sjg"/>
	<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/en/Special:Contributions/Sjg"/>
	<updated>2026-10-01T20:47:11Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.2</generator>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=NF9_Annotated_Process_Parameters&amp;diff=20010</id>
		<title>NF9 Annotated Process Parameters</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=NF9_Annotated_Process_Parameters&amp;diff=20010"/>
		<updated>2022-03-14T02:20:23Z</updated>

		<summary type="html">&lt;p&gt;Sjg: Created page with &amp;quot;= '''Feature:''' Annotated Process Parameters =  '''Goal:''' Development  '''Developer:''' Saulo Gil  '''Feature Ticket:''' [https://idempiere.atlassian.net/brows...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Feature:''' Annotated Process Parameters =&lt;br /&gt;
&lt;br /&gt;
'''Goal:''' Development&lt;br /&gt;
&lt;br /&gt;
'''Developer:''' [[User:Sjg|Saulo Gil]]&lt;br /&gt;
&lt;br /&gt;
'''Feature Ticket:''' [https://idempiere.atlassian.net/browse/IDEMPIERE-5025 IDEMPIERE-5025]&lt;br /&gt;
&lt;br /&gt;
'''Description:'''&lt;br /&gt;
&lt;br /&gt;
This feature was created in order to simplify the task of reading process parameters by using the new @Parameter annotation. Here's a comparison between new and the traditional way of achieving this goal, using the OrderBatchProcess class as reference.&lt;br /&gt;
&lt;br /&gt;
''Using this feature''&lt;br /&gt;
&lt;br /&gt;
  @org.adempiere.base.annotation.Process&lt;br /&gt;
  public class OrderBatchProcess extends SvrProcess&lt;br /&gt;
  {&lt;br /&gt;
    @Parameter&lt;br /&gt;
    private int      p_C_DocTypeTarget_ID = 0;&lt;br /&gt;
    @Parameter&lt;br /&gt;
    private String     p_DocStatus = null;&lt;br /&gt;
    @Parameter&lt;br /&gt;
    private int      p_C_BPartner_ID = 0;&lt;br /&gt;
    @Parameter&lt;br /&gt;
    private String     p_IsSelfService = null;&lt;br /&gt;
    @Parameter&lt;br /&gt;
    private Timestamp  p_DateOrdered_From = null;&lt;br /&gt;
    @Parameter&lt;br /&gt;
    private Timestamp  p_DateOrdered_To = null;&lt;br /&gt;
    @Parameter&lt;br /&gt;
    private String     p_DocAction = null;&lt;br /&gt;
    @Parameter&lt;br /&gt;
    private String     p_IsDelivered = null;&lt;br /&gt;
    @Parameter&lt;br /&gt;
    private String     p_IsInvoiced = null;&lt;br /&gt;
  &lt;br /&gt;
    protected void prepare (){ /* nothing else to do here */ }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
''Traditional way''&lt;br /&gt;
&lt;br /&gt;
  protected void prepare ()&lt;br /&gt;
  {&lt;br /&gt;
    ProcessInfoParameter[] para = getParameter();&lt;br /&gt;
    for (int i = 0; i &amp;lt; para.length; i++)&lt;br /&gt;
    {&lt;br /&gt;
      String name = para[i].getParameterName();&lt;br /&gt;
      if (para[i].getParameter() == null &amp;amp;&amp;amp; para[i].getParameter_To() == null)&lt;br /&gt;
        ;&lt;br /&gt;
      else if (name.equals(&amp;quot;C_DocTypeTarget_ID&amp;quot;))&lt;br /&gt;
        p_C_DocTypeTarget_ID = para[i].getParameterAsInt();&lt;br /&gt;
      else if (name.equals(&amp;quot;DocStatus&amp;quot;))&lt;br /&gt;
        p_DocStatus = (String)para[i].getParameter();&lt;br /&gt;
      else if (name.equals(&amp;quot;IsSelfService&amp;quot;))&lt;br /&gt;
        p_IsSelfService = (String)para[i].getParameter();&lt;br /&gt;
      else if (name.equals(&amp;quot;C_BPartner_ID&amp;quot;))&lt;br /&gt;
        p_C_BPartner_ID = para[i].getParameterAsInt();&lt;br /&gt;
      else if (name.equals(&amp;quot;DateOrdered&amp;quot;))&lt;br /&gt;
      {&lt;br /&gt;
        p_DateOrdered_From = (Timestamp)para[i].getParameter();&lt;br /&gt;
        p_DateOrdered_To = (Timestamp)para[i].getParameter_To();&lt;br /&gt;
      }&lt;br /&gt;
      else if (name.equals(&amp;quot;DocAction&amp;quot;))&lt;br /&gt;
        p_DocAction = (String)para[i].getParameter();&lt;br /&gt;
      else if (name.equals(&amp;quot;IsDelivered&amp;quot;)) {&lt;br /&gt;
        p_IsDelivered = (String)para[i].getParameter();&lt;br /&gt;
      } else if (name.equals(&amp;quot;IsInvoiced&amp;quot;)) {&lt;br /&gt;
        p_IsInvoiced = (String)para[i].getParameter();&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
        log.log(Level.SEVERE, &amp;quot;Unknown Parameter: &amp;quot; + name);&lt;br /&gt;
    }&lt;br /&gt;
  }  //  prepare&lt;br /&gt;
&lt;br /&gt;
In case the class attribute name doesn't match the parameter name, we can use the name annotation attribute as follows:&lt;br /&gt;
&lt;br /&gt;
    @Parameter(name = &amp;quot;declaredName&amp;quot;)&lt;br /&gt;
    private String parameter = null;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:New Features|D]]&lt;br /&gt;
[[Category:New Features|A]]&lt;br /&gt;
[[Category:New Features v9|D]]&lt;br /&gt;
[[Category:New Features v9|A]]&lt;br /&gt;
[[Category:New Features Development]]&lt;/div&gt;</summary>
		<author><name>Sjg</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=NF9_Virtual_Column_Lazy_Loading&amp;diff=20009</id>
		<title>NF9 Virtual Column Lazy Loading</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=NF9_Virtual_Column_Lazy_Loading&amp;diff=20009"/>
		<updated>2022-03-14T01:56:03Z</updated>

		<summary type="html">&lt;p&gt;Sjg: Created page with &amp;quot;= '''Feature:''' Virtual Column Lazy Loading =  '''Goal:''' Development  '''Developer:''' Saulo Gil  '''Feature Ticket:''' [https://idempiere.atlassian.net/browse...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Feature:''' Virtual Column Lazy Loading =&lt;br /&gt;
&lt;br /&gt;
'''Goal:''' Development&lt;br /&gt;
&lt;br /&gt;
'''Developer:''' [[User:Sjg|Saulo Gil]]&lt;br /&gt;
&lt;br /&gt;
'''Feature Ticket:''' [https://idempiere.atlassian.net/browse/IDEMPIERE-5126 IDEMPIERE-5126]&lt;br /&gt;
&lt;br /&gt;
'''Description:'''&lt;br /&gt;
&lt;br /&gt;
Virtual columns were loaded among the rest of the regular columns when instantiating a model class. This behavior was changed as a performance improvement, now virtual columns are queried on-demand whenever their ''getter'' methods are called. In case the developer wants to load virtual column along with regular ones, that can be achieved as shown below.&lt;br /&gt;
&lt;br /&gt;
'''New constructor'''&lt;br /&gt;
&lt;br /&gt;
  testPo = new MTest(Env.getCtx(), testPo.get_ID(), getTrxName(), MTest.COLUMNNAME_TestVirtualQty);&lt;br /&gt;
&lt;br /&gt;
One or many virtual columns can passed on as parameters after the trxName parameter.&lt;br /&gt;
&lt;br /&gt;
  testPo = new MTest(Env.getCtx(), testPo.get_ID(), getTrxName(), MTest.COLUMNNAME_TestVirtualQty, MTest.COLUMNNAME_AnotherVirtualColumn);&lt;br /&gt;
&lt;br /&gt;
'''Using Query'''&lt;br /&gt;
&lt;br /&gt;
  new Query(Env.getCtx(), MTest.Table_Name, MTest.COLUMNNAME_Test_ID + &amp;quot;=?&amp;quot;, getTrxName())&lt;br /&gt;
    .setVirtualColumns(I_Test.COLUMNNAME_TestVirtualQty).first();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:New Features|D]]&lt;br /&gt;
[[Category:New Features|A]]&lt;br /&gt;
[[Category:New Features v9|D]]&lt;br /&gt;
[[Category:New Features v9|A]]&lt;br /&gt;
[[Category:New Features Development]]&lt;/div&gt;</summary>
		<author><name>Sjg</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Developing_iDempiere:_Create_a_new_custom_class_model_with_window_and_tabs&amp;diff=19408</id>
		<title>Developing iDempiere: Create a new custom class model with window and tabs</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Developing_iDempiere:_Create_a_new_custom_class_model_with_window_and_tabs&amp;diff=19408"/>
		<updated>2021-11-29T02:19:49Z</updated>

		<summary type="html">&lt;p&gt;Sjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development|P]]&lt;br /&gt;
[[Category:Developer documentation‏‎]]&lt;br /&gt;
[[Category:Plug-In Development]]&lt;br /&gt;
__TOC__&lt;br /&gt;
=Introduction=&lt;br /&gt;
iDempiere can be extended by creating new class models for specific business requirements without editing code in the trunk so that your [https://en.wikipedia.org/wiki/Bespoke bespoke] development can be protected from system upgrades.&lt;br /&gt;
&lt;br /&gt;
This tutorial will show you how to create a parent-child class model and a window with tabs and fields to create, update and delete data using the built-in functionality of iDempiere.&lt;br /&gt;
&lt;br /&gt;
It is based on [https://www.youtube.com/watch?v=F1lFHS2riG4 this video] by Jan Thielemann from [http://www.evenos.de/ evenos GmbH].&lt;br /&gt;
&lt;br /&gt;
The process is as follows:&lt;br /&gt;
* Create the underlying database tables to support the new class model;&lt;br /&gt;
* Create Table entries in the iDempiere dictionary to register the database tables;&lt;br /&gt;
* Create a Window and Tab for the parent table, with a Sub-Tab for the child table;&lt;br /&gt;
* Create a Menu entry to open the Window;&lt;br /&gt;
* Build a plug-in so that the new functionality can be deployed with the base application.&lt;br /&gt;
&lt;br /&gt;
=Prerequisites=&lt;br /&gt;
The tutorial assumes that you have set up iDempiere in an Eclipse development environment. If you have not, follow these instructions for installing iDempiere for Development:&lt;br /&gt;
# [[Install Development Prerequisites]]&lt;br /&gt;
# [[Download the Code]]&lt;br /&gt;
# [[Setting up Eclipse]]&lt;br /&gt;
# [[Importing DB Seed Manually]]&lt;br /&gt;
# [[Running iDempiere within Eclipse]]&lt;br /&gt;
&lt;br /&gt;
The tutorial also assumes that you know how to create PostgreSQL tables using a SQL editor such as the psql command line interface or a tool like [https://www.pgadmin.org/download/ pgAdmin3].&lt;br /&gt;
&lt;br /&gt;
=New class model=&lt;br /&gt;
The first step is to create a new class model in the form of two database tables with a parent-child relation between them. &lt;br /&gt;
&lt;br /&gt;
==Parent table==&lt;br /&gt;
Create the main parent table '''''eve_main''''' as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE eve_main(&lt;br /&gt;
-- Mandatory columns&lt;br /&gt;
  eve_main_id numeric(10,0) PRIMARY KEY,&lt;br /&gt;
  eve_main_uu character varying(36) DEFAULT NULL::character varying UNIQUE,&lt;br /&gt;
  ad_client_id numeric(10,0) NOT NULL,&lt;br /&gt;
  ad_org_id numeric(10,0) NOT NULL,&lt;br /&gt;
  isactive character(1) NOT NULL DEFAULT 'Y'::bpchar,&lt;br /&gt;
  created timestamp without time zone NOT NULL DEFAULT now(),&lt;br /&gt;
  createdby numeric(10,0) NOT NULL,&lt;br /&gt;
  updated timestamp without time zone NOT NULL DEFAULT now(),&lt;br /&gt;
  updatedby numeric(10,0) NOT NULL,&lt;br /&gt;
&lt;br /&gt;
-- User-defined columns&lt;br /&gt;
  value character varying(40) NOT NULL,&lt;br /&gt;
  name character varying(255) NOT NULL,&lt;br /&gt;
  description character varying(255) NOT NULL,&lt;br /&gt;
  help character varying(2000),&lt;br /&gt;
  m_product_id numeric(10,0),&lt;br /&gt;
  UNIQUE (ad_client_id, value)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The iDempiere table naming convention is to prefix the table name with three or more letters specific to your project, followed by an underscore and the table name in camelCase. In this example, the table name is prefixed with ''eve_'', for the name of the company that Jan works for, Evenos.&lt;br /&gt;
&lt;br /&gt;
The table must start with a set of mandatory columns that are used by iDempiere to manage the records and record activity for audit purposes. In the table above they are:&lt;br /&gt;
*'''eve_main_id''': the primary key of the table, named by adding the suffix '''''_id''''' to the table name;&lt;br /&gt;
*'''eve_main_uu''': a unique identifier, named by adding the suffix '''''_uu''''' to the table name;&lt;br /&gt;
*'''ad_client_id''': the identifier of the client or tenant;&lt;br /&gt;
*'''ad_org_id''': the identifier of the organisational unit within the client;&lt;br /&gt;
*'''isactive''': records can be deactivated to allow for logical deletes;&lt;br /&gt;
*'''created''': the date this record was created;&lt;br /&gt;
*'''createdby''': the user that created the record;&lt;br /&gt;
*'''updated''': the date this record was updated;&lt;br /&gt;
*'''updatedby''': the user that updated the record.&lt;br /&gt;
&lt;br /&gt;
The recommended user-defined columns include:&lt;br /&gt;
*'''value''': the search key or code;&lt;br /&gt;
*'''name''': the display name;&lt;br /&gt;
*'''description''': long description;&lt;br /&gt;
*'''help''': help or comments.&lt;br /&gt;
&lt;br /&gt;
The parent table includes a field ''m_product_id'' which is in the standard iDempiere table ''M_Product'', and it has a constraint that ensures that the contents of the ''client'' and ''value'' columns are unique in combination.&lt;br /&gt;
&lt;br /&gt;
Note that columns with the 'NOT NULL' constraint will become mandatory fields in the window.&lt;br /&gt;
&lt;br /&gt;
==Child table==&lt;br /&gt;
Create the child table '''''eve_sub''''' as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE eve_sub(&lt;br /&gt;
-- Mandatory columns&lt;br /&gt;
  eve_sub_id numeric(10,0) PRIMARY KEY,&lt;br /&gt;
  eve_sub_uu character varying(36) DEFAULT NULL::character varying UNIQUE,&lt;br /&gt;
  ad_client_id numeric(10,0) NOT NULL,&lt;br /&gt;
  ad_org_id numeric(10,0) NOT NULL,&lt;br /&gt;
  isactive character(1) NOT NULL DEFAULT 'Y'::bpchar,&lt;br /&gt;
  created timestamp without time zone NOT NULL DEFAULT now(),&lt;br /&gt;
  createdby numeric(10,0) NOT NULL,&lt;br /&gt;
  updated timestamp without time zone NOT NULL DEFAULT now(),&lt;br /&gt;
  updatedby numeric(10,0) NOT NULL,&lt;br /&gt;
&lt;br /&gt;
-- User-defined columns&lt;br /&gt;
  eve_main_id numeric(10,0) NOT NULL references eve_main(eve_main_id),&lt;br /&gt;
  value character varying(40) NOT NULL,&lt;br /&gt;
  name character varying(255) NOT NULL,&lt;br /&gt;
  description character varying(255) NOT NULL,&lt;br /&gt;
  help character varying(2000),&lt;br /&gt;
  UNIQUE (ad_client_id, value)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is just like the parent table, except it has a foreign key relationship to the parent.&lt;br /&gt;
&lt;br /&gt;
=Table and Columns=&lt;br /&gt;
==Login as SuperUser==&lt;br /&gt;
The window for the new class models is created by configuring iDempiere to use the new tables, using the SuperUser login and System client, so browse to http://localhost:8080/webui/ and login as SuperUser and check the Select Role box:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Login_Select_Role.png|512px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make sure the Client is System and the Role is System Administrator:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Role.png|512px]]&lt;br /&gt;
&lt;br /&gt;
==Create the Table and Columns==&lt;br /&gt;
After login, select the create Table and Column button on the right of the ''Table and Column'' entry in the Favourites window:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Table_and_Columns.png|560px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Create the Table by entering the parent database table in the DB Table Name field:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Create_Main.png|980px]]&lt;br /&gt;
&lt;br /&gt;
'''Note:''' &lt;br /&gt;
* the prefix and the table name have been capitalized so that when we build the plug-in, the iDempiere Model Generator generates Java classes with names that conform to the standard naming convention;&lt;br /&gt;
* the ''Database Access Level'' is set to 'All' to ensure that the table can be used by all Clients, including System;&lt;br /&gt;
* the ''Entity Type'' is 'User maintained' to protect the table from system upgrades.&lt;br /&gt;
&lt;br /&gt;
See the Table and Column documentation for the usage of the other table attributes: [[Template:Table and Column (Window ID-100 V1.0.0)#TAB:_Table]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Save the Table record, then click on the Processes cog to create columns from the database table:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Create_Columns.png|612px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The process will ask you to confirm that you want to create the columns:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Create_Database_Columns.png|480px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When the process has completed it will list the columns that were created:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Create_Columns_Success.png|320px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now you have the new Table and Columns to work with:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Table_and_Columns_Created.png|1024px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Scroll through the Columns listed in the grid below and change their properties as required by the application. As an example, click on the Edit button on the left of the record for ''M_Product_ID'' to open up the details of the column: &lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Column_Details.png|1024px]]&lt;br /&gt;
&lt;br /&gt;
Note that ''M_Product_ID'' is already in the system dictionary because it is a column in the table ''M_Product'' so some of the column attributes are already populated.&lt;br /&gt;
&lt;br /&gt;
See the Table and Column documentation for the usage of each of the other Column attributes: [[Template:Table and Column (Window ID-100 V1.0.0)#TAB:_Column]]. The video has [https://youtu.be/F1lFHS2riG4?t=7m34s a detailed discussion] of all the various Column attributes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now repeat the exercise to create a Table entry for the child database table '''''eve_sub''''' and generate the columns from the database:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Child_Table_and_Columns_Created.png|1024px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We must link the child table to its parent, using the column ''EVE_Main_ID'', so select it and open it, then check the ''Parent link column'' attribute and save the change to the column:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Link_Child_to_Parent.png|1024px]]&lt;br /&gt;
&lt;br /&gt;
Note that we could have done the same to the parent table ''EVE_Main'' above to link it to the ''M_Product'' table too.&lt;br /&gt;
&lt;br /&gt;
=Window and Tabs=&lt;br /&gt;
We have created the entries for the two tables, so now we can create the window and tab for the parent ''EVE_Main'' and a sub-tab for the child ''EVE_Sub''.&lt;br /&gt;
&lt;br /&gt;
==Create Window==&lt;br /&gt;
Click on the button to create a new window (on the right of the ''Window, Tab &amp;amp; Field'' entry in Favourites) and enter the name.&lt;br /&gt;
&lt;br /&gt;
Uncheck the attribute ''Sales Transaction'' because it is not relevant, and save the record:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Create_Window.png|1024px]]&lt;br /&gt;
&lt;br /&gt;
==Create Tab==&lt;br /&gt;
Click on the ''Tab'' tab under the window you created above to open a new screen for the tab.&lt;br /&gt;
&lt;br /&gt;
Enter the name ''Main Tab'', and select the Table name ''EVE_Main_Evenos Main'' from the dropdown.&lt;br /&gt;
&lt;br /&gt;
Check the attribute ''Single Row Layout'' and then save the record:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Create_Tab.png|1024px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Scroll down to the large ''Create Fields'' button on the tab screen and select it to generate the fields from the database table. Select ''OK'' on the confirmation screen:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Create_Tab_Fields.png|480px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When the process has completed it will list the fields that were created, and after you dismiss the popup confirmation, you will see them at the bottom of the tab screen:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Create_Tab_Fields_Created.png|1024px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can click on the ''Field Sequence'' tab to adjust the field ordering.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Click on the cog in the toolbar to open a graphical editor to edit the layout of the fields:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Tab_Editor_Process.png|520px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Tab Editor will open in a new window where you can add and remove fields, drag them around (by grabbing the field title), resize them (by double-clicking with and without holding down CTRL), and so on: &lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Tab_Editor.png|1028px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Watch [http://www.youtube.com/watch?v=F1lFHS2riG4&amp;amp;t=1190s the video] for a demonstration of the Tab Editor.&lt;br /&gt;
&lt;br /&gt;
==Sub-Tab==&lt;br /&gt;
Now we must create the sub-tab for the child table, so click on the ''New Record'' icon and enter the details for the sub-tab.&lt;br /&gt;
&lt;br /&gt;
Note that the ''Tab Level'' must be set to '''1''' because it is a sub-tab (the default level is 0).&lt;br /&gt;
&lt;br /&gt;
Scroll down and click on the ''Create Fields'' icon to generate the fields for the sub-tab:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Create_Sub_Tab.png|1024px]]&lt;br /&gt;
&lt;br /&gt;
=Menu=&lt;br /&gt;
You must create a Menu entry to use the new window, so click on the button to create a new menu (on the right of the ''Menu'' entry in Favourites).&lt;br /&gt;
&lt;br /&gt;
Enter the name, set the Action to ''Window'' and use the dropdown in Window to find the window that you created above, and save the record:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Create_Menu.png|1024px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note:''' the new menu entry will appear in the list of menu items on the left but it will not be active because menu items are loaded when the user logs in for the first time. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Log out and log in again to see the new entry in the Menu tree:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01 Menu Created.png|720px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Click on the new menu entry to see the new window with its main tab and the sub-tab below:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01 New Window.png|1024px]]&lt;br /&gt;
&lt;br /&gt;
Watch [http://www.youtube.com/watch?v=F1lFHS2riG4&amp;amp;t=1525s the video] and test the new window.&lt;br /&gt;
&lt;br /&gt;
=Plug-in=&lt;br /&gt;
At this point the new model is only available in the development environment, and it is implemented using default mechanisms that contain no Business logic. We need to build a plug-in to hold the new model, together with any bespoke logic that may be required, so that it can be deployed with the base system. &lt;br /&gt;
&lt;br /&gt;
You can watch the video [http://www.youtube.com/watch?v=F1lFHS2riG4&amp;amp;t=1680s from this point] before you follow the summary of the process below.&lt;br /&gt;
&lt;br /&gt;
==Plug-in Project==&lt;br /&gt;
The first step is to create a Plug-in Project. &lt;br /&gt;
&lt;br /&gt;
If you have not already done so, create a sub-directory in your workspace for bespoke plug-ins to keep the codebase clean (in this example, the sub-directory is called ''zerlina-plugins''). &lt;br /&gt;
&lt;br /&gt;
'''File &amp;gt; New &amp;gt; Other &amp;gt; Plug-in Project &amp;gt; Next &amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
[[File:GS01 New Plug-in Project.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note:'''&lt;br /&gt;
* ''Use default location'' box is unchecked so that the plug-in project location can be used instead;&lt;br /&gt;
* ''Target Platform'' is the Equinox OSGi framework.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:GS01 New Plug-in Project 1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note:''' the author has selected JavaSE-1.6 to ensure that the plug-in is backwards compatible with older servers.&lt;br /&gt;
&lt;br /&gt;
Answer ''Yes'' if Eclipse asks you if you want to use the Plug-in perspective.&lt;br /&gt;
&lt;br /&gt;
==Package for the model==&lt;br /&gt;
Now navigate to the '''''src''''' folder of the new project and create a new package:&lt;br /&gt;
&lt;br /&gt;
'''Right-click on ''src'' &amp;gt; New &amp;gt; Package'''&lt;br /&gt;
&lt;br /&gt;
[[File:GS01 New Java Package.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note:''' the name of the package is ''org.evenos.model''&lt;br /&gt;
&lt;br /&gt;
==Model generator==&lt;br /&gt;
Generate the models with the model generator:&lt;br /&gt;
&lt;br /&gt;
'''Run &amp;gt; Run Configurations... &amp;gt; model.generator &amp;gt; Run'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After a few seconds the Model Class Generator will open:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01 Model Generator.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note:'''&lt;br /&gt;
* use the '...' icon in ''Source Folder'' to browse to the '''''src''''' folder of the project in the plug-ins sub-directory;&lt;br /&gt;
* ''Package Name'' is 'org.evenos.model';&lt;br /&gt;
* ''Table Name'' is 'EVE_%' to generate models for both tables;&lt;br /&gt;
* ''Entity Type'' is 'U' for User Maintained.&lt;br /&gt;
&lt;br /&gt;
Refresh the project to see the newly generated model classes.&lt;br /&gt;
&lt;br /&gt;
=='M' Classes==&lt;br /&gt;
Create two 'M' classes to hold the business logic for each of the two tables:&lt;br /&gt;
&lt;br /&gt;
'''Right-click ''org.evenos.model'' &amp;gt; New &amp;gt; Class &amp;gt; Name: MEVEMain &amp;gt; Finish'''&lt;br /&gt;
&lt;br /&gt;
Add two constructors and a generated serial version ID:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package org.evenos.model;&lt;br /&gt;
&lt;br /&gt;
import java.sql.ResultSet;&lt;br /&gt;
import java.util.Properties;&lt;br /&gt;
&lt;br /&gt;
public class MEVEMain extends X_EVE_Main{&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * &lt;br /&gt;
	 */&lt;br /&gt;
	private static final long serialVersionUID = -4652910060540398746L;&lt;br /&gt;
&lt;br /&gt;
	public MEVEMain(Properties ctx, ResultSet rs, String trxName) {&lt;br /&gt;
		super(ctx, rs, trxName);&lt;br /&gt;
		// TODO Auto-generated constructor stub&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public MEVEMain(Properties ctx, int EVE_Main_ID, String trxName) {&lt;br /&gt;
		super(ctx, EVE_Main_ID, trxName);&lt;br /&gt;
		// TODO Auto-generated constructor stub&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Repeat for '''''MEVESub''''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package org.evenos.model;&lt;br /&gt;
&lt;br /&gt;
import java.sql.ResultSet;&lt;br /&gt;
import java.util.Properties;&lt;br /&gt;
&lt;br /&gt;
public class MEVESub extends X_EVE_Sub{&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * &lt;br /&gt;
	 */&lt;br /&gt;
	private static final long serialVersionUID = -2076611601274220946L;&lt;br /&gt;
&lt;br /&gt;
	public MEVESub(Properties ctx, int EVE_Sub_ID, String trxName) {&lt;br /&gt;
		super(ctx, EVE_Sub_ID, trxName);&lt;br /&gt;
		// TODO Auto-generated constructor stub&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public MEVESub(Properties ctx, ResultSet rs, String trxName) {&lt;br /&gt;
		super(ctx, rs, trxName);&lt;br /&gt;
		// TODO Auto-generated constructor stub&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get some idea of what business logic is possible in these classes, look at the 'M' classes in the package 'org.compiere.model' in the project 'org.adempiere.base' which is the core of iDempiere.&lt;br /&gt;
&lt;br /&gt;
==Dependencies==&lt;br /&gt;
The operation of the new plug-in is dependent on two other plug-ins, so use the '''Add...''' button to add 'org.adempiere.base' and 'org.adempiere.plugin.utils' to the plug-in manifest:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01 Manifest Dependencies.png]]&lt;br /&gt;
&lt;br /&gt;
==Model Factory==&lt;br /&gt;
The plug-in requires a custom model factory to create the new class model instead of relying on the default model factory. &lt;br /&gt;
Create a new package &amp;lt;code&amp;gt;org.evenos.factories&amp;lt;/code&amp;gt; with a new class &amp;lt;code&amp;gt;MyModelFactory&amp;lt;/code&amp;gt;. Below we'll show different approaches for creating this factory.&lt;br /&gt;
&lt;br /&gt;
===iDempiere 9.0 onwards===&lt;br /&gt;
&lt;br /&gt;
====Annotation Based Factory====&lt;br /&gt;
&lt;br /&gt;
This type of model factory will automatically scan at runtime one or more packages searching for model classes with the &amp;lt;code&amp;gt;@Model&amp;lt;/code&amp;gt; annotation. This annotation is added automatically by the Model Generator to all X classes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package org.evenos.factories;&lt;br /&gt;
&lt;br /&gt;
import org.adempiere.base.AnnotationBasedModelFactory;&lt;br /&gt;
&lt;br /&gt;
public class MyModelFactory extends AnnotationBasedModelFactory {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	protected String[] getPackages() {&lt;br /&gt;
		return new String[] {&amp;quot;org.evenos.model&amp;quot;};&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Map Based Factory====&lt;br /&gt;
&lt;br /&gt;
With this type of model factory one must declare for each table:&lt;br /&gt;
&lt;br /&gt;
* Association between table name and its model class&lt;br /&gt;
* Model class instantiation for numeric identifier&lt;br /&gt;
* Model class instantiation via &amp;lt;code&amp;gt;ResultSet&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package org.evenos.factories;&lt;br /&gt;
&lt;br /&gt;
import org.idempiere.model.MappedModelFactory;&lt;br /&gt;
&lt;br /&gt;
public class MyModelFactory extends MappedModelFactory {&lt;br /&gt;
	&lt;br /&gt;
	public MyModelFactory() {&lt;br /&gt;
		addMapping(MEVESub.Table_Name, () -&amp;gt; MEVESub.class&lt;br /&gt;
			, (id, trxName) -&amp;gt; new MEVESub(Env.getCtx(), id, trxName)&lt;br /&gt;
			, (rs, trxName) -&amp;gt; new MEVESub(Env.getCtx(), rs, trxName));&lt;br /&gt;
		addMapping(MEVEMain.Table_Name, () -&amp;gt; MEVEMain.class&lt;br /&gt;
			, (id, trxName) -&amp;gt; new MEVEMain(Env.getCtx(), id, trxName)&lt;br /&gt;
			, (rs, trxName) -&amp;gt; new MEVEMain(Env.getCtx(), rs, trxName));&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===iDempiere 8.2 and earlier===&lt;br /&gt;
&lt;br /&gt;
The following approach shows how to implement a model factory from scratch, without using the base classes available since iDempiere 9.0. Following code is also compatible with iDempiere 9.0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package org.evenos.factories;&lt;br /&gt;
&lt;br /&gt;
import java.sql.ResultSet;&lt;br /&gt;
&lt;br /&gt;
import org.adempiere.base.IModelFactory;&lt;br /&gt;
import org.compiere.model.PO;&lt;br /&gt;
import org.compiere.util.Env;&lt;br /&gt;
import org.evenos.model.MEVEMain;&lt;br /&gt;
import org.evenos.model.MEVESub;&lt;br /&gt;
&lt;br /&gt;
public class MyModelFactory implements IModelFactory{&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public Class&amp;lt;?&amp;gt; getClass(String tableName) {&lt;br /&gt;
		if(tableName.equalsIgnoreCase(MEVESub.Table_Name))&lt;br /&gt;
			return MEVESub.class;&lt;br /&gt;
		&lt;br /&gt;
		if(tableName.equalsIgnoreCase(MEVEMain.Table_Name))&lt;br /&gt;
			return MEVEMain.class;&lt;br /&gt;
		&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public PO getPO(String tableName, int Record_ID, String trxName) {&lt;br /&gt;
		if(tableName.equalsIgnoreCase(MEVESub.Table_Name))&lt;br /&gt;
			return new MEVESub(Env.getCtx(), Record_ID, trxName);&lt;br /&gt;
		&lt;br /&gt;
		if(tableName.equalsIgnoreCase(MEVEMain.Table_Name))&lt;br /&gt;
			return new MEVEMain(Env.getCtx(), Record_ID, trxName);&lt;br /&gt;
		&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public PO getPO(String tableName, ResultSet rs, String trxName) {&lt;br /&gt;
		if(tableName.equalsIgnoreCase(MEVESub.Table_Name))&lt;br /&gt;
			return new MEVESub(Env.getCtx(), rs, trxName);&lt;br /&gt;
		&lt;br /&gt;
		if(tableName.equalsIgnoreCase(MEVEMain.Table_Name))&lt;br /&gt;
			return new MEVEMain(Env.getCtx(), rs, trxName);&lt;br /&gt;
		&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Component Definition==&lt;br /&gt;
The custom model factory must be made known to the OSGi framework so that it will be invoked in preference to the default model factory. &lt;br /&gt;
&lt;br /&gt;
Create a new folder 'OSGI-INF' in the project and then create a Component Definition file:&lt;br /&gt;
&lt;br /&gt;
'''Right-click ''OSGI-INF'' &amp;gt; New &amp;gt; Other... &amp;gt; Plug-in Development &amp;gt; Component Definition &amp;gt; Name: ModelFactory.xml &amp;gt; Finish'''&lt;br /&gt;
&lt;br /&gt;
Enter the following:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01 OSGI-INF 0.png|920px]]&lt;br /&gt;
&lt;br /&gt;
'''Note:'''&lt;br /&gt;
* ''Name'' is 'org.evenos.newwindow.model.factory'&lt;br /&gt;
* ''Class'' is 'org.evenos.factories.MyModelFactory' (use the Browse button to find it)&lt;br /&gt;
* Click on ''Add Property'' to create the 'service.ranking' property with type Integer and value 100 which will ensure that OSGi uses the custom model factory in preference to the default version&lt;br /&gt;
&lt;br /&gt;
Now add IModelFactory to the list of Provided Services on the Services tab of the Component Definition:&lt;br /&gt;
&lt;br /&gt;
'''Click 'Services' tab &amp;gt; Provided Services Add.. &amp;gt; IModelFactory''' and save the definition file.&lt;br /&gt;
&lt;br /&gt;
Finally, update the Manifest so that the Component Definition loads every service defined in the OSGI-INF directory by changing the last line as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Manifest-Version: 1.0&lt;br /&gt;
Bundle-ManifestVersion: 2&lt;br /&gt;
Bundle-Name: Newwindow&lt;br /&gt;
Bundle-SymbolicName: org.evenos.newwindow&lt;br /&gt;
Bundle-Version: 1.0.0.qualifier&lt;br /&gt;
Bundle-RequiredExecutionEnvironment: JavaSE-1.6&lt;br /&gt;
Require-Bundle: org.adempiere.base;bundle-version=&amp;quot;4.1.0&amp;quot;,&lt;br /&gt;
 org.adempiere.plugin.utils;bundle-version=&amp;quot;4.1.0&amp;quot;&lt;br /&gt;
Service-Component: OSGI-INF/*&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''Note:''' this last step is optional, but the presenter of the video recommends it as good practise.&lt;br /&gt;
&lt;br /&gt;
The video includes a useful discussion on building business logic into the 'M' Classes [http://www.youtube.com/watch?v=F1lFHS2riG4&amp;amp;t=2433s at this point].&lt;br /&gt;
&lt;br /&gt;
=Close-out=&lt;br /&gt;
The plug-in is now complete, so you can build the product and deploy it for use.&lt;/div&gt;</summary>
		<author><name>Sjg</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Developing_iDempiere:_Create_a_new_custom_class_model_with_window_and_tabs&amp;diff=19407</id>
		<title>Developing iDempiere: Create a new custom class model with window and tabs</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Developing_iDempiere:_Create_a_new_custom_class_model_with_window_and_tabs&amp;diff=19407"/>
		<updated>2021-11-29T02:11:46Z</updated>

		<summary type="html">&lt;p&gt;Sjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development|P]]&lt;br /&gt;
[[Category:Developer documentation‏‎]]&lt;br /&gt;
[[Category:Plug-In Development]]&lt;br /&gt;
__TOC__&lt;br /&gt;
=Introduction=&lt;br /&gt;
iDempiere can be extended by creating new class models for specific business requirements without editing code in the trunk so that your [https://en.wikipedia.org/wiki/Bespoke bespoke] development can be protected from system upgrades.&lt;br /&gt;
&lt;br /&gt;
This tutorial will show you how to create a parent-child class model and a window with tabs and fields to create, update and delete data using the built-in functionality of iDempiere.&lt;br /&gt;
&lt;br /&gt;
It is based on [https://www.youtube.com/watch?v=F1lFHS2riG4 this video] by Jan Thielemann from [http://www.evenos.de/ evenos GmbH].&lt;br /&gt;
&lt;br /&gt;
The process is as follows:&lt;br /&gt;
* Create the underlying database tables to support the new class model;&lt;br /&gt;
* Create Table entries in the iDempiere dictionary to register the database tables;&lt;br /&gt;
* Create a Window and Tab for the parent table, with a Sub-Tab for the child table;&lt;br /&gt;
* Create a Menu entry to open the Window;&lt;br /&gt;
* Build a plug-in so that the new functionality can be deployed with the base application.&lt;br /&gt;
&lt;br /&gt;
=Prerequisites=&lt;br /&gt;
The tutorial assumes that you have set up iDempiere in an Eclipse development environment. If you have not, follow these instructions for installing iDempiere for Development:&lt;br /&gt;
# [[Install Development Prerequisites]]&lt;br /&gt;
# [[Download the Code]]&lt;br /&gt;
# [[Setting up Eclipse]]&lt;br /&gt;
# [[Importing DB Seed Manually]]&lt;br /&gt;
# [[Running iDempiere within Eclipse]]&lt;br /&gt;
&lt;br /&gt;
The tutorial also assumes that you know how to create PostgreSQL tables using a SQL editor such as the psql command line interface or a tool like [https://www.pgadmin.org/download/ pgAdmin3].&lt;br /&gt;
&lt;br /&gt;
=New class model=&lt;br /&gt;
The first step is to create a new class model in the form of two database tables with a parent-child relation between them. &lt;br /&gt;
&lt;br /&gt;
==Parent table==&lt;br /&gt;
Create the main parent table '''''eve_main''''' as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE eve_main(&lt;br /&gt;
-- Mandatory columns&lt;br /&gt;
  eve_main_id numeric(10,0) PRIMARY KEY,&lt;br /&gt;
  eve_main_uu character varying(36) DEFAULT NULL::character varying UNIQUE,&lt;br /&gt;
  ad_client_id numeric(10,0) NOT NULL,&lt;br /&gt;
  ad_org_id numeric(10,0) NOT NULL,&lt;br /&gt;
  isactive character(1) NOT NULL DEFAULT 'Y'::bpchar,&lt;br /&gt;
  created timestamp without time zone NOT NULL DEFAULT now(),&lt;br /&gt;
  createdby numeric(10,0) NOT NULL,&lt;br /&gt;
  updated timestamp without time zone NOT NULL DEFAULT now(),&lt;br /&gt;
  updatedby numeric(10,0) NOT NULL,&lt;br /&gt;
&lt;br /&gt;
-- User-defined columns&lt;br /&gt;
  value character varying(40) NOT NULL,&lt;br /&gt;
  name character varying(255) NOT NULL,&lt;br /&gt;
  description character varying(255) NOT NULL,&lt;br /&gt;
  help character varying(2000),&lt;br /&gt;
  m_product_id numeric(10,0),&lt;br /&gt;
  UNIQUE (ad_client_id, value)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The iDempiere table naming convention is to prefix the table name with three or more letters specific to your project, followed by an underscore and the table name in camelCase. In this example, the table name is prefixed with ''eve_'', for the name of the company that Jan works for, Evenos.&lt;br /&gt;
&lt;br /&gt;
The table must start with a set of mandatory columns that are used by iDempiere to manage the records and record activity for audit purposes. In the table above they are:&lt;br /&gt;
*'''eve_main_id''': the primary key of the table, named by adding the suffix '''''_id''''' to the table name;&lt;br /&gt;
*'''eve_main_uu''': a unique identifier, named by adding the suffix '''''_uu''''' to the table name;&lt;br /&gt;
*'''ad_client_id''': the identifier of the client or tenant;&lt;br /&gt;
*'''ad_org_id''': the identifier of the organisational unit within the client;&lt;br /&gt;
*'''isactive''': records can be deactivated to allow for logical deletes;&lt;br /&gt;
*'''created''': the date this record was created;&lt;br /&gt;
*'''createdby''': the user that created the record;&lt;br /&gt;
*'''updated''': the date this record was updated;&lt;br /&gt;
*'''updatedby''': the user that updated the record.&lt;br /&gt;
&lt;br /&gt;
The recommended user-defined columns include:&lt;br /&gt;
*'''value''': the search key or code;&lt;br /&gt;
*'''name''': the display name;&lt;br /&gt;
*'''description''': long description;&lt;br /&gt;
*'''help''': help or comments.&lt;br /&gt;
&lt;br /&gt;
The parent table includes a field ''m_product_id'' which is in the standard iDempiere table ''M_Product'', and it has a constraint that ensures that the contents of the ''client'' and ''value'' columns are unique in combination.&lt;br /&gt;
&lt;br /&gt;
Note that columns with the 'NOT NULL' constraint will become mandatory fields in the window.&lt;br /&gt;
&lt;br /&gt;
==Child table==&lt;br /&gt;
Create the child table '''''eve_sub''''' as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE eve_sub(&lt;br /&gt;
-- Mandatory columns&lt;br /&gt;
  eve_sub_id numeric(10,0) PRIMARY KEY,&lt;br /&gt;
  eve_sub_uu character varying(36) DEFAULT NULL::character varying UNIQUE,&lt;br /&gt;
  ad_client_id numeric(10,0) NOT NULL,&lt;br /&gt;
  ad_org_id numeric(10,0) NOT NULL,&lt;br /&gt;
  isactive character(1) NOT NULL DEFAULT 'Y'::bpchar,&lt;br /&gt;
  created timestamp without time zone NOT NULL DEFAULT now(),&lt;br /&gt;
  createdby numeric(10,0) NOT NULL,&lt;br /&gt;
  updated timestamp without time zone NOT NULL DEFAULT now(),&lt;br /&gt;
  updatedby numeric(10,0) NOT NULL,&lt;br /&gt;
&lt;br /&gt;
-- User-defined columns&lt;br /&gt;
  eve_main_id numeric(10,0) NOT NULL references eve_main(eve_main_id),&lt;br /&gt;
  value character varying(40) NOT NULL,&lt;br /&gt;
  name character varying(255) NOT NULL,&lt;br /&gt;
  description character varying(255) NOT NULL,&lt;br /&gt;
  help character varying(2000),&lt;br /&gt;
  UNIQUE (ad_client_id, value)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is just like the parent table, except it has a foreign key relationship to the parent.&lt;br /&gt;
&lt;br /&gt;
=Table and Columns=&lt;br /&gt;
==Login as SuperUser==&lt;br /&gt;
The window for the new class models is created by configuring iDempiere to use the new tables, using the SuperUser login and System client, so browse to http://localhost:8080/webui/ and login as SuperUser and check the Select Role box:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Login_Select_Role.png|512px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make sure the Client is System and the Role is System Administrator:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Role.png|512px]]&lt;br /&gt;
&lt;br /&gt;
==Create the Table and Columns==&lt;br /&gt;
After login, select the create Table and Column button on the right of the ''Table and Column'' entry in the Favourites window:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Table_and_Columns.png|560px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Create the Table by entering the parent database table in the DB Table Name field:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Create_Main.png|980px]]&lt;br /&gt;
&lt;br /&gt;
'''Note:''' &lt;br /&gt;
* the prefix and the table name have been capitalized so that when we build the plug-in, the iDempiere Model Generator generates Java classes with names that conform to the standard naming convention;&lt;br /&gt;
* the ''Database Access Level'' is set to 'All' to ensure that the table can be used by all Clients, including System;&lt;br /&gt;
* the ''Entity Type'' is 'User maintained' to protect the table from system upgrades.&lt;br /&gt;
&lt;br /&gt;
See the Table and Column documentation for the usage of the other table attributes: [[Template:Table and Column (Window ID-100 V1.0.0)#TAB:_Table]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Save the Table record, then click on the Processes cog to create columns from the database table:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Create_Columns.png|612px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The process will ask you to confirm that you want to create the columns:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Create_Database_Columns.png|480px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When the process has completed it will list the columns that were created:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Create_Columns_Success.png|320px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now you have the new Table and Columns to work with:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Table_and_Columns_Created.png|1024px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Scroll through the Columns listed in the grid below and change their properties as required by the application. As an example, click on the Edit button on the left of the record for ''M_Product_ID'' to open up the details of the column: &lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Column_Details.png|1024px]]&lt;br /&gt;
&lt;br /&gt;
Note that ''M_Product_ID'' is already in the system dictionary because it is a column in the table ''M_Product'' so some of the column attributes are already populated.&lt;br /&gt;
&lt;br /&gt;
See the Table and Column documentation for the usage of each of the other Column attributes: [[Template:Table and Column (Window ID-100 V1.0.0)#TAB:_Column]]. The video has [https://youtu.be/F1lFHS2riG4?t=7m34s a detailed discussion] of all the various Column attributes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now repeat the exercise to create a Table entry for the child database table '''''eve_sub''''' and generate the columns from the database:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Child_Table_and_Columns_Created.png|1024px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We must link the child table to its parent, using the column ''EVE_Main_ID'', so select it and open it, then check the ''Parent link column'' attribute and save the change to the column:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Link_Child_to_Parent.png|1024px]]&lt;br /&gt;
&lt;br /&gt;
Note that we could have done the same to the parent table ''EVE_Main'' above to link it to the ''M_Product'' table too.&lt;br /&gt;
&lt;br /&gt;
=Window and Tabs=&lt;br /&gt;
We have created the entries for the two tables, so now we can create the window and tab for the parent ''EVE_Main'' and a sub-tab for the child ''EVE_Sub''.&lt;br /&gt;
&lt;br /&gt;
==Create Window==&lt;br /&gt;
Click on the button to create a new window (on the right of the ''Window, Tab &amp;amp; Field'' entry in Favourites) and enter the name.&lt;br /&gt;
&lt;br /&gt;
Uncheck the attribute ''Sales Transaction'' because it is not relevant, and save the record:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Create_Window.png|1024px]]&lt;br /&gt;
&lt;br /&gt;
==Create Tab==&lt;br /&gt;
Click on the ''Tab'' tab under the window you created above to open a new screen for the tab.&lt;br /&gt;
&lt;br /&gt;
Enter the name ''Main Tab'', and select the Table name ''EVE_Main_Evenos Main'' from the dropdown.&lt;br /&gt;
&lt;br /&gt;
Check the attribute ''Single Row Layout'' and then save the record:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Create_Tab.png|1024px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Scroll down to the large ''Create Fields'' button on the tab screen and select it to generate the fields from the database table. Select ''OK'' on the confirmation screen:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Create_Tab_Fields.png|480px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When the process has completed it will list the fields that were created, and after you dismiss the popup confirmation, you will see them at the bottom of the tab screen:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Create_Tab_Fields_Created.png|1024px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can click on the ''Field Sequence'' tab to adjust the field ordering.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Click on the cog in the toolbar to open a graphical editor to edit the layout of the fields:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Tab_Editor_Process.png|520px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Tab Editor will open in a new window where you can add and remove fields, drag them around (by grabbing the field title), resize them (by double-clicking with and without holding down CTRL), and so on: &lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Tab_Editor.png|1028px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Watch [http://www.youtube.com/watch?v=F1lFHS2riG4&amp;amp;t=1190s the video] for a demonstration of the Tab Editor.&lt;br /&gt;
&lt;br /&gt;
==Sub-Tab==&lt;br /&gt;
Now we must create the sub-tab for the child table, so click on the ''New Record'' icon and enter the details for the sub-tab.&lt;br /&gt;
&lt;br /&gt;
Note that the ''Tab Level'' must be set to '''1''' because it is a sub-tab (the default level is 0).&lt;br /&gt;
&lt;br /&gt;
Scroll down and click on the ''Create Fields'' icon to generate the fields for the sub-tab:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Create_Sub_Tab.png|1024px]]&lt;br /&gt;
&lt;br /&gt;
=Menu=&lt;br /&gt;
You must create a Menu entry to use the new window, so click on the button to create a new menu (on the right of the ''Menu'' entry in Favourites).&lt;br /&gt;
&lt;br /&gt;
Enter the name, set the Action to ''Window'' and use the dropdown in Window to find the window that you created above, and save the record:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01_Create_Menu.png|1024px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note:''' the new menu entry will appear in the list of menu items on the left but it will not be active because menu items are loaded when the user logs in for the first time. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Log out and log in again to see the new entry in the Menu tree:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01 Menu Created.png|720px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Click on the new menu entry to see the new window with its main tab and the sub-tab below:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01 New Window.png|1024px]]&lt;br /&gt;
&lt;br /&gt;
Watch [http://www.youtube.com/watch?v=F1lFHS2riG4&amp;amp;t=1525s the video] and test the new window.&lt;br /&gt;
&lt;br /&gt;
=Plug-in=&lt;br /&gt;
At this point the new model is only available in the development environment, and it is implemented using default mechanisms that contain no Business logic. We need to build a plug-in to hold the new model, together with any bespoke logic that may be required, so that it can be deployed with the base system. &lt;br /&gt;
&lt;br /&gt;
You can watch the video [http://www.youtube.com/watch?v=F1lFHS2riG4&amp;amp;t=1680s from this point] before you follow the summary of the process below.&lt;br /&gt;
&lt;br /&gt;
==Plug-in Project==&lt;br /&gt;
The first step is to create a Plug-in Project. &lt;br /&gt;
&lt;br /&gt;
If you have not already done so, create a sub-directory in your workspace for bespoke plug-ins to keep the codebase clean (in this example, the sub-directory is called ''zerlina-plugins''). &lt;br /&gt;
&lt;br /&gt;
'''File &amp;gt; New &amp;gt; Other &amp;gt; Plug-in Project &amp;gt; Next &amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
[[File:GS01 New Plug-in Project.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note:'''&lt;br /&gt;
* ''Use default location'' box is unchecked so that the plug-in project location can be used instead;&lt;br /&gt;
* ''Target Platform'' is the Equinox OSGi framework.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:GS01 New Plug-in Project 1.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note:''' the author has selected JavaSE-1.6 to ensure that the plug-in is backwards compatible with older servers.&lt;br /&gt;
&lt;br /&gt;
Answer ''Yes'' if Eclipse asks you if you want to use the Plug-in perspective.&lt;br /&gt;
&lt;br /&gt;
==Package for the model==&lt;br /&gt;
Now navigate to the '''''src''''' folder of the new project and create a new package:&lt;br /&gt;
&lt;br /&gt;
'''Right-click on ''src'' &amp;gt; New &amp;gt; Package'''&lt;br /&gt;
&lt;br /&gt;
[[File:GS01 New Java Package.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note:''' the name of the package is ''org.evenos.model''&lt;br /&gt;
&lt;br /&gt;
==Model generator==&lt;br /&gt;
Generate the models with the model generator:&lt;br /&gt;
&lt;br /&gt;
'''Run &amp;gt; Run Configurations... &amp;gt; model.generator &amp;gt; Run'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After a few seconds the Model Class Generator will open:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01 Model Generator.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note:'''&lt;br /&gt;
* use the '...' icon in ''Source Folder'' to browse to the '''''src''''' folder of the project in the plug-ins sub-directory;&lt;br /&gt;
* ''Package Name'' is 'org.evenos.model';&lt;br /&gt;
* ''Table Name'' is 'EVE_%' to generate models for both tables;&lt;br /&gt;
* ''Entity Type'' is 'U' for User Maintained.&lt;br /&gt;
&lt;br /&gt;
Refresh the project to see the newly generated model classes.&lt;br /&gt;
&lt;br /&gt;
=='M' Classes==&lt;br /&gt;
Create two 'M' classes to hold the business logic for each of the two tables:&lt;br /&gt;
&lt;br /&gt;
'''Right-click ''org.evenos.model'' &amp;gt; New &amp;gt; Class &amp;gt; Name: MEVEMain &amp;gt; Finish'''&lt;br /&gt;
&lt;br /&gt;
Add two constructors and a generated serial version ID:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package org.evenos.model;&lt;br /&gt;
&lt;br /&gt;
import java.sql.ResultSet;&lt;br /&gt;
import java.util.Properties;&lt;br /&gt;
&lt;br /&gt;
public class MEVEMain extends X_EVE_Main{&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * &lt;br /&gt;
	 */&lt;br /&gt;
	private static final long serialVersionUID = -4652910060540398746L;&lt;br /&gt;
&lt;br /&gt;
	public MEVEMain(Properties ctx, ResultSet rs, String trxName) {&lt;br /&gt;
		super(ctx, rs, trxName);&lt;br /&gt;
		// TODO Auto-generated constructor stub&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public MEVEMain(Properties ctx, int EVE_Main_ID, String trxName) {&lt;br /&gt;
		super(ctx, EVE_Main_ID, trxName);&lt;br /&gt;
		// TODO Auto-generated constructor stub&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Repeat for '''''MEVESub''''':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package org.evenos.model;&lt;br /&gt;
&lt;br /&gt;
import java.sql.ResultSet;&lt;br /&gt;
import java.util.Properties;&lt;br /&gt;
&lt;br /&gt;
public class MEVESub extends X_EVE_Sub{&lt;br /&gt;
&lt;br /&gt;
	/**&lt;br /&gt;
	 * &lt;br /&gt;
	 */&lt;br /&gt;
	private static final long serialVersionUID = -2076611601274220946L;&lt;br /&gt;
&lt;br /&gt;
	public MEVESub(Properties ctx, int EVE_Sub_ID, String trxName) {&lt;br /&gt;
		super(ctx, EVE_Sub_ID, trxName);&lt;br /&gt;
		// TODO Auto-generated constructor stub&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public MEVESub(Properties ctx, ResultSet rs, String trxName) {&lt;br /&gt;
		super(ctx, rs, trxName);&lt;br /&gt;
		// TODO Auto-generated constructor stub&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To get some idea of what business logic is possible in these classes, look at the 'M' classes in the package 'org.compiere.model' in the project 'org.adempiere.base' which is the core of iDempiere.&lt;br /&gt;
&lt;br /&gt;
==Dependencies==&lt;br /&gt;
The operation of the new plug-in is dependent on two other plug-ins, so use the '''Add...''' button to add 'org.adempiere.base' and 'org.adempiere.plugin.utils' to the plug-in manifest:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01 Manifest Dependencies.png]]&lt;br /&gt;
&lt;br /&gt;
==Model Factory==&lt;br /&gt;
The plug-in requires a custom model factory to create the new class model instead of relying on the default model factory. &lt;br /&gt;
Create a new package &amp;lt;code&amp;gt;org.evenos.factories&amp;lt;/code&amp;gt; with a new class &amp;lt;code&amp;gt;MyModelFactory&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===iDempiere 9.0 onwards===&lt;br /&gt;
&lt;br /&gt;
====Annotation Based Factory====&lt;br /&gt;
&lt;br /&gt;
This type of model factory will automatically scan at runtime one or more packages searching for model classes with the &amp;lt;code&amp;gt;@Model&amp;lt;/code&amp;gt; annotation. This annotation is added automatically by the Model Generator to all X classes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package org.evenos.factories;&lt;br /&gt;
&lt;br /&gt;
import org.adempiere.base.AnnotationBasedModelFactory;&lt;br /&gt;
&lt;br /&gt;
public class MyModelFactory extends AnnotationBasedModelFactory {&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	protected String[] getPackages() {&lt;br /&gt;
		return new String[] {&amp;quot;org.evenos.model&amp;quot;};&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Map Based Factory====&lt;br /&gt;
&lt;br /&gt;
With this type of model factory one must declare for each table:&lt;br /&gt;
&lt;br /&gt;
* Association between table name and its model class&lt;br /&gt;
* Model class instantiation for numeric identifier&lt;br /&gt;
* Model class instantiation via &amp;lt;code&amp;gt;ResultSet&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package org.evenos.factories;&lt;br /&gt;
&lt;br /&gt;
import org.idempiere.model.MappedModelFactory;&lt;br /&gt;
&lt;br /&gt;
public class MyModelFactory extends MappedModelFactory {&lt;br /&gt;
	&lt;br /&gt;
	public MyModelFactory() {&lt;br /&gt;
		addMapping(MEVESub.Table_Name, () -&amp;gt; MEVESub.class&lt;br /&gt;
			, (id, trxName) -&amp;gt; new MEVESub(Env.getCtx(), id, trxName)&lt;br /&gt;
			, (rs, trxName) -&amp;gt; new MEVESub(Env.getCtx(), rs, trxName));&lt;br /&gt;
		addMapping(MEVEMain.Table_Name, () -&amp;gt; MEVEMain.class&lt;br /&gt;
			, (id, trxName) -&amp;gt; new MEVEMain(Env.getCtx(), id, trxName)&lt;br /&gt;
			, (rs, trxName) -&amp;gt; new MEVEMain(Env.getCtx(), rs, trxName));&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===iDempiere 8.2 and earlier===&lt;br /&gt;
&lt;br /&gt;
The following approach shows how to implement a model factory from scratch, without using the base classes available since iDempiere 9.0. Following code is also compatible with iDempiere 9.0.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
package org.evenos.factories;&lt;br /&gt;
&lt;br /&gt;
import java.sql.ResultSet;&lt;br /&gt;
&lt;br /&gt;
import org.adempiere.base.IModelFactory;&lt;br /&gt;
import org.compiere.model.PO;&lt;br /&gt;
import org.compiere.util.Env;&lt;br /&gt;
import org.evenos.model.MEVEMain;&lt;br /&gt;
import org.evenos.model.MEVESub;&lt;br /&gt;
&lt;br /&gt;
public class MyModelFactory implements IModelFactory{&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public Class&amp;lt;?&amp;gt; getClass(String tableName) {&lt;br /&gt;
		if(tableName.equalsIgnoreCase(MEVESub.Table_Name))&lt;br /&gt;
			return MEVESub.class;&lt;br /&gt;
		&lt;br /&gt;
		if(tableName.equalsIgnoreCase(MEVEMain.Table_Name))&lt;br /&gt;
			return MEVEMain.class;&lt;br /&gt;
		&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public PO getPO(String tableName, int Record_ID, String trxName) {&lt;br /&gt;
		if(tableName.equalsIgnoreCase(MEVESub.Table_Name))&lt;br /&gt;
			return new MEVESub(Env.getCtx(), Record_ID, trxName);&lt;br /&gt;
		&lt;br /&gt;
		if(tableName.equalsIgnoreCase(MEVEMain.Table_Name))&lt;br /&gt;
			return new MEVEMain(Env.getCtx(), Record_ID, trxName);&lt;br /&gt;
		&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	@Override&lt;br /&gt;
	public PO getPO(String tableName, ResultSet rs, String trxName) {&lt;br /&gt;
		if(tableName.equalsIgnoreCase(MEVESub.Table_Name))&lt;br /&gt;
			return new MEVESub(Env.getCtx(), rs, trxName);&lt;br /&gt;
		&lt;br /&gt;
		if(tableName.equalsIgnoreCase(MEVEMain.Table_Name))&lt;br /&gt;
			return new MEVEMain(Env.getCtx(), rs, trxName);&lt;br /&gt;
		&lt;br /&gt;
		return null;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Component Definition==&lt;br /&gt;
The custom model factory must be made known to the OSGi framework so that it will be invoked in preference to the default model factory. &lt;br /&gt;
&lt;br /&gt;
Create a new folder 'OSGI-INF' in the project and then create a Component Definition file:&lt;br /&gt;
&lt;br /&gt;
'''Right-click ''OSGI-INF'' &amp;gt; New &amp;gt; Other... &amp;gt; Plug-in Development &amp;gt; Component Definition &amp;gt; Name: ModelFactory.xml &amp;gt; Finish'''&lt;br /&gt;
&lt;br /&gt;
Enter the following:&lt;br /&gt;
&lt;br /&gt;
[[File:GS01 OSGI-INF 0.png|920px]]&lt;br /&gt;
&lt;br /&gt;
'''Note:'''&lt;br /&gt;
* ''Name'' is 'org.evenos.newwindow.model.factory'&lt;br /&gt;
* ''Class'' is 'org.evenos.factories.MyModelFactory' (use the Browse button to find it)&lt;br /&gt;
* Click on ''Add Property'' to create the 'service.ranking' property with type Integer and value 100 which will ensure that OSGi uses the custom model factory in preference to the default version&lt;br /&gt;
&lt;br /&gt;
Now add IModelFactory to the list of Provided Services on the Services tab of the Component Definition:&lt;br /&gt;
&lt;br /&gt;
'''Click 'Services' tab &amp;gt; Provided Services Add.. &amp;gt; IModelFactory''' and save the definition file.&lt;br /&gt;
&lt;br /&gt;
Finally, update the Manifest so that the Component Definition loads every service defined in the OSGI-INF directory by changing the last line as follows:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Manifest-Version: 1.0&lt;br /&gt;
Bundle-ManifestVersion: 2&lt;br /&gt;
Bundle-Name: Newwindow&lt;br /&gt;
Bundle-SymbolicName: org.evenos.newwindow&lt;br /&gt;
Bundle-Version: 1.0.0.qualifier&lt;br /&gt;
Bundle-RequiredExecutionEnvironment: JavaSE-1.6&lt;br /&gt;
Require-Bundle: org.adempiere.base;bundle-version=&amp;quot;4.1.0&amp;quot;,&lt;br /&gt;
 org.adempiere.plugin.utils;bundle-version=&amp;quot;4.1.0&amp;quot;&lt;br /&gt;
Service-Component: OSGI-INF/*&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
'''Note:''' this last step is optional, but the presenter of the video recommends it as good practise.&lt;br /&gt;
&lt;br /&gt;
The video includes a useful discussion on building business logic into the 'M' Classes [http://www.youtube.com/watch?v=F1lFHS2riG4&amp;amp;t=2433s at this point].&lt;br /&gt;
&lt;br /&gt;
=Close-out=&lt;br /&gt;
The plug-in is now complete, so you can build the product and deploy it for use.&lt;/div&gt;</summary>
		<author><name>Sjg</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Main_Page&amp;diff=19406</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Main_Page&amp;diff=19406"/>
		<updated>2021-11-28T15:39:27Z</updated>

		<summary type="html">&lt;p&gt;Sjg: Fixed stale links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:Lager_NortheastIndiana.png|400px|thumb|right|Example of a large warehouse]]&lt;br /&gt;
=News and Community =&lt;br /&gt;
{| style=&amp;quot;border:0; margin: 0;&amp;quot; width=&amp;quot;100%&amp;quot; cellspacing=&amp;quot;10&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;padding:0; border:1px solid #aaaaaa; margin-bottom:5px;&amp;quot; | &lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 105%; padding:0.4em; background-color:#01DF01; border-bottom:1px solid #aaaaaa; text-align: center;&amp;quot;&amp;gt;News&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#ffffff; padding:0.2em 0.4em;&amp;quot;&amp;gt; &lt;br /&gt;
{| style=&amp;quot;border: 0; margin: 0;&amp;quot; cellpadding=&amp;quot;3&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Image:News-Paper.png|50px]] &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |  &lt;br /&gt;
&lt;br /&gt;
==Other News==&lt;br /&gt;
'''December 2020,''' iDempiere 8.2 Stable Release. [https://www.idempiere.org/download/ Download your local copy] or [https://www.idempiere.org/test-sites/ Try it out online]&amp;lt;br&amp;gt;&lt;br /&gt;
'''October 2019,''' The biggest iDempiere World [http://conference.amprofession.eu/ Conference] was held in Lyon&amp;lt;br&amp;gt;&lt;br /&gt;
'''February 2018,''' SourceForge.net Commnuity Choice iDempiere [https://sourceforge.net/blog/february-2018-community-choice-project-month-idempiere/ Project of the Month]&amp;lt;br&amp;gt;&lt;br /&gt;
'''July 26th 2017,''' [https://blog.capterra.com/free-open-source-erp-software/ Capterra Logistics Technology Blog - “The Top 8 Free, Open Source ERP Software”]&amp;lt;br&amp;gt;&lt;br /&gt;
'''20th March 2017,''' [http://www.tgdaily.com/technology/10-best-open-source-software-in-2017 TG Daily - 10 Best Open Source Software in 2017]&amp;lt;br&amp;gt;&lt;br /&gt;
'''September 2016,''' - iDempiere wins again [http://www.infoworld.com/article/3122000/open-source-tools/bossie-awards-2016-the-best-open-source-applications.html#slide7 BOSSIE Award for 2nd year]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==Available Plugins==&lt;br /&gt;
[[:Category:Available_Plugins|Available Plugins]]&lt;br /&gt;
&lt;br /&gt;
==Let's Join Efforts==&lt;br /&gt;
[[Lets join efforts|Let's join efforts - starting point for joining efforts]]&lt;br /&gt;
&lt;br /&gt;
==Chronology==&lt;br /&gt;
See [[Project:Current_events]] chronology&lt;br /&gt;
|} &lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;padding:0; border:1px solid #aaaaaa; margin-bottom:5px;&amp;quot; | &lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 105%; padding:0.4em; background-color:#01DF01; border-bottom:1px solid #aaaaaa; text-align: center;&amp;quot;&amp;gt;[[:Category:Community|'''Community''']]&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#ffffff; padding:0.2em 0.4em;&amp;quot;&amp;gt; &lt;br /&gt;
{| style=&amp;quot;border: 0; margin: 0;&amp;quot; cellpadding=&amp;quot;3&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Image:Communication.png|50px]] &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |  &lt;br /&gt;
* [http://www.idempiere.org/ Main Landing Page]&lt;br /&gt;
* [http://groups.google.com/group/idempiere Googlegroup]&lt;br /&gt;
* [http://idempiere.atlassian.net/ JIRA Issue Tracker]&lt;br /&gt;
* [https://mattermost.idempiere.org Chatroom]&lt;br /&gt;
* [[Contributing to iDempiere]]&lt;br /&gt;
* [http://www.globalqss.com/wiki/index.php/IDempiere/Full_Meeting_Minutes Minutes of the weekly_meetings]&lt;br /&gt;
*[[:Category:Meetings|Annual Meetings]]&lt;br /&gt;
* [http://www.globalqss.com/wiki/index.php/IDempiere Carlos Ruiz]&lt;br /&gt;
* [https://hub.docker.com/r/idempiereofficial/idempiere Docker IDempiere Official] &lt;br /&gt;
|} &lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#ffffff; padding:0.2em 0.4em;&amp;quot;&amp;gt; &lt;br /&gt;
{| style=&amp;quot;border: 0; margin: 0;&amp;quot; cellpadding=&amp;quot;3&amp;quot; &lt;br /&gt;
&lt;br /&gt;
[[Image:Community-Berg.png|50px]]&lt;br /&gt;
* [http://twitter.com/idempiere Twitter for Code Updates]&lt;br /&gt;
* [http://www.facebook.com/groups/idempiere Facebook]&lt;br /&gt;
* [https://www.linkedin.com/grp/home?gid=5146317 LinkedIn]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/IDempiere Wikipedia]&lt;br /&gt;
|} &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
If no one is answering you maybe you need to know [http://www.catb.org/esr/faqs/smart-questions.html How To Ask Questions The Smart Way]&lt;br /&gt;
&lt;br /&gt;
=Features=&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border:0; margin: 0;&amp;quot; width=&amp;quot;100%&amp;quot; cellspacing=&amp;quot;10&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;padding:0; border:1px solid #aaaaaa; margin-bottom:5px;&amp;quot; | &lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 105%; padding:0.4em; background-color:#01DF01; border-bottom:1px solid #aaaaaa; text-align: center;&amp;quot;&amp;gt;'''Functions'''&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#ffffff; padding:0.2em 0.4em;&amp;quot;&amp;gt; &lt;br /&gt;
{| style=&amp;quot;border: 0; margin: 0;&amp;quot; cellpadding=&amp;quot;3&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
*[https://test.idempiere.org/ Demo Test]. &lt;br /&gt;
** '''EMail''': ''admin @ gardenworld.com'' (including spaces!) '''Password''': ''GardenAdmin'' &lt;br /&gt;
** '''EMail''': ''superuser @ idempiere.com'' OR ''system @ idempiere.com'' (including spaces!) '''Password''': ''System''&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/Enterprise_resource_planning (ERP) Enterprise resource planning]&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/Customer_relationship_management (CRM) Customer Relationship Management]&lt;br /&gt;
&lt;br /&gt;
'''Third Party Plugins''' [[:Category:Available_Plugins| find here]]&lt;br /&gt;
&lt;br /&gt;
'''Functions of iDempiere'''&lt;br /&gt;
* Multiple Organizations&lt;br /&gt;
* Multiple Client&lt;br /&gt;
* Multiple Languages&lt;br /&gt;
* Multible currency&lt;br /&gt;
* Multiple Accounting Formats and expandable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Securing iDempiere'''&lt;br /&gt;
* [https://wiki.idempiere.org/en/Securing_iDempiere Securing iDempiere Server]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br/&amp;gt;'''Supported web browsers'''&lt;br /&gt;
* Firefox&lt;br /&gt;
* All browsers based on chromium (google chrome, opera, edge, brave, chromium)&lt;br /&gt;
&lt;br /&gt;
|} &lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;padding:0; border:1px solid #aaaaaa; margin-bottom:5px;&amp;quot; | &lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 105%; padding:0.4em; background-color:#01DF01; border-bottom:1px solid #aaaaaa; text-align: center;&amp;quot;&amp;gt;[[:Category:New Features|New Features Index]]&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#ffffff; padding:0.2em 0.4em;&amp;quot;&amp;gt; &lt;br /&gt;
{| style=&amp;quot;border: 0; margin: 0;&amp;quot; cellpadding=&amp;quot;3&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |  &lt;br /&gt;
&lt;br /&gt;
* [[:Category:New_Features_v9.1|Version 9.1]]&lt;br /&gt;
* [[:Category:New_Features_v8.2|Version 8.2]]&lt;br /&gt;
* [[:Category:New_Features_v7.1|Version 7.1]]&lt;br /&gt;
* [[:Category:New_Features_v6.2|Version 6.2]]&lt;br /&gt;
* [[:Category:New_Features_v5.1|Version 5.1]]&lt;br /&gt;
* [[:Category:New_Features_v4.1|Version 4.1]]&lt;br /&gt;
* [[:Category:New_Features_v3.0|Version 3.0]]&lt;br /&gt;
* [[:Category:New_Features_v2.1|Version 2.1]]&lt;br /&gt;
* [[:Category:New_Features_v2.0|Version 2.0]]&lt;br /&gt;
* [[:Category:New_Features_v1.0|Version 1.0]]&lt;br /&gt;
&lt;br /&gt;
- - - - - - - - - - - - - - - - - - - - - &lt;br /&gt;
* [[:Category:New Features Architecture|'''A''' → Architecture]]&lt;br /&gt;
* [[:Category:New Features Development|'''D''' → Development]]&lt;br /&gt;
* [[:Category:New Features Functional‏‎|'''F''' → Functional]]&lt;br /&gt;
* [[:Category:New Features Security|'''S''' → Security]]&lt;br /&gt;
* [[:Category:New Features Technical‏‎|'''T''' → Technical]]&lt;br /&gt;
* [[:Category:New Features User Experience (Usability)|'''U''' → User Experience (Usability)]]&lt;br /&gt;
&lt;br /&gt;
|} &lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;padding:0; border:1px solid #aaaaaa; margin-bottom:5px;&amp;quot; | &lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 105%; padding:0.4em; background-color:#01DF01; border-bottom:1px solid #aaaaaa; text-align: center;&amp;quot;&amp;gt;'''Server Requirements'''&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#ffffff; padding:0.2em 0.4em;&amp;quot;&amp;gt; &lt;br /&gt;
{| style=&amp;quot;border: 0; margin: 0;&amp;quot; cellpadding=&amp;quot;3&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |  &lt;br /&gt;
&lt;br /&gt;
'''Supported Platforms'''&lt;br /&gt;
* Linux &lt;br /&gt;
* Windows &lt;br /&gt;
* Mac &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
'''System Requirements'''&lt;br /&gt;
&lt;br /&gt;
* [https://openjdk.java.net/ Java OpenJDK &amp;gt;= 11]&lt;br /&gt;
* [http://www.postgresql.org/ PostgreSQL &amp;gt;= 9.6] &lt;br /&gt;
* or [http://www.oracle.com/us/products/database/overview/index.html?origref=http://www.idempiere.org/ Oracle]&lt;br /&gt;
|}&amp;lt;/div&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=[[:Category:User_Manual|User's Manual for iDempiere]]=&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border:0; margin: 0;&amp;quot; width=&amp;quot;100%&amp;quot; cellspacing=&amp;quot;10&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;padding:0; border:1px solid #aaaaaa; margin-bottom:5px;&amp;quot; | &lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 105%; padding:0.4em; background-color:#D0E2EE; border-bottom:1px solid #aaaaaa; text-align: center;&amp;quot;&amp;gt;[[:Category:Installation|'''Installation:''']]&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#ffffff; padding:0.2em 0.4em 0.2em 0.4em;&amp;quot;&amp;gt; &lt;br /&gt;
{| style=&amp;quot;border: 0; margin: 0;&amp;quot; cellpadding=&amp;quot;3&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Image:Icon_mProcess.png|50px]] &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |  &lt;br /&gt;
&lt;br /&gt;
[[:Category:Installation|'''Installation:''']]&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Installation Windows‏‎|Installation Windows‏]]&lt;br /&gt;
* [[:Category:Installation Linux|Installation Linux (Debian, Ubuntu, etc.)]]&lt;br /&gt;
* [[:Category:Installation Database|Installation Database]]&lt;br /&gt;
* [[:Category:Installation Eclipse|Installation Eclipse]]&lt;br /&gt;
* [[:Category:Installation Installer|Installation Installer]]&lt;br /&gt;
* [[:Category:Installation Development Prerequisites|Installation Development Prerequisites]]&lt;br /&gt;
* Installation [[Translations|language Pack]] / [[Localizations]]&lt;br /&gt;
* [[:Category:Docker|Docker installation and configuration]]&lt;br /&gt;
&lt;br /&gt;
'''Integration points'''&lt;br /&gt;
*iDempiere has several integration points to integrate with other systems. The built in integration points are:&lt;br /&gt;
&lt;br /&gt;
* Configurable and flexible CSV-import&lt;br /&gt;
* [[Web services]]&lt;br /&gt;
* JMS messaging&lt;br /&gt;
&lt;br /&gt;
|} &lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;padding:0; border:1px solid #aaaaaa; margin-bottom:5px;&amp;quot; | &lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 105%; padding:0.4em; background-color:#D0E2EE; border-bottom:1px solid #aaaaaa; text-align: center;&amp;quot;&amp;gt;'''iDempiere Basics'''&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#ffffff; padding:0.2em 0.4em 0.2em 0.4em;&amp;quot;&amp;gt; &lt;br /&gt;
{| style=&amp;quot;border: 0; margin: 0;&amp;quot; cellpadding=&amp;quot;3&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Image:Icon_Ok24.png|50px]] &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |  &lt;br /&gt;
&lt;br /&gt;
'''Basics''' &lt;br /&gt;
*[[:Category:Reference Manual|Reference Manual]]&lt;br /&gt;
*[[Login Help|Login Help]]&lt;br /&gt;
*[[Reference|Menu Tree of ClientAdmin]]&lt;br /&gt;
*[[Reference-System|Menu Tree of System]]&lt;br /&gt;
*[[:Category:HowTo-Functional|HOW TOs Functional]]&lt;br /&gt;
*[[:Category:Diagramms-and_Overviews|Diagrams and overviews]]&lt;br /&gt;
 &lt;br /&gt;
|} &lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;padding:0; border:1px solid #aaaaaa; margin-bottom:5px;&amp;quot; | &lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 105%; padding:0.4em; background-color:#D0E2EE; border-bottom:1px solid #aaaaaa; text-align: center;&amp;quot;&amp;gt;[[:Category:System administration|'''System administration:''']]&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#ffffff; padding:0.2em 0.4em 0.2em 0.4em;&amp;quot;&amp;gt; &lt;br /&gt;
{| style=&amp;quot;border: 0; margin: 0;&amp;quot; cellpadding=&amp;quot;3&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Image:Icon_Preference24.png|50px]] &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |  &lt;br /&gt;
&lt;br /&gt;
[[:Category:System administration|'''System administration:''']]&lt;br /&gt;
&lt;br /&gt;
* [[:Category:System settings|System settings]]&lt;br /&gt;
* [[:Category:Client‏‎|Client administration]]&lt;br /&gt;
* [[:Category:Organization‏‎|Organization administration]]&lt;br /&gt;
* [[:Category:Role‏‎|Role administration]]&lt;br /&gt;
* [[:Category:User‏‎|User administration]]&lt;br /&gt;
* [[:Category:HowTo-Technical|HOW TOs Technical]]&lt;br /&gt;
&lt;br /&gt;
|}&amp;lt;/div&amp;gt; &lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border:0; margin: 0;&amp;quot; width=&amp;quot;100%&amp;quot; cellspacing=&amp;quot;10&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;padding:0; border:1px solid #aaaaaa; margin-bottom:5px;&amp;quot; | &lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 105%; padding:0.4em; background-color:#D0E2EE; border-bottom:1px solid #aaaaaa; text-align: center;&amp;quot;&amp;gt;[[:Category:Business_Partner‏‎|'''Business Partner''']]&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#ffffff; padding:0.2em 0.4em 0.2em 0.4em;&amp;quot;&amp;gt; &lt;br /&gt;
{| style=&amp;quot;border: 0; margin: 0;&amp;quot; cellpadding=&amp;quot;3&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Image:Icon_BPartner24.png|50px]] &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |  &lt;br /&gt;
&lt;br /&gt;
*[[:Business Partner Manual‏‎]]&lt;br /&gt;
*[[:Category:Business Partner base data|Business Partner base data‎]]&lt;br /&gt;
&lt;br /&gt;
|} &lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;padding:0; border:1px solid #aaaaaa; margin-bottom:5px;&amp;quot; | &lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 105%; padding:0.4em; background-color:#D0E2EE; border-bottom:1px solid #aaaaaa; text-align: center;&amp;quot;&amp;gt;[[:Category:Materials management‏‎|'''Materials management''']]&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#ffffff; padding:0.2em 0.4em 0.2em 0.4em;&amp;quot;&amp;gt; &lt;br /&gt;
{| style=&amp;quot;border: 0; margin: 0;&amp;quot; cellpadding=&amp;quot;3&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Image:Icon_Product24.png|50px]] &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &lt;br /&gt;
[[:Category:Materials management base data‏‎|'''Materials management base data:''']] &lt;br /&gt;
&lt;br /&gt;
* [[:Category:Article base data‏‎|Article base data]] &lt;br /&gt;
** [[:Category:Price List‏‎|Price List]] &lt;br /&gt;
* [[:Category:Warehouse base data‏‎|Warehouse base data]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:Category:Consisted movements‏‎|'''Consisted movements:''']] &lt;br /&gt;
* [[:Category:Consisted movements‏‎|Consisted movements]] &lt;br /&gt;
* [[:Category:Physical Inventory‏‎|Physical Inventory]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Performance Analysis''' &lt;br /&gt;
* Storage Detail&lt;br /&gt;
|} &lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;padding:0; border:1px solid #aaaaaa; margin-bottom:5px;&amp;quot; | &lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 105%; padding:0.4em; background-color:#D0E2EE; border-bottom:1px solid #aaaaaa; text-align: center;&amp;quot;&amp;gt;[[:Category:Procurement‏‎|'''Procurement''']]&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#ffffff; padding:0.2em 0.4em 0.2em 0.4em;&amp;quot;&amp;gt; &lt;br /&gt;
{| style=&amp;quot;border: 0; margin: 0;&amp;quot; cellpadding=&amp;quot;3&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Image:Icon_Info24.png|50px]] &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |  &lt;br /&gt;
&lt;br /&gt;
[[:Category:Procurement‏‎|'''Procurement:''']] &lt;br /&gt;
&lt;br /&gt;
* [[:Category:Procurement announcement‏‎|Procurement announcement]] &lt;br /&gt;
* [[:Category:Purchase Order‏‎|Purchase Order]] &lt;br /&gt;
* [[:Category:Material Receipt‏‎|Material Receipt]] &lt;br /&gt;
* Receipt Confirm&lt;br /&gt;
* Invoice (supplier)&lt;br /&gt;
* [[Match Order and Invoice]]&lt;br /&gt;
|}&amp;lt;/div&amp;gt; &lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border:0; margin: 0;&amp;quot; width=&amp;quot;100%&amp;quot; cellspacing=&amp;quot;10&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;padding:0; border:1px solid #aaaaaa; margin-bottom:5px;&amp;quot; | &lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 105%; padding:0.4em; background-color:#D0E2EE; border-bottom:1px solid #aaaaaa; text-align: center;&amp;quot;&amp;gt;'''Sales and Marketing'''&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#ffffff; padding:0.2em 0.4em 0.2em 0.4em;&amp;quot;&amp;gt; &lt;br /&gt;
{| style=&amp;quot;border: 0; margin: 0;&amp;quot; cellpadding=&amp;quot;3&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Image:Icon_Payment24.png|50px]] &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |  &lt;br /&gt;
&lt;br /&gt;
[[:Category:Sales‏‎|'''Sales...''' ]]&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Marketing Campaign‏‎|Marketing Campaign]]&lt;br /&gt;
* [[:Category:Distribution base data‏‎|Distribution base data]]&lt;br /&gt;
* [[:Category:Sales request‏‎|Sales request]]&lt;br /&gt;
* [[:Category:Sales order‏‎|Sales order]]&lt;br /&gt;
* [[:Category:Shipments‏‎|Shipments]]&lt;br /&gt;
* [[:Category:Sales invoice‏‎|Sales invoice]]&lt;br /&gt;
* [[:Category:RMA‏‎|Returns RMA]]&lt;br /&gt;
* [[:Category:Expenditure distribution‏‎|Expenditure distribution]]&lt;br /&gt;
* [[:Category:Project‏‎|Project]]&lt;br /&gt;
* [[:Category:Delivery note‏‎|Delivery note]]&lt;br /&gt;
&lt;br /&gt;
|} &lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;padding:0; border:1px solid #aaaaaa; margin-bottom:5px;&amp;quot; | &lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 105%; padding:0.4em; background-color:#D0E2EE; border-bottom:1px solid #aaaaaa; text-align: center;&amp;quot;&amp;gt;'''Manufacturing Management'''&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#ffffff; padding:0.2em 0.4em 0.2em 0.4em;&amp;quot;&amp;gt; &lt;br /&gt;
{| style=&amp;quot;border: 0; margin: 0;&amp;quot; cellpadding=&amp;quot;3&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Image:Prod.png|50px]] &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |  &lt;br /&gt;
&lt;br /&gt;
'''Engineering Management''' &lt;br /&gt;
&lt;br /&gt;
* Resource Manufacturing&lt;br /&gt;
* Manufacturing Workflow &lt;br /&gt;
&lt;br /&gt;
'''Planning Management''' &lt;br /&gt;
 &lt;br /&gt;
* Product Planning&lt;br /&gt;
* Forecast Management&lt;br /&gt;
* Material Requirement Planning&lt;br /&gt;
* Capacity Requirement Planning&lt;br /&gt;
* Distribution Ressource Planning&lt;br /&gt;
&lt;br /&gt;
[[:Category:Production‏‎|'''Production Mangement''']] &lt;br /&gt;
&lt;br /&gt;
'''Distribution Management''' &lt;br /&gt;
&lt;br /&gt;
[[:Category:Quality‏‎|'''Quality Management''']]  &lt;br /&gt;
&lt;br /&gt;
'''Standard Costing Management''' &lt;br /&gt;
|} &lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;padding:0; border:1px solid #aaaaaa; margin-bottom:5px;&amp;quot; | &lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 105%; padding:0.4em; background-color:#D0E2EE; border-bottom:1px solid #aaaaaa; text-align: center;&amp;quot;&amp;gt;[[:Category:Financial accounting‏‎|'''Financial accounting''']]&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#ffffff; padding:0.2em 0.4em 0.2em 0.4em;&amp;quot;&amp;gt; &lt;br /&gt;
{| style=&amp;quot;border: 0; margin: 0;&amp;quot; cellpadding=&amp;quot;3&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Image:Icon_Calculator24.png|50px]] &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''[[Accounting basics]]'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[:Category:Financial accounting‏‎|'''Financial accounting:''']]&lt;br /&gt;
* [[:Category:Financial accounting base data‏‎|Financial accounting base data]]&lt;br /&gt;
** [[:Category:Account‏‎|Account]]&lt;br /&gt;
** [[:Category:Currency‏‎|Currency]]&lt;br /&gt;
** [[:Category:Tax administration‏‎|Tax administration]]&lt;br /&gt;
** [[:Category:Bank Cashbook‏‎|Bank Cashbook]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Property and equipment‏‎|'''Property and equipment''']]&lt;br /&gt;
** [[:Category:Depreciation/amortization‏‎‏‏‎|Depreciation/amortization]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Accounting|Accounting]]&lt;br /&gt;
** [[:Category:Open items|Open items]]&lt;br /&gt;
** [[:Category:Payments|Payments]]&lt;br /&gt;
** [[:Category:Financial reports‏‎|Financial reports]]&lt;br /&gt;
** [[:Category:Performance measurement‏‎|Performance measurement]]&lt;br /&gt;
** [[:Category:Cost accounting‏‎|Cost accounting]]&lt;br /&gt;
*** [[Costing]]&lt;br /&gt;
*** [[Landed cost]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Staff|Staff]]&lt;br /&gt;
** [[:Category:Staff base data|Staff base data]]&lt;br /&gt;
|}&amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=[[:Category:Reference Manual|Develop iDempiere]]=&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border:0; margin: 0;&amp;quot; width=&amp;quot;100%&amp;quot; cellspacing=&amp;quot;10&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;padding:0; border:1px solid #aaaaaa; margin-bottom:5px;&amp;quot; | &lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 105%; padding:0.4em; background-color:#ECE5CA; border-bottom:1px solid #aaaaaa; text-align: center;&amp;quot;&amp;gt;'''Documentation'''&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#ffffff; padding:0.2em 0.4em;&amp;quot;&amp;gt; &lt;br /&gt;
{| style=&amp;quot;border: 0; margin: 0;&amp;quot; cellpadding=&amp;quot;3&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Image:Wikiicon.jpg|50px]] &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |  &lt;br /&gt;
&lt;br /&gt;
'''Wiki Basics''' &lt;br /&gt;
&lt;br /&gt;
* [[WIKI history, development and statistics|WIKI history, development and statistics]]&lt;br /&gt;
* [[Conventions_Used_in_the_Documentation|Conventions Used in the Documentation]]&lt;br /&gt;
* [[Set_up_Category|Set up Category]]&lt;br /&gt;
* [http://meta.wikimedia.org/wiki/Help:Contents This is a list of guides and single-topic help files for the MediaWiki ]&lt;br /&gt;
&lt;br /&gt;
|} &lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;padding:0; border:1px solid #aaaaaa; margin-bottom:5px;&amp;quot; | &lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 105%; padding:0.4em; background-color:#ECE5CA; border-bottom:1px solid #aaaaaa; text-align: center;&amp;quot;&amp;gt;'''Translation'''&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#ffffff; padding:0.2em 0.4em;&amp;quot;&amp;gt; &lt;br /&gt;
{| style=&amp;quot;border: 0; margin: 0;&amp;quot; cellpadding=&amp;quot;3&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Image:Icon_Translate24.png|50px]] &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |  &lt;br /&gt;
&lt;br /&gt;
'''Translation into other languages ''' &lt;br /&gt;
&lt;br /&gt;
* [[Translation_Project|Translation Project]]&lt;br /&gt;
* [http://wiki.idempiere.org/wiki/Main_Page Edit language package] &lt;br /&gt;
* [[:es:Guia_de_Migración_de_Módulos|Sample work in Spanish]] and [[:de:Anleitung_zur_Migration_von_Modulen|German]]&lt;br /&gt;
&lt;br /&gt;
|} &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; style=&amp;quot;padding:0; border:1px solid #aaaaaa; margin-bottom:5px;&amp;quot; | &lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size: 105%; padding:0.4em; background-color:#ECE5CA; border-bottom:1px solid #aaaaaa; text-align: center;&amp;quot;&amp;gt;[[:Category:Development|'''Development''']]&amp;lt;/div&amp;gt; &lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#ffffff; padding:0.2em 0.4em;&amp;quot;&amp;gt; &lt;br /&gt;
{| style=&amp;quot;border: 0; margin: 0;&amp;quot; cellpadding=&amp;quot;3&amp;quot; &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | [[Image:Icon_Preference24.png|50px]] &lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |  &lt;br /&gt;
&lt;br /&gt;
'''Programming iDempiere''' &lt;br /&gt;
* [https://github.com/idempiere/ Source code repository]&lt;br /&gt;
* [https://jenkins.idempiere.org/ Jenkins Continuous Build Server]&lt;br /&gt;
* [[Contributing_to_Trunk|Contributing to Core]]&lt;br /&gt;
* [[:Category:Plug-In Development|Plug-In Development Guide]]&lt;br /&gt;
* [https://web.archive.org/web/20200919013831/http://red1.org/adempiere/viewtopic.php?f=29&amp;amp;t=1713 How to create plugin] with a sample module migrated to iDempiere. &lt;br /&gt;
* [[Database structure]]&lt;br /&gt;
* [[:Category:HowTo-Technical|HOW TOs Technical]]&lt;br /&gt;
* [[:Category:Code Scratchpad|Code Scratchpad]]&lt;br /&gt;
* [https://web.archive.org/web/20200919013831/http://red1.org/adempiere/viewtopic.php?f=29&amp;amp;t=1713 Module Migration Guide] - learning how to Pack Out, Create Plugin, PackIn, Migrate legacy module script.&lt;br /&gt;
* [[Creating reports using JasperReports]]&lt;br /&gt;
* [[Create a custom document class]]&lt;br /&gt;
&lt;br /&gt;
|}&amp;lt;/div&amp;gt; &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=iDempiere vs others ERPs=  &lt;br /&gt;
* [https://web.archive.org/web/20200919013831/http://red1.org/adempiere/viewtopic.php?f=33&amp;amp;t=1482 Future of iDempiere by '''red1''']&lt;br /&gt;
* [http://techytony.wordpress.com/2013/06/29/idempiere-vs-adempiere-usability-round-1/ iDempiere vs ADempiere Usability Round 1]&lt;br /&gt;
* [http://techytony.wordpress.com/2013/07/05/idempiere-adempiere-usability-on-the-homepage/ iDempiere, ADempiere Usability on The Homepage]&lt;br /&gt;
&lt;br /&gt;
=Update iDempiere Server=&lt;br /&gt;
==Release 8.2==&lt;br /&gt;
* Update your iDempiere server:&lt;br /&gt;
 cd /opt/idempiere-server    # change to the home where you installed iDempiere&lt;br /&gt;
 bash update.sh https://jenkins.idempiere.org/job/iDempiere8.2/ws/org.idempiere.p2/target/repository/&lt;br /&gt;
 bash sign-database-build-alt.sh&lt;br /&gt;
&lt;br /&gt;
* After that you can update your database with this script: &lt;br /&gt;
 cd utils; bash RUN_SyncDB.sh&lt;br /&gt;
 # if RUN_SyncDB.sh throws error, review the problem, fix it and run it again until no errors are thrown&lt;br /&gt;
&lt;br /&gt;
=License =&lt;br /&gt;
&lt;br /&gt;
iDempiere is released under the terms of the [http://www.gnu.org/licenses/old-licenses/gpl-2.0.de.html GPL v2]. For more information, see the official site.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Credits=&lt;br /&gt;
*[https://www.idempiere.org/contributors/ Contributors]&lt;br /&gt;
*[https://www.idempiere.org/sponsors/ Sponsors]&lt;br /&gt;
&lt;br /&gt;
‏‎&lt;br /&gt;
[[Category: Table of contents]]&lt;br /&gt;
[[Category: general information about iDempiere]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[en:Main Page]] &lt;br /&gt;
[[es:Página_principal]]&lt;br /&gt;
[[de:Hauptseite]]&lt;br /&gt;
[[fr:Accueil]]&lt;br /&gt;
[[pt:Página_principal]]&lt;br /&gt;
[[da:Forside]]&lt;br /&gt;
[[el:Αρχική_σελίδα]]&lt;br /&gt;
[[nl:Hoofdpagina]]&lt;br /&gt;
[[pl:Strona główna]] &lt;br /&gt;
[[ru:Заглавная_страница]]&lt;br /&gt;
[[bg:Начална_страница]]&lt;br /&gt;
[[hu:Kezdőlap]]&lt;br /&gt;
[[sr:Главна_страна]]&lt;br /&gt;
[[sv:Huvudsida]]&lt;br /&gt;
[[tr:Ana_sayfa]]&lt;br /&gt;
[[ms:Laman_Utama]]&lt;br /&gt;
[[zh:首页]]&lt;br /&gt;
[[ja:メインページ]]&lt;br /&gt;
[[th:หน้าหลัก]]&lt;br /&gt;
[[id:Halaman_Utama]]&lt;br /&gt;
[[ar:الصفحة_الرئيسية]]&lt;br /&gt;
[[it:Pagina_principale]]&lt;br /&gt;
[[ro:Pagina_principală]]&lt;/div&gt;</summary>
		<author><name>Sjg</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Developing_Plug-Ins_-_IModelFactory&amp;diff=19292</id>
		<title>Developing Plug-Ins - IModelFactory</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Developing_Plug-Ins_-_IModelFactory&amp;diff=19292"/>
		<updated>2021-09-23T03:40:56Z</updated>

		<summary type="html">&lt;p&gt;Sjg: /* AbstractModelFactory */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development|P]]&lt;br /&gt;
[[Category:Developer documentation‏‎]]&lt;br /&gt;
[[Category:Plug-In Development]]&lt;br /&gt;
__TOC__&lt;br /&gt;
This tutorial is brought to you by Jan Thielemann from evenos GmbH (www.evenos-consulting.de). If you have questions, criticism or improvement suggestions, feel free to visit me ([[User:Jan.thielemann|Jan.thielemann]]) or write me [mailto:jan.thielemann@evenos.de an email]&lt;br /&gt;
=Goal of this tutorial=&lt;br /&gt;
The goal of this tutorial is to show, how you use the IModelFactory service in you plug-in project. The reason why you want to use the model factory service is, that you can provide your own model for custom tables and iDempiere will make use of them (e. G. the beforeSave method gets called). Also if you want to use the Query class, it is necessary to provide your own models. Otherwise, a Query will return a &amp;quot;GenericPO&amp;quot; instead of your model class.&lt;br /&gt;
&lt;br /&gt;
=Prerequisites=&lt;br /&gt;
Before you start this tutorial, you should take a look at the follwing tutorials:&lt;br /&gt;
* [[Developing_plug-ins_without_affecting_the_trunk|Developing Plug-Ins without affecting the Trunk]]&lt;br /&gt;
* [[Developing_Plug-Ins_-_Get_your_Plug-In_running|Developing Plug-Ins - Get your Plug-In started]]&lt;br /&gt;
* [[Developing_Plug-Ins_-_ModelValidator|Developing Plug-Ins - ModelValidator]]&lt;br /&gt;
&lt;br /&gt;
=tl;dr=&lt;br /&gt;
https://www.youtube.com/watch?v=Pxi46BmIrTw&lt;br /&gt;
https://www.youtube.com/watch?v=F1lFHS2riG4&lt;br /&gt;
&lt;br /&gt;
=The workflow=&lt;br /&gt;
==X_, I_, M? Which class is for what?==&lt;br /&gt;
In iDempiere we have different classes for our models. The toplevel class is called PO which stands for Persistent Object. Every models inherits it's methods. If you generate models or take a look at the existing ones, you will see that most of the tables have a X_ and I_ class.&lt;br /&gt;
&lt;br /&gt;
The I_ class is an interface which has information about the table and it's columns. It has a constant for the table name, it's ID in the Application Dictionary (which is loaded dynamically via MTable.getTable_ID()) and every column in the table. It also has the template for all the getter and setter methods.&lt;br /&gt;
&lt;br /&gt;
The X_ class is the basic model of every table. Here PO is extended and the I_ class is implemented. The X_ class implements all the getters and is the first class which could apply custom business logic (but don't put your business logic in here, you will learn why in a second). If you take a look at the code, you can see that the getter and setters which are implemented here often do some kind of validation to the data and use the POs methods to persist the data.&lt;br /&gt;
&lt;br /&gt;
The last class is the M class. Its naming scheme is &amp;quot;M&amp;quot; + &amp;quot;table prefix (if &amp;gt;=3 chars)&amp;quot; + &amp;quot;table name without spaces or underscores&amp;quot;. So if my table is called eve_this_is_my_table, i would create it in the Application Dictionary as &amp;quot;EVE_This_Is_My_Table&amp;quot; (notice the camel case writing). My model would be called &amp;quot;MEVEThisIsMyTable&amp;quot;. Feel free to not use the table prefix but i like it because it makes spotting custom models easier.&lt;br /&gt;
So what is the use of this M class which is not implemented automatically by the model generator? Thats easy to explain. All your custom business logic goes into this class. Why not using the X_ class? Because your table can change over time and everytime, you can simply run the model generator to recreate your I_ and X_ classes but you would lose all your custom business logic if it were in the X class. So by creating a M class which extends the X_ class you can regenerate your models without losing any code or functionality. &lt;br /&gt;
&lt;br /&gt;
What can you do in the M class? Some examples are:&lt;br /&gt;
* Overwrite the beforeSave(), afterSave(), beforeDelete(), afterDelete() model hooks&lt;br /&gt;
* Implement the DocAction interface to make your table act like a document&lt;br /&gt;
* Create special getters and setters (like MOrder.getLines())&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==IModelFactory==&lt;br /&gt;
'''NOTE: If you use Eclipse Oxigen or a newer version, you can use annotations instead of creating the component definition manually. Read more about it [[Developing_plug-ins_without_affecting_the_trunk#Event_handle|here]]''' &lt;br /&gt;
&lt;br /&gt;
After creating the plug-in and setting its dependencies, click on File&amp;gt;New&amp;gt;Other... and select &amp;quot;Component Definition&amp;quot; from the Plug-in Development section.&lt;br /&gt;
&lt;br /&gt;
[[File:Pluginmodelfactory1.png|320px]]&lt;br /&gt;
&lt;br /&gt;
Click on next. Select your plug-in project and chose a file name and a general name. We often use &amp;quot;defaultmodelfactory.xml&amp;quot; and &amp;quot;my.domain.model.factory&amp;quot; for the filename/name but every other name is okay too. You don't need to set the class name yet because we haven't implemented one. Click on finish.&lt;br /&gt;
&lt;br /&gt;
[[File:Pluginmodelfactory2.png|320px]]&lt;br /&gt;
&lt;br /&gt;
The next things we will need is:&lt;br /&gt;
*A Model&lt;br /&gt;
*A ModelFactory (which is just a class which implements IModelFactory&lt;br /&gt;
Notice that your model factory and your model class must be implemented in different classes. It will not work if you try to implement IModelFactory in one of your models. The good news is, you only need one model factory for all your custom models. For our tutorial, we will use a custom subclass of MOrder. Create the class MOrder_New which inherits from MOrder and implement the default constructors:&lt;br /&gt;
&lt;br /&gt;
[[File:Pluginmodelfactory3.png|320px]]&lt;br /&gt;
&lt;br /&gt;
The second class only implements IModelFactory and is called MyModelFactory. In getClass() we check if the table name is equal to our custom models table name and return the model class if it is. In the both getPO() methods, we use our custom models constructors to create new instances.&lt;br /&gt;
&lt;br /&gt;
[[File:Pluginmodelfactory4.png|320px]]&lt;br /&gt;
&lt;br /&gt;
Open the mymodelfactory.xml and click on the Browse button to select the MyModelFactory class. Also add a integer property called &amp;quot;service.ranking&amp;quot; with a positive value (&amp;gt;0).&lt;br /&gt;
&lt;br /&gt;
[[File:Pluginmodelfactory5.png|320px]]&lt;br /&gt;
&lt;br /&gt;
On the Services tab, add the IModelFactory to the &amp;quot;Provided Services&amp;quot; section.&lt;br /&gt;
&lt;br /&gt;
[[File:Pluginmodelfactory6.png|320px]]&lt;br /&gt;
&lt;br /&gt;
Basically thats all you need to do. To see that we realy did someting, open your custom model class again and add a console log in beforeSave()&lt;br /&gt;
&lt;br /&gt;
[[File:Pluginmodelfactory7.png|320px]]&lt;br /&gt;
&lt;br /&gt;
Make sure that your plug-in is active in the run configurations&lt;br /&gt;
&lt;br /&gt;
[[File:Pluginmodelfactory8.png|320px]]&lt;br /&gt;
&lt;br /&gt;
Start the client and make sure your plug-in is active&lt;br /&gt;
&lt;br /&gt;
[[File:Pluginmodelfactory9.png|320px]]&lt;br /&gt;
&lt;br /&gt;
Now log in as GardenAdmin/GardenWorld and create a new Sales Order fill in all mandatory fields and click on save. Take a look at your console log, you should see the log from your custom model class:&lt;br /&gt;
&lt;br /&gt;
[[File:Pluginmodelfactory10.png|320px]]&lt;br /&gt;
&lt;br /&gt;
==AbstractModelFactory==&lt;br /&gt;
It is encouraged that new model factories extend from [https://github.com/idempiere/idempiere/blob/master/org.adempiere.base/src/org/adempiere/base/AbstractModelFactory.java AbstractModelFactory] as it takes care of most of the common tasks assigned to model factories.&lt;br /&gt;
&lt;br /&gt;
Please note that this class was added to the iDempiere 9 codebase.&lt;br /&gt;
&lt;br /&gt;
==AnnotationBasedModelFactory==&lt;br /&gt;
This is the new default model factory that can be used/extended from iDempiere plugins. It detects model classes automatically as long as they have the @Model annotation. Model classes with M prefix don't have to be annotated, as long as their X classes (discussed above) are annotated. The default model generator (discussed below) was also modified in order to annotate X classes automatically.&lt;br /&gt;
&lt;br /&gt;
[[File:Annotated Model Factory.png|561px|Sample AnnotationBasedModelFactory implementation]]&lt;br /&gt;
&lt;br /&gt;
This code snippet shows how to implement a model factory on a plugin by extending AnnotationBasedModelFactory. Implementing classes are encouraged to indicate what are the packages where they model classes are located, by overriding the ''getPackages'' method.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/idempiere/idempiere/blob/master/org.adempiere.base/src/org/adempiere/base/AnnotationBasedModelFactory.java AnnotationBasedModelFactory] was added as part of the iDempiere 9 codebase.&lt;br /&gt;
&lt;br /&gt;
==Generating Models for custom Tables==&lt;br /&gt;
If you don't just want to overwrite a core model but provide your own model classes you need to do some steps. &lt;br /&gt;
# Create your table in the database&lt;br /&gt;
# Create an entry for your table in the Table and Column window&lt;br /&gt;
# Open Eclipse and start the generate.model App&lt;br /&gt;
# As the Source Folder, choose the &amp;quot;src&amp;quot; folder of your Plug-in&lt;br /&gt;
# As the Package Name chose a package name of your choice or use org.compiere.model if you like&lt;br /&gt;
# As the Table Name chose your prefix (custom tables should have 3 letter prefix in the db) and add some characters to identify your table. For example, if your table is called eve_this_is_a_table, then you could enter &amp;quot;eve_this%&amp;quot;. Make sure you use the correct upper/lower case writing!&lt;br /&gt;
# As the entity type, chose the entity type you selected in the DB. Normaly it's &amp;quot;U&amp;quot; for user maintained&lt;br /&gt;
# Check both checkboxed and generate your I_ and X_ class&lt;br /&gt;
# Feel free to implement a custom M class&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
*Make sure that in your modelfactory.xml you have a unique name (my.domainname.pluginname.model.factory is a good idea) and that you selected the right class&lt;br /&gt;
*Make sure there is no other model factory with a higher service.ranking property&lt;br /&gt;
*Make sure you have a seperate model/model factory class&lt;br /&gt;
*Make sure your plug-in is activated before you log in &lt;br /&gt;
*Make sure your MANIFEST.MF contains a row with &amp;quot;Service-Component: &amp;quot; and the path to your modelfactory.xml (e. g. &amp;quot;Service-Component: mymodelfactory.xml&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[ja:IModelFactoryのプラグイン開発]]&lt;/div&gt;</summary>
		<author><name>Sjg</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Developing_Plug-Ins_-_IModelFactory&amp;diff=19291</id>
		<title>Developing Plug-Ins - IModelFactory</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Developing_Plug-Ins_-_IModelFactory&amp;diff=19291"/>
		<updated>2021-09-23T03:39:40Z</updated>

		<summary type="html">&lt;p&gt;Sjg: Brief description of new model factories&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Development|P]]&lt;br /&gt;
[[Category:Developer documentation‏‎]]&lt;br /&gt;
[[Category:Plug-In Development]]&lt;br /&gt;
__TOC__&lt;br /&gt;
This tutorial is brought to you by Jan Thielemann from evenos GmbH (www.evenos-consulting.de). If you have questions, criticism or improvement suggestions, feel free to visit me ([[User:Jan.thielemann|Jan.thielemann]]) or write me [mailto:jan.thielemann@evenos.de an email]&lt;br /&gt;
=Goal of this tutorial=&lt;br /&gt;
The goal of this tutorial is to show, how you use the IModelFactory service in you plug-in project. The reason why you want to use the model factory service is, that you can provide your own model for custom tables and iDempiere will make use of them (e. G. the beforeSave method gets called). Also if you want to use the Query class, it is necessary to provide your own models. Otherwise, a Query will return a &amp;quot;GenericPO&amp;quot; instead of your model class.&lt;br /&gt;
&lt;br /&gt;
=Prerequisites=&lt;br /&gt;
Before you start this tutorial, you should take a look at the follwing tutorials:&lt;br /&gt;
* [[Developing_plug-ins_without_affecting_the_trunk|Developing Plug-Ins without affecting the Trunk]]&lt;br /&gt;
* [[Developing_Plug-Ins_-_Get_your_Plug-In_running|Developing Plug-Ins - Get your Plug-In started]]&lt;br /&gt;
* [[Developing_Plug-Ins_-_ModelValidator|Developing Plug-Ins - ModelValidator]]&lt;br /&gt;
&lt;br /&gt;
=tl;dr=&lt;br /&gt;
https://www.youtube.com/watch?v=Pxi46BmIrTw&lt;br /&gt;
https://www.youtube.com/watch?v=F1lFHS2riG4&lt;br /&gt;
&lt;br /&gt;
=The workflow=&lt;br /&gt;
==X_, I_, M? Which class is for what?==&lt;br /&gt;
In iDempiere we have different classes for our models. The toplevel class is called PO which stands for Persistent Object. Every models inherits it's methods. If you generate models or take a look at the existing ones, you will see that most of the tables have a X_ and I_ class.&lt;br /&gt;
&lt;br /&gt;
The I_ class is an interface which has information about the table and it's columns. It has a constant for the table name, it's ID in the Application Dictionary (which is loaded dynamically via MTable.getTable_ID()) and every column in the table. It also has the template for all the getter and setter methods.&lt;br /&gt;
&lt;br /&gt;
The X_ class is the basic model of every table. Here PO is extended and the I_ class is implemented. The X_ class implements all the getters and is the first class which could apply custom business logic (but don't put your business logic in here, you will learn why in a second). If you take a look at the code, you can see that the getter and setters which are implemented here often do some kind of validation to the data and use the POs methods to persist the data.&lt;br /&gt;
&lt;br /&gt;
The last class is the M class. Its naming scheme is &amp;quot;M&amp;quot; + &amp;quot;table prefix (if &amp;gt;=3 chars)&amp;quot; + &amp;quot;table name without spaces or underscores&amp;quot;. So if my table is called eve_this_is_my_table, i would create it in the Application Dictionary as &amp;quot;EVE_This_Is_My_Table&amp;quot; (notice the camel case writing). My model would be called &amp;quot;MEVEThisIsMyTable&amp;quot;. Feel free to not use the table prefix but i like it because it makes spotting custom models easier.&lt;br /&gt;
So what is the use of this M class which is not implemented automatically by the model generator? Thats easy to explain. All your custom business logic goes into this class. Why not using the X_ class? Because your table can change over time and everytime, you can simply run the model generator to recreate your I_ and X_ classes but you would lose all your custom business logic if it were in the X class. So by creating a M class which extends the X_ class you can regenerate your models without losing any code or functionality. &lt;br /&gt;
&lt;br /&gt;
What can you do in the M class? Some examples are:&lt;br /&gt;
* Overwrite the beforeSave(), afterSave(), beforeDelete(), afterDelete() model hooks&lt;br /&gt;
* Implement the DocAction interface to make your table act like a document&lt;br /&gt;
* Create special getters and setters (like MOrder.getLines())&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==IModelFactory==&lt;br /&gt;
'''NOTE: If you use Eclipse Oxigen or a newer version, you can use annotations instead of creating the component definition manually. Read more about it [[Developing_plug-ins_without_affecting_the_trunk#Event_handle|here]]''' &lt;br /&gt;
&lt;br /&gt;
After creating the plug-in and setting its dependencies, click on File&amp;gt;New&amp;gt;Other... and select &amp;quot;Component Definition&amp;quot; from the Plug-in Development section.&lt;br /&gt;
&lt;br /&gt;
[[File:Pluginmodelfactory1.png|320px]]&lt;br /&gt;
&lt;br /&gt;
Click on next. Select your plug-in project and chose a file name and a general name. We often use &amp;quot;defaultmodelfactory.xml&amp;quot; and &amp;quot;my.domain.model.factory&amp;quot; for the filename/name but every other name is okay too. You don't need to set the class name yet because we haven't implemented one. Click on finish.&lt;br /&gt;
&lt;br /&gt;
[[File:Pluginmodelfactory2.png|320px]]&lt;br /&gt;
&lt;br /&gt;
The next things we will need is:&lt;br /&gt;
*A Model&lt;br /&gt;
*A ModelFactory (which is just a class which implements IModelFactory&lt;br /&gt;
Notice that your model factory and your model class must be implemented in different classes. It will not work if you try to implement IModelFactory in one of your models. The good news is, you only need one model factory for all your custom models. For our tutorial, we will use a custom subclass of MOrder. Create the class MOrder_New which inherits from MOrder and implement the default constructors:&lt;br /&gt;
&lt;br /&gt;
[[File:Pluginmodelfactory3.png|320px]]&lt;br /&gt;
&lt;br /&gt;
The second class only implements IModelFactory and is called MyModelFactory. In getClass() we check if the table name is equal to our custom models table name and return the model class if it is. In the both getPO() methods, we use our custom models constructors to create new instances.&lt;br /&gt;
&lt;br /&gt;
[[File:Pluginmodelfactory4.png|320px]]&lt;br /&gt;
&lt;br /&gt;
Open the mymodelfactory.xml and click on the Browse button to select the MyModelFactory class. Also add a integer property called &amp;quot;service.ranking&amp;quot; with a positive value (&amp;gt;0).&lt;br /&gt;
&lt;br /&gt;
[[File:Pluginmodelfactory5.png|320px]]&lt;br /&gt;
&lt;br /&gt;
On the Services tab, add the IModelFactory to the &amp;quot;Provided Services&amp;quot; section.&lt;br /&gt;
&lt;br /&gt;
[[File:Pluginmodelfactory6.png|320px]]&lt;br /&gt;
&lt;br /&gt;
Basically thats all you need to do. To see that we realy did someting, open your custom model class again and add a console log in beforeSave()&lt;br /&gt;
&lt;br /&gt;
[[File:Pluginmodelfactory7.png|320px]]&lt;br /&gt;
&lt;br /&gt;
Make sure that your plug-in is active in the run configurations&lt;br /&gt;
&lt;br /&gt;
[[File:Pluginmodelfactory8.png|320px]]&lt;br /&gt;
&lt;br /&gt;
Start the client and make sure your plug-in is active&lt;br /&gt;
&lt;br /&gt;
[[File:Pluginmodelfactory9.png|320px]]&lt;br /&gt;
&lt;br /&gt;
Now log in as GardenAdmin/GardenWorld and create a new Sales Order fill in all mandatory fields and click on save. Take a look at your console log, you should see the log from your custom model class:&lt;br /&gt;
&lt;br /&gt;
[[File:Pluginmodelfactory10.png|320px]]&lt;br /&gt;
&lt;br /&gt;
==AbstractModelFactory==&lt;br /&gt;
It is encouraged that new model factories extend from [https://github.com/idempiere/idempiere/blob/master/org.adempiere.base/src/org/adempiere/base/AbstractModelFactory.java AbstractModelFactory] as as it takes care of most of the common tasks assigned to  model factories.&lt;br /&gt;
&lt;br /&gt;
Please note that this class was added to the iDempiere 9 codebase.&lt;br /&gt;
&lt;br /&gt;
==AnnotationBasedModelFactory==&lt;br /&gt;
This is the new default model factory that can be used/extended from iDempiere plugins. It detects model classes automatically as long as they have the @Model annotation. Model classes with M prefix don't have to be annotated, as long as their X classes (discussed above) are annotated. The default model generator (discussed below) was also modified in order to annotate X classes automatically.&lt;br /&gt;
&lt;br /&gt;
[[File:Annotated Model Factory.png|561px|Sample AnnotationBasedModelFactory implementation]]&lt;br /&gt;
&lt;br /&gt;
This code snippet shows how to implement a model factory on a plugin by extending AnnotationBasedModelFactory. Implementing classes are encouraged to indicate what are the packages where they model classes are located, by overriding the ''getPackages'' method.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/idempiere/idempiere/blob/master/org.adempiere.base/src/org/adempiere/base/AnnotationBasedModelFactory.java AnnotationBasedModelFactory] was added as part of the iDempiere 9 codebase.&lt;br /&gt;
&lt;br /&gt;
==Generating Models for custom Tables==&lt;br /&gt;
If you don't just want to overwrite a core model but provide your own model classes you need to do some steps. &lt;br /&gt;
# Create your table in the database&lt;br /&gt;
# Create an entry for your table in the Table and Column window&lt;br /&gt;
# Open Eclipse and start the generate.model App&lt;br /&gt;
# As the Source Folder, choose the &amp;quot;src&amp;quot; folder of your Plug-in&lt;br /&gt;
# As the Package Name chose a package name of your choice or use org.compiere.model if you like&lt;br /&gt;
# As the Table Name chose your prefix (custom tables should have 3 letter prefix in the db) and add some characters to identify your table. For example, if your table is called eve_this_is_a_table, then you could enter &amp;quot;eve_this%&amp;quot;. Make sure you use the correct upper/lower case writing!&lt;br /&gt;
# As the entity type, chose the entity type you selected in the DB. Normaly it's &amp;quot;U&amp;quot; for user maintained&lt;br /&gt;
# Check both checkboxed and generate your I_ and X_ class&lt;br /&gt;
# Feel free to implement a custom M class&lt;br /&gt;
&lt;br /&gt;
=Troubleshooting=&lt;br /&gt;
*Make sure that in your modelfactory.xml you have a unique name (my.domainname.pluginname.model.factory is a good idea) and that you selected the right class&lt;br /&gt;
*Make sure there is no other model factory with a higher service.ranking property&lt;br /&gt;
*Make sure you have a seperate model/model factory class&lt;br /&gt;
*Make sure your plug-in is activated before you log in &lt;br /&gt;
*Make sure your MANIFEST.MF contains a row with &amp;quot;Service-Component: &amp;quot; and the path to your modelfactory.xml (e. g. &amp;quot;Service-Component: mymodelfactory.xml&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[ja:IModelFactoryのプラグイン開発]]&lt;/div&gt;</summary>
		<author><name>Sjg</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=File:Annotated_Model_Factory.png&amp;diff=19290</id>
		<title>File:Annotated Model Factory.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=File:Annotated_Model_Factory.png&amp;diff=19290"/>
		<updated>2021-09-23T03:30:44Z</updated>

		<summary type="html">&lt;p&gt;Sjg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sample implementation of AnnotationBasedModelFactory from an iDempiere plugin.&lt;/div&gt;</summary>
		<author><name>Sjg</name></author>
	</entry>
	<entry>
		<id>https://wiki.idempiere.org/w-en/index.php?title=Setting_up_Eclipse&amp;diff=19031</id>
		<title>Setting up Eclipse</title>
		<link rel="alternate" type="text/html" href="https://wiki.idempiere.org/w-en/index.php?title=Setting_up_Eclipse&amp;diff=19031"/>
		<updated>2021-06-10T19:21:32Z</updated>

		<summary type="html">&lt;p&gt;Sjg: Updated Eclipse setup for iDempiere 8.2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- breadcrumb --&amp;gt;&lt;br /&gt;
&amp;lt;font size=-2&amp;gt;&lt;br /&gt;
&amp;amp;lArr;&lt;br /&gt;
[[Installing_iDempiere|Table of Contents]] |&lt;br /&gt;
[[Download the Code]] |&lt;br /&gt;
Setting up Eclipse |&lt;br /&gt;
[[Importing DB Seed Manually]]&lt;br /&gt;
&amp;amp;rArr;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Materialize and build ==&lt;br /&gt;
&lt;br /&gt;
On the operating system navigate to the folder where you cloned the code, named below as $IDEMPIERE_REPOSITORY (f.e. /home/carlos/sources/idempiere), and run the next command:&lt;br /&gt;
 cd $HOME/sources/idempiere&lt;br /&gt;
 mvn verify&lt;br /&gt;
This command download all libraries on Bundle-ClassPath, build all projects and output binaries to org.idempiere.p2/target/products. If not, verify with mvn -version that maven is using the correct java-version.&lt;br /&gt;
&lt;br /&gt;
== Setup workspace in Eclipse ==&lt;br /&gt;
&lt;br /&gt;
* Open again the eclipse you configured with the workspace pointing to the folder where you cloned the code&lt;br /&gt;
** Following the example here this folder would be $HOME/sources/idempiere&lt;br /&gt;
* Turn off Project &amp;gt; Build automatically&lt;br /&gt;
* Navigate to Window &amp;gt; Preferences &amp;gt; General &amp;gt; Workspace&lt;br /&gt;
** set &amp;quot;Text file encoding&amp;quot; to &amp;quot;UTF-8&amp;quot; (if default is different)&lt;br /&gt;
** set &amp;quot;New text file line delimiter&amp;quot; to &amp;quot;Unix&amp;quot; (if default is different)&lt;br /&gt;
* Navigate to Window &amp;gt; Preferences &amp;gt; Java &amp;gt; Compiler&lt;br /&gt;
** set Java &amp;gt; Compiler &amp;gt; Compiler compliance level to &amp;quot;11&amp;quot;&lt;br /&gt;
* in Java &amp;gt; Installed JREs add the  java-11-openjdk JRE if not present and select it as the active JRE:&lt;br /&gt;
** click the Add button, then&lt;br /&gt;
** select Standard VM, click next&lt;br /&gt;
** enter &amp;quot;/usr/lib/jvm/java-11-openjdk-amd64&amp;quot; as JRE Home, click finish&lt;br /&gt;
** click the Checkbox next to the new entry to apply the changes.&lt;br /&gt;
* Not required, is a personal preference, but normally I switch here to Java perspective and choose to Working Sets as the Top Level Elements&lt;br /&gt;
&lt;br /&gt;
== Import projects in Eclipse ==&lt;br /&gt;
&lt;br /&gt;
* Navigate to File &amp;gt; Import&lt;br /&gt;
* Navigate to Maven &amp;gt; Existing Maven Projects&lt;br /&gt;
* Click Next button and Browse to $IDEMPIERE_REPOSITORY (must appear there by default)&lt;br /&gt;
** Following the example here this folder would be $HOME/sources/idempiere&lt;br /&gt;
* All projects must appear selected, click Finish to complete the import&lt;br /&gt;
** At the end all projects are loaded into workspace&lt;br /&gt;
* Sometimes eclipse creates changes to the workspace, you can discard those changes at this point via right click on the projects and choosing Replace With &amp;gt; HEAD Revision&lt;br /&gt;
&lt;br /&gt;
== (just for 8.2) Import target platform ==&lt;br /&gt;
&lt;br /&gt;
These steps are required if you work on 8.2, but not required with the current master branch (a.k.a. 8.2.z)&lt;br /&gt;
* Still in eclipse&lt;br /&gt;
* Navigate to File &amp;gt; Import&lt;br /&gt;
* Navigate to General &amp;gt; Existing Projects into Workspace&lt;br /&gt;
* Click Next button and Browse to $IDEMPIERE_REPOSITORY/org.idempiere.p2.targetplatform&lt;br /&gt;
* Click Finish to complete the import&lt;br /&gt;
&lt;br /&gt;
== Set target platform ==&lt;br /&gt;
&lt;br /&gt;
* Now open the file org.idempiere.p2.targetplatform.target within the project org.idempiere.p2.targetplatform&lt;br /&gt;
** This is the default target platform definition with remote url&lt;br /&gt;
** Here eclipse takes some time downloading the required dependencies, you can prepare some Colombian coffee and wait patiently  :)&lt;br /&gt;
* At Target Editor, click the &amp;quot;Set as Active Target Platform&amp;quot; link&lt;br /&gt;
* Wait for Eclipse to finish downloading bundles onto target platform&lt;br /&gt;
** Click the &amp;quot;Reload&amp;quot; button if some download fail, until there are not red errors on the Locations list&lt;br /&gt;
&lt;br /&gt;
* At the end you can enabled back Project &amp;gt; Build automatically&lt;br /&gt;
* In case there are files with compilation errors you can right click on the iDempiere project and select Maven &amp;gt; Update Projects, then press OK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''This tutorial is brought to you by [[User:CarlosRuiz|Carlos Ruiz]] from [https://www.bx-service.com/ BX Service GmbH].  Feel free to improve directly or suggest using the Discussion tab.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:User Manual|I]]&lt;br /&gt;
[[Category:Installation|E]] &lt;br /&gt;
[[Category:Installation Eclipse]] &lt;br /&gt;
[[Category:Development‏‎]]&lt;br /&gt;
[[Category:Developer documentation‏‎]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- breadcrumb --&amp;gt;&lt;br /&gt;
&amp;lt;font size=-2&amp;gt;&lt;br /&gt;
&amp;amp;lArr;&lt;br /&gt;
[[Installing_iDempiere|Table of Contents]] |&lt;br /&gt;
[[Download the Code]] |&lt;br /&gt;
Setting up Eclipse |&lt;br /&gt;
[[Importing DB Seed Manually]]&lt;br /&gt;
&amp;amp;rArr;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sjg</name></author>
	</entry>
</feed>