#include "ACBase.h"

//extern ACBase app;

LedgerSetup::LedgerSetup(bool debug, c_company& cmp, c_access& stf) {
	CtrlLayout(*this, t_("Ledger Setup"));
	isDebug = debug;
	cmp.fullCopy(company);
	stf.fullCopy(staff);
	postInitCall = callback(this, &LedgerSetup::postinit);
	pbNew <<= THISBACK1(doEdit, CW_Mode_Adding);
	pbEdit <<= THISBACK1(doEdit, CW_Mode_Editing);
	pbDelete <<= THISBACK(doDelete);
	pbRefresh << THISBACK1(doRefresh, 0);
	pbSave <<= THISBACK(doSave);
	pbCancel <<= THISBACK(doCancel);
	pbClose <<= THISBACK(Close);
	datalist.AddIndex(pfs_rid);
	datalist.AddColumn(pfs_code, t_("Code"), 1);
	datalist.AddColumn(pfs_name, t_("Name"), 3);
	datalist.AddIndex(pfs_generic);
	datalist.AddIndex(pfs_subledger);
	datalist.AddIndex(pfs_status);
	datalist.WhenChangeRow = THISBACK(doShowData);
	datalist.SetToolBar(false).ColorCols().ColorRows().EvenColor();
	code.WhenEnter = THISBACK1(nextField, &name);
	name.WhenEnter = THISBACK1(nextField, &generic);
	generic.WhenAction = THISBACK1(nextField, &subledger);
	subledger.WhenAction = THISBACK1(nextField, &status);
	status.WhenAction = THISBACK1(nextField, &pbSave);
	statement.Show(isDebug);//////////////////////////////////////////////////////////
}

void LedgerSetup::postinit() {
	row.setDBU(dbc.dbUser);
	generic.Add("Asset", t_("Asset"));
	generic.Add("Liability", t_("Liability"));
	generic.Add("Income", t_("Income"));
	generic.Add("Expense", t_("Expense"));
	generic.Add("Equity", t_("Equity"));
	subledger.Add("None", t_("None"));
	subledger.Add("Bank", t_("Bank"));
	subledger.Add("Customer", t_("Customer"));
	subledger.Add("Supplier", t_("Supplier"));
	subledger.Add("Inventory", t_("Inventory"));
	subledger.Add("Purchase", t_("Purchase"));
	subledger.Add("Sales", t_("Sales"));
	subledger.Add("Cost", t_("Cost"));
	subledger.Add("Accrue", t_("Accrue"));
	status.Add(pfsStatusEnable, t_("Enable"));
	status.Add(pfsStatusDisable, t_("Disable"));
	doRefreshCtrl();
	doRefresh(0);
}

void LedgerSetup::doRefreshCtrl() {
	datalist.Enable(workmode == CW_Mode_Viewing);
	pbNew.Show(workmode == CW_Mode_Viewing);
	pbEdit.Show(workmode == CW_Mode_Viewing);
	pbDelete.Show(staff.isadmin && workmode == CW_Mode_Viewing);//////////////////////////////////////////////////////////
	pbRefresh.Show(workmode == CW_Mode_Viewing);
	pbSave.Show(workmode != CW_Mode_Viewing);
	pbCancel.Show(workmode != CW_Mode_Viewing);
	code.SetEditable(workmode != CW_Mode_Viewing);
	name.SetEditable(workmode != CW_Mode_Viewing);
	generic.SetEditable(workmode != CW_Mode_Viewing);
	subledger.SetEditable(workmode != CW_Mode_Viewing);
	status.SetEditable(workmode != CW_Mode_Viewing);
}

void LedgerSetup::doRefresh(int id) {
	int idx = -1;
	String queue = "select * from pfstbl_coa order by pfs_code";
	statement <<= queue;
	if (!dbc.connect()) {
		return;
	}
	datalist.Clear();
	Sql sql(dbc.session);
	if (sql.Execute(queue)) {
		while (sql.Fetch()) {
			datalist.Add(sql);
			if (int(sql[0] == id)) idx = datalist.GetCount() - 1;
		}
	} else {
		Exclamation(TableLoadError);
		if (isDebug) Exclamation(sqlDebug(sql));//////////////////////////////////////////////////////////
	}
	dbc.Close();
	if (idx > -1) {
		datalist.GoTo(idx);
	} else {
		datalist.GoTop();
	}
	datalist.SetFocus();
}

void LedgerSetup::doShowData() {
	code <<= "";
	name <<= "";
	generic <<= "Asset";
	subledger <<= "None";
	status <<= pfsStatusEnable;
	if (datalist.GetCursor() == -1) return;
	code <<= datalist(pfs_code);
	name <<= datalist(pfs_name);
	generic <<= datalist(pfs_generic);
	subledger <<= datalist(pfs_subledger);
	status <<= datalist(pfs_status);
}

void LedgerSetup::doEdit(int wmode) {
	int rid = 0;
	if (wmode == CW_Mode_Editing) {
		if (datalist.GetCount() == 0) return;
		if (datalist.GetCursor() == -1) {
			Exclamation(t_("Please select a record to edit!"));
			return;
		}
		rid = int(datalist(pfs_rid));
	}
	if (!row.load(rid)) {
		Exclamation(TableLoadError);
		if (isDebug) Exclamation(row.debug());//////////////////////////////////////////////////////////
		return;
	}
	workmode = wmode;
	doRefreshCtrl();
	code <<= row.get("pfs_code");
	name <<= row.get("pfs_name");
	generic <<= row.get("pfs_generic");
	subledger <<= row.get("pfs_subledger");
	status <<= row.get("pfs_status");
	if (workmode == CW_Mode_Adding) {
		code.SetFocus();
	} else {
		name.SetFocus();
	}
}

void LedgerSetup::doSave() {
	int i;
	String data = "";
	if (AsString(~code).IsEmpty()) {
		Exclamation(NoRequireData);
		code.SetFocus();
		return;
	}
	if (AsString(~name).IsEmpty()) {
		Exclamation(NoRequireData);
		name.SetFocus();
		return;
	}
	row.set("pfs_code", ~code);
	row.set("pfs_name", ~name);
	row.set("pfs_generic", ~generic);
	row.set("pfs_subledger", ~subledger);
	row.set("pfs_status", ~status);
	if (row.duplicate()) {
		if (row.ErrCode == 12) {
			Exclamation(Duplicated);
		} else {
			Exclamation(row.debug());
		}
		code.SetFocus();
		return;
	}
	if (row.save()) {
		workmode = CW_Mode_Viewing;
		doRefreshCtrl();
		doRefresh(row.rid);
	} else {
		Exclamation(SaveError);
		if (isDebug) Exclamation(row.ErrMsg);//////////////////////////////////////////////////////////
	}
}

void LedgerSetup::doCancel() {
	workmode = CW_Mode_Viewing;
	doRefreshCtrl();
	doShowData();
}

void LedgerSetup::doDelete() {
	Exclamation("Function not available yet!");
}
