Example #1
0
def create_transaction_from_csv(data, account, settings=settings_module, ynab_client = ynab_client_module):
    settings.log.debug('received data %s' % data)
    expected_delta = 0

    if data['amount'] == 0:
        return {'error': 'Transaction amount is 0.'}

    payee_name = data['description']
    subcategory_id = get_subcategory_from_payee(payee_name)

    # If we are creating the payee, then we need to increase the delta
    if not ynab_client.payeeexists(payee_name):
        print 'does not exist'
        settings.log.debug('payee does not exist, will create %s', payee_name)
        expected_delta += 1

    # Get the payee ID. This will append a new one if needed
    entities_payee_id = ynab_client.getpayee(payee_name).id

    # If we created a payee, then we need to resync the payees cache
    if expected_delta == 1:
        ynab_client.cache_payees()

    # Create the Transaction
    settings.log.debug('Creating transaction object')
    transaction = Transaction(
        entities_account_id=account.id,
        amount=Decimal(data['amount']),
        date=parse(data['date'], dayfirst=True),
        entities_payee_id=entities_payee_id,
        imported_date=datetime.now().date(),
        imported_payee=payee_name,
        cleared=True,
        source='Imported'
    )

    if subcategory_id is not None:
        transaction.entities_subcategory_id = subcategory_id

    settings.log.debug('Duplicate detection')
    if ynab_client.containsDuplicate(transaction):
        settings.log.debug('skipping due to duplicate transaction')
        # We may just be adding a payee
        if expected_delta == 1:
            print 'just adding payee'
            return expected_delta
        else:
            return {'error': 'Tried to add a duplicate transaction.'}
    else:
        expected_delta += 1
        settings.log.debug('appending and pushing transaction to YNAB. Delta: %s', expected_delta)
        ynab_client.client.budget.be_transactions.append(transaction)
        return expected_delta
Example #2
0
 def add_transaction(self, **kwargs):
     payee = self.get_payee(kwargs['payee'])
     subcategory = self.get_subcategory(kwargs['subcategory'])
     if not self.has_matching_transaction(kwargs['id']):
         transaction = Transaction()
         transaction.date = kwargs['date']
         transaction.memo = 'AUTO IMPORT - {}'.format(kwargs['id'])
         transaction.imported_payee = payee.name
         transaction.entities_payee_id = payee.id
         transaction.entities_subcategory_id = subcategory.id if subcategory else None
         transaction.imported_date = datetime.datetime.now().date()
         transaction.source = "Imported"
         transaction.amount = kwargs['value']
         transaction.entities_account_id = self.account.id
         self.client.budget.be_transactions.append(transaction)
         self.delta += 1
Example #3
0
def create_transaction_from_starling(data, settings=settings_module, ynab_client = ynab_client_module):
    settings.log.debug('received data %s'%data)
    expected_delta = 0
    if not data.get('content') or not data['content'].get('type'):
        return {'error': 'No webhook content type provided'}, 400
    if not data.get('content') or not data['content'].get('type') or not data['content']['type'] in ['TRANSACTION_CARD', 'TRANSACTION_FASTER_PAYMENT_IN', 'TRANSACTION_FASTER_PAYMENT_OUT',
                                'TRANSACTION_DIRECT_DEBIT']:
        return {'error': 'Unsupported webhook type: %s' % data.get('content')['type']}, 400
    # Sync the account so we get the latest payees
    ynab_client.sync()

    if data['content']['amount'] == 0:
        return {'error': 'Transaction amount is 0.'}, 200

    # Does this account exist?
    account = ynab_client.getaccount(settings.starling_ynab_account)
    if not account:
        return {'error': 'Account {} was not found'.format(settings.starling_ynab_account)}, 400


    payee_name = data['content']['counterParty']
    subcategory_id = None
    flag = None
    cleared = None
    memo = ''

    # If we are creating the payee, then we need to increase the delta
    if ynab_client.payeeexists(payee_name):
        settings.log.debug('payee exists, using %s', payee_name)
        subcategory_id = get_subcategory_from_payee(payee_name)
    else:
        settings.log.debug('payee does not exist, will create %s', payee_name)
        expected_delta += 1

    entities_payee_id = ynab_client.getpayee(payee_name).id

    if data['content']['sourceCurrency'] != 'GBP':
        memo += ' (%s %s)' % (data['content']['sourceCurrency'], abs(data['content']['sourceAmount']))
        flag = 'Orange'
    else:
        cleared = 'Cleared'

    # Create the Transaction
    expected_delta += 1
    settings.log.debug('Creating transaction object')
    transaction = Transaction(
        check_number=data['content'].get('transactionUid'),
        entities_account_id=account.id,
        amount=data['content']['amount'],
        date=parse(data['timestamp']),
        entities_payee_id=entities_payee_id,
        imported_date=datetime.now().date(),
        imported_payee=payee_name,
        flag=flag,
        cleared=cleared,
        memo=memo
    )

    if subcategory_id is not None:
        transaction.entities_subcategory_id = subcategory_id

    settings.log.debug('Duplicate detection')
    if ynab_client.containsDuplicate(transaction):
        settings.log.debug('skipping due to duplicate transaction')
        return {'error': 'Tried to add a duplicate transaction.'}, 200
    else:
        expected_delta += 1
        settings.log.debug('appending and pushing transaction to YNAB. Delta: %s', expected_delta)
        ynab_client.client.budget.be_transactions.append(transaction)
        ynab_client.client.push(expected_delta)
        return {'message': 'Transaction created in YNAB successfully.'}, 201
