/******************************************************************************
* Product: Adempiere ERP & CRM Smart Business Solution *
* Copyright (C) 1999-2006 ComPiere, Inc. 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 *
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
* or via info@compiere.org or http://www.compiere.org/license.html *
*****************************************************************************/
/**
* 2007, Modified by Posterita Ltd.
*/
package org.adempiere.webui.apps.form;
import java.util.logging.Level;
import org.adempiere.webui.component.Button;
import org.adempiere.webui.component.Checkbox;
import org.adempiere.webui.component.ConfirmPanel;
import org.adempiere.webui.component.Grid;
import org.adempiere.webui.component.GridFactory;
import org.adempiere.webui.component.Label;
import org.adempiere.webui.component.ListModelTable;
import org.adempiere.webui.component.Panel;
import org.adempiere.webui.component.Row;
import org.adempiere.webui.component.Rows;
import org.adempiere.webui.component.Textbox;
import org.adempiere.webui.component.WListbox;
import org.adempiere.webui.panel.ADForm;
import org.adempiere.webui.panel.CustomForm;
import org.adempiere.webui.panel.IFormController;
import org.adempiere.webui.session.SessionManager;
import org.adempiere.webui.window.FDialog;
import org.compiere.apps.form.Charge;
import org.compiere.util.CLogger;
import org.compiere.util.Env;
import org.compiere.util.Msg;
import org.compiere.util.Util;
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.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.Separator;
/**
* This class represents the Custom Form for generating charges
* from natural accounts.
*
* The form is comprised of two parts.
* The upper portion can be used to create new charges using the general charge accounts.
* The lower portion can be used to create charges based on the natural account.
*
* @author Andrew Kimball
*
*/
public class WCharge extends Charge implements IFormController, EventListener
{
/**
*
*/
private static final long serialVersionUID = 4210542409436277344L;
private CustomForm form = new CustomForm();
/** AD_Message for "Create". */
private static final String AD_MESSAGE_CREATE = "Create";
/** Logger. */
private static CLogger log = CLogger.getCLogger(WCharge.class);
// new panel
/** Grid for components for creating a new charge account. */
private Grid m_grdNew = GridFactory.newGridLayout();
/** Value (key) field label. */
private Label m_lblValue = new Label();
/** Field for specifying value (key) of new account. */
private Textbox m_txbValueField = new Textbox();
/** Checkbox for specifying whether or not the new account is an expense account. */
private Checkbox m_chbIsExpense = new Checkbox();
/** Name field label. */
private Label m_lblName = new Label();
/** Field for specifying name of new account. */
private Textbox m_txbNameField = new Textbox();
/** Button to create new account. */
private Button m_btnNew = new Button();
// account panel
/** Grid for components for creating a charge form a selected account. **/
private Panel m_pnlAccount = new Panel();
/** Button to create charge from selected account. */
private Button m_btnAccount = new Button();
/** Table to hold data of accounts. */
private WListbox m_tblData = new WListbox();
/** confirmation panel. */
private ConfirmPanel m_pnlConfirm = new ConfirmPanel();
/** Confirmation Grid. */
private Grid m_grdConfirm = GridFactory.newGridLayout();
/** Enumeration of column names and indices. */
private enum EColumn
{
/** Select column to record whether the account is selected. */
SELECT(0, "Select"),
/** Value column to hold the account key. */
VALUE(1, "Value"),
/** Name column to hold the account name. */
NAME(2, "Name"),
/** Expense column to indicate whether or not the account is an expense account. */
EXPENSE(3, "Expense");
/** The column's index. */
private final int m_index;
/** The column's name. */
private final String m_title;
/**
* Constructor.
*
* @param index index of the column
* @param title name of the column
*/
EColumn(int index, String title)
{
m_index = index;
m_title = title;
}
/**
* Gets the index of the column.
*
* @return the column index.
*/
public int index()
{
return m_index;
}
/**
* Gets the name of the column.
*
* @return the column's name
*/
public String title()
{
return m_title;
}
/**
* Gets the number of columns.
*
* @return the number of columns.
*/
public static int count()
{
return values().length;
}
}
/**
* Default constructor.
*/
public WCharge()
{
super();
initForm();
}
/**
* Initialises the panel.
*
* @param adFormId The Adempiere identifier for the form
* @param name The name of the form
*/
protected void initForm()
{
log.info("");
try
{
staticInitialise();
dynamicInitialise();
zkInit();
}
catch(Exception e)
{
log.log(Level.SEVERE, "", e);
}
return;
}
/**
* Initialises the static components of the form.
*/
private void staticInitialise()
{
createNewChargePanel();
createAccountPanel();
createConfirmPanel();
return;
}
private void zkInit()
{
Borderlayout contentPane = new Borderlayout();
form.appendChild(contentPane);
North north = new North();
contentPane.appendChild(north);
north.appendChild(m_grdNew);
Center center = new Center();
contentPane.appendChild(center);
center.appendChild(m_pnlAccount);
South south = new South();
contentPane.appendChild(south);
Panel southPanel = new Panel();
south.appendChild(southPanel);
southPanel.appendChild(new Separator());
southPanel.appendChild(m_grdConfirm);
}
/**
* Creates the account panel.
*
* The account panel contains:
* <li>a table detailing all accounts
* <li>a button for creating charges for selected accounts
*/
private void createAccountPanel()
{
Borderlayout borderlayout = new Borderlayout();
borderlayout.setStyle("position: absolute");
borderlayout.setWidth("100%");
borderlayout.setHeight("100%");
m_pnlAccount.appendChild(borderlayout);
North north = new North();
north.setBorder("none");
borderlayout.appendChild(north);
Label label = new Label(Msg.getMsg(Env.getCtx(), "ChargeFromAccount"));
label.setStyle("font-weight: bold;");
north.appendChild(label);
Center center = new Center();
center.setBorder("none");
center.setFlex(true);
center.setAutoscroll(true);
borderlayout.appendChild(center);
center.appendChild(m_tblData);
South south = new South();
south.setBorder("none");
borderlayout.appendChild(south);
Panel southPanel = new Panel();
southPanel.setAlign("right");
south.appendChild(southPanel);
m_btnAccount.setLabel(Msg.getMsg(Env.getCtx(), AD_MESSAGE_CREATE) + " " + Msg.getMsg(Env.getCtx(), "From") + " " + Msg.getElement(Env.getCtx(), "Account_ID"));
m_btnAccount.addEventListener(Events.ON_CLICK, this);
southPanel.appendChild(m_btnAccount);
return;
}
/**
* Creates the New Charge panel.
*
* The New Charge panel is used to specify the name and key of an account
* and whether or not the account is a charge account.
*/
private void createNewChargePanel()
{
final int nameFieldColumns = 20;
final int valueFieldColumns = 10;
// top row
m_lblValue.setValue(Msg.translate(Env.getCtx(), EColumn.VALUE.title()));
m_txbValueField.setCols(valueFieldColumns);
m_chbIsExpense.setChecked(true);
m_chbIsExpense.setLabel(Msg.getMsg(Env.getCtx(), EColumn.EXPENSE.title()));
// bottom row
m_lblName.setValue(Msg.translate(Env.getCtx(), EColumn.NAME.title()));
m_txbNameField.setCols(nameFieldColumns);
m_btnNew.setLabel(Msg.getMsg(Env.getCtx(), AD_MESSAGE_CREATE) + " " + Util.cleanAmp(Msg.getMsg(Env.getCtx(), "New")));
m_btnNew.addEventListener(Events.ON_CLICK, this);
Rows rows = new Rows();
m_grdNew.appendChild(rows);
Row row = new Row();
rows.appendChild(row);
row.setSpans("3");
Label label = new Label(Msg.getMsg(Env.getCtx(), "ChargeNewAccount"));
label.setStyle("font-weight: bold;");
row.appendChild(label);
row = new Row();
rows.appendChild(row);
row.appendChild(m_lblValue);
row.appendChild(m_txbValueField);
row.appendChild(m_chbIsExpense);
row = new Row();
rows.appendChild(row);
row.appendChild(m_lblName);
row.appendChild(m_txbNameField);
row.appendChild(m_btnNew);
row = new Row();
rows.appendChild(row);
row.setSpans("3");
row.appendChild(new Separator());
return;
}
/**
* Initialises the dynamic components of the form.
* <li>Gets defaults for primary AcctSchema
* <li>Creates Table with Accounts
*/
private void dynamicInitialise()
{
findChargeElementID();
ListModelTable model = new ListModelTable(getData());
m_tblData.setData(model, getColumnNames());
setColumnClass(m_tblData);
findTaxCategoryID();
return;
} // dynInit
/**
* Event Listener.
*
* @param event event that has been fired.
*/
public void onEvent(Event event)
{
log.info(event.getName());
//
if (event.getTarget().getId().equals(ConfirmPanel.A_OK) || m_C_Element_ID == 0)
{
close();
}
// new Account
else if (event.getTarget().equals(m_btnNew))
{
createNew();
}
else if (event.getTarget().equals(m_btnAccount))
{
createAccount();
}
return;
}
/**
* Create new Chargeable Account.
*/
private void createNew()
{
String value;
String name;
log.config("");
// Get Input
value = m_txbValueField.getValue();
if (value.length() == 0)
{
throw new WrongValueException(m_txbValueField, Msg.getMsg(Env.getCtx(), "FillMandatory") + m_lblValue.getValue());
}
name = m_txbNameField.getText();
if (name.length() == 0)
{
throw new WrongValueException(m_txbNameField, Msg.getMsg(Env.getCtx(), "FillMandatory") + m_lblName.getValue());
}
// Create Element
int elementValueId = createElementValue (value, name, m_chbIsExpense.isChecked());
if (elementValueId == 0)
{
FDialog.error(form.getWindowNo(), form, "ChargeNotCreated", name);
return;
}
// Create Charge
int chargeId = createCharge(name, elementValueId);
if (chargeId == 0)
{
FDialog.error(form.getWindowNo(), form, "ChargeNotCreated", name);
return;
}
FDialog.info(form.getWindowNo(), form, "ChargeCreated", name);
} // createNew
/**
* Creates Charges from Accounts.
* Charges are created for the selected accounts.
* The selection is cleared upon completion.
*/
private void createAccount()
{
createAccount(m_tblData);
if (listCreated.length() > 0)
{
FDialog.info(form.getWindowNo(), form, "ChargeCreated", listCreated.toString());
}
if (listRejected.length() > 0)
{
FDialog.error(form.getWindowNo(), form, "ChargeNotCreated", listRejected.toString());
}
return;
} // createAccount
/**
* Create Confirmation Panel with OK Button.
*/
public void createConfirmPanel()
{
Rows rows = new Rows();
Row row = new Row();
m_pnlConfirm.addActionListener(this);
row.appendChild(m_pnlConfirm);
rows.appendChild(row);
m_grdConfirm.appendChild(rows);
return;
} // ConfirmPanel
public void close()
{
SessionManager.getAppDesktop().closeActiveWindow();
}
public ADForm getForm() {
return form;
}
}