hg merge release-5.1 (merge release5.1 into default)

This commit is contained in:
Carlos Ruiz 2018-10-26 15:36:31 +02:00
commit eba4ceca7f
16 changed files with 665 additions and 118 deletions

View File

@ -0,0 +1,159 @@
SET SQLBLANKLINES ON
SET DEFINE OFF
-- IDEMPIERE-2395 NoteDelete leaving orphan attachments
-- Oct 6, 2018 11:05:15 PM CEST
INSERT INTO AD_Process (AD_Process_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Help,IsReport,Value,IsDirectPrint,Classname,AccessLevel,EntityType,Statistic_Count,Statistic_Seconds,IsBetaFunctionality,IsServerProcess,ShowHelp,CopyFromProcess,AD_Process_UU) VALUES (200102,0,0,'Y',TO_DATE('2018-10-06 23:05:15','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2018-10-06 23:05:15','YYYY-MM-DD HH24:MI:SS'),100,'Clean Orphan Cascade Records','Some processes accessing directly the database can leave orphan records, this process clean those orphan records deleting them','N','CleanOrphanCascade','N','org.idempiere.process.CleanOrphanCascade','4','D',0,0,'N','N','Y','N','d3826a84-1467-4d6e-931b-e395f349f60c')
;
-- Oct 6, 2018 11:05:55 PM CEST
INSERT INTO AD_Menu (AD_Menu_ID,Name,Action,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,IsSummary,AD_Process_ID,IsSOTrx,IsReadOnly,EntityType,IsCentrallyMaintained,AD_Menu_UU) VALUES (200161,'Clean Orphan Cascade Records','P',0,0,'Y',TO_DATE('2018-10-06 23:05:55','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2018-10-06 23:05:55','YYYY-MM-DD HH24:MI:SS'),100,'N',200102,'Y','N','D','Y','67e5ec6c-93d0-47f9-bd45-f0d60d552b16')
;
-- Oct 6, 2018 11:05:55 PM CEST
INSERT INTO AD_TreeNodeMM (AD_Client_ID,AD_Org_ID, IsActive,Created,CreatedBy,Updated,UpdatedBy, AD_Tree_ID, Node_ID, Parent_ID, SeqNo, AD_TreeNodeMM_UU) SELECT t.AD_Client_ID, 0, 'Y', SysDate, 100, SysDate, 100,t.AD_Tree_ID, 200161, 0, 999, Generate_UUID() FROM AD_Tree t WHERE t.AD_Client_ID=0 AND t.IsActive='Y' AND t.IsAllNodes='Y' AND t.TreeType='MM' AND NOT EXISTS (SELECT * FROM AD_TreeNodeMM e WHERE e.AD_Tree_ID=t.AD_Tree_ID AND Node_ID=200161)
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=0, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=218
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=1, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=153
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=2, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=263
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=3, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=166
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=4, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=203
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=5, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=53242
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=6, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=236
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=7, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=183
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=8, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=160
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=9, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=278
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=10, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=345
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=11, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=53296
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=12, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=53014
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=13, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=53108
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=0, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=161
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=1, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=367
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=2, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=456
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=3, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=501
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=4, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=326
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=5, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=566
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=6, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=392
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=7, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=113
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=8, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=220
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=9, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=351
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=10, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=289
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=11, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=302
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=12, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=303
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=13, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=200047
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=14, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=200048
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=15, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=321
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=16, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=461
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=17, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=53193
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=18, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=53322
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=19, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=383
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=20, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=200161
;
SELECT register_migration_script('201810062307_IDEMPIERE-2395.sql') FROM dual
;

View File

@ -0,0 +1,156 @@
-- IDEMPIERE-2395 NoteDelete leaving orphan attachments
-- Oct 6, 2018 11:05:15 PM CEST
INSERT INTO AD_Process (AD_Process_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Help,IsReport,Value,IsDirectPrint,Classname,AccessLevel,EntityType,Statistic_Count,Statistic_Seconds,IsBetaFunctionality,IsServerProcess,ShowHelp,CopyFromProcess,AD_Process_UU) VALUES (200102,0,0,'Y',TO_TIMESTAMP('2018-10-06 23:05:15','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2018-10-06 23:05:15','YYYY-MM-DD HH24:MI:SS'),100,'Clean Orphan Cascade Records','Some processes accessing directly the database can leave orphan records, this process clean those orphan records deleting them','N','CleanOrphanCascade','N','org.idempiere.process.CleanOrphanCascade','4','D',0,0,'N','N','Y','N','d3826a84-1467-4d6e-931b-e395f349f60c')
;
-- Oct 6, 2018 11:05:55 PM CEST
INSERT INTO AD_Menu (AD_Menu_ID,Name,"action",AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,IsSummary,AD_Process_ID,IsSOTrx,IsReadOnly,EntityType,IsCentrallyMaintained,AD_Menu_UU) VALUES (200161,'Clean Orphan Cascade Records','P',0,0,'Y',TO_TIMESTAMP('2018-10-06 23:05:55','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2018-10-06 23:05:55','YYYY-MM-DD HH24:MI:SS'),100,'N',200102,'Y','N','D','Y','67e5ec6c-93d0-47f9-bd45-f0d60d552b16')
;
-- Oct 6, 2018 11:05:55 PM CEST
INSERT INTO AD_TreeNodeMM (AD_Client_ID,AD_Org_ID, IsActive,Created,CreatedBy,Updated,UpdatedBy, AD_Tree_ID, Node_ID, Parent_ID, SeqNo, AD_TreeNodeMM_UU) SELECT t.AD_Client_ID, 0, 'Y', statement_timestamp(), 100, statement_timestamp(), 100,t.AD_Tree_ID, 200161, 0, 999, Generate_UUID() FROM AD_Tree t WHERE t.AD_Client_ID=0 AND t.IsActive='Y' AND t.IsAllNodes='Y' AND t.TreeType='MM' AND NOT EXISTS (SELECT * FROM AD_TreeNodeMM e WHERE e.AD_Tree_ID=t.AD_Tree_ID AND Node_ID=200161)
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=0, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=218
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=1, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=153
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=2, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=263
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=3, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=166
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=4, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=203
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=5, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=53242
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=6, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=236
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=7, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=183
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=8, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=160
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=9, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=278
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=10, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=345
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=11, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=53296
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=12, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=53014
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=13, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=53108
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=0, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=161
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=1, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=367
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=2, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=456
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=3, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=501
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=4, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=326
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=5, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=566
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=6, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=392
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=7, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=113
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=8, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=220
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=9, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=351
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=10, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=289
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=11, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=302
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=12, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=303
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=13, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=200047
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=14, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=200048
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=15, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=321
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=16, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=461
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=17, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=53193
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=18, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=53322
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=19, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=383
;
-- Oct 6, 2018 11:07:01 PM CEST
UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=20, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=200161
;
SELECT register_migration_script('201810062307_IDEMPIERE-2395.sql') FROM dual
;

View File

@ -0,0 +1,147 @@
/**********************************************************************
* 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: *
* - Carlos Ruiz *
**********************************************************************/
package org.idempiere.process;
import java.math.BigDecimal;
import java.util.List;
import java.util.logging.Level;
import org.compiere.model.MArchive;
import org.compiere.model.MAttachment;
import org.compiere.model.MTable;
import org.compiere.model.Query;
import org.compiere.process.ProcessInfoParameter;
import org.compiere.process.SvrProcess;
import org.compiere.util.DB;
import org.compiere.util.Msg;
/**
* IDEMPIERE-2395
* @author Carlos Ruiz - globalqss
*/
public class CleanOrphanCascade extends SvrProcess
{
/**
* Prepare - e.g., get Parameters.
*/
protected void prepare()
{
for (ProcessInfoParameter para : getParameter())
{
String name = para.getParameterName();
log.log(Level.SEVERE, "Unknown Parameter: " + name);
}
} // prepare
/**
* Perform process.
* @return Message
* @throws Exception
*/
protected String doIt() throws Exception
{
if (log.isLoggable(Level.INFO)) log.info("");
String whereTables = ""
+ " IsView = 'N' "
+ "AND TableName != 'AD_ChangeLog' "
+ "AND EXISTS (SELECT 1 "
+ " FROM AD_Column ct "
+ " WHERE ct.IsActive='Y' AND ct.AD_Table_ID = AD_Table.AD_Table_ID "
+ " AND ct.ColumnName = 'AD_Table_ID') "
+ "AND EXISTS (SELECT 1 "
+ " FROM AD_Column cr "
+ " WHERE cr.IsActive='Y' AND cr.AD_Table_ID = AD_Table.AD_Table_ID "
+ " AND cr.ColumnName = 'Record_ID') "
+ "AND EXISTS (SELECT 1 "
+ " FROM AD_Column ck "
+ " WHERE ck.IsActive='Y' AND ck.AD_Table_ID = AD_Table.AD_Table_ID "
+ " AND ck.ColumnName = AD_Table.TableName || '_ID')";
List<MTable> tables = new Query(getCtx(), "AD_Table", whereTables, get_TrxName())
.setOnlyActiveRecords(true)
.setOrderBy("TableName")
.list();
for (MTable table : tables) {
String tableName = table.getTableName();
StringBuilder sqlRef = new StringBuilder();
sqlRef.append("SELECT DISTINCT t.AD_Table_ID, ");
sqlRef.append(" t.TableName ");
sqlRef.append("FROM ").append(tableName).append(" r ");
sqlRef.append(" JOIN AD_Table t ON ( r.AD_Table_ID = t.AD_Table_ID ) ");
sqlRef.append("ORDER BY t.Tablename");
List<List<Object>> rowTables = DB.getSQLArrayObjectsEx(get_TrxName(), sqlRef.toString());
if (rowTables != null) {
for (List<Object> row : rowTables) {
int refTableID = ((BigDecimal) row.get(0)).intValue();
String refTableName = row.get(1).toString();
MTable refTable = MTable.get(getCtx(), refTableID);
if (refTable.getKeyColumns().length != 1) {
log.warning("Wrong reference for table " + tableName + " -> " + refTableName);
continue;
}
String colRef = refTable.getKeyColumns()[0];
StringBuilder whereClause = new StringBuilder();
whereClause.append("AD_Table_ID = ").append(refTableID);
whereClause.append(" AND NOT EXISTS (SELECT ").append(colRef);
whereClause.append(" FROM ").append(refTableName).append(" ");
whereClause.append(" WHERE ").append(refTableName).append(".").append(colRef).append(" = ").append(tableName).append(".Record_ID)");
int noDel = 0;
if (MAttachment.Table_Name.equals(tableName)) {
// special case for attachment because of store
List<MAttachment> attachments = new Query(getCtx(), tableName, whereClause.toString(), get_TrxName()).list();
for (MAttachment attachment : attachments) {
attachment.deleteEx(true, get_TrxName());
noDel++;
}
} else if (MArchive.Table_Name.equals(tableName)) {
// special case for archive because of store
List<MArchive> archives = new Query(getCtx(), tableName, whereClause.toString(), get_TrxName()).list();
for (MArchive archive : archives) {
archive.deleteEx(true, get_TrxName());
noDel++;
}
} else {
StringBuilder sqlDelete = new StringBuilder();
sqlDelete.append("DELETE FROM ").append(tableName).append(" WHERE ").append(whereClause);
noDel = DB.executeUpdateEx(sqlDelete.toString(), get_TrxName());
}
if (noDel > 0) {
addLog(Msg.parseTranslation(getCtx(), noDel + " " + tableName + " " + "@Deleted@ -> " + refTableName));
}
}
}
}
return "@OK@";
} // doIt
} // CleanOrphanCascade

