From d687a653147f80984e82bf2e1eff0b0905ca49a4 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Mon, 18 Feb 2013 09:15:50 -0500 Subject: [PATCH 1/5] minor - fix warning on plugin.xml --- org.idempiere.webservices/plugin.xml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/org.idempiere.webservices/plugin.xml b/org.idempiere.webservices/plugin.xml index ddcb40605e..88fc80fe6d 100644 --- a/org.idempiere.webservices/plugin.xml +++ b/org.idempiere.webservices/plugin.xml @@ -1,6 +1,5 @@ - - + + From dfc60b403d6f5141efa700ff87ab98407557b541 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Mon, 18 Feb 2013 11:59:13 -0500 Subject: [PATCH 2/5] IDEMPIERE-640 Price List Versions must not allow duplicate valid from date --- .../i1.0a-release/oracle/201302181158_IDEMPIERE-640.sql | 7 +++++++ .../postgresql/201302181158_IDEMPIERE-640.sql | 7 +++++++ 2 files changed, 14 insertions(+) create mode 100644 migration/i1.0a-release/oracle/201302181158_IDEMPIERE-640.sql create mode 100644 migration/i1.0a-release/postgresql/201302181158_IDEMPIERE-640.sql diff --git a/migration/i1.0a-release/oracle/201302181158_IDEMPIERE-640.sql b/migration/i1.0a-release/oracle/201302181158_IDEMPIERE-640.sql new file mode 100644 index 0000000000..24020f4c41 --- /dev/null +++ b/migration/i1.0a-release/oracle/201302181158_IDEMPIERE-640.sql @@ -0,0 +1,7 @@ +-- IDEMPIERE-640 Price List Versions must not allow duplicate valid from date +CREATE UNIQUE INDEX m_pricelist_version_validfrom ON m_pricelist_version(m_pricelist_id, validfrom) +; + +SELECT register_migration_script('201302181158_IDEMPIERE-640.sql') FROM dual +; + diff --git a/migration/i1.0a-release/postgresql/201302181158_IDEMPIERE-640.sql b/migration/i1.0a-release/postgresql/201302181158_IDEMPIERE-640.sql new file mode 100644 index 0000000000..24020f4c41 --- /dev/null +++ b/migration/i1.0a-release/postgresql/201302181158_IDEMPIERE-640.sql @@ -0,0 +1,7 @@ +-- IDEMPIERE-640 Price List Versions must not allow duplicate valid from date +CREATE UNIQUE INDEX m_pricelist_version_validfrom ON m_pricelist_version(m_pricelist_id, validfrom) +; + +SELECT register_migration_script('201302181158_IDEMPIERE-640.sql') FROM dual +; + From f06e6c19172aa0b30cca4282f7b8909a63692187 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Mon, 18 Feb 2013 13:16:18 -0500 Subject: [PATCH 3/5] IDEMPIERE-616 VBinary improvement for swing client + bugfix in GridTable / Thanks to Jan Thielemann --- org.adempiere.base/src/org/compiere/model/GridTable.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/GridTable.java b/org.adempiere.base/src/org/compiere/model/GridTable.java index 9757d9f21f..0d8e17789e 100644 --- a/org.adempiere.base/src/org/compiere/model/GridTable.java +++ b/org.adempiere.base/src/org/compiere/model/GridTable.java @@ -29,6 +29,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; @@ -2117,7 +2118,10 @@ public class GridTable extends AbstractTableModel || (oldValue != null && oldValue.equals (dbValue)) // Target == DB (changed by trigger to new value already) || (value == null && dbValue == null) - || (value != null && value.equals (dbValue)) ) + || (value != null && value.equals (dbValue)) + || ((oldValue != null && dbValue != null && oldValue.getClass().equals(byte[].class) && dbValue.getClass().equals(byte[].class)) && Arrays.equals((byte[])oldValue, (byte[])dbValue)) + || ((value != null && dbValue != null && value.getClass().equals(byte[].class) && dbValue.getClass().equals(byte[].class)) && Arrays.equals((byte[])oldValue, (byte[])dbValue)) + ) { po.set_ValueNoCheck (columnName, value); } @@ -2133,8 +2137,8 @@ public class GridTable extends AbstractTableModel + (value==null ? "" : "(" + value.getClass().getName() + ")"); // CLogMgt.setLevel(Level.FINEST); // po.dump(); - fireDataStatusEEvent("SaveErrorDataChanged", msg, true); dataRefresh(m_rowChanged); + fireDataStatusEEvent("SaveErrorDataChanged", msg, true); return SAVE_ERROR; } } // Data changed From 8ecca8238f059d3eb3b86062852fb74d17568547 Mon Sep 17 00:00:00 2001 From: Juliana Corredor Date: Mon, 18 Feb 2013 21:18:00 -0500 Subject: [PATCH 4/5] IDEMPIERE-645 Fitnesse Recorder --- org.idempiere.fitrecorder/.classpath | 7 + org.idempiere.fitrecorder/.project | 33 ++ .../.settings/org.eclipse.jdt.core.prefs | 8 + .../.settings/org.eclipse.pde.core.prefs | 5 + .../META-INF/MANIFEST.MF | 13 + org.idempiere.fitrecorder/build.properties | 5 + org.idempiere.fitrecorder/plugin.xml | 13 + .../idempiere/fitrecorder/FitRecorder.java | 317 ++++++++++++++++++ 8 files changed, 401 insertions(+) create mode 100644 org.idempiere.fitrecorder/.classpath create mode 100644 org.idempiere.fitrecorder/.project create mode 100644 org.idempiere.fitrecorder/.settings/org.eclipse.jdt.core.prefs create mode 100644 org.idempiere.fitrecorder/.settings/org.eclipse.pde.core.prefs create mode 100644 org.idempiere.fitrecorder/META-INF/MANIFEST.MF create mode 100644 org.idempiere.fitrecorder/build.properties create mode 100644 org.idempiere.fitrecorder/plugin.xml create mode 100644 org.idempiere.fitrecorder/src/org/idempiere/fitrecorder/FitRecorder.java diff --git a/org.idempiere.fitrecorder/.classpath b/org.idempiere.fitrecorder/.classpath new file mode 100644 index 0000000000..ad32c83a78 --- /dev/null +++ b/org.idempiere.fitrecorder/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/org.idempiere.fitrecorder/.project b/org.idempiere.fitrecorder/.project new file mode 100644 index 0000000000..8534ca4162 --- /dev/null +++ b/org.idempiere.fitrecorder/.project @@ -0,0 +1,33 @@ + + + org.idempiere.fitrecorder + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + org.eclipse.pde.ds.core.builder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/org.idempiere.fitrecorder/.settings/org.eclipse.jdt.core.prefs b/org.idempiere.fitrecorder/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..2101193455 --- /dev/null +++ b/org.idempiere.fitrecorder/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +#Tue Jan 08 16:47:28 COT 2013 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/org.idempiere.fitrecorder/.settings/org.eclipse.pde.core.prefs b/org.idempiere.fitrecorder/.settings/org.eclipse.pde.core.prefs new file mode 100644 index 0000000000..418fff2508 --- /dev/null +++ b/org.idempiere.fitrecorder/.settings/org.eclipse.pde.core.prefs @@ -0,0 +1,5 @@ +#Tue Jan 08 16:47:28 COT 2013 +eclipse.preferences.version=1 +pluginProject.equinox=false +pluginProject.extensions=false +resolve.requirebundle=false diff --git a/org.idempiere.fitrecorder/META-INF/MANIFEST.MF b/org.idempiere.fitrecorder/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..550b27252b --- /dev/null +++ b/org.idempiere.fitrecorder/META-INF/MANIFEST.MF @@ -0,0 +1,13 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Fitrecorder +Bundle-SymbolicName: org.idempiere.fitrecorder;singleton:=true +Bundle-Version: 1.0.0.qualifier +Bundle-Activator: org.adempiere.plugin.utils.AdempiereActivator +Import-Package: org.adempiere.base, + org.adempiere.plugin.utils, + org.compiere.model, + org.osgi.framework;version="1.3.0" +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Service-Component: plugin.xml +Require-Bundle: org.adempiere.base diff --git a/org.idempiere.fitrecorder/build.properties b/org.idempiere.fitrecorder/build.properties new file mode 100644 index 0000000000..e9863e281e --- /dev/null +++ b/org.idempiere.fitrecorder/build.properties @@ -0,0 +1,5 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + plugin.xml diff --git a/org.idempiere.fitrecorder/plugin.xml b/org.idempiere.fitrecorder/plugin.xml new file mode 100644 index 0000000000..78c7070fae --- /dev/null +++ b/org.idempiere.fitrecorder/plugin.xml @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/org.idempiere.fitrecorder/src/org/idempiere/fitrecorder/FitRecorder.java b/org.idempiere.fitrecorder/src/org/idempiere/fitrecorder/FitRecorder.java new file mode 100644 index 0000000000..bfaca0ba19 --- /dev/null +++ b/org.idempiere.fitrecorder/src/org/idempiere/fitrecorder/FitRecorder.java @@ -0,0 +1,317 @@ +package org.idempiere.fitrecorder; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; + +import org.compiere.model.MClient; +import org.compiere.model.MColumn; +import org.compiere.model.MPInstance; +import org.compiere.model.MPInstancePara; +import org.compiere.model.MProcess; +import org.compiere.model.MTable; +import org.compiere.model.MUser; +import org.compiere.model.ModelValidationEngine; +import org.compiere.model.ModelValidator; +import org.compiere.model.PO; +import org.compiere.util.CLogger; +import org.compiere.util.DB; +import org.compiere.util.DisplayType; +import org.compiere.util.Env; + +public class FitRecorder implements ModelValidator { + + private static FileOutputStream tempFileOr = null; + private static Writer writerOr; + + /** Logger */ + private static CLogger log = CLogger.getCLogger(ModelValidator.class); + + private static ArrayList dontLogTables = new ArrayList(Arrays.asList( + "AD_ACCESSLOG", + "AD_SESSION", + "AD_ALERTPROCESSORLOG", + "AD_CHANGELOG", + "AD_DOCUMENT_ACTION_ACCESS", + "AD_FORM_ACCESS", + "AD_ISSUE", + "AD_LDAPPROCESSORLOG", + "AD_PACKAGE_IMP", + "AD_PACKAGE_IMP_BACKUP", + "AD_PACKAGE_IMP_DETAIL", + "AD_PACKAGE_IMP_INST", + "AD_PACKAGE_IMP_PROC", + "AD_PINSTANCE", + "AD_PINSTANCE_LOG", + "AD_PINSTANCE_PARA", + "AD_PROCESS_ACCESS", + "AD_RECENTITEM", + "AD_REPLICATION_LOG", + "AD_SCHEDULERLOG", + "AD_SESSION", + "AD_WINDOW_ACCESS", + "AD_WORKFLOW_ACCESS", + "AD_WORKFLOWPROCESSORLOG", + "CM_WEBACCESSLOG", + "C_ACCTPROCESSORLOG", + "K_INDEXLOG", + "R_REQUESTPROCESSORLOG", + "T_AGING", + "T_ALTER_COLUMN", + "T_DISTRIBUTIONRUNDETAIL", + "T_INVENTORYVALUE", + "T_INVOICEGL", + "T_REPLENISH", + "T_REPORT", + "T_REPORTSTATEMENT", + "T_SELECTION", + "T_SELECTION2", + "T_SPOOL", + "T_TRANSACTION", + "T_TRIALBALANCE")); + + @Override + public void initialize(ModelValidationEngine engine, MClient client) { + SimpleDateFormat format = DisplayType.getDateFormat(DisplayType.DateTime); + String dateTimeText = format.format(new Timestamp(System.currentTimeMillis())); + + String sql="SELECT ta.TableName" + +" FROM AD_Table ta" + +" WHERE ta.IsActive='Y'" + +" AND ta.IsView='N'" + +" AND ta.EntityType='D'" + +" ORDER BY ta.TableName"; + + String sql1="SELECT ta.TableName" + +" FROM AD_Table ta" + +" INNER JOIN AD_Column cl ON (ta.AD_Table_ID = cl.AD_Table_ID)" + +" WHERE ta.IsActive='Y'" + +" AND ta.IsView='N'" + +" AND ta.EntityType='D'" + +" AND cl.AD_Element_ID=287" + +" ORDER BY ta.TableName"; + + try{ + File fileNameOr = File.createTempFile("fit_test_"+dateTimeText, ".txt"); + tempFileOr = new FileOutputStream(fileNameOr, true); + writerOr = new BufferedWriter(new OutputStreamWriter(tempFileOr, "UTF8")); + + PreparedStatement pstmt=null,pstmt1=null; + ResultSet rs=null,rs1=null; + + try{ + pstmt=DB.prepareStatement(sql, null); + rs=pstmt.executeQuery(); + while (rs.next()) { + if (!dontLogTables.contains(rs.getString(1).toUpperCase().trim())) + engine.addModelChange(rs.getString(1), this); + } + }catch(Exception e){ + log.info(e.getLocalizedMessage()); + }finally{ + pstmt.close(); + rs.close(); + } + + try { + pstmt1=DB.prepareStatement(sql1, null); + rs1=pstmt1.executeQuery(); + while (rs1.next()) { + if (!dontLogTables.contains(rs1.getString(1).toUpperCase().trim())) + engine.addDocValidate(rs1.getString(1), this); + } + }catch (Exception e) { + log.info(e.getLocalizedMessage()); + }finally{ + pstmt1.close(); + rs1.close(); + } + }catch (Exception e) { + log.info(e.getLocalizedMessage()); + }finally{ + if (tempFileOr!=null){ + try { + tempFileOr.close(); + } catch (IOException e){ + //TODO + } + } + } + } + + @Override + public int getAD_Client_ID() { + // TODO Auto-generated method stub + return 0; + } + + @Override + public String login(int AD_Org_ID, int AD_Role_ID, int AD_User_ID) { + + try { + + writerOr.append("\n"); + writerOr.append("\n"); + writerOr.append("LOGIN"); + writerOr.append("\n"); + writerOr.append("!"); + writerOr.append("| Login |"); + writerOr.append("\n"); + MUser user = MUser.get(Env.getCtx(), AD_User_ID); + writerOr.append("| User |"); + writerOr.append(user.getName() + " |"); + writerOr.append("\n"); + writerOr.append("| Password |"); + writerOr.append(user.getPassword() + " |"); + writerOr.append("\n"); + writerOr.append("| AD_ClIEnT_id |"); + writerOr.append(user.getAD_Client_ID() + " |"); + writerOr.append("\n"); + writerOr.append("| AD_Role_id |"); + writerOr.append(AD_Role_ID + " |"); + writerOr.append("\n"); + writerOr.append("| *Login* |"); + writerOr.flush(); + + }catch (Exception e) { + return e.getLocalizedMessage(); + } + return null; + } + + @Override + public String modelChange(PO po, int type) throws Exception { + + try { + if(type == TYPE_AFTER_NEW ){ + + writerOr.append("\n"); + writerOr.append("\n"); + writerOr.append("CREATE RECORD"); + writerOr.append("\n"); + writerOr.append("!"); + writerOr.append("| Create Record||"); + writerOr.append("\n"); + writerOr.append("| *Table* |"); + writerOr.append(po.get_TableName()+"|"); + + MTable table=MTable.get(Env.getCtx(),po.get_Table_ID()); + MColumn[] columns=table.getColumns(true); + + for(int i = 0 ; i < columns.length ; i++){ + String colName=columns[i].getColumnName(); + String value=po.get_ValueAsString(colName); + if(value != null && value.length() > 0){ + writerOr.append("\n"); + writerOr.append("| "+colName+" |"); + writerOr.append(value+" | "); + } + } + writerOr.append("\n"); + writerOr.append("| *Save* |"); + writerOr.flush(); + + } + + if(po instanceof MPInstance){ + if(type == TYPE_AFTER_CHANGE){ + + MProcess pro= MProcess.get(Env.getCtx(), po.get_ValueAsInt("AD_Process_ID")); + MPInstance pint=(MPInstance)po; + writerOr.append("\n"); + writerOr.append("\n"); + writerOr.append("RUN PROCESS"); + writerOr.append("\n"); + writerOr.append("!"); + writerOr.append("| Run Process |"); + writerOr.append("\n"); + writerOr.append("| *ProcessValue* |"); + writerOr.append(pro.getValue()+" |"); + MPInstancePara[] para=pint.getParameters(); + if(para.length>0){ + + for (int i=0 ; i < para.length ; i++){ + writerOr.append("\n"); + String name=para[i].getParameterName(); + if(name.contains("to")){ + name.replace("to", "_2"); + } + writerOr.append("|"+name+"|"); + writerOr.append(para[i].get_ValueAsString(para[i].getParameterName())+"|"); + + } + } + writerOr.append("\n"); + writerOr.append("| *Run* |"); + + } + } + }catch (Exception e) { + return e.getLocalizedMessage(); + } + return null; + } + + @Override + public String docValidate(PO po, int timing) { + try{ + if(timing == TIMING_AFTER_COMPLETE ){ + + writerOr.append("\n"); + writerOr.append("\n"); + writerOr.append("RUN PROCESS"); + writerOr.append("\n"); + writerOr.append("!"); + writerOr.append("| Run Process |"); + writerOr.append("\n"); + writerOr.append("| *ProcessValue* |"); + writerOr.append(po.get_ValueAsString("value")+" |"); + writerOr.append("\n"); + writerOr.append("| *DocAction* |"); + writerOr.append("CO |"); + writerOr.append("\n"); + writerOr.append("| *Run* |"); + writerOr.flush(); + + } + + if(timing == TIMING_AFTER_PREPARE || timing == TIMING_AFTER_VOID + || timing == TIMING_AFTER_CLOSE || timing == TIMING_AFTER_REACTIVATE || timing == TIMING_AFTER_REVERSECORRECT + || timing == TIMING_AFTER_REVERSEACCRUAL || timing == TIMING_AFTER_POST ){ + + writerOr.append("\n"); + writerOr.append("\n"); + writerOr.append("SET DOC ACTION"); + writerOr.append("\n"); + writerOr.append("!"); + writerOr.append("| Set DocAction |"); + writerOr.append("\n"); + writerOr.append("| *Table* |"); + MTable table=new MTable(Env.getCtx(), po.get_Table_ID(), null); + writerOr.append(table.getTableName()+" |"); + writerOr.append("\n"); + writerOr.append("| *RecordID* |"); + writerOr.append(po.get_ID()+"|"); + writerOr.append("\n"); + writerOr.append("|docAction |"); + writerOr.append(po.get_ValueAsString("DocAction")+" |"); + writerOr.append("\n"); + writerOr.append("| *Save* |"); + writerOr.flush(); + + } + }catch (Exception e) { + log.info(e.getLocalizedMessage()); + } + return null; + } +} From 7cdcc71a4111e03b1ee2c253d7a2e7e59c80146f Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Mon, 18 Feb 2013 21:20:39 -0500 Subject: [PATCH 5/5] IDEMPIERE-645 Fitnesse Recorder --- .../src/org/compiere/model/MProcessPara.java | 21 +- .../org/adempiere/webui/panel/RolePanel.java | 19 +- .../dict/PackOut.xml | 19 + .../doc/org.idempiere.fitrecorderDoc.xml | 26 + org.idempiere.fitrecorder/META-INF/2Pack.zip | Bin 0 -> 1425 bytes org.idempiere.fitrecorder/bin/MANIFEST.MF | 13 + .../idempiere/fitrecorder/FitRecorder.java | 695 +++++++++++------- 7 files changed, 535 insertions(+), 258 deletions(-) create mode 100644 org.idempiere.fitrecorder/2Pack/org.idempiere.fitrecorder/dict/PackOut.xml create mode 100644 org.idempiere.fitrecorder/2Pack/org.idempiere.fitrecorder/doc/org.idempiere.fitrecorderDoc.xml create mode 100644 org.idempiere.fitrecorder/META-INF/2Pack.zip create mode 100644 org.idempiere.fitrecorder/bin/MANIFEST.MF diff --git a/org.adempiere.base/src/org/compiere/model/MProcessPara.java b/org.adempiere.base/src/org/compiere/model/MProcessPara.java index b0c9deb44b..914b3ef7b2 100644 --- a/org.adempiere.base/src/org/compiere/model/MProcessPara.java +++ b/org.adempiere.base/src/org/compiere/model/MProcessPara.java @@ -37,7 +37,7 @@ public class MProcessPara extends X_AD_Process_Para /** * */ - private static final long serialVersionUID = -6254678383726841920L; + private static final long serialVersionUID = 4580303034897910371L; /** * Get MProcessPara from Cache @@ -291,4 +291,23 @@ public class MProcessPara extends X_AD_Process_Para return true; } // beforeSave + public String getReferenceTableName() { + String foreignTable = null; + if (DisplayType.TableDir == getAD_Reference_ID() + || (DisplayType.Search == getAD_Reference_ID() && getAD_Reference_Value_ID() == 0)) { + foreignTable = getColumnName().substring(0, getColumnName().length()-3); + } else if (DisplayType.Table == getAD_Reference_ID() || DisplayType.Search == getAD_Reference_ID()) { + X_AD_Reference ref = new X_AD_Reference(getCtx(), getAD_Reference_Value_ID(), get_TrxName()); + if (X_AD_Reference.VALIDATIONTYPE_TableValidation.equals(ref.getValidationType())) { + MRefTable rt = new MRefTable(getCtx(), getAD_Reference_Value_ID(), get_TrxName()); + if (rt != null) + foreignTable = rt.getAD_Table().getTableName(); + } + } else if (DisplayType.List == getAD_Reference_ID()) { + foreignTable = "AD_Ref_List"; + } + + return foreignTable; + } + } // MProcessPara diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/RolePanel.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/RolePanel.java index 03257fab01..06f4e04c07 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/RolePanel.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/RolePanel.java @@ -565,20 +565,21 @@ public class RolePanel extends Window implements EventListener, Deferrabl warehouseKNPair = new KeyNamePair(warehouseId, lstItemWarehouse.getLabel()); } - String msg = login.validateLogin(orgKNPair); + Timestamp date = (Timestamp)lstDate.getValue(); + + String msg = login.loadPreferences(orgKNPair, warehouseKNPair, date, null); + + if(!(msg == null || msg.length() == 0)) + { + throw new WrongValueException(msg); + } + + msg = login.validateLogin(orgKNPair); if (msg != null && msg.length() > 0) { throw new WrongValueException(msg); } - Timestamp date = (Timestamp)lstDate.getValue(); - - msg = login.loadPreferences(orgKNPair, warehouseKNPair, date, null); - - if(!(msg == null || msg.length() == 0)) - { - throw new WrongValueException(msg); - } wndLogin.loginCompleted(); // Elaine 2009/02/06 save preference to AD_Preference diff --git a/org.idempiere.fitrecorder/2Pack/org.idempiere.fitrecorder/dict/PackOut.xml b/org.idempiere.fitrecorder/2Pack/org.idempiere.fitrecorder/dict/PackOut.xml new file mode 100644 index 0000000000..994934adca --- /dev/null +++ b/org.idempiere.fitrecorder/2Pack/org.idempiere.fitrecorder/dict/PackOut.xml @@ -0,0 +1,19 @@ + + + + 0 + 0 + 0 + Fitnesse Recorder - see output on /tmp/fit_test_*.txt - enable this model validator to record fitnesse actions - disable to stop recording + org.idempiere.fitrecorder.FitRecorder + U + Fitnesse Recorder + FitRecorder + cbe0799e-bbe4-46cd-a2c9-433ecb969325 + true + + + ALL + + + diff --git a/org.idempiere.fitrecorder/2Pack/org.idempiere.fitrecorder/doc/org.idempiere.fitrecorderDoc.xml b/org.idempiere.fitrecorder/2Pack/org.idempiere.fitrecorder/doc/org.idempiere.fitrecorderDoc.xml new file mode 100644 index 0000000000..709fef0ca0 --- /dev/null +++ b/org.idempiere.fitrecorder/2Pack/org.idempiere.fitrecorder/doc/org.idempiere.fitrecorderDoc.xml @@ -0,0 +1,26 @@ + + + + +
org.idempiere.fitrecorder Package Description
+

