1#line 2 "src/Eng/TransactionManager.cpp"
3#include "../Glb/Core.h"
4#include "../Gui/AccountRegister/Model.h"
9: m_prefrenceItem(
GCW::Dbo::Prefrences::get() )
17 m_prefrenceItem(
GCW::Dbo::Prefrences::get() )
24newTransaction(
const std::string & _accountGuid1,
const std::string & _accountGuid2,
const Wt::WDate & _date,
GCW_NUMERIC _value,
const std::string & _description )->
void
26 std::cout << __FILE__ <<
":" << __LINE__
27 <<
"\n acct1: " << _accountGuid1
28 <<
"\n acct2: " << _accountGuid2
29 <<
"\n date: '" << _date.toString() <<
"'"
30 <<
"\n value: " << _value
31 <<
"\n desc: " << _description
49 m_transactionItem.modify()-> set_currency_guid( accountItem1-> commodity_guid() );
51 m_transactionItem.modify()-> set_post_date( _date );
52 m_transactionItem.modify()-> set_description( _description );
55 split1.modify()-> set_tx_guid ( m_transactionItem-> guid() );
56 split1.modify()-> set_account_guid ( _accountGuid1 );
59 split1.modify()-> set_value ( _value );
60 split1.modify()-> set_quantity ( _value );
63 split2.modify()-> set_tx_guid ( m_transactionItem-> guid() );
64 split2.modify()-> set_account_guid ( _accountGuid2 );
67 split2.modify()-> set_value ( -_value );
68 split2.modify()-> set_quantity ( -_value );
87 m_splits.push_back( split1 );
88 m_splits.push_back( split2 );
115 m_transactionItem.remove();
116 for(
auto & splitItem : m_splits )
130 loadSplit( _splitItem-> guid() );
136loadSplit(
const std::string & _splitGuid )->
void
138 if( _splitGuid ==
"" )
144 m_splitGuid = _splitGuid;
154 loadTransaction( splitItem-> tx_guid() );
162 for(
auto & splitItem : m_splits )
163 if( splitItem-> guid() != m_splitGuid )
164 return splitItem-> guid();
174 for(
auto & splitItem : m_splits )
175 if( splitItem-> guid() == _splitGuid )
186 return split( m_splitGuid );
194 return split( otherGuid() );
202 for(
auto split : m_splits )
204 if(
split-> value() < 0 )
216 for(
auto split : m_splits )
217 if(
split-> value() > 0 )
231 return TR8(
"gcw.unassigned" );
242 return TR8(
"gcw.unassigned" );
253 for(
auto &
split : m_splits )
254 if(
split-> account_guid() == _accountGuid )
265 return m_transactionItem-> post_date_as_date();
282 m_transactionItem.modify()-> set_post_date( _value );
291 m_transactionItem.modify()-> set_post_date(
Wt::WDateTime( _value ) );
299setAction(
const std::string & _value )->
void
302 m_transactionItem.modify()-> set_num( _value );
310 return m_transactionItem-> description();
319 m_transactionItem.modify()-> set_description( _value );
327 setDescription( _value.toUTF8() );
335 return m_transactionItem-> num();
341setNum(
const std::string & _value )->
void
344 m_transactionItem.modify()-> set_num( _value );
352 setNum( _value.toUTF8() );
361 thatSplit().modify()-> set_account_guid( _value );
370 thisSplit().modify()-> set_reconcile_state( _value );
378 return thisSplit()-> value();
386 return thisSplit()-> valueAsString();
405 forAccountSplit( _acctGuid ).modify()-> set_value( _value );
411setNotes(
const std::string & _acctGuid,
const std::string & _value )->
void
414 forAccountSplit( _acctGuid ).modify()-> set_memo( _value );
451createText(
const std::string & _text )
const-> std::unique_ptr< Wt::WStandardItem >
453 auto retVal = std::make_unique< Wt::WStandardItem >( _text );
455 retVal-> setStyleClass(
"blank" );
456 retVal-> setFlags( flags(
false ) );
458 return std::move( retVal );
466 auto retVal = std::make_unique< Wt::WStandardItem >(
"" );
468 retVal-> setStyleClass(
"blank" );
469 retVal-> setFlags( flags(
false ) );
471 return std::move( retVal );
479 auto retVal = std::make_unique< Wt::WStandardItem >(
"" );
481 retVal-> setStyleClass(
"empty" );
482 retVal-> setFlags( flags(
false ) );
484 return std::move( retVal );
490createDate(
const TxItem & _txItem,
bool _editable )
const-> std::unique_ptr< Wt::WStandardItem >
492 auto retVal = std::make_unique< Wt::WStandardItem >();
494 retVal-> setStyleClass(
"date" );
495 retVal-> setFlags( flags( _editable ) );
525 if( transactionItem() )
544 return std::move( retVal );
550createNum(
const TxItem & _txItem,
bool _editable )
const-> std::unique_ptr< Wt::WStandardItem >
552 auto retVal = std::make_unique< Wt::WStandardItem >(
"" );
553 retVal-> setStyleClass(
"txnum" );
554 retVal-> setFlags( flags( _editable ) );
560 retVal-> setText( _txItem-> num() );
564 return std::move( retVal );
571createNum(
const SpItem & _spItem,
bool _editable )
const-> std::unique_ptr< Wt::WStandardItem >
573 auto retVal = std::make_unique< Wt::WStandardItem >(
"" );
574 retVal-> setStyleClass(
"spnum" );
575 retVal-> setFlags( flags( _editable ) );
581 retVal-> setText( _spItem-> action() );
585 return std::move( retVal );
594 auto retVal = std::make_unique< Wt::WStandardItem >(
"" );
595 retVal-> setStyleClass(
"txdesc" );
596 retVal-> setFlags( flags( _editable ) );
602 retVal-> setText( _txItem-> description() );
606 return std::move( retVal );
615 auto retVal = std::make_unique< Wt::WStandardItem >(
"" );
616 retVal-> setStyleClass(
"spdesc" );
617 retVal-> setFlags( flags( _editable ) );
621 retVal-> setText( _spItem-> memo() );
624 return std::move( retVal );
631createAccount(
const SpItem & _splitItem,
bool _editable )
const-> std::unique_ptr< Wt::WStandardItem >
633 auto retVal = std::make_unique< Wt::WStandardItem >(
"" );
634 retVal-> setStyleClass(
"acct" );
635 retVal-> setFlags( flags( _editable ) );
646 switch( otherSplits().size() )
658 retVal-> setText(
TR(
"gcw.AccountRegister.account.imbalanceUSD") );
659 retVal-> setStyleClass( retVal-> styleClass() +
" errval" );
660 retVal-> setToolTip(
TR(
"gcw.AccountRegister.account.imbalanceUSD.toolTip") );
672 auto txSplitItem = *otherSplits().begin();
676 if( splitAccountItem )
686 .
arg( splitAccountItem-> guid() )
687 .
arg( txSplitItem-> guid() )
689 retVal-> setToolTip( tip );
703 retVal-> setText(
TR(
"gcw.AccountRegister.account.imbalanceUSD") );
704 retVal-> setStyleClass( retVal-> styleClass() +
" errval" );
708 .
arg( txSplitItem-> account_guid() )
709 .
arg(
TR(
"gcw.AccountRegister.account.invalidTarget.toolTip") )
713 retVal-> setToolTip( toolTip );
730 retVal-> setText(
TR(
"gcw.AccountRegister.account.multisplit") );
736 return std::move( retVal );
743createAccount(
const SpItem & _splitItem,
bool _editable )
const-> std::unique_ptr< Wt::WStandardItem >
745 auto retVal = std::make_unique< Wt::WStandardItem >(
"" );
746 retVal-> setStyleClass(
"acct" );
747 retVal-> setFlags( flags( _editable ) );
754 if( splitAccountItem )
764 .
arg( splitAccountItem-> guid() )
765 .
arg( _splitItem-> guid() )
767 retVal-> setToolTip( tip );
781 retVal-> setText(
TR(
"gcw.AccountRegister.account.imbalanceUSD") );
782 retVal-> setStyleClass( retVal-> styleClass() +
" errval" );
786 .
arg( _splitItem-> account_guid() )
787 .
arg(
TR(
"gcw.AccountRegister.account.invalidTarget.toolTip") )
790 retVal-> setToolTip( toolTip );
796 return std::move( retVal );
802createReconcile(
const SpItem & _splitItem,
bool _editable )
const-> std::unique_ptr< Wt::WStandardItem >
804 auto retVal = std::make_unique< Wt::WStandardItem >(
"" );
805 retVal-> setStyleClass(
"rec" );
806 retVal-> setFlags( flags( _editable ) );
810 retVal-> setText( _splitItem-> reconcile_state() );
813 return std::move( retVal );
819createDebit(
const SpItem & _splitItem,
bool _editable )
const-> std::unique_ptr< Wt::WStandardItem >
821 auto retVal = std::make_unique< Wt::WStandardItem >(
"" );
822 retVal-> setStyleClass(
"dr" );
823 retVal-> setFlags( flags( _editable ) );
830 if( _splitItem-> value() > 0 )
832 retVal -> setText( _splitItem-> valueAsString() );
836 return std::move( retVal );
842createCredit(
const SpItem & _splitItem,
bool _editable )
const-> std::unique_ptr< Wt::WStandardItem >
844 auto retVal = std::make_unique< Wt::WStandardItem >(
"" );
845 retVal-> setStyleClass(
"cr" );
846 retVal-> setFlags( flags( _editable ) );
853 if( _splitItem-> value() < 0 )
858 retVal -> setText( _splitItem-> valueAsString(
true ) );
862 return std::move( retVal );
870 auto retVal = std::make_unique< Wt::WStandardItem >(
"" );
871 retVal-> setStyleClass(
"bal" );
872 retVal-> setFlags( flags(
false ) );
879 return std::move( retVal );
890 if( model()-> m_balance < 0 )
894 for(
int col = 0; col< _row.size(); col++ )
895 _row.at( col )-> setStyleClass( _row.at( col )-> styleClass() +
" negval" );
900 _row.at( _row.size()-1 )-> setStyleClass( _row.at( _row.size()-1 )-> styleClass() +
" negval" );
918 row.push_back( createDate ( transactionItem() , ed ) );
919 row.push_back( createNum ( transactionItem() , ed ) );
920 row.push_back( createDescription ( transactionItem() , ed ) );
921 row.push_back( createAccount ( thatSplit() , ed ) );
922 row.push_back( createReconcile ( thisSplit() , ed ) );
923 row.push_back( createDebit ( thisSplit() , ed ) );
924 row.push_back( createCredit ( thisSplit() , ed ) );
925 row.push_back( createBalance ( ) );
927 highlightNegativeBalance( row );
932 for(
int col=0; col< row.size(); col++ )
933 row.at(col)-> setStyleClass( row.at(col)-> styleClass() +
" rowbl" );
935 model()-> appendRow( std::move( row ) );
955 row.push_back( createDate ( transactionItem(), _editable ) );
956 row.push_back( createNum ( transactionItem(), _editable ) );
957 row.push_back( createDescription ( transactionItem(), _editable ) );
958 row.push_back( createEmpty ( ) );
959 row.push_back( createEmpty ( ) );
960 row.push_back( createDebit ( thisSplit() ,
false ) );
961 row.push_back( createCredit ( thisSplit() ,
false ) );
962 row.push_back( createBalance ( ) );
964 highlightNegativeBalance( row );
969 for(
int col=0; col< row.size(); col++ )
970 row.at(col)-> setStyleClass( row.at(col)-> styleClass() +
" rowtj" );
972 model()-> appendRow( std::move( row ) );
978 for(
auto splitItem : splits() )
982 row.push_back( createEmpty ( ) );
983 row.push_back( createNum ( splitItem, ed ) );
984 row.push_back( createDescription ( splitItem, ed ) );
985 row.push_back( createAccount ( splitItem, ed ) );
986 row.push_back( createReconcile ( splitItem, ed ) );
987 row.push_back( createDebit ( splitItem, ed ) );
988 row.push_back( createCredit ( splitItem, ed ) );
989 row.push_back( createEmpty ( ) );
991 for(
int col=0; col< row.size(); col++ )
992 row.at(col)-> setStyleClass( row.at(col)-> styleClass() +
" rowtd" );
994 model()-> appendRow( std::move( row ) );
1015 model()-> m_balance += thisSplit()-> value();
1020 switch( model()-> viewMode() )
1024 appendBasicLedger( _editable );
1030 appendAutosplitLedger( _editable );
1036 appendTransactionJournal( _editable );
1042 appendGeneralJournal( _editable );
1048 if( model()-> doubleLine() )
1051 row.push_back( createEmpty() );
1052 row.push_back( createEmpty() );
1053 row.push_back( createEmpty() );
1054 row.push_back( createEmpty() );
1055 row.push_back( createEmpty() );
1056 row.push_back( createEmpty() );
1057 row.push_back( createEmpty() );
1058 row.push_back( createEmpty() );
1060 for(
int col=0; col< row.size(); col++ )
1061 row.at(col)-> setStyleClass( row.at(col)-> styleClass() +
" rowte" );
1063 model()-> appendRow( std::move( row ) );
1077 appendRow( _editable );
1088 row.push_back( createEmpty() );
1089 row.push_back( createEmpty() );
1090 row.push_back( createEmpty() );
1091 row.push_back( createEmpty() );
1092 row.push_back( createEmpty() );
1093 row.push_back( createEmpty() );
1094 row.push_back( createEmpty() );
1095 row.push_back( createEmpty() );
1097 for(
int col=0; col< row.size(); col++ )
1098 row.at(col)-> setStyleClass( row.at(col)-> styleClass() +
" rowdl" );
1100 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