Exemplo n.º 1
0
def submit_payment():
    pform = PaymentForm()
    pform.uid.choices = User.get_uids()
    if not pform.validate_on_submit():
        flash('Payment invalid.')
        return redirect(url_for('coffee.admin'))

    uid = pform.uid.data
    amount = float(pform.amount.data) * 100
    user = User.objects.get(id=uid)
    transaction = Transaction(user=user,
                              diff=amount,
                              description='{} payment from {}'.format(
                                  euros(amount), user.name))
    transaction.save()
    if user.email:
        msg = Message('[Kaffeeministerium] Einzahlung von {}'.format(
            euros(amount)))
        msg.charset = 'utf-8'
        msg.add_recipient(user.email)
        msg.body = render_template('mail/payment',
                                   amount=amount,
                                   balance=user.balance)
        flash('Mail sent to user {}'.format(user.name))
        if not app.config['DEBUG']:
            mail.send(msg)
        else:
            print(u'Sending mail \n{}'.format(msg.as_string()))

    return redirect(url_for('coffee.admin'))
Exemplo n.º 2
0
def submit_payment():
    pform = PaymentForm()
    pform.uid.choices = User.get_uids()
    if not pform.validate_on_submit():
        flash('Payment invalid.')
        return redirect(url_for('coffee.admin'))

    uid = pform.uid.data
    # prevent inaccurate input parsing (see
    # https://docs.python.org/3.6/tutorial/floatingpoint.html)
    amount = int(round(float(pform.amount.data) * 100))
    user = User.objects.get(id=uid)
    transaction = Transaction(user=user,
                              diff=amount,
                              description='{} payment from {}'.format(
                                  euros(amount), user.name))
    transaction.save()
    if user.email:
        msg = EmailMessage()
        msg['Subject'] = f'[Kaffeeministerium] Einzahlung von {euros(amount)}'
        msg['From'] = app.config['MAIL_DEFAULT_SENDER']
        msg['To'] = user.email
        msg.set_content(
            render_template('mail/payment',
                            amount=amount,
                            balance=user.balance,
                            minister_name=app.config['MAIL_MINISTER_NAME']))
        flash('Mail sent to user {}'.format(user.name))
        if not app.config['DEBUG']:
            s = getMailServer()
            s.send_message(msg)
        else:
            print(u'Sending mail \n{}'.format(msg.as_string()))

    return redirect(url_for('coffee.admin'))
Exemplo n.º 3
0
def test_transaction_create_ok(session, data_transaction):
    count1 = session.query(Transaction).count()
    users = User.get_users(db_session=session)
    data = TransactionPost(
        reference=data_transaction['reference'],
        account=data_transaction['account'],
        date=data_transaction['date'],
        amount=data_transaction['amount'],
        type=data_transaction['type'],
        category=data_transaction['category'],
    )
    Transaction.create(db_session=session, user_id=users[0].id, data=data)
    count2 = session.query(Transaction).count()
    assert count1 + 1 == count2
Exemplo n.º 4
0
def global_api(function):
    if function == 'personal_data':
        user = User.objects.get(username=current_user.username)
        return jsonify(data=user.consumption_list())

    if function == 'global_data':
        # some renaming
        actual_curve = [
            dict(date=t['_id'], amount=t['total'])
            for t in Transaction.dailyTransactions()
        ]
        consumption_curve = Consumption.dailyConsumptions()

        expense_curve = Transaction.dailyExpenses()
        # get all unique dates
        unique_dates = set([t['_id'] for t in expense_curve
                            ]).union(set([t['_id']
                                          for t in consumption_curve]))
        target_curve = []
        for date in unique_dates:
            amount = (next(
                (x['total']
                 for x in expense_curve if x['_id'] == date), 0) + next(
                     (x['total']
                      for x in consumption_curve if x['_id'] == date), 0))
            target_curve.append(dict(date=date, amount=amount))
        target_curve = sorted(target_curve, key=lambda x: x['date'])
        return jsonify(actual_curve=actual_curve, target_curve=target_curve)

    if function == 'consumption_times':
        """ return a list of consumtion daytimes, in seconds """
        def getSecondsOfDay(dates):
            for d in dates:
                yield d.subtract(years=d.year - 1970,
                                 months=d.month - 1,
                                 days=d.day - 1).timestamp()

        consumptions = Consumption.objects(date__gte=pendulum.now().subtract(
            days=28))
        consumptions4Weeks = [pendulum.instance(c.date) for c in consumptions]
        consumptions1Week = [
            c for c in consumptions4Weeks
            if pendulum.now().subtract(days=7) < c
        ]
        return jsonify(last_four_weeks=list(
            getSecondsOfDay(consumptions4Weeks)),
                       last_week=list(getSecondsOfDay(consumptions1Week)))

    return abort(404)