Package Name:

+ org.idempiere.fitrecorder +

Author:

+ +

Email Address:

+ +

Created:

+ 2013-02-18 14:04:15.072 +

Updated:

+ 2013-02-18 14:57:03.815 +

Description:

+ FitRecorder model validator +

Instructions:

+ +

Files in Package:

+ File: PackOut.xml + Directory: \dict\ + Notes: Contains all application/object settings for package +

Client:

+ 0-SYSTEM-System +
diff --git a/org.idempiere.fitrecorder/META-INF/2Pack.zip b/org.idempiere.fitrecorder/META-INF/2Pack.zip new file mode 100644 index 0000000000000000000000000000000000000000..134c05dfb85f7c6685c7f31929b76cf3fbcc51c7 GIT binary patch literal 1425 zcmWIWW@Zs#U}E54a48RRYQB|Qpv%O-aGHgIL5o3@A-^bHFEb@Iw;(gMC{-^lv!p0B zIlm|+wMaiDGr2@RATc@HzqCZJA~z>Agp+~!Lc3DnDraQ%C%%;lHrqsljYXI?o@W+&pOdlIMBW`d-v)xt%EEQkCfn~s0#dgy$y&&7s8b3&WWf)lCL<^Ahz&RYDu zZnH?|%&AN+5yc5-m+tFJEDK${c$Rb0w_|SkIp0i^F9e>j;@s!_l|6a!YTmQ^oZhYc z|2?n&sz#eks+3X3#W0?$zaOuCwtZE(0LR2fTRLiV%D3%2d&F+u79kszPwo@)oHZQO z6Ygad8yE9<=U?Hy5xZ-(fomY6O-1ylH%9+g=&e)qk;zQrabnP18`8<3P}6@>j7R;T`TfmFcM@V&D^gQusti&{?bG?I zvEowrcF#%66-5vIGz*N<<(u|Tb$ga=|HOxhs=ejcrp2w+^3ctCt`=GKcb8J?%5o{E zKK0&Q)9w2s*UQ#(A4@P{D&5^W@7C@Q%u~z$OuY5F?BM-AJ-54l|99Lj&bs>3ZO5g@ zcowuvFtnlIAs0xi>xswT^o?pHf83x*RZ9aKXrhMasW`8?LRlkzszdoAG z-KqUOvsOR8xJa%vf1i?iYFYJ7wf*a#^T#th%_#d_pOa~CZ#^x}Q)Ag$f7Sofz8D$$ zy_OGvr$jAaN@PsT{Jn^gfuWX}fx!-cO3Y8z$C*xD@{{4Ia{+ql4377|Z6Hwpe))z^ z^DHz&LMBSLXk7hfFe9wO;nC5}>(_2S()Z@I%YNJGOLF({s(cb~-Cu8aKlaGi?BLDz z51I?hCW=JPGuUt{GkJUWlb3~4&rN=vrDPQ;^&!Cd2BX4ZXYOv6hoU>V6ceraXS*hu zn5<>w_g?;uH{y)dq(8zR{pO)^q&G3bzr9aPay{q{KE;slcXy|3KeuQJ z)66y5YPYwUd6l&meg7-Pb(bDJOg@mzF1V{!i01-9em5)-uiub+Q?e0ToK zUjhPB2m61xd?>GLFc0u%WD;k_RXp)BfB-O!Ff3^Vv2Z2=EQJ*-q_7IDU|>MD1T*C! lThawA8Sz*`R5}D&3`&O(i&@z~?q&kQdq8?Fu+U{-0089JTYdll literal 0 HcmV?d00001 diff --git a/org.idempiere.fitrecorder/bin/MANIFEST.MF b/org.idempiere.fitrecorder/bin/MANIFEST.MF new file mode 100644 index 0000000000..550b27252b --- /dev/null +++ b/org.idempiere.fitrecorder/bin/MANIFEST.MF @@ -0,0 +1,13 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Fitrecorder +Bundle-SymbolicName: org.idempiere.fitrecorder;singleton:=true +Bundle-Version: 1.0.0.qualifier +Bundle-Activator: org.adempiere.plugin.utils.AdempiereActivator +Import-Package: org.adempiere.base, + org.adempiere.plugin.utils, + org.compiere.model, + org.osgi.framework;version="1.3.0" +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Service-Component: plugin.xml +Require-Bundle: org.adempiere.base diff --git a/org.idempiere.fitrecorder/src/org/idempiere/fitrecorder/FitRecorder.java b/org.idempiere.fitrecorder/src/org/idempiere/fitrecorder/FitRecorder.java index bfaca0ba19..5ad2643341 100644 --- a/org.idempiere.fitrecorder/src/org/idempiere/fitrecorder/FitRecorder.java +++ b/org.idempiere.fitrecorder/src/org/idempiere/fitrecorder/FitRecorder.java @@ -1,11 +1,27 @@ +/****************************************************************************** + * Product: iDempiere ERP & CRM Smart Business Solution * + * Copyright (C) Trek Global All Rights Reserved. * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. 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., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + * * + * @author Juliana Corredor, jcorredor@trekglobal.com * + * @author Carlos Ruiz * + *****************************************************************************/ package org.idempiere.fitrecorder; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; -import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; +import java.math.BigDecimal; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Timestamp; @@ -18,8 +34,11 @@ import org.compiere.model.MColumn; import org.compiere.model.MPInstance; import org.compiere.model.MPInstancePara; import org.compiere.model.MProcess; +import org.compiere.model.MProcessPara; +import org.compiere.model.MSysConfig; import org.compiere.model.MTable; import org.compiere.model.MUser; +import org.compiere.model.MWarehouse; import org.compiere.model.ModelValidationEngine; import org.compiere.model.ModelValidator; import org.compiere.model.PO; @@ -29,160 +48,166 @@ import org.compiere.util.DisplayType; import org.compiere.util.Env; public class FitRecorder implements ModelValidator { + + private static FileOutputStream tempFile = null; + private static Writer writer; + + /** Logger */ + private static CLogger log = CLogger.getCLogger(FitRecorder.class); + + private static ArrayList dontLogTables = new ArrayList(Arrays.asList( + "AD_ACCESSLOG", + "AD_SESSION", + "AD_ALERTPROCESSORLOG", + "AD_CHANGELOG", + "AD_DOCUMENT_ACTION_ACCESS", + "AD_FORM_ACCESS", + "AD_ISSUE", + "AD_LDAPPROCESSORLOG", + "AD_PACKAGE_IMP", + "AD_PACKAGE_IMP_BACKUP", + "AD_PACKAGE_IMP_DETAIL", + "AD_PACKAGE_IMP_INST", + "AD_PACKAGE_IMP_PROC", + "AD_PINSTANCE", + "AD_PINSTANCE_LOG", + "AD_PINSTANCE_PARA", + "AD_PROCESS_ACCESS", + "AD_RECENTITEM", + "AD_REPLICATION_LOG", + "AD_SCHEDULERLOG", + "AD_SESSION", + "AD_WINDOW_ACCESS", + "AD_WORKFLOW_ACCESS", + "AD_WORKFLOWPROCESSORLOG", + "CM_WEBACCESSLOG", + "C_ACCTPROCESSORLOG", + "K_INDEXLOG", + "R_REQUESTPROCESSORLOG", + "T_AGING", + "T_ALTER_COLUMN", + "T_DISTRIBUTIONRUNDETAIL", + "T_INVENTORYVALUE", + "T_INVOICEGL", + "T_REPLENISH", + "T_REPORT", + "T_REPORTSTATEMENT", + "T_SELECTION", + "T_SELECTION2", + "T_SPOOL", + "T_TRANSACTION", + "T_TRIALBALANCE")); + + private String ignoreTrx = null; - private static FileOutputStream tempFileOr = null; - private static Writer writerOr; - - /** Logger */ - private static CLogger log = CLogger.getCLogger(ModelValidator.class); - - private static ArrayList dontLogTables = new ArrayList(Arrays.asList( - "AD_ACCESSLOG", - "AD_SESSION", - "AD_ALERTPROCESSORLOG", - "AD_CHANGELOG", - "AD_DOCUMENT_ACTION_ACCESS", - "AD_FORM_ACCESS", - "AD_ISSUE", - "AD_LDAPPROCESSORLOG", - "AD_PACKAGE_IMP", - "AD_PACKAGE_IMP_BACKUP", - "AD_PACKAGE_IMP_DETAIL", - "AD_PACKAGE_IMP_INST", - "AD_PACKAGE_IMP_PROC", - "AD_PINSTANCE", - "AD_PINSTANCE_LOG", - "AD_PINSTANCE_PARA", - "AD_PROCESS_ACCESS", - "AD_RECENTITEM", - "AD_REPLICATION_LOG", - "AD_SCHEDULERLOG", - "AD_SESSION", - "AD_WINDOW_ACCESS", - "AD_WORKFLOW_ACCESS", - "AD_WORKFLOWPROCESSORLOG", - "CM_WEBACCESSLOG", - "C_ACCTPROCESSORLOG", - "K_INDEXLOG", - "R_REQUESTPROCESSORLOG", - "T_AGING", - "T_ALTER_COLUMN", - "T_DISTRIBUTIONRUNDETAIL", - "T_INVENTORYVALUE", - "T_INVOICEGL", - "T_REPLENISH", - "T_REPORT", - "T_REPORTSTATEMENT", - "T_SELECTION", - "T_SELECTION2", - "T_SPOOL", - "T_TRANSACTION", - "T_TRIALBALANCE")); - @Override public void initialize(ModelValidationEngine engine, MClient client) { - SimpleDateFormat format = DisplayType.getDateFormat(DisplayType.DateTime); + SimpleDateFormat format = new SimpleDateFormat ("yyyyMMddHHmmss"); String dateTimeText = format.format(new Timestamp(System.currentTimeMillis())); - - String sql="SELECT ta.TableName" - +" FROM AD_Table ta" - +" WHERE ta.IsActive='Y'" - +" AND ta.IsView='N'" - +" AND ta.EntityType='D'" - +" ORDER BY ta.TableName"; - - String sql1="SELECT ta.TableName" - +" FROM AD_Table ta" - +" INNER JOIN AD_Column cl ON (ta.AD_Table_ID = cl.AD_Table_ID)" - +" WHERE ta.IsActive='Y'" - +" AND ta.IsView='N'" - +" AND ta.EntityType='D'" - +" AND cl.AD_Element_ID=287" - +" ORDER BY ta.TableName"; - - try{ - File fileNameOr = File.createTempFile("fit_test_"+dateTimeText, ".txt"); - tempFileOr = new FileOutputStream(fileNameOr, true); - writerOr = new BufferedWriter(new OutputStreamWriter(tempFileOr, "UTF8")); - - PreparedStatement pstmt=null,pstmt1=null; - ResultSet rs=null,rs1=null; - - try{ - pstmt=DB.prepareStatement(sql, null); - rs=pstmt.executeQuery(); - while (rs.next()) { - if (!dontLogTables.contains(rs.getString(1).toUpperCase().trim())) - engine.addModelChange(rs.getString(1), this); - } - }catch(Exception e){ - log.info(e.getLocalizedMessage()); - }finally{ - pstmt.close(); - rs.close(); - } - - try { - pstmt1=DB.prepareStatement(sql1, null); - rs1=pstmt1.executeQuery(); - while (rs1.next()) { - if (!dontLogTables.contains(rs1.getString(1).toUpperCase().trim())) - engine.addDocValidate(rs1.getString(1), this); - } - }catch (Exception e) { - log.info(e.getLocalizedMessage()); - }finally{ - pstmt1.close(); - rs1.close(); - } - }catch (Exception e) { - log.info(e.getLocalizedMessage()); - }finally{ - if (tempFileOr!=null){ - try { - tempFileOr.close(); - } catch (IOException e){ - //TODO - } + + try { + File fileNameOr = File.createTempFile("fit_test_" + dateTimeText + "_", ".txt"); + tempFile = new FileOutputStream(fileNameOr, true); + writer = new BufferedWriter(new OutputStreamWriter(tempFile, "UTF8")); + + String sql = "SELECT ta.TableName" + +" FROM AD_Table ta" + +" WHERE ta.IsActive='Y'" + +" AND ta.IsView='N'" + +" ORDER BY ta.TableName"; + + PreparedStatement pstmt = null; + ResultSet rs = null; + try { + pstmt = DB.prepareStatement(sql, null); + rs = pstmt.executeQuery(); + while (rs.next()) { + engine.addModelChange(rs.getString(1), this); + } + } catch(Exception e) { + log.info(e.getLocalizedMessage()); + } finally { + DB.close(rs, pstmt); + pstmt = null; rs = null; } - } + + sql = "SELECT ta.TableName" + +" FROM AD_Table ta" + +" INNER JOIN AD_Column cl ON (ta.AD_Table_ID = cl.AD_Table_ID)" + +" WHERE ta.IsActive='Y'" + +" AND ta.IsView='N'" + +" AND cl.AD_Element_ID=287" + +" ORDER BY ta.TableName"; + + try { + pstmt = DB.prepareStatement(sql, null); + rs = pstmt.executeQuery(); + while (rs.next()) { + engine.addDocValidate(rs.getString(1), this); + } + } catch (Exception e) { + log.info(e.getLocalizedMessage()); + } finally { + DB.close(rs, pstmt); + pstmt = null; rs = null; + } + } catch (Exception e) { + log.info(e.getLocalizedMessage()); + } } - @Override public int getAD_Client_ID() { - // TODO Auto-generated method stub return 0; } @Override public String login(int AD_Org_ID, int AD_Role_ID, int AD_User_ID) { - + try { - - writerOr.append("\n"); - writerOr.append("\n"); - writerOr.append("LOGIN"); - writerOr.append("\n"); - writerOr.append("!"); - writerOr.append("| Login |"); - writerOr.append("\n"); + + writer.append("\n"); + writer.append("\n"); + writer.append("LOGIN"); + writer.append("\n"); + writer.append("!"); + writer.append("|Login|"); + writer.append("\n"); MUser user = MUser.get(Env.getCtx(), AD_User_ID); - writerOr.append("| User |"); - writerOr.append(user.getName() + " |"); - writerOr.append("\n"); - writerOr.append("| Password |"); - writerOr.append(user.getPassword() + " |"); - writerOr.append("\n"); - writerOr.append("| AD_ClIEnT_id |"); - writerOr.append(user.getAD_Client_ID() + " |"); - writerOr.append("\n"); - writerOr.append("| AD_Role_id |"); - writerOr.append(AD_Role_ID + " |"); - writerOr.append("\n"); - writerOr.append("| *Login* |"); - writerOr.flush(); - - }catch (Exception e) { + writer.append("|User|"); + if (MSysConfig.getBooleanValue(MSysConfig.USE_EMAIL_FOR_LOGIN, false)) + writer.append(user.getEMail() + "|"); + else + if (user.getLDAPUser() != null) + writer.append(user.getLDAPUser() + "|"); + else + writer.append(user.getName() + "|"); + writer.append("\n"); + writer.append("|Password|"); + writer.append(user.getPassword() + "|"); + writer.append("\n"); + writer.append("|AD_Client_ID|"); + MClient client = MClient.get(Env.getCtx(), Env.getContextAsInt(Env.getCtx(), "#AD_Client_ID")); + writer.append("@Ref=AD_Client[Name='" + client.getName() + "'].AD_Client_ID|"); + writer.append("\n"); + writer.append("|AD_Org_ID|"); + String orgName = DB.getSQLValueString(null, "SELECT Name FROM AD_Org WHERE AD_Org_ID=?", AD_Org_ID); + writer.append("@Ref=AD_Org[Name='" + orgName + "'].AD_Org_ID|"); + writer.append("\n"); + writer.append("|AD_Role_ID|"); + writer.append("@Ref=AD_Role[Name='" + Env.getContext(Env.getCtx(), "#AD_Role_Name") + "'].AD_Role_ID|"); + writer.append("\n"); + int warehouseid = Env.getContextAsInt(Env.getCtx(), Env.M_WAREHOUSE_ID); + if (warehouseid > 0) { + MWarehouse warehouse = MWarehouse.get(Env.getCtx(), warehouseid); + writer.append("|M_Warehouse_ID|"); + writer.append("@Ref=M_Warehouse[Name='" + warehouse.getName() + "'].M_Warehouse_ID|"); + writer.append("\n"); + } + writer.append("|*Login*|"); + writer.append("\n"); + writer.flush(); + + } catch (Exception e) { return e.getLocalizedMessage(); } return null; @@ -190,70 +215,133 @@ public class FitRecorder implements ModelValidator { @Override public String modelChange(PO po, int type) throws Exception { - + try { - if(type == TYPE_AFTER_NEW ){ - - writerOr.append("\n"); - writerOr.append("\n"); - writerOr.append("CREATE RECORD"); - writerOr.append("\n"); - writerOr.append("!"); - writerOr.append("| Create Record||"); - writerOr.append("\n"); - writerOr.append("| *Table* |"); - writerOr.append(po.get_TableName()+"|"); - - MTable table=MTable.get(Env.getCtx(),po.get_Table_ID()); - MColumn[] columns=table.getColumns(true); - - for(int i = 0 ; i < columns.length ; i++){ - String colName=columns[i].getColumnName(); - String value=po.get_ValueAsString(colName); - if(value != null && value.length() > 0){ - writerOr.append("\n"); - writerOr.append("| "+colName+" |"); - writerOr.append(value+" | "); - } + if (type == TYPE_AFTER_NEW ) { + if (dontLogTables.contains(po.get_TableName().toUpperCase())) + return null; + + // Ignore records created within a process + if (po.get_TrxName().startsWith("SvrProcess_")) + return null; + + // Ignore records created within a workflow process + if (po.get_TrxName().startsWith("WFP_")) + return null; + + writer.append("\n"); + writer.append("\n"); + writer.append("CREATE RECORD"); + writer.append("\n"); + writer.append("!"); + writer.append("|Create Record||"); + writer.append("\n"); + writer.append("|*Table*|"); + writer.append(po.get_TableName() + "|"); + + MTable table = MTable.get(Env.getCtx(),po.get_Table_ID()); + for(MColumn column : table.getColumns(false)) { + String colName = column.getColumnName(); + // exclude some columns + if ( colName.equals("Created") + || colName.equals("CreatedBy") + || colName.equals("Updated") + || colName.equals("UpdatedBy") + || colName.equals("AD_Client_ID") + || colName.equals(table.getTableName() + "_ID") + || colName.equals(PO.getUUIDColumnName(table.getTableName())) + || column.getAD_Reference_ID() == DisplayType.Button + ) + continue; + if (po.isActive() && colName.equals("IsActive")) + continue; + // TODO: Exclude read-only fields (read-only is marked on window which is not available here) + + String value = po.get_ValueAsString(colName); + if (value != null && value.length() > 0) { + writer.append("\n"); + writer.append("|" + colName + "|"); + if (DisplayType.isLookup(column.getAD_Reference_ID()) && DisplayType.List != column.getAD_Reference_ID()) { + writer.append(resolveValue(po, table, column) + "|"); + } else { + writer.append(value +"|"); + } + } } - writerOr.append("\n"); - writerOr.append("| *Save* |"); - writerOr.flush(); - + writer.append("\n"); + writer.append("|*Save*|"); + writer.append("\n"); + writer.flush(); + } - - if(po instanceof MPInstance){ - if(type == TYPE_AFTER_CHANGE){ - - MProcess pro= MProcess.get(Env.getCtx(), po.get_ValueAsInt("AD_Process_ID")); - MPInstance pint=(MPInstance)po; - writerOr.append("\n"); - writerOr.append("\n"); - writerOr.append("RUN PROCESS"); - writerOr.append("\n"); - writerOr.append("!"); - writerOr.append("| Run Process |"); - writerOr.append("\n"); - writerOr.append("| *ProcessValue* |"); - writerOr.append(pro.getValue()+" |"); - MPInstancePara[] para=pint.getParameters(); - if(para.length>0){ - - for (int i=0 ; i < para.length ; i++){ - writerOr.append("\n"); - String name=para[i].getParameterName(); - if(name.contains("to")){ - name.replace("to", "_2"); - } - writerOr.append("|"+name+"|"); - writerOr.append(para[i].get_ValueAsString(para[i].getParameterName())+"|"); - - } - } - writerOr.append("\n"); - writerOr.append("| *Run* |"); - - } + + if (po instanceof MPInstance) { + if (type == TYPE_AFTER_CHANGE) { + + MProcess pro = MProcess.get(Env.getCtx(), po.get_ValueAsInt("AD_Process_ID")); + MPInstance pint = (MPInstance)po; + writer.append("\n"); + writer.append("\n"); + writer.append("RUN PROCESS"); + writer.append("\n"); + writer.append("!"); + writer.append("|Run Process|"); + writer.append("\n"); + writer.append("|*ProcessValue*|"); + writer.append(pro.getValue() + "|"); + MPInstancePara[] iparas = pint.getParameters(); + for (MProcessPara para : pro.getParameters()) { + MPInstancePara ipara = null; + for (MPInstancePara iparat : iparas) { + if (iparat.getParameterName().equals(para.getColumnName())) { + ipara = iparat; + break; + } + } + if (ipara == null) { + continue; + } + String value = null; + String valueTo = null; + if (DisplayType.isDate(para.getAD_Reference_ID())) { + if (ipara.getP_Date() != null) + value = ipara.getP_Date().toString(); + if (para.isRange() && ipara.getP_Date_To() != null) + valueTo = ipara.getP_Date_To().toString(); + } else if (DisplayType.isNumeric(para.getAD_Reference_ID())) { + if (ipara.getP_Number() != null) + value = ipara.getP_Number().toString(); + if (para.isRange() && ipara.getP_Number_To() != null) + valueTo = ipara.getP_Number_To().toString(); + } else if (DisplayType.isLookup(para.getAD_Reference_ID()) && DisplayType.List != para.getAD_Reference_ID()) { + // TODO: resolve Ref + if (ipara.get_Value("P_Number") != null) + value = resolveValuePara(ipara.getP_Number(), para); + if (para.isRange() && ipara.get_Value("P_Number_To") != null) + valueTo = resolveValuePara(ipara.getP_Number_To(), para); + } else { + if (ipara.getP_String() != null) + value = ipara.getP_String(); + if (para.isRange() && ipara.getP_String_To() != null) + valueTo = ipara.getP_String_To(); + } + if (value != null) { + writer.append("\n"); + writer.append("|" + para.getColumnName() + "|"); + writer.append(value + "|"); + } + if (para.isRange() && valueTo != null) { + writer.append("\n"); + writer.append("|" + para.getColumnName() + "_2|"); + writer.append(valueTo + "|"); + } + } + writer.append("\n"); + writer.append("|*Run*|"); + writer.append("\n"); + writer.flush(); + + } } }catch (Exception e) { return e.getLocalizedMessage(); @@ -261,57 +349,168 @@ public class FitRecorder implements ModelValidator { return null; } + private String resolveValuePara(BigDecimal p_Number, MProcessPara para) { + String value = null; + // resolve to identifier - search for value first, if not search for name - if not use the ID + String foreignTable = para.getReferenceTableName(); + String foreignColName = null; + if ( ! ("AD_Language".equals(foreignTable) || "AD_EntityType".equals(foreignTable))) { + MTable fTable = MTable.get(Env.getCtx(), foreignTable); + // Hardcoded / do not check for Value on AD_Org, AD_User and AD_Ref_List, must use name for these two tables + if (! ("AD_Org".equals(foreignTable) || "AD_User".equals(foreignTable) || "AD_Ref_List".equals(foreignTable)) + && fTable.getColumn("Value") != null) { + foreignColName = "Value"; + } else if (fTable.getColumn("Name") != null) { + foreignColName = "Name"; + } else if (fTable.getColumn("DocumentNo") != null) { + foreignColName = "DocumentNo"; + } + } + + Object idO = p_Number.intValue(); + if (idO != null && foreignColName != null) { + int id = (Integer) idO; + StringBuilder select = new StringBuilder("SELECT ") + .append(foreignColName).append(" FROM ") + .append(foreignTable).append(" WHERE ") + .append(foreignTable).append("_ID=?"); + String foreignValue = DB.getSQLValueStringEx(null, select.toString(), id); + value = "@Ref=" + foreignTable + "[" + foreignColName + "='" + foreignValue + "']." + foreignTable + "_ID"; + } else { + value = p_Number.toString(); + } + + return value; + } + + private String resolveValue(PO po, MTable table, MColumn column) { + String value = null; + // resolve to identifier - search for value first, if not search for name - if not use the ID + String foreignTable = column.getReferenceTableName(); + String foreignColName = null; + if ( ! ("AD_Language".equals(foreignTable) || "AD_EntityType".equals(foreignTable))) { + MTable fTable = MTable.get(Env.getCtx(), foreignTable); + // Hardcoded / do not check for Value on AD_Org, AD_User and AD_Ref_List, must use name for these two tables + if (! ("AD_Org".equals(foreignTable) || "AD_User".equals(foreignTable) || "AD_Ref_List".equals(foreignTable)) + && fTable.getColumn("Value") != null) { + foreignColName = "Value"; + } else if (fTable.getColumn("Name") != null) { + foreignColName = "Name"; + } else if (fTable.getColumn("DocumentNo") != null) { + foreignColName = "DocumentNo"; + } + } + + Object idO = po.get_Value(column.getColumnName()); + if (idO != null && foreignColName != null) { + int id = (Integer) idO; + StringBuilder select = new StringBuilder("SELECT ") + .append(foreignColName).append(" FROM ") + .append(foreignTable).append(" WHERE ") + .append(foreignTable).append("_ID=?"); + String foreignValue = DB.getSQLValueStringEx(null, select.toString(), id); + value = "@Ref=" + foreignTable + "[" + foreignColName + "='" + foreignValue + "']." + foreignTable + "_ID"; + } else { + value = po.get_ValueAsString(column.getColumnName()); + } + + return value; + } + @Override public String docValidate(PO po, int timing) { - try{ - if(timing == TIMING_AFTER_COMPLETE ){ - - writerOr.append("\n"); - writerOr.append("\n"); - writerOr.append("RUN PROCESS"); - writerOr.append("\n"); - writerOr.append("!"); - writerOr.append("| Run Process |"); - writerOr.append("\n"); - writerOr.append("| *ProcessValue* |"); - writerOr.append(po.get_ValueAsString("value")+" |"); - writerOr.append("\n"); - writerOr.append("| *DocAction* |"); - writerOr.append("CO |"); - writerOr.append("\n"); - writerOr.append("| *Run* |"); - writerOr.flush(); - - } - - if(timing == TIMING_AFTER_PREPARE || timing == TIMING_AFTER_VOID - || timing == TIMING_AFTER_CLOSE || timing == TIMING_AFTER_REACTIVATE || timing == TIMING_AFTER_REVERSECORRECT - || timing == TIMING_AFTER_REVERSEACCRUAL || timing == TIMING_AFTER_POST ){ - - writerOr.append("\n"); - writerOr.append("\n"); - writerOr.append("SET DOC ACTION"); - writerOr.append("\n"); - writerOr.append("!"); - writerOr.append("| Set DocAction |"); - writerOr.append("\n"); - writerOr.append("| *Table* |"); - MTable table=new MTable(Env.getCtx(), po.get_Table_ID(), null); - writerOr.append(table.getTableName()+" |"); - writerOr.append("\n"); - writerOr.append("| *RecordID* |"); - writerOr.append(po.get_ID()+"|"); - writerOr.append("\n"); - writerOr.append("|docAction |"); - writerOr.append(po.get_ValueAsString("DocAction")+" |"); - writerOr.append("\n"); - writerOr.append("| *Save* |"); - writerOr.flush(); - - } - }catch (Exception e) { + + try { + if ( timing == TIMING_BEFORE_PREPARE || timing == TIMING_BEFORE_VOID + || timing == TIMING_BEFORE_CLOSE || timing == TIMING_BEFORE_REACTIVATE || timing == TIMING_BEFORE_REVERSECORRECT + || timing == TIMING_BEFORE_REVERSEACCRUAL || timing == TIMING_BEFORE_COMPLETE || timing == TIMING_BEFORE_POST ) { + + if (po.get_TrxName().equals(ignoreTrx)) + return null; + + ignoreTrx = po.get_TrxName(); + + String action = po.get_ValueAsString("DocAction"); + if (timing == TIMING_BEFORE_POST) + action = "PO"; + + writer.append("\n"); + writer.append("\n"); + if (action.equals("CO")) { + // run process + String processValue = DB.getSQLValueString(po.get_TrxName(), + "SELECT p.Value FROM AD_Process p JOIN AD_Workflow w ON (p.AD_Workflow_ID=w.AD_Workflow_ID) WHERE w.AD_Table_ID=?", po.get_Table_ID()); + writer.append("RUN PROCESS"); + writer.append("\n"); + writer.append("!"); + writer.append("|Run Process|"); + writer.append("\n"); + writer.append("|*ProcessValue*|"); + writer.append(processValue + "|"); + writer.append("\n"); + writer.append("|*RecordID*|"); + writer.append(resolveValueDoc(po.get_ID(), po.get_TableName()) + "|"); + writer.append("\n"); + writer.append("|*DocAction*|"); + writer.append(action + "|"); + writer.append("\n"); + writer.append("|*Run*|"); + } else { + // set doc action + writer.append("SET DOC ACTION"); + writer.append("\n"); + writer.append("!"); + writer.append("|Set DocAction|"); + writer.append("\n"); + writer.append("|*Table*|"); + writer.append(po.get_TableName() + "|"); + writer.append("\n"); + writer.append("|" + po.get_TableName() + "_ID|"); + writer.append(resolveValueDoc(po.get_ID(), po.get_TableName()) + "|"); + writer.append("\n"); + writer.append("|DocAction|"); + writer.append(action + "|"); + writer.append("\n"); + writer.append("|*Save*|"); + } + writer.append("\n"); + writer.flush(); + } + } catch (Exception e) { log.info(e.getLocalizedMessage()); } return null; } + + private String resolveValueDoc(int id, String tableName) { + String value = null; + // resolve to identifier - search for value first, if not search for name - if not use the ID + String foreignTable = tableName; + String foreignColName = null; + if ( ! ("AD_Language".equals(foreignTable) || "AD_EntityType".equals(foreignTable))) { + MTable fTable = MTable.get(Env.getCtx(), foreignTable); + // Hardcoded / do not check for Value on AD_Org, AD_User and AD_Ref_List, must use name for these two tables + if (! ("AD_Org".equals(foreignTable) || "AD_User".equals(foreignTable) || "AD_Ref_List".equals(foreignTable)) + && fTable.getColumn("Value") != null) { + foreignColName = "Value"; + } else if (fTable.getColumn("Name") != null) { + foreignColName = "Name"; + } else if (fTable.getColumn("DocumentNo") != null) { + foreignColName = "DocumentNo"; + } + } + + if (id > 0 && foreignColName != null) { + StringBuilder select = new StringBuilder("SELECT ") + .append(foreignColName).append(" FROM ") + .append(foreignTable).append(" WHERE ") + .append(foreignTable).append("_ID=?"); + String foreignValue = DB.getSQLValueStringEx(null, select.toString(), id); + value = "@Ref=" + foreignTable + "[" + foreignColName + "='" + foreignValue + "']." + foreignTable + "_ID"; + } else { + value = String.valueOf(id); + } + + return value; + } }