hg merge release-2.1 (merge release2.1 into development)

This commit is contained in:
Carlos Ruiz 2015-02-25 19:20:43 -05:00
commit bb9b63bdc7
18 changed files with 182 additions and 80 deletions

View File

@ -570,7 +570,7 @@ public class CalloutInOut extends CalloutEngine
if (isCalloutActive() || value == null) if (isCalloutActive() || value == null)
return ""; return "";
int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, "M_Product_ID"); int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "M_Product_ID");
// log.log(Level.WARNING,"qty - init - M_Product_ID=" + M_Product_ID); // log.log(Level.WARNING,"qty - init - M_Product_ID=" + M_Product_ID);
BigDecimal MovementQty, QtyEntered; BigDecimal MovementQty, QtyEntered;
@ -606,7 +606,7 @@ public class CalloutInOut extends CalloutEngine
mTab.setValue("MovementQty", MovementQty); mTab.setValue("MovementQty", MovementQty);
} }
// No UOM defined // No UOM defined
else if (Env.getContextAsInt(ctx, WindowNo, "C_UOM_ID") == 0) else if (Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "C_UOM_ID") == 0)
{ {
QtyEntered = (BigDecimal)mTab.getValue("QtyEntered"); QtyEntered = (BigDecimal)mTab.getValue("QtyEntered");
mTab.setValue("MovementQty", QtyEntered); mTab.setValue("MovementQty", QtyEntered);
@ -614,7 +614,7 @@ public class CalloutInOut extends CalloutEngine
// QtyEntered changed - calculate MovementQty // QtyEntered changed - calculate MovementQty
else if (mField.getColumnName().equals("QtyEntered")) else if (mField.getColumnName().equals("QtyEntered"))
{ {
int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, "C_UOM_ID"); int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "C_UOM_ID");
QtyEntered = (BigDecimal)value; QtyEntered = (BigDecimal)value;
BigDecimal QtyEntered1 = QtyEntered.setScale(MUOM.getPrecision(ctx, C_UOM_To_ID), BigDecimal.ROUND_HALF_UP); BigDecimal QtyEntered1 = QtyEntered.setScale(MUOM.getPrecision(ctx, C_UOM_To_ID), BigDecimal.ROUND_HALF_UP);
if (QtyEntered.compareTo(QtyEntered1) != 0) if (QtyEntered.compareTo(QtyEntered1) != 0)
@ -639,7 +639,7 @@ public class CalloutInOut extends CalloutEngine
// MovementQty changed - calculate QtyEntered (should not happen) // MovementQty changed - calculate QtyEntered (should not happen)
else if (mField.getColumnName().equals("MovementQty")) else if (mField.getColumnName().equals("MovementQty"))
{ {
int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, "C_UOM_ID"); int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "C_UOM_ID");
MovementQty = (BigDecimal)value; MovementQty = (BigDecimal)value;
int precision = MProduct.get(ctx, M_Product_ID).getUOMPrecision(); int precision = MProduct.get(ctx, M_Product_ID).getUOMPrecision();
BigDecimal MovementQty1 = MovementQty.setScale(precision, BigDecimal.ROUND_HALF_UP); BigDecimal MovementQty1 = MovementQty.setScale(precision, BigDecimal.ROUND_HALF_UP);
@ -683,9 +683,9 @@ public class CalloutInOut extends CalloutEngine
if (M_ASI_ID == null || M_ASI_ID.intValue() == 0) if (M_ASI_ID == null || M_ASI_ID.intValue() == 0)
return ""; return "";
// //
int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, "M_Product_ID"); int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "M_Product_ID");
int M_Warehouse_ID = Env.getContextAsInt(ctx, WindowNo, "M_Warehouse_ID"); int M_Warehouse_ID = Env.getContextAsInt(ctx, WindowNo, "M_Warehouse_ID");
int M_Locator_ID = Env.getContextAsInt(ctx, WindowNo, "M_Locator_ID"); int M_Locator_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "M_Locator_ID");
if (log.isLoggable(Level.FINE)) log.fine("M_Product_ID=" + M_Product_ID if (log.isLoggable(Level.FINE)) log.fine("M_Product_ID=" + M_Product_ID
+ ", M_ASI_ID=" + M_ASI_ID + ", M_ASI_ID=" + M_ASI_ID
+ " - M_Warehouse_ID=" + M_Warehouse_ID + " - M_Warehouse_ID=" + M_Warehouse_ID

View File

@ -319,7 +319,7 @@ public class CalloutInvoice extends CalloutEngine
/***** Price Calculation see also qty ****/ /***** Price Calculation see also qty ****/
boolean IsSOTrx = Env.getContext(ctx, WindowNo, "IsSOTrx").equals("Y"); boolean IsSOTrx = Env.getContext(ctx, WindowNo, "IsSOTrx").equals("Y");
int C_BPartner_ID = Env.getContextAsInt(ctx, WindowNo, WindowNo, "C_BPartner_ID"); int C_BPartner_ID = Env.getContextAsInt(ctx, WindowNo, "C_BPartner_ID");
BigDecimal Qty = (BigDecimal)mTab.getValue("QtyInvoiced"); BigDecimal Qty = (BigDecimal)mTab.getValue("QtyInvoiced");
MProductPricing pp = new MProductPricing (M_Product_ID.intValue(), C_BPartner_ID, Qty, IsSOTrx); MProductPricing pp = new MProductPricing (M_Product_ID.intValue(), C_BPartner_ID, Qty, IsSOTrx);
// //
@ -444,12 +444,12 @@ public class CalloutInvoice extends CalloutEngine
if (column.equals("M_Product_ID")) if (column.equals("M_Product_ID"))
M_Product_ID = ((Integer)value).intValue(); M_Product_ID = ((Integer)value).intValue();
else else
M_Product_ID = Env.getContextAsInt(ctx, WindowNo, "M_Product_ID"); M_Product_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "M_Product_ID");
int C_Charge_ID = 0; int C_Charge_ID = 0;
if (column.equals("C_Charge_ID")) if (column.equals("C_Charge_ID"))
C_Charge_ID = ((Integer)value).intValue(); C_Charge_ID = ((Integer)value).intValue();
else else
C_Charge_ID = Env.getContextAsInt(ctx, WindowNo, "C_Charge_ID"); C_Charge_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "C_Charge_ID");
if (log.isLoggable(Level.FINE)) log.fine("Product=" + M_Product_ID + ", C_Charge_ID=" + C_Charge_ID); if (log.isLoggable(Level.FINE)) log.fine("Product=" + M_Product_ID + ", C_Charge_ID=" + C_Charge_ID);
if (M_Product_ID == 0 && C_Charge_ID == 0) if (M_Product_ID == 0 && C_Charge_ID == 0)
return amt (ctx, WindowNo, mTab, mField, value); // return amt (ctx, WindowNo, mTab, mField, value); //
@ -506,8 +506,8 @@ public class CalloutInvoice extends CalloutEngine
return ""; return "";
// log.log(Level.WARNING,"amt - init"); // log.log(Level.WARNING,"amt - init");
int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, "C_UOM_ID"); int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "C_UOM_ID");
int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, "M_Product_ID"); int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "M_Product_ID");
int M_PriceList_ID = Env.getContextAsInt(ctx, WindowNo, "M_PriceList_ID"); int M_PriceList_ID = Env.getContextAsInt(ctx, WindowNo, "M_PriceList_ID");
int StdPrecision = MPriceList.getStandardPrecision(ctx, M_PriceList_ID); int StdPrecision = MPriceList.getStandardPrecision(ctx, M_PriceList_ID);
MPriceList pl = new MPriceList(ctx, M_PriceList_ID, null); MPriceList pl = new MPriceList(ctx, M_PriceList_ID, null);
@ -732,7 +732,7 @@ public class CalloutInvoice extends CalloutEngine
if (isCalloutActive() || value == null) if (isCalloutActive() || value == null)
return ""; return "";
int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, "M_Product_ID"); int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "M_Product_ID");
// log.log(Level.WARNING,"qty - init - M_Product_ID=" + M_Product_ID); // log.log(Level.WARNING,"qty - init - M_Product_ID=" + M_Product_ID);
BigDecimal QtyInvoiced, QtyEntered, PriceActual, PriceEntered; BigDecimal QtyInvoiced, QtyEntered, PriceActual, PriceEntered;
@ -776,7 +776,7 @@ public class CalloutInvoice extends CalloutEngine
// QtyEntered changed - calculate QtyInvoiced // QtyEntered changed - calculate QtyInvoiced
else if (mField.getColumnName().equals("QtyEntered")) else if (mField.getColumnName().equals("QtyEntered"))
{ {
int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, "C_UOM_ID"); int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "C_UOM_ID");
QtyEntered = (BigDecimal)value; QtyEntered = (BigDecimal)value;
BigDecimal QtyEntered1 = QtyEntered.setScale(MUOM.getPrecision(ctx, C_UOM_To_ID), BigDecimal.ROUND_HALF_UP); BigDecimal QtyEntered1 = QtyEntered.setScale(MUOM.getPrecision(ctx, C_UOM_To_ID), BigDecimal.ROUND_HALF_UP);
if (QtyEntered.compareTo(QtyEntered1) != 0) if (QtyEntered.compareTo(QtyEntered1) != 0)
@ -801,7 +801,7 @@ public class CalloutInvoice extends CalloutEngine
// QtyInvoiced changed - calculate QtyEntered (should not happen) // QtyInvoiced changed - calculate QtyEntered (should not happen)
else if (mField.getColumnName().equals("QtyInvoiced")) else if (mField.getColumnName().equals("QtyInvoiced"))
{ {
int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, "C_UOM_ID"); int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "C_UOM_ID");
QtyInvoiced = (BigDecimal)value; QtyInvoiced = (BigDecimal)value;
int precision = MProduct.get(ctx, M_Product_ID).getUOMPrecision(); int precision = MProduct.get(ctx, M_Product_ID).getUOMPrecision();
BigDecimal QtyInvoiced1 = QtyInvoiced.setScale(precision, BigDecimal.ROUND_HALF_UP); BigDecimal QtyInvoiced1 = QtyInvoiced.setScale(precision, BigDecimal.ROUND_HALF_UP);