Exemplo n.º 5
0
 def new_transaction_db(self,
                        time_stamp,
                        product_serial_number,
                        product_name,
                        product_price,
                        tran_type,
                        manufacturer_seller_id,
                        manufacturer_seller_name,
                        manufacturer_seller_address,
                        manufacturer_seller_licence_number,
                        Status="Pending"):
     session = self.session_factory()
     tran = Transaction(
         time_stamp=time_stamp,
         product_serial_number=product_serial_number,
         product_name=product_name,
         product_price=product_price,
         type=tran_type,
         manufacturer_seller_id=manufacturer_seller_id,
         manufacturer_seller_name=manufacturer_seller_name,
         manufacturer_seller_address=manufacturer_seller_address,
         manufacturer_seller_licence_number=
         manufacturer_seller_licence_number,
         Status=Status)
     session.add(tran)
     session.commit()
     latest_tran_id = session.query(Transaction).order_by(
         Transaction.transaction_id.desc()).first()
     '''
     tran_alert = Transaction_Alert(transaction_id = latest_tran_id.transaction_id, status = "Active")
     session.add(tran_alert)
     session.commit()
     '''
     session.close()
     return latest_tran_id
Exemplo n.º 6
0
    def handle_all_callback(self, bot, update):
        print("1. Received: " + str(datetime.datetime.now().time()))
        counter.Counter.add_count()
        try:
            cbq = update.callback_query
            data = cbq.data

            if data is None:
                return cbq.answer()

            conn = self.db.get_connection()
            with Transaction(conn) as trans:
                user = update.callback_query.from_user
                trans.add_user(user.id, user.first_name, user.last_name,
                               user.username)
                payload = json.loads(data)
                action_type = payload.get(const.JSON_ACTION_TYPE)
                action_id = payload.get(const.JSON_ACTION_ID)

                if action_type is None:
                    return cbq.answer('nothing')
                print("1.1. Find handler: " +
                      str(datetime.datetime.now().time()))
                handler = self.get_action_handler(action_type)
                print("2. Dispatched: " + str(datetime.datetime.now().time()))
                return handler.execute(bot, update, trans, action_id, 0,
                                       payload)
        except Exception as e:
            logging.exception('handle_all_callback')
Exemplo n.º 7
0
def administrate_expenses():
    eform = ExpenseForm()
    if not eform.validate_on_submit():
        for field, errors in eform.errors.items():
            for error in errors:
                flash(u'Error in the %s field - %s' %
                      (getattr(eform, field).label.text, error))
        return redirect(url_for('coffee.admin'))

    description = eform.description.data
    amount = eform.amount.data
    date = (eform.date.data if eform.date.data != '' else datetime.utcnow())
    t = Transaction(diff=100 * amount, date=date, description=description)
    t.save()
    flash('Transaction stored.')
    return redirect(url_for('coffee.admin'))
Exemplo n.º 8
0
def backlogs_put(**kwargs):
    """
    actually insert transaction
    """
    obj = json.loads(request.data.decode('utf-8', 'strict'))
    origin_time = datetime.datetime.strptime(
            obj['origin_time'], '%Y-%m-%d').date()
    operation_time = datetime.datetime.strptime(obj['time'], '%Y-%m-%d').date()

    transaction = Transaction(
        time=operation_time,
        account_id=int(obj['account.id']),
        sum=strip_numbers(obj['sum']),
        income_id=obj['income.id'],
        comment=obj['comment'])
    DB.add(transaction)
    DB.flush()
    if origin_time != operation_time:
        # payment before
        DB.add(
            Payforward(
                income_id=int(obj['income.id']),
                income_date=origin_time,
                payment_date=operation_time,
                transaction_id=transaction.record_id
            )
        )
    DB.commit()
    return transaction
Exemplo n.º 9
0
    def test_got_question_twice(self):
        transaction = Transaction(bid_id_old=42,
                                  bid_created_at=self.user.created_at,
                                  buyer_user_id=self.user.id,
                                  seller_user_id=self.another_user.id,
                                  value_satoshi=100,
                                  coinbase_order="unknown",
                                  status="wait_for_question")
        email = Email(to_user_id=self.user.id, purpose="ask")
        transaction.active_emails.append(email)
        db.session.add(transaction)
        db.session.commit()

        from_email = self.user.address_hash + "@example.com"
        self.responder.process_email(from_email,
                                     "Hash: %s ..." % (email.email_hash),
                                     "Some question?\n%s" % (from_email))

        db.session.refresh(transaction)
        db.session.refresh(self.user)

        self.assertEqual(len(self.user.active_emails),
                         1)  # We still have verification left
        self.trader.question_asked.assert_called_with(self.user, transaction,
                                                      "Some question?")
