Esempio n. 1
0
def save_credit_card_response(billing_agreement_response, payment_id):
    """ Function to save credit card response """
    try:
        payment_token = payment_id
        plans = Subscription.get_all()
        if 'id' in billing_agreement_response:
            pdobj = PaymentDetail(
                amount=plans.subscription_price,
                subscription_id=plans.id,
                payment_status='Success',
                payment_date=func.now(),
                billing_aggrement_id=billing_agreement_response.id,
                payment_token=payment_token,
                payment_mode='credit_card')
            db.session.add(pdobj)
            db.session.commit()

            pobj = Payment(user_id=current_user.id,
                           payment_detail_id=pdobj.id,
                           created_at=func.now(),
                           updated_at=func.now())
            db.session.add(pobj)

            current_user.payment_status = True
            db.session.commit()
            return True

    except Exception as err:
        errorlog.error('Credit Card response Error', details=str(err))
        return render_template('error.html', message="Error!")
Esempio n. 2
0
def create_order():
    data = request.get_json(force=True)
    user_id = data.get("user_id")
    item_id = data.get("item_id")
    shipping_addr = date.get("shipping_addr")
    total_amt = data.get("total_amt")
    pdate = datetime.now()

    user = User.query.filter_by(user_id=user_id).first()
    if user is None:
        abort(404, "No user found with specified ID")

    if (
        user_id is None
        or item_id is None
        or shipping_addr == ""
        or total_amt is None
        or pdate is None
    ):
        abort(400, "Cannot have empty fields for payment")

    new_payment = Payment(
        user_id=user_id,
        item_id=item_id,
        shipping_addr=shipping_addr,
        total_amt=total_amt,
        pdate=pdate,
    )

    db.session.add(new_item)
    db.session.commit()
    return jsonify(new_item.serialize)
Esempio n. 3
0
    def post(self, request):
        # Create order
        body = parse_body(request)
        user = User.objects.get(id=body['user'])
        products = [{
            "instance": Product.objects.get(id=product["id"]),
            "options": product["options"],
        } for product in body["products"]]
        order = Order(user=user, )
        order.save()
        for product in products:
            order.products.add(product["instance"])
        payment = Payment(
            order=order,
            method='Credit card',
            value=self.sum_products_prices(products),
        )
        payment.save()
        charge = stripe.Charge.create(
            amount=self.format_price(self.sum_products_prices(products)),
            currency='usd',
            description='Order #' + str(order.id),
            customer=user.creditcard.customer_id,
        )
        response = {"id": order.id, "total": payment.value}

        return JsonResponse(response, status=201)
Esempio n. 4
0
def processPayment(id):
    order = Order.query.get_or_404(request.form.get("id"))
    if order.entry != current_user.entry:
        abort(403)

    if order.status != OrderStatus.incomplete:
        flash(
            "You can't modify an order that has been completed, or has a payment pending",
            "danger",
        )
        return redirect(url_for("orders.viewOrder", id=order.id))

    payment = order.payment if order.payment else Payment(order=order)
    method = request.form.get("method")

    if method == "online":
        payment.method = PaymentMethod.stripe
        payment.fee = math.ceil(((order.subtotal * 0.014) + 0.20) * 100) / 100

    elif method == "bank":
        payment.method = PaymentMethod.BACS
        payment.fee = 0

    elif method == "cheque":
        payment.method = PaymentMethod.cheque
        payment.fee = 0

    else:
        flash("Invalid payment method selected", "danger")
        return redirect(url_for("orders.addPaymentToOrder", id=order.id))

    db.session.add(payment)
    db.session.commit()

    return redirect(url_for("orders.completePayment", id=order.id))
Esempio n. 5
0
def upload():
	if request.method == 'POST':
	# check if the post request has the file part
		if 'file' not in request.files:
			flash('No file part')
			return redirect(request.url)
		file = request.files['file']
		# if user does not select file, browser also
		# submit an empty part without filename
		if file.filename == '':
			flash('No selected file')
			return redirect(request.url)
		if file and allowed_file(file.filename):
			filename = secure_filename(file.filename)
			filepath = os.path.join(UPLOAD_FOLDER, filename)
			file.save(filepath)
			# if not process_bank_statement(filepath):
			# 	return "Are you sure you uploaded a bank statement? SpendAnalyzer was not able to parse it."
			messages = filepath
			df = parser.parse_bank_statement(filepath)
			categorize.categorize(df)
			for index, row in df.iterrows():
				p = Payment(date=row.Date, desc=row.Desc, amount=row.Amount, balance=row.Balance, category=row.Category)
				db.session.add(p)
			db.session.commit()
			return redirect(url_for('.dashboard'))
			# return redirect(request.url)
	return render_template("start.html")
