mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-20 11:48:30 -06:00
Provide new function gnc_price_invert.
To invert a price when it's currency is what we want to use as a commodity. Generalizes the source-type PRICE_SOURCE_INVOICE to PRICE_SOURCE_TEMPORARY for all cases like this where we don't want to save the price.
This commit is contained in:
parent
62c7693860
commit
edefc9e57c
@ -203,7 +203,7 @@ write_price( GNCPrice* p, gpointer data )
|
|||||||
g_return_val_if_fail( p != NULL, FALSE );
|
g_return_val_if_fail( p != NULL, FALSE );
|
||||||
g_return_val_if_fail( data != NULL, FALSE );
|
g_return_val_if_fail( data != NULL, FALSE );
|
||||||
|
|
||||||
if ( s->is_ok && gnc_price_get_source(p) != PRICE_SOURCE_INVOICE)
|
if ( s->is_ok && gnc_price_get_source(p) != PRICE_SOURCE_TEMP)
|
||||||
{
|
{
|
||||||
s->is_ok = save_price( s->be, QOF_INSTANCE(p) );
|
s->is_ok = save_price( s->be, QOF_INSTANCE(p) );
|
||||||
}
|
}
|
||||||
|
@ -898,7 +898,7 @@ gnc_invoice_post(InvoiceWindow *iw, struct post_invoice_params *post_params)
|
|||||||
gnc_price_set_commodity (convprice, account_currency);
|
gnc_price_set_commodity (convprice, account_currency);
|
||||||
gnc_price_set_currency (convprice, gncInvoiceGetCurrency (invoice));
|
gnc_price_set_currency (convprice, gncInvoiceGetCurrency (invoice));
|
||||||
gnc_price_set_time (convprice, postdate);
|
gnc_price_set_time (convprice, postdate);
|
||||||
gnc_price_set_source (convprice, PRICE_SOURCE_INVOICE);
|
gnc_price_set_source (convprice, PRICE_SOURCE_TEMP);
|
||||||
gnc_price_set_typestr (convprice, PRICE_TYPE_LAST);
|
gnc_price_set_typestr (convprice, PRICE_TYPE_LAST);
|
||||||
gnc_price_set_value (convprice, exch_rate);
|
gnc_price_set_value (convprice, exch_rate);
|
||||||
gncInvoiceAddPrice(invoice, convprice);
|
gncInvoiceAddPrice(invoice, convprice);
|
||||||
|
@ -382,7 +382,7 @@ KvpValue* qof_book_get_option (QofBook *book, GSList *key_path);
|
|||||||
SET_ENUM("PRICE-SOURCE-XFER-DLG-VAL");
|
SET_ENUM("PRICE-SOURCE-XFER-DLG-VAL");
|
||||||
SET_ENUM("PRICE-SOURCE-SPLIT-REG");
|
SET_ENUM("PRICE-SOURCE-SPLIT-REG");
|
||||||
SET_ENUM("PRICE-SOURCE-STOCK-SPLIT");
|
SET_ENUM("PRICE-SOURCE-STOCK-SPLIT");
|
||||||
SET_ENUM("PRICE-SOURCE-INVOICE");
|
SET_ENUM("PRICE-SOURCE-TEMP");
|
||||||
SET_ENUM("PRICE-SOURCE-INVALID");
|
SET_ENUM("PRICE-SOURCE-INVALID");
|
||||||
|
|
||||||
#undef SET_ENUM
|
#undef SET_ENUM
|
||||||
|
@ -95,11 +95,10 @@ gnc_price_init(GNCPrice* price)
|
|||||||
|
|
||||||
/* Array of char constants for converting price-source enums. Be sure to keep in
|
/* Array of char constants for converting price-source enums. Be sure to keep in
|
||||||
* sync with the enum values in gnc-pricedb.h The string user:price-editor is
|
* sync with the enum values in gnc-pricedb.h The string user:price-editor is
|
||||||
* explicitly used by price_to_gui() in dialog-price-editor.c and the string
|
* explicitly used by price_to_gui() in dialog-price-editor.c. Beware
|
||||||
* Finance::Quote is explicitly used by fq-results->commod-tz-quote-triples in
|
|
||||||
* price-quotes.scm. Take care to keep them in sync if you make changes. Beware
|
|
||||||
* that the strings are used to store the enum values in the backends so any
|
* that the strings are used to store the enum values in the backends so any
|
||||||
* changes will affect backward data compatibility.
|
* changes will affect backward data compatibility.
|
||||||
|
* The last two values, temporary and invalid, are *not* used.
|
||||||
*/
|
*/
|
||||||
static const char* source_names[] =
|
static const char* source_names[] =
|
||||||
{
|
{
|
||||||
@ -112,7 +111,7 @@ static const char* source_names[] =
|
|||||||
"user:xfer-dialog",
|
"user:xfer-dialog",
|
||||||
"user:split-register",
|
"user:split-register",
|
||||||
"user:stock-split",
|
"user:stock-split",
|
||||||
"user:invoice-post",
|
"temporary",
|
||||||
"invalid"
|
"invalid"
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -383,6 +382,23 @@ gnc_price_clone (GNCPrice* p, QofBook *book)
|
|||||||
return(new_p);
|
return(new_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GNCPrice *
|
||||||
|
gnc_price_invert (GNCPrice *p)
|
||||||
|
{
|
||||||
|
QofBook *book = qof_instance_get_book (QOF_INSTANCE(p));
|
||||||
|
GNCPrice *new_p = gnc_price_create (book);
|
||||||
|
qof_instance_copy_version(new_p, p);
|
||||||
|
gnc_price_begin_edit(new_p);
|
||||||
|
gnc_price_set_time(new_p, gnc_price_get_time(p));
|
||||||
|
gnc_price_set_source(new_p, PRICE_SOURCE_TEMP);
|
||||||
|
gnc_price_set_typestr(new_p, gnc_price_get_typestr(p));
|
||||||
|
gnc_price_set_commodity(new_p, gnc_price_get_currency(p));
|
||||||
|
gnc_price_set_currency(new_p, gnc_price_get_commodity(p));
|
||||||
|
gnc_price_set_value(new_p, gnc_numeric_invert(gnc_price_get_value(p)));
|
||||||
|
gnc_price_commit_edit(new_p);
|
||||||
|
return new_p;
|
||||||
|
}
|
||||||
|
|
||||||
/* ==================================================================== */
|
/* ==================================================================== */
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -169,7 +169,8 @@ typedef enum
|
|||||||
PRICE_SOURCE_SPLIT_REG, // "user:split-register"
|
PRICE_SOURCE_SPLIT_REG, // "user:split-register"
|
||||||
PRICE_SOURCE_STOCK_SPLIT, // "user:stock-split"
|
PRICE_SOURCE_STOCK_SPLIT, // "user:stock-split"
|
||||||
PRICE_SOURCE_INVOICE, // "user:invoice-post"
|
PRICE_SOURCE_INVOICE, // "user:invoice-post"
|
||||||
PRICE_SOURCE_INVALID,
|
PRICE_SOURCE_TEMP, // "temporary"
|
||||||
|
PRICE_SOURCE_INVALID, // "invalid"
|
||||||
} PriceSource;
|
} PriceSource;
|
||||||
|
|
||||||
#define PRICE_TYPE_LAST "last"
|
#define PRICE_TYPE_LAST "last"
|
||||||
@ -188,6 +189,17 @@ GNCPrice *gnc_price_create(QofBook *book);
|
|||||||
content-wise duplicate of the given price, p. The returned clone
|
content-wise duplicate of the given price, p. The returned clone
|
||||||
will have a reference count of 1. */
|
will have a reference count of 1. */
|
||||||
GNCPrice *gnc_price_clone(GNCPrice* p, QofBook *book);
|
GNCPrice *gnc_price_clone(GNCPrice* p, QofBook *book);
|
||||||
|
|
||||||
|
/** Return a newly-allocated price that's the inverse of the given price, p.
|
||||||
|
*
|
||||||
|
* Inverse means that the commodity and currency are swapped and the value is
|
||||||
|
* the numeric inverse of the original's. The source is set to PRICE_SOURCE_TEMP
|
||||||
|
* to prevent it being saved in the pricedb.
|
||||||
|
* @param p The price to invert
|
||||||
|
* @return a new price, with a ref-count of 1. Don't forget to unref it!
|
||||||
|
*/
|
||||||
|
GNCPrice *gnc_price_invert(GNCPrice *p);
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
/* ------------------ */
|
/* ------------------ */
|
||||||
|
Loading…
Reference in New Issue
Block a user