From: <ste...@us...> - 2013-03-24 04:37:04
|
Revision: 3620 http://sourceforge.net/p/moneymanagerex/code/3620 Author: stef145g Date: 2013-03-24 04:37:00 +0000 (Sun, 24 Mar 2013) Log Message: ----------- Updated Assets using new db access classes Modified Paths: -------------- trunk/mmex/build/msw-vc-2010e/mmex_mmex.vcxproj trunk/mmex/build/msw-vc-2010e/mmex_mmex.vcxproj.filters trunk/mmex/src/assetdialog.cpp trunk/mmex/src/assetdialog.h trunk/mmex/src/assetspanel.cpp trunk/mmex/src/assetspanel.h trunk/mmex/src/constants.h trunk/mmex/src/dbwrapper.cpp trunk/mmex/src/dbwrapper.h trunk/mmex/src/mmex.cpp trunk/mmex/src/mmhomepagepanel.cpp trunk/mmex/src/reports/summary.cpp trunk/mmex/src/reports/summaryassets.cpp trunk/mmex/src/reports/summaryassets.h Added Paths: ----------- trunk/mmex/src/db/ trunk/mmex/src/db/assets.cpp trunk/mmex/src/db/assets.h trunk/mmex/src/db/entry_base.cpp trunk/mmex/src/db/entry_base.h Modified: trunk/mmex/build/msw-vc-2010e/mmex_mmex.vcxproj =================================================================== --- trunk/mmex/build/msw-vc-2010e/mmex_mmex.vcxproj 2013-03-24 00:49:12 UTC (rev 3619) +++ trunk/mmex/build/msw-vc-2010e/mmex_mmex.vcxproj 2013-03-24 04:37:00 UTC (rev 3620) @@ -345,6 +345,8 @@ <ClCompile Include="..\..\src\customreportdisplay.cpp" /> <ClCompile Include="..\..\src\customreportindex.cpp" /> <ClCompile Include="..\..\src\dbwrapper.cpp" /> + <ClCompile Include="..\..\src\db\assets.cpp" /> + <ClCompile Include="..\..\src\db\entry_base.cpp" /> <ClCompile Include="..\..\src\fileviewerdialog.cpp" /> <ClCompile Include="..\..\src\filtertransdialog.cpp" /> <ClCompile Include="..\..\src\guiid.cpp" /> @@ -420,6 +422,8 @@ <ClInclude Include="..\..\src\customreportdisplay.h" /> <ClInclude Include="..\..\src\customreportindex.h" /> <ClInclude Include="..\..\src\dbwrapper.h" /> + <ClInclude Include="..\..\src\db\assets.h" /> + <ClInclude Include="..\..\src\db\entry_base.h" /> <ClInclude Include="..\..\src\defs.h" /> <ClInclude Include="..\..\src\fileviewerdialog.h" /> <ClInclude Include="..\..\src\filtertransdialog.h" /> Modified: trunk/mmex/build/msw-vc-2010e/mmex_mmex.vcxproj.filters =================================================================== --- trunk/mmex/build/msw-vc-2010e/mmex_mmex.vcxproj.filters 2013-03-24 00:49:12 UTC (rev 3619) +++ trunk/mmex/build/msw-vc-2010e/mmex_mmex.vcxproj.filters 2013-03-24 04:37:00 UTC (rev 3620) @@ -19,6 +19,12 @@ <Filter Include="Source Files\reports"> <UniqueIdentifier>{cff7ab9a-0de6-4517-9679-eec2479295b3}</UniqueIdentifier> </Filter> + <Filter Include="Header Files\db"> + <UniqueIdentifier>{6a9c7355-3005-47b8-8da6-f6b46a1674f0}</UniqueIdentifier> + </Filter> + <Filter Include="Source Files\db"> + <UniqueIdentifier>{53d1a7a8-ed3c-4701-848e-41fcb1497fc2}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="..\..\src\aboutdialog.cpp"> @@ -240,6 +246,12 @@ <ClCompile Include="..\..\src\reports\budgetcategorysummary.cpp"> <Filter>Source Files\reports</Filter> </ClCompile> + <ClCompile Include="..\..\src\db\assets.cpp"> + <Filter>Source Files\db</Filter> + </ClCompile> + <ClCompile Include="..\..\src\db\entry_base.cpp"> + <Filter>Source Files\db</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="..\..\src\aboutdialog.h"> @@ -473,6 +485,12 @@ <ClInclude Include="..\..\src\transdialog.h"> <Filter>Header Files</Filter> </ClInclude> + <ClInclude Include="..\..\src\db\assets.h"> + <Filter>Header Files\db</Filter> + </ClInclude> + <ClInclude Include="..\..\src\db\entry_base.h"> + <Filter>Header Files\db</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <ResourceCompile Include="..\..\resources\mmex.rc"> Modified: trunk/mmex/src/assetdialog.cpp =================================================================== --- trunk/mmex/src/assetdialog.cpp 2013-03-24 00:49:12 UTC (rev 3619) +++ trunk/mmex/src/assetdialog.cpp 2013-03-24 04:37:00 UTC (rev 3620) @@ -15,21 +15,12 @@ ********************************************************/ #include "assetdialog.h" -#include "util.h" -#include "dbwrapper.h" -#include "currencydialog.h" -#include "defs.h" #include "paths.h" -#include "constants.h" - #include <wx/datectrl.h> namespace { -enum { DEF_CHANGE_NONE, DEF_CHANGE_APPRECIATE, DEF_CHANGE_DEPRECIATE }; -enum { DEF_ASSET_PROPERTY, DEF_ASSET_AUTO, DEF_ASSET_HOUSE, DEF_ASSET_ART, DEF_ASSET_JEWELLERY, DEF_ASSET_CASH, DEF_ASSET_OTHER }; - enum { IDC_COMBO_TYPE = wxID_HIGHEST + 1, @@ -48,11 +39,18 @@ EVT_CHILD_FOCUS(mmAssetDialog::changeFocus) END_EVENT_TABLE() +mmAssetDialog::mmAssetDialog() +: core_() +, assetsPanel_(0) +, pAssetEntry_() +, m_edit() +{} -mmAssetDialog::mmAssetDialog(wxWindow* parent, mmCoreDB* core, mmAssetHolder* asset_holder, bool edit) : - core_(core), - asset_holder_(asset_holder), - m_edit(edit) +mmAssetDialog::mmAssetDialog(wxWindow* parent, mmCoreDB* core, mmAssetsPanel* assetsPanel, TAssetEntry* pAssetEntry, bool edit) +: core_(core) +, assetsPanel_(assetsPanel) +, pAssetEntry_(pAssetEntry) +, m_edit(edit) { long style = wxCAPTION | wxSYSTEM_MENU | wxCLOSE_BOX; @@ -73,8 +71,6 @@ SetIcon(mmex::getProgramIcon()); - fillControls(); - if (m_edit) dataToControls(); else @@ -86,33 +82,26 @@ void mmAssetDialog::dataToControls() { - assetID_ = asset_holder_->id_; + assetID_ = pAssetEntry_->GetId(); - m_assetName->SetValue(asset_holder_->assetName_); - m_notes->SetValue(asset_holder_->assetNotes_); + m_assetName->SetValue(pAssetEntry_->name_); + m_notes->SetValue(pAssetEntry_->notes_); - wxDateTime dtdt = asset_holder_->assetDate_; - wxString dt = mmGetDateForDisplay(dtdt); + wxDateTime dtdt = mmGetStorageStringAsDate(pAssetEntry_->date_); m_dpc->SetValue(dtdt); - wxString value; - mmex::formatDoubleToCurrencyEdit(asset_holder_->value_, value); - m_value->SetValue(value); + m_value->SetValue(pAssetEntry_->GetValueCurrencyEditFormat(true)); wxString valueChangeRate; - valueChangeRate.Printf(wxT("%.3f"), asset_holder_->valueChange_); + valueChangeRate.Printf(wxT("%.3f"), pAssetEntry_->rate_value_); m_valueChangeRate->SetValue(valueChangeRate); - wxString valueChangeTypeStr = asset_holder_->sAssetValueChange_; + wxString valueChangeTypeStr = pAssetEntry_->rate_type_; m_valueChange->SetStringSelection(wxGetTranslation(valueChangeTypeStr)); - enableDisableRate(valueChangeTypeStr != wxT("None")); - m_assetType->SetStringSelection(wxGetTranslation(asset_holder_->assetType_)); + enableDisableRate(valueChangeTypeStr != ASSET_RATE_DEF[NONE]); + m_assetType->SetStringSelection(wxGetTranslation(pAssetEntry_->type_)); } -void mmAssetDialog::fillControls() -{ -} - void mmAssetDialog::CreateControls() { wxSizerFlags flags, flagsExpand; @@ -153,13 +142,13 @@ itemFlexGridSizer6->Add(new wxStaticText( itemPanel5, wxID_STATIC, _("Asset Type")), flags); m_assetType = new wxChoice( itemPanel5, wxID_STATIC, wxDefaultPosition, wxSize(150,-1)); - size_t size = sizeof(ASSET_TYPE)/sizeof(wxString); + size_t size = sizeof(ASSET_TYPE_DEF)/sizeof(wxString); for(size_t i = 0; i < size; ++i) - m_assetType->Append(wxGetTranslation(ASSET_TYPE[i]), - new wxStringClientData(ASSET_TYPE[i])); + m_assetType->Append(wxGetTranslation(ASSET_TYPE_DEF[i]), + new wxStringClientData(ASSET_TYPE_DEF[i])); m_assetType->SetToolTip(_("Select type of asset")); - m_assetType->SetSelection(DEF_ASSET_PROPERTY); + m_assetType->SetSelection(PROPERTY); itemFlexGridSizer6->Add(m_assetType, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxALL, 5); @@ -172,17 +161,15 @@ itemFlexGridSizer6->Add(new wxStaticText( itemPanel5, wxID_STATIC, _("Change in Value")), flags); m_valueChange = new wxChoice( itemPanel5, IDC_COMBO_TYPE, wxDefaultPosition, wxSize(150,-1)); - wxString value_change[] = { - wxTRANSLATE("None"), - wxTRANSLATE("Appreciates"), - wxTRANSLATE("Depreciates")}; - size = sizeof(value_change)/sizeof(wxString); + size = sizeof(ASSET_RATE_DEF)/sizeof(wxString); for(size_t i = 0; i < size; ++i) - m_valueChange->Append(wxGetTranslation(value_change[i]), - new wxStringClientData(value_change[i])); + { + m_valueChange->Append(wxGetTranslation(ASSET_RATE_DEF[i]), + new wxStringClientData(ASSET_RATE_DEF[i])); + } m_valueChange->SetToolTip(_("Specify if the value of the asset changes over time")); - m_valueChange->SetSelection(DEF_CHANGE_NONE); + m_valueChange->SetSelection(NONE); itemFlexGridSizer6->Add(m_valueChange, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5); m_valueChangeRateLabel = new wxStaticText( itemPanel5, wxID_STATIC, _("% Rate")); @@ -219,7 +206,7 @@ { int selection = m_valueChange->GetSelection(); // Disable for "None", Enable for "Appreciates" or "Depreciates" - enableDisableRate(selection != DEF_CHANGE_NONE); + enableDisableRate(selection != NONE); } void mmAssetDialog::enableDisableRate(bool en) @@ -241,20 +228,16 @@ void mmAssetDialog::OnOk(wxCommandEvent& /*event*/) { - wxString pdate = m_dpc->GetValue().FormatISODate(); - wxString notes = m_notes->GetValue().Trim(); - wxString name = m_assetName->GetValue().Trim(); - wxString valueStr = m_value->GetValue().Trim(); if (valueStr.IsEmpty()) { - mmShowErrorMessageInvalid(this, _("Value")); + wxMessageBox(_("Value"), _("Invalid Entry"), wxOK|wxICON_ERROR); return; } double value = 0; if (!mmex::formatCurrencyToDouble(valueStr, value)) { - mmShowErrorMessage(this, _("Invalid Value "), _("Error")); + wxMessageBox(_("Invalid Value "), _("Invalid Entry"), wxOK|wxICON_ERROR); return; } @@ -264,19 +247,20 @@ if (value_change_obj) valueChangeTypeStr = value_change_obj->GetData(); wxString valueChangeRateStr = m_valueChangeRate->GetValue().Trim(); - if (valueChangeRateStr.IsEmpty() && valueChangeType != DEF_CHANGE_NONE) + if (valueChangeRateStr.IsEmpty() && valueChangeType != NONE) { - mmShowErrorMessageInvalid(this, _("Rate of Change in Value")); + wxMessageBox(_("Rate of Change in Value"), _("Invalid Entry"), wxOK|wxICON_ERROR); return; } double valueChangeRate = 0; - if(!valueChangeRateStr.ToDouble(&valueChangeRate)) { + if(!valueChangeRateStr.ToDouble(&valueChangeRate)) + { valueChangeRate = -1.0; } //This should be unnecessary with hidden controls - if ((valueChangeType != DEF_CHANGE_NONE) && (valueChangeRate < 0.0)) + if ((valueChangeType != NONE) && (valueChangeRate < 0.0)) { - mmShowErrorMessage(this, _("Invalid Value "), _("Error")); + wxMessageBox(_("Invalid Value "), _("Invalid Entry"), wxOK|wxICON_ERROR); return; } @@ -284,31 +268,24 @@ wxStringClientData* type_obj = (wxStringClientData *)m_assetType->GetClientObject(m_assetType->GetSelection()); if (type_obj) asset_type = type_obj->GetData(); - wxSQLite3Statement st; + if (!pAssetEntry_) + { + pAssetEntry_ = new TAssetEntry(); + } + + pAssetEntry_->date_ = m_dpc->GetValue().FormatISODate(); + pAssetEntry_->notes_ = m_notes->GetValue().Trim(); + pAssetEntry_->name_ = m_assetName->GetValue().Trim(); + pAssetEntry_->value_ = value; + pAssetEntry_->rate_type_ = valueChangeTypeStr; + pAssetEntry_->rate_value_ = valueChangeRate; + pAssetEntry_->type_ = asset_type; + if (m_edit) - st = core_->db_.get()->PrepareStatement(UPDATE_ASSETS_V1); + pAssetEntry_->Update(core_->db_.get()); else - st = core_->db_.get()->PrepareStatement(INSERT_INTO_ASSETS_V1); + assetID_ = assetsPanel_->AssetList().AddEntry(pAssetEntry_); - int i = 0; - st.Bind(++i, pdate); - st.Bind(++i, name); - st.Bind(++i, value); - st.Bind(++i, valueChangeTypeStr); - st.Bind(++i, notes); - st.Bind(++i, valueChangeRate); - st.Bind(++i, asset_type); - if (m_edit) st.Bind(++i, assetID_); - - wxASSERT(st.GetParamCount() == i); - - st.ExecuteUpdate(); - st.Finalize(); - - mmOptions::instance().databaseUpdated_ = true; - if (!m_edit) - assetID_ = core_->db_.get()->GetLastRowId().ToLong(); - EndModal(wxID_OK); } @@ -323,6 +300,8 @@ void mmAssetDialog::changeFocus(wxChildFocusEvent& event) { wxWindow *w = event.GetWindow(); - if ( w ) - assetRichText = (w->GetId() == IDC_NOTES ? true : false); + if ( w ) + { + assetRichText = (w->GetId() == IDC_NOTES ? true : false); + } } Modified: trunk/mmex/src/assetdialog.h =================================================================== --- trunk/mmex/src/assetdialog.h 2013-03-24 00:49:12 UTC (rev 3619) +++ trunk/mmex/src/assetdialog.h 2013-03-24 04:37:00 UTC (rev 3620) @@ -14,11 +14,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ********************************************************/ -#ifndef _MM_EX_ASSETDIALOG_H_ -#define _MM_EX_ASSETDIALOG_H_ - -#include "defs.h" -#include "mmcoredb.h" +#pragma once #include "assetspanel.h" class wxDatePickerCtrl; @@ -30,13 +26,15 @@ DECLARE_EVENT_TABLE() public: - mmAssetDialog() : core_(), asset_holder_(), m_edit() {} - mmAssetDialog(wxWindow *parent, mmCoreDB* core, mmAssetHolder* asset_holder, bool edit); + mmAssetDialog(); + mmAssetDialog(wxWindow *parent, mmCoreDB* core, mmAssetsPanel* assetsPanel, + TAssetEntry* pAssetEntry, bool edit); int GetAssetID() {return assetID_;} private: mmCoreDB* core_; - mmAssetHolder* asset_holder_; + mmAssetsPanel* assetsPanel_; + TAssetEntry* pAssetEntry_; bool m_edit; bool assetRichText; @@ -59,10 +57,7 @@ void OnChangeAppreciationType(wxCommandEvent& event); void enableDisableRate(bool en); - void fillControls(); void dataToControls(); void changeFocus(wxChildFocusEvent& event); int assetID_; - }; -#endif Modified: trunk/mmex/src/assetspanel.cpp =================================================================== --- trunk/mmex/src/assetspanel.cpp 2013-03-24 00:49:12 UTC (rev 3619) +++ trunk/mmex/src/assetspanel.cpp 2013-03-24 04:37:00 UTC (rev 3620) @@ -15,13 +15,10 @@ ********************************************************/ #include "assetspanel.h" -#include "util.h" #include "guiid.h" -#include "dbwrapper.h" #include "assetdialog.h" #include "constants.h" - namespace { @@ -38,37 +35,46 @@ } // namespace /*******************************************************/ -BEGIN_EVENT_TABLE(assetsListCtrl, wxListCtrl) - EVT_LIST_ITEM_ACTIVATED(IDC_PANEL_STOCKS_LISTCTRL, assetsListCtrl::OnListItemActivated) - EVT_LIST_ITEM_RIGHT_CLICK(IDC_PANEL_STOCKS_LISTCTRL, assetsListCtrl::OnItemRightClick) - EVT_LIST_ITEM_SELECTED(IDC_PANEL_STOCKS_LISTCTRL, assetsListCtrl::OnListItemSelected) - EVT_LIST_ITEM_DESELECTED(IDC_PANEL_STOCKS_LISTCTRL, assetsListCtrl::OnListItemDeselected) - EVT_LIST_COL_END_DRAG(IDC_PANEL_STOCKS_LISTCTRL, assetsListCtrl::OnItemResize) - EVT_LIST_COL_CLICK(IDC_PANEL_STOCKS_LISTCTRL, assetsListCtrl::OnColClick) +BEGIN_EVENT_TABLE(mmAssetsListCtrl, wxListCtrl) + EVT_LIST_ITEM_ACTIVATED(IDC_PANEL_STOCKS_LISTCTRL, mmAssetsListCtrl::OnListItemActivated) + EVT_LIST_ITEM_RIGHT_CLICK(IDC_PANEL_STOCKS_LISTCTRL, mmAssetsListCtrl::OnItemRightClick) + EVT_LIST_ITEM_SELECTED(IDC_PANEL_STOCKS_LISTCTRL, mmAssetsListCtrl::OnListItemSelected) + EVT_LIST_ITEM_DESELECTED(IDC_PANEL_STOCKS_LISTCTRL, mmAssetsListCtrl::OnListItemDeselected) + EVT_LIST_COL_END_DRAG(IDC_PANEL_STOCKS_LISTCTRL, mmAssetsListCtrl::OnItemResize) + EVT_LIST_COL_CLICK(IDC_PANEL_STOCKS_LISTCTRL, mmAssetsListCtrl::OnColClick) - EVT_MENU(MENU_TREEPOPUP_NEW, assetsListCtrl::OnNewAsset) - EVT_MENU(MENU_TREEPOPUP_EDIT, assetsListCtrl::OnEditAsset) - EVT_MENU(MENU_TREEPOPUP_DELETE, assetsListCtrl::OnDeleteAsset) + EVT_MENU(MENU_TREEPOPUP_NEW, mmAssetsListCtrl::OnNewAsset) + EVT_MENU(MENU_TREEPOPUP_EDIT, mmAssetsListCtrl::OnEditAsset) + EVT_MENU(MENU_TREEPOPUP_DELETE, mmAssetsListCtrl::OnDeleteAsset) - EVT_LIST_KEY_DOWN(wxID_ANY, assetsListCtrl::OnListKeyDown) + EVT_LIST_KEY_DOWN(wxID_ANY, mmAssetsListCtrl::OnListKeyDown) END_EVENT_TABLE() /*******************************************************/ -void assetsListCtrl::OnItemResize(wxListEvent& event) +mmAssetsListCtrl::mmAssetsListCtrl(mmAssetsPanel* cp, wxWindow *parent, +const wxWindowID id, const wxPoint& pos, const wxSize& size, long style) +: wxListCtrl(parent, id, pos, size, style) +, m_attr1(mmColors::listBorderColor, mmColors::listAlternativeColor0, wxNullFont) +, m_attr2(mmColors::listBorderColor, mmColors::listAlternativeColor1, wxNullFont) +, cp_(cp) +, selectedIndex_(-1) +{} + +void mmAssetsListCtrl::OnItemResize(wxListEvent& event) { int i = event.GetColumn(); int width = cp_->GetListCtrlWidth(i); cp_->core_->iniSettings_->SetIntSetting(wxString::Format(wxT("ASSETS_COL%d_WIDTH"), i), width); } -void assetsListCtrl::InitVariables() +void mmAssetsListCtrl::InitVariables() { m_selected_col = 0; m_asc = true; cp_->SetFilter(wxT(" 'Property','Automobile','Household Object','Art','Jewellery','Cash','Other' ")); } -void assetsListCtrl::OnItemRightClick(wxListEvent& event) +void mmAssetsListCtrl::OnItemRightClick(wxListEvent& event) { selectedIndex_ = event.GetIndex(); @@ -80,43 +86,43 @@ PopupMenu(&menu, event.GetPoint()); } -wxString assetsListCtrl::OnGetItemText(long item, long column) const +wxString mmAssetsListCtrl::OnGetItemText(long item, long column) const { return cp_->getItem(item, column); } -void assetsListCtrl::OnListItemSelected(wxListEvent& event) +void mmAssetsListCtrl::OnListItemSelected(wxListEvent& event) { selectedIndex_ = event.GetIndex(); cp_->updateExtraAssetData(selectedIndex_); } -void assetsListCtrl::OnListItemDeselected(wxListEvent& /*event*/) +void mmAssetsListCtrl::OnListItemDeselected(wxListEvent& /*event*/) { selectedIndex_ = -1; cp_->updateExtraAssetData(selectedIndex_); } -int assetsListCtrl::OnGetItemImage(long item) const +int mmAssetsListCtrl::OnGetItemImage(long item) const { int image_id = 0; - size_t size = sizeof(ASSET_TYPE)/sizeof(wxString); + size_t size = sizeof(ASSET_TYPE_DEF)/sizeof(wxString); for(size_t i = 0; i < size; ++i) { - if (ASSET_TYPE[i] == OnGetItemText(item, COL_TYPE)) + if (ASSET_TYPE_DEF[i] == OnGetItemText(item, COL_TYPE)) image_id = i; } return item; } -wxListItemAttr* assetsListCtrl::OnGetItemAttr(long item) const +wxListItemAttr* mmAssetsListCtrl::OnGetItemAttr(long item) const { /* Returns the alternating background pattern */ return item % 2 ? (wxListItemAttr *)&m_attr2 : (wxListItemAttr *)&m_attr1; } -void assetsListCtrl::OnListKeyDown(wxListEvent& event) +void mmAssetsListCtrl::OnListKeyDown(wxListEvent& event) { if (event.GetKeyCode() == WXK_DELETE) { @@ -129,20 +135,20 @@ } } -void assetsListCtrl::OnNewAsset(wxCommandEvent& /*event*/) +void mmAssetsListCtrl::OnNewAsset(wxCommandEvent& /*event*/) { - mmAssetDialog dlg(this, cp_->core_, NULL, false); + mmAssetDialog dlg(this, cp_->core_, cp_, NULL, false); if (dlg.ShowModal() == wxID_OK) { doRefreshItems(dlg.GetAssetID()); } } -void assetsListCtrl::doRefreshItems(int trx_id) +void mmAssetsListCtrl::doRefreshItems(int trx_id) { int selectedIndex = cp_->initVirtualListControl(trx_id, m_selected_col, m_asc); - long cnt = static_cast<long>(cp_->getTrans().size()); + long cnt = static_cast<long>(cp_->AssetList().entrylist_.size()); if (selectedIndex >= cnt || selectedIndex < 0) selectedIndex = m_asc ? cnt - 1 : 0; @@ -161,24 +167,23 @@ selectedIndex_ = selectedIndex; } -void assetsListCtrl::OnDeleteAsset(wxCommandEvent& /*event*/) +void mmAssetsListCtrl::OnDeleteAsset(wxCommandEvent& /*event*/) { if (selectedIndex_ == -1) return; - if (cp_->getTrans().empty()) return; - wxMessageDialog msgDlg(this, _("Do you really want to delete the Asset?"), _("Confirm Asset Deletion"), wxYES_NO | wxNO_DEFAULT | wxICON_EXCLAMATION); if (msgDlg.ShowModal() == wxID_YES) { - mmDBWrapper::deleteAsset(cp_->core_->db_.get(), cp_->getTrans()[selectedIndex_]->id_); - DeleteItem(selectedIndex_); + boost::shared_ptr<TAssetEntry> pEntry = cp_->AssetList().GetIndexedEntryPtr(selectedIndex_); + cp_->AssetList().DeleteEntry(pEntry->GetId()); + cp_->initVirtualListControl(selectedIndex_, m_selected_col, m_asc); selectedIndex_ = -1; cp_->updateExtraAssetData(selectedIndex_); } } -void assetsListCtrl::OnEditAsset(wxCommandEvent& /*event*/) +void mmAssetsListCtrl::OnEditAsset(wxCommandEvent& /*event*/) { if (selectedIndex_ < 0) return; @@ -186,10 +191,10 @@ AddPendingEvent(evt); } -void assetsListCtrl::OnListItemActivated(wxListEvent& /*event*/) +void mmAssetsListCtrl::OnListItemActivated(wxListEvent& /*event*/) { //selectedIndex_ = event.GetIndex(); - mmAssetDialog dlg(this, cp_->core_, cp_->getTrans()[selectedIndex_], true); + mmAssetDialog dlg(this, cp_->core_, cp_, cp_->AssetList().entrylist_[selectedIndex_].get(), true); if (dlg.ShowModal() == wxID_OK) doRefreshItems(dlg.GetAssetID()); @@ -197,7 +202,7 @@ cp_->updateExtraAssetData(selectedIndex_); } -void assetsListCtrl::OnColClick(wxListEvent& event) +void mmAssetsListCtrl::OnColClick(wxListEvent& event) { if(0 > event.GetColumn() || event.GetColumn() >= COL_MAX) return; @@ -214,7 +219,7 @@ SetColumn(m_selected_col, item); int trx_id = -1; - if (selectedIndex_>=0) trx_id = cp_->getTrans()[selectedIndex_]->id_; + if (selectedIndex_>=0) trx_id = cp_->AssetList().entrylist_[selectedIndex_]->GetId(); doRefreshItems(trx_id); } @@ -230,6 +235,7 @@ mmAssetsPanel::mmAssetsPanel(wxWindow *parent, mmCoreDB* core) : mmPanelBase(core) +, asset_list_(core->db_, false) // don't load entries at this point. { Create(parent, wxID_STATIC, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, wxPanelNameStr); } @@ -248,18 +254,15 @@ m_listCtrlAssets->InitVariables(); initVirtualListControl(); - if (!m_trans.empty()) - m_listCtrlAssets->EnsureVisible(static_cast<long>(m_trans.size()) - 1); + // Not sure what this achives at this stage. + //if (!m_trans.empty()) + // m_listCtrlAssets->EnsureVisible(static_cast<long>(m_trans.size()) - 1); windowsFreezeThaw(this); return true; } -mmAssetsPanel::~mmAssetsPanel() -{ -} - void mmAssetsPanel::CreateControls() { wxBoxSizer* itemBoxSizer9 = new wxBoxSizer(wxVERTICAL); @@ -313,7 +316,7 @@ m_imageList->Add(wxBitmap(wxImage(uparrow_xpm).Scale(16, 16))); m_imageList->Add(wxBitmap(wxImage(downarrow_xpm).Scale(16, 16))); - m_listCtrlAssets = new assetsListCtrl( this, itemSplitterWindow10, + m_listCtrlAssets = new mmAssetsListCtrl( this, itemSplitterWindow10, IDC_PANEL_STOCKS_LISTCTRL, wxDefaultPosition, wxDefaultSize, wxLC_REPORT | wxLC_HRULES | wxLC_VRULES | wxLC_VIRTUAL | wxLC_SINGLE_SEL ); @@ -396,65 +399,34 @@ int mmAssetsPanel::initVirtualListControl(int id, int col, bool asc) { /* Clear all the records */ - m_trans.clear(); m_listCtrlAssets->DeleteAllItems(); wxListItem item; item.SetMask(wxLIST_MASK_IMAGE); item.SetImage(asc ? 8 : 7); - m_listCtrlAssets->SetColumn(col, item); core_->currencyList_.LoadBaseCurrencySettings(); - const wxString sql = wxString::FromUTF8(SELECT_ALL_FROM_ASSETS_V1) + const wxString sql = wxString::FromUTF8(SELECT_ALL_FROM_ASSETS_V1) + wxString::Format(wxT(" where ASSETTYPE in ( %s ) "), filter_.c_str()) - + wxT(" order by ") + (wxString()<<col+1) + + wxT(" order by ") + (wxString() << col + 1) + (!asc ? wxT(" desc") : wxT(" ")); + asset_list_.LoadAssetEntriesUsing(sql); - wxSQLite3ResultSet q1 = core_->db_.get()->ExecuteQuery(sql); + m_listCtrlAssets->SetItemCount(asset_list_.entrylist_.size()); + header_text_->SetLabel(wxString::Format(_("Total: %s"), asset_list_.GetAssetBalanceCurrencyEditFormat())); - int cnt = 0, selected_item = -1; - double total = 0.0; - - for (; q1.NextRow(); ++cnt) + int selected_item = -1; + for (int i = 0; i < asset_list_.CurrentListSize(); ++i) { - mmAssetHolder th; + if (id == asset_list_.GetIndexedEntryPtr(i)->GetId()) + { + selected_item = i; + break; + } + } - th.id_ = q1.GetInt(wxT("ASSETID")); - th.assetName_ = q1.GetString(wxT("ASSETNAME")); - - wxString dateString = q1.GetString(wxT("STARTDATE")); - th.assetDate_ = mmGetStorageStringAsDate(dateString); - - th.assetType_ = q1.GetString(wxT("ASSETTYPE")); - th.sAssetValueChange_ = q1.GetString(wxT("VALUECHANGE")); - - th.assetNotes_ = q1.GetString(wxT("NOTES")); - - th.valueChange_ = q1.GetDouble(wxT("VALUECHANGERATE")); - th.value_ = q1.GetDouble(wxT("VALUE")); - - th.todayValue_ = mmDBWrapper::getAssetValue(core_->db_.get(), th.id_); - total += th.todayValue_; - - mmex::formatDoubleToCurrencyEdit(th.todayValue_, th.todayValueStr_); - mmex::formatDoubleToCurrencyEdit(th.value_, th.valueStr_); - mmex::formatDoubleToCurrencyEdit(th.valueChange_, th.valueChangeStr_); - - m_trans.push_back( new mmAssetHolder (th)); - - if (th.id_ == id) selected_item = cnt; - } - - m_listCtrlAssets->SetItemCount(cnt); - q1.Finalize(); - - wxString balance; - mmex::formatDoubleToCurrencyEdit(total, balance); - wxString lbl = wxString::Format(_("Total: %s"), balance.c_str()); - header_text_->SetLabel(lbl); - return selected_item; } @@ -475,11 +447,11 @@ wxString mmAssetsPanel::getItem(long item, long column) { - if (column == COL_NAME) return m_trans[item]->assetName_; - if (column == COL_TYPE) return wxGetTranslation(m_trans[item]->assetType_); - if (column == COL_VALUE) return m_trans[item]->todayValueStr_; - if (column == COL_DATE) return mmGetDateForDisplay(m_trans[item]->assetDate_); - if (column == COL_NOTES) return m_trans[item]->assetNotes_; + if (column == COL_NAME) return asset_list_.entrylist_[item]->name_; + if (column == COL_TYPE) return wxGetTranslation(asset_list_.entrylist_[item]->type_); + if (column == COL_VALUE) return wxString() << asset_list_.entrylist_[item]->GetValueCurrencyEditFormat(); + if (column == COL_DATE) return asset_list_.entrylist_[item]->display_date_; + if (column == COL_NOTES) return asset_list_.entrylist_[item]->notes_; return wxGetEmptyString(); } @@ -494,10 +466,12 @@ wxString miniInfo; miniInfo << wxT("\t") << _("Change in Value") << wxT(": ") - << wxGetTranslation(m_trans[selIndex]->sAssetValueChange_); - if (m_trans[selIndex]->sAssetValueChange_ != wxT("None")) - miniInfo<< wxT(" = ") << m_trans[selIndex]->valueChange_ << wxT("%"); - st->SetLabel(m_trans[selIndex]->assetNotes_); + << wxGetTranslation(asset_list_.entrylist_[selIndex]->rate_type_); + + if (asset_list_.entrylist_[selIndex]->rate_type_ != ASSET_RATE_DEF[NONE]) + miniInfo<< wxT(" = ") << asset_list_.entrylist_[selIndex]->rate_value_ << wxT("%"); + + st->SetLabel(asset_list_.entrylist_[selIndex]->notes_); stm->SetLabel(miniInfo); } else @@ -524,10 +498,10 @@ wxMenu* menu = new wxMenu; menu->Append(new wxMenuItem(menu, 0, wxGetTranslation(wxTRANSLATE("All")))); - size_t size = sizeof(ASSET_TYPE)/sizeof(wxString); + size_t size = sizeof(ASSET_TYPE_DEF)/sizeof(wxString); for(size_t i = 0; i < size; ++i) { - wxMenuItem* menuItem = new wxMenuItem(menu, i+1, wxGetTranslation(ASSET_TYPE[i])); + wxMenuItem* menuItem = new wxMenuItem(menu, i+1, wxGetTranslation(ASSET_TYPE_DEF[i])); menu->Append(menuItem); } PopupMenu(menu); @@ -543,13 +517,13 @@ filter_ = wxT(""); wxString label; - int size = sizeof(ASSET_TYPE)/sizeof(wxString); + int size = sizeof(ASSET_TYPE_DEF)/sizeof(wxString); for(int i = 0; i < size; ++i) { if (evt == 0 || evt == i+1) { - filter_ << wxT("'") << ASSET_TYPE[i] << wxT("'") << wxT(","); - if (evt == i+1) label = ASSET_TYPE[i]; + filter_ << wxT("'") << ASSET_TYPE_DEF[i] << wxT("'") << wxT(","); + if (evt == i+1) label = ASSET_TYPE_DEF[i]; } } filter_.RemoveLast(1); Modified: trunk/mmex/src/assetspanel.h =================================================================== --- trunk/mmex/src/assetspanel.h 2013-03-24 00:49:12 UTC (rev 3619) +++ trunk/mmex/src/assetspanel.h 2013-03-24 04:37:00 UTC (rev 3620) @@ -14,12 +14,9 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ********************************************************/ -#ifndef _MM_EX_ASSETSPANEL_H_ -#define _MM_EX_ASSETSPANEL_H_ - +#pragma once #include "mmpanelbase.h" -#include "util.h" - +#include "db/assets.h" #include <boost/scoped_ptr.hpp> class wxListCtrl; @@ -27,21 +24,14 @@ class mmAssetsPanel; /* Custom ListCtrl class that implements virtual LC style */ -class assetsListCtrl: public wxListCtrl +class mmAssetsListCtrl: public wxListCtrl { - DECLARE_NO_COPY_CLASS(assetsListCtrl) + DECLARE_NO_COPY_CLASS(mmAssetsListCtrl) DECLARE_EVENT_TABLE() public: - assetsListCtrl(mmAssetsPanel* cp, wxWindow *parent, - const wxWindowID id, const wxPoint& pos, - const wxSize& size, long style) - : wxListCtrl(parent, id, pos, size, style), - m_attr1(mmColors::listBorderColor, mmColors::listAlternativeColor0, wxNullFont), - m_attr2(mmColors::listBorderColor, mmColors::listAlternativeColor1, wxNullFont), - cp_(cp), - selectedIndex_(-1) - {} + mmAssetsListCtrl(mmAssetsPanel* cp, wxWindow *parent, const wxWindowID id, + const wxPoint& pos, const wxSize& size, long style); void OnNewAsset(wxCommandEvent& event); void OnEditAsset(wxCommandEvent& event); @@ -71,50 +61,32 @@ void OnItemResize(wxListEvent& event); }; -/* Holds a single transaction */ -struct mmAssetHolder: public mmHolderBase -{ - wxString assetName_; - wxString assetType_; - wxDateTime assetDate_; - wxString assetNotes_; - wxString sAssetValueChange_; - wxString asset_notes_; - - double valueChange_; - wxString valueChangeStr_; - double value_; - wxString valueStr_; - double todayValue_; - wxString todayValueStr_; -}; - class mmAssetsPanel : public mmPanelBase { DECLARE_EVENT_TABLE() public: mmAssetsPanel(wxWindow *parent, mmCoreDB* core); - ~mmAssetsPanel(); - const std::vector<mmAssetHolder*>& getTrans() const { return m_trans; } + void updateExtraAssetData(int selIndex); int initVirtualListControl(int trx_id = -1, int col = 0, bool asc = true); wxString getItem(long item, long column); void SetFilter(wxString filter) {filter_=filter; } int GetListCtrlWidth(int id) {return m_listCtrlAssets->GetColumnWidth(id);} void SetListCtrlColumn(int m_selected_col, wxListItem item) - {m_listCtrlAssets->SetColumn(m_selected_col, item);} + {m_listCtrlAssets->SetColumn(m_selected_col, item);} + TAssetList& AssetList() { return asset_list_; } private: void enableEditDeleteButtons(bool enable); - assetsListCtrl* m_listCtrlAssets; + mmAssetsListCtrl* m_listCtrlAssets; wxStaticText* itemStaticTextMainFilter_; wxString filter_; wxStaticText* header_text_; boost::scoped_ptr<wxImageList> m_imageList; - std::vector<mmAssetHolder*> m_trans; + TAssetList asset_list_; bool Create(wxWindow *parent, wxWindowID winid, const wxPoint& pos, const wxSize& size, long style, const wxString &name); void CreateControls(); @@ -128,6 +100,3 @@ void OnViewPopupSelected(wxCommandEvent& event); void sortTable(); }; - -#endif - Modified: trunk/mmex/src/constants.h =================================================================== --- trunk/mmex/src/constants.h 2013-03-24 00:49:12 UTC (rev 3619) +++ trunk/mmex/src/constants.h 2013-03-24 04:37:00 UTC (rev 3620) @@ -98,16 +98,6 @@ const wxString TIPS_STOCK = wxT("investment"); const wxString TIPS_ASSETS = wxT("assets"); -const wxString ASSET_TYPE[] = { - wxTRANSLATE("Property"), - wxTRANSLATE("Automobile"), - wxTRANSLATE("Household Object"), - wxTRANSLATE("Art"), - wxTRANSLATE("Jewellery"), - wxTRANSLATE("Cash"), - wxTRANSLATE("Other") -}; - const wxString BILLSDEPOSITS_REPEATS[] = { wxTRANSLATE("None"), wxTRANSLATE("Weekly"), Added: trunk/mmex/src/db/assets.cpp =================================================================== --- trunk/mmex/src/db/assets.cpp (rev 0) +++ trunk/mmex/src/db/assets.cpp 2013-03-24 04:37:00 UTC (rev 3620) @@ -0,0 +1,329 @@ +/******************************************************* + Copyright (C) 2013 Stefano Giorgio + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + 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 + ********************************************************/ + +#include "assets.h" + +/************************************************************************************ + TAssetEntry Methods + ***********************************************************************************/ +/// Constructor used when loading assets from the database +TAssetEntry::TAssetEntry(wxSQLite3ResultSet& q1) +: TEntryBase() +{ + id_ = q1.GetInt(wxT("ASSETID")); + date_ = q1.GetString(wxT("STARTDATE")); + name_ = q1.GetString(wxT("ASSETNAME")); + value_ = q1.GetDouble(wxT("VALUE")); + rate_type_ = q1.GetString(wxT("VALUECHANGE")); + notes_ = q1.GetString(wxT("NOTES")); + rate_value_ = q1.GetDouble(wxT("VALUECHANGERATE")); + type_ = q1.GetString(wxT("ASSETTYPE")); + // calculated value + display_date_ = mmGetDateForDisplay(mmGetStorageStringAsDate(date_)); +} + +/// Copy constructor using a pointer +TAssetEntry::TAssetEntry(TAssetEntry* pEntry) +: TEntryBase() +{ + date_ = pEntry->date_; + name_ = pEntry->name_; + value_ = pEntry->value_; + rate_type_ = pEntry->rate_type_; + notes_ = pEntry->notes_; + rate_value_ = pEntry->rate_value_; + type_ = pEntry->type_; +} + +void TAssetEntry::SetDatabaseValues(wxSQLite3Statement& st, int& db_index) +{ + st.Bind(++db_index, date_); // q1.GetString(wxT("STARTDATE")); + st.Bind(++db_index, name_); // q1.GetString(wxT("ASSETNAME")); + st.Bind(++db_index, value_); // q1.GetDouble(wxT("VALUE")); + st.Bind(++db_index, rate_type_); // q1.GetString(wxT("VALUECHANGE")); + st.Bind(++db_index, notes_); // q1.GetString(wxT("NOTES")); + st.Bind(++db_index, rate_value_);// q1.GetDouble(wxT("VALUECHANGERATE")); + st.Bind(++db_index, type_); // q1.GetString(wxT("ASSETTYPE")); +} + +/// Constructor for creating a new asset entry. +TAssetEntry::TAssetEntry() +: TEntryBase() +, value_(0.0) +, rate_value_(0.0) +{} + +int TAssetEntry::Add(wxSQLite3Database* db) +{ + const char INSERT_INTO_ASSETS_V1[] = + "INSERT INTO ASSETS_V1 " + "(STARTDATE, ASSETNAME, VALUE, VALUECHANGE, NOTES, VALUECHANGERATE, ASSETTYPE) " + "values (?, ?, ?, ?, ?, ?, ?)"; + + wxSQLite3Statement st = db->PrepareStatement(INSERT_INTO_ASSETS_V1); + int db_index = 0; + SetDatabaseValues(st, db_index); + FinaliseAdd(db, st); + + return id_; +} + +void TAssetEntry::Delete(wxSQLite3Database* db) +{ + DeleteEntry(db, wxT("delete from ASSETS_V1 where ASSETID = ?")); +} + +void TAssetEntry::Update(wxSQLite3Database* db) +{ + const char UPDATE_ASSETS_V1[] = + "update ASSETS_V1 set" + " STARTDATE = ?, ASSETNAME = ?, VALUE = ?, " + " VALUECHANGE = ?, NOTES = ?, VALUECHANGERATE = ?, ASSETTYPE = ? " + "where ASSETID = ?"; + try + { + wxSQLite3Statement st = db->PrepareStatement(UPDATE_ASSETS_V1); + + int db_index = 0; + SetDatabaseValues(st, db_index); + st.Bind(++db_index, id_); + + FinaliseStatement(st); + } + catch(const wxSQLite3Exception& e) + { + //wxLogDebug(wxT("TAssetEntry:Update: %s"), e.GetMessage()); + wxLogError(wxT("TAssetEntry:Update: %s"), e.GetMessage()); + } +} + +double TAssetEntry::GetAppreciatedValue(const wxDateTime& startDate, double value, double rate) +{ + double asset_value = 0.0; + wxDateTime todayDate = wxDateTime::Now(); + + if (todayDate > startDate) + { + int numYears = todayDate.GetYear() - startDate.GetYear(); + + int numMonths = todayDate.GetMonth() - startDate.GetMonth(); + int numDays = todayDate.GetDay() - startDate.GetDay(); + if ( (numMonths >= 0 ) && (numDays < 0) ) numMonths --; + if ( (numYears > 0 ) && (numMonths < 0 )) numYears -- ; + + if (numYears > 0) + { + while (numYears > 0) + { + asset_value = value + (rate * value / 100); + value = asset_value; + -- numYears; + } + } + } + + return value; +} + +double TAssetEntry::GetDepreciatedValue(const wxDateTime& startDate, double value, double rate) +{ + double asset_value = 0.0; + wxDateTime todayDate = wxDateTime::Now(); + + if (todayDate > startDate) + { + int numYears = todayDate.GetYear() - startDate.GetYear(); + if (numYears > 0) + { + while (numYears > 0) + { + asset_value = value - (rate * value / 100); + value = asset_value; + numYears --; + } + } + } + + return value; +} + +double TAssetEntry::GetValue() +{ + wxDateTime start_date = mmGetStorageStringAsDate(date_); + double asset_value = value_; + + if (rate_type_ == ASSET_RATE_DEF[APPRECIATE]) + { + asset_value = GetAppreciatedValue(start_date, value_, rate_value_); + } + + if (rate_type_ == ASSET_RATE_DEF[DEPRECIATE]) + { + asset_value = GetDepreciatedValue(start_date, value_, rate_value_); + } + + return asset_value; +} + +wxString TAssetEntry::GetValueCurrencyEditFormat(bool initial_value) +{ + wxString formatted_value; + if (initial_value) mmex::formatDoubleToCurrencyEdit(value_, formatted_value); + else mmex::formatDoubleToCurrencyEdit(GetValue(), formatted_value); + + return formatted_value; +} + +wxString TAssetEntry::DisplayDate() +{ + return mmGetDateForDisplay(mmGetStorageStringAsDate(date_)); +} + +/************************************************************************************ + TAssetList Methods + ***********************************************************************************/ +/// Constructor +TAssetList::TAssetList(boost::shared_ptr<wxSQLite3Database> db, bool load_entries) +: TListBase(db) +{ + LoadEntries(load_entries); +} + +void TAssetList::LoadEntries(bool load_entries) +{ + try + { + if (!db_->TableExists(wxT("ASSETS_V1"))) + { + const char CREATE_TABLE_ASSETS_V1[] = + "CREATE TABLE ASSETS_V1 (ASSETID integer primary key, " + "STARTDATE TEXT NOT NULL, ASSETNAME TEXT, " + "VALUE numeric, VALUECHANGE TEXT, NOTES TEXT, VALUECHANGERATE numeric, " + "ASSETTYPE TEXT)"; + + db_->ExecuteUpdate(CREATE_TABLE_ASSETS_V1); + } + + if (load_entries) + { + LoadAssetEntriesUsing(wxT("select * from assets_v1")); + } + } + catch (const wxSQLite3Exception& e) + { + //wxLogDebug(wxT("TAssetList::LoadEntries %s"), e.GetMessage()); + wxLogError(wxT("TAssetList::LoadEntries %s"), e.GetMessage()); + } +} + +void TAssetList::LoadAssetEntriesUsing(const wxString& sql_statement) +{ + entrylist_.clear(); + wxSQLite3ResultSet q1 = db_->ExecuteQuery(sql_statement); + while (q1.NextRow()) + { + boost::shared_ptr<TAssetEntry> pEntry(new TAssetEntry(q1)); + entrylist_.push_back(pEntry); + } + q1.Finalize(); +} + +int TAssetList::AddEntry(TAssetEntry* pAssetEntry) +{ + boost::shared_ptr<TAssetEntry> pEntry(pAssetEntry); + entrylist_.push_back(pEntry); + pEntry->Add(db_.get()); + + return pEntry->id_; +} + +void TAssetList::DeleteEntry(int asset_id) +{ + boost::shared_ptr<TAssetEntry> pEntry = GetEntryPtr(asset_id); + if (pEntry) + { + pEntry->Delete(db_.get()); + entrylist_.erase(entrylist_.begin() + current_index_); + } +} + +boost::shared_ptr<TAssetEntry> TAssetList::GetEntryPtr(int asset_id) +{ + boost::shared_ptr<TAssetEntry> pEntry; + size_t list_size = entrylist_.size(); + size_t index = 0; + + while (index < list_size) + { + if (entrylist_[index]->id_ == asset_id) + { + pEntry = entrylist_[index]; + current_index_ = index; + break; + } + ++ index; + } + + return pEntry; +} + +boost::shared_ptr<TAssetEntry> TAssetList::GetIndexedEntryPtr(unsigned int list_index) +{ + boost::shared_ptr<TAssetEntry> pEntry; + if (list_index < entrylist_.size()) + { + pEntry = entrylist_[list_index]; + } + + return pEntry; +} + +int TAssetList::CurrentListSize() +{ + return entrylist_.size(); +} + +double TAssetList::GetAssetBalance(bool value_today) +{ + double total_value = 0.0; + for (size_t i = 0; i < entrylist_.size(); ++i) + { + if (value_today) + total_value = total_value + entrylist_[i]->GetValue(); + else + total_value = total_value + entrylist_[i]->value_; + } + + return total_value; +} + +wxString TAssetList::GetAssetBalanceCurrencyFormat(bool value_today) +{ + wxString balance_str; + mmex::formatDoubleToCurrency(GetAssetBalance(value_today), balance_str); + + return balance_str; +} + +wxString TAssetList::GetAssetBalanceCurrencyEditFormat(bool value_today) +{ + wxString balance_str; + mmex::formatDoubleToCurrencyEdit(GetAssetBalance(value_today), balance_str); + + return balance_str; +} Added: trunk/mmex/src/db/assets.h =================================================================== --- trunk/mmex/src/db/assets.h (rev 0) +++ trunk/mmex/src/db/assets.h 2013-03-24 04:37:00 UTC (rev 3620) @@ -0,0 +1,106 @@ +/******************************************************* + Copyright (C) 2013 Stefano Giorgio + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + 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 + ********************************************************/ + +#pragma once +#include "entry_base.h" + +enum ASSET_RATE {NONE, APPRECIATE, DEPRECIATE}; +const wxString ASSET_RATE_DEF[] = { + wxT("None"), + wxT("Appreciates"), + wxT("Depreciates") +}; + +enum ASSET_TYPE {PROPERTY, AUTO, HOUSE, ART, JEWELLERY, CASH, OTHER}; +const wxString ASSET_TYPE_DEF[] = { + wxTRANSLATE("Property"), + wxTRANSLATE("Automobile"), + wxTRANSLATE("Household Object"), + wxTRANSLATE("Art"), + wxTRANSLATE("Jewellery"), + wxTRANSLATE("Cash"), + wxTRANSLATE("Other") +}; + +/************************************************************************************ + Class TAssetEntry + ***********************************************************************************/ +class TAssetEntry : public TEntryBase +{ +private: + friend class TAssetList; // Allows TAssetList access to private members + + int Add(wxSQLite3Database* db); + void Delete(wxSQLite3Database* db); + void SetDatabaseValues(wxSQLite3Statement& st, int& db_index); + + double GetAppreciatedValue(const wxDateTime& startDate, double value, double rate); + double GetDepreciatedValue(const wxDateTime& startDate, double value, double rate); + +public: + wxString name_; // wxT("ASSETNAME") + wxString type_; // wxT("ASSETTYPE") + wxString date_; // wxT("STARTDATE") + wxString notes_; // wxT("NOTES") + double value_; // wxT("VALUE") + wxString rate_type_; // wxT("VALUECHANGE") + double rate_value_; // wxT("VALUECHANGERATE") + + /// Calculated value + wxString display_date_; + + /// Constructor used when loading assets from the database. + TAssetEntry(wxSQLite3ResultSet& q1); + /// Copy constructor using a pointer + TAssetEntry(TAssetEntry* pEntry); + /// Constructor for creating a new asset entry. + TAssetEntry(); + + void Update(wxSQLite3Database* db); + double GetValue(); + wxString GetValueCurrencyEditFormat(bool initial_value = false); + wxString DisplayDate(); +}; + +/************************************************************************************ + Class TAssetList + ***********************************************************************************/ +class TAssetList : public TListBase +{ +private: + void LoadEntries(bool load_entries = true); + +public: + std::vector<boost::shared_ptr<TAssetEntry> >entrylist_; + + TAssetList(boost::shared_ptr<wxSQLite3Database> db, bool load_entries = true); + + /// Allows specialised loads by providing the required SQL statement + void LoadAssetEntriesUsing(const wxString& sql_statement); + + int AddEntry(TAssetEntry* pAssetEntry); + void DeleteEntry(int asset_id); + + boost::shared_ptr<TAssetEntry> GetEntryPtr(int asset_id); + boost::shared_ptr<TAssetEntry> GetIndexedEntryPtr(unsigned int list_index); + + int CurrentListSize(); + double GetAssetBalance(bool value_today = true); + wxString GetAssetBalanceCurrencyFormat(bool value_today = true); + wxString GetAssetBalanceCurrencyEditFormat(bool value_today = true); +}; Added: trunk/mmex/src/db/entry_base.cpp =================================================================== --- trunk/mmex/src/db/entry_base.cpp (rev 0) +++ trunk/mmex/src/db/entry_base.cpp 2013-03-24 04:37:00 UTC (rev 3620) @@ -0,0 +1,72 @@ +/******************************************************* + Copyright (C) 2013 Stefano Giorgio + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + 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 + ********************************************************/ + +#include "entry_base.h" + +/************************************************************************************ + TEntryBase Methods + ***********************************************************************************/ +TEntryBase::TEntryBase() +: id_(-1) +{} + +void TEntryBase::FinaliseAdd(wxSQLite3Database* db, wxSQLite3Statement& st) +{ + st.ExecuteUpdate(); + id_ = (db->GetLastRowId()).ToLong(); + st.Finalize(); + mmOptions::instance().databaseUpdated_ = true; +} + +void TEntryBase::DeleteEntry(wxSQLite3Database* db, const wxString& sql_statement) +{ + wxSQLite3Statement st = db->PrepareStatement(sql_statement); + st.Bind(1, id_); + + FinaliseStatement(st); +} + +void TEntryBase::FinaliseStatement(wxSQLite3Statement& st) +{ + st.ExecuteUpdate(); + st.Finalize(); + mmOptions::instance().databaseUpdated_ = true; +} + +int TEntryBase::GetId() +{ + return id_; +} + +/************************************************************************************ + TListBase Methods + ***********************************************************************************/ +TListBase::TListBase(boost::shared_ptr<wxSQLite3Database> db) +: db_(db) +, current_index_(0) +{} + +wxSQLite3Database* TListBase::ListDatabase() +{ + return db_.get(); +} + +int TListBase::GetCurrentIndex() +{ + return current_index_; +} Added: trunk/mmex/src/db/entry_base.h =================================================================== --- trunk/mmex/src/db/entry_base.h (rev 0) +++ trunk/mmex/src/db/entry_base.h 2013-03-24 04:37:00 UTC (rev 3620) @@ -0,0 +1,63 @@ +/******************************************************* + Copyright (C) 2013 Stefano Giorgio + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + 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 + ********************************************************/ + +#pragma once +#include "boost/shared_ptr.hpp" +#include <vector> +#include "../defs.h" +#include "../util.h" + +/************************************************************************************ + Class TEntryBase + This is the base class for all entries of the database. + ***********************************************************************************/ +class TEntryBase +{ +protected: + int id_; + + /// This will set the record id and finalise the sql statement. + void FinaliseAdd(wxSQLite3Database* db, wxSQLite3Statement& st); + + /// This will finalise the sql statement. + void FinaliseStatement(wxSQLite3Statement& st); + + void DeleteEntry(wxSQLite3Database* db, const wxString& sql_statement); + +public: + TEntryBase(); + + int GetId(); +}; + +/************************************************************************************ + Class TListBase + This is the base class for main Lists of the database. + ***********************************************************************************/ +class TListBase +{ +protected: + boost::shared_ptr<wxSQLite3Database> db_; + int current_index_; + +public: + TListBase(boost::shared_ptr<wxSQLite3Database> db); + wxSQLite3Database* ListDatabase(); + int GetCurrentIndex(); + +}; Modified: trunk/mmex/src/dbwrapper.cpp =================================================================== --- trunk/mmex/src/dbwrapper.cpp 2013-03-24 00:49:12 UTC (rev 3619) +++ trunk/mmex/src/dbwrapper.cpp 2013-03-24 04:37:00 UTC (rev 3620) @@ -1451,140 +1451,6 @@ //---------------------------------------------------------------------------- -//All assets functions temporary grouped here - -double mmDBWrapper::getAssetValue(wxSQLite3Database* db, int assetID) -{ - double assetValue = 0.0; - - wxSQLite3Statement st = db->PrepareStatement(SELECT_ROW_FROM_ASSETS_V1); - st.Bind(1, assetID); - - wxSQLite3ResultSet q1 = st.ExecuteQuery(); - - if (q1.NextRow()) - { - wxString valChange = q1.GetString(wxT("VALUECHANGE")); - double value = q1.GetDouble(wxT("VALUE")); - double valueChangeRate = q1.GetDouble(wxT("VALUECHANGERATE")); - wxString startDateStr = q1.GetString(wxT("STARTDATE")); - wxDateTime startDate = mmGetStorageStringAsDate(startDateStr); - wxDateTime todayDate = wxDateTime::Now(); - - if (valChange == wxT("None")) - { - assetValue = value; - } - else if (valChange == wxT("Appreciates")) - { - if (todayDate > startDate) - { - int numYears = todayDate.GetYear() - startDate.GetYear(); - -// improve the accuracy of number of years calculation - int numMonths = todayDate.GetMonth() - startDate.GetMonth(); - int numDays = todayDate.GetDay() - startDate.GetDay(); - if ( (numMonths >= 0 ) && (numDays < 0) ) numMonths --; - if ( (numYears > 0 ) && (numMonths < 0 )) numYears -- ; - - if (numYears > 0) - { -// double appreciation = numYears * valueChangeRate * value / 100; -// assetValue = value + appreciation; - -// Calculation changed to compound interest. - while (numYears > 0) - { - double appreciation = valueChangeRate * value / 100; - assetValue = value + appreciation; - value = assetValue; - numYears --; - } - } - else - { - assetValue = value; - } - } - else - { - assetValue = value; - } - } - else if (valChange == wxT("Depreciates")) - { - if (todayDate > startDate) - { - int numYears = todayDate.GetYear() - startDate.GetYear(); - if (numYears > 0) - { -// double depreciation = numYears * valueChangeRate * value / 100; -// assetValue = value - depreciation; - -// Calculation changed to compound interest. - while (numYears > 0) - { - double depreciation = valueChangeRate * value / 100; - assetValue = value - depreciation; - value = assetValue; - numYears --; - } - } - else - { - assetValue = value; - } - } - else - { - assetValue = value; - } - } - else - { - wxASSERT(false); - } - } - - st.Finalize(); - - return assetValue; -} - -void mmDBWrapper::deleteAsset(wxSQLite3Database* db, int assetID) -{ - try - { - wxSQLite3Statement st = db->PrepareStatement(DELETE_ASSETID_ASSETS_V1); - st.Bind(1, assetID); - st.ExecuteUpdate(); - st.Finalize(); - mmOptions::instance().databaseUpdated_ = true; - - } - catch(const wxSQLite3Exception& e) - { - wxLogDebug(wxT("Function::deleteAsset: Exception"), e.GetMessage().c_str()); - wxLogError(wxT("delete from ASSETS_V1. ") + wxString::Format(_("Error: %s"), e.GetMessage().c_str())); - } -} - -double mmDBWrapper::getAssetBalance(wxSQLite3Database* db) -{ - double balance = 0.0; - - wxSQLite3ResultSet q1 = db->ExecuteQuery(SELECT_ALL_FROM_ASSETS_V1); - - while (q1.NextRow()) - { - int assetID = q1.GetInt(wxT("ASSETID")); - balance += getAssetValue(db, assetID); - } - q1.Finalize(); - - return balance; -} - static const wxArrayString CREATE_TABLE_SQL() { wxArrayString q; Modified: trunk/mmex/src/dbwrapper.h =================================================================== --- trunk/mmex/src/dbwrapper.h 2013-03-24 00:49:12 UTC (rev 3619) +++ trunk/mmex/src/dbwrapper.h 2013-03-24 04:37:00 UTC (rev 3620) @@ -43,33 +43,6 @@ "a.value as VALUE " "from ASSETS_V1 a "; -static const char SELECT_ROW_FROM_ASSETS_V1[] = - "SELECT ASSETNAME, " - "NOTES, " - "date(STARTDATE, 'localtime') as STARTDATE, " - "VALUE, " - "VALUECHANGERATE, " - "VALUECHANGE, " - "ASSETTYPE " - "FROM ASSETS_V1 " - "where ASSETID = ?"; - -static const char UPDATE_ASSETS_V1[] = - "UPDATE ASSETS_V1 " - "SET STARTDATE = ?, ASSETNAME = ?, " - "VALUE = ?, VALUECHANGE = ?," - "NOTES = ?, VALUECHANGERATE = ?, " - "ASSETTYPE = ? " - "where ASSETID = ?"; - -static const char INSERT_INTO_ASSETS_V1[] = - "INSERT INTO ASSETS_V1 (" - "STARTDATE, ASSETNAME, VALUE, VALUECHANGE, NOTES, VALUECHANGERATE, ASSETTYPE " - ") values (?, ?, ?, ?, ?, ?, ?)"; - -static const char DELETE_ASSETID_ASSETS_V1[] = - "delete from ASSETS_V1 where ASSETID = ?"; - static const char SELECT_ALL_FROM_ACCOUNTLIST_V1[] = "SELECT * " "FROM ACCOUNTLIST_V1 " @@ -630,11 +603,6 @@ bool moveStockInvestment(wxSQLite3Database* db, int stockID, int toAccountID); double getStockInvestmentBalance(wxSQLite3Database* db, int accountID, double& originalVal); -/* Assets API */ -void deleteAsset(wxSQLite3Database* db, int assetID); -double getAssetBalance(wxSQLite3Database* db); -double getAssetValue(wxSQLite3Database* db, int assetID); - //---------------------------------------------------------------------------- } // namespace mmDBWrapper Modified: trunk/mmex/src/mmex.cpp =================================================================== --- trunk/mmex/src/mmex.cpp 2013-03-24 00:49:12 UTC (rev 3619) +++ trunk/mmex/src/mmex.cpp 2013-03-24 04:37:00 UTC (rev 3620) @@ -1698,7 +1698,7 @@ } else if (sData == wxT("Summary of Assets")) { - mmPrintableBase* rs = new mmReportSummaryAssets(m_core.get(), m_db.get()); + mmPrintableBase* rs = new mmReportSummaryAssets(m_core.get()); createReportsPage(rs); } else if (sData == wxT("Where the Money Goes")) Modified: trunk/mmex/src/mmhomepagepanel.cpp =================================================================== --- trunk/mmex/src/mmhomepagepanel.cpp 2013-03-24 00:49:12 UTC (rev 3619) +++ trunk/mmex/src/mmhomepagepanel.cpp 2013-03-24 04:37:00 UTC (rev 3620) @@ -26,6 +26,7 @@ #include "htmlbuilder.h" #include "billsdepositspanel.h" #include "mmgraphincexpensesmonth.h" +#include "db/assets.h" BEGIN_EVENT_TABLE( mmHomePagePanel, wxPanel ) @@ -427,10 +428,8 @@ wxString mmHomePagePanel::displayAssets(double& tBalance) { mmHTMLBuilder hb; - double assetBalance = mmDBWrapper::getAssetBalance(core_->db_.get()); - wxString assetBalanceStr; core_->currencyList_.LoadBaseCurrencySettings(); - mmex::formatDoubleToCurrency(assetBalance, assetBalanceStr); + TAssetList asset_list(core_->db_); if (mmIniOptions::instance().enableAssets_) { @@ -442,7 +441,7 @@ hb.startTableRow(); hb.addTableCellLink(wxT("Assets"), _("Assets"), false, true)... [truncated message content] |