def payment_process(request): order_id = request.session.get('order_id') order = get_object_or_404(Order, id=order_id) paystack_total = int(order.get_total_cost() * 100) data_key = settings.PAYSTACK_PUBLIC_KEY data_email = request.user.email if request.method == 'POST': try: payment = Payment() payment.paystack_id = request.POST['paystack-trxref'] payment.customer = request.user payment.amount = order.get_total_cost() payment.save() order.paid = True order.ref = request.POST['paystack-trxref'] order.amount = payment order.save() except ObjectDoesNotExist: pass return redirect('payment:success') context = { 'order': order, 'paystack_total': paystack_total, 'data_key': data_key, 'data_email': data_email, } return render(request, 'payment/process.html', context)
def add_payment(data, db_session, username): logger.info(LogMsg.START, username) model_instance = Payment() populate_basic_data(model_instance, username) logger.debug(LogMsg.POPULATING_BASIC_DATA) model_instance.person_id = data.get('person_id') model_instance.amount = data.get('amount') model_instance.agent = data.get('agent') model_instance.details = data.get('details') model_instance.details.update({'call_back_url': data.get('call_back_url')}) model_instance.order_details = data.get('order_details') model_instance.shopping_key = data.get('shopping_key') model_instance.reference_code = data.get('reference_code') model_instance.used = False model_instance.status = 'SendToBank' db_session.add(model_instance) logger.debug(LogMsg.DB_ADD, model_to_dict(model_instance)) return model_instance
def parse_file(filename): log.info("parse file {}".format(filename)) tree = ET.parse(filename) root = tree.getroot() payments = [] ns = {'pf': 'urn:iso:std:iso:20022:tech:xsd:camt.053.001.04'} def find_or_empty(transaction, name): e = transaction.find(".//pf:{}".format(name), ns) return e.text if e is not None else "" for transaction in root.findall(".//pf:Ntry", ns): # check if transaction id is valid transaction exists already -> skip transaction_id = find_or_empty(transaction, 'AcctSvcrRef') only_zero_regex = re.compile(r"^0*$") if only_zero_regex.match(transaction_id): log.warning("A transaction of file {} has an invalid transaction ID: {}".format(filename, transaction_id)) continue log.info("processing transaction {}".format(transaction_id)) payments_count = Payment.objects.filter(transaction_id=transaction_id).count() if payments_count > 0: log.warning( "transaction {} in file {} already exists in database".format(transaction_id, filename)) continue payment = Payment() # for IBAN transactions payment.bic = find_or_empty(transaction, 'BICFI') payment.iban = find_or_empty(transaction, 'DbtrAcct') # unique reference number by postfinance payment.transaction_id = transaction_id payment.amount = float(find_or_empty(transaction, 'Amt') or 0.0) payment.currency_code = transaction.find('.//pf:Amt', ns).get('Ccy') # Credit or Debit credit_debit = find_or_empty(transaction, 'CdtDbtInd') if credit_debit == 'CRDT': payment.credit_debit = Payment.CreditDebit.CREDIT elif credit_debit == 'DBIT': payment.credit_debit = Payment.CreditDebit.DEBIT else: payment.credit_debit = Payment.CreditDebit.UNKNOWN # remittance user string payment.remittance_user_string = find_or_empty(transaction, 'AddtlNtryInf') user_data = ISO2022Parser.parse_user_string(payment.remittance_user_string) if user_data is not None: payment.name = user_data['name'] payment.address = "{}, {} {}".format(user_data['street'], user_data['plz'], user_data['city']) payment.remittance_user_string = user_data['note'] payment.state = Payment.State.NEW # postal_address = debitor.find(".//pf:PstlAdr",ns) # if postal_address: # addresses = debitor.findall(".//pf:AdrLine", ns) # payment.address = ", ".join([adr.text for adr in addresses]) payment.date = datetime.today() # TODO not exactly elegant payment.filename = os.path.split(filename)[-1] payments.append(payment) log.info('Detected payment: {}'.format(payment)) return payments