Beispiel #1
0
def ticket(ticket, random, product, sig1, sig2):
    if random is None:
        random = ticket & 0xffffffff
        ticket = ObjectId('%024x' % (ticket >> 32))

    accounting.templating.formatters.apply(current_app.jinja_env, 'datetime')

    autovoid = bool(json.loads(request.cookies.get('autovoid', 'false')) or
                    request.values.get('autovoid'))

    with ReadonlyContext(g.database) as ctx:
        ticket = blm.members.Ticket._query(id=ticket, random=random).run()
        if not ticket:
            resp = make_response(
                render_template('ticket.html', ticket=None,
                                canvoid=bool(g.user), autovoid=autovoid))
            resp.set_cookie('autovoid', json.dumps(autovoid), path='/ticket',
                            expires=time.time() + 24 * 3600)
            return resp

        ticket, = ticket

        if 'print' in request.values:
            return redirect(url_for('getTicket', ticket=ticket.id[0],
                                    random=base64long.encode(ticket.random[0])))

        canvoid = False
        voided = False
        if g.user:
            canvoid = ticket.canWrite(g.user, 'void')
            if canvoid:
                if 'unvoid' in request.values:
                    interested = 'ticket-unvoid-%s' % ObjectId()
                    with CommitContext(g.database, g.user) as ctx:
                        op = CallToi(ticket.id[0], 'unvoid', [])
                        ctx.runCommit([op], interested)
                    result, error = wait_for_commit(g.database, interested)
                    if error:
                        raise error
                elif autovoid or 'void' in request.values:
                    interested = 'ticket-void-%s' % ObjectId()
                    with CommitContext(g.database, g.user) as ctx:
                        op = CallToi(ticket.id[0], 'void', [])
                        ctx.runCommit([op], interested)
                    result, error = wait_for_commit(g.database, interested)
                    voided = result[0][0]
                    if error:
                        raise error

        resp = make_response(
            render_template(
                'ticket.html', ticket=ticket, canvoid=canvoid,
                autovoid=autovoid, voided=voided,
                ticket_url=url_for('ticket_simple', _external=True)
            )
        )
        resp.set_cookie('autovoid', json.dumps(autovoid), path='/ticket',
                        expires=time.time() + 24 * 3600)
        return resp
Beispiel #2
0
def process_file(database, fname):
    if PYT3:
        with open(fname, 'r', encoding='iso-8859-1') as f:
            data = f.read()
    else:
        with open(fname, 'r') as f:
            data = f.read()

    interested_id = ObjectId()

    with CommitContext(database) as ctx:
        interested = 'import-payment-%s' % interested_id
        op = CreateToi('members.PGPaymentFile',
                       None,
                       attrData=dict(fileName=[os.path.basename(fname)],
                                     data=[data]))
        ctx.runCommit([op], interested=interested)
        (toid, ), error = wait_for_commit(database, interested=interested)
        if error:
            raise error

    with CommitContext(database) as ctx:
        interested = 'process-payment-file-%s' % interested_id
        op = CallToi(toid, 'process', [])
        ctx.runCommit([op], interested=interested)
        _, error = wait_for_commit(database, interested=interested)
        if error:
            raise error

    with ReadonlyContext(database):
        for paymentFile in blm.members.PGPaymentFile._query(id=toid).run():
            for payment in paymentFile.payments:
                paymentId = payment.id[0]
                interested = 'match-payment-%s-%s' % (interested_id, paymentId)
                with CommitContext(database) as ctx:
                    op = CallToi(paymentId, 'match', [])
                    ctx.runCommit([op], interested)
                _, error = wait_for_commit(database, interested=interested)
                if error:
                    raise error

    with ReadonlyContext(database):
        for payment in blm.members.PGPayment._query(paymentFile=toid).run():
            paymentId = payment.id[0]
            interested = 'send-payment-confirmation-%s-%s' % (paymentId,
                                                              ObjectId())
            with CommitContext(database) as ctx:
                op = CallToi(paymentId, 'sendConfirmationEmail', [])
                ctx.runCommit([op], interested)
            _, error = wait_for_commit(database, interested=interested)
            if error:
                raise error

    archive_file(fname)