Esempio n. 6
0
def order():
    if (request.form.get('pay')):
        if not request.form.getlist('productlist'):
            error = "Please select the product!"
            contexts = dict(cid=request.form.get('pay'))
            return render_template("products.html", error=error, **contexts)
        else:
            global totalprice
            totalprice = 0
            cid = request.form.get('pay')
            value = request.form.getlist('productlist')
            ename = []
            global price
            price = []
            for i in range(len(value)):
                totalprice = totalprice + float(value[i])
            print "totalprice", totalprice
            newcid = json.loads(cid)
            pay = Payment(newcid, totalprice)
            db.session.add(pay)
            db.session.commit()
            payments = Payment.query.all()
            print payments
            context = dict(totalprice=totalprice)
            return render_template("members.html",
                                   key=stripe_keys['publishable_key'],
                                   **context)
Esempio n. 7
0
def db_add_order(amount, currency, description):
    """add order to database"""
    new_payment = Payment(description=description,
                          amount=amount,
                          currency=currency)
    db.session.add(new_payment)
    db.session.commit()
    shop_order_id = Payment.query.all()[-1].id
    return shop_order_id
Esempio n. 8
0
def payments_in_group(group_id):
    group = Group.query.get_or_404(group_id)
    can_confirm = current_user.is_master
    if 'submit' in request.form:
        for month_number in range(group.start_month, group.end_month + 1):
            ps = group.payments_in_month(month_number)
            payments = dict()
            for p in ps:
                payments[p.student_in_group_id] = p
            for student_in_group in group.students_in_group_in_month(month_number):
                new_value = request.form.get('p_{}_{}'.format(month_number, student_in_group.id), 0, type=int)
                if new_value < 0: new_value = 0
                max_value = group.section.price - student_in_group.discount
                if new_value > max_value: new_value = max_value
                payment = payments.get(student_in_group.id)
                is_cash = 'cash_{}_{}'.format(month_number, student_in_group.id) in request.form
                is_confirmed = 'conf_{}_{}'.format(month_number, student_in_group.id) in request.form
                comment = request.form.get('comment_{}_{}'.format(month_number, student_in_group.id), '')
                if payment is not None:
                    if not payment.confirmed:
                        payment.value = new_value
                        payment.cash = is_cash
                        payment.comment = comment
                    if can_confirm: payment.confirmed = is_confirmed
                else:
                    db.session.add(Payment(student_in_group=student_in_group, month=month_number, value=new_value,
                                           cash=is_cash, confirmed=can_confirm and is_confirmed, comment=comment))
        flash('оплата в группе {} сохранена.'.format(group.name))
        return redirect(url_for('payments.payments_in_group', group_id=group_id))
    pd = payments_info(group)
    total_payments = 0
    confirmed_payments = 0
    non_zero_payments = 0
    students_in_month = dict()
    for month_number in range(group.start_month, group.end_month + 1):
        students_count = group.students_in_group_in_month(month_number).count()
        total_payments += students_count
        confirmed_payments += pd.confirmed_count_months[month_number]
        non_zero_payments += pd.non_zero_count_months[month_number]
        students_in_month[month_number] = students_count
    if current_user.is_teacher:
        sum_not_confirmed_by_group = get_sum_not_confirmed_by_group(current_user.teacher.id)
        sum_not_confirmed_all = get_sum_not_confirmed_teacher(current_user.teacher.id)
    else:
        sum_not_confirmed_by_group = None
        sum_not_confirmed_all = None
    students_in_group = group.students_in_group_by_fio.all()
    return render_template('payments/payments_in_group.html', group=group, students_in_group=students_in_group,
                           payments=pd.values, confirmed=pd.confirmed, cash=pd.cash, comments=pd.comments,
                           confirmed_count_months=pd.confirmed_count_months,
                           confirmed_count_students=pd.confirmed_count_students,
                           non_zero_count_months=pd.non_zero_count_months,
                           non_zero_count_students=pd.non_zero_count_students, total_payments=total_payments,
                           confirmed_payments=confirmed_payments, non_zero_payments=non_zero_payments,
                           students_in_month=students_in_month, can_confirm=can_confirm,
                           sum_not_confirmed_by_group=sum_not_confirmed_by_group,
                           sum_not_confirmed_all=sum_not_confirmed_all)
