basket: aggregate items by accounting_code (#89025)

This commit is contained in:
Lauréline Guérin 2024-04-09 10:30:02 +02:00 committed by Lauréline Guérin
parent 00136cbf59
commit 4442785d18
5 changed files with 117 additions and 1 deletions

View File

@ -188,6 +188,7 @@ class BasketLineCloseView(APIView):
event_label,
agenda_slug,
activity_label,
accounting_code,
) in self.line.formatted_items:
DraftInvoiceLine.objects.create(
invoice=self.line.basket.draft_invoice,
@ -210,6 +211,7 @@ class BasketLineCloseView(APIView):
user_last_name=self.line.user_last_name,
quantity=quantity,
unit_amount=unit_amount,
accounting_code=accounting_code,
)

View File

@ -253,6 +253,7 @@ class BasketLine(models.Model):
item.event_label,
item.agenda_slug,
item.activity_label,
item.accounting_code,
)
)
return sorted(result, key=lambda a: a[0])
@ -269,6 +270,7 @@ class BasketLine(models.Model):
item.event_label,
item.agenda_slug,
item.activity_label,
item.accounting_code,
)
if key not in keys:
keys.append(key)
@ -300,6 +302,7 @@ class BasketLine(models.Model):
key[4],
key[5],
key[6],
key[7],
)
)
return sorted(result, key=lambda a: a[0])

View File

@ -19,7 +19,7 @@
{% endfor %}
<ul class="basket">
{% for line in basket.lines %}
{% for slug, label, description, quantity, unit_amount, total_amount, dummy, dummy, dummy, dummy in line.formatted_items %}
{% for slug, label, description, quantity, unit_amount, total_amount, dummy, dummy, dummy, dummy, dummy in line.formatted_items %}
<li class="basket-item">
<a class="basket-item--label" {% if line.form_url %}href="{{ line.form_url }}{% endif %}">{{ line.user_name }} - {{ label }}{% if description %} - {{ description }}{% endif %}</a>
<span class="basket-item--total-amount">{% blocktrans with amount=total_amount|floatformat:"2" %}{{ amount }}€{% endblocktrans %}</span>

View File

