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_readOnly( _readOnly )
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() )
140 isReadOnly(
const Wt::WModelIndex & _index )->
bool
149 if( getSplitGuid( _index ) ==
"" )
157 transMan.
loadSplit( getSplitGuid( _index ) );
158 if( transMan.
thisSplit()-> isReconciled() )
175 return isReadOnly( index( _row, 0 ) );
188 getString(
const Wt::WModelIndex & _index,
int column )-> std::string
193 index( _index.row(), column )
194 .data( Wt::ItemDataRole::Display )
202 getDate(
const Wt::WModelIndex & _index )-> Wt::WDateTime
205 Wt::WDateTime::fromString
222 getAction(
const Wt::WModelIndex & _index )-> std::string
255 getReconcile(
const Wt::WModelIndex & _index )-> std::string
267 if( !_index.data( Wt::ItemDataRole::Display ).empty() )
279 getNumeric( index( _index.row(),
COL_DEBIT ) );
288 getNumeric( index( _index.row(),
COL_CREDIT ) );
299 auto debit = getDebit( _index );
300 auto credit = getCredit( _index );
301 retVal = debit - credit;
309 getSplitGuid(
const Wt::WModelIndex & _index )-> std::string
315 .data( Wt::ItemDataRole::User )
325 return getSplitGuid( index( _row,
COL_DATE ) );
331 saveToDisk(
const Wt::WModelIndex & _index )->
void
334 std::cout << __FILE__ <<
":" << __LINE__ <<
" " << __FUNCTION__ <<
"(): "
335 <<
"\n row:" << _index.row()
336 <<
"\n col:" << _index.column()
337 <<
"\n gui:" << getSplitGuid( _index )
354 auto splitGuid = getSplitGuid( _index );
355 if( splitGuid ==
"" )
361 transMan.
newTransaction( m_accountGuid, getTransferGuid( _index ) );
377 switch( _index.column() )
381 transMan.
setDate( getDate( _index ) );
387 transMan.
setAction( getAction( _index ) );
411 transMan.
setValue( getValue( _index ) );
417 transMan.
setValue( getValue( _index ) );
424 transMan.
setNotes( getNotes( _index ) );
435 setData(
const Wt::WModelIndex & _index,
const Wt::cpp17::any & _value, Wt::ItemDataRole _role )->
bool
441 if( _role != Wt::ItemDataRole::Edit )
454 auto _valuesMatch = [](
const Wt::cpp17::any & _any1,
const Wt::cpp17::any & _any2 )
460 if( _any1.type() == _any2.type() )
463 std::cout << __FILE__ <<
":" << __LINE__ <<
" " << __FUNCTION__
464 <<
"\n " <<
typeid(Wt::WString).
name()
465 <<
"\n " <<
typeid(Wt::WString).hash_code()
466 <<
"\n " << _any1.type().name()
467 <<
"\n " << _any1.type().hash_code()
471 if(
typeid(std::string) == _any1.type() )
473 auto v1 = Wt::cpp17::any_cast< std::string >( _any1 );
474 auto v2 = Wt::cpp17::any_cast< std::string >( _any2 );
479 if(
typeid(Wt::WString) == _any1.type() )
481 auto v1 = Wt::cpp17::any_cast< Wt::WString >( _any1 );
482 auto v2 = Wt::cpp17::any_cast< Wt::WString >( _any2 );
487 if(
typeid(
int) == _any1.type() )
489 auto v1 = Wt::cpp17::any_cast< int >( _any1 );
490 auto v2 = Wt::cpp17::any_cast< int >( _any2 );
496 std::cout << __FILE__ <<
":" << __LINE__ <<
" unhandled type" << std::endl;
513 if( !_valuesMatch( _index.data( _role ), _value ) )
517 <<
"\n row:" << _index.row()
518 <<
"\n col:" << _index.column()
527 retVal = Wt::WStandardItemModel::setData( _index, _value, _role );
529 saveToDisk( _index );
533 m_goneDirty.emit( _index );
566 if( m_accountGuid ==
"" )
573 layoutAboutToBeChanged().emit();
591 auto _addColumn = [&](
RowItem & columns,
auto _value )
593 auto item = std::make_unique< Wt::WStandardItem >( _value );
595 item-> setToolTip( _value );
597 auto retVal = item.get();
598 columns.push_back( std::move( item ) );
625 std::cout << __FILE__ <<
":" << __LINE__
626 <<
" guid:" << registerAccountItem->
guid()
627 <<
" name:" << registerAccountItem->
name()
628 <<
" dbcr:" <<
static_cast<int>( registerAccountItem-> accountDrCr() )
629 <<
" type:" <<
static_cast<int>( registerAccountItem-> accountType() )
630 <<
" typn:" << registerAccountItem-> accountTypeName()
662 for(
auto splitItem : splitItems )
668 bool readOnly =
true;
685 auto _append1stRow = [&]()
725 post_date-> setData( splitItem->
guid(), Wt::ItemDataRole::User );
726 post_date-> setData( splitItem , Wt::ItemDataRole::User + 1 );
736 .arg( m_accountGuid )
737 .arg( splitItem->
guid() )
739 post_date-> setToolTip( tip );
745 num = _addColumn( columns, transactionItem-> num() );
763 switch( transactionSplits.size() )
776 account = _addColumn( columns,
TR(
"gcw.AccountRegister.account.imbalanceUSD") );
777 account-> setStyleClass(
"errval" );
778 account-> setToolTip(
TR(
"gcw.AccountRegister.account.imbalanceUSD.toolTip") );
791 auto txSplitItem = *transactionSplits.begin();
795 if( splitAccountItem )
805 .arg( splitAccountItem->
guid() )
806 .arg( txSplitItem->
guid() )
808 account-> setToolTip( tip );
823 account = _addColumn( columns,
TR(
"gcw.AccountRegister.account.imbalanceUSD") );
824 account-> setStyleClass(
"errval" );
827 Wt::WString(
"target guid:{1}\n{2}")
828 .arg( txSplitItem-> account_guid() )
829 .arg(
TR(
"gcw.AccountRegister.account.invalidTarget.toolTip") )
833 account-> setToolTip( toolTip );
851 account = _addColumn( columns,
TR(
"gcw.AccountRegister.account.multisplit") );
860 reconcile = _addColumn( columns, splitItem-> reconcile_state() );
993 switch( prefrenceItem.reverseBalanceAccounts() )
998 if( registerAccountItem-> accountType() == GCW::Dbo::Account::Type::INCOME
999 || registerAccountItem-> accountType() == GCW::Dbo::Account::Type::EXPENSE
1011 if( registerAccountItem-> accountDrCr() == GCW::Dbo::Account::DrCr::CREDIT )
1025 runningBalance += splitItem-> value( invert );
1031 m_present += splitItem-> value( invert );
1040 if( splitItem-> value() > 0 )
1042 debit = _addColumn( columns, splitItem-> valueAsString() );
1043 credit = _addColumn( columns,
"" );
1046 debit -> setData( splitItem-> value(), Wt::ItemDataRole::User );
1047 credit-> setData(
GCW_NUMERIC(0) , Wt::ItemDataRole::User );
1057 if( splitItem-> value() < 0 )
1059 debit = _addColumn( columns,
"" );
1060 credit = _addColumn( columns, splitItem-> valueAsString(
true) );
1062 debit -> setData(
GCW_NUMERIC(0) , Wt::ItemDataRole::User );
1063 credit-> setData( splitItem-> value(), Wt::ItemDataRole::User );
1070 if( splitItem-> value() == 0 )
1072 debit = _addColumn( columns,
"" );
1073 credit = _addColumn( columns,
"" );
1075 debit -> setData(
GCW_NUMERIC(0), Wt::ItemDataRole::User );
1076 credit-> setData(
GCW_NUMERIC(0), Wt::ItemDataRole::User );
1087 Wt::WString(
"{1}" )
1090 balance-> setData( runningBalance, Wt::ItemDataRole::User );
1097 if( runningBalance < 0 )
1101 post_date -> setStyleClass(
"negval" );
1102 num -> setStyleClass(
"negval" );
1104 account -> setStyleClass(
"negval" );
1105 reconcile -> setStyleClass(
"negval" );
1106 debit -> setStyleClass(
"negval" );
1107 credit -> setStyleClass(
"negval" );
1112 balance -> setStyleClass(
"negval" );
1144 post_date -> setFlags( readOnly? Wt::ItemFlag::Selectable : Wt::ItemFlag::Editable );
1145 num -> setFlags( readOnly? Wt::ItemFlag::Selectable : Wt::ItemFlag::Editable );
1146 description -> setFlags( readOnly? Wt::ItemFlag::Selectable : Wt::ItemFlag::Editable );
1147 account -> setFlags( readOnly? Wt::ItemFlag::Selectable : Wt::ItemFlag::Editable );
1148 reconcile -> setFlags( readOnly? Wt::ItemFlag::Selectable : Wt::ItemFlag::Editable );
1149 debit -> setFlags( readOnly? Wt::ItemFlag::Selectable : Wt::ItemFlag::Editable );
1150 credit -> setFlags( readOnly? Wt::ItemFlag::Selectable : Wt::ItemFlag::Editable );
1151 balance -> setFlags( readOnly? Wt::ItemFlag::Selectable : Wt::ItemFlag::Editable );
1157 appendRow( std::move( columns ) );
1166 auto _append2ndRow = [&]()
1177 _addColumn( columns,
"" );
1178 _addColumn( columns,
"" );
1179 auto memo = _addColumn( columns, splitItem-> memo() );
1180 _addColumn( columns,
"" );
1181 _addColumn( columns,
"" );
1182 _addColumn( columns,
"" );
1183 _addColumn( columns,
"" );
1184 _addColumn( columns,
"" );
1191 memo -> setFlags( Wt::ItemFlag::Editable );
1197 appendRow( std::move( columns ) );
1219 auto post_date = _addColumn( columns, m_lastDate );
1220 post_date-> setFlags( Wt::ItemFlag::Editable );
1222 _addColumn( columns,
"" )-> setFlags( Wt::ItemFlag::Editable );
1223 _addColumn( columns,
"" )-> setFlags( Wt::ItemFlag::Editable );
1224 _addColumn( columns,
"" )-> setFlags( Wt::ItemFlag::Editable );
1225 _addColumn( columns,
"n" )-> setFlags( Wt::ItemFlag::Editable );
1226 _addColumn( columns,
"" )-> setFlags( Wt::ItemFlag::Editable );
1227 _addColumn( columns,
"" )-> setFlags( Wt::ItemFlag::Editable );
1228 _addColumn( columns,
"" )-> setFlags( Wt::ItemFlag::Editable );
1229 appendRow( std::move( columns ) ) ;
1250 if( registerAccountItem )
1251 accountDef = registerAccountItem-> accountDef();
1258 setHeaderData( col++,
TR(
"gcw.AccountRegister.column.date" ) );
1259 setHeaderData( col++,
TR(
"gcw.AccountRegister.column.num" ) );
1260 setHeaderData( col++,
TR(
"gcw.AccountRegister.column.memo" ) );
1261 setHeaderData( col++,
TR(
"gcw.AccountRegister.column." + accountDef.
colAccount ) );
1262 setHeaderData( col++,
TR(
"gcw.AccountRegister.column.reconcile" ) );
1263 setHeaderData( col++,
TR(
"gcw.AccountRegister.column." + accountDef.
colDr ) );
1264 setHeaderData( col++,
TR(
"gcw.AccountRegister.column." + accountDef.
colCr ) );
1265 setHeaderData( col++,
TR(
"gcw.AccountRegister.column.balance" ) );
1271 layoutChanged().emit();
1293 std::set< std::string > retVal;
1294 for(
int row=0; row< rowCount(); row++ )
1295 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.
AccountRegisterModel(const std::string &_accountGuid="", bool _readOnly=false)
ctor
auto getDescription(const Wt::WModelIndex &_index) -> std::string
Get Description.
auto makeRow(const std::string &_splitGuid) -> RowItem
auto getTransferText(const Wt::WModelIndex &_index) -> std::string
Get Transfer Account Text.
auto isReadOnly() -> bool
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.
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_RECONCILE_YES
#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