View File

@ -76,7 +76,7 @@ public class CalloutMovement extends CalloutEngine
if (isCalloutActive() || value == null) if (isCalloutActive() || value == null)
return ""; return "";
int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, "M_Product_ID"); int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "M_Product_ID");
checkQtyAvailable(ctx, mTab, WindowNo, M_Product_ID, (BigDecimal)value); checkQtyAvailable(ctx, mTab, WindowNo, M_Product_ID, (BigDecimal)value);
// //
return ""; return "";
@ -95,7 +95,7 @@ public class CalloutMovement extends CalloutEngine
public String locator(Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) { public String locator(Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) {
if (value == null) if (value == null)
return ""; return "";
int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, "M_Product_ID"); int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "M_Product_ID");
checkQtyAvailable(ctx, mTab, WindowNo, M_Product_ID, null); checkQtyAvailable(ctx, mTab, WindowNo, M_Product_ID, null);
return ""; return "";
} }
@ -116,11 +116,11 @@ public class CalloutMovement extends CalloutEngine
if (product.isStocked()) { if (product.isStocked()) {
if (MovementQty == null) if (MovementQty == null)
MovementQty = (BigDecimal) mTab.getValue("MovementQty"); MovementQty = (BigDecimal) mTab.getValue("MovementQty");
int M_Locator_ID = Env.getContextAsInt(ctx, WindowNo, "M_Locator_ID"); int M_Locator_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "M_Locator_ID");
// If no locator, don't check anything and assume is ok // If no locator, don't check anything and assume is ok
if (M_Locator_ID <= 0) if (M_Locator_ID <= 0)
return; return;
int M_AttributeSetInstance_ID = Env.getContextAsInt(ctx, WindowNo, "M_AttributeSetInstance_ID"); int M_AttributeSetInstance_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "M_AttributeSetInstance_ID");
BigDecimal available = MStorageOnHand.getQtyOnHandForLocator(M_Product_ID, M_Locator_ID, M_AttributeSetInstance_ID, null); BigDecimal available = MStorageOnHand.getQtyOnHandForLocator(M_Product_ID, M_Locator_ID, M_AttributeSetInstance_ID, null);
if (available == null) if (available == null)