View File

@ -144,6 +144,7 @@ public class ImportCSVProcess extends SvrProcess implements DataStatusListener {
protected void importFile(String filePath, IGridTabImporter csvImporter, GridTab activeTab, List<GridTab> childTabs) throws Exception { protected void importFile(String filePath, IGridTabImporter csvImporter, GridTab activeTab, List<GridTab> childTabs) throws Exception {
m_file_istream = new FileInputStream(filePath); m_file_istream = new FileInputStream(filePath);
m_file_istream = m_importTemplate.validateFile(m_file_istream);
File outFile = csvImporter.fileImport(activeTab, childTabs, m_file_istream, Charset.forName(m_importTemplate.getCharacterSet()), p_ImportMode, processUI); File outFile = csvImporter.fileImport(activeTab, childTabs, m_file_istream, Charset.forName(m_importTemplate.getCharacterSet()), p_ImportMode, processUI);
// TODO: Potential improvement - traverse the outFile and call addLog with the results // TODO: Potential improvement - traverse the outFile and call addLog with the results

View File

@ -228,7 +228,6 @@ public abstract class AbstractExcelExporter
String key = "cell-"+col+"-"+displayType; String key = "cell-"+col+"-"+displayType;
HSSFCellStyle cs = m_styles.get(key); HSSFCellStyle cs = m_styles.get(key);
if (cs == null) { if (cs == null) {
boolean isHighlightNegativeNumbers = true;
cs = m_workbook.createCellStyle(); cs = m_workbook.createCellStyle();
HSSFFont font = getFont(false); HSSFFont font = getFont(false);
cs.setFont(font); cs.setFont(font);
@ -238,19 +237,29 @@ public abstract class AbstractExcelExporter
cs.setBorderRight((short)1); cs.setBorderRight((short)1);
cs.setBorderBottom((short)1); cs.setBorderBottom((short)1);
// //
if (DisplayType.isDate(displayType)) { String cellFormat = getCellFormat(row, col);
cs.setDataFormat(m_dataFormat.getFormat(DisplayType.getDateFormat(getLanguage()).toPattern())); if (cellFormat != null)
} cs.setDataFormat(m_dataFormat.getFormat(cellFormat));
else if (DisplayType.isNumeric(displayType)) {
DecimalFormat df = DisplayType.getNumberFormat(displayType, getLanguage());
String format = getFormatString(df, isHighlightNegativeNumbers);
cs.setDataFormat(m_dataFormat.getFormat(format));
}
m_styles.put(key, cs); m_styles.put(key, cs);
} }
return cs; return cs;
} }
protected String getCellFormat(int row, int col) {
boolean isHighlightNegativeNumbers = true;
int displayType = getDisplayType(row, col);
String cellFormat = null;
if (DisplayType.isDate(displayType)) {
cellFormat = DisplayType.getDateFormat(getLanguage()).toPattern();
} else if (DisplayType.isNumeric(displayType)) {
DecimalFormat df = DisplayType.getNumberFormat(displayType, getLanguage());
cellFormat = getFormatString(df, isHighlightNegativeNumbers);
}
return cellFormat;
}
private HSSFCellStyle getHeaderStyle(int col) private HSSFCellStyle getHeaderStyle(int col)
{ {
String key = "header-"+col; String key = "header-"+col;

View File

@ -223,7 +223,7 @@ public class GridTabCSVExporter implements IGridTabExporter
int index =0; int index =0;
int rowDetail=0; int rowDetail=0;
int record_Id = 0; int record_Id = 0;
boolean isActiveRow = true; // boolean isActiveRow = true;
gridTab.setCurrentRow(idxrow); gridTab.setCurrentRow(idxrow);
for(GridField field : getFields(gridTab)){ for(GridField field : getFields(gridTab)){
MColumn column = MColumn.get(Env.getCtx(), field.getAD_Column_ID()); MColumn column = MColumn.get(Env.getCtx(), field.getAD_Column_ID());
@ -241,16 +241,16 @@ public class GridTabCSVExporter implements IGridTabExporter
value = resolveValue(gridTab, table, column, idxrow, headName); value = resolveValue(gridTab, table, column, idxrow, headName);
} }
//Ignore row //Ignore row
if("IsActive".equals(headName) && value!=null && Boolean.valueOf((Boolean)value)==false){ // if("IsActive".equals(headName) && value!=null && Boolean.valueOf((Boolean)value)==false){
isActiveRow=false; // isActiveRow=false;
break; // break;
} // }
row.put(headName,value); row.put(headName,value);
idxfld++; idxfld++;
index++; index++;
} }
if(!isActiveRow) // if(!isActiveRow)
continue; // continue;
if(specialHDispayType > 0 && record_Id > 0){ if(specialHDispayType > 0 && record_Id > 0){
switch(specialHDispayType) { switch(specialHDispayType) {
@ -336,8 +336,8 @@ public class GridTabCSVExporter implements IGridTabExporter
if (tab.isReadOnly()) if (tab.isReadOnly())
result = Msg.getMsg(Env.getCtx(),"FieldIsReadOnly", new Object[] {gridTab.getName()}); result = Msg.getMsg(Env.getCtx(),"FieldIsReadOnly", new Object[] {gridTab.getName()});
if (gridTab.getTableName().endsWith("_Acct")) // if (gridTab.getTableName().endsWith("_Acct"))
result = "Accounting Tab are not exported by default: "+ gridTab.getName(); // result = "Accounting Tab are not exported by default: "+ gridTab.getName();
return result; return result;
} }
@ -354,10 +354,10 @@ public class GridTabCSVExporter implements IGridTabExporter
for(Map.Entry<GridTab, GridField[]> childTabDetail : tabMapDetails.entrySet()) { for(Map.Entry<GridTab, GridField[]> childTabDetail : tabMapDetails.entrySet()) {
GridTab childTab = childTabDetail.getKey(); GridTab childTab = childTabDetail.getKey();
//String whereCla = getWhereClause (childTab, parentGrid, currentParentIndex); //String whereCla = getWhereClause (childTab ,record_Id ,keyColumnParent);
//childTab.getTableModel().dataRequery(whereCla, false, 0); //childTab.getTableModel().dataRequery(whereCla, false, 0);
Map<String,Object> row = new HashMap<String,Object>(); Map<String,Object> row = new HashMap<String,Object>();
boolean isActiveRow = true; // boolean isActiveRow = true;
if (childTab.getRowCount() > 0) { if (childTab.getRowCount() > 0) {
int specialRecordId = 0; int specialRecordId = 0;
for(GridField field : childTabDetail.getValue()){ for(GridField field : childTabDetail.getValue()){
@ -374,19 +374,19 @@ public class GridTabCSVExporter implements IGridTabExporter
String headName = headArray.get(headArray.indexOf(childTab.getTableName()+">"+resolveColumnName(tableDetail,column))); String headName = headArray.get(headArray.indexOf(childTab.getTableName()+">"+resolveColumnName(tableDetail,column)));
value = resolveValue(childTab, MTable.get(Env.getCtx(),childTab.getTableName()), column, currentDetRow, headName.substring(headName.indexOf(">")+ 1,headName.length())); value = resolveValue(childTab, MTable.get(Env.getCtx(),childTab.getTableName()), column, currentDetRow, headName.substring(headName.indexOf(">")+ 1,headName.length()));
if(DisplayType.Payment == field.getDisplayType()) if(DisplayType.Payment == field.getDisplayType() && value != null)
value = MRefList.getListName(Env.getCtx(),REFERENCE_PAYMENTRULE, value.toString()); value = MRefList.getListName(Env.getCtx(),REFERENCE_PAYMENTRULE, value.toString());
row.put(headName,value); row.put(headName,value);
if(value!=null) if(value!=null)
hasDetails = true; hasDetails = true;
//Ignore row //Ignore row
if(headName.contains("IsActive")&& value!=null && Boolean.valueOf((Boolean)value)==false){ // if(headName.contains("IsActive")&& value!=null && Boolean.valueOf((Boolean)value)==false){
isActiveRow=false; // isActiveRow=false;
break; // break;
// }
} }
} if(/* isActiveRow && */ specialDetDispayType > 0 && specialRecordId > 0){
if(isActiveRow && specialDetDispayType > 0 && specialRecordId > 0){
MLocation address = new MLocation (Env.getCtx(),specialRecordId,null); MLocation address = new MLocation (Env.getCtx(),specialRecordId,null);
for(String specialHeader:resolveSpecialColumnName(specialDetDispayType)){ for(String specialHeader:resolveSpecialColumnName(specialDetDispayType)){
String columnName = specialHeader.substring(specialHeader.indexOf(">")+1,specialHeader.length()); String columnName = specialHeader.substring(specialHeader.indexOf(">")+1,specialHeader.length());
@ -411,7 +411,7 @@ public class GridTabCSVExporter implements IGridTabExporter
} }
} }
} }
if(isActiveRow) // if(isActiveRow)
activeRow.putAll(row); activeRow.putAll(row);
} }
if (hasDetails) if (hasDetails)
@ -495,6 +495,8 @@ public class GridTabCSVExporter implements IGridTabExporter
name.append("[DocumentNo]"); name.append("[DocumentNo]");
} }
} }
} else if (DisplayType.Account == column.getAD_Reference_ID()) {
name.append("[Combination]");
} }
return name.toString(); return name.toString();
} }
@ -592,7 +594,7 @@ public class GridTabCSVExporter implements IGridTabExporter
|| field.isEncryptedColumn() || field.isEncryptedColumn()
|| !(field.isDisplayed() || field.isDisplayedGrid())) || !(field.isDisplayed() || field.isDisplayedGrid()))
continue; continue;
if (field.isParentValue() || (!field.isReadOnly() && field.isDisplayedGrid())) if (field.isParentValue() || (!field.isReadOnly() && field.isDisplayedGrid()) || field.isParentColumn())
gridFieldList.add(field); gridFieldList.add(field);
} }