Esempio n. 9
0
def payBillForm():
    form = PayBillForm()
    allCards = Card.query.all()
    cards = []
    for card in allCards:
        if card.cardHolderRef == current_user.id:
            cards.append(card)
    if form.validate_on_submit():
        mycard = request.form.get('card')
        mycard = mycard.split(",")
        amount = float(form.amount.data) * 100
        str(amount)
        payment = {
            "amount": form.amount.data,
            "description": form.description.data,
            "card": {
                "number": mycard[0],
                "cvv": mycard[1],
                "expMonth": mycard[2],
                "expYear": mycard[3]
            }
        }
        ###############Add payment to it's database here#########
        dbpayment = Payment(company="Utility",
                            amount=form.amount.data,
                            description=form.description.data,
                            paymentMakerRef=current_user.id,
                            paymentCardRef=mycard[0])
        db.session.add(dbpayment)
        db.session.commit()
        ###############Add payment to it's database here#########
        payment = simplify.Payment.create(payment)
        # card = Card(addressState=form.addressState.data,expMonth=form.expMonth.data, expYear=form.expYear.data,
        # 	addressCity=form.addressCity.data,addressZip=form.addressZip.data,cvv=form.cvv.data, number=form.number.data)

        flash('Payment was succesfully!')
        amount = form.amount.data
        #sms(amount)

        user = Customer.query.get(current_user.id)
        email = user.email
        send_email('Payment Recieved', [email],
                   render_template("payment_email.html", fname=user.fname))

        return redirect(url_for('index'))
    return render_template('payBillForm.html',
                           title='Pay Bill',
                           form=form,
                           cards=cards)
Esempio n. 10
0
def create_payment_checkout(bus_id):
    bus = Bus.query.filter_by(id=bus_id).first()
    create_passenger_booking_form = CreatePassengerBookingForm(
        data=request.form, bus=bus)

    profile = None
    if current_user.is_authenticated:
        profile = current_user.profile

    if create_passenger_booking_form.validate_on_submit():
        # create payment checkout
        data = create_passenger_booking_form.data
        grid_id = data.get("grid_id")
        pricing_id = data.get("pricing_id")
        passenger_name = data.get("passenger_name")
        passenger_email = data.get("passenger_email")
        telephone_code = data.get("telephone_code")
        passenger_telephone = data.get("passenger_telephone")
        telephone = join_telephone(telephone_code, passenger_telephone)

        grid = Grid.query.filter_by(id=grid_id).first()
        pricing = Pricing.query.filter_by(id=pricing_id).first()

        app_charge = round(pricing.price * app.config.get("APP_CHARGE"))

        payment = Payment(amount=pricing.price,
                          app_charge=app_charge,
                          method="ONLINE",
                          passenger_name=passenger_name,
                          passenger_email=passenger_email,
                          passenger_telephone=telephone,
                          grid_number=grid.number,
                          bus_number=bus.number,
                          bus_id=bus.id,
                          grid_id=grid.id,
                          company=bus.company,
                          profile=profile,
                          journey=bus.journey,
                          pricing=pricing)

        db.session.add(payment)
        db.session.commit()
        return redirect(url_for('payment.get_payment', payment_id=payment.id))

    return render_template(
        "bus/passenger-bus.html",
        bus=bus,
        create_passenger_booking_form=create_passenger_booking_form)
Esempio n. 11
0
def create_payments_for_all_students(group):
    for month_number in range(group.start_month, group.end_month + 1):
        payment_exist_student_in_group_ids = [
            p.student_in_group_id
            for p in group.payments_in_month(month_number)
        ]

        for student_in_group in group.students_in_group_in_month(month_number):
            if student_in_group.id not in payment_exist_student_in_group_ids:
                db.session.add(
                    Payment(student_in_group=student_in_group,
                            month=month_number,
                            value=0,
                            cash=True,
                            confirmed=False,
                            comment=""))
    db.session.commit()