def process_file(database, fname):
    if PYT3:
        with open(fname, 'r', encoding='iso-8859-1') as f:
            data = f.read()
    else:
        with open(fname, 'r') as f:
            data = f.read()

    print('Processing file ', fname)

    interested_id = ObjectId()

    with CommitContext(database) as ctx:
        interested = 'import-bgcreport-%s' % interested_id
        op = CreateToi('accounting.BgcReport',
                       None,
                       attrData=dict(filename=[os.path.basename(fname)],
                                     multiline=[data]))
        ctx.runCommit([op], interested=interested)
        (toid, ), error = wait_for_commit(database, interested=interested)
        if error:
            raise error

    with CommitContext(database) as ctx:
        interested = 'process-bgc-report-{}', interested_id
        op = CallToi(toid, 'process_data', [])
        ctx.runCommit([op], interested=interested)
        _, error = wait_for_commit(database, interested=interested)
        if error:
            raise error
Beispiel #4
0
def process(database):
    with ReadonlyContext(database):
        for order in blm.accounting.PGOrder._query(sent=[False]).run():
            with CommitContext.clone() as ctx:
                op = CallToi(order.id[0], 'send', [])
                interested = 'sendpg-%s' % ObjectId()
                ctx.runCommit([op], interested)
                result, error = wait_for_commit(database, interested)
                if error:
                    raise error
Beispiel #5
0
def poll(database, providerId, purchaseId, invoiceRef):
    client, context, seqr_protocol = get_client_and_context(providerId,
                                                            purchaseId,
                                                            database=database)
    response = call_method(client.service.getPaymentStatus, context,
                           invoiceRef)

    if response.resultCode == 0 and response.status == 'PAID':
        with CommitContext(database) as ctx:
            purchase, = blm.members.BasePurchase._query(id=purchaseId).run()
            op = CreateToi(
                'members.SeqrPayment', None,
                dict(paymentProvider=[providerId],
                     matchedPurchase=[purchase],
                     amount=[response.receipt.invoice.totalAmount.value],
                     paymentDate=[
                         datetime_to_epoch(response.receipt.paymentDate)
                     ],
                     invoiceReference=[response.receipt.invoiceReference],
                     ersReference=[response.ersReference],
                     paymentReference=[response.receipt.paymentReference],
                     payerTerminalId=[response.receipt.payerTerminalId],
                     receiverName=[
                         r for r in [response.receipt.receiverName] if r
                     ]))
            interested = 'seqr-%s' % ObjectId()
            commit = ctx.runCommit([op], interested=interested)

        result, error = wait_for_commit(database, interested=interested)
        if error:
            raise error

        receiptDoc = client.factory.create('ns0:receiptDocument')
        receiptDoc.mimeType = 'text/plain'
        receiptDoc.receiptData = ''
        receiptDoc.receiptType = ''

        receipt_response = call_method(client.service.submitPaymentReceipt,
                                       context, response.ersReference,
                                       receiptDoc)

        paymentId = result[0]

        with CommitContext(database) as ctx:
            op = CallToi(paymentId, 'sendConfirmationEmail', [])
            interested = 'send-seqr-payment-confirmation-%s' % ObjectId()
            commit = ctx.runCommit([op], interested=interested)
        result, error = wait_for_commit(database, interested=interested)
        if error:
            raise error

    return jsonify({
        'resultCode': response.resultCode,
        'status': response.status
    })
Beispiel #6
0
def acceptInvitation(user, code):
    with ReadonlyContext(g.database):
        q = blm.accounting.Invitation._query(inviteCode=code)
        for invitation in q.run():
            user, = blm.accounting.User._query(id=user.id).run()
            op = CallToi(invitation.id[0], 'accept', [[user]])
            interested = ObjectId()
            with CommitContext.clone() as ctx:
                ctx.runCommit([op], interested=interested)
            result, error = wait_for_commit(g.database, interested)
            if error:
                return redirect(url_for('invitation_expired'))
Beispiel #7
0
def update_payment(token, database, purchase=None, provider=None):
    log.info('Payson update')

    with ReadonlyContext(database):
        if blm.members.PaysonPayment._query(token=token).run():
            log.info('Payment %s already registered, aborting.', token)
            return
        if not provider:
            purchase, = blm.members.Purchase._query(id=purchase,
                                                    _attrList=['org']).run()
            provider = blm.accounting.PaysonProvider._query(
                org=purchase.org).run()[0]

        api = payson.PaysonApi(provider.apiUserId[0], provider.apiPassword[0])

    payData = api.payment_details(token)

    if payData.status == 'COMPLETED':
        with CommitContext(database) as ctx:
            purchase, = blm.members.Purchase._query(
                id=payData.trackingId).run()
            op = CreateToi(
                'members.PaysonPayment', None,
                dict(paymentProvider=[provider],
                     matchedPurchase=[purchase],
                     amount=[payData.receiverList[0].amount],
                     purchaseId=[payData.purchaseId],
                     senderEmail=[payData.senderEmail],
                     token=[payData.token],
                     receiverFee=[payData.receiverFee],
                     receiverEmail=[payData.receiverList[0].email],
                     type=[payData.type]))
            interested = 'payson-%s' % ObjectId()
            commit = ctx.runCommit([op], interested=interested)

        result, error = wait_for_commit(database, interested=interested)
        if error:
            raise error
        paymentId = result[0]

        with CommitContext(database) as ctx:
            op = CallToi(paymentId, 'sendConfirmationEmail', [])
            interested = 'send-payson-payment-confirmation-%s' % ObjectId()
            commit = ctx.runCommit([op], interested=interested)
        result, error = wait_for_commit(database, interested=interested)
        if error:
            raise error
