Пример #1
0
def editSecurityTransaction(request, transaction_id=None):
    transaction = None
    portfolio_id = request.session.get('p_id')
    BUYING = True
    # get object if id provided.    
    if transaction_id is not None:
        transaction = get_object_or_404(Transaction, pk=transaction_id)
        # share price in dollars.
        transaction.unit_price = transaction.dollarize(transaction.unit_price)
        transaction.commission = transaction.dollarize(transaction.commission)
        transaction.symbol = transaction.security.symbol
        # commission in dollars.
        
    if request.method == 'POST':
        # form submitted.
        new_transaction_form = SecurityTransactionForm(request.POST, instance=transaction)
        if new_transaction_form.is_valid():
            if newSecurity.type.name == "Sell":
                BUYING = False            
            
            new_transaction = new_transaction_form.save(commit=False)
            new_transaction.portfolio = Portfolio.objects.get(pk=portfolio_id)
            
            securityObj, created = Security.objects.get_or_create(symbol=symbol)
            new_transaction.portfolio = portfolio
            new_transaction.security = securityObj
            new_transaction.unit_price = new_transaction.centicize(new_transaction.unit_price)
            new_transaction.amount = new_transaction.units * new_transaction.unit_price
            new_transaction.commission = new_transaction.centicize(new_transaction.commission)
            
            if new_transaction.commission > 0:
                if BUYING:
                    new_transaction.amount += new_transaction.commission
                else:
                    new_transaction.amount -= new_transaction.commission
            
            new_transaction.save()
            
            # update holding.
            count = PortfolioHolding.objects.filter(portfolio=portfolio, securities=new_transaction.security).count()
            if count == 0:
                ph = PortfolioHolding(portfolio=portfolio, securities=securityObj, held=new_transaction.units, average_price=new_transaction.unit_price, last_price=new_transaction.unit_price)
                print 'created new ph'
            else:
                ph = PortfolioHolding.objects.get(portfolio=portfolio, securities=new_transaction.security)
                #ph.updateHolding(newSecurity)
            ph.save()
            
            # update cash
            cash_obj, created = Security.objects.get_or_create(symbol='CASH')
            c_count = PortfolioHolding.objects.filter(portfolio=portfolio, securities=cash_obj).count()
            if c_count == 0:
                ch = PortfolioHolding()
                ch.portfolio = portfolio
                ch.securities = cash_obj
                ch.average_price = 100
                ch.last_price = 100
                if BUYING:
                    ch.held = -new_transaction.amount
            else:
                ch = PortfolioHolding.objects.get(portfolio=portfolio, securities=cash_obj)
                print 'previously held:', ch.held
                if BUYING:
                    ch.held -= new_transaction.amount
                    print 'after buying:', new_transaction.amount, ": ", ch.held
                else:
                    ch.held += new_transaction.amount
                    print 'after selling:', new_transaction.amount, ": ", ch.held

            ch.save()
            return HttpResponseRedirect('/tracker/portfolios/'+portfolio_id)
    else:
        #empty form        
        if transaction is None:
            form = SecurityTransactionForm(instance=transaction)
        else:
            form = SecurityTransactionForm(symbol=transaction.symbol, instance=transaction)
                               
    return render_to_response('manager/addSecurityTransaction.html', {'form':form, 'p_id':portfolio_id},context_instance=RequestContext(request))
Пример #2
0
def addSecurityTransaction(request, portfolio_id):
    # add new security
    # update average price.
    BUYING = True
    if not request.POST:
        form = SecurityTransactionForm()
        return render_to_response('manager/addSecurityTransaction.html', {'form':form, 'p_id':portfolio_id},context_instance=RequestContext(request))
    
    ajax_return = {}
    success = False
    
    newForm = SecurityTransactionForm(request.POST)
    if newForm.is_valid():
        try:
            portfolio = Portfolio.objects.get(pk=portfolio_id)
            newSecurity = newForm.save(commit=False)

            if newSecurity.type.name == "Sell":
                BUYING = False
            
            symbol = string.upper(newForm.cleaned_data['symbol'])
            securityObj, created = Security.objects.get_or_create(symbol=symbol)
            newSecurity.portfolio = portfolio
            newSecurity.security = securityObj
            newSecurity.unit_price = newSecurity.centicize(newSecurity.unit_price)
            newSecurity.amount = newSecurity.units * newSecurity.unit_price
            newSecurity.commission = newSecurity.centicize(newSecurity.commission)
            
            if newSecurity.commission > 0:
                if BUYING:
                    newSecurity.amount += newSecurity.commission
                else:
                    newSecurity.amount -= newSecurity.commission
            
            newSecurity.save()
            
            # update holding.
            count = PortfolioHolding.objects.filter(portfolio=portfolio, securities=newSecurity.security).count()
            if count == 0:
                ph = PortfolioHolding(portfolio=portfolio, securities=securityObj, held=newSecurity.units, average_price=newSecurity.unit_price, last_price=newSecurity.unit_price)
                print 'created new ph'
            else:
                ph = PortfolioHolding.objects.get(portfolio=portfolio, securities=newSecurity.security)
                #ph.updateHolding(newSecurity)
            ph.save()
            
            # update cash
            cash_obj, created = Security.objects.get_or_create(symbol='CASH')
            c_count = PortfolioHolding.objects.filter(portfolio=portfolio, securities=cash_obj).count()
            if c_count == 0:
                ch = PortfolioHolding()
                ch.portfolio = portfolio
                ch.securities = cash_obj
                ch.average_price = 100
                ch.last_price = 100
                if BUYING:
                    ch.held = -newSecurity.amount
            else:
                ch = PortfolioHolding.objects.get(portfolio=portfolio, securities=cash_obj)
                print 'previously held:', ch.held
                if BUYING:
                    ch.held -= newSecurity.amount
                    print 'after buying:', newSecurity.amount, ": ", ch.held
                else:
                    ch.held += newSecurity.amount
                    print 'after selling:', newSecurity.amount, ": ", ch.held

            ch.save()
            success = True
            msg = u"Added new transaction. %s %d shares of %s!" %( newSecurity.type.name, newSecurity.units, newSecurity.security.symbol)
            ajax_return['ok'] = success
            ajax_return['msg'] = msg
        except:
            success = False;
            ajax_return['msg'] = u"Cannot add transaction."
            ajax_return['ok'] = success
    else:
        ajax_return['msg'] = u"Required Fields Missing."
        
    if request.is_ajax():
        serialized = simplejson.dumps(ajax_return)
        if success:
            return HttpResponse(serialized, mimetype="application/json")
        else:
            return HttpResponseServerError(serialized, mimetype="application/json")
    else:
        if success:
            print "success..."
            return HttpResponseRedirect('/tracker/portfolios/'+portfolio_id)
        else:
            print "failed..."
            return render_to_response('manager/addSecurityTransaction.html', {'form':newForm,'p_id':portfolio_id}, context_instance=RequestContext(request))
