1 #line 2 "src/Eng/AccountRegisterModel.cpp"
3 #include "../Glb/gcwglobal.h"
4 #include "../Dbo/SessionGnuCash.h"
5 #include "../Dbo/Splits/Splits.h"
6 #include "../Dbo/Prefrences.h"
7 #include "../Dbo/Transactions/Manager.h"
8 #include "../Dbo/Vars/Vars.h"
9 #include "../Glb/Core.h"
26 #define COL_ACTION (1)
27 #define COL_DESCRIPTION (2)
28 #define COL_TRANSFER (3)
29 #define COL_RECONCILE (4)
31 #define COL_CREDIT (6)
32 #define COL_BALANCE (7)
37 :
Wt::WStandardItemModel( 0, 8 ),
38 m_accountGuid( _accountGuid ),
39 m_editable( _editable )
51 dataChanged().connect( [=]( Wt::WModelIndex _index1, Wt::WModelIndex _index2 )
53 std::cout << __FILE__ <<
":" << __LINE__ <<
" model<signal>.dataChanged()"
55 <<
"\n r1:" << _index1.row()
56 <<
" c1:" << _index1.column()
58 <<
"\n r2:" << _index2.row()
59 <<
" c2:" << _index2.column()
67 itemChanged().connect( [=]( Wt::WStandardItem * _item )
69 std::cout << __FILE__ <<
":" << __LINE__ <<
" model<signal>.itemChanged()"
70 <<
"\n r:" << _item-> row()
71 <<
" c:" << _item-> column()
72 <<
"\n d:" <<
Wt::asString( _item-> data( Wt::ItemDataRole::Display ) )
85 m_accountGuid = _accountGuid;
94 m_viewMode = _viewMode;
101 m_doubleLine = _doubleLine;
106 isDeletable(
const Wt::WModelIndex & _index )->
bool
112 if( getSplitGuid( _index ) ==
"" )
120 transMan.
loadSplit( getSplitGuid( _index ) );
121 if( transMan.
thisSplit()-> isReconciled() )
133 isEditable(
const Wt::WModelIndex & _index )->
bool
139 if( getSplitGuid( _index ) ==
"" )
147 transMan.
loadSplit( getSplitGuid( _index ) );
148 if( transMan.
thisSplit()-> isReconciled() )
162 return isEditable( index( _row, 0 ) );
175 getString(
const Wt::WModelIndex & _index,
int column )-> std::string
180 index( _index.row(), column )
181 .data( Wt::ItemDataRole::Display )
189 getDate(
const Wt::WModelIndex & _index )-> Wt::WDateTime
192 Wt::WDateTime::fromString
209 getAction(
const Wt::WModelIndex & _index )-> std::string
242 getReconcile(
const Wt::WModelIndex & _index )-> std::string
254 if( !_index.data( Wt::ItemDataRole::Display ).empty() )
266 getNumeric( index( _index.row(),
COL_DEBIT ) );
275 getNumeric( index( _index.row(),
COL_CREDIT ) );
286 auto debit = getDebit( _index );
287 auto credit = getCredit( _index );
288 retVal = debit - credit;
296 getSplitGuid(
const Wt::WModelIndex & _index )-> std::string
302 .data( Wt::ItemDataRole::User )
312 return getSplitGuid( index( _row,
COL_DATE ) );
318 saveToDisk(
const Wt::WModelIndex & _index )->
void
321 std::cout << __FILE__ <<
":" << __LINE__ <<
" " << __FUNCTION__ <<
"(): "
322 <<
"\n row:" << _index.row()
323 <<
"\n col:" << _index.column()
324 <<
"\n gui:" << getSplitGuid( _index )
341 auto splitGuid = getSplitGuid( _index );
342 if( splitGuid ==
"" )
348 transMan.
newTransaction( m_accountGuid, getTransferGuid( _index ) );
364 switch( _index.column() )
368 transMan.
setDate( getDate( _index ) );
374 transMan.
setAction( getAction( _index ) );
398 transMan.
setValue( getValue( _index ) );
404 transMan.
setValue( getValue( _index ) );
411 transMan.
setNotes( getNotes( _index ) );
422 setData(
const Wt::WModelIndex & _index,
const Wt::cpp17::any & _value, Wt::ItemDataRole _role )->
bool
428 if( _role != Wt::ItemDataRole::Edit )
441 auto _valuesMatch = [](
const Wt::cpp17::any & _any1,
const Wt::cpp17::any & _any2 )
447 if( _any1.type() == _any2.type() )
450 std::cout << __FILE__ <<
":" << __LINE__ <<
" " << __FUNCTION__
451 <<
"\n " <<
typeid(Wt::WString).
name()
452 <<
"\n " <<
typeid(Wt::WString).hash_code()
453 <<
"\n " << _any1.type().name()
454 <<
"\n " << _any1.type().hash_code()
458 if(
typeid(std::string) == _any1.type() )
460 auto v1 = Wt::cpp17::any_cast< std::string >( _any1 );
461 auto v2 = Wt::cpp17::any_cast< std::string >( _any2 );
466 if(
typeid(Wt::WString) == _any1.type() )
468 auto v1 = Wt::cpp17::any_cast< Wt::WString >( _any1 );
469 auto v2 = Wt::cpp17::any_cast< Wt::WString >( _any2 );
474 if(
typeid(
int) == _any1.type() )
476 auto v1 = Wt::cpp17::any_cast< int >( _any1 );
477 auto v2 = Wt::cpp17::any_cast< int >( _any2 );
483 std::cout << __FILE__ <<
":" << __LINE__ <<
" unhandled type" << std::endl;
500 if( !_valuesMatch( _index.data( _role ), _value ) )
504 <<
"\n row:" << _index.row()
505 <<
"\n col:" << _index.column()
514 retVal = Wt::WStandardItemModel::setData( _index, _value, _role );
516 saveToDisk( _index );
520 m_goneDirty.emit( _index );
553 if( m_accountGuid ==
"" )
560 layoutAboutToBeChanged().emit();
578 auto _addColumn = [&](
RowItem & columns,
auto _value )
580 auto item = std::make_unique< Wt::WStandardItem >( _value );
582 item-> setToolTip( _value );
584 auto retVal = item.get();
585 columns.push_back( std::move( item ) );
612 std::cout << __FILE__ <<
":" << __LINE__
613 <<
" guid:" << registerAccountItem->
guid()
614 <<
" name:" << registerAccountItem->
name()
615 <<
" dbcr:" <<
static_cast<int>( registerAccountItem-> accountDrCr() )
616 <<
" type:" <<
static_cast<int>( registerAccountItem-> accountType() )
617 <<
" typn:" << registerAccountItem-> accountTypeName()
649 for(
auto splitItem : splitItems )
655 bool editable =
false;
672 auto _append1stRow = [&]()
712 post_date-> setData( splitItem->
guid(), Wt::ItemDataRole::User );
713 post_date-> setData( splitItem , Wt::ItemDataRole::User + 1 );
723 .arg( m_accountGuid )
724 .arg( splitItem->
guid() )
726 post_date-> setToolTip( tip );
732 num = _addColumn( columns, transactionItem-> num() );
750 switch( transactionSplits.size() )
763 account = _addColumn( columns,
TR(
"gcw.AccountRegister.account.imbalanceUSD") );
764 account-> setStyleClass(
"errval" );
765 account-> setToolTip(
TR(
"gcw.AccountRegister.account.imbalanceUSD.toolTip") );
778 auto txSplitItem = *transactionSplits.begin();
782 if( splitAccountItem )
792 .arg( splitAccountItem->
guid() )
793 .arg( txSplitItem->
guid() )
795 account-> setToolTip( tip );
810 account = _addColumn( columns,
TR(
"gcw.AccountRegister.account.imbalanceUSD") );
811 account-> setStyleClass(
"errval" );
814 Wt::WString(
"target guid:{1}\n{2}")
815 .arg( txSplitItem-> account_guid() )
816 .arg(
TR(
"gcw.AccountRegister.account.invalidTarget.toolTip") )
820 account-> setToolTip( toolTip );
838 account = _addColumn( columns,
TR(
"gcw.AccountRegister.account.multisplit") );
847 reconcile = _addColumn( columns, splitItem-> reconcile_state() );
980 switch( prefrenceItem.reverseBalanceAccounts() )
985 if( registerAccountItem-> accountType() == GCW::Dbo::Account::Type::INCOME
986 || registerAccountItem-> accountType() == GCW::Dbo::Account::Type::EXPENSE
998 if( registerAccountItem-> accountDrCr() == GCW::Dbo::Account::DrCr::CREDIT )
1012 runningBalance += splitItem-> value( invert );
1018 m_present += splitItem-> value( invert );
1027 if( splitItem-> value() > 0 )
1029 debit = _addColumn( columns, splitItem-> valueAsString() );
1030 credit = _addColumn( columns,
"" );
1033 debit -> setData( splitItem-> value(), Wt::ItemDataRole::User );
1034 credit-> setData(
GCW_NUMERIC(0) , Wt::ItemDataRole::User );
1044 if( splitItem-> value() < 0 )
1046 debit = _addColumn( columns,
"" );
1047 credit = _addColumn( columns, splitItem-> valueAsString(
true) );
1049 debit -> setData(
GCW_NUMERIC(0) , Wt::ItemDataRole::User );
1050 credit-> setData( splitItem-> value(), Wt::ItemDataRole::User );
1057 if( splitItem-> value() == 0 )
1059 debit = _addColumn( columns,
"" );
1060 credit = _addColumn( columns,
"" );
1062 debit -> setData(
GCW_NUMERIC(0), Wt::ItemDataRole::User );
1063 credit-> setData(
GCW_NUMERIC(0), Wt::ItemDataRole::User );
1074 Wt::WString(
"{1}" )
1077 balance-> setData( runningBalance, Wt::ItemDataRole::User );
1084 if( runningBalance < 0 )
1088 post_date -> setStyleClass(
"negval" );
1089 num -> setStyleClass(
"negval" );
1091 account -> setStyleClass(
"negval" );
1092 reconcile -> setStyleClass(
"negval" );
1093 debit -> setStyleClass(
"negval" );
1094 credit -> setStyleClass(
"negval" );
1099 balance -> setStyleClass(
"negval" );
1111 if( splitItem-> reconcile_state() ==
"y" )
1133 post_date -> setFlags( Wt::ItemFlag::Editable );
1134 num -> setFlags( Wt::ItemFlag::Editable );
1135 description -> setFlags( Wt::ItemFlag::Editable );
1136 account -> setFlags( Wt::ItemFlag::Editable );
1137 reconcile -> setFlags( Wt::ItemFlag::Editable );
1138 debit -> setFlags( Wt::ItemFlag::Editable );
1139 credit -> setFlags( Wt::ItemFlag::Editable );
1140 balance -> setFlags( Wt::ItemFlag::Editable );
1147 appendRow( std::move( columns ) );
1156 auto _append2ndRow = [&]()
1167 _addColumn( columns,
"" );
1168 _addColumn( columns,
"" );
1169 auto memo = _addColumn( columns, splitItem-> memo() );
1170 _addColumn( columns,
"" );
1171 _addColumn( columns,
"" );
1172 _addColumn( columns,
"" );
1173 _addColumn( columns,
"" );
1174 _addColumn( columns,
"" );
1181 memo -> setFlags( Wt::ItemFlag::Editable );
1187 appendRow( std::move( columns ) );
1209 auto post_date = _addColumn( columns, m_lastDate );
1210 post_date-> setFlags( Wt::ItemFlag::Editable );
1212 _addColumn( columns,
"" )-> setFlags( Wt::ItemFlag::Editable );
1213 _addColumn( columns,
"" )-> setFlags( Wt::ItemFlag::Editable );
1214 _addColumn( columns,
"" )-> setFlags( Wt::ItemFlag::Editable );
1215 _addColumn( columns,
"n" )-> setFlags( Wt::ItemFlag::Editable );
1216 _addColumn( columns,
"" )-> setFlags( Wt::ItemFlag::Editable );
1217 _addColumn( columns,
"" )-> setFlags( Wt::ItemFlag::Editable );
1218 _addColumn( columns,
"" )-> setFlags( Wt::ItemFlag::Editable );
1219 appendRow( std::move( columns ) ) ;
1240 if( registerAccountItem )
1241 accountDef = registerAccountItem-> accountDef();
1248 setHeaderData( col++,
TR(
"gcw.AccountRegister.column.date" ) );
1249 setHeaderData( col++,
TR(
"gcw.AccountRegister.column.num" ) );
1250 setHeaderData( col++,
TR(
"gcw.AccountRegister.column.memo" ) );
1251 setHeaderData( col++,
TR(
"gcw.AccountRegister.column." + accountDef.
colAccount ) );
1252 setHeaderData( col++,
TR(
"gcw.AccountRegister.column.reconcile" ) );
1253 setHeaderData( col++,
TR(
"gcw.AccountRegister.column." + accountDef.
colDr ) );
1254 setHeaderData( col++,
TR(
"gcw.AccountRegister.column." + accountDef.
colCr ) );
1255 setHeaderData( col++,
TR(
"gcw.AccountRegister.column.balance" ) );
1261 layoutChanged().emit();
1283 std::set< std::string > retVal;
1284 for(
int row=0; row< rowCount(); row++ )
1285 retVal.insert(
Wt::asString( item( row, _column )-> text() ).toUTF8() );
auto setReconcile(const std::string &_value) -> void
auto setDate(const Wt::WDateTime &_value) -> void
auto newTransaction(const std::string &_accountGuid1, const std::string &_accountGuid2) -> void
New Transaction.
auto setValue(GCW_NUMERIC _value) -> void
auto loadSplit(const std::string &_splitGuid) -> void
Set Split.
auto setNotes(const std::string &_value) -> void
auto setAction(const std::string &_value) -> void
Set Action.
auto setTransferGuid(const std::string &_value) -> void
Set Transfer GUID.
auto thisSplit() const -> GCW::Dbo::Splits::Item::Ptr
auto setDescription(const std::string &_value) -> void
auto getCredit(const Wt::WModelIndex &_index) -> GCW_NUMERIC
Get Credit value.
auto getDescription(const Wt::WModelIndex &_index) -> std::string
Get Description.
AccountRegisterModel(const std::string &_accountGuid="", bool _editable=true)
ctor
auto makeRow(const std::string &_splitGuid) -> RowItem
auto getTransferText(const Wt::WModelIndex &_index) -> std::string
Get Transfer Account Text.
auto setAccountGuid(const std::string &_accountGuid) -> void
auto setDoubleLine(bool _doubleLine) -> void
auto getValue(const Wt::WModelIndex &_index) -> GCW_NUMERIC
Get Value (positive or negative)
auto suggestionsFromColumn(int _column) const -> std::set< std::string >
Column Suggestions.
auto setData(const Wt::WModelIndex &_index, const Wt::cpp17::any &_value, Wt::ItemDataRole _role) -> bool
auto setViewMode(ViewMode _viewMode) -> void
auto getReconcile(const Wt::WModelIndex &_index) -> std::string
Get Reconciliation.
auto getDate(const Wt::WModelIndex &_index) -> Wt::WDateTime
Get Date from the index.
auto getString(const Wt::WModelIndex &_index, int column) -> std::string
auto isDeletable(const Wt::WModelIndex &_index) -> bool
Is Read Only.
Wt::WStandardItem * ColItem
auto getSplitGuid(const Wt::WModelIndex &_index) -> std::string
Get GUID from row.
auto getTransferGuid(const Wt::WModelIndex &_index) -> std::string
Get Transfer Account GUID.
auto refreshFromDisk() -> void
Refresh From Disk.
auto isEditable(int _row) -> bool
std::vector< std::unique_ptr< Wt::WStandardItem > > RowItem
auto getAction(const Wt::WModelIndex &_index) -> std::string
Get Action.
auto saveToDisk() -> void
auto getDebit(const Wt::WModelIndex &_index) -> GCW_NUMERIC
Get Debit value.
auto getNumeric(const Wt::WModelIndex &_index) -> GCW_NUMERIC
Get numeric value.
#define GCW_DATE_DEFAULT_TIME
Default Time.
#define GCW_DATE_FORMAT_DISPLAY
#define GCW_NUMERIC
Internal Numeric Type.
std::string date_format()
Date Format Specifier.
DECIMAL::decimal_format decimal_format()
Decimal Format Specifier.
const Wt::WFormModel::Field name
const Wt::WFormModel::Field guid
const Wt::WFormModel::Field description
const std::vector< AccountDef_t > s_accountDefs
auto byFullName(const std::string &_fullName) -> Item::Ptr
Load Account by 'full name' with ':' account separator.
auto byGuid(const std::string &_guid) -> Item::Ptr
Load Account by GUID.
auto fullName(const std::string &_guid) -> std::string
Account Fullname via GUID.
@ INCOME_EXPENSE
income and expense account balances are reversed
@ CREDIT
credit account balances are reversed
@ NORMAL
normal handling - neg values are red
@ NEGVAL_EXTRA
extra handling - neg values are gold-background-full-line
auto get() -> GCW::Dbo::Prefrences::Item
auto bySplit(const std::string &_splitGuid) -> Item::Vector
Load Splits by Split.
auto byAccount(const std::string &_accountGuid) -> Item::Vector
Load Splits by Account.
std::string asString(Status _status)
Get Status as String.
auto toString(int _value) -> std::string
Convert Integer to String.
std::string colAccount
a printable 'label' for the 'account' column in the registers
std::string colDr
a printable 'label' for the 'debit' column in the registers
std::string colCr
a printable 'label' for the 'credit' column in the registers