GnuCash c935c2f+
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 785 of file assistant-stock-transaction.cpp.

Constructor & Destructor Documentation

◆ StockTransactionStockEntry() [1/2]

StockTransactionStockEntry::StockTransactionStockEntry ( )
inline

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

791 :
793 {
794 PINFO("Stock Entry");
795 }
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 796 of file assistant-stock-transaction.cpp.

796 :
797 StockTransactionEntry{action, nullptr}, m_amount{gnc_numeric_error(GNC_ERROR_ARG)}
798 {
799 PINFO("Stock Entry");
800 }

Member Function Documentation

◆ amount()

gnc_numeric StockTransactionStockEntry::amount ( ) const
inlineoverridevirtual

Reimplemented from StockTransactionEntry.

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

803{ 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 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,
908 GNC_DENOM_AUTO, GNC_HOW_DENOM_REDUCE);
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};
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 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,
969 GNC_DENOM_AUTO, GNC_HOW_DENOM_EXACT);
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}
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 931 of file assistant-stock-transaction.cpp.

932{
933 g_return_if_fail(trans);
934 if (!m_account)
935 return;
936 auto split = xaccMallocSplit(qof_instance_get_book(trans));
937 xaccSplitSetParent(split, trans);
938 xaccAccountBeginEdit(m_account);
939 account_commits.push_back(m_account);
940 xaccSplitSetAccount(split, m_account);
941 xaccSplitSetMemo(split, m_memo);
942 if (m_enabled)
943 xaccSplitSetValue(split, m_debit_side ? m_value : gnc_numeric_neg(m_value));
944 if (m_amount_enabled)
945 xaccSplitSetAmount(split, m_debit_side ? m_amount : gnc_numeric_neg(m_amount));
946 if (m_amount_enabled && !m_enabled) // It's a stock split
948 PINFO("creating %s split in Acct(%s): Val(%s), Amt(%s) => Val(%s), Amt(%s)",
949 m_action, m_account ? xaccAccountGetName (m_account) : "Empty!",
950 gnc_num_dbg_to_string(m_value),
951 gnc_num_dbg_to_string(amount()),
954 gnc_set_num_action(nullptr, split, nullptr,
955 g_dpgettext2(nullptr, "Stock Assistant: Action field",
956 m_action));
957}
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 804 of file assistant-stock-transaction.cpp.

804{ return m_amount_enabled; }

◆ marker_split()

bool StockTransactionStockEntry::marker_split ( ) const
inlineoverridevirtual

Reimplemented from StockTransactionEntry.

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

809{ return m_marker; }

◆ set_amount()

void StockTransactionStockEntry::set_amount ( gnc_numeric  amount)
overridevirtual

Reimplemented from StockTransactionEntry.

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

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

◆ 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.

◆ validate_amount()

void StockTransactionStockEntry::validate_amount ( Logger logger) const
overridevirtual

Reimplemented from StockTransactionEntry.

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

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