@ -505,6 +505,7 @@ def test_close_line(app, user):
event_label='Repas',
agenda_slug='agenda',
activity_label='Activity Label !',
accounting_code='424242',
)
BasketLineItem.objects.create(
line=line,
@ -517,6 +518,7 @@ def test_close_line(app, user):
event_label='Repas',
agenda_slug='agenda',
activity_label='Activity Label !',
accounting_code='424242',
)
BasketLineItem.objects.create(
line=line,
@ -529,6 +531,7 @@ def test_close_line(app, user):
event_label='Repas',
agenda_slug='agenda',
activity_label='Activity Label !',
accounting_code='424242',
)
basket_item = BasketLineItem.objects.create(
line=line,
@ -541,6 +544,7 @@ def test_close_line(app, user):
event_label='Repas',
agenda_slug='agenda',
activity_label='Activity Label !',
accounting_code='424242',
)
BasketLineItem.objects.create(
line=line,
@ -553,6 +557,7 @@ def test_close_line(app, user):
event_label='Mercredi',
agenda_slug='agenda',
activity_label='Activity Label !',
accounting_code='424243',
)
BasketLineItem.objects.create(
line=line,
@ -565,6 +570,7 @@ def test_close_line(app, user):
event_label='Mercredi',
agenda_slug='agenda',
activity_label='Activity Label !',
accounting_code='424243',
)
# no grouping
resp = app.post('/api/regie/foo/basket/%s/line/%s/close/' % (basket.uuid, line.uuid))
@ -585,6 +591,7 @@ def test_close_line(app, user):
assert line1.quantity == -decimal.Decimal('0.5')
assert line1.unit_amount == 5
assert line1.total_amount == -decimal.Decimal('2.5')
assert line1.accounting_code == '424243'
assert line1.user_external_id == 'user:1'
assert line1.user_first_name == 'First1'
assert line1.user_last_name == 'Last1'
@ -606,6 +613,7 @@ def test_close_line(app, user):
assert line2.quantity == 1
assert line2.unit_amount == 5
assert line2.total_amount == 5
assert line2.accounting_code == '424243'
assert line2.user_external_id == 'user:1'
assert line2.user_first_name == 'First1'
assert line2.user_last_name == 'Last1'
@ -619,6 +627,7 @@ def test_close_line(app, user):
assert line3.quantity == -1
assert line3.unit_amount == 3
assert line3.total_amount == -3
assert line3.accounting_code == '424242'
assert line3.user_external_id == 'user:1'
assert line3.user_first_name == 'First1'
assert line3.user_last_name == 'Last1'
@ -632,6 +641,7 @@ def test_close_line(app, user):
assert line4.quantity == -1
assert line4.unit_amount == 3
assert line4.total_amount == -3
assert line4.accounting_code == '424242'
assert line4.user_external_id == 'user:1'
assert line4.user_first_name == 'First1'
assert line4.user_last_name == 'Last1'
@ -645,6 +655,7 @@ def test_close_line(app, user):
assert line5.quantity == 1
assert line5.unit_amount == 3
assert line5.total_amount == 3
assert line5.accounting_code == '424242'
assert line5.user_external_id == 'user:1'
assert line5.user_first_name == 'First1'
assert line5.user_last_name == 'Last1'
@ -658,6 +669,7 @@ def test_close_line(app, user):
assert line6.quantity == 2
assert line6.unit_amount == 3
assert line6.total_amount == 6
assert line6.accounting_code == '424242'
assert line6.user_external_id == 'user:1'
assert line6.user_first_name == 'First1'
assert line6.user_last_name == 'Last1'
@ -684,6 +696,7 @@ def test_close_line(app, user):
assert line1.quantity == -decimal.Decimal('0.5')
assert line1.unit_amount == 5
assert line1.total_amount == -decimal.Decimal('2.5')
assert line1.accounting_code == '424243'
assert line1.user_external_id == 'user:1'
assert line1.user_first_name == 'First1'
assert line1.user_last_name == 'Last1'
@ -697,6 +710,7 @@ def test_close_line(app, user):
assert line2.quantity == 1
assert line2.unit_amount == 5
assert line2.total_amount == 5
assert line2.accounting_code == '424243'
assert line2.user_external_id == 'user:1'
assert line2.user_first_name == 'First1'
assert line2.user_last_name == 'Last1'
@ -710,6 +724,7 @@ def test_close_line(app, user):
assert line3.quantity == -2
assert line3.unit_amount == 3
assert line3.total_amount == -6
assert line3.accounting_code == '424242'
assert line3.user_external_id == 'user:1'
assert line3.user_first_name == 'First1'
assert line3.user_last_name == 'Last1'
@ -723,6 +738,7 @@ def test_close_line(app, user):
assert line4.quantity == 3
assert line4.unit_amount == 3
assert line4.total_amount == 9
assert line4.accounting_code == '424242'
assert line4.user_external_id == 'user:1'
assert line4.user_first_name == 'First1'
assert line4.user_last_name == 'Last1'
@ -753,6 +769,7 @@ def test_close_line(app, user):
assert line1.quantity == -decimal.Decimal('0.5')
assert line1.unit_amount == 5
assert line1.total_amount == -decimal.Decimal('2.5')
assert line1.accounting_code == '424243'
assert line1.user_external_id == 'user:1'
assert line1.user_first_name == 'First1'
assert line1.user_last_name == 'Last1'
@ -766,6 +783,7 @@ def test_close_line(app, user):
assert line2.quantity == 1
assert line2.unit_amount == 5
assert line2.total_amount == 5
assert line2.accounting_code == '424243'
assert line2.user_external_id == 'user:1'
assert line2.user_first_name == 'First1'
assert line2.user_last_name == 'Last1'
@ -779,6 +797,7 @@ def test_close_line(app, user):
assert line3.quantity == -1
assert line3.unit_amount == 3
assert line3.total_amount == -3
assert line3.accounting_code == '424242'
assert line3.user_external_id == 'user:1'
assert line3.user_first_name == 'First1'
assert line3.user_last_name == 'Last1'
@ -792,6 +811,7 @@ def test_close_line(app, user):
assert line4.quantity == -1
assert line4.unit_amount == 3
assert line4.total_amount == -3
assert line4.accounting_code == '424242'
assert line4.user_external_id == 'user:1'
assert line4.user_first_name == 'First1'
assert line4.user_last_name == 'Last1'
@ -805,6 +825,95 @@ def test_close_line(app, user):
assert line5.quantity == 3
assert line5.unit_amount == 3
assert line5.total_amount == 9
assert line5.accounting_code == '424242'
assert line5.user_external_id == 'user:1'
assert line5.user_first_name == 'First1'
assert line5.user_last_name == 'Last1'
# grouping but accounting_code are not the same
basket_item.event_slug = 'agenda@repas'
basket_item.event_label = 'Repas'
basket_item.agenda_slug = 'agenda'
basket_item.activity_label = 'Activity Label !'
basket_item.accounting_code = '424244'
basket_item.save()
line.closed = False
line.save()
invoice.lines.all().delete()
resp = app.post('/api/regie/foo/basket/%s/line/%s/close/' % (basket.uuid, line.uuid))
assert resp.json == {'err': 0, 'data': {'line_id': str(line.uuid), 'closed': True}}
line.refresh_from_db()
assert line.closed is True
basket.refresh_from_db()
assert invoice.lines.count() == 5
line1, line2, line3, line4, line5 = invoice.lines.all().order_by('pk')
assert line1.slug == 'mercredi-annulation-mer-1511'
assert line1.event_slug == 'agenda@mercredi'
assert line1.event_label == 'Mercredi'
assert line1.agenda_slug == 'agenda'
assert line1.activity_label == 'Activity Label !'
assert line1.label == 'Mercredi'
assert line1.description == 'Annulation Mer 15/11'
assert line1.quantity == -decimal.Decimal('0.5')
assert line1.unit_amount == 5
assert line1.total_amount == -decimal.Decimal('2.5')
assert line1.accounting_code == '424243'
assert line1.user_external_id == 'user:1'
assert line1.user_first_name == 'First1'
assert line1.user_last_name == 'Last1'
assert line2.slug == 'mercredi-reservation-mer-811'
assert line2.event_slug == 'agenda@mercredi'
assert line2.event_label == 'Mercredi'
assert line2.agenda_slug == 'agenda'
assert line2.activity_label == 'Activity Label !'
assert line2.label == 'Mercredi'
assert line2.description == 'Réservation Mer 8/11'
assert line2.quantity == 1
assert line2.unit_amount == 5
assert line2.total_amount == 5
assert line2.accounting_code == '424243'
assert line2.user_external_id == 'user:1'
assert line2.user_first_name == 'First1'
assert line2.user_last_name == 'Last1'
assert line3.slug == 'repas-annulation-jeu-1611'
assert line3.event_slug == 'agenda@repas'
assert line3.event_label == 'Repas'
assert line3.agenda_slug == 'agenda'
assert line3.activity_label == 'Activity Label !'
assert line3.label == 'Repas'
assert line3.description == 'Annulation Jeu 16/11'
assert line3.quantity == -1
assert line3.unit_amount == 3
assert line3.total_amount == -3
assert line3.accounting_code == '424244'
assert line3.user_external_id == 'user:1'
assert line3.user_first_name == 'First1'
assert line3.user_last_name == 'Last1'
assert line4.slug == 'repas-annulation-jeu-911'
assert line4.event_slug == 'agenda@repas'
assert line4.event_label == 'Repas'
assert line4.agenda_slug == 'agenda'
assert line4.activity_label == 'Activity Label !'
assert line4.label == 'Repas'
assert line4.description == 'Annulation Jeu 9/11'
assert line4.quantity == -1
assert line4.unit_amount == 3
assert line4.total_amount == -3
assert line4.accounting_code == '424242'
assert line4.user_external_id == 'user:1'
assert line4.user_first_name == 'First1'
assert line4.user_last_name == 'Last1'
assert line5.slug == 'repas-reservation-lun-611-mar-711-lun-1311'
assert line5.event_slug == 'agenda@repas'
assert line5.event_label == 'Repas'
assert line5.agenda_slug == 'agenda'
assert line5.activity_label == 'Activity Label !'
assert line5.label == 'Repas'
assert line5.description == 'Réservation Lun 6/11, Mar 7/11, Lun 13/11'
assert line5.quantity == 3
assert line5.unit_amount == 3
assert line5.total_amount == 9
assert line5.accounting_code == '424242'
assert line5.user_external_id == 'user:1'
assert line5.user_first_name == 'First1'
assert line5.user_last_name == 'Last1'

View File

@ -712,6 +712,7 @@ def test_basket_validate_generate_credit(app, simple_user):
event_label='Repas',
agenda_slug='agenda',
activity_label='Activity Label !',
accounting_code='424242',
)
draft_invoice.refresh_from_db()
assert draft_invoice.total_amount == -1
@ -774,6 +775,7 @@ def test_basket_validate_generate_credit(app, simple_user):
assert line1.event_label == 'Repas'
assert line1.agenda_slug == 'agenda'
assert line1.activity_label == 'Activity Label !'
assert line1.accounting_code == '424242'
assert Invoice.objects.count() == 0
# check callback