invoicing: a final pool can be deleted (#75558) #43

Merged
lguerin merged 1 commits from wip/75558-delete-final-pool into main 2023-04-11 16:09:31 +02:00
5 changed files with 34 additions and 23 deletions

View File

@ -15,7 +15,7 @@
</h2>
<span class="actions">
<a href="{% url 'lingo-manager-invoicing-pool-journal' regie_pk=regie.pk pk=object.pk pool_pk=pool.pk %}">{% trans "Journal" %}</a>
{% if pool.draft and pool.status != 'registered' and pool.status != 'running' %}
{% if pool.status != 'registered' and pool.status != 'running' %}
<a href="{% url 'lingo-manager-invoicing-pool-delete' regie_pk=regie.pk pk=object.pk pool_pk=pool.pk %}" rel="popup">{% trans "Delete" %}</a>
{% endif %}
{% if not object.invalid and pool.draft and pool.status == 'completed' and pool.is_last %}

View File

@ -13,7 +13,7 @@
{% if pool.error_count %}<span class="meta meta-error">{{ pool.error_count }}</span>{% endif %}
{{ pool.created_at|date:"DATETIME_FORMAT" }}
</h2>
{% if pool.draft and pool.status != 'registered' and pool.status != 'running' %}
{% if pool.status != 'registered' and pool.status != 'running' %}
<span class="actions">
<a href="{% url 'lingo-manager-invoicing-pool-delete' regie_pk=regie.pk pk=object.pk pool_pk=pool.pk %}" rel="popup">{% trans "Delete" %}</a>
</span>

View File

@ -13,7 +13,7 @@
{% block content %}
<form method="post">
{% csrf_token %}
<p>{% trans "Are you sure you want to promote this pool ? This action is irreversible." %}</p>
<p>{% trans "Are you sure you want to promote this pool ?" %}</p>
<div class="buttons">
<button class="submit-button">{% trans "Promote" %}</button>
<a class="cancel" href="{% url 'lingo-manager-invoicing-pool-detail' regie_pk=regie.pk pk=object.pk pool_pk=pool.pk %}">{% trans 'Cancel' %}</a>

View File

@ -555,22 +555,25 @@ class PoolDeleteView(DeleteView):
def dispatch(self, request, *args, **kwargs):
self.regie = get_object_or_404(Regie, pk=kwargs['regie_pk'])
self.campaign = get_object_or_404(
Campaign.objects.filter(regie=self.regie)
.exclude(pool__draft=False)
.exclude(pool__status__in=['registered', 'running']),
Campaign.objects.filter(regie=self.regie).exclude(pool__status__in=['registered', 'running']),
pk=kwargs['pk'],
)
return super().dispatch(request, *args, **kwargs)
def get_queryset(self):
return self.campaign.pool_set.filter(draft=True)
return self.campaign.pool_set.all()
def delete(self, request, *args, **kwargs):
self.object = self.get_object()
if self.object.is_last:
if self.object.is_last and self.object.draft:
pmarillonnet marked this conversation as resolved Outdated

Pas compris pourquoi on restreint le cas où la campagne devient invalide.
Intuitivement on pourrait se dire qu’à partir du moment où il y a eu suppression, ça invalide la campagne dans tous les cas, que le pool soit un brouillon ou non. Je loupe un truc ?

Pas compris pourquoi on restreint le cas où la campagne devient invalide. Intuitivement on pourrait se dire qu’à partir du moment où il y a eu suppression, ça invalide la campagne dans tous les cas, que le pool soit un brouillon ou non. Je loupe un truc ?

On ne peut promouvoir le dernier draft que si la campagne est valide.
Si on supprime le pool définitif, le dernier draft est toujours valide (et la campagne aussi), parce que rien n'a pu changer: ni les pointages, ni les params de date ou d'agenda de la campagne.

En faisant des tests de suppression du pool définitif en local, j'avais alors une campagne invalide et il me fallait relancer un draft pour pouvoir le promouvoir. Et ça n'était pas nécessaire.

On ne peut promouvoir le dernier draft que si la campagne est valide. Si on supprime le pool définitif, le dernier draft est toujours valide (et la campagne aussi), parce que rien n'a pu changer: ni les pointages, ni les params de date ou d'agenda de la campagne. En faisant des tests de suppression du pool définitif en local, j'avais alors une campagne invalide et il me fallait relancer un draft pour pouvoir le promouvoir. Et ça n'était pas nécessaire.

Ah oui ok, c’est plus clair, merci.

Ah oui ok, c’est plus clair, merci.
self.campaign.mark_as_invalid()
DraftInvoiceLine.objects.filter(pool=self.object).delete()
DraftInvoice.objects.filter(pool=self.object).delete()
invoice_model = Invoice
line_model = InvoiceLine
if self.object.draft:
invoice_model = DraftInvoice
line_model = DraftInvoiceLine
line_model.objects.filter(pool=self.object).delete()
invoice_model.objects.filter(pool=self.object).delete()
return super().delete(request, *args, **kwargs)
def get_success_url(self):

View File

@ -803,10 +803,7 @@ def test_detail_pool(app, admin_user):
pool.draft = False
pool.save()
resp = app.get('/manage/invoicing/regie/%s/campaign/%s/pool/%s/' % (regie.pk, campaign.pk, pool.pk))
assert (
'/manage/invoicing/regie/%s/campaign/%s/pool/%s/delete/' % (regie.pk, campaign.pk, pool.pk)
not in resp
)
assert '/manage/invoicing/regie/%s/campaign/%s/pool/%s/delete/' % (regie.pk, campaign.pk, pool.pk) in resp
assert (
'/manage/invoicing/regie/%s/campaign/%s/pool/%s/promote/' % (regie.pk, campaign.pk, pool.pk)
not in resp
@ -1232,10 +1229,7 @@ def test_journal_pool(app, admin_user):
resp = app.get(
'/manage/invoicing/regie/%s/campaign/%s/pool/%s/journal/' % (regie.pk, campaign.pk, pool.pk)
)
assert (
'/manage/invoicing/regie/%s/campaign/%s/pool/%s/delete/' % (regie.pk, campaign.pk, pool.pk)
not in resp
)
assert '/manage/invoicing/regie/%s/campaign/%s/pool/%s/delete/' % (regie.pk, campaign.pk, pool.pk) in resp
pool.draft = True
pool.status = 'registered'
@ -1947,7 +1941,7 @@ def test_delete_pool(app, admin_user):
assert campaign.invalid is True
pool.save()
Pool.objects.create(
pool2 = Pool.objects.create(
campaign=campaign,
draft=True,
status='completed',
@ -1963,6 +1957,7 @@ def test_delete_pool(app, admin_user):
# pool is not the last, don't invalidate the campaign
assert campaign.invalid is False
pool2.delete()
pool.draft = True
pool.save()
app.get('/manage/invoicing/regie/%s/campaign/%s/pool/%s/delete/' % (0, campaign.pk, pool.pk), status=404)
@ -1990,12 +1985,25 @@ def test_delete_pool(app, admin_user):
pool.draft = False
pool.status = 'error'
pool.save()
app.get(
'/manage/invoicing/regie/%s/campaign/%s/pool/%s/delete/' % (regie.pk, campaign.pk, pool.pk),
status=404,
invoice = Invoice.objects.create(date_issue=datetime.date.today(), regie=regie, pool=pool)
InvoiceLine.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/regie/%s/campaign/%s/pool/%s/delete/' % (regie.pk, campaign.pk, pool.pk),
)
resp.form.submit()
assert Pool.objects.count() == 0
campaign.refresh_from_db()
# pool is not draft, don't invalidate the campaign
assert campaign.invalid is False
pool.draft = True
pool.save()
app.get('/manage/invoicing/regie/%s/campaign/%s/pool/%s/delete/' % (regie.pk, campaign.pk, pool.pk))