View File

@ -841,7 +841,7 @@ public class CalloutOrder extends CalloutEngine
{ {
BigDecimal QtyOrdered = (BigDecimal)mTab.getValue("QtyOrdered"); BigDecimal QtyOrdered = (BigDecimal)mTab.getValue("QtyOrdered");
int M_Warehouse_ID = Env.getContextAsInt(ctx, WindowNo, "M_Warehouse_ID"); int M_Warehouse_ID = Env.getContextAsInt(ctx, WindowNo, "M_Warehouse_ID");
int M_AttributeSetInstance_ID = Env.getContextAsInt(ctx, WindowNo, "M_AttributeSetInstance_ID"); int M_AttributeSetInstance_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "M_AttributeSetInstance_ID");
BigDecimal available = MStorageReservation.getQtyAvailable BigDecimal available = MStorageReservation.getQtyAvailable
(M_Warehouse_ID, M_Product_ID.intValue(), M_AttributeSetInstance_ID, null); (M_Warehouse_ID, M_Product_ID.intValue(), M_AttributeSetInstance_ID, null);
if (available == null) if (available == null)
@ -961,12 +961,12 @@ public class CalloutOrder extends CalloutEngine
if (column.equals("M_Product_ID")) if (column.equals("M_Product_ID"))
M_Product_ID = ((Integer)value).intValue(); M_Product_ID = ((Integer)value).intValue();
else else
M_Product_ID = Env.getContextAsInt(ctx, WindowNo, "M_Product_ID"); M_Product_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "M_Product_ID");
int C_Charge_ID = 0; int C_Charge_ID = 0;
if (column.equals("C_Charge_ID")) if (column.equals("C_Charge_ID"))
C_Charge_ID = ((Integer)value).intValue(); C_Charge_ID = ((Integer)value).intValue();
else else
C_Charge_ID = Env.getContextAsInt(ctx, WindowNo, "C_Charge_ID"); C_Charge_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "C_Charge_ID");
if (log.isLoggable(Level.FINE)) log.fine("Product=" + M_Product_ID + ", C_Charge_ID=" + C_Charge_ID); if (log.isLoggable(Level.FINE)) log.fine("Product=" + M_Product_ID + ", C_Charge_ID=" + C_Charge_ID);
if (M_Product_ID == 0 && C_Charge_ID == 0) if (M_Product_ID == 0 && C_Charge_ID == 0)
return amt(ctx, WindowNo, mTab, mField, value); // return amt(ctx, WindowNo, mTab, mField, value); //
@ -1034,9 +1034,9 @@ public class CalloutOrder extends CalloutEngine
return ""; return "";
if (steps) log.warning("init"); if (steps) log.warning("init");
int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, "C_UOM_ID"); int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "C_UOM_ID");
int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, "M_Product_ID"); int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "M_Product_ID");
int M_PriceList_ID = Env.getContextAsInt(ctx, WindowNo, "M_PriceList_ID"); int M_PriceList_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "M_PriceList_ID");
int StdPrecision = MPriceList.getStandardPrecision(ctx, M_PriceList_ID); int StdPrecision = MPriceList.getStandardPrecision(ctx, M_PriceList_ID);
MPriceList pl = new MPriceList(ctx, M_PriceList_ID, null); MPriceList pl = new MPriceList(ctx, M_PriceList_ID, null);
boolean isEnforcePriceLimit = pl.isEnforcePriceLimit(); boolean isEnforcePriceLimit = pl.isEnforcePriceLimit();
@ -1211,7 +1211,7 @@ public class CalloutOrder extends CalloutEngine
{ {
if (isCalloutActive() || value == null) if (isCalloutActive() || value == null)
return ""; return "";
int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, "M_Product_ID"); int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "M_Product_ID");
if (steps) log.warning("init - M_Product_ID=" + M_Product_ID + " - " ); if (steps) log.warning("init - M_Product_ID=" + M_Product_ID + " - " );
BigDecimal QtyOrdered = Env.ZERO; BigDecimal QtyOrdered = Env.ZERO;
BigDecimal QtyEntered, PriceActual, PriceEntered; BigDecimal QtyEntered, PriceActual, PriceEntered;
@ -1257,7 +1257,7 @@ public class CalloutOrder extends CalloutEngine
// QtyEntered changed - calculate QtyOrdered // QtyEntered changed - calculate QtyOrdered
else if (mField.getColumnName().equals("QtyEntered")) else if (mField.getColumnName().equals("QtyEntered"))
{ {
int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, "C_UOM_ID"); int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "C_UOM_ID");
QtyEntered = (BigDecimal)value; QtyEntered = (BigDecimal)value;
BigDecimal QtyEntered1 = QtyEntered.setScale(MUOM.getPrecision(ctx, C_UOM_To_ID), BigDecimal.ROUND_HALF_UP); BigDecimal QtyEntered1 = QtyEntered.setScale(MUOM.getPrecision(ctx, C_UOM_To_ID), BigDecimal.ROUND_HALF_UP);
if (QtyEntered.compareTo(QtyEntered1) != 0) if (QtyEntered.compareTo(QtyEntered1) != 0)
@ -1282,7 +1282,7 @@ public class CalloutOrder extends CalloutEngine
// QtyOrdered changed - calculate QtyEntered (should not happen) // QtyOrdered changed - calculate QtyEntered (should not happen)
else if (mField.getColumnName().equals("QtyOrdered")) else if (mField.getColumnName().equals("QtyOrdered"))
{ {
int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, "C_UOM_ID"); int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "C_UOM_ID");
QtyOrdered = (BigDecimal)value; QtyOrdered = (BigDecimal)value;
int precision = MProduct.get(ctx, M_Product_ID).getUOMPrecision(); int precision = MProduct.get(ctx, M_Product_ID).getUOMPrecision();
BigDecimal QtyOrdered1 = QtyOrdered.setScale(precision, BigDecimal.ROUND_HALF_UP); BigDecimal QtyOrdered1 = QtyOrdered.setScale(precision, BigDecimal.ROUND_HALF_UP);
@ -1320,7 +1320,7 @@ public class CalloutOrder extends CalloutEngine
if (product.isStocked()) if (product.isStocked())
{ {
int M_Warehouse_ID = Env.getContextAsInt(ctx, WindowNo, "M_Warehouse_ID"); int M_Warehouse_ID = Env.getContextAsInt(ctx, WindowNo, "M_Warehouse_ID");
int M_AttributeSetInstance_ID = Env.getContextAsInt(ctx, WindowNo, "M_AttributeSetInstance_ID"); int M_AttributeSetInstance_ID = Env.getContextAsInt(ctx, WindowNo, mTab.getTabNo(), "M_AttributeSetInstance_ID");
BigDecimal available = MStorageReservation.getQtyAvailable BigDecimal available = MStorageReservation.getQtyAvailable
(M_Warehouse_ID, M_Product_ID, M_AttributeSetInstance_ID, null); (M_Warehouse_ID, M_Product_ID, M_AttributeSetInstance_ID, null);
if (available == null) if (available == null)

View File

@ -781,7 +781,7 @@ public class MProductPricing
return; return;
MDiscountSchema sd = MDiscountSchema.get(Env.getCtx(), M_DiscountSchema_ID); // not correct MDiscountSchema sd = MDiscountSchema.get(Env.getCtx(), M_DiscountSchema_ID); // not correct
if (sd.get_ID() == 0 || (MDiscountSchema.DISCOUNTTYPE_Breaks.equals(sd.getDiscountType()) && MDiscountSchema.CUMULATIVELEVEL_Line.equals(sd.getCumulativeLevel()))) if (sd.get_ID() == 0 || (MDiscountSchema.DISCOUNTTYPE_Breaks.equals(sd.getDiscountType()) && !MDiscountSchema.CUMULATIVELEVEL_Line.equals(sd.getCumulativeLevel())))
return; return;
// //
m_discountSchema = true; m_discountSchema = true;

View File

@ -3938,6 +3938,15 @@ public abstract class PO
int id = get_ID(); int id = get_ID();
if (id == 0) if (id == 0)
id = get_IDOld(); id = get_IDOld();
// IDEMPIERE-2453
StringBuilder countSql = new StringBuilder("SELECT COUNT(*) FROM ")
.append(MTree_Base.getNodeTableName(treeType))
.append(" WHERE Parent_ID=?");
int cnt = DB.getSQLValue( get_TrxName(), countSql.toString(), id);
if (cnt > 0)
throw new AdempiereException(Msg.getMsg(Env.getCtx(),"NoParentDelete", new Object[] {cnt}));
StringBuilder sb = new StringBuilder ("DELETE FROM ") StringBuilder sb = new StringBuilder ("DELETE FROM ")
.append(MTree_Base.getNodeTableName(treeType)) .append(MTree_Base.getNodeTableName(treeType))
.append(" n WHERE Node_ID=").append(id) .append(" n WHERE Node_ID=").append(id)

View File

@ -39,7 +39,7 @@ public class PrintDataElement implements Serializable
/** /**
* *
*/ */
private static final long serialVersionUID = 2177482817458457236L; private static final long serialVersionUID = -2121125127301364735L;
/** /**
* Print Data Element Constructor * Print Data Element Constructor
@ -129,6 +129,13 @@ public class PrintDataElement implements Serializable
return m_foreignColumnName; return m_foreignColumnName;
} }
/**
* Set ForeignName
* @return name
*/
public void setForeignColumnName(String foreignColumnName) {
m_foreignColumnName = foreignColumnName;
}
/** /**
* Get Node Value * Get Node Value

View File

@ -72,6 +72,8 @@ import org.compiere.model.MPaySelectionCheck;
import org.compiere.model.MProject; import org.compiere.model.MProject;
import org.compiere.model.MQuery; import org.compiere.model.MQuery;
import org.compiere.model.MRfQResponse; import org.compiere.model.MRfQResponse;
import org.compiere.model.MRole;
import org.compiere.model.MTable;
import org.compiere.model.PrintInfo; import org.compiere.model.PrintInfo;
import static org.compiere.model.SystemIDs.*; import static org.compiere.model.SystemIDs.*;
@ -652,16 +654,49 @@ queued-job-count = 0 (class javax.print.attribute.standard.QueuedJobCount)
String value = pde.getValueDisplay(language); // formatted String value = pde.getValueDisplay(language); // formatted
if (pde.getColumnName().endsWith("_ID") && extension != null) if (pde.getColumnName().endsWith("_ID") && extension != null)
{ {
//link for column boolean isZoom = false;
a href = new a("javascript:void(0)"); if (item.getColumnName().equals("Record_ID")) {
href.setID(pde.getColumnName() + "_" + row + "_a"); Object tablePDE = m_printData.getNode("AD_Table_ID");
td.addElement(href); if (tablePDE != null && tablePDE instanceof PrintDataElement) {
href.addElement(Util.maskHTML(value)); int tableID = -1;
if (cssPrefix != null) try {
href.setClass(cssPrefix + "-href"); tableID = Integer.parseInt(((PrintDataElement)tablePDE).getValueAsString());
} catch (Exception e) {
extension.extendIDColumn(row, td, href, pde); tableID = -1;
}
if (tableID > 0) {
MTable mTable = MTable.get(getCtx(), tableID);
String foreignColumnName = mTable.getTableName() + "_ID";
pde.setForeignColumnName(foreignColumnName);
isZoom = true;
}
}
} else {
isZoom = true;
}
if (isZoom) {
// check permission on the zoomed window
MTable mTable = MTable.get(getCtx(), pde.getForeignColumnName().substring(0, pde.getForeignColumnName().length()-3));
int Record_ID = Integer.parseInt(pde.getValueAsString());
int AD_Window_ID = Env.getZoomWindowID(mTable.get_ID(), Record_ID);
Boolean canAccess = MRole.getDefault().getWindowAccess(AD_Window_ID);
if (canAccess == null) {
isZoom = false;
}
}
if (isZoom) {
//link for column
a href = new a("javascript:void(0)");
href.setID(pde.getColumnName() + "_" + row + "_a");
td.addElement(href);
href.addElement(Util.maskHTML(value));
if (cssPrefix != null)
href.setClass(cssPrefix + "-href");
extension.extendIDColumn(row, td, href, pde);
} else {
td.addElement(Util.maskHTML(value));
}
} }
else else
{ {

View File

@ -121,7 +121,7 @@ public class CommonTranslationHandler extends AbstractElementHandler implements
if(columnName.equalsIgnoreCase("IsActive") || if(columnName.equalsIgnoreCase("IsActive") ||
columnName.equalsIgnoreCase("IsTranslated")){ columnName.equalsIgnoreCase("IsTranslated")){
value = "true".equals(value) ? "Y" : "N"; value = "true".equals(value) || "Y".equals(value) ? "Y" : "N";
} }
pstm.setString(i, value); pstm.setString(i, value);
} }
@ -161,7 +161,7 @@ public class CommonTranslationHandler extends AbstractElementHandler implements
if(columnName.equalsIgnoreCase("IsActive") || if(columnName.equalsIgnoreCase("IsActive") ||
columnName.equalsIgnoreCase("IsTranslated")){ columnName.equalsIgnoreCase("IsTranslated")){
value = "true".equals(value) ? "Y" : "N"; value = "true".equals(value) || "Y".equals(value) ? "Y" : "N";
} }
pstm.setString(i, value); pstm.setString(i, value);

View File

@ -133,17 +133,8 @@ public class MenuElementHandler extends AbstractElementHandler {
int columnID = DB.getSQLValue(getTrxName(ctx), sql, colName, tableID); int columnID = DB.getSQLValue(getTrxName(ctx), sql, colName, tableID);
sql = "SELECT AD_Reference_ID FROM AD_COLUMN WHERE AD_Column_ID = ?"; sql = "SELECT AD_Reference_ID FROM AD_COLUMN WHERE AD_Column_ID = ?";
int referenceID = DB.getSQLValue(getTrxName(ctx), sql, columnID); int referenceID = DB.getSQLValue(getTrxName(ctx), sql, columnID);
if (referenceID == 20 || referenceID == 28) Object obj = rs.getObject(q);
if (rs.getObject(q).equals("Y")) colValue = obj == null ? "" : obj.toString();
colValue = "true";
else
colValue = "false";
else
{
Object obj = rs.getObject(q);
colValue = obj == null ? "" : obj.toString();
}
X_AD_Package_Imp_Backup backup = new X_AD_Package_Imp_Backup(ctx.ctx, 0, getTrxName(ctx)); X_AD_Package_Imp_Backup backup = new X_AD_Package_Imp_Backup(ctx.ctx, 0, getTrxName(ctx));
backup.setAD_Package_Imp_Detail_ID(impDetail.getAD_Package_Imp_Detail_ID()); backup.setAD_Package_Imp_Detail_ID(impDetail.getAD_Package_Imp_Detail_ID());
backup.setAD_Package_Imp_ID(getPackageImpId(ctx.ctx)); backup.setAD_Package_Imp_ID(getPackageImpId(ctx.ctx));

View File

@ -90,7 +90,7 @@ public class PoExporter {
* @param boolValue * @param boolValue
*/ */
public void addBoolean(String name, boolean boolValue, AttributesImpl atts){ public void addBoolean(String name, boolean boolValue, AttributesImpl atts){
addTextElement(name, boolValue == true ? "true" : "false", atts); addTextElement(name, boolValue == true ? "Y" : "N", atts);
} }
@ -120,7 +120,7 @@ public class PoExporter {
if(value instanceof String){ if(value instanceof String){
addTextElement(columnName, (String)value, atts); addTextElement(columnName, (String)value, atts);
} else if(value instanceof Boolean) { } else if(value instanceof Boolean) {
addTextElement(columnName, (Boolean)value == true ? "true" : "false", atts); addTextElement(columnName, (Boolean)value == true ? "Y" : "N", atts);
} else if(value instanceof Integer) { } else if(value instanceof Integer) {
addTextElement(columnName, value.toString(), atts); addTextElement(columnName, value.toString(), atts);
} else if(value instanceof BigDecimal) { } else if(value instanceof BigDecimal) {

View File

@ -70,7 +70,7 @@ public class PoFiller{
Element e = element.properties.get(columnName); Element e = element.properties.get(columnName);
String value = e != null ? e.contents.toString() : null; String value = e != null ? e.contents.toString() : null;
boolean bool = "true".equals(value) ? true : false; boolean bool = "true".equals(value) || "Y".equals(value) ? true : false;
if (po.get_Value(columnName) != null && po.get_ValueAsBoolean(columnName) == bool) if (po.get_Value(columnName) != null && po.get_ValueAsBoolean(columnName) == bool)
return; return;

View File

@ -1,4 +1,5 @@
source.. = src/ source.. = src/
output.. = bin/ output.. = bin/
bin.includes = META-INF/,\ bin.includes = META-INF/,\
. .,\
plugin.xml

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
<extension
id="org.adempiere.model.ExportModelValidator"
name="org.adempiere.model.ExportModelValidator"
point="org.adempiere.base.ModelValidator">
<listener
class="org.adempiere.model.ExportModelValidator">
</listener>
</extension>
</plugin>

View File

@ -21,10 +21,10 @@ import java.util.logging.Level;
import org.adempiere.webui.LayoutUtils; import org.adempiere.webui.LayoutUtils;
import org.adempiere.webui.component.Button; import org.adempiere.webui.component.Button;
import org.adempiere.webui.component.ConfirmPanel; import org.adempiere.webui.component.ConfirmPanel;
import org.adempiere.webui.component.VerticalBox;
import org.adempiere.webui.component.Window; import org.adempiere.webui.component.Window;
import org.adempiere.webui.event.DialogEvents; import org.adempiere.webui.event.DialogEvents;
import org.adempiere.webui.factory.ButtonFactory; import org.adempiere.webui.factory.ButtonFactory;
import org.adempiere.webui.session.SessionManager;
import org.compiere.process.ProcessInfo; import org.compiere.process.ProcessInfo;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.Env; import org.compiere.util.Env;
@ -33,7 +33,8 @@ import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener; import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events; import org.zkoss.zk.ui.event.Events;
import org.zkoss.zul.Div; import org.zkoss.zul.Div;
import org.zkoss.zul.Hbox; import org.zkoss.zul.Hlayout;
import org.zkoss.zul.Layout;
import org.zkoss.zul.Vlayout; import org.zkoss.zul.Vlayout;
/** /**
@ -54,8 +55,6 @@ public class ProcessModalDialog extends AbstractProcessDialog implements EventLi
*/ */
private static final long serialVersionUID = -3260639688339379279L; private static final long serialVersionUID = -3260639688339379279L;
private VerticalBox dialogBody;
/** Logger */ /** Logger */
private static CLogger log = CLogger.getCLogger(ProcessModalDialog.class); private static CLogger log = CLogger.getCLogger(ProcessModalDialog.class);
// //
@ -138,23 +137,32 @@ public class ProcessModalDialog extends AbstractProcessDialog implements EventLi
private void initComponents() { private void initComponents() {
this.setBorder("normal"); this.setBorder("normal");
dialogBody = new VerticalBox(); Layout dialogBody = new Vlayout();
dialogBody.setHflex("1"); dialogBody.setHflex("1");
dialogBody.setStyle(dialogBody.getStyle() + ";max-height:" + (SessionManager.getAppDesktop().getClientInfo().desktopHeight - 100) + "px");
Vlayout dialogContent = new Vlayout(); Vlayout dialogContent = new Vlayout();
dialogContent.setHflex("1"); dialogContent.setHflex("1");
dialogContent.setVflex("1"); dialogContent.setVflex("1");
dialogContent.setSclass("dialog-content"); dialogContent.setSclass("dialog-content");
dialogContent.setStyle("overflow-y: auto;"); dialogContent.setStyle("overflow-y: auto;");
dialogBody.appendChild(dialogContent); dialogBody.appendChild(dialogContent);
// description
Div div = new Div(); Div div = new Div();
div.setId("message"); div.setId("message");
div.appendChild(getMessage()); div.appendChild(getMessage());
div.setStyle("max-height: 150pt; overflow: auto;"); div.setStyle("max-height: 150pt; overflow: auto;");
dialogContent.appendChild(div); dialogContent.appendChild(div);
dialogContent.appendChild(getCenterPanel()); dialogContent.appendChild(getCenterPanel());
Hbox hbox = new Hbox(); // button panel
Layout hbox = new Hlayout();
hbox.setStyle("bottom:0;text-align:right");
dialogBody.appendChild(hbox);
hbox.setWidth("100%"); hbox.setWidth("100%");
hbox.setSclass("dialog-footer"); hbox.setSclass("dialog-footer");
Button btn = ButtonFactory.createNamedButton(ConfirmPanel.A_OK); Button btn = ButtonFactory.createNamedButton(ConfirmPanel.A_OK);
btn.setId("Ok"); btn.setId("Ok");
btn.addEventListener(Events.ON_CLICK, this); btn.addEventListener(Events.ON_CLICK, this);
@ -163,11 +171,10 @@ public class ProcessModalDialog extends AbstractProcessDialog implements EventLi
btn = ButtonFactory.createNamedButton(ConfirmPanel.A_CANCEL); btn = ButtonFactory.createNamedButton(ConfirmPanel.A_CANCEL);
btn.setId("Cancel"); btn.setId("Cancel");
btn.addEventListener(Events.ON_CLICK, this); btn.addEventListener(Events.ON_CLICK, this);
hbox.appendChild(btn); hbox.appendChild(btn);
hbox.setPack("end");
dialogBody.appendChild(hbox); dialogBody.appendChild(hbox);
this.appendChild(dialogBody); this.appendChild(dialogBody);
this.setSclass("popup-dialog"); this.setSclass("popup-dialog");
} }
@ -201,13 +208,13 @@ public class ProcessModalDialog extends AbstractProcessDialog implements EventLi
@Override @Override
public void showBusyDialog() { public void showBusyDialog() {
this.setBorder("none");
this.setTitle(null);
dialogBody.setVisible(false);
BusyDialog progressWindow = createBusyDialog(); BusyDialog progressWindow = createBusyDialog();
if (this.getParent() != null) if (this.getParent() != null){
this.getParent().appendChild(progressWindow);
LayoutUtils.openOverlappedWindow(this.getParent(), progressWindow, "middle_center"); LayoutUtils.openOverlappedWindow(this.getParent(), progressWindow, "middle_center");
}
this.setVisible(false);
} }
@Override @Override

View File

@ -466,7 +466,7 @@ public class NumberBox extends Div
*/ */
public boolean isEnabled() public boolean isEnabled()
{ {
return decimalBox.isReadonly(); return !decimalBox.isReadonly();
} }
@Override @Override

View File

@ -15,8 +15,11 @@ package org.adempiere.webui.component;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List; import java.util.List;
import org.zkoss.lang.Objects;
import org.zkoss.zul.AbstractListModel; import org.zkoss.zul.AbstractListModel;
import org.zkoss.zul.Listbox; import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listcell; import org.zkoss.zul.Listcell;
@ -24,13 +27,14 @@ import org.zkoss.zul.Listitem;
import org.zkoss.zul.ListitemRenderer; import org.zkoss.zul.ListitemRenderer;
import org.zkoss.zul.ListitemRendererExt; import org.zkoss.zul.ListitemRendererExt;
import org.zkoss.zul.event.ListDataEvent; import org.zkoss.zul.event.ListDataEvent;
import org.zkoss.zul.ext.Sortable;
/** /**
* *
* @author Low Heng Sin * @author Low Heng Sin
* *
*/ */
public class SimpleListModel extends AbstractListModel<Object> implements ListitemRenderer<Object>, ListitemRendererExt { public class SimpleListModel extends AbstractListModel<Object> implements ListitemRenderer<Object>, ListitemRendererExt, Sortable<Object> {
/** /**
* *
@ -39,6 +43,10 @@ public class SimpleListModel extends AbstractListModel<Object> implements Listit
protected List<Object> list; protected List<Object> list;
private Comparator<Object> _sorting;
private boolean _sortDir;
private int[] maxLength; private int[] maxLength;
public SimpleListModel() { public SimpleListModel() {
@ -50,6 +58,7 @@ public class SimpleListModel extends AbstractListModel<Object> implements Listit
this.list = (List<Object>)list; this.list = (List<Object>)list;
} }
@Override
public Object getElementAt(int index) { public Object getElementAt(int index) {
if (index >= 0 && index < list.size()) if (index >= 0 && index < list.size())
return list.get(index); return list.get(index);
@ -57,6 +66,7 @@ public class SimpleListModel extends AbstractListModel<Object> implements Listit
return null; return null;
} }
@Override
public int getSize() { public int getSize() {
return list.size(); return list.size();
} }
@ -111,14 +121,17 @@ public class SimpleListModel extends AbstractListModel<Object> implements Listit
} }
} }
@Override
public int getControls() { public int getControls() {
return DETACH_ON_RENDER; return DETACH_ON_RENDER;
} }
@Override
public Listcell newListcell(Listitem item) { public Listcell newListcell(Listitem item) {
return null; return null;
} }
@Override
public Listitem newListitem(Listbox listbox) { public Listitem newListitem(Listbox listbox) {
ListItem item = new ListItem(); ListItem item = new ListItem();
item.applyProperties(); item.applyProperties();
@ -159,4 +172,20 @@ public class SimpleListModel extends AbstractListModel<Object> implements Listit
public int indexOf(Object value) { public int indexOf(Object value) {
return list.indexOf(value); return list.indexOf(value);
} }
@Override
public void sort(Comparator<Object> cmpr, boolean ascending) {
_sorting = cmpr;
_sortDir = ascending;
Collections.sort(list, cmpr);
fireEvent(ListDataEvent.STRUCTURE_CHANGED, -1, -1);
}
@Override
public String getSortDirection(Comparator<Object> cmpr) {
if (Objects.equals(_sorting, cmpr))
return _sortDir ?
"ascending" : "descending";
return "natural";
}
} }

View File

@ -41,11 +41,13 @@ import org.adempiere.webui.component.SimpleListModel;
import org.adempiere.webui.factory.ButtonFactory; import org.adempiere.webui.factory.ButtonFactory;
import org.adempiere.webui.theme.ThemeManager; import org.adempiere.webui.theme.ThemeManager;
import org.adempiere.webui.window.FDialog; import org.adempiere.webui.window.FDialog;
import org.compiere.model.I_AD_Field;
import org.compiere.model.MField; import org.compiere.model.MField;
import org.compiere.model.MRefList; import org.compiere.model.MRefList;
import org.compiere.model.MRole; import org.compiere.model.MRole;
import org.compiere.model.MTab; import org.compiere.model.MTab;
import org.compiere.model.Query; import org.compiere.model.Query;
import org.compiere.model.X_AD_Tab_Customization;
import org.compiere.util.CLogger; import org.compiere.util.CLogger;
import org.compiere.util.Env; import org.compiere.util.Env;
import org.compiere.util.Msg; import org.compiere.util.Msg;
@ -144,10 +146,11 @@ public class CustomizeGridViewPanel extends Panel
yesList.setVflex(true); yesList.setVflex(true);
noList.setVflex(true); noList.setVflex(true);
EventListener<Event> mouseListener = new EventListener<Event>() EventListener<Event> mouseListener = new EventListener<Event>()
{ {
@Override
public void onEvent(Event event) throws Exception public void onEvent(Event event) throws Exception
{ {
if (Events.ON_DOUBLE_CLICK.equals(event.getName())) if (Events.ON_DOUBLE_CLICK.equals(event.getName()))
@ -161,6 +164,7 @@ public class CustomizeGridViewPanel extends Panel
// //
EventListener<Event> actionListener = new EventListener<Event>() EventListener<Event> actionListener = new EventListener<Event>()
{ {
@Override
public void onEvent(Event event) throws Exception { public void onEvent(Event event) throws Exception {
migrateValueAcrossLists(event); migrateValueAcrossLists(event);
} }
@ -184,6 +188,7 @@ public class CustomizeGridViewPanel extends Panel
actionListener = new EventListener<Event>() actionListener = new EventListener<Event>()
{ {
@Override
public void onEvent(Event event) throws Exception { public void onEvent(Event event) throws Exception {
migrateValueWithinYesList(event); migrateValueWithinYesList(event);
} }
@ -214,7 +219,10 @@ public class CustomizeGridViewPanel extends Panel
listHead.setParent(noList); listHead.setParent(noList);
listHeader = new ListHeader(); listHeader = new ListHeader();
listHeader.appendChild(noLabel); listHeader.appendChild(noLabel);
listHeader.setSort("auto");
listHeader.setSortDirection("ascending");
//http://books.zkoss.org/wiki/ZK%20Configuration%20Reference/zk.xml/The%20Library%20Properties/org.zkoss.zul.listbox.autoSort
noList.setAttribute("org.zkoss.zul.listbox.autoSort", "true");
Hlayout noButtonLayout = new Hlayout(); Hlayout noButtonLayout = new Hlayout();
noButtonLayout.appendChild(bRemove); noButtonLayout.appendChild(bRemove);
@ -268,6 +276,7 @@ public class CustomizeGridViewPanel extends Panel
LayoutUtils.addSclass("dialog-footer", confirmPanel); LayoutUtils.addSclass("dialog-footer", confirmPanel);
EventListener<Event> onClickListener = new EventListener<Event>() { EventListener<Event> onClickListener = new EventListener<Event>() {
@Override
public void onEvent(Event event) throws Exception { public void onEvent(Event event) throws Exception {
if (event.getTarget().equals( if (event.getTarget().equals(
confirmPanel.getButton(ConfirmPanel.A_OK))) { confirmPanel.getButton(ConfirmPanel.A_OK))) {
@ -298,7 +307,7 @@ public class CustomizeGridViewPanel extends Panel
boolean baseLanguage = Env.isBaseLanguage(Env.getCtx(), "AD_Field"); boolean baseLanguage = Env.isBaseLanguage(Env.getCtx(), "AD_Field");
Query query = null; Query query = null;
query = new Query(Env.getCtx(), MField.Table_Name, "AD_Tab_ID=? AND (IsDisplayed='Y' OR IsDisplayedGrid='Y') AND IsActive='Y'", null); query = new Query(Env.getCtx(), I_AD_Field.Table_Name, "AD_Tab_ID=? AND (IsDisplayed='Y' OR IsDisplayedGrid='Y') AND IsActive='Y'", null);
query.setOrderBy("SeqNoGrid, Name, SeqNo"); query.setOrderBy("SeqNoGrid, Name, SeqNo");
query.setParameters(new Object [] {m_AD_Tab_ID}); query.setParameters(new Object [] {m_AD_Tab_ID});
query.setApplyAccessFilter(true); query.setApplyAccessFilter(true);
@ -319,7 +328,7 @@ public class CustomizeGridViewPanel extends Panel
if (baseLanguage) if (baseLanguage)
name = field.getName(); name = field.getName();
else else
name = field.get_Translation(MField.COLUMNNAME_Name); name = field.get_Translation(I_AD_Field.COLUMNNAME_Name);
ListElement pp = new ListElement(key, name); ListElement pp = new ListElement(key, name);
if (tableSeqs != null && tableSeqs.size() > 0 ) { if (tableSeqs != null && tableSeqs.size() > 0 ) {
@ -359,7 +368,7 @@ public class CustomizeGridViewPanel extends Panel
ValueNamePair pp = new ValueNamePair(null, null); ValueNamePair pp = new ValueNamePair(null, null);
lstGridMode.addItem(pp); lstGridMode.addItem(pp);
ValueNamePair[] list = MRefList.getList(Env.getCtx(), MTabCustomization.ISDISPLAYEDGRID_AD_Reference_ID, false); ValueNamePair[] list = MRefList.getList(Env.getCtx(), X_AD_Tab_Customization.ISDISPLAYEDGRID_AD_Reference_ID, false);
for (int i = 0;i < list.length; i++ ) { for (int i = 0;i < list.length; i++ ) {
lstGridMode.addItem(list[i]); lstGridMode.addItem(list[i]);
if (m_tabcust != null && list[i].getValue().equals(m_tabcust.getIsDisplayedGrid())) if (m_tabcust != null && list[i].getValue().equals(m_tabcust.getIsDisplayedGrid()))
@ -637,8 +646,7 @@ public class CustomizeGridViewPanel extends Panel
return s; return s;
} }
} }
/**
/**
* @author eslatis * @author eslatis
* *
*/ */
@ -652,6 +660,7 @@ public class CustomizeGridViewPanel extends Panel
{ {
} }
@Override
public void onEvent(Event event) throws Exception { public void onEvent(Event event) throws Exception {
if (event instanceof DropEvent) if (event instanceof DropEvent)
{ {
@ -669,7 +678,6 @@ public class CustomizeGridViewPanel extends Panel
Listbox listTo = (Listbox)endItem.getListbox(); Listbox listTo = (Listbox)endItem.getListbox();
endIndex = yesList.getIndexOfItem(endItem); endIndex = yesList.getIndexOfItem(endItem);
migrateLists (listFrom,listTo,endIndex); migrateLists (listFrom,listTo,endIndex);
}else if (startItem.getListbox() == endItem.getListbox() && startItem.getListbox() == yesList) }else if (startItem.getListbox() == endItem.getListbox() && startItem.getListbox() == yesList)
{ {
List<ListElement> selObjects = new ArrayList<ListElement>(); List<ListElement> selObjects = new ArrayList<ListElement>();
@ -718,3 +726,4 @@ public class CustomizeGridViewPanel extends Panel
} }
} //CustomizeGridViewPanel } //CustomizeGridViewPanel