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 )->
void
41 m_transactionItem.modify()-> set_currency_guid( accountItem1-> commodity_guid() );
45 split1.modify()-> set_tx_guid ( m_transactionItem-> guid() );
46 split1.modify()-> set_account_guid ( _accountGuid1 );
51 split2.modify()-> set_tx_guid ( m_transactionItem-> guid() );
52 split2.modify()-> set_account_guid ( _accountGuid2 );
59 m_splits.push_back( split1 );
60 m_splits.push_back( split2 );
86 m_transactionItem.remove();
87 for(
auto & splitItem : m_splits )
99 loadSplit( _splitItem-> guid() );
105loadSplit(
const std::string & _splitGuid )->
void
107 if( _splitGuid ==
"" )
113 m_splitGuid = _splitGuid;
123 loadTransaction( splitItem-> tx_guid() );
131 for(
auto & splitItem : m_splits )
132 if( splitItem-> guid() != m_splitGuid )
133 return splitItem-> guid();
143 for(
auto & splitItem : m_splits )
144 if( splitItem-> guid() == _splitGuid )
155 return split( m_splitGuid );
163 return split( otherGuid() );
173 for(
auto &
split : m_splits )
174 if(
split-> account_guid() == _accountGuid )
185 return m_transactionItem-> post_date_as_date();
202 m_transactionItem.modify()-> set_post_date( _value );
211 m_transactionItem.modify()-> set_post_date(
Wt::WDateTime( _value ) );
219setAction(
const std::string & _value )->
void
222 m_transactionItem.modify()-> set_num( _value );
230 return m_transactionItem-> description();
239 m_transactionItem.modify()-> set_description( _value );
247 setDescription( _value.toUTF8() );
255 return m_transactionItem-> num();
261setNum(
const std::string & _value )->
void
264 m_transactionItem.modify()-> set_num( _value );
272 setNum( _value.toUTF8() );
281 thatSplit().modify()-> set_account_guid( _value );
290 thisSplit().modify()-> set_reconcile_state( _value );
298 return thisSplit()-> value();
306 return thisSplit()-> valueAsString();
325 forAccountSplit( _acctGuid ).modify()-> set_value( _value );
331setNotes(
const std::string & _acctGuid,
const std::string & _value )->
void
334 forAccountSplit( _acctGuid ).modify()-> set_memo( _value );
356createText(
const std::string & _text )
const-> std::unique_ptr< Wt::WStandardItem >
358 auto retVal = std::make_unique< Wt::WStandardItem >( _text );
360 retVal-> setStyleClass(
"blank" );
362 return std::move( retVal );
370 auto retVal = std::make_unique< Wt::WStandardItem >();
372 retVal-> setStyleClass(
"blank" );
374 return std::move( retVal );
382 auto retVal = std::make_unique< Wt::WStandardItem >();
384 retVal-> setStyleClass(
"empty" );
386 return std::move( retVal );
394 auto retVal = std::make_unique< Wt::WStandardItem >();
396 retVal-> setStyleClass(
"date" );
426 return std::move( retVal );
432createNum(
TxItem _txItem )
const-> std::unique_ptr< Wt::WStandardItem >
434 auto retVal = std::make_unique< Wt::WStandardItem >( _txItem-> num() );
436 retVal-> setStyleClass(
"txnum" );
439 return std::move( retVal );
446createNum(
SpItem _spItem )
const-> std::unique_ptr< Wt::WStandardItem >
448 auto retVal = std::make_unique< Wt::WStandardItem >( _spItem-> action() );
450 retVal-> setStyleClass(
"spnum" );
453 return std::move( retVal );
462 auto retVal = std::make_unique< Wt::WStandardItem >( _txItem-> description() );
464 retVal-> setStyleClass(
"txdesc" );
467 return std::move( retVal );
476 auto retVal = std::make_unique< Wt::WStandardItem >( _spItem-> memo() );
478 retVal-> setStyleClass(
"spdesc" );
481 return std::move( retVal );
488createAccount( SpItem _splitItem )
const-> std::unique_ptr< Wt::WStandardItem >
490 auto retVal = std::make_unique< Wt::WStandardItem >();
491 retVal-> setStyleClass(
"acct" );
503 switch( otherSplits().size() )
515 retVal-> setText(
TR(
"gcw.AccountRegister.account.imbalanceUSD") );
516 retVal-> setStyleClass( retVal-> styleClass() +
" errval" );
517 retVal-> setToolTip(
TR(
"gcw.AccountRegister.account.imbalanceUSD.toolTip") );
529 auto txSplitItem = *otherSplits().begin();
533 if( splitAccountItem )
543 .
arg( splitAccountItem-> guid() )
544 .
arg( txSplitItem-> guid() )
546 retVal-> setToolTip( tip );
560 retVal-> setText(
TR(
"gcw.AccountRegister.account.imbalanceUSD") );
561 retVal-> setStyleClass( retVal-> styleClass() +
" errval" );
565 .
arg( txSplitItem-> account_guid() )
566 .
arg(
TR(
"gcw.AccountRegister.account.invalidTarget.toolTip") )
570 retVal-> setToolTip( toolTip );
587 retVal-> setText(
TR(
"gcw.AccountRegister.account.multisplit") );
593 return std::move( retVal );
602 auto retVal = std::make_unique< Wt::WStandardItem >();
603 retVal-> setStyleClass(
"acct" );
609 if( splitAccountItem )
619 .
arg( splitAccountItem-> guid() )
620 .
arg( _splitItem-> guid() )
622 retVal-> setToolTip( tip );
636 retVal-> setText(
TR(
"gcw.AccountRegister.account.imbalanceUSD") );
637 retVal-> setStyleClass( retVal-> styleClass() +
" errval" );
641 .
arg( _splitItem-> account_guid() )
642 .
arg(
TR(
"gcw.AccountRegister.account.invalidTarget.toolTip") )
645 retVal-> setToolTip( toolTip );
649 return std::move( retVal );
657 auto retVal = std::make_unique< Wt::WStandardItem >( _splitItem-> reconcile_state() );
659 retVal-> setStyleClass(
"rec" );
662 return std::move( retVal );
670 auto retVal = std::make_unique< Wt::WStandardItem >( );
672 retVal-> setStyleClass(
"dr" );
678 if( _splitItem-> value() > 0 )
680 retVal -> setText( _splitItem-> valueAsString() );
683 return std::move( retVal );
691 auto retVal = std::make_unique< Wt::WStandardItem >( );
693 retVal-> setStyleClass(
"cr" );
699 if( _splitItem-> value() < 0 )
704 retVal -> setText( _splitItem-> valueAsString(
true ) );
707 return std::move( retVal );
717 retVal-> setStyleClass(
"bal" );
720 return std::move( retVal );
731 if( model()-> m_balance < 0 )
735 for(
int col = 0; col< _row.size(); col++ )
736 _row.at( col )-> setStyleClass( _row.at( col )-> styleClass() +
" negval" );
741 _row.at( _row.size()-1 )-> setStyleClass( _row.at( _row.size()-1 )-> styleClass() +
" negval" );
755 row.push_back( createDate ( transactionItem() ) );
756 row.push_back( createNum ( transactionItem() ) );
757 row.push_back( createDescription ( transactionItem() ) );
758 row.push_back( createAccount ( thatSplit() ) );
759 row.push_back( createReconcile ( thisSplit() ) );
760 row.push_back( createDebit ( thisSplit() ) );
761 row.push_back( createCredit ( thisSplit() ) );
762 row.push_back( createBalance ( ) );
764 highlightNegativeBalance( row );
769 for(
int col=0; col< row.size(); col++ )
770 row.at(col)-> setStyleClass( row.at(col)-> styleClass() +
" rowbl" );
772 model()-> appendRow( std::move( row ) );
792 row.push_back( createDate ( transactionItem() ) );
793 row.push_back( createNum ( transactionItem() ) );
794 row.push_back( createDescription ( transactionItem() ) );
795 row.push_back( createEmpty ( ) );
796 row.push_back( createEmpty ( ) );
797 row.push_back( createDebit ( thisSplit() ) );
798 row.push_back( createCredit ( thisSplit() ) );
799 row.push_back( createBalance ( ) );
801 highlightNegativeBalance( row );
806 for(
int col=0; col< row.size(); col++ )
807 row.at(col)-> setStyleClass( row.at(col)-> styleClass() +
" rowtj" );
809 model()-> appendRow( std::move( row ) );
815 for(
auto splitItem : splits() )
818 row.push_back( createEmpty ( ) );
819 row.push_back( createNum ( splitItem ) );
820 row.push_back( createDescription ( splitItem ) );
821 row.push_back( createAccount ( splitItem ) );
822 row.push_back( createReconcile ( splitItem ) );
823 row.push_back( createDebit ( splitItem ) );
824 row.push_back( createCredit ( splitItem ) );
825 row.push_back( createEmpty ( ) );
827 for(
int col=1; col< row.size(); col++ )
828 row.at(col)-> setStyleClass( row.at(col)-> styleClass() +
" rowtd" );
830 model()-> appendRow( std::move( row ) );
833 if( model()-> doubleLine() )
836 row.push_back( createEmpty() );
837 row.push_back( createEmpty() );
838 row.push_back( createEmpty() );
839 row.push_back( createEmpty() );
840 row.push_back( createEmpty() );
841 row.push_back( createEmpty() );
842 row.push_back( createEmpty() );
843 row.push_back( createEmpty() );
845 model()-> appendRow( std::move( row ) );
865 model()-> m_balance += thisSplit()-> value();
870 switch( model()-> viewMode() )
880 appendAutosplitLedger();
886 appendTransactionJournal();
892 appendGeneralJournal();
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 createCredit(SpItem _spItem) const -> std::unique_ptr< Wt::WStandardItem >
auto setTransferGuid(const std::string &_value) -> void
Set Transfer GUID.
auto newTransaction(const std::string &_accountGuid1, const std::string &_accountGuid2) -> void
New Transaction.
auto createReconcile(SpItem _spItem) 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 getDateAsString() const -> Wt::WString
auto getDescription() const -> std::string
Set Description.
auto setSplitItem(GCW::Dbo::Splits::Item::Ptr _splitItem) -> void
auto createDescription(TxItem _txItem) const -> std::unique_ptr< Wt::WStandardItem >
auto thisSplit() const -> GCW::Dbo::Splits::Item::Ptr
auto getDate() const -> Wt::WDateTime
Set Date.
auto appendAutosplitLedger() const -> void
auto createDebit(SpItem _spItem) const -> std::unique_ptr< Wt::WStandardItem >
auto createBlank() const -> std::unique_ptr< Wt::WStandardItem >
auto setDescription(const std::string &_value) -> void
auto deleteTransaction() -> void
Delete Transaction.
auto getValue() const -> GCW_NUMERIC
auto appendTransactionJournal() const -> void
auto getNum() const -> std::string
Set Num.
GCW::Dbo::Splits::Item::Ptr SpItem
auto createNum(TxItem _txItem) const -> std::unique_ptr< Wt::WStandardItem >
std::vector< std::unique_ptr< Wt::WStandardItem > > RowItem
auto otherGuid() const -> std::string
Other GUID.
auto createAccount(SpItem _spItem) const -> std::unique_ptr< Wt::WStandardItem >
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 appendBasicLedger() const -> void
auto createDate(TxItem _txItem) const -> std::unique_ptr< Wt::WStandardItem >
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() const -> void
auto getValueAsString() const -> std::string
auto thatSplit() const -> GCW::Dbo::Splits::Item::Ptr
auto otherSplits() const -> GCW::Dbo::Splits::Item::Vector
auto createEmpty() const -> std::unique_ptr< Wt::WStandardItem >
auto createText(const std::string &_text) const -> std::unique_ptr< Wt::WStandardItem >
auto loadTransaction(const std::string &_transactionGuid) -> void
Set Transaction.
static constexpr const int User
static constexpr const int Edit
static WDateTime currentDateTime()
std::string toUTF8() const
WString & arg(const std::wstring &value)
#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
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