Esempio n. 12
0
def execute():
    """ Function to execute plan after redirecting from paypal site after
    customer agreement """
    try:
        configure_paypal()
        payment_token = request.args.get('token', '')
        billing_agreement_response = BillingAgreement.execute(payment_token)
        plans = Subscription.get_all()
        action = url_for('userbp.dashboard')
        billing_action = url_for('paymentbp.billing')
        if 'id' in billing_agreement_response:
            pdobj = PaymentDetail(
                amount=plans.subscription_price,
                subscription_id=plans.id,
                payment_status='Success',
                payment_date=func.now(),
                billing_aggrement_id=billing_agreement_response.id,
                payment_token=payment_token,
                payment_mode='paypal')
            db.session.add(pdobj)
            db.session.commit()
            user_id = current_user.id

            if 'app_user_id' in session:
                user_id = session['app_user_id']
                session.pop('app_user_id')
                action = url_for('userbp.dashboard', userid=user_id)
                billing_action = url_for('paymentbp.billing', userid=user_id)
            pobj = Payment(user_id=user_id,
                           payment_detail_id=pdobj.id,
                           created_at=func.now(),
                           updated_at=func.now())
            db.session.add(pobj)
            get_user = User.by_id(int(user_id))
            get_user.payment_status = True
            db.session.commit()
            flash(PLAN_EXECUTED, 'success')
            return redirect(action)
        else:
            flash(PLAN_EXECUTED_ERROR, 'danger')
            return redirect(billing_action)
    except Exception as err:
        errorlog.error('Subscribe Error', details=str(err))
        return render_template('error.html', message="Error!")
Esempio n. 13
0
def add_payment():
    persons = Person.objects.all()
    payments = PaymentType.objects.all()
    payers = Payer.objects.all()
    for person in persons:
        # С вероятностью 10% он ничего не получает
        if random.randint(0, 10) >= 9:
            continue
        # А тут получает
        for i in range(random.randint(10, 30)):
            pay = Payment()
            pay.person = person
            pay.payment_sum = random.randint(500, 10000)
            pay.payer = random.choice(payers)
            pay.payment_type = random.choice(payments)
            pay.payment_date = datetime.datetime(year=random.choice(
                (2015, 2016, 2017, 2018)),
                                                 month=random.randint(1, 12),
                                                 day=random.randint(1, 27))
            pay.save()
Esempio n. 14
0
def create_payment(booking):
    grid = booking.booked_grid
    bus = grid.bus
    company = bus.company
    branch = get_current_branch()
    payment = Payment(reference=generate_reference(),
                      amount=booking.fare,
                      method="CASH",
                      passenger_name=booking.passenger_name,
                      passenger_telephone=booking.passenger_telephone,
                      branch_name=branch.name,
                      company_name=company.name,
                      grid_number=grid.number,
                      bus_number=bus.number,
                      company=company,
                      bus=bus,
                      journey=bus.journey,
                      pricing=booking.pricing,
                      grid_id=grid.id)
    booking.payment = payment
    db.session.add(payment)
Esempio n. 15
0
def pay(identifier):
    try:
        payment = Payment(
            main=request.form['main'],
            interest=request.form['interest'],
            payment_date=datetime.strptime(request.form['payment_date'],
                                           "%Y-%m-%d"),
            notes=request.form['notes'],
            debtor_id=identifier,
        )

        db.session.add(payment)
        db.session.commit()

        response = jsonify({"success": True})
        response.status_code = 200
    except Exception as e:
        db.session.rollback()
        print(e)

        response = jsonify({"success": False})
        response.status_code = 500

    return response