Пример #3
0
def add_transaction(request):
    """
    add transaction to portfolio
    """
    portfolio_id = request.session.get('p_id')
    # print 'portfolio:', portfolio_id
    if request.method == 'POST':
        # form submit so must have tried to added.
        security_obj = None
        tran_type_id = request.POST['type']
        tran_type = TransactionType.objects.get(pk=tran_type_id)
        errors = False
        form = None
        #portfolio = Portfolio.objects.get(pk=portfolio_id)
        if tran_type.name in ('Buy', 'Sell'):
            # security transaction
            s_tran = SecurityTransactionForm(request.POST)
            form = s_tran
            if s_tran.is_valid():
                new_tran = s_tran.save(commit=False)
                new_tran.set_values_in_cents() # also calculates amount
                if tran_type.name == 'Buy':
                    new_tran.amount += new_tran.commission
                elif tran_type.name == 'Sell':
                    new_tran.amount -= new_tran.commission
                else:
                    print "unknown transaction type"

                # get portfolios and securities.
                portfolio = Portfolio.objects.get(pk=portfolio_id)
                symbol = string.upper(s_tran.cleaned_data['symbol'])
                security_obj, c = Security.objects.get_or_create(symbol=symbol)
                new_tran.portfolio = portfolio
                new_tran.security = security_obj
                new_tran.save()
                #get cash in dollars to update to holding.
                cash = new_tran.amount
                if tran_type.name == 'Buy':
                    cash = -cash
                update_cash_holding(portfolio, cash)
            else:
                errors = True
        elif tran_type.name in ('Deposit', 'Withdraw'):
            # print 'cash transaction'
            s_tran = CashTransactionForm(request.POST)
            form = s_tran
            if s_tran.is_valid():
                new_tran = s_tran.save(commit=False)
                new_tran.units = new_tran.amount
                new_tran.unit_price = 1
                new_tran.set_values_in_cents() #also calculates amount
                
                security_obj, c = Security.objects.get_or_create(symbol='CASH')
                portfolio = Portfolio.objects.get(pk=portfolio_id)
                new_tran.portfolio = portfolio
                new_tran.security = security_obj
                new_tran.save()
                cash = new_tran.amount
                print 'new_tran amount', cash
                if tran_type.name == 'Withdraw':
                    cash = -cash
                update_cash_holding(portfolio, cash)
                # check cash here
            else:
                errors = True
        if not errors:
            update_holdings(portfolio, security_obj)
            return HttpResponsePermanentRedirect('/tracker/portfolios/summary/')
        else:
            return render_to_response('manager/portfolio/add_transaction.html',
                                      {'form':form, 'type':tran_type},
                                      context_instance=RequestContext(request)
                                     )        
    else:
        # print 'GET'
        transaction_type = None
        user_id = request.user.id;
        redirect_to_summary = "/tracker/portfolios/summary/"
        try:
            if portfolio_id != int(request.GET['pid']):
                return HttpResponseRedirect(redirect_to_summary)
            transaction_type = request.GET['type']
        except:
            return HttpResponseRedirect(redirect_to_summary)

        # ok have what we need.
        # does this p_id belong to this user? 
        try:
            portfolio = Portfolio.objects.get(pk=portfolio_id, user=user_id)
        except Portfolio.DoesNotExist:
            return HttpResponseRedirect(redirect_to_summary)
        
        form = None
        if transaction_type == 'cash':
            form = CashTransactionForm()
        elif transaction_type == 'security':
            form = SecurityTransactionForm()

        return render_to_response('manager/portfolio/add_transaction.html',
                                  {'form':form, 'type':transaction_type},
                                  context_instance=RequestContext(request)
                                 )