Exemplo n.º 10
0
def post_transactions(*,
                      db_session: Session = Depends(get_db),
                      payload: TransactionPostList) -> List[TransactionGet]:
    user = User.get_user_by_name(db_session=db_session, name=payload.name)
    if user is None:
        raise HTTPException(status_code=HTTP_404_NOT_FOUND,
                            detail=messages.USER_NOT_FOUND)

    data = []
    references_db = Transaction.get_referencez(db_session=db_session)
    for transaction in payload.transactions:
        if transaction.reference not in references_db:
            transaction.user_id = user.id
            references_db.append(transaction.reference)
            data.append(dict(transaction))

    return Transaction.create_bulk(db_session=db_session, data=data)
Exemplo n.º 11
0
def test_transaction_get_transaction_by_user_id_date_range(
        session, new_user, scenario, start_date, end_date, expected):
    assert len(
        Transaction.get_transaction_by_user_id_date_range(
            db_session=session,
            user_id=new_user.id,
            start_date=start_date,
            end_date=end_date,
        )) == expected
Exemplo n.º 12
0
def administrate_expenses():
    eform = ExpenseForm()
    if not eform.validate_on_submit():
        for field, errors in eform.errors.items():
            for error in errors:
                flash(u'Error in the %s field - %s' %
                      (getattr(eform, field).label.text, error))
        return redirect(url_for('coffee.admin'))

    description = eform.description.data
    # prevent inaccurate input parsing (see
    # https://docs.python.org/3.6/tutorial/floatingpoint.html)
    amount = int(round(float(eform.amount.data * 100)))
    date = (eform.date.data if eform.date.data != '' else datetime.utcnow())
    t = Transaction(diff=amount, date=date, description=description)
    t.save()
    flash('Transaction stored.')
    return redirect(url_for('coffee.admin'))
Exemplo n.º 13
0
 def setUp(self):
     testuser = User(username='******', email='*****@*****.**')
     testuser.save()
     self.testuser = testuser
     User(username='******', email='*****@*****.**', admin=True).save()
     testpayment = Transaction(diff=1000, user=testuser)
     testpayment.save()
     testexpense = Transaction(diff=-500)
     testexpense.save()
     testcons = Consumption(units=1, price_per_unit=50, user=testuser)
     testcons.save()
     self.app = coffee.app.test_client()
Exemplo n.º 14
0
Arquivo: main.py Projeto: pigri/banker
def lunchmoney_id_import(token, year, month):
    start_of_day = ("%s-%s-01" % (year, month))
    last_day_month = calendar.monthrange(int(year), int(month))[1]
    end_of_day = ("%s-%s-%s" % (year, month, last_day_month))
    query_result = json.loads(
        Lunchmoney(token=str(token)).getAllTransactions({
            'start_date': start_of_day,
            'end_date': end_of_day
        }))
    for row in query_result['transactions']:
        (Transaction.update(lunchmoney_id=row['id']).where(
            Transaction.id == row['external_id'])).execute()
Exemplo n.º 15
0
def store_plaid_transactions(transactionsResponse):
    for transactionResponse in transactionsResponse:
        transactionEntity = Transaction(
            id=transactionResponse['transaction_id'],
            account_id=transactionResponse['account_id'],
            account_owner='Caleb Kumar',
            name=str(transactionResponse['name']),
            amount=transactionResponse['amount'],
            date=datetime.strptime(transactionResponse['date'], '%Y-%m-%d'),
            default_transaction_type=transactionResponse['transaction_type'],
            # TODO: Iterate over list of categories
            default_category1=str(transactionResponse['category']))
Exemplo n.º 16
0
 def new_bill(self, bot, update):
     # only allow private message
     try:
         conn = self.db.get_connection()
         handler = self.get_action_handler(const.TYPE_CREATE_BILL)
         with Transaction(conn) as trans:
             handler.execute(bot,
                             update,
                             trans,
                             action_id=create_bill_handler.ACTION_NEW_BILL)
     except Exception as e:
         logging.exception('new_bill')
Exemplo n.º 17
0
Arquivo: main.py Projeto: pigri/banker
def data_export(token):
    query_result = Transaction.select(
        Transaction.id, Transaction.data,
        Transaction.asset_id).where(Transaction.lunchmoney_id.is_null(True))
    result = []
    for row in query_result:
        data = dict(row.data)
        data.update({'asset_id': row.asset_id})
        data.update({'external_id': row.id})
        result.append(data)
    response = Lunchmoney(token=str(token)).insertTransactions(result)
    print(response)
Exemplo n.º 18
0
def transactions_post(**kwargs):
    obj = json.loads(request.data.decode('utf-8', 'strict'))
    # try:
    i = Transaction(
        time=datetime.datetime.strptime(obj['time'], '%Y-%m-%d').date(),
        account_id=int(obj['account.id']),
        sum=decimal.Decimal(strip_numbers(obj['sum'])),
        transfer=int(obj['transfer']) if int(obj['transfer']) > 0 else None,
        income_id=int(obj['income.id']) if int(obj['income.id']) > 0 else None,
        comment=obj['comment']
    )
    DB.add(i)
    DB.flush()
    if 'new_account.id' in obj:
        transfer = Transaction(
          time=datetime.datetime.strptime(obj['time'], '%Y-%m-%d').date(),
          account_id=int(obj['new_account.id']),
          sum=decimal.Decimal(strip_numbers(obj['new_sum'])),
          transfer=int(obj['transfer']) if int(obj['transfer']) > 0 else None,
          comment=obj['comment'],
          income_id=int(obj['income.id']) if int(obj['income.id']) > 0 else None
        )
        DB.add(transfer)
        DB.flush()
        i.transfer = transfer.record_id
        transfer.transfer = i.record_id
    DB.commit()
    # except:
    #    abort(400)
    return i
Exemplo n.º 19
0
def backlogs_delete(**kwargs):
    # just create transaction with sum zero
    obj = json.loads(request.data.decode('utf-8', 'strict'))
    t = Transaction(
        time=datetime.datetime.strptime(obj['origin_time'], '%Y-%m-%d').date(),
        account_id=0,
        sum=0,
        income_id=obj['income.id'],
        comment='cancelled')
    DB.add(t)
    DB.flush()
    DB.commit()
    return t
Exemplo n.º 20
0
def accounts_put(**kwargs):
    a = DB.query(Account).get(kwargs['id'])
    obj = json.loads(request.data.decode('utf-8', 'strict'))
    a.title = obj['title']
    a.show = obj['show']
    a.currency_id = obj['currency.id']
    delta_sum = decimal.Decimal(strip_numbers(obj['sum'])) - a.sum()
    if delta_sum != 0:
        t = Transaction(time=datetime.date.today(), sum=delta_sum,
                        account_id=kwargs['id'], comment='fix account summ')
        DB.add(t)
    DB.commit()
    return {'updated': DB.query(Account).get(kwargs['id']), "previous": a}
Exemplo n.º 21
0
def scenario(session, new_user):
    data_1 = dict(user_id=new_user.id,
                  reference='000051',
                  account='C00099',
                  date='2020-01-03',
                  amount=-51.13,
                  type='outflow',
                  category='groceries')
    data_2 = dict(user_id=new_user.id,
                  reference='000052',
                  account='C00099',
                  date='2020-01-10',
                  amount=2500.72,
                  type='inflow',
                  category='salary')
    data_3 = dict(user_id=new_user.id,
                  reference='000053',
                  account='C00099',
                  date='2020-01-10',
                  amount=-150.72,
                  type='outflow',
                  category='transfer')
    data_4 = dict(user_id=new_user.id,
                  reference='000054',
                  account='C00099',
                  date='2020-01-13',
                  amount=-560.00,
                  type='outflow',
                  category='rent')
    data_5 = dict(user_id=new_user.id,
                  reference='000689',
                  account='S00012',
                  date='2020-01-10',
                  amount=150.72,
                  type='inflow',
                  category='savings')
    Transaction.create_bulk(db_session=session,
                            data=[data_1, data_2, data_3, data_4, data_5])
Exemplo n.º 22
0
 def handle_inline(self, bot, update):
     try:
         conn = self.db.get_connection()
         handler = self.get_action_handler(const.TYPE_SHARE_BILL)
         with Transaction(conn) as trans:
             user = update.inline_query.from_user
             trans.add_user(user.id, user.first_name, user.last_name,
                            user.username)
             handler.execute(bot,
                             update,
                             trans,
                             action_id=share_bill_handler.ACTION_FIND_BILLS)
     except Exception as e:
         logging.exception('handle_inline')