Esempio n. 16
0
def create_stub_models():
    create_system_roles()
    create_default_citizenships()
    create_schedule_times()
    create_developer()
    create_bot()

    role_master = SystemRole.query.filter_by(name=role_master_name).first()
    user_master = SystemUser(login='******',
                             password='******',
                             system_role=role_master,
                             enabled=True)
    master = Master(fio='Руководитель Иван Иванович', system_user=user_master)
    db.session.add(user_master)
    db.session.add(master)

    role_teacher = SystemRole.query.filter_by(name=role_teacher_name).first()
    user_teacher = SystemUser(login='******',
                              password='******',
                              system_role=role_teacher,
                              enabled=True)
    teacher = Teacher(fio='Учитель Петр Петрович',
                      system_user=user_teacher,
                      phone='89012223344')
    db.session.add(user_teacher)
    db.session.add(teacher)

    school = School(name='школа №42')

    role_student = SystemRole.query.filter_by(name=role_student_name).first()
    user_student = SystemUser(login='******',
                              password='******',
                              system_role=role_student,
                              enabled=True)
    student = Student(fio='Ученик Алексей Алексеевич',
                      system_user=user_student,
                      birth_place='birth place',
                      birth_date='2002-08-31',
                      registration_place='reg place',
                      actual_address='act addr',
                      citizenship_id=1,
                      school=school,
                      grade='1',
                      shift=1,
                      contact_phone=contact_phone_student,
                      phone='89023334455')
    db.session.add(user_student)
    db.session.add(student)

    section1 = Section(name='робо', price=800)
    section2 = Section(name='веб', price=900)
    db.session.add(section1)
    db.session.add(section2)

    group = Group(name='робо-71',
                  section=section1,
                  teacher=teacher,
                  start_month=8,
                  end_month=16)
    db.session.add(group)
    db.session.add(
        Group(name='веб-61',
              section=section2,
              teacher=teacher,
              start_month=8,
              end_month=16))

    student_in_group = StudentInGroup(student=student,
                                      group=group,
                                      discount=100,
                                      enter_month=8,
                                      exit_month=16)
    db.session.add(student_in_group)
    db.session.add(
        Payment(student_in_group=student_in_group,
                month=9,
                value=400,
                comment='comment'))

    db.session.commit()
Esempio n. 17
0
def lessons_in_month(group_id, month_number):
    group = Group.query.get_or_404(group_id)
    if month_number < group.start_month or month_number > group.end_month:
        abort(404)
    month_name = get_month_name(month_number)
    students_in_group = group.students_in_group_in_month(month_number) \
        .join(Student, Student.id == StudentInGroup.student_id) \
        .order_by(Student.fio) \
        .all()
    if 'submit' in request.form:
        if not can_user_write_group(current_user, group): abort(403)
        ls = Lesson.lessons_in_group_in_month(group_id, month_number).all()
        ps = Payment.query \
            .join(StudentInGroup, StudentInGroup.id == Payment.student_in_group_id) \
            .filter(StudentInGroup.group_id == group_id, Payment.month == month_number)
        payments = dict()
        for p in ps:
            payments[p.student_in_group_id] = p
        for student_in_group in students_in_group:
            new_value = request.form.get('p_{}'.format(student_in_group.id),
                                         0,
                                         type=int)
            if new_value < 0: new_value = 0
            max_value = group.section.price - student_in_group.discount
            if new_value > max_value: new_value = max_value
            payment = payments.get(student_in_group.id)
            is_cash = 'c_{}'.format(student_in_group.id) in request.form
            comment = request.form.get(
                'comment_{}'.format(student_in_group.id), '')
            if payment is not None:
                if not payment.confirmed:
                    payment.value = new_value
                    payment.cash = is_cash
                    payment.comment = comment
            else:
                db.session.add(
                    Payment(student_in_group=student_in_group,
                            month=month_number,
                            value=new_value,
                            cash=is_cash,
                            comment=comment))
            attendings = dict()
            for l in ls:
                attendings[l.id] = dict()
                for a in l.attendings:
                    attendings[l.id][a.student_id] = a
            for l in ls:
                attending = attendings[l.id].get(student_in_group.student_id)
                a_key = 'a_{}_{}'.format(l.id, student_in_group.student_id)
                new_state = request.form.get(a_key,
                                             attending_was_not,
                                             type=int)
                if attending is not None:
                    attending.state = new_state
                else:
                    db.session.add(
                        Attending(lesson=l,
                                  student=student_in_group.student,
                                  state=new_state))
        flash('посещения и оплата в группе {} за {} сохранены.'.format(
            group.name, month_name))
        return redirect(
            url_for('lessons.lessons_in_month',
                    group_id=group_id,
                    month_number=month_number))
    pd = payments_in_month_info(group_id, month_number)
    ll = lessons_lists(group_id, month_number)
    return render_template('lessons/lessons_in_month.html',
                           group=group,
                           month_number=month_number,
                           month_name=month_name,
                           students_in_group=students_in_group,
                           payments=pd.values,
                           confirmed=pd.confirmed,
                           cash=pd.cash,
                           comments=pd.comments,
                           lessons=ll[0],
                           attendings_states=ll[1],
                           write_mode=can_user_write_group(
                               current_user, group))
Esempio n. 18
0
    def post(self):
        data = json.loads(request.data)

        if data.get('pay_amount') is None:
            return make_response(
                jsonify({"error": {
                    "message": "BAD REQUEST"
                }}), 400)

        if data.get('pay_currency') not in CURRENCY:
            return make_response(
                jsonify({"error": {
                    "message": "BAD REQUEST"
                }}), 400)

        pay = Payment(pay_amount=data.get('pay_amount'),
                      pay_currency=data.get('pay_currency'),
                      description=data.get('description'))
        db.session.add(pay)
        db.session.commit()

        # Required data set for sending
        send_data = dict()

        if pay.pay_currency == 'EUR':
            send_data['amount'] = str(pay.pay_amount)
            send_data['currency'] = str(CURRENCY_CODE.get(pay.pay_currency))
            send_data['description'] = pay.description
            send_data['shop_id'] = str(SHOP_ID)
            send_data['shop_order_id'] = str(pay.id)
            send_data['sign'] = make_sign(EUR_PARAMS, send_data)
            send_data['url'] = URL_EN_PAY

            # Save logs
            pay_log_save(pay.id, json.dumps(send_data))
            logging.info(f'EUR -- send_data: {send_data}')

            return make_response(jsonify(send_data), 200)

        if pay.pay_currency == 'USD':
            send_data['payer_currency'] = str(
                CURRENCY_CODE.get(pay.pay_currency))
            send_data['shop_amount'] = str(pay.pay_amount)
            send_data['shop_currency'] = str(
                CURRENCY_CODE.get(pay.pay_currency))
            send_data['shop_id'] = str(SHOP_ID)
            send_data['shop_order_id'] = str(pay.id)
            send_data['sign'] = make_sign(USD_PARAMS, send_data)

            # send data
            resp = sender(send_data, URL_BILL_CRATE)
            logging.info(f'USD -- sender: {send_data}')

            # Save logs
            pay_log_save(pay.id, json.dumps(send_data), json.dumps(resp))
            logging.info(f'USD -- send_data: {send_data}')

            if resp.get('error'):
                return make_response(resp)

            return make_response(jsonify({"url": resp.get('url')}), 200)

        if pay.pay_currency == 'RUB':
            send_data['amount'] = str(pay.pay_amount)
            send_data['currency'] = str(CURRENCY_CODE.get(pay.pay_currency))
            send_data['payway'] = PAYWAY
            send_data['shop_id'] = str(SHOP_ID)
            send_data['shop_order_id'] = str(pay.id)
            send_data['sign'] = make_sign(RUB_PARAMS, send_data)

            # send data
            resp = sender(send_data, URL_INVOICE_CRATE)
            logging.info(f'RUB -- sender: {send_data}')

            # save logs
            pay_log_save(pay.id, json.dumps(send_data), json.dumps(resp))
            logging.info(f'RUB -- send_data: {send_data}')

            if resp.get('error'):
                return make_response(resp)

            response = jsonify({
                "data": resp.get('data'),
                "method": resp.get('method'),
                "url": resp.get('url')
            })
            return make_response(response, 200)
    def payments(loan_id):
        request_data = request.get_json()

        if re.match(loan_id_re, loan_id) is None:
            response = jsonify({"error": "Specified loan id is not valid"})
            response.status_code = 400
            return response

        try:
            validate(request_data, schemas["payment"])
        except ValidationError as validation_error:
            return generate_error_message(validation_error.message, 400)

        date = ciso8601.parse_datetime(request_data["date"])

        if date is None:
            return generate_error_message("Specified date doesn't follow the ISO8601 norm", 400)

        if date.tzinfo is None or date.tzinfo.utcoffset(date) is None:
            date = date.replace(tzinfo=pytz.UTC)

        db_loan = Loan.get_loan(loan_id)

        if db_loan is None:
            return generate_error_message("Specified loan id doesn't exist", 400)

        db_loan_installment = Loan.calculate_loan_payment(db_loan.rate, db_loan.term, db_loan.amount)

        if request_data["amount"] != db_loan_installment:
            return generate_error_message(
                "Specified amount is not equal to monthly installment of {}".format(db_loan_installment), 400)

        db_loan_payments = Payment.get_loan_payments(loan_id)

        if len(db_loan_payments) != 0:
            made_payments = []

            for payment in db_loan_payments:
                if payment.payment == "made":
                    made_payments.append(payment)

            if len(made_payments) == db_loan.term:
                return generate_error_message("This loan has already been paid", 409)

            db_loan_last_payment = db_loan_payments[-1]
            months = relativedelta.relativedelta(date, db_loan_last_payment.date).months
            if abs(months) < 1:
                return generate_error_message(
                    "Payments work in a monthly base. Since last payment {} one month hasn't passed".format(
                        db_loan_last_payment.date), 409)

        request_data = request.get_json()

        payment = request_data["payment"]
        amount = request_data["amount"]
        payment = Payment(id=str(uuid.uuid4()), loan_id=loan_id, payment=payment, date=date, amount=amount)
        payment.save()

        response = jsonify({"message": "Payment successful"})
        response.status_code = 201
        return response
