GnuCash 038f90a+
Loading...
Searching...
No Matches
Public Member Functions
StockTransactionStockEntry Class Reference

Specialized StockTransactionEntry for the stock split. More...

Inheritance diagram for StockTransactionStockEntry:
StockTransactionEntry

Public Member Functions

 StockTransactionStockEntry (const char *action)
 
void set_fieldmask (FieldMask mask) override
 Set up the state variables from the FieldMask.
 
void set_amount (gnc_numeric amount) override
 
gnc_numeric amount () const override
 
bool has_amount () const override
 
void validate_amount (Logger &logger) const override
 
void create_split (Transaction *trans, AccountVec &account_commits) const override
 
std::string amount_str_for_display () const override
 Generate a string representation of the value.
 
gnc_numeric calculate_price () const override
 Calculate the price (amount/value) for non-currency accounts.
 
bool marker_split () const override
 
- Public Member Functions inherited from StockTransactionEntry
 StockTransactionEntry (const char *action, const char *kvp_tag)
 
 StockTransactionEntry (const StockTransactionEntry &)=default
 
virtual bool enabled () const
 
virtual bool debit_side () const
 
virtual void set_capitalize (bool capitalize)
 
virtual bool input_new_balance () const
 
virtual bool do_capitalize () const
 
virtual void set_account (Account *account)
 
virtual Accountaccount () const
 
virtual const char * print_account () const
 
virtual void set_memo (const char *memo)
 
virtual const char * get_kvp_tag ()
 
virtual const char * memo () const
 
virtual void set_value (gnc_numeric amount)
 
virtual GncNumeric value ()
 
virtual void set_balance (gnc_numeric balance)
 
virtual gnc_numeric get_balance () const
 
virtual const char * print_value () const
 
virtual const char * print_amount (gnc_numeric amt) const
 
virtual const char * print_price () const
 

Additional Inherited Members

- Protected Attributes inherited from StockTransactionEntry
bool m_enabled
 
bool m_debit_side
 
bool m_allow_zero
 
bool m_allow_negative
 
bool m_input_new_balance = false
 
Accountm_account
 
gnc_numeric m_value
 
const char * m_memo
 
const char * m_action
 
gnc_numeric m_balance = gnc_numeric_zero()
 
const char * m_kvp_tag
 
int m_qof_event_handler
 

Detailed Description

Specialized StockTransactionEntry for the stock split.

Unlike the base class it has an amount separate from the value and set amount can optionally take a post-transaction balance, used to calculate the amount and split ratio for split and reverse-split transactions. Its validate_amount method first calls the base class member to validate the value then performs addtional checks on the amount and price.

Definition at line 788 of file assistant-stock-transaction.cpp.

Constructor & Destructor Documentation

◆ StockTransactionStockEntry() [1/2]

StockTransactionStockEntry::StockTransactionStockEntry ( )
inline

Definition at line 794 of file assistant-stock-transaction.cpp.

794 :
796 {
797 PINFO("Stock Entry");
798 }
Holds the configuration information from the fieldmask and the data to create a single split.
#define PINFO(format, args...)
Print an informational note.
Definition qoflog.h:256
gnc_numeric gnc_numeric_error(GNCNumericErrorCode error_code)
Create a gnc_numeric object that signals the error condition noted by error_code, rather than a numbe...
@ GNC_ERROR_ARG
Argument is not a valid number.

◆ StockTransactionStockEntry() [2/2]

StockTransactionStockEntry::StockTransactionStockEntry ( const char *  action)
inline

Definition at line 799 of file assistant-stock-transaction.cpp.

799 :
800 StockTransactionEntry{action, nullptr}, m_amount{gnc_numeric_error(GNC_ERROR_ARG)}
801 {
802 PINFO("Stock Entry");
803 }

Member Function Documentation

◆ amount()

gnc_numeric StockTransactionStockEntry::amount ( ) const
inlineoverridevirtual

Reimplemented from StockTransactionEntry.

Definition at line 806 of file assistant-stock-transaction.cpp.

806{ return m_amount; }