Example #4
0
def create_transaction_from_monzo(data, settings=settings_module, ynab_client = ynab_client_module):
    settings.log.debug('received data %s' % data)
    expected_delta = 0
    data_type = data.get('type')
    settings.log.debug('webhook type received %s', data_type)
    if data_type != 'transaction.created':
        return {'error': 'Unsupported webhook type: %s' % data_type}, 400

    # the actual monzo data is in the data['data]' value
    data = data['data']

    if 'decline_reason' in data:
        return {'message': 'Ignoring declined transaction ({})'.format(data['decline_reason'])}, 200

    # Sync the account so we get the latest payees
    ynab_client.sync()

    if data['amount'] == 0:
        return {'error': 'Transaction amount is 0.'}, 200

    # Does this account exist?
    account = ynab_client.getaccount(settings.monzo_ynab_account)
    if not account:
        return {'error': 'Account {} was not found'.format(settings.monzo_ynab_account)}, 400

    # Work out the Payee Name
    if data.get('merchant'):
        payee_name = data['merchant']['name']
        subcategory_id = get_subcategory_from_payee(payee_name)
    else:
        # This is a p2p transaction
        payee_name = get_p2p_transaction_payee_name(data)
        subcategory_id = None

    # If we are creating the payee, then we need to increase the delta
    if not ynab_client.payeeexists(payee_name):
        settings.log.debug('payee does not exist, will create %s', payee_name)
        expected_delta += 1

    # Get the payee ID. This will append a new one if needed
    entities_payee_id = ynab_client.getpayee(payee_name).id

    memo = ''
    if settings.include_emoji and data['merchant'] and data['merchant'].get('emoji'):
        memo += ' %s' % data['merchant']['emoji']

    if settings.include_tags and data['merchant'] and data['merchant'].get('metadata', {}).get('suggested_tags'):
        memo += ' %s' % data['merchant']['metadata']['suggested_tags']

    # Show the local currency in the notes if this is not in the accounts currency
    flag = None
    cleared = None
    if data['local_currency'] != data['currency']:
        memo += ' (%s %s)' % (data['local_currency'], (abs(Decimal(data['local_amount'])) / 100))
        flag = 'Orange'
    else:
        cleared = 'Cleared'

    # Create the Transaction
    expected_delta += 1
    settings.log.debug('Creating transaction object')
    transaction = Transaction(
        check_number=data['id'],
        entities_account_id=account.id,
        amount=Decimal(data['amount']) / 100,
        date=parse(data['created']),
        entities_payee_id=entities_payee_id,
        imported_date=datetime.now().date(),
        imported_payee=payee_name,
        memo=memo,
        flag=flag,
        cleared=cleared
    )

    if subcategory_id is not None:
        transaction.entities_subcategory_id = subcategory_id

    settings.log.debug('Duplicate detection')
    if ynab_client.containsDuplicate(transaction):
        settings.log.debug('skipping due to duplicate transaction')
        return {'error': 'Tried to add a duplicate transaction.'}, 200
    else:
        settings.log.debug('appending and pushing transaction to YNAB. Delta: %s', expected_delta)
        ynab_client.client.budget.be_transactions.append(transaction)
        ynab_client.client.push(expected_delta)
        return {'message': 'Transaction created in YNAB successfully.'}, 201