Esempio n. 20
0
def get_new_payments(project_id):
    # Loop over all monetary accounts (i.e., all IBANs belonging to one
    # Bunq account)
    for monetary_account in get_all_monetary_account_active(project_id):
        new_payments_count = 0
        new_payments = True
        payments = None
        # Use a while loop because of pagination; stop when we find a
        # payment that already exists in our database or if no new
        # payments are found or in case of an error
        while new_payments:
            # Retrieve payments from Bunq
            try:
                if payments:
                    params = payments.pagination.url_params_previous_page
                else:
                    params = {'count': 10}

                # Bunq allows max 3 requests per 3 seconds
                sleep(1)
                payments = endpoint.Payment.list(
                    monetary_account_id=monetary_account._id_, params=params)
            except Exception as e:
                app.logger.error(
                    "Getting Bunq payments resulted in an exception:\n" +
                    repr(e))
                new_payments = False
                continue

            if not payments.value:
                new_payments = False
                continue

            # Save payments to database
            for full_payment in payments.value:
                try:
                    payment = _transform_payment(full_payment)
                except Exception as e:
                    app.logger.error(
                        "Transforming a Bunq payment resulted in an exception:\n"
                        + repr(e))
                    new_payments = False
                    continue
                try:
                    existing_payment = Payment.query.filter_by(
                        bank_payment_id=payment['bank_payment_id']).first()

                    if existing_payment:
                        new_payments = False
                    else:
                        project = Project.query.filter_by(
                            iban=payment['alias_value']).first()
                        if project:
                            payment['project_id'] = project.id

                        subproject = Subproject.query.filter_by(
                            iban=payment['alias_value']).first()
                        if subproject:
                            payment['subproject_id'] = subproject.id

                        # Remove these values that sometimes occur in Bunq
                        # payments as we don't use them
                        if 'scheduled_id' in payment:
                            del payment['scheduled_id']

                        if 'batch_id' in payment:
                            del payment['batch_id']

                        p = Payment(**payment)
                        p.route = 'subsidie'
                        db.session.add(p)
                        db.session.commit()
                        new_payments_count += 1
                except Exception as e:
                    app.logger.error(
                        "Saving a Bunq payment resulted in an exception:\n" +
                        repr(e))
                    new_payments = False
                    continue

            if not payments.pagination.has_previous_page():
                new_payments = False

        # Log the number of retrieved payments
        iban = ''
        iban_name = ''
        for alias in monetary_account._alias:
            if alias._type_ == 'IBAN':
                iban = alias._value
                iban_name = alias._name
        app.logger.info('Project %s: retrieved %s payments for %s (%s)' %
                        (project_id, new_payments_count, iban, iban_name))
Esempio n. 21
0
def payment_converter(arg):
    identifier = [item.value for item in Payment if item.value[0] == arg][0]
    return Payment(identifier).value[1]
