GnuCash  5.6-150-g038405b370+
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
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: