Ejemplo n.º 1
0
def test_reverse_position_wrong_session():
    session1 = cashdesk_session_before_factory()
    session2 = cashdesk_session_before_factory()
    trans = transaction_factory(session1)
    tpos = transaction_position_factory(transaction=trans)
    with pytest.raises(FlowError) as excinfo:
        reverse_transaction_position(tpos.pk, current_session=session2)
    assert excinfo.value.message == 'Only troubleshooters can reverse sales from other sessions.'
Ejemplo n.º 2
0
def test_reverse_wrong_session_troubleshooter():
    session1 = cashdesk_session_before_factory()
    session2 = cashdesk_session_before_factory(user=user_factory(
        troubleshooter=True))
    trans = transaction_factory(session1)
    transaction_position_factory(transaction=trans)
    reverse_transaction(trans_id=trans.pk,
                        current_session=session2,
                        authorized_by=user_factory(troubleshooter=True))
Ejemplo n.º 3
0
def test_reverse_success_single():
    session = cashdesk_session_before_factory()
    trans = transaction_factory(session)
    lp = transaction_position_factory(transaction=trans,
                                      product=product_factory(items=True))
    revtrans = Transaction.objects.get(pk=reverse_transaction_position(
        trans_pos_id=lp.pk, current_session=session))
    assert revtrans.session == session
    revpos = revtrans.positions.all()
    assert len(revpos) == 1
    rp = revpos[0]

    assert rp.reverses == lp
    assert rp.type == 'reverse'
    assert rp.value == -1 * lp.value
    assert rp.tax_value == -1 * lp.tax_value
    assert rp.product == lp.product
    assert {i.id for i in lp.items.all()} == {i.id for i in rp.items.all()}

    ls = TransactionPositionItem.objects.filter(position=lp).aggregate(
        s=Sum('amount'))['s']
    if ls:
        rs = TransactionPositionItem.objects.filter(position=rp).aggregate(
            s=Sum('amount'))['s']
        assert rs == ls * -1
Ejemplo n.º 4
0
def test_current_items():
    session = cashdesk_session_before_factory(create_items=False)
    buser = user_factory(troubleshooter=True, superuser=True)
    item_full = Item.objects.create(name='Full pass',
                                    description='',
                                    initial_stock=200)
    item_1d = Item.objects.create(name='One day pass',
                                  description='',
                                  initial_stock=100)
    prod_full = Product.objects.create(name='Full ticket',
                                       price=23,
                                       tax_rate=19)
    prod_1d = Product.objects.create(name='One day ticket',
                                     price=12,
                                     tax_rate=19)
    ProductItem.objects.create(product=prod_full, item=item_full, amount=1)
    ProductItem.objects.create(product=prod_1d, item=item_1d, amount=1)
    ItemMovement.objects.create(session=session,
                                item=item_full,
                                amount=20,
                                backoffice_user=buser)
    ItemMovement.objects.create(session=session,
                                item=item_1d,
                                amount=10,
                                backoffice_user=buser)

    for i in range(3):
        transaction_position_factory(transaction_factory(session), prod_full)
    for i in range(2):
        transaction_position_factory(transaction_factory(session), prod_1d)

    trans = transaction_position_factory(transaction_factory(session),
                                         prod_1d).transaction
    reverse_transaction(trans_id=trans.pk, current_session=session)

    session.end = now()
    session.save()
    ItemMovement.objects.create(session=session,
                                item=item_full,
                                amount=-17,
                                backoffice_user=buser)
    ItemMovement.objects.create(session=session,
                                item=item_1d,
                                amount=-5,
                                backoffice_user=buser)

    assert session.get_current_items() == [{
        'movements': 20,
        'total': 0,
        'transactions': 3,
        'item': item_full,
        'final_movements': 17
    }, {
        'movements': 10,
        'total': 3,
        'transactions': 2,
        'item': item_1d,
        'final_movements': 5
    }]
Ejemplo n.º 5
0
def test_reverse_position_double():
    session = cashdesk_session_before_factory()
    trans = transaction_factory(session)
    tpos = transaction_position_factory(transaction=trans, product=product_factory(items=True))
    reverse_transaction_position(tpos.pk, current_session=session)
    with pytest.raises(FlowError) as excinfo:
        reverse_transaction_position(tpos.pk, current_session=session)
    assert excinfo.value.message == 'This position has already been reversed.'
Ejemplo n.º 6
0
    def _setup_base(self):
        s = EventSettings.get_solo()
        s.initialized = True
        s.receipt_address = "Foo"
        s.save()

        self.session = cashdesk_session_before_factory(create_items=False)
        self.troubleshooter = user_factory(troubleshooter=True,
                                           superuser=False,
                                           password='******')
        self.backoffice_user = user_factory(troubleshooter=True,
                                            backoffice=True,
                                            password='******')
        self.cashier1 = user_factory(password='******')
        self.cashier2 = user_factory(password='******')

        self.item_full = Item.objects.create(name='Wristband red',
                                             description='Full pass',
                                             initial_stock=200)
        self.item_d1 = Item.objects.create(name='Wristband 1',
                                           description='Day 1',
                                           initial_stock=100)
        self.item_d2 = Item.objects.create(name='Wristband 2',
                                           description='Day 2',
                                           initial_stock=100)
        self.item_transport = Item.objects.create(
            name='Public transport',
            description='Public transport ticket',
            initial_stock=100,
            is_receipt=True)
        self.prod_full = Product.objects.create(name='Full pass',
                                                price=100,
                                                tax_rate=19)
        self.prod_d1 = Product.objects.create(name='Day pass Day 1',
                                              price=35,
                                              tax_rate=19)
        self.prod_d2 = Product.objects.create(name='Day pass Day 2',
                                              price=35,
                                              tax_rate=19)
        self.prod_transport = Product.objects.create(name='Public transport',
                                                     price=16.7,
                                                     tax_rate=0)
        ProductItem.objects.create(product=self.prod_full,
                                   item=self.item_full,
                                   amount=1)
        ProductItem.objects.create(product=self.prod_d1,
                                   item=self.item_d1,
                                   amount=1)
        ProductItem.objects.create(product=self.prod_d2,
                                   item=self.item_d2,
                                   amount=1)
        ProductItem.objects.create(product=self.prod_transport,
                                   item=self.item_transport,
                                   amount=1)
        self.desk1 = Cashdesk.objects.create(name='Desk 1',
                                             ip_address='10.1.1.1')
        self.desk2 = Cashdesk.objects.create(name='Desk 2',
                                             ip_address='10.1.1.2')
Ejemplo n.º 7
0
def test_product_sales():
    session = cashdesk_session_before_factory(create_items=False)
    prod_full = Product.objects.create(name='Full ticket',
                                       price=23,
                                       tax_rate=19)

    for i in range(3):
        transaction_position_factory(transaction_factory(session), prod_full)
    trans = transaction_position_factory(transaction_factory(session),
                                         prod_full)
    reverse_transaction(trans_id=trans.transaction_id, current_session=session)

    TransactionPosition.objects.create(
        type='redeem',
        value=10,
        tax_rate=19,
        product=prod_full,
        transaction=transaction_factory(session),
        has_constraint_bypass=True)
    TransactionPosition.objects.create(
        type='redeem',
        value=0,
        tax_rate=0,
        product=prod_full,
        transaction=transaction_factory(session),
    )

    def keyfunc(d):
        return d['value_single']

    assert sorted(session.get_product_sales(),
                  key=keyfunc) == sorted([{
                      'product': prod_full,
                      'presales': 0,
                      'reversals': 1,
                      'sales': 4,
                      'value_total': Decimal('69.00'),
                      'value_single': Decimal('23.00'),
                  }, {
                      'product': prod_full,
                      'presales': 1,
                      'reversals': 0,
                      'sales': 0,
                      'value_total': Decimal('00.00'),
                      'value_single': Decimal('00.00'),
                  }, {
                      'product': prod_full,
                      'presales': 1,
                      'reversals': 0,
                      'sales': 0,
                      'value_total': Decimal('10.00'),
                      'value_single': Decimal('10.00'),
                  }],
                                         key=keyfunc)
Ejemplo n.º 8
0
def test_reverse_whole_session():
    session = cashdesk_session_before_factory()
    pp = preorder_position_factory(paid=True)
    trans = transaction_factory(session)
    transaction_position_factory(transaction=trans, product=product_factory(items=True))
    pos = redeem_preorder_ticket(secret=pp.secret)
    pos.transaction = trans
    pos.save()
    assert is_redeemed(pp)
    reverse_session(session)
    assert not is_redeemed(pp)
Ejemplo n.º 9
0
def test_cash_transaction_total():
    session = cashdesk_session_before_factory(create_items=False)
    prod_full = Product.objects.create(name='Full ticket',
                                       price=23,
                                       tax_rate=19)

    for i in range(3):
        transaction_position_factory(transaction_factory(session), prod_full)
    trans = transaction_position_factory(transaction_factory(session),
                                         prod_full).transaction
    reverse_transaction(trans_id=trans.pk, current_session=session)

    TransactionPosition.objects.create(
        type='redeem',
        value=10,
        tax_rate=19,
        product=prod_full,
        transaction=transaction_factory(session),
        has_constraint_bypass=True)

    assert session.get_cash_transaction_total() == 23 * 3 + 10
Ejemplo n.º 10
0
def test_get_current_session():
    # todo: add old session as soon as cashdesk_session_old fixture is done
    session = cashdesk_session_before_factory()
    user = session.user
    assert user.get_current_session() == session
Ejemplo n.º 11
0
def test_session_not_active():
    session = cashdesk_session_before_factory()
    session.end = now() - timedelta(hours=1)
    assert not session.is_active()
Ejemplo n.º 12
0
def test_session_active():
    session = cashdesk_session_before_factory()
    assert session.is_active()
Ejemplo n.º 13
0
def test_reverse_position_unknown():
    session = cashdesk_session_before_factory()
    with pytest.raises(FlowError) as excinfo:
        reverse_transaction_position(1234678, current_session=session)
    assert excinfo.value.message == 'Transaction position ID not known.'