You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
186 lines
5.3 KiB
186 lines
5.3 KiB
import django, sys, os |
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'apiserver.settings' |
|
django.setup() |
|
|
|
import datetime |
|
import json |
|
from apiserver.api import models, old_models, utils |
|
|
|
def find_name(t): |
|
try: |
|
p_info = t['payer_info'] |
|
except KeyError: |
|
return 'Unknown Name' |
|
try: |
|
return p_info['payer_name']['given_name'] + ' ' + p_info['payer_name']['surname'] |
|
except KeyError: |
|
pass |
|
try: |
|
return t['shipping_info']['name'] |
|
except KeyError: |
|
pass |
|
try: |
|
return p_info['payer_name']['alternate_full_name'] |
|
except KeyError: |
|
return 'Unknown Name' |
|
|
|
def build_tx(t): |
|
t_info = t['transaction_info'] |
|
p_info = t['payer_info'] |
|
amount = float(t_info['transaction_amount']['value']) |
|
return dict( |
|
account_type='PayPal', |
|
amount=amount, |
|
date=t_info['transaction_updated_date'].split('T')[0], |
|
info_source='PayPal IPN', |
|
payment_method='PayPal', |
|
paypal_payer_id=t_info['paypal_account_id'], |
|
paypal_txn_id=t_info['transaction_id'], |
|
reference_number=t_info['transaction_id'], |
|
memo=t_info.get('transaction_subject', 'no memo') + ' (import missing paypal script)', |
|
) |
|
|
|
def create_unmatched_member_tx(t): |
|
t_info = t['transaction_info'] |
|
p_info = t['payer_info'] |
|
transactions = models.Transaction.objects |
|
|
|
report_memo = 'Cant link sender name, {}, email: {}, note: {}'.format( |
|
find_name(t), |
|
p_info['email_address'], |
|
'(import missing paypal script)', |
|
) |
|
|
|
return transactions.create( |
|
**build_tx(t), |
|
report_memo=report_memo, |
|
report_type='Unmatched Member', |
|
) |
|
|
|
def create_member_dues_tx(t, member, num_months): |
|
transactions = models.Transaction.objects |
|
|
|
# new member 3 for 2 will have to be manual anyway |
|
if num_months == 11: |
|
num_months = 12 |
|
|
|
user = getattr(member, 'user', None) |
|
|
|
tx = transactions.create( |
|
**build_tx(t), |
|
member_id=member.id, |
|
number_of_membership_months=num_months, |
|
user=user, |
|
) |
|
utils.tally_membership_months(member) |
|
return tx |
|
|
|
def create_unmatched_purchase_tx(t, member): |
|
t_info = t['transaction_info'] |
|
p_info = t['payer_info'] |
|
transactions = models.Transaction.objects |
|
|
|
user = getattr(member, 'user', None) |
|
report_memo = 'Unknown payment reason, {}, email: {}, note: {}'.format( |
|
find_name(t), |
|
p_info['email_address'], |
|
'(import missing paypal script)', |
|
) |
|
|
|
return transactions.create( |
|
**build_tx(t), |
|
member_id=member.id, |
|
report_memo=report_memo, |
|
report_type='Unmatched Purchase', |
|
user=user, |
|
) |
|
|
|
|
|
PAYPAL_FOLDER = 'missing_paypal/' |
|
|
|
transactions = models.Transaction.objects.all() |
|
hints = models.PayPalHint.objects.all() |
|
members = models.Member.objects.all() |
|
|
|
paypal_files = os.listdir(PAYPAL_FOLDER) |
|
paypal_json = [x for x in paypal_files if x.endswith('.json')] |
|
|
|
if paypal_json: |
|
print('Found paypal json files:', paypal_json) |
|
else: |
|
print('Couldnt find any paypal json files in', PAYPAL_FOLDER) |
|
exit(1) |
|
|
|
paypal_txs = [] |
|
num_unmatched = 0 |
|
num_dues = 0 |
|
num_noreason = 0 |
|
|
|
for filename in paypal_json: |
|
with open(PAYPAL_FOLDER + filename) as f: |
|
j = json.load(f) |
|
paypal_txs.extend(j['transaction_details']) |
|
|
|
print('Num transactions found:', len(paypal_txs)) |
|
print('Importing transactions into portal...') |
|
|
|
for t in paypal_txs: |
|
t_info = t['transaction_info'] |
|
|
|
account_id = t_info.get('paypal_account_id', None) |
|
if not account_id: |
|
print('Skipping tx id: {}, no payer (could be bank tx):'.format( |
|
t_info['transaction_id'], |
|
)) |
|
print(t_info) |
|
print() |
|
continue |
|
|
|
reference = t_info['transaction_id'][:11] |
|
|
|
similar = transactions.filter(reference_number__startswith=reference) |
|
if similar.exists(): |
|
tx = similar.first() |
|
print('Skipping tx id: {}, transaction already in portal:'.format( |
|
t_info['transaction_id'], |
|
)) |
|
print('https://spaceport.dns.t0.vc/transactions/'+str(tx.id)) |
|
print() |
|
continue |
|
|
|
print('Inspecting tx id:', t_info['transaction_id']) |
|
|
|
if not hints.filter(account=t_info['paypal_account_id']).exists(): |
|
print('Unable to associate with member, reporting') |
|
create_unmatched_member_tx(t) |
|
num_unmatched += 1 |
|
continue |
|
|
|
amount = float(t_info['transaction_amount']['value']) |
|
|
|
member_id = hints.get(account=t_info['paypal_account_id']).member_id |
|
member = members.get(id=member_id) |
|
print('Found member', member.first_name, member.last_name) |
|
monthly_fees = member.monthly_fees |
|
|
|
if amount.is_integer() and monthly_fees and amount % monthly_fees == 0: |
|
num_months = int(amount // monthly_fees) |
|
else: |
|
num_months = 0 |
|
|
|
if num_months: |
|
print('Amount valid for membership dues, adding months:', num_months) |
|
create_member_dues_tx(t, member, num_months) |
|
num_dues += 1 |
|
continue |
|
|
|
print('Unable to find a reason for payment, reporting') |
|
create_unmatched_purchase_tx(t, member) |
|
num_noreason += 1 |
|
|
|
|
|
print('Num unmatched members:', num_unmatched) |
|
print('Num member dues:', num_dues) |
|
print('Num no reason:', num_noreason) |
|
print('Num skipped:', len(paypal_txs) - num_unmatched - num_dues - num_noreason) |
|
print('Done.')
|
|
|