Exemplo n.º 23
0
def new_transaction(session, new_user, data_transaction):
    data = TransactionPost(
        reference=data_transaction['reference'],
        account=data_transaction['account'],
        date=data_transaction['date'],
        amount=data_transaction['amount'],
        type=data_transaction['type'],
        category=data_transaction['category'],
    )
    return Transaction.create(
        db_session=session,
        user_id=new_user.id,
        data=data,
    )
Exemplo n.º 24
0
 def start(self, bot, update, args):
     # TODO: make command list screen
     if args is not None and len(args) == 1:
         handler = manage_bill_handler.BillManagementHandler()
         conn = self.db.get_connection()
         data = {const.JSON_BILL_ID: args[0]}
         with Transaction(conn) as trans:
             handler.execute(bot,
                             update,
                             trans,
                             action_id=manage_bill_handler.ACTION_SEND_BILL,
                             data=data)
         return
     bot.sendMessage(chat_id=update.message.chat_id, text="Start screen")
Exemplo n.º 25
0
def test_transaction_get_summary_by_category_ok(session, new_user, scenario):
    expected = {
        "inflow": {
            "salary": 2500.72,
            "savings": 150.72
        },
        "outflow": {
            "groceries": -51.13,
            "rent": -560.00,
            "transfer": -150.72
        }
    }
    assert Transaction.get_summary_by_category(db_session=session,
                                               user_id=new_user.id) == expected
Exemplo n.º 26
0
def test_transaction_create_bulk_ok(session, new_user):
    count1 = session.query(Transaction).count()
    data_1 = dict(
        user_id=new_user.id,
        reference='reference1',
        account='account',
        date='2020-02-02',
        amount=1.00,
        type='inflow',
        category='category',
    )
    data_2 = dict(
        user_id=new_user.id,
        reference='reference2',
        account='account',
        date='2020-02-02',
        amount=1.00,
        type='inflow',
        category='category',
    )
    Transaction.create_bulk(db_session=session, data=[data_1, data_2])
    count2 = session.query(Transaction).count()
    assert count1 + 2 == count2
Exemplo n.º 27
0
def get_summary_by_category(
    *,
    db_session: Session = Depends(get_db),
    name: str,
    start_date: date = None,
    end_date: date = None,
) -> TransactionSummaryByCategory:
    user = User.get_user_by_name(db_session=db_session, name=name)
    if user is None:
        raise HTTPException(status_code=HTTP_404_NOT_FOUND,
                            detail=messages.USER_NOT_FOUND)

    return Transaction.get_summary_by_category(db_session=db_session,
                                               user_id=user.id,
                                               start_date=start_date,
                                               end_date=end_date)
Exemplo n.º 28
0
 def start(self, bot, update, args):
     # TODO: make command list screen
     if args is not None and len(args) == 1:
         handler = manage_bill_handler.BillManagementHandler()
         conn = self.db.get_connection()
         data = {const.JSON_BILL_ID: args[0]}
         with Transaction(conn) as trans:
             msg = update.message
             trans.reset_session(msg.chat_id, msg.from_user.id)
             handler.execute(bot,
                             update,
                             trans,
                             action_id=manage_bill_handler.ACTION_SEND_BILL,
                             data=data)
         return
     self.send_help_msg(bot, update)
Exemplo n.º 29
0
def accounts_post(**kwargs):
    """ add new account and set first transaction with rests of money """
    obj = json.loads(request.data.decode('utf-8', 'strict'))
    new_account = Account(
            title=obj['title'],
            currency_id=int(obj['currency.id']))
    DB.add(new_account)
    DB.flush()
    if float(strip_numbers(obj['sum'])) > 0:
        DB.add(Transaction(account_id=new_account.record_id,
                           show=obj['show'],
                           comment='initial summ',
                           time=datetime.date.today(),
                           sum=strip_numbers(obj['sum'])))
    DB.commit()
    return new_account
Exemplo n.º 30
0
def test_transaction_get_summary_by_account_ok(session, new_user, scenario):
    expected = [
        {
            "account": "C00099",
            "balance": 1738.87,
            "total_inflow": 2500.72,
            "total_outflow": -761.85
        },
        {
            "account": "S00012",
            "balance": 150.72,
            "total_inflow": 150.72,
            "total_outflow": 0.00
        },
    ]
    assert Transaction.get_summary_by_account(db_session=session,
                                              user_id=new_user.id) == expected