Esempio n. 22
0
def ipn():

    arg = ''
    request.parameter_storage_class = ImmutableOrderedMultiDict
    values = request.form

    for x, y in values.items():
        arg += "&{x}={y}".format(x=x, y=y)


    validate_url = 'https://www.sandbox.paypal.com' \
        '/cgi-bin/webscr?cmd=_notify-validate{arg}' \
        .format(arg=arg)

    r = requests.get(validate_url)

    if r.text == 'VERIFIED':

        payer_email = request.form.get('payer_email')
        unix = ctime()
        payment_date = request.form.get('payment_date')
        username = request.form.get('first_name')
        last_name = request.form.get('last_name')
        payment_gross = request.form.get('mc_gross')
        payment_fee = request.form.get('mc_fee')
        payment_net = float(payment_gross) - float(payment_fee)
        payment_status = request.form.get('payment_status')
        txn_id = request.form.get('txn_id')

        payment = Payment(payer_email=payer_email,
                          unix=unix,
                          payment_date=payment_date,
                          username=username,
                          last_name=last_name,
                          payment_gross=payment_gross,
                          payment_fee=payment_fee,
                          payment_net=payment_net,
                          payment_status=payment_status,
                          txn_id=txn_id)
        db.session.add(payment)
        db.session.commit()

        send_email(
            "Payment from the website",
            ['*****@*****.**', '*****@*****.**'], """
Divaexplorer Order Summary

Dear %s,

Thank you for choosing Divaexplorer. Here's a summary of your order.

Order Details

Order Date: %s                                       Payment Source: Paypal
Transaction ID: %s                                       Initial Charge: %s
                                                         Final Cost: %s
                                                         Item Type:

                                                         TOTAL:	%s

For any concern. Please Contact us via [email protected].


Regards,
Team Divaexplorer
https://www.divaexplorer-tvj.co.uk/

London, UK


""" % (username + " " + last_name, unix, txn_id, "£" + payment_gross,
        "£" + payment_gross, "£" + payment_gross))

        with open('/tmp/ipnout.txt', 'a') as f:
            data = 'SUCCESS\n' + str(values) + '\n'
            f.write(data)

    else:
        with open('/tmp/ipnout.txt', 'a') as f:
            data = 'FAILURE\n' + str(values) + '\n'
            f.write(data)

    return r.text
Esempio n. 23
0
def receiver():
    try:
        data = request.get_json()
        if not data:
            return make_response(
                jsonify({
                    'message': "No data received",
                    'status': -2
                })), 401

        sender, amount, date = data.get('sender', ''), data.get(
            'amount', 'Ksh0.00'), data.get('date', '0')
        phone, _id = data['phone'], data['id']

        if not phone:
            return make_response(
                jsonify({
                    'message': "No phone number received",
                    "status": -3
                })), 401
        if not _id:
            return make_response(
                jsonify({
                    'message': "No MPESA code received",
                    "status": -3
                })), 401
        if not amount:
            return make_response(
                jsonify({
                    'message': "No amount received",
                    "status": -3
                })), 401

        if not date or int(date) == 0:
            date = datetime.now()
        else:
            date = datetime.fromtimestamp(int(date) / 1000.0)
            print(date)

        if sender == 'Sample sender':
            return make_response(jsonify({'message': "Success", "status": 0}))

        _user = User.query.filter_by(
            telephone=process_telephone(phone)).first()
        if not _user:
            return make_response(
                jsonify({
                    'message': 'User not registered',
                    "status": -4
                })), 401

        payment = Payment.query.filter(Payment.code == _id).first()
        if payment:
            return make_response(
                jsonify({
                    'message': "MPESA transaction already saved",
                    "status": -5
                })), 401

        price = float(amount.split("h")[-1])
        if not price:
            return make_response(
                jsonify({
                    'message': "No amount received",
                    "status": -6
                })), 401

        if price >= 5.0:
            payment = Payment(code=_id,
                              sender=sender,
                              creation_date=date,
                              amount=amount,
                              source=phone)
            try:
                # Add record to database
                db.session.add(payment)
                # Save changes to db
                db.session.commit()
            except Exception as err:
                print(err)
                db.session.rollback()
                return ({
                    'message': 'unable to save payment. Please contact admin',
                    'status': 1
                }), 401
        else:
            return make_response(
                jsonify({
                    'message': "1000/= needed for internet connection",
                    "status": -7
                })), 401
        return make_response(jsonify({'message': "Success", "status": 0}))
    except Exception as err:
        print(err)
        return make_response(
            jsonify({
                'message': "Error receiving MPESA response",
                "status": -1
            })), 401