View File

@ -22,6 +22,7 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.math.BigDecimal;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Timestamp; import java.sql.Timestamp;
@ -904,6 +905,9 @@ public class GridTabCSVImporter implements IGridTabImporter
for(int i = startindx; i < endindx +1; i++){ for(int i = startindx; i < endindx +1; i++){
String columnName = header.get(i); String columnName = header.get(i);
Object value = tmpRow.get(i); Object value = tmpRow.get(i);
//Validate Address
if (!"C_Location".equals(gridTab.getTableName()))
{
//Validate Address //Validate Address
if(header.get(i).contains(MTable.getTableName(Env.getCtx(),MLocation.Table_ID)) && !isAddressValidated){ if(header.get(i).contains(MTable.getTableName(Env.getCtx(),MLocation.Table_ID)) && !isAddressValidated){
StringBuilder specialColumns = new StringBuilder(); StringBuilder specialColumns = new StringBuilder();
@ -916,6 +920,7 @@ public class GridTabCSVImporter implements IGridTabImporter
}else if (header.get(i).contains(MTable.getTableName(Env.getCtx(),MLocation.Table_ID)) && isAddressValidated){ }else if (header.get(i).contains(MTable.getTableName(Env.getCtx(),MLocation.Table_ID)) && isAddressValidated){
continue; continue;
} }
}
if(value!=null) if(value!=null)
isEmptyRow=false; isEmptyRow=false;
@ -1067,7 +1072,7 @@ public class GridTabCSVImporter implements IGridTabImporter
if(isForeing) if(isForeing)
foreignColumn = header.get(i).substring(header.get(i).indexOf("[")+1,header.get(i).indexOf("]")); foreignColumn = header.get(i).substring(header.get(i).indexOf("[")+1,header.get(i).indexOf("]"));
if(header.get(i).contains(MTable.getTableName(Env.getCtx(),MLocation.Table_ID))){ if(!"C_Location".equals(gridTab.getTableName()) && header.get(i).contains(MTable.getTableName(Env.getCtx(),MLocation.Table_ID))){
if(address == null){ if(address == null){
if(isInsertMode()){ if(isInsertMode()){
@ -1173,7 +1178,7 @@ public class GridTabCSVImporter implements IGridTabImporter
} else { } else {
int id = resolveForeign(foreignTable, foreignColumn, value,field,trx); int id = resolveForeign(foreignTable, foreignColumn, value,field,trx);
if (id < 0) if(id < 0)
return Msg.getMsg(Env.getCtx(),id==-2?"ForeignMultipleResolved":"ForeignNotResolved",new Object[]{header.get(i),value}); return Msg.getMsg(Env.getCtx(),id==-2?"ForeignMultipleResolved":"ForeignNotResolved",new Object[]{header.get(i),value});
setValue = id; setValue = id;
@ -1219,6 +1224,16 @@ public class GridTabCSVImporter implements IGridTabImporter
}else{ }else{
return Msg.getMsg(Env.getCtx(),"Invalid") + " Column ["+column.getColumnName()+"]"; return Msg.getMsg(Env.getCtx(),"Invalid") + " Column ["+column.getColumnName()+"]";
} }
} else if (DisplayType.isNumeric(field.getDisplayType()) || DisplayType.isID(field.getDisplayType())) {
if (columnName.endsWith("_ID")) {
if (!(value instanceof Integer)) {
Integer idValue = Integer.valueOf(value.toString());
value = idValue;
}
} else if (!(value instanceof BigDecimal)) {
BigDecimal decValue = new BigDecimal(value.toString());
value = decValue;
}
} }
setValue = value; setValue = value;
isThereRow =true; isThereRow =true;
@ -1349,7 +1364,7 @@ public class GridTabCSVImporter implements IGridTabImporter
//Process columnKeys + Foreign to add restrictions. //Process columnKeys + Foreign to add restrictions.
for (int i = startindx ; i < endindx + 1 ; i++){ for (int i = startindx ; i < endindx + 1 ; i++){
boolean isKeyColumn = header.get(i).indexOf("/") > 0 && ( header.get(i).endsWith("K") || header.get(i).endsWith("KT")); boolean isKeyColumn = header.get(i).indexOf("/") > 0 && ( header.get(i).endsWith("K") || header.get(i).endsWith("KT"));
if(isKeyColumn && !header.get(i).contains(MTable.getTableName(Env.getCtx(),MLocation.Table_ID))){ if(isKeyColumn && ("C_Location".equals(gridTab.getTableName()) || !header.get(i).contains(MTable.getTableName(Env.getCtx(),MLocation.Table_ID)))){
boolean isForeing = header.get(i).indexOf("[") > 0 && header.get(i).indexOf("]")>0; boolean isForeing = header.get(i).indexOf("[") > 0 && header.get(i).indexOf("]")>0;
boolean isDetail = header.get(i).indexOf(">") > 0; boolean isDetail = header.get(i).indexOf(">") > 0;
columnwithKey = getColumnName(isKeyColumn,isForeing,isDetail,header.get(i)); columnwithKey = getColumnName(isKeyColumn,isForeing,isDetail,header.get(i));

View File

@ -26,6 +26,8 @@ import org.compiere.print.MPrintFormatItem;
import org.compiere.print.MPrintPaper; import org.compiere.print.MPrintPaper;
import org.compiere.print.PrintData; import org.compiere.print.PrintData;
import org.compiere.print.PrintDataElement; import org.compiere.print.PrintDataElement;
import org.compiere.util.DisplayType;
import org.compiere.util.Util;
/** /**
* Export PrintData to Excel (XLS) file * Export PrintData to Excel (XLS) file
@ -192,4 +194,24 @@ extends AbstractExcelExporter
sheet.setMargin(HSSFSheet.BottomMargin, ((double)paper.getMarginBottom()) / 72); sheet.setMargin(HSSFSheet.BottomMargin, ((double)paper.getMarginBottom()) / 72);
// //
} }
@Override
protected String getCellFormat(int row, int col) {
String cellFormat = null;
PrintDataElement pde = getPDE(row, col);
if (pde != null && !Util.isEmpty(pde.getM_formatPattern())) {
String formatPattern = pde.getM_formatPattern();
int displayType = pde.getDisplayType();
if (DisplayType.isDate(displayType)) {
cellFormat = DisplayType.getDateFormat(displayType, getLanguage(), formatPattern).toPattern();
} else if (DisplayType.isNumeric(displayType)) {
cellFormat = DisplayType.getNumberFormat(displayType, getLanguage(), formatPattern).toPattern();
}
} else {
return super.getCellFormat(row, col);
}
return cellFormat;
}
} }

View File

@ -69,16 +69,16 @@ public class ResetLockedAccount extends SvrProcess {
if (DB.isPostgreSQL()) if (DB.isPostgreSQL())
{ {
if (MAX_ACCOUNT_LOCK_MINUTES > 0) if (MAX_ACCOUNT_LOCK_MINUTES > 0)
sql.append( " AND EXTRACT(MINUTE FROM (now()-DateAccountLocked)) * 24 * 60 > ").append(MAX_ACCOUNT_LOCK_MINUTES); sql.append(" AND EXTRACT(EPOCH FROM (now()-DateAccountLocked)) / 60 > ").append(MAX_ACCOUNT_LOCK_MINUTES);
if (MAX_INACTIVE_PERIOD > 0) if (MAX_INACTIVE_PERIOD > 0)
sql.append(" AND EXTRACT(DAY FROM (now()-DateLastLogin)) * 24 <= ").append(MAX_INACTIVE_PERIOD); sql.append(" AND EXTRACT(EPOCH FROM (now()-DateLastLogin)) / 86400 <= ").append(MAX_INACTIVE_PERIOD);
} }
else else
{ {
if (MAX_ACCOUNT_LOCK_MINUTES > 0) if (MAX_ACCOUNT_LOCK_MINUTES > 0)
sql.append(" AND (SysDate-DateAccountLocked) * 24 * 60 > ").append(MAX_ACCOUNT_LOCK_MINUTES); sql.append(" AND (SysDate-DateAccountLocked) * 1440 > ").append(MAX_ACCOUNT_LOCK_MINUTES);
if (MAX_INACTIVE_PERIOD > 0) if (MAX_INACTIVE_PERIOD > 0)
sql.append(" AND (SysDate-DateLastLogin) * 24 <= ").append(MAX_INACTIVE_PERIOD); sql.append(" AND (SysDate-DateLastLogin) <= ").append(MAX_INACTIVE_PERIOD);
} }
int no = DB.executeUpdate(sql.toString(), p_AD_Client_ID, get_TrxName()); int no = DB.executeUpdate(sql.toString(), p_AD_Client_ID, get_TrxName());

View File

@ -13,11 +13,20 @@
*****************************************************************************/ *****************************************************************************/
package org.compiere.model; package org.compiere.model;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.List; import java.util.List;
import java.util.Properties; import java.util.Properties;
import org.adempiere.exceptions.AdempiereException;
import org.compiere.util.CCache; import org.compiere.util.CCache;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.DB; import org.compiere.util.DB;
@ -133,4 +142,64 @@ public class MImportTemplate extends X_AD_ImportTemplate
return cnt > 0; return cnt > 0;
} }
/**
* Validate that InputStream header is CSVHeader or AliasCSVHeader
* If the header is AliasCSVHeader it replaces it with the CSVHeader so it can be
* processed
* @param in input file
* @return InputStream with the CSVHeader that can be processed by CsvMapReader
*/
public InputStream validateFile(InputStream in) {
// because the input stream cannot be reset we need to copy here the file to a new one (replacing the header if it's the alias)
Charset charset = Charset.forName(getCharacterSet());
BufferedReader reader = new BufferedReader(new InputStreamReader(in, charset));
File tmpfile = null;
InputStream is = null;
BufferedWriter bw = null;
try {
tmpfile = File.createTempFile("CSVImportAction", "csv");
bw = new BufferedWriter(new FileWriter(tmpfile));
String firstLine = null;
String line = null;
while ((line = reader.readLine()) != null) {
if (firstLine == null) {
firstLine = line;
/* Validate that m_file_istream header is CSVHeader or AliasCSVHeader */
if ( firstLine.equals(getCSVHeader())
|| firstLine.equals(getCSVAliasHeader())) {
bw.write(getCSVHeader());
} else {
reader.close();
throw new AdempiereException(Msg.getMsg(Env.getCtx(), "WrongCSVHeader"));
}
} else {
bw.write(line);
}
bw.write('\n');
}
is = new FileInputStream(tmpfile);
} catch (IOException e) {
throw new AdempiereException(e);
} finally {
if (in != null)
try {
in.close();
} catch (IOException e) {
}
if (bw != null)
try {
bw.close();
} catch (IOException e) {
}
if (reader != null)
try {
reader.close();
} catch (IOException e) {
}
}
return is;
}
} // MImportTemplate } // MImportTemplate

View File

@ -61,7 +61,7 @@ public interface DocAction
/** Invalidate = IN */ /** Invalidate = IN */
public static final String ACTION_Invalidate = "IN"; public static final String ACTION_Invalidate = "IN";
/** ReOpen = OP */ /** ReOpen = OP */
public static final String ACTION_ReOpen = "OP"; // public static final String ACTION_ReOpen = "OP";
/** Drafted = DR */ /** Drafted = DR */
public static final String STATUS_Drafted = "DR"; public static final String STATUS_Drafted = "DR";

View File

@ -692,7 +692,7 @@ public class DocumentEngine implements DocAction
ACTION_Post, ACTION_Void}; ACTION_Post, ACTION_Void};
if (isClosed()) if (isClosed())
return new String[] {ACTION_Post, ACTION_ReOpen}; return new String[] {ACTION_Post, ACTION_ReActivate};
if (isReversed() || isVoided()) if (isReversed() || isVoided())
return new String[] {ACTION_Post}; return new String[] {ACTION_Post};
@ -965,11 +965,13 @@ public class DocumentEngine implements DocAction
options[index++] = DocumentEngine.ACTION_Void; options[index++] = DocumentEngine.ACTION_Void;
options[index++] = DocumentEngine.ACTION_Prepare; options[index++] = DocumentEngine.ACTION_Prepare;
} }
/* IDEMPIERE-3599 - commented to allow adding options to these terminal status
// Closed, Voided, REversed .. CL/VO/RE // Closed, Voided, REversed .. CL/VO/RE
else if (docStatus.equals(DocumentEngine.STATUS_Closed) else if (docStatus.equals(DocumentEngine.STATUS_Closed)
|| docStatus.equals(DocumentEngine.STATUS_Voided) || docStatus.equals(DocumentEngine.STATUS_Voided)
|| docStatus.equals(DocumentEngine.STATUS_Reversed)) || docStatus.equals(DocumentEngine.STATUS_Reversed))
return 0; return 0;
*/
/******************** /********************
* Order * Order

View File

@ -111,7 +111,8 @@ public class PipoDictionaryService implements IDictionaryService {
if (logger.isLoggable(Level.INFO)) logger.info("commit " + trxName); if (logger.isLoggable(Level.INFO)) logger.info("commit " + trxName);
} catch (Exception e) { } catch (Exception e) {
adPackageImp.setP_Msg(e.getLocalizedMessage()); adPackageImp.setP_Msg(e.getLocalizedMessage());
packIn.getNotifier().addStatusLine(e.getLocalizedMessage()); packIn.getNotifier().addFailureLine(e.getLocalizedMessage());
packIn.setSuccess(false);
logger.log(Level.SEVERE, "importXML:", e); logger.log(Level.SEVERE, "importXML:", e);
throw e; throw e;
} finally { } finally {

View File

@ -147,7 +147,8 @@ public class PackInProcess extends SvrProcess {
commitEx(); // we need to commit to capture HERE when the deferred validation of foreign keys can fail commitEx(); // we need to commit to capture HERE when the deferred validation of foreign keys can fail
} catch (Exception e) { } catch (Exception e) {
adPackageImp.setP_Msg(e.getLocalizedMessage()); adPackageImp.setP_Msg(e.getLocalizedMessage());
packIn.getNotifier().addStatusLine(e.getLocalizedMessage()); packIn.getNotifier().addFailureLine(e.getLocalizedMessage());
packIn.setSuccess(false);
log.log(Level.SEVERE, "importXML:", e); log.log(Level.SEVERE, "importXML:", e);
throw e; throw e;
} finally { } finally {

View File

@ -24,14 +24,8 @@
**********************************************************************/ **********************************************************************/
package org.adempiere.webui.panel.action; package org.adempiere.webui.panel.action;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File; import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
@ -63,6 +57,8 @@ import org.adempiere.webui.util.ReaderInputStream;
import org.adempiere.webui.util.ZKUpdateUtil; import org.adempiere.webui.util.ZKUpdateUtil;
import org.compiere.model.GridTab; import org.compiere.model.GridTab;
import org.compiere.model.MImportTemplate; import org.compiere.model.MImportTemplate;
import org.compiere.model.MQuery;
import org.compiere.model.MRole;
import org.compiere.util.DB; import org.compiere.util.DB;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.Msg; import org.compiere.util.Msg;
@ -295,6 +291,13 @@ public class CSVImportAction implements EventListener<Event>
private void importFile() { private void importFile() {
try { try {
MQuery query = panel.getActiveGridTab().getQuery();
MQuery detailQuery = null;
if (panel.getADTab() != null && panel.getADTab().getSelectedDetailADTabpanel() != null
&& panel.getADTab().getSelectedDetailADTabpanel().getGridTab() != null)
detailQuery = panel.getADTab().getSelectedDetailADTabpanel().getGridTab().getQuery();
IADTabbox adTab = panel.getADTab(); IADTabbox adTab = panel.getADTab();
int selected = adTab.getSelectedIndex(); int selected = adTab.getSelectedIndex();
int tabLevel = panel.getActiveGridTab().getTabLevel(); int tabLevel = panel.getActiveGridTab().getTabLevel();
@ -330,7 +333,7 @@ public class CSVImportAction implements EventListener<Event>
return; return;
String iMode = (String)importItem.getValue(); String iMode = (String)importItem.getValue();
m_file_istream = validateFile(m_file_istream, theTemplate); m_file_istream = theTemplate.validateFile(m_file_istream);
File outFile = theCSVImporter.fileImport(panel.getActiveGridTab(), childs, m_file_istream, charset,iMode); File outFile = theCSVImporter.fileImport(panel.getActiveGridTab(), childs, m_file_istream, charset,iMode);
winImportFile.onClose(); winImportFile.onClose();
winImportFile = null; winImportFile = null;
@ -339,6 +342,19 @@ public class CSVImportAction implements EventListener<Event>
media = new AMedia(theCSVImporter.getSuggestedFileName(panel.getActiveGridTab()), null, theCSVImporter.getContentType(), outFile, true); media = new AMedia(theCSVImporter.getSuggestedFileName(panel.getActiveGridTab()), null, theCSVImporter.getContentType(), outFile, true);
Filedownload.save(media); Filedownload.save(media);
if (query != null) {
query.addRestriction("1=1");
panel.getActiveGridTab().setQuery(query);
panel.getADTab().getSelectedTabpanel().query(false, 0, MRole.getDefault().getMaxQueryRecords());
}
panel.getActiveGridTab().dataRefresh(false);
if (detailQuery != null){
detailQuery.addRestriction("1=1");
panel.getADTab().getSelectedDetailADTabpanel().getGridTab().setQuery(detailQuery);
panel.getADTab().getSelectedDetailADTabpanel().query(false, 0, MRole.getDefault().getMaxQueryRecords());
panel.getADTab().getSelectedDetailADTabpanel().getGridTab().dataRefresh(false);
}
} catch (Exception e) { } catch (Exception e) {
throw new AdempiereException(e); throw new AdempiereException(e);
} finally { } finally {
@ -347,57 +363,4 @@ public class CSVImportAction implements EventListener<Event>
} }
} }
private InputStream validateFile(InputStream in, MImportTemplate template) {
// because the input stream cannot be reset we need to copy here the file to a new one (replacing the header if it's the alias)
Charset charset = Charset.forName(template.getCharacterSet());
BufferedReader reader = new BufferedReader(new InputStreamReader(in, charset));
File tmpfile = null;
InputStream is = null;
BufferedWriter bw = null;
try {
tmpfile = File.createTempFile("CSVImportAction", "csv");
bw = new BufferedWriter(new FileWriter(tmpfile));
String firstLine = null;
String line = null;
while ((line = reader.readLine()) != null) {
if (firstLine == null) {
firstLine = line;
/* Validate that m_file_istream header is CSVHeader or AliasCSVHeader */
if ( firstLine.equals(template.getCSVHeader())
|| firstLine.equals(template.getCSVAliasHeader())) {
bw.write(template.getCSVHeader());
} else {
reader.close();
throw new AdempiereException(Msg.getMsg(Env.getCtx(), "WrongCSVHeader"));
}
} else {
bw.write(line);
}
bw.write('\n');
}
is = new FileInputStream(tmpfile);
} catch (IOException e) {
throw new AdempiereException(e);
} finally {
if (in != null)
try {
in.close();
} catch (IOException e) {
}
if (bw != null)
try {
bw.close();
} catch (IOException e) {
}
if (reader != null)
try {
reader.close();
} catch (IOException e) {
}
}
return is;
}
} }

