added checkbox for invoice calls

formatting

separated logic for get and post

created custom month field

fixed formatting

fixed imports
This commit is contained in:
Kenneth SOARES 2025-06-02 16:51:29 +02:00
parent 6803294358
commit 6e13e4fb36
4 changed files with 172 additions and 20 deletions

View File

@ -0,0 +1,47 @@
# Generated by Django 5.2 on 2025-06-11 12:53
import django.db.models.deletion
from django.db import migrations, models
import counter.models
class Migration(migrations.Migration):
dependencies = [
("club", "0014_alter_club_options_rename_unix_name_club_slug_name_and_more"),
("counter", "0031_alter_counter_options"),
]
operations = [
migrations.CreateModel(
name="InvoiceCall",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("validated", models.BooleanField(verbose_name="is validated")),
(
"month",
counter.models.MonthField(
max_length=7, verbose_name="invoice date"
),
),
(
"club",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="club.club"
),
),
],
options={
"verbose_name": "Invoice call",
"verbose_name_plural": "Invoice calls",
},
),
]

View File

@ -1362,3 +1362,46 @@ class ReturnableProductBalance(models.Model):
f"return balance of {self.customer} " f"return balance of {self.customer} "
f"for {self.returnable.product_id} : {self.balance}" f"for {self.returnable.product_id} : {self.balance}"
) )
class MonthField(models.DateField):
description = _("Year + month field")
def __init__(self, *args, **kwargs):
kwargs["max_length"] = 7
super().__init__(*args, **kwargs)
def db_type(self, connection):
return "char(7)"
def from_db_value(self, value, expression, connection):
if value is None:
return value
year, month = map(value.split("-"))
return date(year, month, 1)
def get_prep_value(self, value):
if isinstance(value, date):
return value.strftime("%Y-%m")
elif isinstance(value, str):
try:
datetime.strptime(value, "%Y-%m")
except ValueError:
raise ValueError("invalid format for date (use YYYY-mm)") from None
elif value is None:
return value
else:
raise TypeError("Invalid type for MonthField")
class InvoiceCall(models.Model):
validated = models.BooleanField(verbose_name=_("is validated"))
club = models.ForeignKey(Club, on_delete=models.CASCADE)
month = MonthField(verbose_name=_("invoice date"))
class Meta:
verbose_name = _("Invoice call")
verbose_name_plural = _("Invoice calls")
def __str__(self):
return f"invoice call of {self.month}/{self.year} made by {self.club}"

View File

@ -15,23 +15,32 @@
</select> </select>
<input type="submit" value="{% trans %}Go{% endtrans %}" /> <input type="submit" value="{% trans %}Go{% endtrans %}" />
</form> </form>
<br>
<p>{% trans %}CB Payments{% endtrans %} : {{ sum_cb }} €</p> <form method="post" action="">
<br> {% csrf_token %}
<table> <br>
<thead> <p>{% trans %}CB Payments{% endtrans %} : {{ sum_cb }} €</p>
<td>{% trans %}Club{% endtrans %}</td> <br>
<td>{% trans %}Sum{% endtrans %}</td>
</thead> <table>
<tbody> <thead>
{% for i in sums %} <td>{% trans %}Club{% endtrans %}</td>
<tr> <td>{% trans %}Sum{% endtrans %}</td>
<td>{{ i['club__name'] }}</td> <td>{% trans %}Validated{% endtrans %}</td>
<td>{{"%.2f"|format(i['selling_sum'])}} €</td> </thead>
</tr> <tbody>
{% endfor %} {% for i in sums %}
</tbody> <tr>
</table> <td>{{ i['club__name'] }}</td>
<td>{{"%.2f"|format(i['selling_sum'])}} €</td>
<td>
<input type="checkbox" name="validate_{{ i['club__name'] }}" {% if validated[i['club__name']] %}checked{% endif %}>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<input type="hidden" name="month" value="{{ start_date|date('Y-m') }}">
<button type="submit">{% trans %}Save validation{% endtrans %}</button>
</form>
{% endblock %} {% endblock %}

View File

@ -12,7 +12,7 @@
# OR WITHIN THE LOCAL FILE "LICENSE" # OR WITHIN THE LOCAL FILE "LICENSE"
# #
# #
from datetime import datetime, timedelta from datetime import date, datetime, timedelta
from datetime import timezone as tz from datetime import timezone as tz
from django.db.models import F from django.db.models import F
@ -20,7 +20,7 @@ from django.utils import timezone
from django.views.generic import TemplateView from django.views.generic import TemplateView
from counter.fields import CurrencyField from counter.fields import CurrencyField
from counter.models import Refilling, Selling from counter.models import Club, InvoiceCall, Refilling, Selling
from counter.views.mixins import CounterAdminMixin, CounterAdminTabsMixin from counter.views.mixins import CounterAdminMixin, CounterAdminTabsMixin
@ -79,4 +79,57 @@ class InvoiceCallView(CounterAdminTabsMixin, CounterAdminMixin, TemplateView):
.exclude(selling_sum=None) .exclude(selling_sum=None)
.order_by("-selling_sum") .order_by("-selling_sum")
) )
# une query pour tous les clubs qu'on met dans un dico dont la clé est le nom du club
club_names = [i["club__name"] for i in kwargs["sums"]]
clubs = Club.objects.filter(name__in=club_names)
# et une query pour les factures
invoice_calls = InvoiceCall.objects.filter(
month=date(start_date.year, start_date.month, 1), club__in=clubs
)
invoice_statuses = {ic.club.name: ic.validated for ic in invoice_calls}
kwargs["validated"] = invoice_statuses
return kwargs return kwargs
def post(self, request, *args, **kwargs):
if request.POST["month"]:
start_date = datetime.strptime(request.POST["month"], "%Y-%m")
year = start_date.year
month = start_date.month
club_names = list(
Selling.objects.filter(date__year=year, date__month=month)
.values_list("club__name", flat=True)
.distinct()
)
clubs = Club.objects.filter(name__in=club_names)
club_map = {club.name: club for club in clubs}
invoice_calls = InvoiceCall.objects.filter(
month=date(year, month, 1), club__in=clubs
)
invoice_statuses = {ic.club.name: ic for ic in invoice_calls}
for club_name in club_names:
is_checked = f"validate_{club_name}" in request.POST
invoice_call = invoice_statuses.get(club_name)
if invoice_call:
if invoice_call.validated != is_checked:
invoice_call.validated = is_checked
invoice_call.save()
else:
InvoiceCall.objects.create(
month=date(year, month, 1),
club=club_map[club_name],
validated=is_checked,
)
from django.shortcuts import redirect
return redirect(f"{request.path}?month={request.POST.get('month', '')}")