/******************************************************************************
* 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.grid;
import java.util.logging.Level;
import org.adempiere.webui.component.ConfirmPanel;
import org.adempiere.webui.component.Label;
import org.adempiere.webui.component.ListItem;
import org.adempiere.webui.component.Listbox;
import org.adempiere.webui.component.Textbox;
import org.adempiere.webui.component.VerticalBox;
import org.adempiere.webui.component.Window;
import org.adempiere.webui.editor.WLocationEditor;
import org.adempiere.webui.event.ValueChangeEvent;
import org.adempiere.webui.event.ValueChangeListener;
import org.adempiere.webui.window.FDialog;
import org.compiere.model.MBPartner;
import org.compiere.model.MBPartnerLocation;
import org.compiere.model.MLocation;
import org.compiere.model.MLocationLookup;
import org.compiere.model.MRole;
import org.compiere.model.MUser;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.Env;
import org.compiere.util.KeyNamePair;
import org.compiere.util.Msg;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zul.Hbox;
import org.zkoss.zul.Separator;
/**
* Business Partner : Based on VBPartner
*
* @author Niraj Sohun
* Aug 15, 2007
*
*/
public class WBPartner extends Window implements EventListener, ValueChangeListener
{
/**
*
*/
private static final long serialVersionUID = 5842369060073088746L;
private static CLogger log = CLogger.getCLogger(WBPartner.class);
private int m_WindowNo;
/** The Partner */
private MBPartner m_partner = null;
/** The Location */
private MBPartnerLocation m_pLocation = null;
/** The User */
private MUser m_user = null;
/** Read Only */
private boolean m_readOnly = false;
private Object[] m_greeting;
private Textbox fValue = new Textbox();
private Listbox fGreetingBP = new Listbox();
private Textbox fName = new Textbox();
private Textbox fName2 = new Textbox();
private Textbox fContact = new Textbox();
private Listbox fGreetingC = new Listbox();
private Textbox fTitle = new Textbox();
private Textbox fEMail = new Textbox();
private Textbox fPhone = new Textbox();
private Textbox fPhone2 = new Textbox();
private Textbox fFax = new Textbox();
private WLocationEditor fAddress;/* = new WLocationDialog();*/
private VerticalBox centerPanel = new VerticalBox();
private ConfirmPanel confirmPanel = new ConfirmPanel(true, false, false, false, false, false);
/**
* Constructor.
* Requires call loadBPartner
* @param frame parent
* @param WindowNo Window No
*/
public WBPartner(int WindowNo)
{
super();
m_WindowNo = WindowNo;
m_readOnly = !MRole.getDefault().canUpdate(
Env.getAD_Client_ID(Env.getCtx()), Env.getAD_Org_ID(Env.getCtx()),
MBPartner.Table_ID, 0, false);
log.info("R/O=" + m_readOnly);
try
{
jbInit();
}
catch(Exception ex)
{
log.log(Level.SEVERE, ex.getMessage());
}
initBPartner();
} // WBPartner
/**
* Static Init
* @throws Exception
*/
void jbInit() throws Exception
{
this.setWidth("350px");
this.setBorder("normal");
this.setClosable(true);
this.setTitle("Business Partner");
this.setAttribute("mode", "modal");
this.appendChild(centerPanel);
this.appendChild(confirmPanel);
confirmPanel.addActionListener(Events.ON_CLICK, this);
}
/**
* Dynamic Init
*/
private void initBPartner()
{
// Get Data
m_greeting = fillGreeting();
// Value
fValue.addEventListener(Events.ON_CHANGE , this);
createLine (fValue, "Value", true);
// Greeting Business Partner
fGreetingBP.setMold("select");
fGreetingBP.setRows(0);
for (int i = 0; i < m_greeting.length; i++)
fGreetingBP.appendItem(m_greeting[i].toString(), m_greeting[i]);
createLine (fGreetingBP, "Greeting", false);
// Name
fName.addEventListener(Events.ON_CLICK, this);
createLine (fName, "Name", false)/*.setFontBold(true)*/;
// Name2
createLine (fName2, "Name2", false);
// Contact
createLine (fContact, "Contact", true)/*.setFontBold(true)*/;
// Greeting Contact
fGreetingC.setMold("select");
fGreetingC.setRows(0);
for (int i = 0; i < m_greeting.length; i++)
fGreetingC.appendItem(m_greeting[i].toString(), m_greeting[i]);
createLine (fGreetingC, "Greeting", false);
// Title
createLine(fTitle, "Title", false);
// Email
createLine (fEMail, "EMail", false);
// Location
boolean ro = m_readOnly;
if (!ro)
ro = !MRole.getDefault().canUpdate(
Env.getAD_Client_ID(Env.getCtx()), Env.getAD_Org_ID(Env.getCtx()),
MBPartnerLocation.Table_ID, 0, false);
if (!ro)
ro = !MRole.getDefault().canUpdate(
Env.getAD_Client_ID(Env.getCtx()), Env.getAD_Org_ID(Env.getCtx()),
MLocation.Table_ID, 0, false);
fAddress = new WLocationEditor("C_Location_ID", false, ro, true,
new MLocationLookup (Env.getCtx(), m_WindowNo));
fAddress.addValueChangeListener(this);
fAddress.setValue (null);
createLine (fAddress.getComponent(), "C_Location_ID", true)/*.setFontBold(true)*/;
// Phone
createLine (fPhone, "Phone", true);
// Phone2
createLine (fPhone2, "Phone2", false);
// Fax
createLine (fFax, "Fax", false);
} // initBPartner
/**
* Create Line
* @param field field
* @param title label value
* @param addSpace add more space
* @return label
*/
private Label createLine (Component field, String title, boolean addSpace)
{
Hbox hbox = new Hbox();
hbox.setWidth("100%");
hbox.setWidths("30%, 70%");
Label label = new Label(Msg.translate(Env.getCtx(), title));
hbox.appendChild(label);
hbox.appendChild(field);
centerPanel.appendChild(hbox);
centerPanel.appendChild(new Separator());
return label;
} // createLine
/**
* Fill Greeting
* @return KeyNamePair Array of Greetings
*/
private Object[] fillGreeting()
{
String sql = "SELECT C_Greeting_ID, Name FROM C_Greeting WHERE IsActive='Y' ORDER BY 2";
sql = MRole.getDefault().addAccessSQL(sql, "C_Greeting", MRole.SQL_NOTQUALIFIED, MRole.SQL_RO);
return DB.getKeyNamePairs(sql, true);
} // fillGreeting
/**
* Search m_greeting for key
* @param key C_Greeting_ID
* @return Greeting
*/
private KeyNamePair getGreeting (int key)
{
for (int i = 0; i < m_greeting.length; i++)
{
KeyNamePair p = (KeyNamePair)m_greeting[i];
if (p.getKey() == key)
return p;
}
return new KeyNamePair(-1, " ");
} // getGreeting
/**
* Load BPartner
* @param C_BPartner_ID - existing BPartner or 0 for new
* @return true if loaded
*/
public boolean loadBPartner (int C_BPartner_ID)
{
log.config("C_BPartner_ID=" + C_BPartner_ID);
// New bpartner
if (C_BPartner_ID == 0)
{
m_partner = null;
m_pLocation = null;
m_user = null;
return true;
}
m_partner = new MBPartner (Env.getCtx(), C_BPartner_ID, null);
if (m_partner.get_ID() == 0)
{
FDialog.error(m_WindowNo, this, "BPartnerNotFound");
return false;
}
// BPartner - Load values
fValue.setText(m_partner.getValue());
KeyNamePair keynamepair = getGreeting(m_partner.getC_Greeting_ID());
for (int i = 0; i < fGreetingBP.getItemCount(); i++)
{
ListItem listitem = fGreetingBP.getItemAtIndex(i);
KeyNamePair compare = (KeyNamePair)listitem.getValue();
if (compare == keynamepair)
{
fGreetingBP.setSelectedIndex(i);
break;
}
}
fName.setText(m_partner.getName());
fName2.setText(m_partner.getName2());
// Contact - Load values
m_pLocation = m_partner.getLocation(
Env.getContextAsInt(Env.getCtx(), m_WindowNo, "C_BPartner_Location_ID"));
if (m_pLocation != null)
{
int location = m_pLocation.getC_Location_ID();
fAddress.setValue (new Integer(location));
fPhone.setText(m_pLocation.getPhone());
fPhone2.setText(m_pLocation.getPhone2());
fFax.setText(m_pLocation.getFax());
}
// User - Load values
m_user = m_partner.getContact(
Env.getContextAsInt(Env.getCtx(), m_WindowNo, "AD_User_ID"));
if (m_user != null)
{
keynamepair = getGreeting(m_user.getC_Greeting_ID());
for (int i = 0; i < fGreetingC.getItemCount(); i++)
{
ListItem listitem = fGreetingC.getItemAtIndex(i);
KeyNamePair compare = (KeyNamePair)listitem.getValue();
if (compare == keynamepair)
{
fGreetingC.setSelectedIndex(i);
break;
}
}
fContact.setText(m_user.getName());
fTitle.setText(m_user.getTitle());
fEMail.setText(m_user.getEMail());
fPhone.setText(m_user.getPhone());
fPhone2.setText(m_user.getPhone2());
fFax.setText(m_user.getFax());
}
return true;
} // loadBPartner
/**
* Save.
* Checks mandatory fields and saves Partner, Contact and Location
* @return true if saved
*/
private boolean actionSave()
{
log.config("");
// Check Mandatory fields
if (fName.getText().equals(""))
{
throw new WrongValueException(fName, Msg.translate(Env.getCtx(), "FillMandatory"));
}
if (fAddress.getC_Location_ID() == 0)
{
throw new WrongValueException(fAddress.getComponent(), Msg.translate(Env.getCtx(), "FillMandatory"));
}
// ***** Business Partner *****
if (m_partner == null)
{
int AD_Client_ID = Env.getAD_Client_ID(Env.getCtx());
m_partner = MBPartner.getTemplate(Env.getCtx(), AD_Client_ID);
m_partner.setAD_Org_ID(Env.getAD_Org_ID(Env.getCtx())); // Elaine 2009/07/03
boolean isSOTrx = !"N".equals(Env.getContext(Env.getCtx(), m_WindowNo, "IsSOTrx"));
m_partner.setIsCustomer (isSOTrx);
m_partner.setIsVendor (!isSOTrx);
}
// Check Value
String value = fValue.getText();
if (value == null || value.length() == 0)
{
// get Table Document No
value = DB.getDocumentNo (Env.getAD_Client_ID(Env.getCtx()), "C_BPartner", null);
fValue.setText(value);
}
m_partner.setValue(fValue.getText());
m_partner.setName(fName.getText());
m_partner.setName2(fName2.getText());
ListItem listitem = fGreetingBP.getSelectedItem();
KeyNamePair p = listitem != null ? (KeyNamePair)listitem.getValue() : null;
if (p != null && p.getKey() > 0)
m_partner.setC_Greeting_ID(p.getKey());
else
m_partner.setC_Greeting_ID(0);
if (m_partner.save())
log.fine("C_BPartner_ID=" + m_partner.getC_BPartner_ID());
else
FDialog.error(m_WindowNo, this, "BPartnerNotSaved");
// ***** Business Partner - Location *****
if (m_pLocation == null)
m_pLocation = new MBPartnerLocation(m_partner);
m_pLocation.setC_Location_ID(fAddress.getC_Location_ID());
m_pLocation.setPhone(fPhone.getText());
m_pLocation.setPhone2(fPhone2.getText());
m_pLocation.setFax(fFax.getText());
if (m_pLocation.save())
log.fine("C_BPartner_Location_ID=" + m_pLocation.getC_BPartner_Location_ID());
else
FDialog.error(m_WindowNo, this, "BPartnerNotSaved", Msg.translate(Env.getCtx(), "C_BPartner_Location_ID"));
// ***** Business Partner - User *****
String contact = fContact.getText();
String email = fEMail.getText();
if (m_user == null && (contact.length() > 0 || email.length() > 0))
m_user = new MUser (m_partner);
if (m_user != null)
{
if (contact.length() == 0)
contact = fName.getText();
m_user.setName(contact);
m_user.setEMail(email);
m_user.setTitle(fTitle.getText());
listitem = fGreetingC.getSelectedItem();
p = listitem != null ? (KeyNamePair)listitem.getValue() : null;
if (p != null && p.getKey() > 0)
m_user.setC_Greeting_ID(p.getKey());
else
m_user.setC_Greeting_ID(0);
m_user.setPhone(fPhone.getText());
m_user.setPhone2(fPhone2.getText());
m_user.setFax(fFax.getText());
if (m_user.save())
log.fine("AD_User_ID=" + m_user.getAD_User_ID());
else
FDialog.error(m_WindowNo, this, "BPartnerNotSaved", Msg.translate(Env.getCtx(), "AD_User_ID"));
}
return true;
} // actionSave
/**
* Returns BPartner ID
* @return C_BPartner_ID (0 = not saved)
*/
public int getC_BPartner_ID()
{
if (m_partner == null)
return 0;
return m_partner.getC_BPartner_ID();
} // getBPartner_ID
public void onEvent(Event e) throws Exception
{
if (m_readOnly)
this.detach();
// copy value
else if (e.getTarget() == fValue)
{
if (fName.getText() == null || fName.getText().length() == 0)
fName.setText(fValue.getText());
}
else if (e.getTarget() == fName)
{
if (fContact.getText() == null || fContact.getText().length() == 0)
fContact.setText(fName.getText());
}
// OK pressed
else if ((e.getTarget() == confirmPanel.getButton("Ok")) && actionSave())
this.detach();
// Cancel pressed
else if (e.getTarget() == confirmPanel.getButton("Cancel"))
this.detach();
}
public void valueChange(ValueChangeEvent evt)
{
}
}