IDEMPIERE-6218 Failed to import location record when there are multiple region records with the same name (#2444)

This commit is contained in:
Elaine Tan 2024-08-21 17:30:01 +08:00 committed by Carlos Ruiz
parent d4356b7e67
commit c286348cb0
1 changed files with 105 additions and 17 deletions

View File

@ -1067,6 +1067,8 @@ public class GridTabCSVImporter implements IGridTabImporter
//without Country any address would be invalid //without Country any address would be invalid
boolean thereIsCountry = false ; boolean thereIsCountry = false ;
boolean isEmptyRow = true; boolean isEmptyRow = true;
Object countryId = null;
int regionIndex = -1;
for(int j= i;j< header.size();j++){ for(int j= i;j< header.size();j++){
if(!header.get(j).contains(MTable.getTableName(Env.getCtx(),MLocation.Table_ID))) if(!header.get(j).contains(MTable.getTableName(Env.getCtx(),MLocation.Table_ID)))
break; break;
@ -1079,30 +1081,59 @@ public class GridTabCSVImporter implements IGridTabImporter
String columnName = header.get(j); String columnName = header.get(j);
Object value = tmpRow.get(j); Object value = tmpRow.get(j);
if(value!=null){ if(value!=null){
if(columnName.contains("C_Country_ID")) if(columnName.contains("C_Country_ID")) {
thereIsCountry= true; thereIsCountry= true;
countryId = value;
}
}else }else
continue; continue;
boolean isKeyColumn = columnName.indexOf("/") > 0; boolean isKeyColumn = columnName.indexOf("/") > 0;
boolean isForeing = columnName.indexOf("[") > 0 && columnName.indexOf("]")>0; boolean isForeign = columnName.indexOf("[") > 0 && columnName.indexOf("]")>0;
boolean isDetail = columnName.indexOf(">") > 0; boolean isDetail = columnName.indexOf(">") > 0;
String foreignColumn = null; String foreignColumn = null;
columnName = getColumnName(isKeyColumn,isForeing,isDetail,columnName); columnName = getColumnName(isKeyColumn,isForeign,isDetail,columnName);
if(isForeing) if(isForeign)
foreignColumn = header.get(j).substring(header.get(j).indexOf("[")+1, header.get(j).indexOf("]")); foreignColumn = header.get(j).substring(header.get(j).indexOf("[")+1, header.get(j).indexOf("]"));
if(isForeing && !"(null)".equals(value)){ if(isForeign && !"(null)".equals(value)){
String foreignTable = columnName.substring(0,columnName.length()-3); String foreignTable = columnName.substring(0,columnName.length()-3);
Object id = resolveForeign(foreignTable,foreignColumn,value,field,null); if ("C_Region".equals(foreignTable)) {
if (id == null || (id instanceof Integer && (int)id < 0)) regionIndex = j;
return new StringBuilder(Msg.getMsg(Env.getCtx(),(id instanceof Integer && (int)id==-2)?"ForeignMultipleResolved":"ForeignNotResolved" ,new Object[]{header.get(j),value})); } else {
Object id = resolveForeign(foreignTable,foreignColumn,value,field,null);
if (id == null || (id instanceof Integer && (int)id < 0))
return new StringBuilder(Msg.getMsg(Env.getCtx(),(id instanceof Integer && (int)id==-2)?"ForeignMultipleResolved":"ForeignNotResolved" ,new Object[]{header.get(j),value}));
if (columnName.contains("C_Country_ID")) {
countryId = id;
}
}
} }
isEmptyRow=false; isEmptyRow=false;
} }
MColumn column = MColumn.get(Env.getCtx(), field.getAD_Column_ID()); MColumn column = MColumn.get(Env.getCtx(), field.getAD_Column_ID());
if((field.isMandatory(true) || column.isMandatory()) && !isEmptyRow && !thereIsCountry) if((field.isMandatory(true) || column.isMandatory()) && !isEmptyRow && !thereIsCountry)
return new StringBuilder(Msg.getMsg(Env.getCtx(), "FillMandatory")+" "+field.getColumnName()+"["+"C_Country_ID]"); return new StringBuilder(Msg.getMsg(Env.getCtx(), "FillMandatory")+" "+field.getColumnName()+"["+"C_Country_ID]");
if (countryId != null && regionIndex != -1) {
String columnName = header.get(regionIndex);
Object value = tmpRow.get(regionIndex);
boolean isKeyColumn = columnName.indexOf("/") > 0;
boolean isForeign = columnName.indexOf("[") > 0 && columnName.indexOf("]") > 0;
boolean isDetail = columnName.indexOf(">") > 0;
String foreignColumn = null;
columnName = getColumnName(isKeyColumn, isForeign, isDetail, columnName);
if (isForeign)
foreignColumn = header.get(regionIndex).substring(header.get(regionIndex).indexOf("[") + 1, header.get(regionIndex).indexOf("]"));
if (isForeign && !"(null)".equals(value)) {
int id = resolveForeignRegionByCountry(foreignColumn, value, field, null, (Integer) countryId);
if (id < 0)
return new StringBuilder(Msg.getMsg(Env.getCtx(), id == -2 ? "ForeignMultipleResolved" : "ForeignNotResolved",new Object[] { header.get(regionIndex), value }));
}
}
} }
return null; return null;
} }
@ -1124,6 +1155,7 @@ public class GridTabCSVImporter implements IGridTabImporter
boolean isThereRow = false; boolean isThereRow = false;
MLocation address = null; MLocation address = null;
List<String> parentColumns = new ArrayList<String>(); List<String> parentColumns = new ArrayList<String>();
int regionIndex = -1;
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 = map.get(header.get(i)); Object value = map.get(header.get(i));
@ -1135,15 +1167,15 @@ public class GridTabCSVImporter implements IGridTabImporter
continue; continue;
boolean isKeyColumn= columnName.indexOf("/") > 0; boolean isKeyColumn= columnName.indexOf("/") > 0;
boolean isForeing = columnName.indexOf("[") > 0 && columnName.indexOf("]")>0; boolean isForeign = columnName.indexOf("[") > 0 && columnName.indexOf("]")>0;
isDetail = columnName.indexOf(">") > 0; isDetail = columnName.indexOf(">") > 0;
columnName = getColumnName(isKeyColumn,isForeing,isDetail,columnName); columnName = getColumnName(isKeyColumn,isForeign,isDetail,columnName);
String foreignColumn = null; String foreignColumn = null;
Object setValue = null; Object setValue = null;
if(isForeing) if(isForeign)
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(!isForeing && !isKeyColumn && ("AD_Language".equals(columnName) || "EntityType".equals(columnName))) { if(!isForeign && !isKeyColumn && ("AD_Language".equals(columnName) || "EntityType".equals(columnName))) {
setValue = value; setValue = value;
GridField field = gridTab.getField(columnName); GridField field = gridTab.getField(columnName);
logMsg = gridTab.setValue(field,setValue); logMsg = gridTab.setValue(field,setValue);
@ -1162,9 +1194,12 @@ public class GridTabCSVImporter implements IGridTabImporter
} }
GridField field = gridTab.getField(columnName); GridField field = gridTab.getField(columnName);
if(!"(null)".equals(value.toString().trim())){ if(!"(null)".equals(value.toString().trim())){
if(isForeing) { if(isForeign) {
String foreignTable = columnName.substring(0,columnName.length()-3); String foreignTable = columnName.substring(0,columnName.length()-3);
setValue = resolveForeign(foreignTable,foreignColumn,value,field,trx); if("C_Region".equals(foreignTable))
regionIndex = i;
else
setValue = resolveForeign(foreignTable,foreignColumn,value,field,trx);
if("C_City".equals(foreignTable)) if("C_City".equals(foreignTable))
address.setCity(value.toString()); address.setCity(value.toString());
}else }else
@ -1183,7 +1218,7 @@ public class GridTabCSVImporter implements IGridTabImporter
break; break;
} }
if(isForeing && masterRecord!=null){ if(isForeign && masterRecord!=null){
if (masterRecord.get_Value(foreignColumn).toString().equals(value)){ if (masterRecord.get_Value(foreignColumn).toString().equals(value)){
logMsg = gridTab.setValue(field,masterRecord.get_ID()); logMsg = gridTab.setValue(field,masterRecord.get_ID());
if(logMsg.equals("")) if(logMsg.equals(""))
@ -1195,7 +1230,7 @@ public class GridTabCSVImporter implements IGridTabImporter
break; break;
} }
} }
}else if(isForeing && masterRecord==null && gridTab.getTabLevel()>0){ }else if(isForeign && masterRecord==null && gridTab.getTabLevel()>0){
Object master =gridTab.getParentTab().getValue(foreignColumn); Object master =gridTab.getParentTab().getValue(foreignColumn);
if (master!=null && value!=null && !master.toString().equals(value)){ if (master!=null && value!=null && !master.toString().equals(value)){
logMsg = header.get(i)+" - "+Msg.getMsg(Env.getCtx(),"DiffParentValue", new Object[] {master.toString(),value}); logMsg = header.get(i)+" - "+Msg.getMsg(Env.getCtx(),"DiffParentValue", new Object[] {master.toString(),value});
@ -1238,7 +1273,7 @@ public class GridTabCSVImporter implements IGridTabImporter
}else{ }else{
MColumn column = MColumn.get(Env.getCtx(),field.getAD_Column_ID()); MColumn column = MColumn.get(Env.getCtx(),field.getAD_Column_ID());
if (isForeing){ if (isForeign){
String foreignTable = column.getReferenceTableName(); String foreignTable = column.getReferenceTableName();
if ("AD_Ref_List".equals(foreignTable)) { if ("AD_Ref_List".equals(foreignTable)) {
String idS = resolveForeignList(column, foreignColumn, value,trx); String idS = resolveForeignList(column, foreignColumn, value,trx);
@ -1332,6 +1367,29 @@ public class GridTabCSVImporter implements IGridTabImporter
} }
if(address!=null){ if(address!=null){
if (regionIndex != -1 && address.getC_Country_ID() > 0) {
String columnName = header.get(regionIndex);
Object value = map.get(header.get(regionIndex));
boolean isDetail = false;
boolean isKeyColumn= columnName.indexOf("/") > 0;
boolean isForeign = columnName.indexOf("[") > 0 && columnName.indexOf("]")>0;
isDetail = columnName.indexOf(">") > 0;
columnName = getColumnName(isKeyColumn,isForeign,isDetail,columnName);
String foreignColumn = null;
Object setValue = null;
if(isForeign)
foreignColumn = header.get(regionIndex).substring(header.get(regionIndex).indexOf("[")+1,header.get(regionIndex).indexOf("]"));
GridField field = gridTab.getField(columnName);
if(!"(null)".equals(value.toString().trim())){
if(isForeign) {
setValue = resolveForeignRegionByCountry(foreignColumn, value, field, trx, address.getC_Country_ID());
}else
setValue = value;
}
address.set_ValueOfColumn(columnName,setValue);
}
if (!address.save()){ if (!address.save()){
logMsg = CLogger.retrieveError()+" Address : "+address; logMsg = CLogger.retrieveError()+" Address : "+address;
}else { }else {
@ -1656,6 +1714,36 @@ public class GridTabCSVImporter implements IGridTabImporter
return -3; // no values found, error ForeignNotResolved return -3; // no values found, error ForeignNotResolved
} }
private int resolveForeignRegionByCountry(String foreignColumn, Object regionValue, GridField field, Trx trx, int countryId) {
String foreignTable = "C_Region";
boolean systemAccess = true;
int thisClientId = Env.getAD_Client_ID(Env.getCtx());
StringBuilder postSelect = new StringBuilder(" FROM ")
.append(foreignTable).append(" WHERE ")
.append(foreignColumn).append("=? AND C_Country_ID=? AND IsActive='Y' AND AD_Client_ID=?");
StringBuilder selectCount = new StringBuilder("SELECT COUNT(*)").append(postSelect);
StringBuilder selectId = new StringBuilder("SELECT ").append(foreignTable).append("_ID").append(postSelect);
int count = DB.getSQLValueEx(trxName, selectCount.toString(), regionValue, countryId, thisClientId);
if (count == 1) { // single value found, OK
return DB.getSQLValueEx(trxName, selectId.toString(), regionValue, countryId, thisClientId);
} else if (count > 1) { // multiple values found, error ForeignMultipleResolved
return -2;
} else if (count == 0) { // no values found, error ForeignNotResolved
if (systemAccess && thisClientId != 0) {
// not found in client, try with System
count = DB.getSQLValueEx(trxName, selectCount.toString(), regionValue, countryId, 0 /* System */);
if (count == 1) { // single value found, OK
return DB.getSQLValueEx(trxName, selectId.toString(), regionValue, countryId, 0 /* System */);
} else if (count > 1) { // multiple values found, error ForeignMultipleResolved
return -2;
}
}
}
return -3; // no values found, error ForeignNotResolved
}
//Copy from GridTable //Copy from GridTable
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private boolean isValueChanged(Object oldValue, Object value) private boolean isValueChanged(Object oldValue, Object value)