GnuCash  5.6-150-g038405b370+
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. More...
 
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. More...
 
gnc_numeric calculate_price () const override
 Calculate the price (amount/value) for non-currency accounts. More...
 
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 785 of file assistant-stock-transaction.cpp.

Member Function Documentation

◆ 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 896 of file assistant-stock-transaction.cpp.

897 {
898  std::string rv{""};
899 
900  if (gnc_numeric_check (m_amount))
901  return rv;
902 
903  if (m_input_new_balance)
904  {
905  auto amount = gnc_numeric_add(m_debit_side ? m_amount : gnc_numeric_neg(m_amount), m_balance,
907  auto ratio = gnc_numeric_div (amount, m_balance,
909  PINFO("Computed ratio %" PRId64 "/%" PRId64 "; amount %" PRId64
910  "/%" PRId64 " and balance %" PRId64 "/%" PRId64,
911  ratio.num, ratio.denom, amount.num, amount.denom, m_balance.num, m_balance.denom);
912  if (gnc_numeric_check (ratio) || !gnc_numeric_positive_p (ratio))
913  return rv;
914 
915  std::ostringstream ret;
916  ret << ratio.num << ':' << ratio.denom;
917  rv = ret.str();
918  }
919  else
920  {
921  auto amount = m_debit_side ? m_amount : gnc_numeric_neg (m_amount);
922  amount = gnc_numeric_add_fixed (amount, m_balance);
923  rv = print_amount(amount);
924  }
925 
926  return rv;
927 };
#define PINFO(format, args...)
Print an informational note.
Definition: qoflog.h:256
gnc_numeric gnc_numeric_neg(gnc_numeric a)
Returns a newly created gnc_numeric that is the negative of the given gnc_numeric value...
gnc_numeric gnc_numeric_add(gnc_numeric a, gnc_numeric b, gint64 denom, gint how)
Return a+b.
Reduce the result value by common factor elimination, using the smallest possible value for the denom...
Definition: gnc-numeric.h:195
gnc_numeric gnc_numeric_div(gnc_numeric x, gnc_numeric y, gint64 denom, gint how)
Division.
gboolean gnc_numeric_positive_p(gnc_numeric a)
Returns 1 if a > 0, otherwise returns 0.
virtual const char * print_amount(gnc_numeric amt) const
GNCNumericErrorCode gnc_numeric_check(gnc_numeric a)
Check for error signal in value.
#define GNC_DENOM_AUTO
Values that can be passed as the &#39;denom&#39; argument.
Definition: gnc-numeric.h:245

◆ 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 960 of file assistant-stock-transaction.cpp.

961 {
962  if (m_input_new_balance ||
963  !m_amount_enabled || gnc_numeric_check(m_amount) ||
964  !m_enabled || gnc_numeric_check(m_value) ||
965  gnc_numeric_zero_p(m_amount) || gnc_numeric_zero_p(m_value))
967 
968  auto price = gnc_numeric_div(m_value, m_amount,
970 
971  auto comm{xaccAccountGetCommodity(m_account)};
972  auto curr{gnc_account_get_currency_or_parent(m_account)};
973  auto ainfo{gnc_commodity_print_info (comm, true)};
974  auto pinfo{gnc_price_print_info (curr, true)};
975  auto vinfo{gnc_commodity_print_info (curr, true)};
976 
977  PINFO("Calculated price %s from value %s and amount %s",
978  xaccPrintAmount(price, pinfo), xaccPrintAmount(m_value, vinfo),
979  xaccPrintAmount(m_amount, ainfo));
980  return price;
981 }
#define PINFO(format, args...)
Print an informational note.
Definition: qoflog.h:256
const char * xaccPrintAmount(gnc_numeric val, GNCPrintAmountInfo info)
Make a string representation of a gnc_numeric.
gboolean gnc_numeric_zero_p(gnc_numeric a)
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0.
Use any denominator which gives an exactly correct ratio of numerator to denominator.
Definition: gnc-numeric.h:188
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...
Argument is not a valid number.
Definition: gnc-numeric.h:224
gnc_numeric gnc_numeric_div(gnc_numeric x, gnc_numeric y, gint64 denom, gint how)
Division.
gnc_commodity * gnc_account_get_currency_or_parent(const Account *account)
Returns a gnc_commodity that is a currency, suitable for being a Transaction&#39;s currency.
Definition: Account.cpp:3378
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
Get the account&#39;s commodity.
Definition: Account.cpp:3371
GNCNumericErrorCode gnc_numeric_check(gnc_numeric a)
Check for error signal in value.
#define GNC_DENOM_AUTO
Values that can be passed as the &#39;denom&#39; argument.
Definition: gnc-numeric.h:245

◆ 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 813 of file assistant-stock-transaction.cpp.

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

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