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
boolean thereIsCountry = false ;
boolean isEmptyRow = true;
Object countryId = null;
int regionIndex = -1;
for(int j= i;j< header.size();j++){
if(!header.get(j).contains(MTable.getTableName(Env.getCtx(),MLocation.Table_ID)))
break;
@ -1079,30 +1081,59 @@ public class GridTabCSVImporter implements IGridTabImporter
String columnName = header.get(j);
Object value = tmpRow.get(j);
if(value!=null){
if(columnName.contains("C_Country_ID"))
if(columnName.contains("C_Country_ID")) {
thereIsCountry= true;
countryId = value;
}
}else
continue;
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;
String foreignColumn = null;
columnName = getColumnName(isKeyColumn,isForeing,isDetail,columnName);
if(isForeing)
columnName = getColumnName(isKeyColumn,isForeign,isDetail,columnName);
if(isForeign)
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);
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 ("C_Region".equals(foreignTable)) {
regionIndex = j;
} 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;
}
MColumn column = MColumn.get(Env.getCtx(), field.getAD_Column_ID());
if((field.isMandatory(true) || column.isMandatory()) && !isEmptyRow && !thereIsCountry)
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;
}
@ -1124,6 +1155,7 @@ public class GridTabCSVImporter implements IGridTabImporter
boolean isThereRow = false;
MLocation address = null;
List<String> parentColumns = new ArrayList<String>();
int regionIndex = -1;
for(int i = startindx ; i < endindx + 1 ; i++){
String columnName = header.get(i);
Object value = map.get(header.get(i));
@ -1135,15 +1167,15 @@ public class GridTabCSVImporter implements IGridTabImporter
continue;
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;
columnName = getColumnName(isKeyColumn,isForeing,isDetail,columnName);
columnName = getColumnName(isKeyColumn,isForeign,isDetail,columnName);
String foreignColumn = null;
Object setValue = null;
if(isForeing)
if(isForeign)
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;
GridField field = gridTab.getField(columnName);
logMsg = gridTab.setValue(field,setValue);
@ -1162,9 +1194,12 @@ public class GridTabCSVImporter implements IGridTabImporter
}
GridField field = gridTab.getField(columnName);
if(!"(null)".equals(value.toString().trim())){
if(isForeing) {
if(isForeign) {
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))
address.setCity(value.toString());
}else
@ -1183,7 +1218,7 @@ public class GridTabCSVImporter implements IGridTabImporter
break;
}
if(isForeing && masterRecord!=null){
if(isForeign && masterRecord!=null){
if (masterRecord.get_Value(foreignColumn).toString().equals(value)){
logMsg = gridTab.setValue(field,masterRecord.get_ID());
if(logMsg.equals(""))
@ -1195,7 +1230,7 @@ public class GridTabCSVImporter implements IGridTabImporter
break;
}
}
}else if(isForeing && masterRecord==null && gridTab.getTabLevel()>0){
}else if(isForeign && masterRecord==null && gridTab.getTabLevel()>0){
Object master =gridTab.getParentTab().getValue(foreignColumn);
if (master!=null && value!=null && !master.toString().equals(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{
MColumn column = MColumn.get(Env.getCtx(),field.getAD_Column_ID());
if (isForeing){
if (isForeign){
String foreignTable = column.getReferenceTableName();
if ("AD_Ref_List".equals(foreignTable)) {
String idS = resolveForeignList(column, foreignColumn, value,trx);
@ -1332,6 +1367,29 @@ public class GridTabCSVImporter implements IGridTabImporter
}
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()){
logMsg = CLogger.retrieveError()+" Address : "+address;
}else {
@ -1656,6 +1714,36 @@ public class GridTabCSVImporter implements IGridTabImporter
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
@SuppressWarnings("unchecked")
private boolean isValueChanged(Object oldValue, Object value)