From f50425334f14abf831f76759890c37e0c45d0598 Mon Sep 17 00:00:00 2001 From: Diego Ruiz <12065321+d-ruiz@users.noreply.github.com> Date: Wed, 24 Jun 2020 16:43:11 +0200 Subject: [PATCH] IDEMPIERE-1026 Button on table to create automatically the window (#128) * IDEMPIERE-1026 Button on table to create automatically the window * IDEMPIERE-1026 Button on table to create automatically the window - Fixed script * IDEMPIERE-1026 Button on table to create automatically the window - Header update * IDEMPIERE-1026 Button on table to create automatically the window - Follow best practices, no hardcoded IDs, no mixed cache and transaction * IDEMPIERE-1026 Button on table to create automatically the window - Carlos PR --- .../oracle/202006191355_IDEMPIERE-1026.sql | 94 +++++++ .../202006191355_IDEMPIERE-1026.sql | 91 ++++++ .../process/CreateWindowFromTable.java | 263 ++++++++++++++++++ .../org/compiere/process/TabCreateFields.java | 1 + .../src/org/compiere/model/SystemIDs.java | 9 + 5 files changed, 458 insertions(+) create mode 100644 migration/i7.1z/oracle/202006191355_IDEMPIERE-1026.sql create mode 100644 migration/i7.1z/postgresql/202006191355_IDEMPIERE-1026.sql create mode 100644 org.adempiere.base.process/src/org/compiere/process/CreateWindowFromTable.java diff --git a/migration/i7.1z/oracle/202006191355_IDEMPIERE-1026.sql b/migration/i7.1z/oracle/202006191355_IDEMPIERE-1026.sql new file mode 100644 index 0000000000..4274a79fa0 --- /dev/null +++ b/migration/i7.1z/oracle/202006191355_IDEMPIERE-1026.sql @@ -0,0 +1,94 @@ +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- IDEMPIERE-1026 Button on table to create automatically the window +-- Jun 19, 2020, 10:31:17 AM CEST +INSERT INTO AD_Process (AD_Process_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,Help,IsReport,Value,IsDirectPrint,Classname,AccessLevel,EntityType,Statistic_Count,Statistic_Seconds,IsBetaFunctionality,IsServerProcess,ShowHelp,CopyFromProcess,AD_Process_UU,AllowMultipleExecution) VALUES (200118,0,0,'Y',TO_DATE('2020-06-19 10:31:16','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2020-06-19 10:31:16','YYYY-MM-DD HH24:MI:SS'),100,'Create Window, Tab & Field from Table','Create Window, Tab & Field record of the Table','This process will take the table definition and create the Window/Tab and field record with these options:
+ +New Window: if selected the process will create a new Window record. Otherwise, the process will create a new tab and add it to the selected window.
+Create Menu: if selected the process creates the menu record for the new window.','N','AD_Table_CreateWindow','N','org.compiere.process.CreateWindowFromTable','4','D',0,0,'N','N','Y','N','b1753358-c7dd-4387-ab99-355d081a5de2','P') +; + +-- Jun 19, 2020, 10:35:37 AM CEST +INSERT INTO AD_Element (AD_Element_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,ColumnName,Name,Description,PrintName,EntityType,AD_Element_UU) VALUES (203419,0,0,'Y',TO_DATE('2020-06-19 10:35:36','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2020-06-19 10:35:36','YYYY-MM-DD HH24:MI:SS'),100,'IsNewWindow','New Window','Defines if it creates a new window record or creates a new tab on an existing window','New Window','D','27a201ff-ce4c-4c82-a218-201e84c621cd') +; + +-- Jun 19, 2020, 10:36:10 AM CEST +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,AD_Process_ID,SeqNo,AD_Reference_ID,IsRange,FieldLength,IsMandatory,DefaultValue,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,AD_Process_Para_UU,IsEncrypted,IsAutocomplete) VALUES (200294,0,0,'Y',TO_DATE('2020-06-19 10:36:10','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2020-06-19 10:36:10','YYYY-MM-DD HH24:MI:SS'),100,'New Window','Defines if it creates a new window record or creates a new tab on an existing window',200118,10,20,'N',0,'N','Y','IsNewWindow','Y','D',203419,'64bce238-182c-4322-81dc-6f2d1eebabea','N','N') +; + +-- Jun 19, 2020, 10:39:08 AM CEST +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,Help,AD_Process_ID,SeqNo,AD_Reference_ID,AD_Reference_Value_ID,IsRange,FieldLength,IsMandatory,DefaultValue,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,ReadOnlyLogic,DisplayLogic,AD_Process_Para_UU,IsEncrypted,MandatoryLogic,IsAutocomplete) VALUES (200295,0,0,'Y',TO_DATE('2020-06-19 10:39:07','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2020-06-19 10:39:07','YYYY-MM-DD HH24:MI:SS'),100,'WindowType','Type or classification of a Window','The Window Type indicates the type of window being defined (Maintain, Transaction or Query)',200118,20,17,108,'N',0,'N','M','WindowType','Y','D',631,NULL,'@IsNewWindow@=''Y''','3ed90248-006a-4679-80a4-d8868f9787f2','N','@IsNewWindow@=''Y''','N') +; + +-- Jun 19, 2020, 10:40:38 AM CEST +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,Help,AD_Process_ID,SeqNo,AD_Reference_ID,IsRange,FieldLength,IsMandatory,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,DisplayLogic,AD_Process_Para_UU,IsEncrypted,IsAutocomplete) VALUES (200296,0,0,'Y',TO_DATE('2020-06-19 10:40:37','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2020-06-19 10:40:37','YYYY-MM-DD HH24:MI:SS'),100,'Sales Transaction','This is a Sales Transaction','The Sales Transaction checkbox indicates if this item is a Sales Transaction.',200118,30,20,'N',1,'N','IsSOTrx','Y','D',1106,'@IsNewWindow@=''Y''','6f0465a6-25c0-44ca-a7c9-7f4f775e8528','N','N') +; + +-- Jun 19, 2020, 10:40:44 AM CEST +UPDATE AD_Process_Para SET FieldLength=1,Updated=TO_DATE('2020-06-19 10:40:44','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_Para_ID=200295 +; + +-- Jun 19, 2020, 10:40:52 AM CEST +UPDATE AD_Process_Para SET FieldLength=1,Updated=TO_DATE('2020-06-19 10:40:52','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_Para_ID=200294 +; + +-- Jun 19, 2020, 10:42:38 AM CEST +INSERT INTO AD_Element (AD_Element_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,ColumnName,Name,Description,PrintName,EntityType,AD_Element_UU) VALUES (203420,0,0,'Y',TO_DATE('2020-06-19 10:42:37','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2020-06-19 10:42:37','YYYY-MM-DD HH24:MI:SS'),100,'IsCreateMenu','Create Menu','Defines if it creates a new menu record for the new window','Create Menu','D','2f32e14c-2f68-410e-bf59-100686864549') +; + +-- Jun 19, 2020, 10:43:12 AM CEST +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,AD_Process_ID,SeqNo,AD_Reference_ID,IsRange,FieldLength,IsMandatory,DefaultValue,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,DisplayLogic,AD_Process_Para_UU,IsEncrypted,IsAutocomplete) VALUES (200297,0,0,'Y',TO_DATE('2020-06-19 10:43:11','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2020-06-19 10:43:11','YYYY-MM-DD HH24:MI:SS'),100,'Create Menu','Defines if it creates a new menu record for the new window',200118,40,20,'N',1,'N','N','IsCreateMenu','Y','D',203420,'@IsNewWindow@=''Y''','b69cca27-9d64-4ead-83ca-3b01cb3e0e65','N','N') +; + +-- Jun 19, 2020, 10:44:27 AM CEST +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,Help,AD_Process_ID,SeqNo,AD_Reference_ID,IsRange,FieldLength,IsMandatory,DefaultValue,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,DisplayLogic,AD_Process_Para_UU,IsEncrypted,MandatoryLogic,IsAutocomplete) VALUES (200298,0,0,'Y',TO_DATE('2020-06-19 10:44:26','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2020-06-19 10:44:26','YYYY-MM-DD HH24:MI:SS'),100,'Window','Data entry or display window','The Window field identifies a unique Window in the system.',200118,50,19,'N',22,'N',NULL,'AD_Window_ID','Y','D',143,'@IsNewWindow@=''N''','555f1f56-c2d6-412f-9d81-bdb8ea7f0a70','N','@IsNewWindow@=''N''','N') +; + +-- Jun 19, 2020, 10:45:31 AM CEST +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,Help,AD_Process_ID,SeqNo,AD_Reference_ID,IsRange,FieldLength,IsMandatory,ValueMin,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,DisplayLogic,AD_Process_Para_UU,IsEncrypted,MandatoryLogic,IsAutocomplete) VALUES (200299,0,0,'Y',TO_DATE('2020-06-19 10:45:30','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2020-06-19 10:45:30','YYYY-MM-DD HH24:MI:SS'),100,'Tab Level','Hierarchical Tab Level (0 = top)','Hierarchical level of the tab. If the level is 0, it is the top entity. Level 1 entries are dependent on level 0, etc.',200118,60,11,'N',22,'N','0','TabLevel','Y','D',1725,'@IsNewWindow@=''N''','a618adee-33fd-4b4d-9c8d-746e265da407','N','@IsNewWindow@=''N''','N') +; + +-- Jun 19, 2020, 10:48:38 AM CEST +INSERT INTO AD_Element (AD_Element_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,ColumnName,Name,PrintName,EntityType,AD_Element_UU) VALUES (203422,0,0,'Y',TO_DATE('2020-06-19 10:48:38','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2020-06-19 10:48:38','YYYY-MM-DD HH24:MI:SS'),100,'CreateWindowFromTable','Create Window From Table','Create Window From Table','D','486d22a4-faaa-4d2e-ba7a-0ba49c40c06b') +; + +-- Jun 19, 2020, 10:49:02 AM CEST +INSERT INTO AD_Column (AD_Column_ID,Version,Name,AD_Table_ID,ColumnName,FieldLength,IsKey,IsParent,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsEncrypted,AD_Reference_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Element_ID,IsUpdateable,AD_Process_ID,IsSelectionColumn,EntityType,IsSyncDatabase,IsAlwaysUpdateable,IsAutocomplete,IsAllowLogging,AD_Column_UU,IsAllowCopy,IsToolbarButton,IsSecure,IsHtml) VALUES (214207,1,'Create Window From Table',100,'CreateWindowFromTable',1,'N','N','N','N','N',0,'N',28,0,0,'Y',TO_DATE('2020-06-19 10:49:01','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2020-06-19 10:49:01','YYYY-MM-DD HH24:MI:SS'),100,203422,'Y',200118,'N','D','N','N','N','Y','a68ccf9f-3997-4dab-a7d2-65a17f64d00c','Y','Y','N','N') +; + +-- Jun 19, 2020, 10:49:07 AM CEST +ALTER TABLE AD_Table ADD CreateWindowFromTable CHAR(1) DEFAULT NULL +; + +-- Jun 19, 2020, 10:51:02 AM CEST +INSERT INTO AD_Field (AD_Field_ID,Name,AD_Tab_ID,AD_Column_ID,IsDisplayed,DisplayLength,SeqNo,IsSameLine,IsHeading,IsFieldOnly,IsEncrypted,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,IsReadOnly,IsCentrallyMaintained,EntityType,AD_Field_UU,IsDisplayedGrid,SeqNoGrid,XPosition,ColumnSpan,NumLines,IsQuickEntry,IsDefaultFocus,IsAdvancedField,IsQuickForm) VALUES (206414,'Create Window From Table',100,214207,'Y',1,230,'N','N','N','N',0,0,'Y',TO_DATE('2020-06-19 10:51:00','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2020-06-19 10:51:00','YYYY-MM-DD HH24:MI:SS'),100,'N','Y','D','083abcc3-842b-498d-a228-514d9d458136','Y',160,2,2,1,'N','N','N','N') +; + +-- Jun 19, 2020, 11:09:59 AM CEST +INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('E','The table is not valid to create a new window, please verify that it has these columns: AD_Client_ID, AD_Org_ID, Created, CreatedBy, IsActive, Updated, UpdatedBy.',0,0,'Y',TO_DATE('2020-06-19 11:09:57','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2020-06-19 11:09:57','YYYY-MM-DD HH24:MI:SS'),100,200615,'NewWindowNoValid','D','2bc73265-448f-4102-95f8-da94484e286f') +; + +-- Jun 19, 2020, 11:49:59 AM CEST +INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('E','Transaction windows require to have a Processed column. Please create the column and try again.',0,0,'Y',TO_DATE('2020-06-19 11:49:59','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2020-06-19 11:49:59','YYYY-MM-DD HH24:MI:SS'),100,200616,'TrxWindowMandatoryProcessed','D','eb358a84-5395-4ee8-9ad6-5c532a2dd6a8') +; + +-- Jun 22, 2020, 2:23:37 PM CEST +UPDATE AD_Process_Para SET DefaultValue=NULL,Updated=TO_DATE('2020-06-22 14:23:37','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_Para_ID=200076 +; + +-- Jun 24, 2020, 1:25:07 PM CEST +INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('E','There is already a window with the name {0}',0,0,'Y',TO_DATE('2020-06-24 13:25:07','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2020-06-24 13:25:07','YYYY-MM-DD HH24:MI:SS'),100,200617,'DuplicatedWindowName','D','12dbf77d-06a0-4300-92e0-ce0c2f1cdedb') +; + +-- Jun 24, 2020, 1:30:43 PM CEST +INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('E','No column is defined as Parent Link, therefore, the table cannot be a detail tab.',0,0,'Y',TO_DATE('2020-06-24 13:30:42','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2020-06-24 13:30:42','YYYY-MM-DD HH24:MI:SS'),100,200618,'NoParentLink','D','5383b8b1-9434-4148-8ce0-7c901f9e5507') +; + +-- Jun 24, 2020, 1:40:00 PM CEST +INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('E','The maximum tab level for this window can be {0}.',0,0,'Y',TO_DATE('2020-06-24 13:40:00','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2020-06-24 13:40:00','YYYY-MM-DD HH24:MI:SS'),100,200619,'MaxTabLevel','D','5ceed3b5-080a-4eab-b408-7f4eb2744624') +; + +SELECT register_migration_script('202006191355_IDEMPIERE-1026.sql') FROM dual +; + diff --git a/migration/i7.1z/postgresql/202006191355_IDEMPIERE-1026.sql b/migration/i7.1z/postgresql/202006191355_IDEMPIERE-1026.sql new file mode 100644 index 0000000000..77b7fa8c5c --- /dev/null +++ b/migration/i7.1z/postgresql/202006191355_IDEMPIERE-1026.sql @@ -0,0 +1,91 @@ +-- IDEMPIERE-1026 Button on table to create automatically the window +-- Jun 19, 2020, 10:31:17 AM CEST +INSERT INTO AD_Process (AD_Process_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,Help,IsReport,Value,IsDirectPrint,Classname,AccessLevel,EntityType,Statistic_Count,Statistic_Seconds,IsBetaFunctionality,IsServerProcess,ShowHelp,CopyFromProcess,AD_Process_UU,AllowMultipleExecution) VALUES (200118,0,0,'Y',TO_TIMESTAMP('2020-06-19 10:31:16','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2020-06-19 10:31:16','YYYY-MM-DD HH24:MI:SS'),100,'Create Window, Tab & Field from Table','Create Window, Tab & Field record of the Table','This process will take the table definition and create the Window/Tab and field record with these options:
+ +New Window: if selected the process will create a new Window record. Otherwise, the process will create a new tab and add it to the selected window.
+Create Menu: if selected the process creates the menu record for the new window.','N','AD_Table_CreateWindow','N','org.compiere.process.CreateWindowFromTable','4','D',0,0,'N','N','Y','N','b1753358-c7dd-4387-ab99-355d081a5de2','P') +; + +-- Jun 19, 2020, 10:35:37 AM CEST +INSERT INTO AD_Element (AD_Element_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,ColumnName,Name,Description,PrintName,EntityType,AD_Element_UU) VALUES (203419,0,0,'Y',TO_TIMESTAMP('2020-06-19 10:35:36','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2020-06-19 10:35:36','YYYY-MM-DD HH24:MI:SS'),100,'IsNewWindow','New Window','Defines if it creates a new window record or creates a new tab on an existing window','New Window','D','27a201ff-ce4c-4c82-a218-201e84c621cd') +; + +-- Jun 19, 2020, 10:36:10 AM CEST +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,AD_Process_ID,SeqNo,AD_Reference_ID,IsRange,FieldLength,IsMandatory,DefaultValue,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,AD_Process_Para_UU,IsEncrypted,IsAutocomplete) VALUES (200294,0,0,'Y',TO_TIMESTAMP('2020-06-19 10:36:10','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2020-06-19 10:36:10','YYYY-MM-DD HH24:MI:SS'),100,'New Window','Defines if it creates a new window record or creates a new tab on an existing window',200118,10,20,'N',0,'N','Y','IsNewWindow','Y','D',203419,'64bce238-182c-4322-81dc-6f2d1eebabea','N','N') +; + +-- Jun 19, 2020, 10:39:08 AM CEST +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,Help,AD_Process_ID,SeqNo,AD_Reference_ID,AD_Reference_Value_ID,IsRange,FieldLength,IsMandatory,DefaultValue,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,ReadOnlyLogic,DisplayLogic,AD_Process_Para_UU,IsEncrypted,MandatoryLogic,IsAutocomplete) VALUES (200295,0,0,'Y',TO_TIMESTAMP('2020-06-19 10:39:07','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2020-06-19 10:39:07','YYYY-MM-DD HH24:MI:SS'),100,'WindowType','Type or classification of a Window','The Window Type indicates the type of window being defined (Maintain, Transaction or Query)',200118,20,17,108,'N',0,'N','M','WindowType','Y','D',631,NULL,'@IsNewWindow@=''Y''','3ed90248-006a-4679-80a4-d8868f9787f2','N','@IsNewWindow@=''Y''','N') +; + +-- Jun 19, 2020, 10:40:38 AM CEST +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,Help,AD_Process_ID,SeqNo,AD_Reference_ID,IsRange,FieldLength,IsMandatory,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,DisplayLogic,AD_Process_Para_UU,IsEncrypted,IsAutocomplete) VALUES (200296,0,0,'Y',TO_TIMESTAMP('2020-06-19 10:40:37','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2020-06-19 10:40:37','YYYY-MM-DD HH24:MI:SS'),100,'Sales Transaction','This is a Sales Transaction','The Sales Transaction checkbox indicates if this item is a Sales Transaction.',200118,30,20,'N',1,'N','IsSOTrx','Y','D',1106,'@IsNewWindow@=''Y''','6f0465a6-25c0-44ca-a7c9-7f4f775e8528','N','N') +; + +-- Jun 19, 2020, 10:40:44 AM CEST +UPDATE AD_Process_Para SET FieldLength=1,Updated=TO_TIMESTAMP('2020-06-19 10:40:44','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_Para_ID=200295 +; + +-- Jun 19, 2020, 10:40:52 AM CEST +UPDATE AD_Process_Para SET FieldLength=1,Updated=TO_TIMESTAMP('2020-06-19 10:40:52','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_Para_ID=200294 +; + +-- Jun 19, 2020, 10:42:38 AM CEST +INSERT INTO AD_Element (AD_Element_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,ColumnName,Name,Description,PrintName,EntityType,AD_Element_UU) VALUES (203420,0,0,'Y',TO_TIMESTAMP('2020-06-19 10:42:37','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2020-06-19 10:42:37','YYYY-MM-DD HH24:MI:SS'),100,'IsCreateMenu','Create Menu','Defines if it creates a new menu record for the new window','Create Menu','D','2f32e14c-2f68-410e-bf59-100686864549') +; + +-- Jun 19, 2020, 10:43:12 AM CEST +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,AD_Process_ID,SeqNo,AD_Reference_ID,IsRange,FieldLength,IsMandatory,DefaultValue,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,DisplayLogic,AD_Process_Para_UU,IsEncrypted,IsAutocomplete) VALUES (200297,0,0,'Y',TO_TIMESTAMP('2020-06-19 10:43:11','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2020-06-19 10:43:11','YYYY-MM-DD HH24:MI:SS'),100,'Create Menu','Defines if it creates a new menu record for the new window',200118,40,20,'N',1,'N','N','IsCreateMenu','Y','D',203420,'@IsNewWindow@=''Y''','b69cca27-9d64-4ead-83ca-3b01cb3e0e65','N','N') +; + +-- Jun 19, 2020, 10:44:27 AM CEST +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,Help,AD_Process_ID,SeqNo,AD_Reference_ID,IsRange,FieldLength,IsMandatory,DefaultValue,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,DisplayLogic,AD_Process_Para_UU,IsEncrypted,MandatoryLogic,IsAutocomplete) VALUES (200298,0,0,'Y',TO_TIMESTAMP('2020-06-19 10:44:26','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2020-06-19 10:44:26','YYYY-MM-DD HH24:MI:SS'),100,'Window','Data entry or display window','The Window field identifies a unique Window in the system.',200118,50,19,'N',22,'N',NULL,'AD_Window_ID','Y','D',143,'@IsNewWindow@=''N''','555f1f56-c2d6-412f-9d81-bdb8ea7f0a70','N','@IsNewWindow@=''N''','N') +; + +-- Jun 19, 2020, 10:45:31 AM CEST +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,Help,AD_Process_ID,SeqNo,AD_Reference_ID,IsRange,FieldLength,IsMandatory,ValueMin,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,DisplayLogic,AD_Process_Para_UU,IsEncrypted,MandatoryLogic,IsAutocomplete) VALUES (200299,0,0,'Y',TO_TIMESTAMP('2020-06-19 10:45:30','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2020-06-19 10:45:30','YYYY-MM-DD HH24:MI:SS'),100,'Tab Level','Hierarchical Tab Level (0 = top)','Hierarchical level of the tab. If the level is 0, it is the top entity. Level 1 entries are dependent on level 0, etc.',200118,60,11,'N',22,'N','0','TabLevel','Y','D',1725,'@IsNewWindow@=''N''','a618adee-33fd-4b4d-9c8d-746e265da407','N','@IsNewWindow@=''N''','N') +; + +-- Jun 19, 2020, 10:48:38 AM CEST +INSERT INTO AD_Element (AD_Element_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,ColumnName,Name,PrintName,EntityType,AD_Element_UU) VALUES (203422,0,0,'Y',TO_TIMESTAMP('2020-06-19 10:48:38','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2020-06-19 10:48:38','YYYY-MM-DD HH24:MI:SS'),100,'CreateWindowFromTable','Create Window From Table','Create Window From Table','D','486d22a4-faaa-4d2e-ba7a-0ba49c40c06b') +; + +-- Jun 19, 2020, 10:49:02 AM CEST +INSERT INTO AD_Column (AD_Column_ID,Version,Name,AD_Table_ID,ColumnName,FieldLength,IsKey,IsParent,IsMandatory,IsTranslated,IsIdentifier,SeqNo,IsEncrypted,AD_Reference_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Element_ID,IsUpdateable,AD_Process_ID,IsSelectionColumn,EntityType,IsSyncDatabase,IsAlwaysUpdateable,IsAutocomplete,IsAllowLogging,AD_Column_UU,IsAllowCopy,IsToolbarButton,IsSecure,IsHtml) VALUES (214207,1,'Create Window From Table',100,'CreateWindowFromTable',1,'N','N','N','N','N',0,'N',28,0,0,'Y',TO_TIMESTAMP('2020-06-19 10:49:01','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2020-06-19 10:49:01','YYYY-MM-DD HH24:MI:SS'),100,203422,'Y',200118,'N','D','N','N','N','Y','a68ccf9f-3997-4dab-a7d2-65a17f64d00c','Y','Y','N','N') +; + +-- Jun 19, 2020, 10:49:07 AM CEST +ALTER TABLE AD_Table ADD COLUMN CreateWindowFromTable CHAR(1) DEFAULT NULL +; + +-- Jun 19, 2020, 10:51:02 AM CEST +INSERT INTO AD_Field (AD_Field_ID,Name,AD_Tab_ID,AD_Column_ID,IsDisplayed,DisplayLength,SeqNo,IsSameLine,IsHeading,IsFieldOnly,IsEncrypted,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,IsReadOnly,IsCentrallyMaintained,EntityType,AD_Field_UU,IsDisplayedGrid,SeqNoGrid,XPosition,ColumnSpan,NumLines,IsQuickEntry,IsDefaultFocus,IsAdvancedField,IsQuickForm) VALUES (206414,'Create Window From Table',100,214207,'Y',1,230,'N','N','N','N',0,0,'Y',TO_TIMESTAMP('2020-06-19 10:51:00','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2020-06-19 10:51:00','YYYY-MM-DD HH24:MI:SS'),100,'N','Y','D','083abcc3-842b-498d-a228-514d9d458136','Y',160,2,2,1,'N','N','N','N') +; + +-- Jun 19, 2020, 11:09:59 AM CEST +INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('E','The table is not valid to create a new window, please verify that it has these columns: AD_Client_ID, AD_Org_ID, Created, CreatedBy, IsActive, Updated, UpdatedBy.',0,0,'Y',TO_TIMESTAMP('2020-06-19 11:09:57','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2020-06-19 11:09:57','YYYY-MM-DD HH24:MI:SS'),100,200615,'NewWindowNoValid','D','2bc73265-448f-4102-95f8-da94484e286f') +; + +-- Jun 19, 2020, 11:49:59 AM CEST +INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('E','Transaction windows require to have a Processed column. Please create the column and try again.',0,0,'Y',TO_TIMESTAMP('2020-06-19 11:49:59','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2020-06-19 11:49:59','YYYY-MM-DD HH24:MI:SS'),100,200616,'TrxWindowMandatoryProcessed','D','eb358a84-5395-4ee8-9ad6-5c532a2dd6a8') +; + +-- Jun 22, 2020, 2:23:37 PM CEST +UPDATE AD_Process_Para SET DefaultValue=NULL,Updated=TO_TIMESTAMP('2020-06-22 14:23:37','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_Para_ID=200076 +; + +-- Jun 24, 2020, 1:25:07 PM CEST +INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('E','There is already a window with the name {0}',0,0,'Y',TO_TIMESTAMP('2020-06-24 13:25:07','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2020-06-24 13:25:07','YYYY-MM-DD HH24:MI:SS'),100,200617,'DuplicatedWindowName','D','12dbf77d-06a0-4300-92e0-ce0c2f1cdedb') +; + +-- Jun 24, 2020, 1:30:43 PM CEST +INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('E','No column is defined as Parent Link, therefore, the table cannot be a detail tab.',0,0,'Y',TO_TIMESTAMP('2020-06-24 13:30:42','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2020-06-24 13:30:42','YYYY-MM-DD HH24:MI:SS'),100,200618,'NoParentLink','D','5383b8b1-9434-4148-8ce0-7c901f9e5507') +; + +-- Jun 24, 2020, 1:40:00 PM CEST +INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('E','The maximum tab level for this window can be {0}.',0,0,'Y',TO_TIMESTAMP('2020-06-24 13:40:00','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2020-06-24 13:40:00','YYYY-MM-DD HH24:MI:SS'),100,200619,'MaxTabLevel','D','5ceed3b5-080a-4eab-b408-7f4eb2744624') +; + +SELECT register_migration_script('202006191355_IDEMPIERE-1026.sql') FROM dual +; + diff --git a/org.adempiere.base.process/src/org/compiere/process/CreateWindowFromTable.java b/org.adempiere.base.process/src/org/compiere/process/CreateWindowFromTable.java new file mode 100644 index 0000000000..47a4ca7e70 --- /dev/null +++ b/org.adempiere.base.process/src/org/compiere/process/CreateWindowFromTable.java @@ -0,0 +1,263 @@ +/********************************************************************** +* This file is part of iDempiere ERP Open Source * +* http://www.idempiere.org * +* * +* Copyright (C) Contributors * +* * +* This program is free software; you can redistribute it and/or * +* modify it under the terms of the GNU General Public License * +* as published by the Free Software Foundation; either version 2 * +* of the License, or (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License for more details. * +* * +* You should have received a copy of the GNU General Public License * +* along with this program; if not, write to the Free Software * +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * +* MA 02110-1301, USA. * +* * +* Contributors: * +* - BX Service GmbH * +* - Diego Ruiz * +**********************************************************************/ +package org.compiere.process; + +import java.util.logging.Level; + +import org.adempiere.exceptions.AdempiereException; +import org.compiere.model.MColumn; +import org.compiere.model.MMenu; +import org.compiere.model.MPInstance; +import org.compiere.model.MTab; +import org.compiere.model.MTable; +import org.compiere.model.MWindow; +import org.compiere.model.SystemIDs; +import org.compiere.util.DB; +import org.compiere.util.Msg; +import org.compiere.util.Trx; + +/** + * Create Menu - Window/tab & field from a table + * + * @author Diego Ruiz - BX Service GmbH + */ +public class CreateWindowFromTable extends SvrProcess +{ + /** Table */ + private int p_AD_Table_ID = 0; + + /** Window Type */ + private String p_WindowType = null; + + /** Sales transaction */ + private boolean p_IsSOTrx = false; + + /** Is a New Window? */ + private boolean p_isNewWindow = false; + + /** AD_Window_ID */ + private int p_AD_Window_ID = 0; + + /** Tab Level */ + private int p_TabLevel = 0; + + /** Create Menu Record */ + private boolean p_isCreateMenu = false; + + /** + * Prepare - e.g., get Parameters. + */ + protected void prepare () + { + ProcessInfoParameter[] para = getParameter(); + for (int i = 0; i < para.length; i++) + { + String name = para[i].getParameterName(); + if (para[i].getParameter() == null) + ; + else if (name.equals("WindowType")) + p_WindowType = para[i].getParameterAsString(); + else if (name.equals("IsSOTrx")) + p_IsSOTrx = para[i].getParameterAsBoolean(); + else if (name.equals("IsNewWindow")) + p_isNewWindow = para[i].getParameterAsBoolean(); + else if (name.equals("AD_Window_ID")) + p_AD_Window_ID = para[i].getParameterAsInt(); + else if (name.equals("TabLevel")) + p_TabLevel = para[i].getParameterAsInt(); + else if (name.equals("IsCreateMenu")) + p_isCreateMenu = para[i].getParameterAsBoolean(); + else + log.log(Level.SEVERE, "Unknown Parameter: " + name); + } + p_AD_Table_ID = getRecord_ID(); + } // prepare + + /** + * Process + * @return info + * @throws Exception + */ + protected String doIt () throws Exception + { + if (p_AD_Table_ID == 0) + throw new AdempiereException("@NotFound@ @AD_Table_ID@ " + p_AD_Table_ID); + if (!p_isNewWindow && p_AD_Window_ID == 0) + throw new AdempiereException("@Mandatory@ @AD_Window_ID@"); + if (log.isLoggable(Level.INFO)) + log.info("Source AD_Table_ID=" + p_AD_Table_ID); + + MTable table = new MTable(getCtx(), p_AD_Table_ID, get_TrxName()); + if (table != null) { + + String entityType = table.getEntityType(); + + if (!isTableValid(table)) + throw new AdempiereException(Msg.getMsg(getCtx(), "NewWindowNoValid")); + + MWindow window; + if (p_isNewWindow) { + if (MWindow.WINDOWTYPE_Transaction.equals(p_WindowType) && + table.getColumnIndex("Processed") <= 0) + throw new AdempiereException(Msg.getMsg(getCtx(), "TrxWindowMandatoryProcessed")); + + int i = DB.getSQLValue(get_TrxName(), "SELECT 1 FROM AD_Window WHERE AD_Window.name = ?", table.getName()); + + if (i == 1) + throw new AdempiereException(Msg.getMsg(getCtx(), "DuplicatedWindowName", new Object[] {table.getName()})); + + window = new MWindow(getCtx(), 0, get_TrxName()); + window.setName(table.getName()); + window.setIsSOTrx(p_IsSOTrx); + window.setWindowType(p_WindowType); + window.setEntityType(entityType); + window.saveEx(); + addLog(window.getAD_Window_ID(), null, null, "@AD_Window_ID@: " + window.getName(), + window.get_Table_ID(), window.getAD_Window_ID()); + } else { + //If no new window but a detail tab + if (p_TabLevel > 0) { + boolean hasParentLinkColumn = false; + for (MColumn column : table.getColumns(false)) { + if (column.isParent()) { + hasParentLinkColumn = true; + break; + } + } + + if (!hasParentLinkColumn) + throw new AdempiereException(Msg.getMsg(getCtx(), "NoParentLink")); + } + window = new MWindow(getCtx(), p_AD_Window_ID, get_TrxName()); + + if (p_TabLevel > 1) { + int maxTabLevel = 0; + for (MTab tab : window.getTabs(false, get_TrxName())) { + if (tab.getTabLevel() > maxTabLevel) { + maxTabLevel = tab.getTabLevel(); + } + } + + if (maxTabLevel+1 < p_TabLevel) + throw new AdempiereException(Msg.getMsg(getCtx(), "MaxTabLevel", new Object[] {maxTabLevel+1})); + } + } + + MTab tab = new MTab(window); + tab.setName(table.getName()); + tab.setAD_Table_ID(p_AD_Table_ID); + tab.setTabLevel(p_TabLevel); + tab.setIsSingleRow(true); //Default + + //Set order by + if (table.getColumnIndex("Value") > 0) + tab.setOrderByClause(table.getTableName() + ".Value"); + else if (table.getColumnIndex("Name") > 0) + tab.setOrderByClause(table.getTableName() + ".Name"); + else + tab.setOrderByClause(table.getTableName() + ".Created DESC"); + + tab.saveEx(); + addLog(tab.getAD_Tab_ID(), null, null, "@AD_Tab_ID@: " + tab.getName(), + tab.get_Table_ID(), tab.getAD_Tab_ID()); + + //Create Fields + ProcessInfo processInfo = new ProcessInfo("", SystemIDs.PROCESS_AD_TAB_CREATEFIELDS, 0, tab.getAD_Tab_ID()); + + MPInstance instance = new MPInstance(getCtx(), SystemIDs.PROCESS_AD_TAB_CREATEFIELDS, 0); + instance.saveEx(); + processInfo.setAD_PInstance_ID(instance.getAD_PInstance_ID()); + + TabCreateFields createFields = new TabCreateFields(); + boolean success = createFields.startProcess(getCtx(), processInfo, Trx.get(get_TrxName(), false)); + if (!success) { + StringBuilder msgout = new StringBuilder("Process=").append(processInfo.getTitle()) + .append(" Called from=").append("CreateWindowFromTable") + .append(" Error=").append(processInfo.isError()) + .append(" Summary=").append(processInfo.getSummary()); + log.severe(msgout.toString()); + throw new AdempiereException(processInfo.getSummary()); + } + + if (p_isCreateMenu) { + MMenu menu = new MMenu(getCtx(), 0, get_TrxName()); + menu.setName(window.getName()); + menu.setEntityType(entityType); + menu.setIsSOTrx(p_IsSOTrx); + menu.setAction(MMenu.ACTION_Window); + menu.setAD_Window_ID(window.getAD_Window_ID()); + menu.saveEx(); + addLog(menu.getAD_Menu_ID(), null, null, "@AD_Menu_ID@: " + menu.getName(), + menu.get_Table_ID(), menu.getAD_Menu_ID()); + } + + //If AD_Window_ID is empty in the Table record + if (table.getAD_Window_ID() <= 0) + table.setAD_Window_ID(window.getAD_Window_ID()); + + table.saveEx(); + } + + return "@OK@"; + } // doIt + + /** + * + * @param table Table to be verifies + * @return true if the table has all recommended columns + */ + public boolean isTableValid(MTable table) { + + boolean hasIsActive = false; + boolean hasAD_Client_ID = false; + boolean hasAD_Org_ID = false; + boolean hasCreated = false; + boolean hasUpdated = false; + boolean hasCreatedBy = false; + boolean hasUpdatedBy = false; + + for (MColumn column : table.getColumns(true)) { + if (column.getAD_Element_ID() == SystemIDs.ELEMENT_AD_CLIENT_ID) + hasAD_Client_ID = true; + else if (column.getAD_Element_ID() == SystemIDs.ELEMENT_AD_ORG_ID) + hasAD_Org_ID = true; + else if (column.getAD_Element_ID() == SystemIDs.ELEMENT_CREATED) + hasCreated = true; + else if (column.getAD_Element_ID() == SystemIDs.ELEMENT_CREATEDBY) + hasCreatedBy = true; + else if (column.getAD_Element_ID() == SystemIDs.ELEMENT_ISACTIVE) + hasIsActive = true; + else if (column.getAD_Element_ID() == SystemIDs.ELEMENT_UPDATED) + hasUpdated = true; + else if (column.getAD_Element_ID() == SystemIDs.ELEMENT_UPDATEDBY) + hasUpdatedBy = true; + } + + return hasIsActive && hasAD_Client_ID && hasAD_Org_ID && hasCreated && + hasUpdated && hasCreatedBy && hasUpdatedBy; + } // isTableValid + +} \ No newline at end of file diff --git a/org.adempiere.base.process/src/org/compiere/process/TabCreateFields.java b/org.adempiere.base.process/src/org/compiere/process/TabCreateFields.java index e4d7239cf4..5db5fcbb68 100644 --- a/org.adempiere.base.process/src/org/compiere/process/TabCreateFields.java +++ b/org.adempiere.base.process/src/org/compiere/process/TabCreateFields.java @@ -105,6 +105,7 @@ public class TabCreateFields extends SvrProcess sql += "ORDER BY CASE " + " WHEN c.ColumnName = 'AD_Client_ID' THEN -100 " + " WHEN c.ColumnName = 'AD_Org_ID' THEN -90 " + + " WHEN c.IsParent = 'Y' THEN -85 " + " WHEN c.ColumnName = 'Value' THEN -80 " + " WHEN c.ColumnName = 'Name' THEN -70 " + " WHEN c.ColumnName = 'Description' THEN -60 " diff --git a/org.adempiere.base/src/org/compiere/model/SystemIDs.java b/org.adempiere.base/src/org/compiere/model/SystemIDs.java index bf6bb08f57..11ffa58441 100644 --- a/org.adempiere.base/src/org/compiere/model/SystemIDs.java +++ b/org.adempiere.base/src/org/compiere/model/SystemIDs.java @@ -44,6 +44,14 @@ public class SystemIDs public final static int COUNTRY_US = 100; public final static int COUNTRY_JAPAN = 216; + public final static int ELEMENT_AD_CLIENT_ID = 102; + public final static int ELEMENT_AD_ORG_ID = 113; + public final static int ELEMENT_CREATED = 245; + public final static int ELEMENT_CREATEDBY = 246; + public final static int ELEMENT_UPDATED = 607; + public final static int ELEMENT_UPDATEDBY = 608; + public final static int ELEMENT_ISACTIVE = 348; + public final static int ENTITYTYPE_ADEMPIERE = 20; public final static int ENTITYTYPE_DICTIONARY = 10; @@ -73,6 +81,7 @@ public class SystemIDs public final static int PROCESS_AD_CHANGELOG_UNDO = 306; public final static int PROCESS_AD_CHANGELOG_REDO = 307; public final static int PROCESS_AD_NATIVE_SEQUENCE_ENABLE = 53156; + public final static int PROCESS_AD_TAB_CREATEFIELDS = 174; public final static int PROCESS_C_INVOICE_GENERATE = 119; public final static int PROCESS_C_INVOICE_GENERATE_MANUAL = 134; public final static int PROCESS_C_INVOICE_GENERATERMA_MANUAL = 52002;