Beispiel #8
0
def invite():
    # xxx this shares a lot of code with accountingImport - think about generalising
    orgId = request.form['org']

    interested = ObjectId()
    with CommitContext(g.database, g.user) as ctx:
        org, = blm.accounting.Org._query(id=orgId).run()
        ctx.setMayChange(True)
        email = request.form['email']
        roles = request.form.getlist('roles')
        op = CallToi(ObjectId(orgId), 'invite', [[email], roles])
        ctx.runCommit([op], interested=interested)
    result, errors = wait_for_commit(g.database, interested=interested)
    assert not errors, errors

    result = {'success': True}
    return jsonify(**result)
Beispiel #9
0
def getTickets(purchase, random=None):
    database = g.database.client.get_database(
        g.database.name,
        read_preference=pymongo.ReadPreference.PRIMARY)

    interested = 'get-tickets-%s' % ObjectId()
    with CommitContext(database) as ctx:
        toi, = blm.members.BasePurchase._query(id=purchase, random=random).run()
        op = CallToi(toi.id[0], 'maketickets', [])
        ctx.runCommit([op], interested=interested)
    result, error = wait_for_commit(database, interested)
    if error:
        raise error
    pdf = io.BytesIO()
    with ReadonlyContext(database) as ctx:
        tickets = blm.members.Ticket._query(id=result[0]).run()
        members.ticket.generate(pdf, tickets)

    return Response(response=pdf.getvalue(), mimetype='application/pdf')
Beispiel #10
0
def simulatePayment(provider, purchase):
    interested = 'simulatePayment-%s' % ObjectId()
    amount = request.values['amount']
    with CommitContext(g.database, g.user) as ctx:
        op = CallBlm('members', 'generateFakePayment',
                     [[provider], [purchase], [amount]])
        ctx.runCommit([op], interested=interested)
    result, error = wait_for_commit(g.database, interested)
    if error:
        raise error

    paymentId = result[0]
    with CommitContext(g.database) as ctx:
        op = CallToi(paymentId, 'sendConfirmationEmail', [])
        interested = 'send-sim-payment-confirmation-%s' % ObjectId()
        ctx.runCommit([op], interested=interested)
    result, error = wait_for_commit(g.database, interested=interested)
    if error:
        raise error

    return redirect(request.values['returnurl'])
Beispiel #11
0
            (61, 80, 'T')], LBRejectedParser.payment_record_plusgiro),
    '25': ([(1, 80, 'T')], LBRejectedParser.faulty_record),
    '26': ([(1, 80, 'T')], LBRejectedParser.faulty_record),
    '27': ([(1, 80, 'T')], LBRejectedParser.faulty_record),
    '65': ([(1, 80, 'T')], LBRejectedParser.faulty_record),
    'LB': ([(1, 80, 'T')], LBRejectedParser.faulty_record),
    '49': ([(3, 6, 'T'), (7, 10, 'T'),
            (11, 80, 'T')], LBRejectedParser.rejection_comment_record),
    '29': ([(3, 12, 'A'), (13, 20, 'I')], LBRejectedParser.end_record),
}

if __name__ == '__main__':
    import sys
    import accounting.db
    import members
    import blm.members
    database = accounting.db.connect()

    from pytransact.commit import CommitContext, CallToi
    with CommitContext(database) as ctx:
        ctx.setMayChange(True)
        pfile = blm.members.PGPaymentFile(data=sys.stdin, fileName='string')
        toid = pfile.id[0]
        pfile.process()
        ctx.runCommit([])

    with CommitContext(database) as ctx:
        for payment in blm.members.PGPaymentFile._query(id=toid).run():
            op = CallToi(toid, 'match', [])
            ctx.runCommit([op])