diff --git a/src/engine/Scrub2.c b/src/engine/Scrub2.c index 1cacf2be09..8449b09c9a 100644 --- a/src/engine/Scrub2.c +++ b/src/engine/Scrub2.c @@ -282,7 +282,10 @@ xaccScrubSubSplitPrice (Split *split, int maxmult, int maxamtscu) /* ================================================================= */ -/* Remove the guid of b from a */ +/* Remove the guid of b from a. Note that a may not contain the guid + * of b, (and v.v.) in which case, it will contain other guids which + * establish the links. So merge them back in. */ + static void remove_guids (Split *sa, Split *sb) { @@ -291,20 +294,28 @@ remove_guids (Split *sa, Split *sb) /* Find and remove the matching guid's */ ksub = gnc_kvp_bag_find_by_guid (sa->kvp_data, "lot-split", "peer_guid", &sb->guid); - if (!ksub) + if (ksub) { - PERR ("merging splits that didn't have correct gemini values!\n" - "looking for guid=%s\n" - "bag held: %s", - guid_to_string (&sb->guid), - kvp_frame_to_string (sa->kvp_data)); - return; + gnc_kvp_bag_remove_frame (sa->kvp_data, "lot-split", ksub); + kvp_frame_delete (ksub); } - gnc_kvp_bag_remove_frame (sa->kvp_data, "lot-split", ksub); - kvp_frame_delete (ksub); + + /* Now do it in the other direction */ + ksub = gnc_kvp_bag_find_by_guid (sb->kvp_data, "lot-split", + "peer_guid", &sa->guid); + if (ksub) + { + gnc_kvp_bag_remove_frame (sb->kvp_data, "lot-split", ksub); + kvp_frame_delete (ksub); + } + + /* Finally, merge b's lot-splits, if any, into a's */ + /* This is an important step, if it got busted into many pieces. */ + gnc_kvp_bag_merge (sa->kvp_data, "lot-split", + sb->kvp_data, "lot-split"); } -/* The 'merge_splits() routine causes the amount & value of sb +/* The merge_splits() routine causes the amount & value of sb * to be merged into sa; it then destroys sb. It also performs * some other misc cleanup */