lingo/tests/invoicing/manager/test_campaign.py

1436 lines
52 KiB
Python

import datetime
from unittest import mock
import pytest
from lingo.invoicing.models import (
Campaign,
DraftInvoice,
DraftInvoiceLine,
InjectedLine,
Invoice,
InvoiceLine,
Pool,
Regie,
)
from tests.utils import login
pytestmark = pytest.mark.django_db
def test_campaign_home(app, admin_user):
app = login(app)
resp = app.get('/manage/invoicing/campaigns/')
h2 = resp.pyquery('div#appbar h2')
assert h2.text() == 'Campaigns'
def test_add_campaign(app, admin_user):
app = login(app)
resp = app.get('/manage/')
resp = resp.click('Invoicing')
resp = resp.click(href='/manage/invoicing/campaigns/')
resp = resp.click('New campaign')
resp.form['date_start'] = '2022-09-01'
resp.form['date_end'] = '2022-10-01'
resp.form['date_issue'] = '2022-10-31'
resp = resp.form.submit()
campaign = Campaign.objects.latest('pk')
assert resp.location.endswith('/manage/invoicing/campaign/%s/' % campaign.pk)
assert campaign.date_start == datetime.date(2022, 9, 1)
assert campaign.date_end == datetime.date(2022, 10, 1)
assert campaign.date_issue == datetime.date(2022, 10, 31)
resp = app.get('/manage/invoicing/campaign/add/')
resp.form['date_start'] = '2022-08-31'
resp.form['date_end'] = '2022-09-02'
resp.form['date_issue'] = '2022-10-31'
resp = resp.form.submit()
assert resp.context['form'].errors['__all__'] == [
'Another campaign overlapping this period already exists.'
]
resp.form['date_end'] = '2022-09-01'
resp = resp.form.submit()
campaign = Campaign.objects.latest('pk')
assert campaign.date_start == datetime.date(2022, 8, 31)
assert campaign.date_end == datetime.date(2022, 9, 1)
assert campaign.date_issue == datetime.date(2022, 10, 31)
resp = app.get('/manage/invoicing/campaign/add/')
resp.form['date_start'] = '2022-09-30'
resp.form['date_end'] = '2022-10-02'
resp.form['date_issue'] = '2022-10-31'
resp = resp.form.submit()
assert resp.context['form'].errors['__all__'] == [
'Another campaign overlapping this period already exists.'
]
resp.form['date_start'] = '2022-10-01'
resp = resp.form.submit()
campaign = Campaign.objects.latest('pk')
assert campaign.date_start == datetime.date(2022, 10, 1)
assert campaign.date_end == datetime.date(2022, 10, 2)
assert campaign.date_issue == datetime.date(2022, 10, 31)
def test_detail_campaign(app, admin_user):
campaign = Campaign.objects.create(
date_start=datetime.date(2022, 9, 1),
date_end=datetime.date(2022, 10, 1),
date_issue=datetime.date(2022, 10, 31),
)
pool1 = Pool.objects.create(
campaign=campaign,
draft=True,
status='completed',
)
pool2 = Pool.objects.create(
campaign=campaign,
draft=True,
status='registered',
)
app = login(app)
resp = app.get('/manage/invoicing/campaigns/')
resp = resp.click(href='/manage/invoicing/campaign/%s/' % campaign.pk)
assert '/manage/invoicing/campaign/%s/edit/' % campaign.pk not in resp
assert '/manage/invoicing/campaign/%s/delete/' % campaign.pk not in resp
assert '/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool1.pk) in resp
assert '/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool2.pk) in resp
assert '/manage/invoicing/campaign/%s/pool/add/' % (campaign.pk) not in resp
pool2.status = 'running'
pool2.save()
resp = app.get('/manage/invoicing/campaign/%s/' % campaign.pk)
assert '/manage/invoicing/campaign/%s/edit/' % campaign.pk not in resp
assert '/manage/invoicing/campaign/%s/delete/' % campaign.pk not in resp
assert '/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool1.pk) in resp
assert '/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool2.pk) in resp
assert '/manage/invoicing/campaign/%s/pool/add/' % (campaign.pk) not in resp
pool2.status = 'failed'
pool2.save()
resp = app.get('/manage/invoicing/campaign/%s/' % campaign.pk)
assert '/manage/invoicing/campaign/%s/edit/' % campaign.pk in resp
assert '/manage/invoicing/campaign/%s/delete/' % campaign.pk in resp
assert '/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool1.pk) in resp
assert '/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool2.pk) in resp
assert '/manage/invoicing/campaign/%s/pool/add/' % (campaign.pk) in resp
pool3 = Pool.objects.create(
campaign=campaign,
draft=False,
)
resp = app.get('/manage/invoicing/campaign/%s/' % campaign.pk)
assert '/manage/invoicing/campaign/%s/edit/' % campaign.pk not in resp
assert '/manage/invoicing/campaign/%s/delete/' % campaign.pk not in resp
assert '/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool1.pk) in resp
assert '/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool2.pk) in resp
assert '/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool3.pk) in resp
assert '/manage/invoicing/campaign/%s/pool/add/' % (campaign.pk) not in resp
line = DraftInvoiceLine.objects.create(
event_date=datetime.date(2022, 9, 1),
quantity=1,
unit_amount=1,
total_amount=1,
status='success',
pool=pool1,
)
resp = app.get('/manage/invoicing/campaign/%s/' % campaign.pk)
assert '<span class="tag tag-success">1</span>' in resp
assert 'tag-warning' not in resp
assert 'tag-error' not in resp
line.status = 'error'
line.save()
resp = app.get('/manage/invoicing/campaign/%s/' % campaign.pk)
assert 'tag-success' not in resp
assert 'tag-warning' not in resp
assert '<span class="tag tag-error">1</span>' in resp
line.status = 'warning'
line.save()
resp = app.get('/manage/invoicing/campaign/%s/' % campaign.pk)
assert 'tag-success' not in resp
assert '<span class="tag tag-warning">1</span>' in resp
assert 'tag-error' not in resp
line.delete()
resp = app.get('/manage/invoicing/campaign/%s/' % campaign.pk)
assert 'tag-success' not in resp
assert 'tag-warning' not in resp
assert 'tag-error' not in resp
line = InvoiceLine.objects.create(
event_date=datetime.date(2022, 9, 1),
quantity=1,
unit_amount=1,
total_amount=1,
status='success',
pool=pool1,
)
resp = app.get('/manage/invoicing/campaign/%s/' % campaign.pk)
assert '<span class="tag tag-success">1</span>' in resp
assert 'tag-warning' not in resp
assert 'tag-error' not in resp
line.status = 'error'
line.save()
resp = app.get('/manage/invoicing/campaign/%s/' % campaign.pk)
assert 'tag-success' not in resp
assert 'tag-warning' not in resp
assert '<span class="tag tag-error">1</span>' in resp
line.status = 'warning'
line.save()
resp = app.get('/manage/invoicing/campaign/%s/' % campaign.pk)
assert 'tag-success' not in resp
assert '<span class="tag tag-warning">1</span>' in resp
assert 'tag-error' not in resp
line.status = 'error'
line.error_status = 'ignored'
line.save()
resp = app.get('/manage/invoicing/campaign/%s/' % campaign.pk)
assert 'tag-success' not in resp
assert 'tag-warning' not in resp
assert '<span class="tag tag-error">1</span>' not in resp
line.error_status = 'fixed'
line.save()
resp = app.get('/manage/invoicing/campaign/%s/' % campaign.pk)
assert 'tag-success' not in resp
assert 'tag-warning' not in resp
assert '<span class="tag tag-error">1</span>' not in resp
def test_edit_campaign(app, admin_user):
campaign = Campaign.objects.create(
date_start=datetime.date(2022, 9, 1),
date_end=datetime.date(2022, 10, 1),
date_issue=datetime.date(2022, 10, 31),
)
Campaign.objects.create(
date_start=datetime.date(2022, 10, 1),
date_end=datetime.date(2022, 11, 1),
date_issue=datetime.date(2022, 11, 30),
)
app = login(app)
resp = app.get('/manage/invoicing/campaign/%s/edit/' % campaign.pk)
resp.form['date_start'] = '2022-09-30'
resp.form['date_end'] = '2022-10-02'
resp.form['date_issue'] = '2022-12-31'
resp = resp.form.submit()
assert resp.context['form'].errors['__all__'] == [
'Another campaign overlapping this period already exists.'
]
resp.form['date_end'] = '2022-10-01'
resp = resp.form.submit()
assert resp.location.endswith('/manage/invoicing/campaign/%s/' % campaign.pk)
campaign.refresh_from_db()
assert campaign.date_start == datetime.date(2022, 9, 30)
assert campaign.date_end == datetime.date(2022, 10, 1)
assert campaign.date_issue == datetime.date(2022, 12, 31)
resp = app.get('/manage/invoicing/campaign/%s/edit/' % campaign.pk)
resp.form['date_start'] = '2022-10-31'
resp.form['date_end'] = '2022-11-02'
resp.form['date_issue'] = '2022-12-31'
resp = resp.form.submit()
assert resp.context['form'].errors['__all__'] == [
'Another campaign overlapping this period already exists.'
]
resp.form['date_start'] = '2022-11-01'
resp = resp.form.submit()
campaign.refresh_from_db()
assert campaign.date_start == datetime.date(2022, 11, 1)
assert campaign.date_end == datetime.date(2022, 11, 2)
assert campaign.date_issue == datetime.date(2022, 12, 31)
pool = Pool.objects.create(
campaign=campaign,
draft=True,
status='completed',
)
app.get('/manage/invoicing/campaign/%s/edit/' % campaign.pk)
pool.status = 'failed'
pool.save()
app.get('/manage/invoicing/campaign/%s/edit/' % campaign.pk)
pool.status = 'registered'
pool.save()
app.get('/manage/invoicing/campaign/%s/edit/' % campaign.pk, status=404)
pool.status = 'running'
pool.save()
app.get('/manage/invoicing/campaign/%s/edit/' % campaign.pk, status=404)
pool.status = 'completed'
pool.draft = False
pool.save()
app.get('/manage/invoicing/campaign/%s/edit/' % campaign.pk, status=404)
def test_delete_campaign(app, admin_user):
campaign = Campaign.objects.create(
date_start=datetime.date(2022, 9, 1),
date_end=datetime.date(2022, 10, 1),
date_issue=datetime.date(2022, 10, 31),
)
app = login(app)
resp = app.get('/manage/invoicing/campaign/%s/delete/' % campaign.pk)
resp = resp.form.submit()
assert Campaign.objects.count() == 0
assert resp.location.endswith('/manage/invoicing/campaigns/')
campaign.save()
pool = Pool.objects.create(
campaign=campaign,
draft=True,
status='completed',
)
regie = Regie.objects.create(label='Foo')
invoice = DraftInvoice.objects.create(date_issue=datetime.date.today(), regie=regie, pool=pool)
DraftInvoiceLine.objects.create(
event_date=datetime.date(2022, 9, 1),
invoice=invoice,
quantity=1,
unit_amount=1,
total_amount=1,
status='success',
pool=pool,
)
resp = app.get('/manage/invoicing/campaign/%s/delete/' % campaign.pk)
resp = resp.form.submit()
assert Campaign.objects.count() == 0
campaign.save()
pool.status = 'failed'
pool.save()
app.get('/manage/invoicing/campaign/%s/delete/' % campaign.pk)
pool.status = 'registered'
pool.save()
app.get('/manage/invoicing/campaign/%s/delete/' % campaign.pk, status=404)
pool.status = 'running'
pool.save()
app.get('/manage/invoicing/campaign/%s/delete/' % campaign.pk, status=404)
pool.status = 'completed'
pool.draft = False
pool.save()
app.get('/manage/invoicing/campaign/%s/delete/' % campaign.pk, status=404)
def test_add_pool(app, admin_user):
campaign = Campaign.objects.create(
date_start=datetime.date(2022, 9, 1),
date_end=datetime.date(2022, 10, 1),
date_issue=datetime.date(2022, 10, 31),
)
app = login(app)
resp = app.get('/manage/invoicing/campaign/%s/pool/add/' % campaign.pk)
with mock.patch.object(Campaign, 'generate', autospec=True) as mock_generate:
resp = resp.form.submit()
assert resp.location.endswith('/manage/invoicing/campaign/%s/#open:pools' % campaign.pk)
assert mock_generate.call_args_list == [mock.call(campaign)]
pool = Pool.objects.create(
campaign=campaign,
draft=True,
status='failed',
)
app.get('/manage/invoicing/campaign/%s/pool/add/' % campaign.pk)
pool.status = 'completed'
pool.save()
app.get('/manage/invoicing/campaign/%s/pool/add/' % campaign.pk)
pool.status = 'registered'
pool.save()
app.get('/manage/invoicing/campaign/%s/pool/add/' % campaign.pk, status=404)
pool.status = 'running'
pool.save()
app.get('/manage/invoicing/campaign/%s/pool/add/' % campaign.pk, status=404)
pool.status = 'completed'
pool.draft = False
pool.save()
app.get('/manage/invoicing/campaign/%s/pool/add/' % campaign.pk, status=404)
def test_promote_pool(app, admin_user):
campaign = Campaign.objects.create(
date_start=datetime.date(2022, 9, 1),
date_end=datetime.date(2022, 10, 1),
date_issue=datetime.date(2022, 10, 31),
)
pool = Pool.objects.create(
campaign=campaign,
draft=True,
status='completed',
)
app = login(app)
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/promote/' % (campaign.pk, pool.pk))
with mock.patch.object(Pool, 'promote', autospec=True) as mock_promote:
resp = resp.form.submit()
assert resp.location.endswith('/manage/invoicing/campaign/%s/#open:pools' % campaign.pk)
assert mock_promote.call_args_list == [mock.call(pool)]
pool.status = 'registered'
pool.save()
app.get('/manage/invoicing/campaign/%s/pool/%s/promote/' % (campaign.pk, pool.pk), status=404)
pool.status = 'running'
pool.save()
app.get('/manage/invoicing/campaign/%s/pool/%s/promote/' % (campaign.pk, pool.pk), status=404)
pool.status = 'failed'
pool.save()
app.get('/manage/invoicing/campaign/%s/pool/%s/promote/' % (campaign.pk, pool.pk), status=404)
pool.status = 'completed'
pool.draft = False
pool.save()
app.get('/manage/invoicing/campaign/%s/pool/%s/promote/' % (campaign.pk, pool.pk), status=404)
pool.draft = True
pool.save()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/promote/' % (campaign.pk, pool.pk))
resp.form.submit()
assert Pool.objects.filter(draft=False).exists()
# not the last
app.get('/manage/invoicing/campaign/%s/pool/%s/promote/' % (campaign.pk, pool.pk), status=404)
def test_detail_pool(app, admin_user):
campaign = Campaign.objects.create(
date_start=datetime.date(2022, 9, 1),
date_end=datetime.date(2022, 10, 1),
date_issue=datetime.date(2022, 10, 31),
)
campaign2 = Campaign.objects.create(
date_start=datetime.date(2022, 10, 1),
date_end=datetime.date(2022, 11, 1),
date_issue=datetime.date(2022, 11, 30),
)
pool = Pool.objects.create(
campaign=campaign,
draft=True,
status='completed',
)
app = login(app)
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool.pk))
assert '/manage/invoicing/campaign/%s/pool/%s/delete/' % (campaign.pk, pool.pk) in resp
assert '/manage/invoicing/campaign/%s/pool/%s/promote/' % (campaign.pk, pool.pk) in resp
app.get('/manage/invoicing/campaign/%s/pool/%s/' % (0, pool.pk), status=404)
app.get('/manage/invoicing/campaign/%s/pool/%s/' % (campaign2.pk, pool.pk), status=404)
app.get('/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, 0), status=404)
pool.draft = False
pool.save()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool.pk))
assert '/manage/invoicing/campaign/%s/pool/%s/delete/' % (campaign.pk, pool.pk) not in resp
assert '/manage/invoicing/campaign/%s/pool/%s/promote/' % (campaign.pk, pool.pk) not in resp
pool.draft = True
pool.status = 'registered'
pool.save()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool.pk))
assert '/manage/invoicing/campaign/%s/pool/%s/delete/' % (campaign.pk, pool.pk) not in resp
assert '/manage/invoicing/campaign/%s/pool/%s/promote/' % (campaign.pk, pool.pk) not in resp
pool.status = 'running'
pool.save()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool.pk))
assert '/manage/invoicing/campaign/%s/pool/%s/delete/' % (campaign.pk, pool.pk) not in resp
assert '/manage/invoicing/campaign/%s/pool/%s/promote/' % (campaign.pk, pool.pk) not in resp
pool.status = 'failed'
pool.save()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool.pk))
assert '/manage/invoicing/campaign/%s/pool/%s/delete/' % (campaign.pk, pool.pk) in resp
assert '/manage/invoicing/campaign/%s/pool/%s/promote/' % (campaign.pk, pool.pk) not in resp
pool.status = 'completed'
pool.save()
Pool.objects.create(
campaign=pool.campaign,
)
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool.pk))
assert '/manage/invoicing/campaign/%s/pool/%s/delete/' % (campaign.pk, pool.pk) in resp
assert (
'/manage/invoicing/campaign/%s/pool/%s/promote/' % (campaign.pk, pool.pk) not in resp
) # not the last
line = DraftInvoiceLine.objects.create(
event_date=datetime.date(2022, 9, 1),
quantity=1,
unit_amount=1,
total_amount=1,
status='success',
pool=pool,
)
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool.pk))
assert '<span class="tag tag-success">1</span>' in resp
assert 'tag-warning' not in resp
assert 'tag-error' not in resp
line.status = 'error'
line.save()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool.pk))
assert 'tag-success' not in resp
assert 'tag-warning' not in resp
assert '<span class="tag tag-error">1</span>' in resp
line.status = 'warning'
line.save()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool.pk))
assert 'tag-success' not in resp
assert '<span class="tag tag-warning">1</span>' in resp
assert 'tag-error' not in resp
line.delete()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool.pk))
assert 'tag-success' not in resp
assert 'tag-warning' not in resp
assert 'tag-error' not in resp
pool.draft = False
pool.save()
line = InvoiceLine.objects.create(
event_date=datetime.date(2022, 9, 1),
quantity=1,
unit_amount=1,
total_amount=1,
status='success',
pool=pool,
)
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool.pk))
assert '<span class="tag tag-success">1</span>' in resp
assert 'tag-warning' not in resp
assert 'tag-error' not in resp
line.status = 'error'
line.save()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool.pk))
assert 'tag-success' not in resp
assert 'tag-warning' not in resp
assert '<span class="tag tag-error">1</span>' in resp
line.status = 'warning'
line.save()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool.pk))
assert 'tag-success' not in resp
assert '<span class="tag tag-warning">1</span>' in resp
assert 'tag-error' not in resp
@pytest.mark.parametrize('draft', [True, False])
def test_detail_pool_invoices(app, admin_user, draft):
invoice_model = DraftInvoice if draft else Invoice
line_model = DraftInvoiceLine if draft else InvoiceLine
campaign = Campaign.objects.create(
date_start=datetime.date(2022, 9, 1),
date_end=datetime.date(2022, 10, 1),
date_issue=datetime.date(2022, 10, 31),
)
pool = Pool.objects.create(
campaign=campaign,
draft=draft,
status='completed',
)
regie = Regie.objects.create(label='Foo')
invoice1 = invoice_model.objects.create(
date_issue=datetime.date.today(), regie=regie, pool=pool, payer='payer:1'
)
invoice2 = invoice_model.objects.create(
date_issue=datetime.date.today(), regie=regie, pool=pool, payer='payer:2'
)
if not draft:
invoice1.set_number()
invoice1.save()
invoice2.set_number()
invoice2.save()
line11 = line_model.objects.create(
event_date=datetime.date(2022, 9, 1),
invoice=invoice1,
quantity=1,
unit_amount=1,
total_amount=1,
status='success',
pool=pool,
label='Label 11',
user_external_id='user:1',
user_name='User1 Name1',
)
line12 = line_model.objects.create(
event_date=datetime.date(2022, 9, 2),
invoice=invoice1,
quantity=1,
unit_amount=2,
total_amount=2,
status='success',
pool=pool,
label='Label 12',
user_external_id='user:2',
user_name='User2 Name2',
)
line13 = line_model.objects.create(
event_date=datetime.date(2022, 9, 3),
invoice=invoice1,
quantity=1,
unit_amount=3,
total_amount=3,
status='success',
pool=pool,
label='Label 13',
user_external_id='user:1',
user_name='User1 Name1',
)
orphan_line = line_model.objects.create(
event_date=datetime.date(2022, 9, 1),
quantity=1,
unit_amount=42,
total_amount=42,
status='failed',
pool=pool,
label='Label 14',
user_external_id='user:1',
user_name='User1 Name1',
)
line21 = line_model.objects.create(
event_date=datetime.date(2022, 9, 1),
invoice=invoice2,
quantity=1,
unit_amount=1,
total_amount=1,
status='success',
pool=pool,
label='Label 21',
user_external_id='user:1',
user_name='User1 Name1',
)
app = login(app)
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/' % (campaign.pk, pool.pk))
assert '#%s' % orphan_line.pk not in resp
if draft:
assert (
resp.pyquery('h3[data-invoice-id="%s"]' % invoice1.pk).text()
== 'Invoice TMP-%s addressed to payer:1, amount 6.00€' % invoice1.pk
)
else:
assert resp.pyquery(
'h3[data-invoice-id="%s"]' % invoice1.pk
).text() == 'Invoice F%02s-%s-0000001 addressed to payer:1, amount 6.00€' % (
regie.pk,
invoice1.created_at.strftime('%y-%m'),
)
assert len(resp.pyquery('ul[data-invoice-id="%s"] li' % invoice1.pk)) == 3
assert (
resp.pyquery('ul[data-invoice-id="%s"] li:nth-child(1)' % invoice1.pk).text()
== '#%s User1 Name1 - 01/09/2022 - Label 11 (1.00)' % line11.pk
)
assert (
resp.pyquery('ul[data-invoice-id="%s"] li:nth-child(2)' % invoice1.pk).text()
== '#%s User1 Name1 - 03/09/2022 - Label 13 (3.00)' % line13.pk
)
assert (
resp.pyquery('ul[data-invoice-id="%s"] li:nth-child(3)' % invoice1.pk).text()
== '#%s User2 Name2 - 02/09/2022 - Label 12 (2.00)' % line12.pk
)
if draft:
assert (
resp.pyquery('h3[data-invoice-id="%s"]' % invoice2.pk).text()
== 'Invoice TMP-%s addressed to payer:2, amount 1.00€' % invoice2.pk
)
else:
assert resp.pyquery(
'h3[data-invoice-id="%s"]' % invoice2.pk
).text() == 'Invoice F%02d-%s-0000002 addressed to payer:2, amount 1.00€' % (
regie.pk,
invoice2.created_at.strftime('%y-%m'),
)
assert len(resp.pyquery('ul[data-invoice-id="%s"] li' % invoice2.pk)) == 1
assert (
resp.pyquery('ul[data-invoice-id="%s"] li:nth-child(1)' % invoice2.pk).text()
== '#%s User1 Name1 - 01/09/2022 - Label 21 (1.00)' % line21.pk
)
def test_journal_pool(app, admin_user):
campaign = Campaign.objects.create(
date_start=datetime.date(2022, 9, 1),
date_end=datetime.date(2022, 10, 1),
date_issue=datetime.date(2022, 10, 31),
)
campaign2 = Campaign.objects.create(
date_start=datetime.date(2022, 10, 1),
date_end=datetime.date(2022, 11, 1),
date_issue=datetime.date(2022, 11, 30),
)
pool = Pool.objects.create(
campaign=campaign,
draft=True,
status='completed',
)
app = login(app)
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk))
assert '/manage/invoicing/campaign/%s/pool/%s/delete/' % (campaign.pk, pool.pk) in resp
app.get('/manage/invoicing/campaign/%s/pool/%s/journal/' % (0, pool.pk), status=404)
app.get('/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign2.pk, pool.pk), status=404)
app.get('/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, 0), status=404)
pool.draft = False
pool.save()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk))
assert '/manage/invoicing/campaign/%s/pool/%s/delete/' % (campaign.pk, pool.pk) not in resp
pool.draft = True
pool.status = 'registered'
pool.save()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk))
assert '/manage/invoicing/campaign/%s/pool/%s/delete/' % (campaign.pk, pool.pk) not in resp
pool.status = 'running'
pool.save()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk))
assert '/manage/invoicing/campaign/%s/pool/%s/delete/' % (campaign.pk, pool.pk) not in resp
pool.status = 'failed'
pool.save()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk))
assert '/manage/invoicing/campaign/%s/pool/%s/delete/' % (campaign.pk, pool.pk) in resp
line = DraftInvoiceLine.objects.create(
event_date=datetime.date(2022, 9, 1),
quantity=1,
unit_amount=1,
total_amount=1,
status='success',
pool=pool,
)
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk))
assert '<span class="tag tag-success">1</span>' in resp
assert 'tag-warning' not in resp
assert 'tag-error' not in resp
line.status = 'error'
line.save()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk))
assert 'tag-success' not in resp
assert 'tag-warning' not in resp
assert '<span class="tag tag-error">1</span>' in resp
line.status = 'warning'
line.save()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk))
assert 'tag-success' not in resp
assert '<span class="tag tag-warning">1</span>' in resp
assert 'tag-error' not in resp
line.delete()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk))
assert 'tag-success' not in resp
assert 'tag-warning' not in resp
assert 'tag-error' not in resp
pool.draft = False
pool.save()
line = InvoiceLine.objects.create(
event_date=datetime.date(2022, 9, 1),
quantity=1,
unit_amount=1,
total_amount=1,
status='success',
pool=pool,
)
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk))
assert '<span class="tag tag-success">1</span>' in resp
assert 'tag-warning' not in resp
assert 'tag-error' not in resp
line.status = 'error'
line.save()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk))
assert 'tag-success' not in resp
assert 'tag-warning' not in resp
assert '<span class="tag tag-error">1</span>' in resp
line.status = 'warning'
line.save()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk))
assert 'tag-success' not in resp
assert '<span class="tag tag-warning">1</span>' in resp
assert 'tag-error' not in resp
line.status = 'error'
line.error_status = 'ignored'
line.save()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk))
assert 'tag-success' not in resp
assert 'tag-warning' not in resp
assert '<span class="tag tag-error">1</span>' not in resp
line.error_status = 'fixed'
line.save()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk))
assert 'tag-success' not in resp
assert 'tag-warning' not in resp
assert '<span class="tag tag-error">1</span>' not in resp
@pytest.mark.parametrize('draft', [True, False])
def test_journal_pool_lines(app, admin_user, draft):
invoice_model = DraftInvoice if draft else Invoice
line_model = DraftInvoiceLine if draft else InvoiceLine
campaign = Campaign.objects.create(
date_start=datetime.date(2022, 9, 1),
date_end=datetime.date(2022, 10, 1),
date_issue=datetime.date(2022, 10, 31),
)
pool = Pool.objects.create(
campaign=campaign,
draft=draft,
status='completed',
)
regie1 = Regie.objects.create(label='Foo1')
regie2 = Regie.objects.create(label='Foo1')
invoice1 = invoice_model.objects.create(
date_issue=datetime.date.today(), regie=regie1, pool=pool, payer='payer:1'
)
invoice2 = invoice_model.objects.create(
date_issue=datetime.date.today(), regie=regie2, pool=pool, payer='payer:2'
)
if not draft:
invoice1.set_number()
invoice1.save()
invoice2.set_number()
invoice2.save()
lines = [
line_model.objects.create(
event_date=datetime.date(2022, 9, 1),
invoice=invoice1,
quantity=1,
unit_amount=1,
total_amount=1,
status='success',
pool=pool,
pricing_data={'foo': 'bar'},
event={'event': 'foobar'},
user_external_id='user:1',
payer_external_id='payer:1',
),
]
errors = [
('AgendaPricingNotFound', {}),
('CriteriaConditionNotFound', {'category': 'cat-foo'}),
('MultipleDefaultCriteriaCondition', {'category': 'cat-foo'}),
('PricingDataError', {'criterias': {'qf': 'qf-1', 'foo': 'bar'}}),
('PricingDataFormatError', {'pricing': 'foobar', 'wanted': 'decimal'}),
('PricingUnknownCheckStatusError', {'status': 'unknown'}),
('PricingEventNotCheckedError', {}),
('PricingBookingNotCheckedError', {}),
('PricingMultipleBookingError', {}),
('PricingBookingCheckTypeError', {'reason': 'not-found'}),
(
'PricingBookingCheckTypeError',
{
'check_type_group': 'foo-bar',
'check_type': 'foo-reason',
'reason': 'not-configured',
},
),
(
'PricingBookingCheckTypeError',
{'check_type_group': 'foo-bar', 'check_type': 'foo-reason', 'reason': 'wrong-kind'},
),
]
for error, error_details in errors:
lines.append(
line_model.objects.create(
event_date=datetime.date(2022, 9, 1),
quantity=1,
unit_amount=1,
total_amount=1,
status='warning' if error == 'AgendaPricingNotFound' else 'error',
pool=pool,
pricing_data={
'error': error,
'error_details': error_details,
},
event={'event': 'foobar'},
user_external_id='user:1',
payer_external_id='payer:2',
)
)
if not draft:
lines[-1].error_status = 'ignored'
lines[-1].save()
lines[-2].error_status = 'fixed'
lines[-2].save()
lines.append(
line_model.objects.create(
event_date=datetime.date(2022, 9, 1),
invoice=invoice2,
quantity=1,
unit_amount=1,
total_amount=1,
status='success',
pool=pool,
pricing_data={'foo': 'bar'},
event={'event': 'foobar2'},
user_external_id='user:2',
payer_external_id='payer:2',
),
)
def format_status(value):
return (' '.join([v.strip() for v in value.split('\n')])).strip()
app = login(app)
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk))
assert format_status(resp.pyquery('tr[data-line-id="%s"] td.status' % lines[0].pk).text()) == 'Success'
assert (
resp.pyquery('tr[data-details-for-line-id="%s"] td pre' % lines[0].pk).text().strip()
== "{'foo': 'bar'} {'event': 'foobar'}"
)
assert (
format_status(resp.pyquery('tr[data-line-id="%s"] td.status' % lines[1].pk).text())
== 'Warning (Agenda pricing not found)'
)
assert (
resp.pyquery('tr[data-details-for-line-id="%s"] td pre' % lines[1].pk).text().strip()
== "{'error': 'AgendaPricingNotFound', 'error_details': {}} {'event': 'foobar'}"
)
assert (
format_status(resp.pyquery('tr[data-line-id="%s"] td.status' % lines[2].pk).text())
== 'Error (No matching criteria for category: cat-foo) ignore - mark as fixed'
)
assert (
resp.pyquery('tr[data-details-for-line-id="%s"] td pre' % lines[2].pk).text().strip()
== "{'error': 'CriteriaConditionNotFound', 'error_details': {'category': 'cat-foo'}} {'event': 'foobar'}"
)
assert (
format_status(resp.pyquery('tr[data-line-id="%s"] td.status' % lines[3].pk).text())
== 'Error (Multiple default criteria found for category: cat-foo) ignore - mark as fixed'
)
assert (
resp.pyquery('tr[data-details-for-line-id="%s"] td pre' % lines[3].pk).text().strip()
== "{'error': 'MultipleDefaultCriteriaCondition', 'error_details': {'category': 'cat-foo'}} {'event': 'foobar'}"
)
assert (
format_status(resp.pyquery('tr[data-line-id="%s"] td.status' % lines[4].pk).text())
== 'Error (Impossible to determine a pricing for criterias: qf-1 (category: qf), bar (category: foo)) ignore - mark as fixed'
)
assert (
resp.pyquery('tr[data-details-for-line-id="%s"] td pre' % lines[4].pk).text().strip()
== "{'error': 'PricingDataError', 'error_details': {'criterias': {'foo': 'bar', 'qf': 'qf-1'}}} {'event': 'foobar'}"
)
assert (
format_status(resp.pyquery('tr[data-line-id="%s"] td.status' % lines[5].pk).text())
== 'Error (Pricing is not a decimal: foobar) ignore - mark as fixed'
)
assert (
resp.pyquery('tr[data-details-for-line-id="%s"] td pre' % lines[5].pk).text().strip()
== "{'error': 'PricingDataFormatError', 'error_details': {'pricing': 'foobar', 'wanted': 'decimal'}} {'event': 'foobar'}"
)
assert (
format_status(resp.pyquery('tr[data-line-id="%s"] td.status' % lines[6].pk).text())
== 'Error (Unknown check status: unknown) ignore - mark as fixed'
)
assert (
resp.pyquery('tr[data-details-for-line-id="%s"] td pre' % lines[6].pk).text().strip()
== "{'error': 'PricingUnknownCheckStatusError', 'error_details': {'status': 'unknown'}} {'event': 'foobar'}"
)
assert (
format_status(resp.pyquery('tr[data-line-id="%s"] td.status' % lines[7].pk).text())
== 'Error (Event is not checked) ignore - mark as fixed'
)
assert (
resp.pyquery('tr[data-details-for-line-id="%s"] td pre' % lines[7].pk).text().strip()
== "{'error': 'PricingEventNotCheckedError', 'error_details': {}} {'event': 'foobar'}"
)
assert (
format_status(resp.pyquery('tr[data-line-id="%s"] td.status' % lines[8].pk).text())
== 'Error (Booking is not checked) ignore - mark as fixed'
)
assert (
resp.pyquery('tr[data-details-for-line-id="%s"] td pre' % lines[8].pk).text().strip()
== "{'error': 'PricingBookingNotCheckedError', 'error_details': {}} {'event': 'foobar'}"
)
assert (
format_status(resp.pyquery('tr[data-line-id="%s"] td.status' % lines[9].pk).text())
== 'Error (Multiple booking found) ignore - mark as fixed'
)
assert (
resp.pyquery('tr[data-details-for-line-id="%s"] td pre' % lines[9].pk).text().strip()
== "{'error': 'PricingMultipleBookingError', 'error_details': {}} {'event': 'foobar'}"
)
assert (
format_status(resp.pyquery('tr[data-line-id="%s"] td.status' % lines[10].pk).text())
== 'Error (Check type error: not found) ignore - mark as fixed'
)
assert (
resp.pyquery('tr[data-details-for-line-id="%s"] td pre' % lines[10].pk).text().strip()
== "{'error': 'PricingBookingCheckTypeError', 'error_details': {'reason': 'not-found'}} {'event': 'foobar'}"
)
if draft:
assert (
format_status(resp.pyquery('tr[data-line-id="%s"] td.status' % lines[11].pk).text())
== 'Error (Check type error: pricing not configured (group: foo-bar, check type: foo-reason)) ignore - mark as fixed'
)
else:
assert (
format_status(resp.pyquery('tr[data-line-id="%s"] td.status' % lines[11].pk).text())
== 'Fixed (Check type error: pricing not configured (group: foo-bar, check type: foo-reason)) reset'
)
assert resp.pyquery('tr[data-details-for-line-id="%s"] td pre' % lines[11].pk).text().strip() == (
"{'error': 'PricingBookingCheckTypeError', 'error_details': {'check_type': 'foo-reason', "
"'check_type_group': 'foo-bar', 'reason': 'not-configured'}} {'event': 'foobar'}"
)
if draft:
assert (
format_status(resp.pyquery('tr[data-line-id="%s"] td.status' % lines[12].pk).text())
== 'Error (Check type error: wrong kind (group: foo-bar, check type: foo-reason)) ignore - mark as fixed'
)
else:
assert (
format_status(resp.pyquery('tr[data-line-id="%s"] td.status' % lines[12].pk).text())
== 'Ignored (Check type error: wrong kind (group: foo-bar, check type: foo-reason)) reset'
)
assert resp.pyquery('tr[data-details-for-line-id="%s"] td pre' % lines[12].pk).text().strip() == (
"{'error': 'PricingBookingCheckTypeError', 'error_details': {'check_type': 'foo-reason', "
"'check_type_group': 'foo-bar', 'reason': 'wrong-kind'}} {'event': 'foobar'}"
)
assert format_status(resp.pyquery('tr[data-line-id="%s"] td.status' % lines[13].pk).text()) == 'Success'
assert (
resp.pyquery('tr[data-details-for-line-id="%s"] td pre' % lines[13].pk).text().strip()
== "{'foo': 'bar'} {'event': 'foobar2'}"
)
# test filters
resp = app.get(
'/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk),
params={'regie': regie1.pk},
)
assert len(resp.pyquery('tr td.status')) == 1
if draft:
resp = app.get(
'/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk),
params={'invoice_id': invoice1.pk},
)
assert len(resp.pyquery('tr td.status')) == 1
else:
resp = app.get(
'/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk),
params={'invoice_number': invoice1.formatted_number},
)
assert len(resp.pyquery('tr td.status')) == 1
resp = app.get(
'/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk),
params={'invoice_number': invoice1.created_at.strftime('%y-%m')},
)
assert len(resp.pyquery('tr td.status')) == 2
resp = app.get(
'/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk),
params={'pk': lines[0].pk},
)
assert len(resp.pyquery('tr td.status')) == 1
resp = app.get(
'/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk),
params={'payer_external_id': 'payer:1'},
)
assert len(resp.pyquery('tr td.status')) == 1
resp = app.get(
'/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk),
params={'payer_external_id': 'payer:2'},
)
assert len(resp.pyquery('tr td.status')) == 13
resp = app.get(
'/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk),
params={'user_external_id': 'user:1'},
)
assert len(resp.pyquery('tr td.status')) == 13
resp = app.get(
'/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk),
params={'user_external_id': 'user:2'},
)
assert len(resp.pyquery('tr td.status')) == 1
resp = app.get(
'/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk),
params={'status': 'success'},
)
assert len(resp.pyquery('tr td.status')) == 2
resp = app.get(
'/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk),
params={'status': 'warning'},
)
assert len(resp.pyquery('tr td.status')) == 1
resp = app.get(
'/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk),
params={'status': 'error'},
)
assert len(resp.pyquery('tr td.status')) == 11
if not draft:
resp = app.get(
'/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk),
params={'status': 'error_todo'},
)
assert len(resp.pyquery('tr td.status')) == 9
resp = app.get(
'/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk),
params={'status': 'error_ignored'},
)
assert len(resp.pyquery('tr td.status')) == 1
resp = app.get(
'/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk),
params={'status': 'error_fixed'},
)
assert len(resp.pyquery('tr td.status')) == 1
def test_delete_pool(app, admin_user):
campaign = Campaign.objects.create(
date_start=datetime.date(2022, 9, 1),
date_end=datetime.date(2022, 10, 1),
date_issue=datetime.date(2022, 10, 31),
)
campaign2 = Campaign.objects.create(
date_start=datetime.date(2022, 10, 1),
date_end=datetime.date(2022, 11, 1),
date_issue=datetime.date(2022, 11, 30),
)
pool = Pool.objects.create(
campaign=campaign,
draft=True,
status='completed',
)
regie = Regie.objects.create(label='Foo')
invoice = DraftInvoice.objects.create(date_issue=datetime.date.today(), regie=regie, pool=pool)
DraftInvoiceLine.objects.create(
event_date=datetime.date(2022, 9, 1),
invoice=invoice,
quantity=1,
unit_amount=1,
total_amount=1,
status='success',
pool=pool,
)
app = login(app)
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/delete/' % (campaign.pk, pool.pk))
resp = resp.form.submit()
assert Pool.objects.count() == 0
assert resp.location.endswith('/manage/invoicing/campaign/%s/#open:pools' % campaign.pk)
pool.draft = True
pool.save()
app.get('/manage/invoicing/campaign/%s/pool/%s/delete/' % (0, pool.pk), status=404)
app.get('/manage/invoicing/campaign/%s/pool/%s/delete/' % (campaign2.pk, pool.pk), status=404)
app.get('/manage/invoicing/campaign/%s/pool/%s/delete/' % (campaign.pk, 0), status=404)
pool.status = 'registered'
pool.save()
app.get('/manage/invoicing/campaign/%s/pool/%s/delete/' % (campaign.pk, pool.pk), status=404)
pool.status = 'running'
pool.save()
app.get('/manage/invoicing/campaign/%s/pool/%s/delete/' % (campaign.pk, pool.pk), status=404)
pool.draft = False
pool.status = 'error'
pool.save()
app.get('/manage/invoicing/campaign/%s/pool/%s/delete/' % (campaign.pk, pool.pk), status=404)
pool.draft = True
pool.save()
app.get('/manage/invoicing/campaign/%s/pool/%s/delete/' % (campaign.pk, pool.pk))
def test_set_error_status_line(app, admin_user):
campaign = Campaign.objects.create(
date_start=datetime.date(2022, 9, 1),
date_end=datetime.date(2022, 10, 1),
date_issue=datetime.date(2022, 10, 31),
)
pool = Pool.objects.create(
campaign=campaign,
draft=False,
status='completed',
)
line = InvoiceLine.objects.create(
event_date=datetime.date(2022, 9, 1),
quantity=1,
unit_amount=1,
total_amount=1,
status='success',
pool=pool,
)
app = login(app)
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk))
assert (
'/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/reset/' % (campaign.pk, pool.pk, line.pk)
not in resp
)
assert (
'/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/ignore/' % (campaign.pk, pool.pk, line.pk)
not in resp
)
assert (
'/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/fix/' % (campaign.pk, pool.pk, line.pk)
not in resp
)
app.get(
'/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/reset/' % (campaign.pk, pool.pk, line.pk),
status=404,
)
app.get(
'/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/ignore/' % (campaign.pk, pool.pk, line.pk),
status=404,
)
app.get(
'/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/fix/' % (campaign.pk, pool.pk, line.pk),
status=404,
)
line.status = 'warning'
line.save()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk))
assert (
'/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/reset/' % (campaign.pk, pool.pk, line.pk)
not in resp
)
assert (
'/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/ignore/' % (campaign.pk, pool.pk, line.pk)
not in resp
)
assert (
'/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/fix/' % (campaign.pk, pool.pk, line.pk)
not in resp
)
app.get(
'/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/reset/' % (campaign.pk, pool.pk, line.pk),
status=404,
)
app.get(
'/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/ignore/' % (campaign.pk, pool.pk, line.pk),
status=404,
)
app.get(
'/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/fix/' % (campaign.pk, pool.pk, line.pk),
status=404,
)
line.status = 'error'
line.save()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk))
assert (
'/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/reset/' % (campaign.pk, pool.pk, line.pk)
not in resp
)
assert (
'/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/ignore/' % (campaign.pk, pool.pk, line.pk) in resp
)
assert '/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/fix/' % (campaign.pk, pool.pk, line.pk) in resp
line.error_status = 'ignored'
line.save()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk))
assert (
'/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/reset/' % (campaign.pk, pool.pk, line.pk) in resp
)
assert (
'/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/ignore/' % (campaign.pk, pool.pk, line.pk)
not in resp
)
assert (
'/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/fix/' % (campaign.pk, pool.pk, line.pk)
not in resp
)
line.error_status = 'fixed'
line.save()
resp = app.get('/manage/invoicing/campaign/%s/pool/%s/journal/' % (campaign.pk, pool.pk))
assert (
'/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/reset/' % (campaign.pk, pool.pk, line.pk) in resp
)
assert (
'/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/ignore/' % (campaign.pk, pool.pk, line.pk)
not in resp
)
assert (
'/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/fix/' % (campaign.pk, pool.pk, line.pk)
not in resp
)
app.get('/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/reset/' % (campaign.pk, pool.pk, line.pk))
line.refresh_from_db()
assert line.error_status == ''
app.get('/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/ignore/' % (campaign.pk, pool.pk, line.pk))
line.refresh_from_db()
assert line.error_status == 'ignored'
app.get('/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/fix/' % (campaign.pk, pool.pk, line.pk))
line.refresh_from_db()
assert line.error_status == 'fixed'
app.get('/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/reset/' % (0, pool.pk, line.pk), status=404)
app.get(
'/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/reset/' % (campaign.pk, 0, line.pk), status=404
)
app.get(
'/manage/invoicing/ajax/campaign/%s/pool/%s/line/%s/reset/' % (campaign.pk, pool.pk, 0), status=404
)
def test_non_invoiced_line_list(app, admin_user):
regie = Regie.objects.create(label='Regie')
campaign = Campaign.objects.create(
date_start=datetime.date(2022, 9, 1),
date_end=datetime.date(2022, 10, 1),
date_issue=datetime.date(2022, 10, 31),
)
pool = Pool.objects.create(
campaign=campaign,
draft=True,
)
other_campaign = Campaign.objects.create(
date_start=datetime.date(2022, 9, 1),
date_end=datetime.date(2022, 10, 1),
date_issue=datetime.date(2022, 10, 31),
)
other_pool = Pool.objects.create(
campaign=other_campaign,
draft=False,
)
# not invoiced
InjectedLine.objects.create(
event_date=datetime.date(2022, 9, 1),
slug='event-2022-09-01',
label='Event 2022-09-01',
quantity=2,
unit_amount=1.5,
total_amount=3,
user_external_id='user:1',
payer_external_id='payer:1',
regie=regie,
)
# not invoiced, but linked in a DraftInvoiceLine
injected_line2 = InjectedLine.objects.create(
event_date=datetime.date(2022, 9, 2),
slug='event-2022-09-02',
label='Event 2022-09-02',
quantity=2,
unit_amount=1.5,
total_amount=3,
user_external_id='user:1',
payer_external_id='payer:1',
regie=regie,
)
DraftInvoiceLine.objects.create(
event_date=datetime.date(2022, 9, 2),
slug='event-2022-09-02',
label='Event 2022-09-02',
quantity=2,
unit_amount=1.5,
total_amount=3,
pool=pool,
from_injected_line=injected_line2,
)
# invoiced, as linked in a non draft pool
injected_line3 = InjectedLine.objects.create(
event_date=datetime.date(2022, 9, 3),
slug='event-2022-09-03',
label='Event 2022-09-03',
quantity=2,
unit_amount=1.5,
total_amount=3,
user_external_id='user:1',
payer_external_id='payer:1',
regie=regie,
)
InvoiceLine.objects.create(
event_date=datetime.date(2022, 9, 3),
slug='event-2022-09-03',
label='Event 2022-09-03',
quantity=2,
unit_amount=1.5,
total_amount=3,
pool=other_pool,
from_injected_line=injected_line3,
)
# non fixed error
InvoiceLine.objects.create(
event_date=datetime.date(2022, 9, 4),
slug='event-2022-09-04',
label='Event 2022-09-04',
quantity=0,
unit_amount=0,
total_amount=0,
pool=other_pool,
status='error',
)
# fixed or ignored errors
InvoiceLine.objects.create(
event_date=datetime.date(2022, 9, 5),
slug='event-2022-09-05',
label='Event 2022-09-05',
quantity=0,
unit_amount=0,
total_amount=0,
pool=other_pool,
status='error',
error_status='fixed',
)
InvoiceLine.objects.create(
event_date=datetime.date(2022, 9, 6),
slug='event-2022-09-06',
label='Event 2022-09-06',
quantity=0,
unit_amount=0,
total_amount=0,
pool=other_pool,
status='error',
error_status='ignored',
)
# not errors
InvoiceLine.objects.create(
event_date=datetime.date(2022, 9, 7),
slug='event-2022-09-07',
label='Event 2022-09-07',
quantity=0,
unit_amount=0,
total_amount=0,
pool=other_pool,
status='success',
)
InvoiceLine.objects.create(
event_date=datetime.date(2022, 9, 8),
slug='event-2022-09-08',
label='Event 2022-09-08',
quantity=0,
unit_amount=0,
total_amount=0,
pool=other_pool,
status='warning',
)
app = login(app)
resp = app.get('/manage/invoicing/campaigns/non-invoiced-lines/')
assert 'event-2022-09-01' in resp
assert 'event-2022-09-02' in resp
assert 'event-2022-09-03' not in resp
assert 'event-2022-09-04' in resp
assert 'event-2022-09-05' not in resp
assert 'event-2022-09-06' not in resp
assert 'event-2022-09-07' not in resp
assert 'event-2022-09-08' not in resp