gncmerge.py
author Fabien Ninoles <fabien@tzone.org>
Sat, 23 May 2015 22:34:03 -0400
changeset 1 db0e341384e1
permissions -rw-r--r--
Add gncmerge.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     1
#!/usr/bin/env python
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     2
# -*- coding: utf-8 -*-
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     3
import gnucash
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     4
import datetime
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     5
import logging
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     6
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     7
ZERO = gnucash.GncNumeric()
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     8
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
     9
def recurse_all_splits(account):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    10
    for acc in account.get_descendants():
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    11
        for split in acc.GetSplitList():
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    12
            yield split
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    13
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    14
def check_in_date(start_date, end_date, d):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    15
    return start_date <= d and d <= end_date
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    16
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    17
def check_split_date_func(start_date, end_date):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    18
    def f(split):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    19
        parent = split.GetParent()
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    20
        if parent == None:
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    21
            return False
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    22
        d = datetime.date.fromtimestamp(split.GetParent().GetDate())
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    23
        return start_date <= d and d <= end_date
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    24
    return f
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    25
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    26
def generate_splits(root, start, end):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    27
    f = check_split_date_func(start, end)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    28
    return (split for split in recurse_all_splits(root) if f(split))
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    29
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    30
def generate_summary_amounts(root, start, end):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    31
    prevAccount = None
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    32
    prevAccountName = "<None>"
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    33
    zero = (0, ZERO, ZERO)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    34
    pos = zero
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    35
    neg = zero
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    36
    for split in generate_splits(root, start, end):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    37
        account = split.account
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    38
        amount = split.GetAmount()
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    39
        value = split.GetValue()
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    40
        name = account.get_full_name()
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    41
        is_neg = amount.negative_p()
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    42
        if account.get_full_name() != prevAccountName:
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    43
            if prevAccount != None:
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    44
                yield (prevAccount,) + pos
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    45
                yield (prevAccount,) + neg
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    46
            prevAccount = account
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    47
            prevAccountName = name
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    48
            if is_neg:
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    49
                pos = zero
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    50
                neg = (1, amount, value)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    51
            else:
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    52
                pos = (1, amount, value)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    53
                neg = zero
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    54
        else:
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    55
            tmp = neg if is_neg else pos
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    56
            tmp = (tmp[0]+1,
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    57
                   tmp[1].add(amount, gnucash.GNC_DENOM_AUTO, gnucash.GNC_HOW_DENOM_EXACT),
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    58
                   tmp[2].add(value, gnucash.GNC_DENOM_AUTO, gnucash.GNC_HOW_DENOM_EXACT))
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    59
            if is_neg:
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    60
                neg = tmp
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    61
            else:
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    62
                pos = tmp
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    63
    if prevAccount != None:
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    64
        yield (prevAccount,) + pos
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    65
        yield (prevAccount,) + neg
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    66
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    67
def transaction_to_string(trans, currency):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    68
    result = str(datetime.date.fromtimestamp(trans.GetDate()))
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    69
    result += " " + trans.GetDescription() + "\n"
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    70
    for split in trans.GetSplitList():
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    71
        result += "\t" + split.account.get_full_name() + " "
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    72
        result += " "
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    73
        c = split.account.GetCommodity()
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    74
        a = split.GetAmount()
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    75
        result += str(a.to_double()) + " " + c.get_nice_symbol()
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    76
        if not currency.equal(c):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    77
            v = split.GetValue()
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    78
            result += " => " + str(v.to_double()) + " " + currency.get_nice_symbol()
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    79
            result += " ( " + str(v.div(a, gnucash.GNC_DENOM_AUTO, gnucash.GNC_HOW_DENOM_EXACT).to_double())
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    80
            result += " " + c.get_nice_symbol() + " )"
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    81
        result += "\n"
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    82
    imbl = trans.GetImbalanceValue()
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    83
    result += "Balance: " + str(imbl.to_double()) + " " + currency.get_nice_symbol()
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    84
    if not imbl.equal(ZERO):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    85
        for c, v in trans.GetImbalance():
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    86
            result += "\n\t"
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    87
            result += " => " + str(v.to_double()) + " " + c.get_nice_symbol() 
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    88
    return result
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    89
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    90
def delete_transactions(root, start, end, filt):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    91
    removed = 0
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    92
    for split in generate_splits(root, start, end):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    93
        t = split.GetParent()
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    94
        if filt(t):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    95
            removed += t.CountSplits()
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    96
            t.Destroy()
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    97
    logging.info("%d splits removed.", removed)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    98
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
    99
def transaction_not_equal_p(trans):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   100
    gtrans = trans.GetGUID()        
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   101
    def f(t):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   102
        return not gtrans.equal(t.GetGUID())
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   103
    return f
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   104
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   105
def generate_summary_splits(root, start, end):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   106
    book = root.get_book()
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   107
    for account, count, amount, value in generate_summary_amounts(root, start, end):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   108
        if not amount.zero_p():
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   109
            split = gnucash.Split(book)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   110
            split.SetAccount(account)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   111
            price = value.div(amount, gnucash.GNC_DENOM_AUTO, gnucash.GNC_HOW_DENOM_EXACT)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   112
            split.SetSharePriceAndAmount(price, amount)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   113
            yield split, count
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   114
    
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   115
def create_summary(root, start, end, currency, title):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   116
    logging.info("Creating summary %s for %s between %s and %s",
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   117
                 title, root.get_full_name(), start, end)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   118
    book = root.get_book()
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   119
    trans = gnucash.Transaction(book)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   120
    trans.BeginEdit()
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   121
    trans.SetDate(end.day, end.month, end.year)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   122
    trans.SetDescription(title)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   123
    trans.SetCurrency(currency)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   124
    total = 0
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   125
    for split, count in generate_summary_splits(root, start, end):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   126
        split.SetParent(trans)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   127
        total += count
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   128
    if trans.CountSplits() > 0:
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   129
        logging.info("%d splits summary into one transaction '%s'.", total, title)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   130
        logging.debug(transaction_to_string(trans, currency))
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   131
        assert(trans.IsBalanced())
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   132
        trans.CommitEdit()
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   133
    if total > 0:
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   134
        delete_transactions(root, start, end, transaction_not_equal_p(trans))
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   135
    else:
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   136
        logging.info("No splits found for this date")
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   137
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   138
def make_summary(root, currency, start, end, title):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   139
    create_summary(root, start, end, currency, title)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   140
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   141
def lookup_currency(book, currency):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   142
    return book.get_table().lookup("CURRENCY", currency)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   143
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   144
## Datetime support
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   145
ONEDAY = datetime.timedelta(days=1)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   146
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   147
def first_day_of_month(d):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   148
    return datetime.date(d.year, d.month, 1)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   149
def first_day_of_year(d):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   150
    return datetime.date(d.year, 1, 1)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   151
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   152
def next_day(d):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   153
    return d + ONEDAY
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   154
def next_month(d):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   155
    if d.month == 12:
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   156
        return datetime.date(d.year+1, 1, 1)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   157
    else:
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   158
        return datetime.date(d.year, d.month + 1, 1)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   159
def next_year(d):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   160
    return datetime.date(d.year + 1, 1, 1)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   161
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   162
def datetime_iter(start, end, next_f):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   163
    d = start
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   164
    while end == None or d < end:
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   165
        yield d
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   166
        d = next_f(d)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   167
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   168
def datetime_iter_range(start, end, next_f):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   169
    for d in datetime_iter(start, end, next_f):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   170
        yield d, next_f(d) - ONEDAY
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   171
    
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   172
def day_iter(start, end=None):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   173
    return (d for d in datetime_iter(start, end, next_day))
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   174
def month_iter(start, end=None):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   175
    return (d for d in datetime_iter(first_day_of_month(start), end, next_month))
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   176
def year_iter(start, end=None):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   177
    return (d for d in datetime_iter(first_day_of_year(start), end, next_year))
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   178
def day_range_iter(start, end=None):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   179
    return ((d,d) for d in datetime_iter(start, end, next_day))
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   180
def month_range_iter(start, end=None):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   181
    return (d for d in datetime_iter_range(first_day_of_month(start), end, next_month))
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   182
def year_range_iter(start, end=None):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   183
    return (d for d in datetime_iter_range(first_day_of_year(start), end, next_year))
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   184
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   185
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   186
def main(filename, title, currency, daterange):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   187
    try:
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   188
        session = gnucash.Session(filename, is_new=False)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   189
        root = session.book.get_root_account()
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   190
        curr = lookup_currency(session.book, currency)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   191
        for s, e in daterange:
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   192
            make_summary(root, curr, s, e, title)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   193
        session.save()
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   194
        session.end()
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   195
    except:
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   196
        logging.exception("Exception occured")
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   197
    finally:
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   198
        if 'session' in locals():
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   199
            session.destroy()
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   200
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   201
def usage(msg):
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   202
    import sys
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   203
    print msg
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   204
    print "Usage:", sys.argv[0], \
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   205
        "filename.gnc", "transaction_title", "currency", \
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   206
        "yearly|monthly|daily", \
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   207
        "start_year start_month start_day", \
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   208
        "end_year end_month end_day"
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   209
    exit(-1)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   210
            
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   211
if __name__ == '__main__':
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   212
    # logging.basicConfig(level=logging.DEBUG)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   213
    import sys
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   214
    if len(sys.argv) != 11:
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   215
        usage("Invalid number of arguments")
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   216
        exit(-1)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   217
    cmd, filename, title, currency, period, syear, smonth, sday, eyear, emonth, eday = sys.argv
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   218
    start = datetime.date(int(syear), int(smonth), int(sday))
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   219
    end = datetime.date(int(eyear), int(emonth), int(eday))
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   220
    if period == "daily":
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   221
        daterange = day_range_iter(start, end)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   222
    elif period == "monthly":
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   223
        daterange = month_range_iter(start, end)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   224
    elif period == "yearly":
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   225
        daterange = year_range_iter(start, end)
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   226
    else:
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   227
        usage("Invalid period '%s'" % (period,))
db0e341384e1 Add gncmerge.
Fabien Ninoles <fabien@tzone.org>
parents:
diff changeset
   228
    main(filename, title, currency, daterange)