/******************************************************************************
* Product: Posterita Ajax UI *
* Copyright (C) 2007 Posterita Ltd. All Rights Reserved. *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
* For the text or an alternative of this public license, you may reach us *
* Posterita Ltd., 3, Draper Avenue, Quatre Bornes, Mauritius *
* or via info@posterita.org or http://www.posterita.org/ *
*****************************************************************************/
package org.adempiere.webui.panel;
import java.math.BigDecimal;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import org.adempiere.webui.apps.AEnv;
import org.adempiere.webui.component.Checkbox;
import org.adempiere.webui.component.Grid;
import org.adempiere.webui.component.GridFactory;
import org.adempiere.webui.component.Label;
import org.adempiere.webui.component.Row;
import org.adempiere.webui.component.Rows;
import org.adempiere.webui.component.Textbox;
import org.adempiere.webui.event.WTableModelEvent;
import org.adempiere.webui.event.WTableModelListener;
import org.compiere.minigrid.ColumnInfo;
import org.compiere.minigrid.IDColumn;
import org.compiere.model.MQuery;
import org.compiere.util.CLogger;
import org.compiere.util.Env;
import org.compiere.util.KeyNamePair;
import org.compiere.util.Msg;
import org.compiere.util.Util;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zkex.zul.Borderlayout;
import org.zkoss.zkex.zul.Center;
import org.zkoss.zkex.zul.North;
import org.zkoss.zkex.zul.South;
import org.zkoss.zul.Div;
import org.zkoss.zul.Separator;
import org.zkoss.zul.Vbox;
/**
* Search Business Partner and return selection
* Based on InfoBPartner written by Jorg Janke
* @author Sendy Yagambrum
*
* Zk Port
* @author Elaine
* @version InfoBPartner.java Adempiere Swing UI 3.4.1
*/
public class InfoBPartnerPanel extends InfoPanel implements EventListener, WTableModelListener
{
/**
*
*/
private static final long serialVersionUID = 5677624151607188344L;
private Label lblValue ;
private Textbox fieldValue ;
private Label lblName;
private Textbox fieldName ;
private Label lblContact ;
private Textbox fieldContact;
private Label lblEMail ;
private Textbox fieldEMail;
private Label lblPostal;
private Textbox fieldPostal;
private Label lblPhone;
private Textbox fieldPhone;
private Checkbox checkAND ;
private Checkbox checkCustomer;
private int m_AD_User_ID_index = -1; // Elaine 2008/12/16
private int m_C_BPartner_Location_ID_index = -1;
/** SalesOrder Trx */
private boolean m_isSOTrx;
/** Logger */
protected CLogger log = CLogger.getCLogger(getClass());
private Borderlayout layout;
private Vbox southBody;
/** From Clause */
private static String s_partnerFROM = "C_BPartner"
+ " LEFT OUTER JOIN C_BPartner_Location l ON (C_BPartner.C_BPartner_ID=l.C_BPartner_ID AND l.IsActive='Y')"
+ " LEFT OUTER JOIN AD_User c ON (C_BPartner.C_BPartner_ID=c.C_BPartner_ID AND (c.C_BPartner_Location_ID IS NULL OR c.C_BPartner_Location_ID=l.C_BPartner_Location_ID) AND c.IsActive='Y')"
+ " LEFT OUTER JOIN C_Location a ON (l.C_Location_ID=a.C_Location_ID)";
/** Array of Column Info */
private static ColumnInfo[] s_partnerLayout = {
new ColumnInfo(" ", "C_BPartner.C_BPartner_ID", IDColumn.class),
new ColumnInfo(Msg.translate(Env.getCtx(), "Value"), "C_BPartner.Value", String.class),
new ColumnInfo(Msg.translate(Env.getCtx(), "Name"), "C_BPartner.Name", String.class),
new ColumnInfo(Msg.translate(Env.getCtx(), "Contact"), "c.Name AS Contact", KeyNamePair.class, "c.AD_User_ID"),
new ColumnInfo(Msg.translate(Env.getCtx(), "SO_CreditAvailable"), "C_BPartner.SO_CreditLimit-C_BPartner.SO_CreditUsed AS SO_CreditAvailable", BigDecimal.class, true, true, null),
new ColumnInfo(Msg.translate(Env.getCtx(), "SO_CreditUsed"), "C_BPartner.SO_CreditUsed", BigDecimal.class),
new ColumnInfo(Msg.translate(Env.getCtx(), "Phone"), "c.Phone", String.class),
new ColumnInfo(Msg.translate(Env.getCtx(), "Postal"), "a.Postal", KeyNamePair.class, "l.C_BPartner_Location_ID"),
new ColumnInfo(Msg.translate(Env.getCtx(), "City"), "a.City", String.class),
new ColumnInfo(Msg.translate(Env.getCtx(), "TotalOpenBalance"), "C_BPartner.TotalOpenBalance", BigDecimal.class),
new ColumnInfo(Msg.translate(Env.getCtx(), "Revenue"), "C_BPartner.ActualLifetimeValue", BigDecimal.class),
new ColumnInfo(Msg.translate(Env.getCtx(), "Address1"), "a.Address1", String.class),
new ColumnInfo(Msg.translate(Env.getCtx(), "IsShipTo"), "l.IsShipTo", Boolean.class),
new ColumnInfo(Msg.translate(Env.getCtx(), "IsBillTo"), "l.IsBillTo", Boolean.class)
};
/**
* Standard Constructor
* @param queryvalue Query value Name or Value if contains numbers
* @param isSOTrx if false, query vendors only
* @param whereClause where clause
*/
public InfoBPartnerPanel(String queryValue,int windowNo, boolean isSOTrx,boolean multipleSelection, String whereClause)
{
this(queryValue, windowNo, isSOTrx, multipleSelection, whereClause, true);
}
/**
* Standard Constructor
* @param queryvalue Query value Name or Value if contains numbers
* @param isSOTrx if false, query vendors only
* @param whereClause where clause
*/
public InfoBPartnerPanel(String queryValue,int windowNo, boolean isSOTrx,boolean multipleSelection, String whereClause, boolean lookup)
{
super (windowNo, "C_BPartner", "C_BPartner_ID",multipleSelection, whereClause, lookup);
setTitle(Msg.getMsg(Env.getCtx(), "InfoBPartner"));
m_isSOTrx = isSOTrx;
initComponents();
init();
initInfo(queryValue, whereClause);
int no = contentPanel.getRowCount();
setStatusLine(Integer.toString(no) + " " + Msg.getMsg(Env.getCtx(), "SearchRows_EnterQuery"), false);
setStatusDB(Integer.toString(no));
//
if (queryValue != null && queryValue.length()>0)
{
executeQuery();
renderItems();
}
p_loadedOK = true; // Elaine 2008/07/28
}
private void initComponents()
{
lblValue = new Label();
lblValue.setValue(Util.cleanAmp(Msg.translate(Env.getCtx(), "Value")));
lblName = new Label();
lblName.setValue(Util.cleanAmp(Msg.translate(Env.getCtx(), "Name")));
lblContact = new Label();
lblContact.setValue(Msg.translate(Env.getCtx(), "Contact"));
lblEMail = new Label();
lblEMail.setValue(Msg.getMsg(Env.getCtx(), "EMail"));
lblPostal = new Label();
lblPostal.setValue(Msg.getMsg(Env.getCtx(), "Postal"));
lblPhone = new Label();
lblPhone.setValue(Msg.translate(Env.getCtx(), "Phone"));
fieldValue = new Textbox();
fieldValue.setMaxlength(40);
fieldName = new Textbox();
fieldName.setMaxlength(40);
fieldContact = new Textbox();
fieldContact.setMaxlength(40);
fieldEMail = new Textbox();
fieldEMail.setMaxlength(40);
fieldPostal = new Textbox();
fieldPostal.setMaxlength(40);
fieldPhone = new Textbox();
fieldPhone.setMaxlength(40);
checkAND = new Checkbox();
checkAND.setLabel(Msg.getMsg(Env.getCtx(), "SearchAND"));
checkAND.setChecked(true);
checkAND.addEventListener(Events.ON_CHECK, this);
checkCustomer = new Checkbox();
checkCustomer.setChecked(true);
checkCustomer.addEventListener(Events.ON_CHECK, this);
if (m_isSOTrx)
checkCustomer.setLabel(Msg.getMsg(Env.getCtx(), "OnlyCustomers"));
else
checkCustomer.setLabel(Msg.getMsg(Env.getCtx(), "OnlyVendors"));
}
private void init()
{
fieldValue.setWidth("100%");
fieldContact.setWidth("100%");
fieldPhone.setWidth("100%");
fieldName.setWidth("100%");
fieldEMail.setWidth("100%");
fieldPostal.setWidth("100%");
Grid grid = GridFactory.newGridLayout();
Rows rows = new Rows();
grid.appendChild(rows);
Row row = new Row();
rows.appendChild(row);
row.appendChild(lblValue.rightAlign());
row.appendChild(fieldValue);
row.appendChild(lblContact.rightAlign());
row.appendChild(fieldContact);
row.appendChild(lblPhone.rightAlign());
row.appendChild(fieldPhone);
row.appendChild(checkCustomer);
row = new Row();
rows.appendChild(row);
row.appendChild(lblName.rightAlign());
row.appendChild(fieldName);
row.appendChild(lblEMail.rightAlign());
row.appendChild(fieldEMail);
row.appendChild(lblPostal.rightAlign());
row.appendChild(fieldPostal);
row.appendChild(checkAND);
layout = new Borderlayout();
layout.setWidth("100%");
layout.setHeight("100%");
if (!isLookup())
{
layout.setStyle("position: absolute");
}
this.appendChild(layout);
North north = new North();
layout.appendChild(north);
north.appendChild(grid);
Center center = new Center();
layout.appendChild(center);
center.setFlex(true);
Div div = new Div();
div.appendChild(contentPanel);
if (isLookup())
contentPanel.setWidth("99%");
else
contentPanel.setStyle("width: 99%; margin: 0px auto;");
contentPanel.setVflex(true);
div.setStyle("width :100%; height: 100%");
center.appendChild(div);
South south = new South();
layout.appendChild(south);
southBody = new Vbox();
southBody.setWidth("100%");
south.appendChild(southBody);
southBody.appendChild(confirmPanel);
southBody.appendChild(new Separator());
southBody.appendChild(statusBar);
}
/**
* Dynamic Init
* @param value value
* @param whereClause where clause
*/
private void initInfo(String value, String whereClause)
{
/** From
C_BPartner
LEFT OUTER JOIN C_BPartner_Location l ON (C_BPartner.C_BPartner_ID=l.C_BPartner_ID AND l.IsActive='Y')
LEFT OUTER JOIN AD_User c ON (C_BPartner.C_BPartner_ID=c.C_BPartner_ID AND (c.C_BPartner_Location_ID IS NULL OR c.C_BPartner_Location_ID=l.C_BPartner_Location_ID) AND c.IsActive='Y')
LEFT OUTER JOIN C_Location a ON (l.C_Location_ID=a.C_Location_ID)
**/
// Create Grid
StringBuffer where = new StringBuffer();
where.append("C_BPartner.IsSummary='N' AND C_BPartner.IsActive='Y'");
if (whereClause != null && whereClause.length() > 0)
where.append(" AND ").append(whereClause);
//
prepareTable(s_partnerLayout, s_partnerFROM, where.toString(), "C_BPartner.Value");
// Get indexes
for (int i = 0; i < p_layout.length; i++)
{
// Elaine 2008/12/16
if (p_layout[i].getKeyPairColSQL().indexOf("AD_User_ID") != -1)
m_AD_User_ID_index = i;
//
if (p_layout[i].getKeyPairColSQL().indexOf("C_BPartner_Location_ID") != -1)
m_C_BPartner_Location_ID_index = i;
}
// Set Value
if (value == null)
value = "%";
if (!value.endsWith("%"))
value += "%";
// Put query string in Name if not numeric
if (value.equals("%"))
fieldName.setText(value);
// No Numbers entered
else if ((value.indexOf('0')+value.indexOf('1')+value.indexOf('2')+value.indexOf('3')+value.indexOf('4') +value.indexOf('5')
+value.indexOf('6')+value.indexOf('7')+value.indexOf('8')+value.indexOf('9')) == -10)
{
if (value.startsWith("%"))
fieldName.setText(value);
else
fieldName.setText("%" + value);
}
// Number entered
else
fieldValue.setText(value);
} // initInfo
/**
* Set Parameters for Query.
* (as defined in getSQLWhere)
* @param pstmt pstmt
* @param forCount for counting records
* @throws SQLException
*/
public void setParameters(PreparedStatement pstmt, boolean forCount) throws SQLException
{
int index = 1;
// => Value
String value = fieldValue.getText().toUpperCase();
if (!(value.equals("") || value.equals("%")))
{
if (!value.endsWith("%"))
value += "%";
pstmt.setString(index++, value);
log.fine("Value: " + value);
}
// => Name
String name = fieldName.getText().toUpperCase();
if (!(name.equals("") || name.equals("%")))
{
if (!name.endsWith("%"))
name += "%";
pstmt.setString(index++, name);
log.fine("Name: " + name);
}
// => Contact
String contact = fieldContact.getText().toUpperCase();
if (!(contact.equals("") || contact.equals("%")))
{
if (!contact.endsWith("%"))
contact += "%";
pstmt.setString(index++, contact);
log.fine("Contact: " + contact);
}
// => EMail
String email = fieldEMail.getText().toUpperCase();
if (!(email.equals("") || email.equals("%")))
{
if (!email.endsWith("%"))
email += "%";
pstmt.setString(index++, email);
log.fine("EMail: " + email);
}
// => Phone
String phone = fieldPhone.getText().toUpperCase();
if (!(phone.equals("") || phone.equals("%")))
{
if (!phone.endsWith("%"))
phone += "%";
pstmt.setString(index++, phone);
log.fine("Phone: " + phone);
}
// => Postal
String postal = fieldPostal.getText().toUpperCase();
if (!(postal.equals("") || postal.equals("%")))
{
if (!postal.endsWith("%"))
postal += "%";
pstmt.setString(index++, postal);
log.fine("Postal: " + postal);
}
} // setParameters
/*************************************************************************/
/*************************************************************************/
/**
* Construct SQL Where Clause and define parameters.
* (setParameters needs to set parameters)
* Includes first AND
* @return WHERE clause
*/
public String getSQLWhere()
{
ArrayList<String> list = new ArrayList<String>();
// => Value
String value = fieldValue.getText().toUpperCase();
if (!(value.equals("") || value.equals("%")))
list.add ("UPPER(C_BPartner.Value) LIKE ?");
// => Name
String name = fieldName.getText().toUpperCase();
if (!(name.equals("") || name.equals("%")))
list.add ("UPPER(C_BPartner.Name) LIKE ?");
// => Contact
String contact = fieldContact.getText().toUpperCase();
if (!(contact.equals("") || contact.equals("%")))
list.add ("UPPER(c.Name) LIKE ?");
// => EMail
String email = fieldEMail.getText().toUpperCase();
if (!(email.equals("") || email.equals("%")))
list.add ("UPPER(c.EMail) LIKE ?");
// => Phone
String phone = fieldPhone.getText().toUpperCase();
if (!(phone.equals("") || phone.equals("%")))
list.add ("UPPER(c.Phone) LIKE ?");
// => Postal
String postal = fieldPostal.getText().toUpperCase();
if (!(postal.equals("") || postal.equals("%")))
list.add ("UPPER(a.Postal) LIKE ?");
StringBuffer sql = new StringBuffer();
int size = list.size();
// Just one
if (size == 1)
sql.append(" AND ").append(list.get(0));
else if (size > 1)
{
boolean AND = checkAND.isChecked();
sql.append(" AND ");
if (!AND)
sql.append("(");
for (int i = 0; i < size; i++)
{
if (i > 0)
sql.append(AND ? " AND " : " OR ");
sql.append(list.get(i));
}
if (!AND)
sql.append(")");
}
// Static SQL
if (checkCustomer.isChecked())
{
sql.append(" AND ");
if (m_isSOTrx)
sql.append ("C_BPartner.IsCustomer='Y'");
else
sql.append ("C_BPartner.IsVendor='Y'");
}
return sql.toString();
} // getSQLWhere
/*************************************************************************/
/**
* Save Selection Details
* Get Location/Partner Info
*/
public void saveSelectionDetail()
{
int row = contentPanel.getSelectedRow();
if (row == -1)
return;
int AD_User_ID = 0;
int C_BPartner_Location_ID = 0;
// Elaine 2008/12/16
if (m_AD_User_ID_index != -1)
{
Object data =contentPanel.getValueAt(row, m_AD_User_ID_index);
if (data instanceof KeyNamePair)
AD_User_ID = ((KeyNamePair)data).getKey();
}
//
if (m_C_BPartner_Location_ID_index != -1)
{
Object data =contentPanel.getValueAt(row, m_C_BPartner_Location_ID_index);
if (data instanceof KeyNamePair)
C_BPartner_Location_ID = ((KeyNamePair)data).getKey();
}
// publish for Callout to read
Integer ID = getSelectedRowKey();
Env.setContext(Env.getCtx(), p_WindowNo, Env.TAB_INFO, "C_BPartner_ID", ID == null ? "0" : ID.toString());
Env.setContext(Env.getCtx(), p_WindowNo, Env.TAB_INFO, "AD_User_ID", String.valueOf(AD_User_ID));
Env.setContext(Env.getCtx(), p_WindowNo, Env.TAB_INFO, "C_BPartner_Location_ID", String.valueOf(C_BPartner_Location_ID));
} // saveSelectionDetail
// Elaine 2008/12/16
/**************************************************************************
* Show History
*/
protected void showHistory()
{
log.info("");
Integer C_BPartner_ID = getSelectedRowKey();
if (C_BPartner_ID == null)
return;
InvoiceHistory ih = new InvoiceHistory (this, C_BPartner_ID.intValue(),
0, 0, 0);
ih.setVisible(true);
ih = null;
} // showHistory
/**
* Has History
* @return true
*/
protected boolean hasHistory()
{
return true;
} // hasHistory
/**
* Zoom
*/
public void zoom()
{
log.info( "InfoBPartner.zoom");
Integer C_BPartner_ID = getSelectedRowKey();
if (C_BPartner_ID == null)
return;
// AEnv.zoom(MBPartner.Table_ID, C_BPartner_ID.intValue(), true); // SO
MQuery query = new MQuery("C_BPartner");
query.addRestriction("C_BPartner_ID", MQuery.EQUAL, C_BPartner_ID);
query.setRecordCount(1);
int AD_WindowNo = getAD_Window_ID("C_BPartner", true); // SO
AEnv.zoom (AD_WindowNo, query);
} // zoom
/**
* Has Zoom
* @return true
*/
protected boolean hasZoom()
{
return true;
} // hasZoom
/**
* Customize
*/
protected void customize()
{
log.info( "InfoBPartner.customize");
} // customize
/**
* Has Customize
* @return false
*/
protected boolean hasCustomize()
{
return false; // for now
} // hasCustomize
//
public void tableChanged(WTableModelEvent event)
{
}
}