summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/ledger3.texi16
-rw-r--r--src/csv.cc2
-rw-r--r--src/journal.cc2
-rw-r--r--src/journal.h73
-rw-r--r--src/textual.cc25
5 files changed, 76 insertions, 42 deletions
diff --git a/doc/ledger3.texi b/doc/ledger3.texi
index dfdafc05..68f47d99 100644
--- a/doc/ledger3.texi
+++ b/doc/ledger3.texi
@@ -2416,17 +2416,19 @@ before using the @code{fixed} directive in production.
Include the stated file as if it were part of the current file.
@item payee
-@c instance_t::payee_mapping_directive in textual.cc
+@c instance_t::payee_alias_mapping_directive in textual.cc
+@c instance_t::payee_uuid_mapping_directive in textual.cc
@findex print
@findex register
-The @code{payee} directive supports one optional sub-directive, if it
-immediately follows the payee directive and---if it is on a successive
+The @code{payee} directive supports two optional sub-directives, if they
+immediately follow the payee directive and---if it is on a successive
line---begins with whitespace:
@smallexample @c input:validate
payee KFC
alias KENTUCKY FRIED CHICKEN
+ uuid 2a2e21d434356f886c84371eebac6e44f1337fda
@end smallexample
The @code{alias} sub-directive provides a regex which, if it matches
@@ -2437,6 +2439,14 @@ a parsed payee, the declared payee name is substituted:
...
@end smallexample
+The @code{uuid} sub-directive specifies that a transaction with exactly
+the uuid given should have the declared payee name substituted:
+
+@smallexample
+2014-05-13 UNHELPFUL PAYEE ; will be read as being 'KFC'
+ ; UUID: 2a2e21d434356f886c84371eebac6e44f1337fda
+@end smallexample
+
Ledger will display the mapped payees in @command{print} and
@command{register} reports.
diff --git a/src/csv.cc b/src/csv.cc
index bcfa1284..9f7e78e4 100644
--- a/src/csv.cc
+++ b/src/csv.cc
@@ -186,7 +186,7 @@ xact_t * csv_reader::read_xact(bool rich_data)
case FIELD_PAYEE: {
bool found = false;
- foreach (payee_mapping_t& value, context.journal->payee_mappings) {
+ foreach (payee_alias_mapping_t& value, context.journal->payee_alias_mappings) {
DEBUG("csv.mappings", "Looking for payee mapping: " << value.first);
if (value.first.match(field)) {
xact->payee = value.second;
diff --git a/src/journal.cc b/src/journal.cc
index 142b68a6..ced96ee9 100644
--- a/src/journal.cc
+++ b/src/journal.cc
@@ -249,7 +249,7 @@ string journal_t::register_payee(const string& name, xact_t * xact)
}
}
- foreach (payee_mapping_t& value, payee_mappings) {
+ foreach (payee_alias_mapping_t& value, payee_alias_mappings) {
if (value.first.match(name)) {
payee = value.second;
break;
diff --git a/src/journal.h b/src/journal.h
index ad7b4b48..803b9511 100644
--- a/src/journal.h
+++ b/src/journal.h
@@ -58,15 +58,17 @@ class account_t;
class parse_context_t;
class parse_context_stack_t;
-typedef std::list<xact_t *> xacts_list;
-typedef std::list<auto_xact_t *> auto_xacts_list;
-typedef std::list<period_xact_t *> period_xacts_list;
-typedef std::pair<mask_t, string> payee_mapping_t;
-typedef std::list<payee_mapping_t> payee_mappings_t;
-typedef std::pair<mask_t, account_t *> account_mapping_t;
-typedef std::list<account_mapping_t> account_mappings_t;
-typedef std::map<string, account_t *> accounts_map;
-typedef std::map<string, xact_t *> checksum_map_t;
+typedef std::list<xact_t *> xacts_list;
+typedef std::list<auto_xact_t *> auto_xacts_list;
+typedef std::list<period_xact_t *> period_xacts_list;
+typedef std::pair<mask_t, string> payee_alias_mapping_t;
+typedef std::list<payee_alias_mapping_t> payee_alias_mappings_t;
+typedef std::pair<string, string> payee_uuid_mapping_t;
+typedef std::list<payee_uuid_mapping_t> payee_uuid_mappings_t;
+typedef std::pair<mask_t, account_t *> account_mapping_t;
+typedef std::list<account_mapping_t> account_mappings_t;
+typedef std::map<string, account_t *> accounts_map;
+typedef std::map<string, xact_t *> checksum_map_t;
typedef std::multimap<string, expr_t::check_expr_pair> tag_check_exprs_map;
@@ -115,32 +117,33 @@ public:
#endif // HAVE_BOOST_SERIALIZATION
};
- account_t * master;
- account_t * bucket;
- xacts_list xacts;
- auto_xacts_list auto_xacts;
- period_xacts_list period_xacts;
- std::list<fileinfo_t> sources;
- std::set<string> known_payees;
- std::set<string> known_tags;
- bool fixed_accounts;
- bool fixed_payees;
- bool fixed_commodities;
- bool fixed_metadata;
- bool was_loaded;
- bool force_checking;
- bool check_payees;
- bool day_break;
- bool recursive_aliases;
- bool no_aliases;
- payee_mappings_t payee_mappings;
- account_mappings_t account_mappings;
- accounts_map account_aliases;
- account_mappings_t payees_for_unknown_accounts;
- checksum_map_t checksum_map;
- tag_check_exprs_map tag_check_exprs;
- optional<expr_t> value_expr;
- parse_context_t * current_context;
+ account_t * master;
+ account_t * bucket;
+ xacts_list xacts;
+ auto_xacts_list auto_xacts;
+ period_xacts_list period_xacts;
+ std::list<fileinfo_t> sources;
+ std::set<string> known_payees;
+ std::set<string> known_tags;
+ bool fixed_accounts;
+ bool fixed_payees;
+ bool fixed_commodities;
+ bool fixed_metadata;
+ bool was_loaded;
+ bool force_checking;
+ bool check_payees;
+ bool day_break;
+ bool recursive_aliases;
+ bool no_aliases;
+ payee_alias_mappings_t payee_alias_mappings;
+ payee_uuid_mappings_t payee_uuid_mappings;
+ account_mappings_t account_mappings;
+ accounts_map account_aliases;
+ account_mappings_t payees_for_unknown_accounts;
+ checksum_map_t checksum_map;
+ tag_check_exprs_map tag_check_exprs;
+ optional<expr_t> value_expr;
+ parse_context_t * current_context;
enum checking_style_t {
CHECK_PERMISSIVE,
diff --git a/src/textual.cc b/src/textual.cc
index 55f22a2c..60250007 100644
--- a/src/textual.cc
+++ b/src/textual.cc
@@ -155,6 +155,7 @@ namespace {
void payee_directive(char * line);
void payee_alias_directive(const string& payee, string alias);
+ void payee_uuid_directive(const string& payee, string uuid);
void commodity_directive(char * line);
void commodity_alias_directive(commodity_t& comm, string alias);
@@ -1035,14 +1036,23 @@ void instance_t::payee_directive(char * line)
string keyword(p);
if (keyword == "alias")
payee_alias_directive(payee, b);
+ if (keyword == "uuid")
+ payee_uuid_directive(payee, b);
}
}
void instance_t::payee_alias_directive(const string& payee, string alias)
{
trim(alias);
- context.journal->payee_mappings
- .push_back(payee_mapping_t(mask_t(alias), payee));
+ context.journal->payee_alias_mappings
+ .push_back(payee_alias_mapping_t(mask_t(alias), payee));
+}
+
+void instance_t::payee_uuid_directive(const string& payee, string uuid)
+{
+ trim(uuid);
+ context.journal->payee_uuid_mappings
+ .push_back(payee_uuid_mapping_t(uuid, payee));
}
void instance_t::commodity_directive(char * line)
@@ -1862,6 +1872,17 @@ xact_t * instance_t::parse_xact(char * line,
else {
reveal_context = false;
+ if (!last_post) {
+ if (xact->has_tag(_("UUID"))) {
+ string uuid = xact->get_tag(_("UUID"))->to_string();
+ foreach (payee_uuid_mapping_t value, context.journal->payee_uuid_mappings) {
+ if (value.first.compare(uuid) == 0) {
+ xact->payee = value.second;
+ }
+ }
+ }
+ }
+
if (post_t * post =
parse_post(p, len - (p - line), account, xact.get())) {
reveal_context = true;