Exemple #1
0
    def test_fallback_fee_account(self):
        # No room at fee.ends_on -> room from fee.begins_on should be taken
        user_no_room = self.create_user_from1y(room=None,
                                               address=AddressFactory())

        transaction = Transaction.q.filter_by(valid_on=self.membership_fee_last.ends_on) \
            .filter(Transaction.description.contains(self.membership_fee_last.name)).first()

        assert transaction is None, "Transaction found, but should not exist yet."

        post_transactions_for_membership_fee(self.membership_fee_last,
                                             self.processor)
        session.session.refresh(user_no_room.account)

        assert user_no_room.account.balance == self.membership_fee_last.regular_fee, "User balance incorrect"

        transaction = Transaction.q.filter_by(valid_on=self.membership_fee_last.ends_on) \
            .filter(Transaction.description.contains(self.membership_fee_last.name)).first()

        assert transaction is not None, "Transaction not found"

        split_fee_account = Split.q.filter_by(
            transaction=transaction,
            account=config.membership_fee_account,
            amount=-self.membership_fee_last.regular_fee).first()

        assert split_fee_account is not None, "Fee account split not found"
Exemple #2
0
    def test_payment_in_default_recover(self):
        user = self.create_user_from1y()

        assert user.account.balance == 0.00, "Initial user account balance not zero"
        assert user.account.in_default_days == 0
        assert user.has_property("member"), "User is not a member"

        # Test fee with payment_in_default group action
        post_transactions_for_membership_fee(self.membership_fee_pid_state,
                                             self.processor)
        session.session.refresh(user.account)

        assert user.account.balance == self.membership_fee_pid_state.regular_fee, "User balance incorrect"

        self.handle_payment_in_default_users()

        self.session.refresh(user)
        assert user.has_property("member"), "User is not a member"
        assert user.has_property(
            "payment_in_default"), "User has no payment_in_default property"

        # this transaction…
        simple_transaction(description="deposit",
                           debit_account=user.account,
                           credit_account=AccountFactory(),
                           amount=self.membership_fee_pid_state.regular_fee,
                           author=self.processor)
        # …should unblock the user now
        self.handle_payment_in_default_users()

        self.session.refresh(user)
        assert user.has_property("member"), "User is not a member"
        assert not user.has_property(
            "payment_in_default"), "User has payment_in_default property"
Exemple #3
0
def membership_fee_users_due_json(fee_id):
    fee = MembershipFee.q.get(fee_id)

    if fee is None:
        abort(404)

    affected_users = post_transactions_for_membership_fee(fee,
                                                          current_user,
                                                          simulate=True)

    fee_amount = {
        'value': str(fee.regular_fee) + '€',
        'is_positive': (fee.regular_fee < 0)
    }
    fee_description = localized(
        finance.membership_fee_description.format(fee_name=fee.name).to_json())

    return jsonify(items=[{
        'user_id': user['id'],
        'user': {
            'title': str(user['name']),
            'href': url_for("user.user_show", user_id=user['id'])
        },
        'amount': fee_amount,
        'description': fee_description,
        'valid_on': fee.ends_on
    } for user in affected_users])
Exemple #4
0
def membership_fee_book(fee_id):
    fee = MembershipFee.q.get(fee_id)

    if fee is None:
        flash(u'Ein Beitrag mit dieser ID existiert nicht!', 'error')
        abort(404)

    form = FeeApplyForm()
    if form.is_submitted():
        affected_users = post_transactions_for_membership_fee(
            fee, current_user)

        session.commit()

        flash("{} neue Buchungen erstellt.".format(len(affected_users)),
              "success")

        return redirect(url_for(".membership_fees"))

    table = UsersDueTable(
        data_url=url_for('.membership_fee_users_due_json', fee_id=fee.id))
    return render_template('finance/membership_fee_book.html',
                           form=form,
                           page_title='Beitrag buchen',
                           table=table)