View File

@ -134,7 +134,7 @@ public class FindWindow extends Window implements EventListener<Event>, ValueCha
/** /**
* *
*/ */
private static final long serialVersionUID = -4461202150492732658L; private static final long serialVersionUID = -2476692172080549315L;
// values and label for history combo // values and label for history combo
private static final String HISTORY_DAY_ALL = "All"; private static final String HISTORY_DAY_ALL = "All";
@ -1757,7 +1757,7 @@ public class FindWindow extends Window implements EventListener<Event>, ValueCha
uq = new MUserQuery (Env.getCtx(), 0, null); uq = new MUserQuery (Env.getCtx(), 0, null);
uq.setName (name); uq.setName (name);
uq.setAD_Tab_ID(m_AD_Tab_ID); //red1 UserQuery [ 1798539 ] taking in new field from Compiere uq.setAD_Tab_ID(m_AD_Tab_ID); //red1 UserQuery [ 1798539 ] taking in new field from Compiere
uq.setAD_User_ID(Env.getAD_User_ID(Env.getCtx())); //red1 - [ 1798539 ] missing in Compiere delayed source :-) uq.set_ValueOfColumn("AD_User_ID", Env.getAD_User_ID(Env.getCtx())); // required set_Value for System=0 user
} }
} else if (code.length() <= 0){ // Delete the query } else if (code.length() <= 0){ // Delete the query