basket: aggregate items by accounting_code (#89025)
This commit is contained in:
parent
00136cbf59
commit
4442785d18
|
@ -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,
|
||||
)
|
||||
|
||||
|
||||
|
|
|
@ -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])
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue