1#line 2 "src/Eng/TransactionManager.cpp"
3#define INCLUDE_TOOL_TIP_ON_DESCRIPTION
5#include "../Glb/Core.h"
6#include "../Gui/AccountRegister/Model.h"
11: m_prefrenceItem(
GCW::Dbo::Prefrences::get() )
19 m_prefrenceItem(
GCW::Dbo::Prefrences::get() )
26newTransaction(
const std::string & _accountGuid1,
const std::string & _accountGuid2,
const Wt::WDate & _date,
GCW_NUMERIC _value,
const std::string & _description )->
void
29 std::cout << __FILE__ <<
":" << __LINE__
32 <<
"\n date: '" << _date.toString() <<
"'"
33 <<
"\n value: " << _value
34 <<
"\n desc: " << _description
53 m_transactionItem.modify()-> set_currency_guid( accountItem1-> commodity_guid() );
55 m_transactionItem.modify()-> set_post_date( _date );
56 m_transactionItem.modify()-> set_description( _description );
59 split1.modify()-> set_tx_guid ( m_transactionItem-> guid() );
60 split1.modify()-> set_account_guid ( _accountGuid1 );
63 split1.modify()-> set_value ( _value );
64 split1.modify()-> set_quantity ( _value );
67 split2.modify()-> set_tx_guid ( m_transactionItem-> guid() );
68 split2.modify()-> set_account_guid ( _accountGuid2 );
71 split2.modify()-> set_value ( -_value );
72 split2.modify()-> set_quantity ( -_value );
91 m_splits.push_back( split1 );
92 m_splits.push_back( split2 );
119 m_transactionItem.remove();
120 for(
auto & splitItem : m_splits )
134 loadSplit( _splitItem-> guid() );
140loadSplit(
const std::string & _splitGuid )->
void
142 if( _splitGuid ==
"" )
148 m_splitGuid = _splitGuid;
158 loadTransaction( splitItem-> tx_guid() );
166 for(
auto & splitItem : m_splits )
167 if( splitItem-> guid() != m_splitGuid )
168 return splitItem-> guid();
178 for(
auto & splitItem : m_splits )
179 if( splitItem-> guid() == _splitGuid )
190 return split( m_splitGuid );
198 return split( otherGuid() );
206 for(
auto split : m_splits )
208 if(
split-> value() < 0 )
220 for(
auto split : m_splits )
221 if(
split-> value() > 0 )
240 .
arg( _split-> guid() )
241 .
arg( _split-> account_guid() )
242 .
arg( _split-> tx_guid() )
262 .
arg( makeTip( fromSplit() ) )
268 return TR8(
"gcw.unassigned" );
281 .
arg( makeTip( toSplit() ) )
287 return TR8(
"gcw.unassigned" );
298 for(
auto &
split : m_splits )
299 if(
split-> account_guid() == _accountGuid )
310 return m_transactionItem-> post_date_as_date();
327 m_transactionItem.modify()-> set_post_date( _value );
336 m_transactionItem.modify()-> set_post_date(
Wt::WDateTime( _value ) );
344setAction(
const std::string & _value )->
void
347 m_transactionItem.modify()-> set_num( _value );
355 return m_transactionItem-> description();
364 m_transactionItem.modify()-> set_description( _value );
372 setDescription( _value.toUTF8() );
380 return m_transactionItem-> num();
386setNum(
const std::string & _value )->
void
389 m_transactionItem.modify()-> set_num( _value );
397 setNum( _value.toUTF8() );
406 thatSplit().modify()-> set_account_guid( _value );
415 thisSplit().modify()-> set_reconcile_state( _value );
423 return thisSplit()-> value();
431 return thisSplit()-> valueAsString();
440 thisSplit().modify()-> set_value( _value );
441 thatSplit().modify()-> set_value( _value * -1 );
450 forAccountSplit( _acctGuid ).modify()-> set_value( _value );
456setNotes(
const std::string & _acctGuid,
const std::string & _value )->
void
459 forAccountSplit( _acctGuid ).modify()-> set_memo( _value );
496createText(
const std::string & _text )
const-> std::unique_ptr< Wt::WStandardItem >
498 auto retVal = std::make_unique< Wt::WStandardItem >( _text );
500 retVal-> setStyleClass(
"blank" );
501 retVal-> setFlags( flags(
false ) );
503 return std::move( retVal );
511 auto retVal = std::make_unique< Wt::WStandardItem >(
"" );
513 retVal-> setStyleClass(
"blank" );
514 retVal-> setFlags( flags(
false ) );
516 return std::move( retVal );
524 auto retVal = std::make_unique< Wt::WStandardItem >(
"" );
526 retVal-> setStyleClass(
"empty" );
527 retVal-> setFlags( flags(
false ) );
529 return std::move( retVal );
535createDate(
const TxItem & _txItem,
bool _editable )
const-> std::unique_ptr< Wt::WStandardItem >
537 auto retVal = std::make_unique< Wt::WStandardItem >();
539 retVal-> setStyleClass(
"date" );
540 retVal-> setFlags( flags( _editable ) );
570 if( transactionItem() )
589 return std::move( retVal );
595createNum(
const TxItem & _txItem,
bool _editable )
const-> std::unique_ptr< Wt::WStandardItem >
597 auto retVal = std::make_unique< Wt::WStandardItem >(
"" );
598 retVal-> setStyleClass(
"txnum" );
599 retVal-> setFlags( flags( _editable ) );
605 retVal-> setText( _txItem-> num() );
609 return std::move( retVal );
616createNum(
const SpItem & _spItem,
bool _editable )
const-> std::unique_ptr< Wt::WStandardItem >
618 auto retVal = std::make_unique< Wt::WStandardItem >(
"" );
619 retVal-> setStyleClass(
"spnum" );
620 retVal-> setFlags( flags( _editable ) );
626 retVal-> setText( _spItem-> action() );
630 return std::move( retVal );
639 auto retVal = std::make_unique< Wt::WStandardItem >(
"" );
640 retVal-> setStyleClass(
"txdesc" );
641 retVal-> setFlags( flags( _editable ) );
650 retVal-> setText( _txItem -> description() );
652#ifdef INCLUDE_TOOL_TIP_ON_DESCRIPTION
659 if( thisSplit()-> memo() !=
"" )
660 toolTip = thisSplit()-> memo();
664 if( thatSplit()-> memo() !=
""
668 toolTip += thatSplit() -> memo();
674 retVal-> setToolTip( toolTip );
680 return std::move( retVal );
689 auto retVal = std::make_unique< Wt::WStandardItem >(
"" );
690 retVal-> setStyleClass(
"spdesc" );
691 retVal-> setFlags( flags( _editable ) );
695 retVal-> setText( _spItem-> memo() );
698 return std::move( retVal );
705createAccount(
const SpItem & _splitItem,
bool _editable )
const-> std::unique_ptr< Wt::WStandardItem >
707 auto retVal = std::make_unique< Wt::WStandardItem >(
"" );
708 retVal-> setStyleClass(
"acct" );
709 retVal-> setFlags( flags( _editable ) );
720 switch( otherSplits().size() )
732 retVal-> setText(
TR(
"gcw.AccountRegister.account.imbalanceUSD") );
733 retVal-> setStyleClass( retVal-> styleClass() +
" errval" );
734 retVal-> setToolTip(
TR(
"gcw.AccountRegister.account.imbalanceUSD.toolTip") );
746 auto txSplitItem = *otherSplits().begin();
750 if( splitAccountItem )
760 .
arg( splitAccountItem-> guid() )
761 .
arg( txSplitItem-> guid() )
763 retVal-> setToolTip( tip );
777 retVal-> setText(
TR(
"gcw.AccountRegister.account.imbalanceUSD") );
778 retVal-> setStyleClass( retVal-> styleClass() +
" errval" );
782 .
arg( txSplitItem-> account_guid() )
783 .
arg(
TR(
"gcw.AccountRegister.account.invalidTarget.toolTip") )
787 retVal-> setToolTip( toolTip );
804 retVal-> setText(
TR(
"gcw.AccountRegister.account.multisplit") );
810 return std::move( retVal );
817createAccount(
const SpItem & _splitItem,
bool _editable )
const-> std::unique_ptr< Wt::WStandardItem >
819 auto retVal = std::make_unique< Wt::WStandardItem >(
"" );
820 retVal-> setStyleClass(
"acct" );
821 retVal-> setFlags( flags( _editable ) );
828 if( splitAccountItem )
839 .
arg( splitAccountItem-> guid() )
840 .
arg( _splitItem-> guid() )
841 .
arg( _splitItem-> tx_guid() )
843 retVal-> setToolTip( tip );
857 retVal-> setText(
TR(
"gcw.AccountRegister.account.imbalanceUSD") );
858 retVal-> setStyleClass( retVal-> styleClass() +
" errval" );
862 .
arg( _splitItem-> account_guid() )
863 .
arg(
TR(
"gcw.AccountRegister.account.invalidTarget.toolTip") )
866 retVal-> setToolTip( toolTip );
872 return std::move( retVal );
878createReconcile(
const SpItem & _splitItem,
bool _editable )
const-> std::unique_ptr< Wt::WStandardItem >
880 auto retVal = std::make_unique< Wt::WStandardItem >(
"" );
881 retVal-> setStyleClass(
"rec" );
882 retVal-> setFlags( flags( _editable ) );
886 retVal-> setText( _splitItem-> reconcile_state() );
889 return std::move( retVal );
895createDebit(
const SpItem & _splitItem,
bool _editable )
const-> std::unique_ptr< Wt::WStandardItem >
897 auto retVal = std::make_unique< Wt::WStandardItem >(
"" );
898 retVal-> setStyleClass(
"dr" );
899 retVal-> setFlags( flags( _editable ) );
906 if( _splitItem-> value() > 0 )
908 retVal -> setText( _splitItem-> valueAsString() );
912 return std::move( retVal );
918createCredit(
const SpItem & _splitItem,
bool _editable )
const-> std::unique_ptr< Wt::WStandardItem >
920 auto retVal = std::make_unique< Wt::WStandardItem >(
"" );
921 retVal-> setStyleClass(
"cr" );
922 retVal-> setFlags( flags( _editable ) );
929 if( _splitItem-> value() < 0 )
934 retVal -> setText( _splitItem-> valueAsString(
true ) );
938 return std::move( retVal );
946 auto retVal = std::make_unique< Wt::WStandardItem >(
"" );
947 retVal-> setStyleClass(
"bal" );
948 retVal-> setFlags( flags(
false ) );
955 return std::move( retVal );
966 if( model()-> m_balance < 0 )
970 for(
int col = 0; col< _row.size(); col++ )
971 _row.at( col )-> setStyleClass( _row.at( col )-> styleClass() +
" negval" );
976 _row.at( _row.size()-1 )-> setStyleClass( _row.at( _row.size()-1 )-> styleClass() +
" negval" );
994 row.push_back( createDate ( transactionItem() , ed ) );
995 row.push_back( createNum ( transactionItem() , ed ) );
996 row.push_back( createDescription ( transactionItem() , ed ) );
997 row.push_back( createAccount ( thatSplit() , ed ) );
998 row.push_back( createReconcile ( thisSplit() , ed ) );
999 row.push_back( createDebit ( thisSplit() , ed ) );
1000 row.push_back( createCredit ( thisSplit() , ed ) );
1001 row.push_back( createBalance ( ) );
1003 highlightNegativeBalance( row );
1008 for(
int col=0; col< row.size(); col++ )
1009 row.at(col)-> setStyleClass( row.at(col)-> styleClass() +
" rowbl" );
1011 model()-> appendRow( std::move( row ) );
1031 row.push_back( createDate ( transactionItem(), _editable ) );
1032 row.push_back( createNum ( transactionItem(), _editable ) );
1033 row.push_back( createDescription ( transactionItem(), _editable ) );
1034 row.push_back( createEmpty ( ) );
1035 row.push_back( createEmpty ( ) );
1036 row.push_back( createDebit ( thisSplit() ,
false ) );
1037 row.push_back( createCredit ( thisSplit() ,
false ) );
1038 row.push_back( createBalance ( ) );
1040 highlightNegativeBalance( row );
1045 for(
int col=0; col< row.size(); col++ )
1046 row.at(col)-> setStyleClass( row.at(col)-> styleClass() +
" rowtj" );
1048 model()-> appendRow( std::move( row ) );
1054 for(
auto splitItem : splits() )
1058 row.push_back( createEmpty ( ) );
1059 row.push_back( createNum ( splitItem, ed ) );
1060 row.push_back( createDescription ( splitItem, ed ) );
1061 row.push_back( createAccount ( splitItem, ed ) );
1062 row.push_back( createReconcile ( splitItem, ed ) );
1063 row.push_back( createDebit ( splitItem, ed ) );
1064 row.push_back( createCredit ( splitItem, ed ) );
1065 row.push_back( createEmpty ( ) );
1067 for(
int col=0; col< row.size(); col++ )
1068 row.at(col)-> setStyleClass( row.at(col)-> styleClass() +
" rowtd" );
1070 model()-> appendRow( std::move( row ) );
1091 model()-> m_balance += thisSplit()-> value();
1096 switch( model()-> viewMode() )
1100 appendBasicLedger( _editable );
1106 appendAutosplitLedger( _editable );
1112 appendTransactionJournal( _editable );
1118 appendGeneralJournal( _editable );
1124 if( model()-> doubleLine() )
1127 row.push_back( createEmpty() );
1128 row.push_back( createEmpty() );
1129 row.push_back( createEmpty() );
1130 row.push_back( createEmpty() );
1131 row.push_back( createEmpty() );
1132 row.push_back( createEmpty() );
1133 row.push_back( createEmpty() );
1134 row.push_back( createEmpty() );
1136 for(
int col=0; col< row.size(); col++ )
1137 row.at(col)-> setStyleClass( row.at(col)-> styleClass() +
" rowte" );
1139 model()-> appendRow( std::move( row ) );
1153 appendRow( _editable );
1164 row.push_back( createEmpty() );
1165 row.push_back( createEmpty() );
1166 row.push_back( createEmpty() );
1167 row.push_back( createEmpty() );
1168 row.push_back( createEmpty() );
1169 row.push_back( createEmpty() );
1170 row.push_back( createEmpty() );
1171 row.push_back( createEmpty() );
1173 for(
int col=0; col< row.size(); col++ )
1174 row.at(col)-> setStyleClass( row.at(col)-> styleClass() +
" rowdl" );
1176 model()-> insertRow( _row, std::move( row ) );
static std::vector< std::string > & split(const std::string &s, char delim, std::vector< std::string > &elems)
auto createBalance() const -> std::unique_ptr< Wt::WStandardItem >
auto highlightNegativeBalance(RowItem &_row) const -> void
auto appendAutosplitLedger(bool _editable) const -> void
auto setTransferGuid(const std::string &_value) -> void
Set Transfer GUID.
auto deleteTransaction() -> bool
Delete Transaction.
auto insertDoubleLine(int _row) -> void
auto createAccount(const SpItem &_spItem, bool _editable) const -> std::unique_ptr< Wt::WStandardItem >
auto forAccountSplit(const std::string &_accountGuid) const -> GCW::Dbo::Splits::Item::Ptr
Load Split for Account.
auto setReconcile(const std::string &_value) -> void
auto getToAccount() const -> std::string
auto toSplit() const -> GCW::Dbo::Splits::Item::Ptr
auto getDateAsString() const -> Wt::WString
auto appendBasicLedger(bool _editable) const -> void
auto createDescription(const TxItem &_txItem, bool _editable) const -> std::unique_ptr< Wt::WStandardItem >
auto getDescription() const -> std::string
Set Description.
auto setSplitItem(GCW::Dbo::Splits::Item::Ptr _splitItem) -> void
auto thisSplit() const -> GCW::Dbo::Splits::Item::Ptr
auto getDate() const -> Wt::WDateTime
Set Date.
auto createBlank() const -> std::unique_ptr< Wt::WStandardItem >
auto setDescription(const std::string &_value) -> void
auto appendRow(bool _editable) -> void
auto createCredit(const SpItem &_spItem, bool _editable) const -> std::unique_ptr< Wt::WStandardItem >
auto getValue() const -> GCW_NUMERIC
auto getNum() const -> std::string
Set Num.
auto fromSplit() const -> GCW::Dbo::Splits::Item::Ptr
auto createReconcile(const SpItem &_spItem, bool _editable) const -> std::unique_ptr< Wt::WStandardItem >
GCW::Dbo::Splits::Item::Ptr SpItem
std::vector< std::unique_ptr< Wt::WStandardItem > > RowItem
auto otherGuid() const -> std::string
Other GUID.
auto setNum(const std::string &_value) -> void
auto setDate(const Wt::WDateTime &_value) -> void
auto loadSplit(const std::string &_splitGuid) -> void
Set Split.
auto split(const std::string &_splitGuid) const -> GCW::Dbo::Splits::Item::Ptr
auto setAction(const std::string &_value) -> void
Set Action.
auto setNotes(const std::string &_acctGuid, const std::string &_value) -> void
auto setReadOnly(bool _value) -> void
auto setValue(GCW_NUMERIC _value) -> void
auto appendGeneralJournal(bool _editable) const -> void
auto createDebit(const SpItem &_spItem, bool _editable) const -> std::unique_ptr< Wt::WStandardItem >
auto getValueAsString() const -> std::string
auto thatSplit() const -> GCW::Dbo::Splits::Item::Ptr
auto createDate(const TxItem &_txItem, bool _editable) const -> std::unique_ptr< Wt::WStandardItem >
auto otherSplits() const -> GCW::Dbo::Splits::Item::Vector
auto createEmpty() const -> std::unique_ptr< Wt::WStandardItem >
auto appendTransactionJournal(bool _editable) const -> void
auto createNum(const TxItem &_txItem, bool _editable) const -> std::unique_ptr< Wt::WStandardItem >
auto getFromAccount() const -> std::string
auto flags(bool _editable) const -> Wt::WFlags< Wt::ItemFlag >
auto createText(const std::string &_text) const -> std::unique_ptr< Wt::WStandardItem >
auto appendEmptyRow(bool _editable) -> void
auto loadTransaction(const std::string &_transactionGuid) -> void
Set Transaction.
auto newTransaction(const std::string &_accountGuid1, const std::string &_accountGuid2, const Wt::WDate &_date=Wt::WDate::currentDate(), GCW_NUMERIC _value=GCW_NUMERIC(0), const std::string &_description="") -> void
New Transaction.
static constexpr const int User
static constexpr const int Edit
static WDate currentDate()
std::string toUTF8() const
WString & arg(const std::wstring &value)
#define GCW_DATE_DEFAULT_TIME
Default Time.
#define GCW_DATE_FORMAT_DISPLAY
#define GCW_NUMERIC
Internal Numeric Type.
DECIMAL::decimal_format decimal_format()
Decimal Format Specifier.
auto newGuid() -> std::string
Generate new GUID string value.
auto load(const std::string &_guid) -> Item::Ptr
Load Account by GUID.
auto byGuid(const std::string &_guid) -> Item::Ptr
Load Account by GUID.
auto fullName(const std::string &_guid) -> std::string
Account Fullname via GUID.
@ NORMAL
normal handling - neg values are red
@ NEGVAL_EXTRA
extra handling - neg values are gold-background-full-line
auto byTransaction(const std::string &_txGuid) -> Item::Vector
Load Splits by Transaction.
auto add(const std::string &_splitGuid) -> Item::Ptr
Add a single split.
auto bySplitExcept(const std::string &_splitGuid) -> Item::Vector
Load Splits by Split.
auto load(const std::string &_splitGuid) -> Item::Ptr
Load a single split.
auto add(const std::string &_txGuid) -> Item::Ptr
Add Transaction with Guid.
auto load(const std::string &_txGuid) -> Item::Ptr
Load Transaction by Guid.
@ GENERAL_JOURNAL
multi-line ledger that shows all accounts and no balances
@ BASIC_LEDGER
basic one-line per transaction
@ AUTOSPLIT_LEDGER
one-line ledger that auto-opens to multi-line for each selected row
@ TRANSACTION_JOURNAL
multi-line ledger for every row