def test_same_day_transactions(self):
        matching_transactions = [
            Transaction({
                'amount': 100,
                'transaction-time': datetime(year=2017, month=6, day=1)
            }),
            Transaction({
                'amount': -100,
                'transaction-time': datetime(year=2017, month=6, day=1)
            }),
        ]
        no_match_transactions = [
            Transaction({
                'amount':
                -5,
                'transaction-time':
                datetime(year=2017, month=6, day=10)
            }),
            Transaction({
                'amount':
                50,
                'transaction-time':
                datetime(year=2017, month=6, day=10)
            }),
        ]
        transactions = no_match_transactions + matching_transactions

        annotate_cc_transations(transactions)
        for transaction in no_match_transactions:
            assert not is_cc_transaction(transaction)
        for transaction in matching_transactions:

            assert is_cc_transaction(transaction)
 def test_amounts_match_but_greater_than_24_hours(self):
     transactions = [
         Transaction({
             'amount': 100,
             'transaction-time': datetime(year=2017, month=6, day=1)
         }),
         Transaction({
             'amount': -100,
             'transaction-time': datetime(year=2017, month=6, day=6)
         }),
         Transaction({
             'amount':
             -5,
             'transaction-time':
             datetime(year=2017, month=6, day=10)
         }),
         Transaction({
             'amount':
             50,
             'transaction-time':
             datetime(year=2017, month=6, day=10)
         }),
     ]
     annotate_cc_transations(transactions)
     for transaction in transactions:
         print transaction.amount, transaction.datetime
         assert not is_cc_transaction(transaction)
Exemplo n.º 3
0
    def test_get_and_update_with_multiple_with_different_date(self):
        data = {
            "id": "15887",
            "customer_id": "528",
            "load_amount": "$3000.00",
            "time": "2000-01-01T00:00:00Z",
        }
        date = datetime.strptime(data["time"], UTC_DATE_TIME_FORMAT)
        customer_id = 1
        transaction = Transaction(data)
        self.storage.update(customer_id, transaction)

        record = self.storage.get(customer_id, date)
        assert record
        assert isinstance(record, Tuple)
        total_amount, total_count = record
        assert total_amount == data["load_amount"][1:]
        assert total_count == 1

        data = {
            "id": "1234",
            "customer_id": "528",
            "load_amount": "$2000.00",
            "time": "2000-01-02T00:00:00Z",
        }
        transaction = Transaction(data)
        self.storage.update(customer_id, transaction)
        date = datetime.strptime(data["time"], UTC_DATE_TIME_FORMAT)
        record = self.storage.get(customer_id, date)
        assert record
        assert isinstance(record, Tuple)
        total_amount, total_count = record
        assert total_amount == data["load_amount"][1:]
        assert total_count == 1
Exemplo n.º 4
0
    def test_get(self):
        data = {
            "id": "15887",
            "customer_id": "528",
            "load_amount": "$3318.47",
            "time": "2000-01-01T00:00:00Z",
        }
        date = datetime.strptime(data["time"], UTC_DATE_TIME_FORMAT)
        customer_id = 1
        record = self.storage.get(customer_id, date)
        assert record
        assert isinstance(record, Tuple)
        assert len(record) == 2
        total_amount, total_count = record
        assert total_amount == 0
        assert total_amount == total_count

        transaction = Transaction(data)
        self.storage.update(customer_id, transaction)
        record = self.storage.get(customer_id, date)
        assert record
        assert isinstance(record, Tuple)
        total_amount, total_count = record
        assert total_amount == data["load_amount"][1:]
        assert total_count == 1
Exemplo n.º 5
0
    def test_add_transaction(self):
        input_data = [
            {
                "id": "15887",
                "customer_id": "528",
                "load_amount": "$1000.00",
                "time": "2000-01-01T00:00:00Z",
            },
            {
                "id": "30081",
                "customer_id": "528",
                "load_amount": "$1000.00",
                "time": "2000-01-01T01:01:22Z",
            },
            {
                "id": "26540",
                "customer_id": "528",
                "load_amount": "$1000.00",
                "time": "2000-01-02T02:02:44Z",
            },
        ]
        for data in input_data:
            transaction = Transaction(data)
            self.customer.perform_transaction(transaction)

        assert isinstance(self.customer.transaction_list, list)

        len(self.customer.transaction_list) == len(data)
        for transaction in self.customer.transaction_list:
            assert transaction
            assert isinstance(transaction, Transaction)
Exemplo n.º 6
0
def to_transactions(json_dict):
    if 'transaction-id' in json_dict:
        if 'transaction-time' in json_dict:
            # Convert to datetime object
            json_dict['transaction-time'] = datetime.strptime(
                json_dict['transaction-time'], TRANSACTION_DATETIME_FORMAT)
        return Transaction(json_dict)
    return json_dict
    def test_is_donut(self):
        """ Check to see if transactions match known donut merchants """
        not_donut_transaction = Transaction({
            'raw-merchant': 'NOT DONUT',
        })

        donut_a_transaction = Transaction({
            'raw-merchant': 'Dunkin #336784',
        })

        donut_b_transaction = Transaction({
            'raw-merchant':
            'Krispy Kreme Donuts',
        })

        assert not is_donut(not_donut_transaction)
        assert is_donut(donut_a_transaction)
        assert is_donut(donut_b_transaction)
Exemplo n.º 8
0
 def setup(self):
     self.customer = Customer("1")
     self.transaction = Transaction(
         {
             "id": "15887",
             "customer_id": "528",
             "load_amount": "$3318.47",
             "time": "2000-01-01T00:00:00Z",
         }
     )
Exemplo n.º 9
0
def get_transactions(session, transactions: list) -> list:
    return [
        Transaction(
            id=transaction["id"],
            datetime=transaction["datetime"],
            payment_type=PaymentType.from_str(transaction["payment_type"]),
            card_details=transaction["card_details"],
            transaction_total=transaction["transaction_total"],
            location_id=_get_existing_location_id(session, transaction),
        )
        for transaction in transactions
    ]
Exemplo n.º 10
0
 def test_no_amounts_match(self):
     transactions = [
         Transaction({
             'amount': 100,
             'transaction-time': datetime(year=2017, month=6, day=6)
         }),
         Transaction({
             'amount': -200,
             'transaction-time': datetime(year=2017, month=6, day=6)
         }),
         Transaction({
             'amount': -5,
             'transaction-time': datetime(year=2017, month=6, day=6)
         }),
         Transaction({
             'amount': 50,
             'transaction-time': datetime(year=2017, month=6, day=6)
         }),
     ]
     annotate_cc_transations(transactions)
     for transaction in transactions:
         assert not is_cc_transaction(transaction)
Exemplo n.º 11
0
    def test_is_cc_transaction(self):
        not_cc_transaction = Transaction({})
        assert not is_cc_transaction(not_cc_transaction)

        explictly_not_cc_transaction = Transaction({})
        explictly_not_cc_transaction.is_cc_transaction = False
        assert not is_cc_transaction(explictly_not_cc_transaction)

        cc_transaction = Transaction({})
        cc_transaction.is_cc_transaction = True
        assert is_cc_transaction(cc_transaction)
Exemplo n.º 12
0
    def test_create_transaction(self):
        data = {
            "id": "15887",
            "customer_id": "528",
            "load_amount": "$3000.00",
            "time": "2000-01-01T00:00:00Z",
        }
        transaction = Transaction(data)
        assert transaction
        assert transaction.id == data["id"]
        assert transaction.customer_id == data["customer_id"]

        assert isinstance(transaction.amount, Decimal)
        assert transaction.amount == Decimal(data["load_amount"][1:])

        assert isinstance(transaction.timestamp, datetime)
        assert transaction.timestamp == datetime.strptime(
            data["time"], UTC_DATE_TIME_FORMAT)
Exemplo n.º 13
0
def create_quote(body):  # noqa: E501
    if request.is_json:
        customer_id = body.get('customer_id')
        date = body.get('date')
        description = body.get('description')
        total = body.get('total')

        new_quote = Quote(
            customer_id=customer_id,
            date=date,
            description=description,
            total=total
        )

        db.session.add(new_quote)
        db.session.commit()

        line_items = body.get('quote_items')

        for item in line_items:
            new_quote_item = QuoteItem(
                product_id=item.get('product_id'),
                product_quantity=item.get('product_quantity'),
                product_price=item.get('product_price'),
                quote_id=new_quote.id
            )
            db.session.add(new_quote_item)

        new_transaction = Transaction(
            customer_id=customer_id,
            quote_id=new_quote.id,
            date=date,
            total=total
        )

        db.session.add(new_transaction)
        db.session.commit()

        return make_response('New quote was successfully created', 201)
Exemplo n.º 14
0
def test_add_new_transaction_to_database(test_db, quote_dependencies):
    new_quote = Quote(
        customer_id=1,
        date='01/01/2020',
        description='New quote',
        total=2500
    )

    new_quote_item = QuoteItem(
        product_id=1,
        product_quantity=5,
        product_price=500,
        quote_id=1
    )

    test_db.session.add(new_quote)
    test_db.session.add(new_quote_item)
    test_db.session.commit()

    new_transaction = Transaction(
        customer_id=1,
        quote_id=new_quote.id,
        date=new_quote.date,
        total=new_quote.total
    )

    test_db.session.add(new_transaction)
    test_db.session.commit()

    transaction = Transaction.query\
        .filter(Transaction.customer_id == 1)\
        .filter(Transaction.quote_id == 1)\
        .filter(Transaction.date == new_quote.date)\
        .filter(Transaction.total == new_quote.total)\
        .one_or_none()

    assert transaction is not None
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from src.models import Transaction, Input, Output
from src.utils import *

config.TESTNET = True

sig_hash_type = SIGHASH_ALL

input = Input()
input.tx_id = 'f1c91838e62fd3914b4f5a6aa8ed7905652263491e334ceceff946810987ff8c'.decode('hex')[::-1] # Must be little-endian
input.output_index = 0
input_private_key = wif_to_private_key('cToipAmMoB1EkfTXNbmu2JH4pvG7w6w2EmP7H48HfUommgov9NeQ')
input_public_key = private_key_to_public_key(input_private_key)
input_public_key_hash = public_key_to_public_key_hash(input_public_key)
input.script_sig = build_p2pkh_script_pub_key(input_public_key_hash)

output_public_key_hash = address_to_public_key_hash('msdXvzp45CABWk4yG3oTuYXgZ6VpZRaMPY')
output_script_pub_key = build_p2pkh_script_pub_key(output_public_key_hash)
output = Output(int(5.99e8), output_script_pub_key)

tx = Transaction(inputs=[input], outputs=[output])

sig = input.sign_transaction(tx, input_private_key, sig_hash_type)
input.script_sig = build_p2pkh_script_sig(sig, input_public_key)

print 'Transaction hash:', tx.hash()[::-1].encode('hex')
print 'Raw transaction:'
print tx.data().encode('hex')
Exemplo n.º 16
0
    def dataForProductionStart(self): 
        #Setup initial data for Tim's portfolios as of 7/24/13        
        productionStartDate = Date(month=7,day=25,year=2013)
        
        if not Batch.objects.filter(batchDate=productionStartDate):
            batch = Batch()
            batch.batchDate = productionStartDate
            batch.save()
        
        if not Location.objects.filter(name='Manhasset').exists():
            location = Location()
            location.name = 'Manhasset'
            location.pricingDate = date(month=7,day=25,year=2013)
            location.save()
        
        if not User.objects.filter(username='******').exists():
            #Enter email password
            User.objects.create_user(username='******',email='*****@*****.**',\
                                     password='******')
            
        cmt = User.objects.get(username='******')
        if not UserProfile.objects.filter(user=cmt).exists():
            up2 = UserProfile()
            up2.user = cmt
            up2.location = Location.objects.get(name='Manhasset')
            up2.marketId = 'EOD'
            up2.save()
        #if it exists then make sure Location is Manhasset
        else:
            profile = UserProfile.objects.get(user=cmt)
            profile.location = Location.objects.get(name='Manhasset')
            profile.marketId = 'EOD'
            profile.save()

        #Setup portfolios
        portfolioData = (['401K','cmt'],['ChaseIRA','cmt'],
                         ['TDIRA','cmt'],['TDPostTaxIRA','cmt'],
                         ['Just2Trade','cmt'],['TDEmergency','cmt'])
        for p in portfolioData:
            if not Portfolio.objects.filter(name=p[0],user=p[1]):
                portfolio =Portfolio()
                portfolio.name = p[0]
                portfolio.user = p[1]
                portfolio.save()

        #Setup Equities and Prices as of productionStartDate
        dataSet = (('NEIAX',32.57),('PTTDX',10.78),('EFA',61.06),
                   ('GSG',32.67),('SAN-E',26.7301),('VWO',40.19),
                   ('VNQ', 71.17))
        for data in dataSet:
            if not Equity.objects.filter(ticker=data[0]).exists():
                equity = Equity()
                equity.ticker = data[0]
                equity.assetType = Enum.AssetType('EQUITYUS')
                equity.save()
            equity = Equity.objects.get(ticker=data[0])
            stockPrice = StockPrice()
            stockPrice.equity = equity
            stockPrice.pricingDate = productionStartDate
            stockPrice.marketId = 'EOD'
            stockPrice.mid = data[1]
            stockPrice.save()

        #Setup Bond identifiers and TCBonds as of productionStartDate
        dataSet = (('PortAuth_4.00_JAN42','73358WGG3',Date(month=1,day=15,year=2012),Date(month=1,day=15,year=2042),0.04,),)
        for data in dataSet:
            if not Identifier.objects.filter(name=data[1],type=BondIdentifierType('CUSIP')):
                identifier = Identifier()
                identifier.name = data[1]
                identifier.type = BondIdentifierType('CUSIP')
                identifier.save()
        for data in dataSet:
            if not TCBond.objects.filter(name=data[0]):
                tcBond = TCBond()
                tcBond.name = data[0]
                tcBond.identifiers = Identifier.objects.get(name=data[1],type=BondIdentifierType('CUSIP'))
                tcBond.startDate = data[2].toPythonDate()
                tcBond.endDate = data[3].toPythonDate()
                tcBond.coupon = data[4]
                tcBond.assetType = Enum.AssetType('NYMUNIBOND')
                tcBond.save()
 
        #Setup OAS for production start date
        if not BondOAS.objects.filter(tCBond=TCBond.objects.get(name='PortAuth_4.00_JAN42'), marketId='EOD',pricingDate=productionStartDate):
            bondOAS = BondOAS(tCBond=TCBond.objects.get(name='PortAuth_4.00_JAN42'), marketId='EOD',pricingDate=productionStartDate,mid=0.014)
            bondOAS.save()
            
        #Setup Rates
        fredLoader = FREDLoader.FREDLoader()
        fredLoader.loadLiborCurvesForSpecificDates(marketId='EOD', datesToLoadFor=[productionStartDate])
       
        #Setup transactions 
        dataSet = (('401K','INIT','EQUITY','NEIAX',8758.407),
                    ('401K','INIT','EQUITY','PTTDX',10746.441),
                    ('ChaseIRA','INIT','EQUITY','EFA',633.37038),
                    ('TDIRA','INIT','EQUITY','EFA',47),
                    ('TDIRA','INIT','EQUITY','GSG',610),
                    ('TDIRA','INIT','EQUITY','VWO',1050),
                    ('TDIRA','INIT','CASH','Cash',11151.23),
                    ('TDPostTaxIRA','INIT','EQUITY','EFA',560),
                    ('TDPostTaxIRA','INIT','EQUITY','VNQ',170),
                    ('TDPostTaxIRA','INIT','CASH','Cash',951.33),
                    ('Just2Trade','INIT','EQUITY','GSG',300),
                    ('Just2Trade','INIT','EQUITY','VWO',430),
                    ('TDEmergency','INIT','BOND','PortAuth_4.00_JAN42',100),
                    ('TDEmergency','INIT','CASH','Cash',201.01))
        
        for data in dataSet:
            if not Transaction.objects.filter(portfolio=Portfolio.objects.get(name=data[0]),
                                              transactionType=TransactionType(data[1]),
                                              positionType=PositionType(data[2]),
                                              ticker=data[3],
                                              amount=data[4],
                                              transactionDate = productionStartDate,
                                              effectiveDate = productionStartDate):
                transaction = Transaction()
                transaction.portfolio =Portfolio.objects.get(name=data[0])
                transaction.transactionType = TransactionType(data[1])
                transaction.positionType = PositionType(data[2])
                transaction.ticker = data[3]
                transaction.amount = data[4]
                transaction.transactionDate = productionStartDate
                transaction.effectiveDate = productionStartDate
                transaction.reflectedInPosition = False
                transaction.save()