◆ amount_str_for_display()

std::string StockTransactionStockEntry::amount_str_for_display ( ) const
overridevirtual

Generate a string representation of the value.

Internally uses xaccPrintAmount, which writes to a static string, so the result is copied to a std::string to prevent it being replaced by subsequent calls.

Returns
a std:sstring containing a representation of the value.

Reimplemented from StockTransactionEntry.

Definition at line 899 of file assistant-stock-transaction.cpp.

900{
901 std::string rv{""};
902
903 if (gnc_numeric_check (m_amount))
904 return rv;
905
906 if (m_input_new_balance)
907 {
908 auto amount = gnc_numeric_add(m_debit_side ? m_amount : gnc_numeric_neg(m_amount), m_balance,
910 auto ratio = gnc_numeric_div (amount, m_balance,
911 GNC_DENOM_AUTO, GNC_HOW_DENOM_REDUCE);
912 PINFO("Computed ratio %" PRId64 "/%" PRId64 "; amount %" PRId64
913 "/%" PRId64 " and balance %" PRId64 "/%" PRId64,
914 ratio.num, ratio.denom, amount.num, amount.denom, m_balance.num, m_balance.denom);
915 if (gnc_numeric_check (ratio) || !gnc_numeric_positive_p (ratio))
916 return rv;
917
918 std::ostringstream ret;
919 ret << ratio.num << ':' << ratio.denom;
920 rv = ret.str();
921 }
922 else
923 {
924 auto amount = m_debit_side ? m_amount : gnc_numeric_neg (m_amount);
925 amount = gnc_numeric_add_fixed (amount, m_balance);
926 rv = print_amount(amount);
927 }
928
929 return rv;
930};
virtual const char * print_amount(gnc_numeric amt) const
#define GNC_DENOM_AUTO
Values that can be passed as the 'denom' argument.
gnc_numeric gnc_numeric_div(gnc_numeric a, gnc_numeric b, gint64 denom, gint how)
Division.
gnc_numeric gnc_numeric_neg(gnc_numeric a)
Returns a newly created gnc_numeric that is the negative of the given gnc_numeric value.
gboolean gnc_numeric_positive_p(gnc_numeric a)
Returns 1 if a > 0, otherwise returns 0.
gnc_numeric gnc_numeric_add(gnc_numeric a, gnc_numeric b, gint64 denom, gint how)
Return a+b.
@ GNC_HOW_DENOM_REDUCE
Reduce the result value by common factor elimination, using the smallest possible value for the denom...

◆ calculate_price()

gnc_numeric StockTransactionStockEntry::calculate_price ( ) const
overridevirtual

Calculate the price (amount/value) for non-currency accounts.

Note that multiple currencies in stock transaction s are not supported.

Returns
The calculated price for the Stock entry, GNC_ERROR_ARG otherwise.

Reimplemented from StockTransactionEntry.

Definition at line 963 of file assistant-stock-transaction.cpp.

964{
965 if (m_input_new_balance ||
966 !m_amount_enabled || gnc_numeric_check(m_amount) ||
967 !m_enabled || gnc_numeric_check(m_value) ||
968 gnc_numeric_zero_p(m_amount) || gnc_numeric_zero_p(m_value))
970
971 auto price = gnc_numeric_div(m_value, m_amount,
972 GNC_DENOM_AUTO, GNC_HOW_DENOM_EXACT);
973
974 auto comm{xaccAccountGetCommodity(m_account)};
975 auto curr{gnc_account_get_currency_or_parent(m_account)};
976 auto ainfo{gnc_commodity_print_info (comm, true)};
977 auto pinfo{gnc_price_print_info (curr, true)};
978 auto vinfo{gnc_commodity_print_info (curr, true)};
979
980 PINFO("Calculated price %s from value %s and amount %s",
981 xaccPrintAmount(price, pinfo), xaccPrintAmount(m_value, vinfo),
982 xaccPrintAmount(m_amount, ainfo));
983 return price;
984}
gnc_commodity * gnc_account_get_currency_or_parent(const Account *account)
Returns a gnc_commodity that is a currency, suitable for being a Transaction's currency.
Definition Account.cpp:3415
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
Get the account's commodity
Definition Account.cpp:3408
const char * xaccPrintAmount(gnc_numeric val, GNCPrintAmountInfo info)
Make a string representation of a gnc_numeric.
GNCNumericErrorCode gnc_numeric_check(gnc_numeric in)
Check for error signal in value.
gboolean gnc_numeric_zero_p(gnc_numeric a)
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0.

◆ create_split()

void StockTransactionStockEntry::create_split ( Transaction *  trans,
AccountVec &  account_commits 
) const
overridevirtual

Reimplemented from StockTransactionEntry.

Definition at line 934 of file assistant-stock-transaction.cpp.

935{
936 g_return_if_fail(trans);
937 if (!m_account)
938 return;
939 auto split = xaccMallocSplit(qof_instance_get_book(trans));
940 xaccSplitSetParent(split, trans);
941 xaccAccountBeginEdit(m_account);
942 account_commits.push_back(m_account);
943 xaccSplitSetAccount(split, m_account);
944 xaccSplitSetMemo(split, m_memo);
945 if (m_enabled)
946 xaccSplitSetValue(split, m_debit_side ? m_value : gnc_numeric_neg(m_value));
947 if (m_amount_enabled)
948 xaccSplitSetAmount(split, m_debit_side ? m_amount : gnc_numeric_neg(m_amount));
949 if (m_amount_enabled && !m_enabled) // It's a stock split
951 PINFO("creating %s split in Acct(%s): Val(%s), Amt(%s) => Val(%s), Amt(%s)",
952 m_action, m_account ? xaccAccountGetName (m_account) : "Empty!",
953 gnc_num_dbg_to_string(m_value),
954 gnc_num_dbg_to_string(amount()),
957 gnc_set_num_action(nullptr, split, nullptr,
958 g_dpgettext2(nullptr, "Stock Assistant: Action field",
959 m_action));
960}
const char * xaccAccountGetName(const Account *acc)
Get the account's name.
Definition Account.cpp:3289
void xaccAccountBeginEdit(Account *acc)
The xaccAccountBeginEdit() subroutine is the first phase of a two-phase-commit wrapper for account up...
Definition Account.cpp:1475
QofBook * qof_instance_get_book(gconstpointer inst)
Return the book pointer.
gchar * gnc_num_dbg_to_string(gnc_numeric n)
Convert to string.
void xaccSplitSetMemo(Split *split, const char *memo)
The memo is an arbitrary string associated with a split.
void xaccSplitSetValue(Split *split, gnc_numeric val)
The xaccSplitSetValue() method sets the value of this split in the transaction's commodity.
Split * xaccMallocSplit(QofBook *book)
Constructor.
void xaccSplitSetAmount(Split *split, gnc_numeric amt)
The xaccSplitSetAmount() method sets the amount in the account's commodity that the split should have...
gnc_numeric xaccSplitGetValue(const Split *split)
Returns the value of this split in the transaction's commodity.
gnc_numeric xaccSplitGetAmount(const Split *split)
Returns the amount of the split in the account's commodity.
void xaccSplitMakeStockSplit(Split *s)
Mark a split to be of type stock split - after this, you shouldn't modify the value anymore,...
Definition Split.cpp:2063

◆ has_amount()

bool StockTransactionStockEntry::has_amount ( ) const
inlineoverridevirtual

Reimplemented from StockTransactionEntry.

Definition at line 807 of file assistant-stock-transaction.cpp.

807{ return m_amount_enabled; }

◆ marker_split()

bool StockTransactionStockEntry::marker_split ( ) const
inlineoverridevirtual

Reimplemented from StockTransactionEntry.

Definition at line 812 of file assistant-stock-transaction.cpp.

812{ return m_marker; }

◆ set_amount()

void StockTransactionStockEntry::set_amount ( gnc_numeric  amount)
overridevirtual

Reimplemented from StockTransactionEntry.

Definition at line 828 of file assistant-stock-transaction.cpp.

829{
830 if (!m_amount_enabled || gnc_numeric_check(amount))
831 {
833 return;
834 }
835
836 if (m_input_new_balance)
837 {
838 if (m_debit_side)
839 m_amount = gnc_numeric_sub_fixed(amount, m_balance);
840 else
841 m_amount = gnc_numeric_sub_fixed(m_balance, amount);
842
843 PINFO("%s set amount for new balance %s", m_memo, print_amount(m_amount));
844 }
845 else
846 {
847 m_amount = amount;
848 PINFO("%s set amount %s", m_memo, print_amount(m_amount));
849 }
850}

◆ set_fieldmask()

void StockTransactionStockEntry::set_fieldmask ( FieldMask  mask)
overridevirtual

Set up the state variables from the FieldMask.

Parameters
AFieldmast to configure the StockTransactionEntry.

Reimplemented from StockTransactionEntry.

Definition at line 816 of file assistant-stock-transaction.cpp.

817{
819 m_enabled = mask & (FieldMask::ENABLED_CREDIT | FieldMask::ENABLED_DEBIT);
820 m_amount_enabled = mask & (FieldMask::AMOUNT_CREDIT | FieldMask::AMOUNT_DEBIT);
821 m_debit_side = mask & (FieldMask::ENABLED_DEBIT | FieldMask::AMOUNT_DEBIT);
822 m_input_new_balance = mask & FieldMask::INPUT_NEW_BALANCE;
823 m_marker = mask & FieldMask::MARKER_SPLIT;
824}
virtual void set_fieldmask(FieldMask mask)
Set up the state variables from the FieldMask.

◆ validate_amount()

void StockTransactionStockEntry::validate_amount ( Logger logger) const
overridevirtual

Reimplemented from StockTransactionEntry.

Definition at line 853 of file assistant-stock-transaction.cpp.

854{
855 if (m_enabled)
856 StockTransactionEntry::validate_amount(logger);
857
858 if (!m_amount_enabled)
859 return;
860
861 auto add_error_str = [&logger]
862 (const char* str) { logger.error (_(str)); };
863
864 if (gnc_numeric_check(m_amount) || gnc_numeric_zero_p(m_amount))
865 {
866 add_error_str(_("Amount for stock value is missing."));
867 return;
868 }
869
870 if (m_input_new_balance)
871 {
872 auto amount = gnc_numeric_add_fixed(m_debit_side ? m_amount : gnc_numeric_neg(m_amount), m_balance);
873 auto delta = gnc_numeric_sub_fixed(amount, m_balance);
874 auto ratio = gnc_numeric_div(amount, m_balance,
875 GNC_DENOM_AUTO, GNC_HOW_DENOM_REDUCE);
876
877 if (gnc_numeric_check(ratio) || !gnc_numeric_positive_p(ratio))
878 add_error_str(N_("Invalid stock new balance."));
879 else if (gnc_numeric_negative_p(delta) && m_debit_side)
880 add_error_str(N_("New balance must be higher than old balance."));
881 else if (gnc_numeric_positive_p(delta) && !m_debit_side)
882 add_error_str(N_("New balance must be lower than old balance."));
883
884 PINFO("Delta %" PRId64 "/%" PRId64 ", Ratio %" PRId64 "/%" PRId64, delta.num, delta.denom, ratio.num, ratio.denom);
885 return;
886 }
887
888 if (!gnc_numeric_positive_p(m_amount))
889 add_error_str(N_("Stock amount must be positive."));
890
891 auto new_bal = gnc_numeric_add_fixed(m_balance, m_amount);
892 if (gnc_numeric_positive_p(m_balance) && gnc_numeric_negative_p(new_bal))
893 add_error_str(N_("Cannot sell more units than owned."));
894 else if (gnc_numeric_negative_p(m_balance) && gnc_numeric_positive_p(new_bal))
895 add_error_str(N_("Cannot cover buy more units than owed."));
896}
gboolean gnc_numeric_negative_p(gnc_numeric a)
Returns 1 if a < 0, otherwise returns 0.

The documentation for this class was generated from the following file: