[finish #31637107] refactored transaction summary code, now considers pending and other transactions
parent
eec03bd568
commit
dfe17f94fa
|
@ -247,11 +247,16 @@ class Campaign(models.Model):
|
|||
return self.target-self.left
|
||||
else:
|
||||
return 0
|
||||
|
||||
def transactions(self, summary=False, pledged=True, authorized=True, incomplete=True, completed=True):
|
||||
|
||||
def update_left(self):
|
||||
p = PaymentManager()
|
||||
return p.query_campaign(campaign=self, summary=summary, pledged=pledged, authorized=authorized, incomplete=incomplete,
|
||||
completed=completed)
|
||||
amount = p.query_campaign(self,summary=True, campaign_total=True)
|
||||
self.left = self.target - amount
|
||||
self.save()
|
||||
|
||||
def transactions(self, **kwargs):
|
||||
p = PaymentManager()
|
||||
return p.query_campaign(self, summary=False, campaign_total=True, **kwargs)
|
||||
|
||||
|
||||
def activate(self):
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
from django.core.management.base import BaseCommand
|
||||
|
||||
import regluit
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = "retotal all campaigns"
|
||||
|
||||
def handle(self, *args, **kwargs):
|
||||
campaigns = regluit.payment.models.Campaign.objects.all()
|
||||
for c in campaigns:
|
||||
c.update_left()
|
||||
print c.left
|
||||
|
|
@ -231,125 +231,98 @@ class PaymentManager( object ):
|
|||
return status
|
||||
|
||||
|
||||
def run_query(self, transaction_list, summary, pledged, authorized, incomplete, completed):
|
||||
def run_query(self, transaction_list, summary=True, campaign_total=False, pledged=False, authorized=False, incomplete=False, completed=False, pending=False, error=False, failed=False, **kwargs):
|
||||
'''
|
||||
Generic query handler for returning summary and transaction info, see query_user, query_list and query_campaign
|
||||
'''
|
||||
|
||||
if pledged:
|
||||
pledged_list = transaction_list.filter(type=PAYMENT_TYPE_INSTANT,
|
||||
status=TRANSACTION_STATUS_COMPLETE)
|
||||
else:
|
||||
pledged_list = []
|
||||
Generic query handler for returning summary and transaction info, see query_user and query_campaign
|
||||
|
||||
if authorized:
|
||||
campaign_total=True includes all payment types which should count towards campaign total
|
||||
|
||||
'''
|
||||
if campaign_total:
|
||||
# must double check when adding Paypal or other
|
||||
# return only ACTIVE transactions with approved=True
|
||||
authorized_list = transaction_list.filter(type=PAYMENT_TYPE_AUTHORIZATION,
|
||||
status=TRANSACTION_STATUS_ACTIVE,
|
||||
approved=True)
|
||||
else:
|
||||
authorized_list = []
|
||||
list = transaction_list.filter(type=PAYMENT_TYPE_AUTHORIZATION,
|
||||
approved=True).exclude(status=TRANSACTION_STATUS_CANCELED)
|
||||
list = list | transaction_list.filter(type=PAYMENT_TYPE_INSTANT,
|
||||
status=TRANSACTION_STATUS_COMPLETE)
|
||||
else:
|
||||
list = Transaction.objects.none()
|
||||
if pledged:
|
||||
list = list | transaction_list.filter(type=PAYMENT_TYPE_INSTANT,
|
||||
status=TRANSACTION_STATUS_COMPLETE)
|
||||
|
||||
if incomplete:
|
||||
incomplete_list = transaction_list.filter(type=PAYMENT_TYPE_AUTHORIZATION,
|
||||
status=TRANSACTION_STATUS_INCOMPLETE)
|
||||
else:
|
||||
incomplete_list = []
|
||||
|
||||
if completed:
|
||||
completed_list = transaction_list.filter(type=PAYMENT_TYPE_AUTHORIZATION,
|
||||
status=TRANSACTION_STATUS_COMPLETE)
|
||||
else:
|
||||
completed_list = []
|
||||
|
||||
if authorized:
|
||||
# return only ACTIVE transactions with approved=True
|
||||
list = list | transaction_list.filter(type=PAYMENT_TYPE_AUTHORIZATION,
|
||||
status=TRANSACTION_STATUS_ACTIVE,
|
||||
approved=True)
|
||||
if incomplete:
|
||||
list = list | transaction_list.filter(type=PAYMENT_TYPE_AUTHORIZATION,
|
||||
status=TRANSACTION_STATUS_INCOMPLETE)
|
||||
if completed:
|
||||
list = list | transaction_list.filter(type=PAYMENT_TYPE_AUTHORIZATION,
|
||||
status=TRANSACTION_STATUS_COMPLETE)
|
||||
if pending:
|
||||
list = list | transaction_list.filter(type=PAYMENT_TYPE_AUTHORIZATION,
|
||||
status=TRANSACTION_STATUS_PENDING)
|
||||
if error:
|
||||
list = list | transaction_list.filter(type=PAYMENT_TYPE_AUTHORIZATION,
|
||||
status=TRANSACTION_STATUS_ERROR)
|
||||
if failed:
|
||||
list = list | transaction_list.filter(type=PAYMENT_TYPE_AUTHORIZATION,
|
||||
status=TRANSACTION_STATUS_FAILED)
|
||||
if summary:
|
||||
pledged_amount = D('0.00')
|
||||
authorized_amount = D('0.00')
|
||||
incomplete_amount = D('0.00')
|
||||
completed_amount = D('0.00')
|
||||
|
||||
for t in pledged_list:
|
||||
for r in t.receiver_set.all():
|
||||
#
|
||||
# Currently receivers are only used for paypal, so keep the paypal status code here
|
||||
#
|
||||
if r.status == IPN_SENDER_STATUS_COMPLETED:
|
||||
# or IPN_SENDER_STATUS_COMPLETED
|
||||
# individual senders may not have been paid due to errors, and disputes/chargebacks only appear here
|
||||
pledged_amount += r.amount
|
||||
|
||||
for t in authorized_list:
|
||||
authorized_amount += t.amount
|
||||
|
||||
for t in incomplete_list:
|
||||
incomplete_amount += t.amount
|
||||
|
||||
for t in completed_list:
|
||||
completed_amount += t.amount
|
||||
|
||||
amount = pledged_amount + authorized_amount + incomplete_amount + completed_amount
|
||||
amount = D('0.00')
|
||||
for t in list:
|
||||
if t.type==PAYMENT_TYPE_INSTANT:
|
||||
for r in t.receiver_set.all():
|
||||
#
|
||||
# Currently receivers are only used for paypal, so keep the paypal status code here
|
||||
#
|
||||
if r.status == IPN_SENDER_STATUS_COMPLETED:
|
||||
# or IPN_SENDER_STATUS_COMPLETED
|
||||
# individual senders may not have been paid due to errors, and disputes/chargebacks only appear here
|
||||
amount += r.amount
|
||||
else:
|
||||
amount += t.amount
|
||||
|
||||
return amount
|
||||
|
||||
else:
|
||||
return pledged_list | authorized_list | incomplete_list | completed_list
|
||||
return list
|
||||
|
||||
def query_user(self, user, summary=False, pledged=True, authorized=True, incomplete=True, completed=True):
|
||||
def query_user(self, user, **kwargs):
|
||||
'''
|
||||
query_user
|
||||
|
||||
Returns either an amount or list of transactions for a user
|
||||
|
||||
summary: if true, return a float of the total, if false, return a list of transactions
|
||||
pledged: include amounts pledged
|
||||
authorized: include amounts pre-authorized
|
||||
incomplete: include amounts for transactions with INCOMPLETE status
|
||||
completed: include amounts for transactions that are COMPLETED
|
||||
|
||||
return value: either a float summary or a list of transactions
|
||||
Note: this method appears to be unused.
|
||||
|
||||
'''
|
||||
|
||||
transactions = Transaction.objects.filter(user=user)
|
||||
return self.run_query(transactions, summary, pledged, authorized, incomplete=True, completed=True)
|
||||
return self.run_query(transactions, **kwargs)
|
||||
|
||||
def query_campaign(self, campaign, summary=False, pledged=True, authorized=True, incomplete=True, completed=True):
|
||||
def query_campaign(self, campaign, **kwargs ):
|
||||
'''
|
||||
query_campaign
|
||||
|
||||
Returns either an amount or list of transactions for a campaign
|
||||
|
||||
summary: if true, return a float of the total, if false, return a list of transactions
|
||||
pledged: include amounts pledged
|
||||
authorized: include amounts pre-authorized
|
||||
incomplete: include amounts for transactions with INCOMPLETE status
|
||||
completed: includes payments that have been completed
|
||||
|
||||
return value: either a float summary or a list of transactions
|
||||
|
||||
|
||||
'''
|
||||
|
||||
transactions = Transaction.objects.filter(campaign=campaign)
|
||||
return self.run_query(transactions, summary, pledged, authorized, incomplete, completed)
|
||||
return self.run_query(transactions, **kwargs)
|
||||
|
||||
|
||||
def query_list(self, list, summary=False, pledged=True, authorized=True, incomplete=True, completed=True):
|
||||
'''
|
||||
query_list
|
||||
|
||||
Returns either an amount or list of transactions for a list
|
||||
|
||||
summary: if true, return a float of the total, if false, return a list of transactions
|
||||
pledged: include amounts pledged
|
||||
authorized: include amounts pre-authorized
|
||||
incomplete: include amounts for transactions with INCOMPLETE status
|
||||
completed: includes payments that have been completed
|
||||
|
||||
return value: either a float summary or a list of transactions
|
||||
|
||||
'''
|
||||
|
||||
transactions = Transaction.objects.filter(list=list)
|
||||
return self.run_query(transactions, summary, pledged, authorized, incomplete, completed)
|
||||
|
||||
def execute_campaign(self, campaign):
|
||||
'''
|
||||
|
|
|
@ -150,26 +150,16 @@ import regluit.payment.manager
|
|||
|
||||
def handle_transaction_change(sender, instance, created, **kwargs):
|
||||
campaign = instance.campaign
|
||||
|
||||
if campaign:
|
||||
p = regluit.payment.manager.PaymentManager()
|
||||
amount = p.query_campaign(campaign=instance.campaign,summary=True)
|
||||
instance.campaign.left=instance.campaign.target - amount
|
||||
instance.campaign.save()
|
||||
|
||||
campaign.update_left()
|
||||
return True
|
||||
|
||||
# handle any deletes of payment.Transaction
|
||||
|
||||
def handle_transaction_delete(sender, instance, **kwargs):
|
||||
campaign = instance.campaign
|
||||
|
||||
if campaign:
|
||||
p = regluit.payment.manager.PaymentManager()
|
||||
amount = p.query_campaign(campaign=instance.campaign,summary=True)
|
||||
instance.campaign.left=instance.campaign.target - amount
|
||||
instance.campaign.save()
|
||||
|
||||
campaign.update_left()
|
||||
return True
|
||||
|
||||
post_save.connect(handle_transaction_change,sender=Transaction)
|
||||
|
|
|
@ -328,7 +328,7 @@ class TransactionTest(TestCase):
|
|||
t.save()
|
||||
|
||||
p = PaymentManager()
|
||||
results = p.query_campaign(campaign=c)
|
||||
results = p.query_campaign(c,campaign_total=True, summary=False)
|
||||
self.assertEqual(results[0].amount, D('12.34'))
|
||||
self.assertEqual(c.left,c.target-D('12.34'))
|
||||
|
||||
|
|
Loading…
Reference in New Issue