Functionnal version of ImportPanel
This commit is contained in:
parent
6da33cbe35
commit
35f660b234
|
@ -1,4 +1,4 @@
|
||||||
v0.2 (06/03/2011)
|
v0.2 (23/03/2011)
|
||||||
|
|
||||||
** User **
|
** User **
|
||||||
Better use of sizers (so better interface!)
|
Better use of sizers (so better interface!)
|
||||||
|
@ -14,6 +14,7 @@ v0.2 (06/03/2011)
|
||||||
Add Real mode
|
Add Real mode
|
||||||
Database is now at ~/.kisscount/kc.bdd
|
Database is now at ~/.kisscount/kc.bdd
|
||||||
Add Debian's packages !!
|
Add Debian's packages !!
|
||||||
|
Add Import Panel and OFX imports
|
||||||
|
|
||||||
** Dev **
|
** Dev **
|
||||||
Use a factory to create panels (prepare for plug-in)
|
Use a factory to create panels (prepare for plug-in)
|
||||||
|
@ -22,6 +23,7 @@ v0.2 (06/03/2011)
|
||||||
New database version (2) :
|
New database version (2) :
|
||||||
fix_cost for categories
|
fix_cost for categories
|
||||||
virtual field for account and operation
|
virtual field for account and operation
|
||||||
|
import_panel
|
||||||
Database checking & upgrading
|
Database checking & upgrading
|
||||||
|
|
||||||
** Bugs **
|
** Bugs **
|
||||||
|
|
5
Makefile
5
Makefile
|
@ -7,8 +7,9 @@ CXXFLAGS+=`wx-config --cxxflags` -Wall -Isrc -ggdb
|
||||||
CXXFLAGS+=-I./lib/wxsqlite3-1.9.9/include
|
CXXFLAGS+=-I./lib/wxsqlite3-1.9.9/include
|
||||||
CXXFLAGS+=-I./lib/freechart/include
|
CXXFLAGS+=-I./lib/freechart/include
|
||||||
CXXFLAGS+=-Wl,--rpath,"$(LIB_DIR)"
|
CXXFLAGS+=-Wl,--rpath,"$(LIB_DIR)"
|
||||||
CXXFLAGS+=-DRESSOURCES_ROOT="\"$(SHARE_DIR)\""
|
#CXXFLAGS+=-DRESSOURCES_ROOT="\"$(SHARE_DIR)\""
|
||||||
#CXXFLAGS+=-DRESSOURCES_ROOT="\"./ressources/\""
|
# For developpers
|
||||||
|
CXXFLAGS+=-DRESSOURCES_ROOT="\"./ressources/\""
|
||||||
|
|
||||||
LDFLAGS+=`wx-config --libs`
|
LDFLAGS+=`wx-config --libs`
|
||||||
LDFLAGS+=-lofx
|
LDFLAGS+=-lofx
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
http://www.iconarchive.com/category/application-icons.html
|
http://www.iconarchive.com/category/application-icons.html
|
||||||
|
http://www.webidev.com/fr/WebiInscrit
|
||||||
|
|
BIN
ressources/icons/import-icon.png
Normal file
BIN
ressources/icons/import-icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.8 KiB |
|
@ -6,4 +6,5 @@ CREATE TABLE account_amount(id INTEGER PRIMARY KEY, account REFERENCES account(i
|
||||||
CREATE TABLE operation(id INTEGER PRIMARY KEY, parent REFERENCES operation(id), user REFERENCES user(id), account REFERENCES account(id), year INTEGER, month INTEGER, day INTEGER, amount FLOAT, description VARCHAR(255), category REFERENCES category(id), fix_cost CHAR(1), checked CHAR(1), formula VARCHAR(255), transfert REFERENCES operation(id), meta CHAR(1), virtual CHAR(1));
|
CREATE TABLE operation(id INTEGER PRIMARY KEY, parent REFERENCES operation(id), user REFERENCES user(id), account REFERENCES account(id), year INTEGER, month INTEGER, day INTEGER, amount FLOAT, description VARCHAR(255), category REFERENCES category(id), fix_cost CHAR(1), checked CHAR(1), formula VARCHAR(255), transfert REFERENCES operation(id), meta CHAR(1), virtual CHAR(1));
|
||||||
CREATE TABLE category(id INTEGER PRIMARY KEY, user REFERENCES user(id), parent REFERENCES category(id), name VARCHAR(255), backcolor VARCHAR(10), forecolor VARCHAR(10), font VARCHAR(255), fix_cost CHAR(1));
|
CREATE TABLE category(id INTEGER PRIMARY KEY, user REFERENCES user(id), parent REFERENCES category(id), name VARCHAR(255), backcolor VARCHAR(10), forecolor VARCHAR(10), font VARCHAR(255), fix_cost CHAR(1));
|
||||||
CREATE TABLE preference(id INTEGER PRIMARY KEY, user REFERENCES user(id), name VARCHAR(255), value VARCHAR(255));
|
CREATE TABLE preference(id INTEGER PRIMARY KEY, user REFERENCES user(id), name VARCHAR(255), value VARCHAR(255));
|
||||||
|
CREATE TABLE import_pattern(id INTEGER PRIMARY KEY, user REFERENCES user(id), description VARCHAR(255), pattern VARCHAR(255), account REFERENCES account(id), category REFERENCES category(id));
|
||||||
INSERT INTO kisscount ("db_version") VALUES ("2");
|
INSERT INTO kisscount ("db_version") VALUES ("2");
|
|
@ -607,3 +607,8 @@ ImportEngine* KissCount::GetImportEngine(wxString path)
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void KissCount::UpdateImportPattern()
|
||||||
|
{
|
||||||
|
_db->UpdateImportPattern(_user);
|
||||||
|
}
|
||||||
|
|
|
@ -111,6 +111,7 @@ public:
|
||||||
wxString GetImportEngineExtensions();
|
wxString GetImportEngineExtensions();
|
||||||
ImportEngine* GetImportEngine(wxString path);
|
ImportEngine* GetImportEngine(wxString path);
|
||||||
|
|
||||||
|
void UpdateImportPattern();
|
||||||
private:
|
private:
|
||||||
wxUI* _wxUI;
|
wxUI* _wxUI;
|
||||||
Database* _db;
|
Database* _db;
|
||||||
|
|
|
@ -209,6 +209,7 @@ User* Database::LoadUser(const wxString& name)
|
||||||
User* user;
|
User* user;
|
||||||
Account account;
|
Account account;
|
||||||
Category category;
|
Category category;
|
||||||
|
ImportPattern importPattern;
|
||||||
|
|
||||||
std::vector<Account>::iterator it;
|
std::vector<Account>::iterator it;
|
||||||
|
|
||||||
|
@ -314,6 +315,20 @@ User* Database::LoadUser(const wxString& name)
|
||||||
|
|
||||||
set.Finalize();
|
set.Finalize();
|
||||||
|
|
||||||
|
req = wxT("SELECT * FROM import_pattern WHERE user='") + user->_id + wxT("'");
|
||||||
|
EXECUTE_SQL_QUERY_WITH_CODE(req, set, NULL, {delete user;}, {delete user;});
|
||||||
|
|
||||||
|
while (set.NextRow())
|
||||||
|
{
|
||||||
|
importPattern.pattern = set.GetAsString(wxT("pattern"));
|
||||||
|
importPattern.account = set.GetAsString(wxT("account"));
|
||||||
|
importPattern.category = set.GetAsString(wxT("category"));
|
||||||
|
|
||||||
|
user->_importPatterns[set.GetAsString(wxT("description"))] = importPattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
set.Finalize();
|
||||||
|
|
||||||
return user;
|
return user;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1725,3 +1740,45 @@ wxString Database::getSharedAccountOwner(const wxString& account)
|
||||||
|
|
||||||
return set2.GetAsString(wxT("name"));
|
return set2.GetAsString(wxT("name"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Database::UpdateImportPattern(User* user)
|
||||||
|
{
|
||||||
|
std::map<wxString, ImportPattern>::iterator it;
|
||||||
|
wxString req, key;
|
||||||
|
|
||||||
|
for (it = user->_importPatterns.begin();
|
||||||
|
it != user->_importPatterns.end();
|
||||||
|
it++)
|
||||||
|
{
|
||||||
|
if (it->second.pattern == NULL_IMPORT_PATTERN) continue;
|
||||||
|
|
||||||
|
key = ImportEngine::RemoveUnused(it->first);
|
||||||
|
|
||||||
|
req = wxT("UPDATE import_pattern SET ") ;
|
||||||
|
req += wxT("pattern='") + it->second.pattern + wxT("'");
|
||||||
|
req += wxT(", account='") + it->second.account + wxT("'");
|
||||||
|
req += wxT(", category='") + it->second.category + wxT("'");
|
||||||
|
req += wxT(" WHERE description='") + key + wxT("'");
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!_db.ExecuteUpdate(req))
|
||||||
|
{
|
||||||
|
req = wxT("INSERT INTO import_pattern ('user', 'description', 'pattern', 'account', 'category') VALUES ('") ;
|
||||||
|
req += user->_id + wxT("'");
|
||||||
|
req += wxT(" ,'") + key + wxT("'");
|
||||||
|
req += wxT(" ,'") + it->second.pattern + wxT("'");
|
||||||
|
req += wxT(" ,'") + it->second.account + wxT("'");
|
||||||
|
req += wxT(" ,'") + it->second.category + wxT("'");
|
||||||
|
req += wxT(")");
|
||||||
|
EXECUTE_SQL_UPDATE(req, );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (wxSQLite3Exception e)
|
||||||
|
{
|
||||||
|
std::cerr << req.mb_str() << "\n" ;
|
||||||
|
std::cerr << e.GetMessage().mb_str() << "\n" ;
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -164,6 +164,8 @@ public:
|
||||||
std::map<wxString, double>* GetNotChecked(User* user, int month, int year);
|
std::map<wxString, double>* GetNotChecked(User* user, int month, int year);
|
||||||
std::map<wxString, double>* GetVirtualAmount(User* user, int month, int year);
|
std::map<wxString, double>* GetVirtualAmount(User* user, int month, int year);
|
||||||
|
|
||||||
|
void UpdateImportPattern(User* user);
|
||||||
|
|
||||||
/* Database Update */
|
/* Database Update */
|
||||||
|
|
||||||
void CheckDatabaseVersion();
|
void CheckDatabaseVersion();
|
||||||
|
|
|
@ -64,6 +64,11 @@ static void Version_1_to_2(wxSQLite3Database& _db)
|
||||||
req = wxT("UPDATE operation SET virtual='0'");
|
req = wxT("UPDATE operation SET virtual='0'");
|
||||||
|
|
||||||
UPDATE_TABLE("1", "2", "7");
|
UPDATE_TABLE("1", "2", "7");
|
||||||
|
|
||||||
|
/* Import Pattern */
|
||||||
|
req = wxT("CREATE TABLE import_pattern(id INTEGER PRIMARY KEY, user REFERENCES user(id), description VARCHAR(255), pattern VARCHAR(255), account REFERENCES account(id), category REFERENCES category(id))");
|
||||||
|
|
||||||
|
UPDATE_TABLE("1", "2", "8");
|
||||||
}
|
}
|
||||||
|
|
||||||
static update_func updates[] = {
|
static update_func updates[] = {
|
||||||
|
|
|
@ -73,6 +73,7 @@ public:
|
||||||
void UnGroup(const Operation& op);
|
void UnGroup(const Operation& op);
|
||||||
void ResolveGroups(int year);
|
void ResolveGroups(int year);
|
||||||
|
|
||||||
|
void UpdateImportPattern(User* user);
|
||||||
private:
|
private:
|
||||||
Database* _db;
|
Database* _db;
|
||||||
};
|
};
|
||||||
|
|
|
@ -83,7 +83,7 @@ std::vector<wxString> ExplodeString(wxString& s)
|
||||||
- tail spaces
|
- tail spaces
|
||||||
- every word starting by a number
|
- every word starting by a number
|
||||||
*/
|
*/
|
||||||
wxString ImportEngine::RemoveUnused(wxString& s)
|
wxString ImportEngine::RemoveUnused(const wxString& s)
|
||||||
{
|
{
|
||||||
wxString tmp = s, tmp2;
|
wxString tmp = s, tmp2;
|
||||||
wxString res;
|
wxString res;
|
||||||
|
@ -124,9 +124,16 @@ wxString ImportEngine::FindPattern(wxString& orig, wxString& dest)
|
||||||
{
|
{
|
||||||
wxString pattern, cur_pat;
|
wxString pattern, cur_pat;
|
||||||
int i, a;
|
int i, a;
|
||||||
std::vector<wxString> tok1 = ExplodeString(orig);
|
std::vector<wxString> tok1;
|
||||||
std::vector<wxString> tok2 = ExplodeString(dest);
|
std::vector<wxString> tok2;
|
||||||
int size1 = tok1.size(), size2 = tok2.size();
|
int size1, size2;
|
||||||
|
|
||||||
|
if (orig == dest) return NULL_IMPORT_PATTERN;
|
||||||
|
|
||||||
|
tok1 = ExplodeString(orig);
|
||||||
|
tok2 = ExplodeString(dest);
|
||||||
|
size1 = tok1.size();
|
||||||
|
size2 = tok2.size();
|
||||||
|
|
||||||
for(i=0; i<size2; i++)
|
for(i=0; i<size2; i++)
|
||||||
{
|
{
|
||||||
|
@ -171,11 +178,20 @@ wxString ImportEngine::FindPattern(wxString& orig, wxString& dest)
|
||||||
|
|
||||||
void ImportEngine::ApplyPattern(ImportPattern& pattern, Operation& op)
|
void ImportEngine::ApplyPattern(ImportPattern& pattern, Operation& op)
|
||||||
{
|
{
|
||||||
std::vector<wxString> tok1 = ExplodeString(pattern.filter);
|
std::vector<wxString> tok1;
|
||||||
std::vector<wxString> tok2 = ExplodeString(op.description);
|
std::vector<wxString> tok2;
|
||||||
int size1 = tok1.size(), i;
|
int size1, i;
|
||||||
long pos;
|
long pos;
|
||||||
|
|
||||||
|
op.account = pattern.account;
|
||||||
|
op.category = pattern.category;
|
||||||
|
|
||||||
|
if (pattern.pattern == NULL_IMPORT_PATTERN) return;
|
||||||
|
|
||||||
|
tok1 = ExplodeString(pattern.pattern);
|
||||||
|
tok2 = ExplodeString(op.description);
|
||||||
|
size1 = tok1.size();
|
||||||
|
|
||||||
op.description = wxT("");
|
op.description = wxT("");
|
||||||
|
|
||||||
for(i=0; i<size1; i++)
|
for(i=0; i<size1; i++)
|
||||||
|
@ -203,8 +219,6 @@ void ImportEngine::ApplyPattern(ImportPattern& pattern, Operation& op)
|
||||||
}
|
}
|
||||||
|
|
||||||
op.description.Trim();
|
op.description.Trim();
|
||||||
op.account = pattern.account;
|
|
||||||
op.category = pattern.category;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int ImportEngine::UpdatePattern(int pos)
|
int ImportEngine::UpdatePattern(int pos)
|
||||||
|
@ -222,7 +236,7 @@ int ImportEngine::UpdatePattern(int pos)
|
||||||
|
|
||||||
key1 = RemoveUnused(_descriptions[op.id]);
|
key1 = RemoveUnused(_descriptions[op.id]);
|
||||||
|
|
||||||
pattern.filter = FindPattern(_descriptions[op.id], op.description);
|
pattern.pattern = FindPattern(_descriptions[op.id], op.description);
|
||||||
pattern.account = op.account;
|
pattern.account = op.account;
|
||||||
pattern.category = op.category;
|
pattern.category = op.category;
|
||||||
|
|
||||||
|
@ -253,13 +267,13 @@ void ImportEngine::MatchPattern(wxString& originalKey, Operation& op)
|
||||||
|
|
||||||
if (!_user->_importPatterns.count(key1))
|
if (!_user->_importPatterns.count(key1))
|
||||||
{
|
{
|
||||||
pattern.filter = FindPattern(originalKey, op.description);
|
pattern.pattern = FindPattern(originalKey, op.description);
|
||||||
pattern.account = op.account;
|
pattern.account = op.account;
|
||||||
pattern.category = op.category;
|
pattern.category = op.category;
|
||||||
|
|
||||||
_user->_importPatterns[key1] = pattern;
|
_user->_importPatterns[key1] = pattern;
|
||||||
|
|
||||||
// std::cout << "New pattern " << key1.mb_str() << "\t" << pattern.filter.mb_str() << std::endl;
|
// std::cout << "New pattern " << key1.mb_str() << "\t" << pattern.pattern.mb_str() << std::endl;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -267,3 +281,26 @@ void ImportEngine::MatchPattern(wxString& originalKey, Operation& op)
|
||||||
ApplyPattern(_user->_importPatterns[key1], op);
|
ApplyPattern(_user->_importPatterns[key1], op);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<wxString> ImportEngine::ParseFile()
|
||||||
|
{
|
||||||
|
return _unresolvedAccounts;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<Operation>* ImportEngine::GetOperations(std::map<wxString, wxString>& accounts)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i=0; i<(int)_operations.size(); i++)
|
||||||
|
{
|
||||||
|
if (_operations[i].account.StartsWith(wxT("unknown-")))
|
||||||
|
_operations[i].account = accounts[_operations[i].account.Mid(8)];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_kiss->GetOperationOrder() == wxT("ASC"))
|
||||||
|
std::sort(_operations.begin(), _operations.end(), sortOperations);
|
||||||
|
else
|
||||||
|
std::sort(_operations.begin(), _operations.end(), reverseSortOperations);
|
||||||
|
|
||||||
|
return &_operations;
|
||||||
|
}
|
||||||
|
|
|
@ -27,11 +27,13 @@ class KissCount;
|
||||||
|
|
||||||
class ImportPattern {
|
class ImportPattern {
|
||||||
public:
|
public:
|
||||||
wxString filter;
|
wxString pattern;
|
||||||
wxString account;
|
wxString account;
|
||||||
wxString category;
|
wxString category;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
#define NULL_IMPORT_PATTERN wxT("(nil)")
|
||||||
|
|
||||||
class ImportEngine {
|
class ImportEngine {
|
||||||
public:
|
public:
|
||||||
ImportEngine();
|
ImportEngine();
|
||||||
|
@ -42,17 +44,18 @@ public:
|
||||||
virtual wxString GetFileExt();
|
virtual wxString GetFileExt();
|
||||||
|
|
||||||
// Handle the file
|
// Handle the file
|
||||||
virtual bool HandleFile(const wxString& path, User* user, Database* db, KissCount* kiss);
|
virtual bool HandleFile(const wxString& path, User* user, Database* db, KissCount* kiss)=0;
|
||||||
|
|
||||||
// Parse the file and return accounts that doesn't match
|
// Parse the file and return accounts that doesn't match
|
||||||
virtual std::vector<wxString> ParseFile()=0;
|
virtual std::vector<wxString> ParseFile();
|
||||||
|
|
||||||
// Final Step
|
// Final Step
|
||||||
virtual std::vector<Operation>* GetOperations(std::map<wxString, wxString>& accounts)=0;
|
virtual std::vector<Operation>* GetOperations(std::map<wxString, wxString>& accounts);
|
||||||
|
|
||||||
void MatchPattern(wxString& key, Operation& op);
|
void MatchPattern(wxString& key, Operation& op);
|
||||||
int UpdatePattern(int pos);
|
int UpdatePattern(int pos);
|
||||||
|
|
||||||
|
static wxString RemoveUnused(const wxString& s);
|
||||||
protected:
|
protected:
|
||||||
Database* _db;
|
Database* _db;
|
||||||
User* _user;
|
User* _user;
|
||||||
|
@ -67,7 +70,6 @@ protected:
|
||||||
std::vector<Operation> _operations;
|
std::vector<Operation> _operations;
|
||||||
std::map<wxString, wxString> _descriptions;
|
std::map<wxString, wxString> _descriptions;
|
||||||
|
|
||||||
wxString RemoveUnused(wxString& s);
|
|
||||||
void ApplyPattern(ImportPattern& pattern, Operation& op);
|
void ApplyPattern(ImportPattern& pattern, Operation& op);
|
||||||
wxString FindPattern(wxString& s1, wxString& s2);
|
wxString FindPattern(wxString& s1, wxString& s2);
|
||||||
};
|
};
|
||||||
|
|
|
@ -43,7 +43,7 @@ int OFXImportEngine::account_cb(const struct OfxAccountData data, void * account
|
||||||
|
|
||||||
if (!_this->_curAccount.Len())
|
if (!_this->_curAccount.Len())
|
||||||
{
|
{
|
||||||
_this->_accounts[account_number] = wxT("unknown-") + account_number;
|
_this->_curAccount = _this->_accounts[account_number] = wxT("unknown-") + account_number;
|
||||||
_this->_unresolvedAccounts.push_back(account_number);
|
_this->_unresolvedAccounts.push_back(account_number);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -136,18 +136,3 @@ bool OFXImportEngine::HandleFile(const wxString& path, User* user, Database* db,
|
||||||
|
|
||||||
return !libofx_proc_file(_ctx, path.mb_str(), AUTODETECT);
|
return !libofx_proc_file(_ctx, path.mb_str(), AUTODETECT);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<wxString> OFXImportEngine::ParseFile()
|
|
||||||
{
|
|
||||||
return _unresolvedAccounts;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<Operation>* OFXImportEngine::GetOperations(std::map<wxString, wxString>& accounts)
|
|
||||||
{
|
|
||||||
if (_kiss->GetOperationOrder() == wxT("ASC"))
|
|
||||||
std::sort(_operations.begin(), _operations.end(), sortOperations);
|
|
||||||
else
|
|
||||||
std::sort(_operations.begin(), _operations.end(), reverseSortOperations);
|
|
||||||
|
|
||||||
return &_operations;
|
|
||||||
}
|
|
||||||
|
|
|
@ -29,8 +29,8 @@ public:
|
||||||
~OFXImportEngine();
|
~OFXImportEngine();
|
||||||
|
|
||||||
virtual bool HandleFile(const wxString& path, User* user, Database* db, KissCount* kiss);
|
virtual bool HandleFile(const wxString& path, User* user, Database* db, KissCount* kiss);
|
||||||
virtual std::vector<wxString> ParseFile();
|
/* virtual std::vector<wxString> ParseFile(); */
|
||||||
virtual std::vector<Operation>* GetOperations(std::map<wxString, wxString>& accounts);
|
/* virtual std::vector<Operation>* GetOperations(std::map<wxString, wxString>& accounts); */
|
||||||
|
|
||||||
private:
|
private:
|
||||||
LibofxContextPtr _ctx;
|
LibofxContextPtr _ctx;
|
||||||
|
|
|
@ -19,11 +19,12 @@
|
||||||
|
|
||||||
#include "ImportPanel.h"
|
#include "ImportPanel.h"
|
||||||
|
|
||||||
enum {OPEN_FILE_ID=1, BUTTON_OPEN_ID, NAME_ID, BUTTON_LOAD_ID, BUTTON_INTEGRATE_ID, OPS_GRID_ID};
|
enum {OPEN_FILE_ID=1, BUTTON_OPEN_ID, NAME_ID, BUTTON_LOAD_ID, BUTTON_INTEGRATE_ID, CHECK_SAVE_ID, OPS_GRID_ID};
|
||||||
|
|
||||||
BEGIN_EVENT_TABLE(ImportPanel, wxPanel)
|
BEGIN_EVENT_TABLE(ImportPanel, wxPanel)
|
||||||
EVT_GRID_CMD_CELL_CHANGE(OPS_GRID_ID, ImportPanel::OnOperationModified)
|
EVT_GRID_CMD_CELL_CHANGE(OPS_GRID_ID, ImportPanel::OnOperationModified)
|
||||||
EVT_BUTTON(BUTTON_OPEN_ID, ImportPanel::OnFile)
|
EVT_BUTTON(BUTTON_OPEN_ID, ImportPanel::OnFile)
|
||||||
|
EVT_BUTTON(BUTTON_INTEGRATE_ID, ImportPanel::OnIntegrate)
|
||||||
EVT_TEXT_ENTER(OPEN_FILE_ID, ImportPanel::OnFileEnter)
|
EVT_TEXT_ENTER(OPEN_FILE_ID, ImportPanel::OnFileEnter)
|
||||||
EVT_BUTTON(BUTTON_LOAD_ID, ImportPanel::OnLoadOperations)
|
EVT_BUTTON(BUTTON_LOAD_ID, ImportPanel::OnLoadOperations)
|
||||||
EVT_SHOW(ImportPanel::OnShow)
|
EVT_SHOW(ImportPanel::OnShow)
|
||||||
|
@ -33,7 +34,7 @@ ImportPanel::ImportPanel(KissCount* kiss, wxUI *parent) : KissPanel(kiss, parent
|
||||||
{
|
{
|
||||||
wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL);
|
wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL);
|
||||||
wxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL);
|
wxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL);
|
||||||
wxBoxSizer *hbox2 = new wxBoxSizer(wxHORIZONTAL);
|
_hbox = new wxBoxSizer(wxHORIZONTAL);
|
||||||
wxButton* buttonOpen;
|
wxButton* buttonOpen;
|
||||||
wxRect rect = wxDisplay().GetGeometry();
|
wxRect rect = wxDisplay().GetGeometry();
|
||||||
int w, h;
|
int w, h;
|
||||||
|
@ -54,10 +55,13 @@ ImportPanel::ImportPanel(KissCount* kiss, wxUI *parent) : KissPanel(kiss, parent
|
||||||
_buttonIntegrate = new wxButton(this, BUTTON_INTEGRATE_ID, wxT("Integrate operations"));
|
_buttonIntegrate = new wxButton(this, BUTTON_INTEGRATE_ID, wxT("Integrate operations"));
|
||||||
_buttonIntegrate->Disable();
|
_buttonIntegrate->Disable();
|
||||||
|
|
||||||
|
_checkSaveImportPatterns = new wxCheckBox(this, CHECK_SAVE_ID, wxT("Save import patterns"));
|
||||||
|
|
||||||
hbox->Add(_fileTxt, 0, wxGROW|wxALL, 5);
|
hbox->Add(_fileTxt, 0, wxGROW|wxALL, 5);
|
||||||
hbox->Add(buttonOpen, 0, wxALL, 5);
|
hbox->Add(buttonOpen, 0, wxALL, 5);
|
||||||
hbox->Add(_buttonLoadOperations, 0, wxALL, 5);
|
hbox->Add(_buttonLoadOperations, 0, wxALL, 5);
|
||||||
hbox->Add(_buttonIntegrate, 0, wxALL, 5);
|
hbox->Add(_buttonIntegrate, 0, wxALL, 5);
|
||||||
|
hbox->Add(_checkSaveImportPatterns, 0, wxALL, 5);
|
||||||
|
|
||||||
vbox->Add(hbox, 0);
|
vbox->Add(hbox, 0);
|
||||||
|
|
||||||
|
@ -73,10 +77,10 @@ ImportPanel::ImportPanel(KissCount* kiss, wxUI *parent) : KissPanel(kiss, parent
|
||||||
|
|
||||||
_operationsGrid = new GridAccount(kiss, this, OPS_GRID_ID, false, false, false);
|
_operationsGrid = new GridAccount(kiss, this, OPS_GRID_ID, false, false, false);
|
||||||
|
|
||||||
hbox2->Add(staticBoxSizer, 0, wxGROW|wxALL, 15);
|
_hbox->Add(staticBoxSizer, 0, wxGROW|wxALL, 15);
|
||||||
hbox2->Add(_operationsGrid, 0, wxGROW|wxALL, 15);
|
_hbox->Add(_operationsGrid, 0, wxGROW|wxALL, 15);
|
||||||
|
|
||||||
vbox->Add(hbox2, wxGROW);
|
vbox->Add(_hbox, wxGROW);
|
||||||
|
|
||||||
Fit();
|
Fit();
|
||||||
|
|
||||||
|
@ -93,7 +97,7 @@ KissPanel* ImportPanel::CreatePanel()
|
||||||
wxBitmapButton* ImportPanel::GetButton(int id)
|
wxBitmapButton* ImportPanel::GetButton(int id)
|
||||||
{
|
{
|
||||||
if (!_KissButton)
|
if (!_KissButton)
|
||||||
_KissButton = new wxBitmapButton(_wxUI, id, wxBitmap(wxT(PREFS_ICON), wxBITMAP_TYPE_PNG), wxDefaultPosition, wxSize(128, 128));
|
_KissButton = new wxBitmapButton(_wxUI, id, wxBitmap(wxT(IMPORT_ICON), wxBITMAP_TYPE_PNG), wxDefaultPosition, wxSize(128, 128));
|
||||||
|
|
||||||
return _KissButton;
|
return _KissButton;
|
||||||
}
|
}
|
||||||
|
@ -195,8 +199,9 @@ void ImportPanel::ProcessFile()
|
||||||
void ImportPanel::OnLoadOperations(wxCommandEvent& WXUNUSED(event))
|
void ImportPanel::OnLoadOperations(wxCommandEvent& WXUNUSED(event))
|
||||||
{
|
{
|
||||||
std::map<wxString, wxString> resolvedAccounts;
|
std::map<wxString, wxString> resolvedAccounts;
|
||||||
int i;
|
int i, nbAccounts;
|
||||||
User* user = _kiss->GetUser();
|
User* user = _kiss->GetUser();
|
||||||
|
Account account;
|
||||||
|
|
||||||
for(i=0; i<_accountsGrid->GetNumberRows(); i++)
|
for(i=0; i<_accountsGrid->GetNumberRows(); i++)
|
||||||
{
|
{
|
||||||
|
@ -204,13 +209,57 @@ void ImportPanel::OnLoadOperations(wxCommandEvent& WXUNUSED(event))
|
||||||
user->GetAccountId(_accountsGrid->GetCellValue(i, 1));
|
user->GetAccountId(_accountsGrid->GetCellValue(i, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nbAccounts = 0;
|
||||||
|
for(i=0; i<_accountsGrid->GetNumberRows(); i++)
|
||||||
|
{
|
||||||
|
if (_accountsGrid->GetCellValue(i, 1) == _("Create one"))
|
||||||
|
nbAccounts++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nbAccounts)
|
||||||
|
{
|
||||||
|
wxString message = wxString::Format(wxT("%d"), nbAccounts);
|
||||||
|
message += _(" account(s) will be created, is it ok ?");
|
||||||
|
|
||||||
|
wxMessageDialog dialog(_wxUI, message, wxT("KissCount"), wxYES_NO);
|
||||||
|
if (dialog.ShowModal() == wxID_NO)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for(i=0; i<_accountsGrid->GetNumberRows(); i++)
|
||||||
|
{
|
||||||
|
if (_accountsGrid->GetCellValue(i, 1) == _("Create one"))
|
||||||
|
{
|
||||||
|
account.name = _accountsGrid->GetCellValue(i, 0);
|
||||||
|
account.number = _accountsGrid->GetCellValue(i, 0);
|
||||||
|
account.shared = false;
|
||||||
|
account.blocked = false;
|
||||||
|
account._default = false;
|
||||||
|
account.is_owner = true;
|
||||||
|
account._virtual = false;
|
||||||
|
|
||||||
|
resolvedAccounts[_accountsGrid->GetCellValue(i, 0)] = _kiss->AddAccount(account);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_accountsGrid->DeleteRows(0, _accountsGrid->GetNumberRows ());
|
||||||
|
|
||||||
|
_wxUI->NeedReload();
|
||||||
|
}
|
||||||
|
|
||||||
_operations = _importEngine->GetOperations(resolvedAccounts);
|
_operations = _importEngine->GetOperations(resolvedAccounts);
|
||||||
|
|
||||||
if (_operations->size())
|
if (_operations->size())
|
||||||
{
|
{
|
||||||
|
_hbox->Detach(_operationsGrid);
|
||||||
|
delete _operationsGrid;
|
||||||
|
_operationsGrid = new GridAccount(_kiss, this, OPS_GRID_ID, false, false, false);
|
||||||
|
_hbox->Add(_operationsGrid, 0, wxGROW|wxALL, 15);
|
||||||
|
|
||||||
_operationsGrid->LoadOperations(_operations, 0, 0);
|
_operationsGrid->LoadOperations(_operations, 0, 0);
|
||||||
_buttonIntegrate->Enable();
|
_buttonIntegrate->Enable();
|
||||||
|
|
||||||
|
_buttonLoadOperations->Disable();
|
||||||
|
|
||||||
Fit();
|
Fit();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -219,6 +268,32 @@ void ImportPanel::OnLoadOperations(wxCommandEvent& WXUNUSED(event))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ImportPanel::OnIntegrate(wxCommandEvent& WXUNUSED(event))
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (!_operations->size()) return;
|
||||||
|
|
||||||
|
wxMessageDialog dialog(_wxUI, _("Are you sure want to integrate these operations ?"), wxT("KissCount"), wxYES_NO);
|
||||||
|
if (dialog.ShowModal() == wxID_NO)
|
||||||
|
return;
|
||||||
|
|
||||||
|
_buttonIntegrate->Disable();
|
||||||
|
|
||||||
|
for(i=0; i<(int)_operations->size(); i++)
|
||||||
|
_kiss->AddOperation((*_operations)[i]);
|
||||||
|
|
||||||
|
// if (_checkSaveImportPatterns->IsChecked())
|
||||||
|
_kiss->UpdateImportPattern();
|
||||||
|
|
||||||
|
_operations->clear();
|
||||||
|
_operationsGrid->ClearGrid();
|
||||||
|
|
||||||
|
wxMessageBox(_("Operations successfully imported"), wxT("KissCount"), wxICON_INFORMATION | wxOK);
|
||||||
|
|
||||||
|
_wxUI->NeedReload();
|
||||||
|
}
|
||||||
|
|
||||||
void ImportPanel::OnOperationModified(wxGridEvent& event)
|
void ImportPanel::OnOperationModified(wxGridEvent& event)
|
||||||
{
|
{
|
||||||
int col = event.GetCol();
|
int col = event.GetCol();
|
||||||
|
@ -238,8 +313,6 @@ void ImportPanel::OnOperationModified(wxGridEvent& event)
|
||||||
if (_importEngine->UpdatePattern(row-1) > 1)
|
if (_importEngine->UpdatePattern(row-1) > 1)
|
||||||
_operationsGrid->LoadOperations(_operations, 0, 0);
|
_operationsGrid->LoadOperations(_operations, 0, 0);
|
||||||
|
|
||||||
// sleep(1);
|
|
||||||
|
|
||||||
Fit();
|
Fit();
|
||||||
|
|
||||||
update = false;
|
update = false;
|
||||||
|
|
|
@ -48,14 +48,17 @@ public:
|
||||||
void OnFile(wxCommandEvent& WXUNUSED(event));
|
void OnFile(wxCommandEvent& WXUNUSED(event));
|
||||||
void OnFileEnter(wxCommandEvent& WXUNUSED(event));
|
void OnFileEnter(wxCommandEvent& WXUNUSED(event));
|
||||||
void OnLoadOperations(wxCommandEvent& WXUNUSED(event));
|
void OnLoadOperations(wxCommandEvent& WXUNUSED(event));
|
||||||
|
void OnIntegrate(wxCommandEvent& WXUNUSED(event));
|
||||||
void OnOperationModified(wxGridEvent& event);
|
void OnOperationModified(wxGridEvent& event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
wxBoxSizer *_hbox;
|
||||||
wxGrid* _accountsGrid;
|
wxGrid* _accountsGrid;
|
||||||
wxTextCtrl* _fileTxt;
|
wxTextCtrl* _fileTxt;
|
||||||
GridAccount* _operationsGrid;
|
GridAccount* _operationsGrid;
|
||||||
ImportEngine* _importEngine;
|
ImportEngine* _importEngine;
|
||||||
wxButton* _buttonLoadOperations, *_buttonIntegrate;
|
wxButton* _buttonLoadOperations, *_buttonIntegrate;
|
||||||
|
wxCheckBox *_checkSaveImportPatterns;
|
||||||
std::vector<Operation>* _operations;
|
std::vector<Operation>* _operations;
|
||||||
|
|
||||||
void ProcessFile();
|
void ProcessFile();
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#define STATS_ICON RESSOURCES_ROOT "icons/chart-icon.png"
|
#define STATS_ICON RESSOURCES_ROOT "icons/chart-icon.png"
|
||||||
#define SEARCH_ICON RESSOURCES_ROOT "icons/Search-icon.png"
|
#define SEARCH_ICON RESSOURCES_ROOT "icons/Search-icon.png"
|
||||||
#define PREFS_ICON RESSOURCES_ROOT "icons/options-icon.png"
|
#define PREFS_ICON RESSOURCES_ROOT "icons/options-icon.png"
|
||||||
|
#define IMPORT_ICON RESSOURCES_ROOT "icons/import-icon.png"
|
||||||
#define CHANGE_USER_ICON RESSOURCES_ROOT "icons/Clients-icon.png"
|
#define CHANGE_USER_ICON RESSOURCES_ROOT "icons/Clients-icon.png"
|
||||||
#define ABOUT_ICON RESSOURCES_ROOT "icons/windows-users-icon.png"
|
#define ABOUT_ICON RESSOURCES_ROOT "icons/windows-users-icon.png"
|
||||||
#define QUIT_ICON RESSOURCES_ROOT "icons/system-log-out.png"
|
#define QUIT_ICON RESSOURCES_ROOT "icons/system-log-out.png"
|
||||||
|
|
Loading…
Reference in New Issue
Block a user