spaceport/apiserver/import_missing_paypal.py

187 lines
5.3 KiB
Python
Executable File

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.')