Exemple #5
0
    def test_basic_from1y(self):
        user1y = self.create_user_from1y()

        self.assertEqual(user1y.account.balance, 0.00,
                         "Initial user account balance not zero")

        affected = post_transactions_for_membership_fee(
            self.membership_fee_last, self.processor)

        session.session.refresh(user1y.account)

        self.assertEqual(len(affected), 1, "Wrong affected user count")

        self.assertEqual(user1y.account.balance,
                         self.membership_fee_last.regular_fee,
                         "User balance incorrect")

        transaction = Transaction.q.filter_by(valid_on=self.membership_fee_last.ends_on)\
            .filter(Transaction.description.contains(self.membership_fee_last.name)).first()

        self.assertIsNotNone(transaction, "Transaction not found")

        split_user = Split.q.filter_by(
            transaction=transaction,
            account=user1y.account,
            amount=self.membership_fee_last.regular_fee).first()

        self.assertIsNotNone(split_user, "User split not found")

        split_fee_account = Split.q.filter_by(
            transaction=transaction,
            account=user1y.room.building.fee_account,
            amount=-self.membership_fee_last.regular_fee).first()

        self.assertIsNotNone(split_fee_account, "Fee account split not found")

        affected = post_transactions_for_membership_fee(
            self.membership_fee_last, self.processor)

        session.session.refresh(user1y.account)

        self.assertEqual(len(affected), 0, "Affected users not zero")

        self.assertEqual(user1y.account.balance,
                         self.membership_fee_last.regular_fee,
                         "User balance changed")
Exemple #6
0
    def test_payment_in_default_recover(self):
        user = self.create_user_from1y()

        self.assertEqual(user.account.balance, 0.00,
                         "Initial user account balance not zero")

        self.assertEqual(user.account.in_default_days, 0)

        self.assertTrue(user.has_property("member"), "User is not a member")

        # Test fee with payment_in_default group action
        post_transactions_for_membership_fee(self.membership_fee_pid_state,
                                             self.processor)

        session.session.refresh(user.account)

        self.assertEqual(user.account.balance,
                         self.membership_fee_pid_state.regular_fee,
                         "User balance incorrect")

        self.handle_payment_in_default_users()

        self.assertTrue(user.has_property("member"), "User is not a member")
        self.assertTrue(user.has_property("payment_in_default"),
                        "User has no payment_in_default property")

        simple_transaction(description="deposit",
                           debit_account=user.account,
                           credit_account=AccountFactory(),
                           amount=self.membership_fee_pid_state.regular_fee,
                           author=self.processor)

        self.handle_payment_in_default_users()

        self.assertTrue(user.has_property("member"), "User is not a member")
        self.assertFalse(user.has_property("payment_in_default"),
                         "User has payment_in_default property")
Exemple #7
0
    def grace_check(self, user_grace, user_no_grace):
        assert user_grace.account.balance == 0.00, \
            "Initial user grace account balance not zero"
        assert user_no_grace.account.balance == 0.00, \
            "Initial user no grace account balance not zero"

        affected = post_transactions_for_membership_fee(
            self.membership_fee_last, self.processor)

        session.session.refresh(user_grace.account)
        session.session.refresh(user_no_grace.account)

        assert len(affected) == 1, "Wrong affected user count"

        assert user_grace.account.balance == 0.00, "User grace balance not zero"
        assert user_no_grace.account.balance == self.membership_fee_last.regular_fee, \
            "User no grace balance wrong"
Exemple #8
0
def membership_fee_users_due_json(fee_id):
    fee = MembershipFee.q.get(fee_id)

    if fee is None:
        abort(404)

    affected_users = post_transactions_for_membership_fee(
        fee, current_user)

    session.rollback()

    return jsonify(items=[{
        'user': {'title': str(user['name']),
                 'href': url_for("user.user_show", user_id=user['id'])},
        'amount': {'value': str(fee.regular_fee) + '€', 'is_positive': (fee.regular_fee < 0)},
        'description': localized(finance.membership_fee_description
                                 .format(fee_name=fee.name).to_json()),
        'valid_on': fee.ends_on
    } for user in affected_users])
Exemple #9
0
    def grace_check(self, user_grace, user_no_grace):
        self.assertEqual(user_grace.account.balance, 0.00,
                         "Initial user grace account balance not zero")
        self.assertEqual(user_no_grace.account.balance, 0.00,
                         "Initial user no grace account balance not zero")

        affected = post_transactions_for_membership_fee(
            self.membership_fee_last, self.processor)

        session.session.refresh(user_grace.account)
        session.session.refresh(user_no_grace.account)

        self.assertEqual(len(affected), 1, "Wrong affected user count")

        self.assertEqual(user_grace.account.balance, 0.00,
                         "User grace balance not zero")
        self.assertEqual(user_no_grace.account.balance,
                         self.membership_fee_last.regular_fee,
                         "User no grace balance wrong")
Exemple #10
0
def membership_fee_book(fee_id):
    fee = MembershipFee.q.get(fee_id)

    if fee is None:
        flash(u'Ein Beitrag mit dieser ID existiert nicht!', 'error')
        abort(404)

    form = FeeApplyForm()
    if form.is_submitted():
        affected_users = post_transactions_for_membership_fee(
            fee, current_user)

        session.commit()

        flash("{} neue Buchungen erstellt.".format(len(affected_users)), "success")

        return redirect(url_for(".handle_payments_in_default"))

    table = UsersDueTable(data_url=url_for('.membership_fee_users_due_json', fee_id=fee.id))
    return render_template('finance/membership_fee_book.html', form=form,
                           page_title='Beitrag buchen', table=table)
Exemple #11
0
    def test_payment_in_default_actions(self):
        user = self.create_user_from1y()

        assert user.account.balance == 0.00, "Initial user account balance not zero"
        assert user.account.in_default_days == 0
        assert user.has_property("member"), "User is not a member"

        # Test fee with no action
        post_transactions_for_membership_fee(self.membership_fee_no_pid_action,
                                             self.processor)
        session.session.refresh(user.account)

        assert user.account.balance == self.membership_fee_no_pid_action.regular_fee, "User balance incorrect"

        users_pid_membership, users_membership_terminated = self.handle_payment_in_default_users(
        )

        assert user.has_property("member"), "User is not a member"
        assert not user.has_property(
            "payment_in_default"), "User has payment_in_default property"

        # Test fee with payment_in_default group action (minimum)
        post_transactions_for_membership_fee(self.membership_fee_pid_state,
                                             self.processor)
        session.session.refresh(user.account)

        assert self.membership_fee_no_pid_action.regular_fee + self.membership_fee_pid_state.regular_fee \
            == user.account.balance, \
            "User balance incorrect"

        users_pid_membership, users_membership_terminated = self.handle_payment_in_default_users(
        )

        self.session.refresh(user)
        assert user.has_property("member"), "User is not a member"
        assert user.has_property(
            "payment_in_default"), "User has no payment_in_default property"

        # Test fee with payment_in_default group action (maximum)
        post_transactions_for_membership_fee(
            self.membership_fee_no_end_membership, self.processor)
        session.session.refresh(user.account)

        assert self.membership_fee_no_pid_action.regular_fee \
               + self.membership_fee_pid_state.regular_fee \
               + self.membership_fee_no_end_membership.regular_fee \
               == user.account.balance, \
               "User balance incorrect"

        users_pid_membership, users_membership_terminated = self.handle_payment_in_default_users(
        )

        self.session.refresh(user)
        assert user.has_property("member"), "User is not a member"
        assert user.has_property(
            "payment_in_default"), "User has no payment_in_default property"

        # Test fee with terminating membership
        post_transactions_for_membership_fee(
            self.membership_fee_pid_end_membership, self.processor)
        session.session.refresh(user.account)

        assert self.membership_fee_no_pid_action.regular_fee \
               + self.membership_fee_pid_state.regular_fee \
               + self.membership_fee_no_end_membership.regular_fee \
               + self.membership_fee_pid_end_membership.regular_fee \
               == user.account.balance, \
               "User balance incorrect"

        users_pid_membership, users_membership_terminated = self.handle_payment_in_default_users(
        )

        self.session.refresh(user)
        assert not user.has_property("member"), "User is a member"
        assert user.has_property(
            "payment_in_default"), "User has no payment_in_default property"