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
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
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
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