|
7 | 7 | from django.db.models import Q, Sum, Value |
8 | 8 | from django.db.models.functions import Coalesce |
9 | 9 | from django.urls import reverse |
| 10 | +from django.utils import timezone |
10 | 11 | from django.utils.translation import gettext_lazy as _ |
11 | 12 | from viewflow.fsm import State |
12 | 13 |
|
13 | 14 | from hypha.apply.utils.storage import PrivateStorage |
14 | 15 |
|
| 16 | +EXPORT_STATUS_ERROR = "error" |
| 17 | +EXPORT_STATUS_SUCCESS = "success" |
| 18 | +EXPORT_STATUS_GENERATING = "generating" |
15 | 19 |
|
16 | | -class InvoiceTag(models.Model): |
17 | | - name = models.CharField(max_length=100, unique=True) |
18 | | - |
19 | | - class Meta: |
20 | | - verbose_name = _("invoice tag") |
21 | | - verbose_name_plural = _("invoice tags") |
22 | | - ordering = ["name"] |
23 | | - |
24 | | - def __str__(self): |
25 | | - return self.name |
26 | | - |
| 20 | +EXPORT_STATUS_CHOICES = [ |
| 21 | + (EXPORT_STATUS_ERROR, _("Failed")), |
| 22 | + (EXPORT_STATUS_SUCCESS, _("Success")), |
| 23 | + (EXPORT_STATUS_GENERATING, _("In Progress")), |
| 24 | +] |
27 | 25 |
|
28 | 26 | SUBMITTED = "submitted" |
29 | 27 | RESUBMITTED = "resubmitted" |
@@ -77,6 +75,18 @@ def invoice_path(instance, filename): |
77 | 75 | return f"projects/{instance.project_id}/payment_invoices/{filename}" |
78 | 76 |
|
79 | 77 |
|
| 78 | +class InvoiceTag(models.Model): |
| 79 | + name = models.CharField(max_length=100, unique=True) |
| 80 | + |
| 81 | + class Meta: |
| 82 | + verbose_name = _("invoice tag") |
| 83 | + verbose_name_plural = _("invoice tags") |
| 84 | + ordering = ["name"] |
| 85 | + |
| 86 | + def __str__(self): |
| 87 | + return self.name |
| 88 | + |
| 89 | + |
80 | 90 | class InvoiceQueryset(models.QuerySet): |
81 | 91 | def in_progress(self): |
82 | 92 | return self.exclude(status__in=[DECLINED, PAID]) |
@@ -333,3 +343,33 @@ def get_absolute_url(self): |
333 | 343 | "file_pk": self.pk, |
334 | 344 | }, |
335 | 345 | ) |
| 346 | + |
| 347 | + |
| 348 | +class InvoiceExportManager(models.Model): |
| 349 | + user = models.ForeignKey( |
| 350 | + settings.AUTH_USER_MODEL, |
| 351 | + on_delete=models.CASCADE, |
| 352 | + ) |
| 353 | + export_data = models.TextField() |
| 354 | + created_time = models.DateTimeField(auto_now_add=True) |
| 355 | + completed_time = models.DateTimeField(null=True) |
| 356 | + status = models.CharField( |
| 357 | + choices=EXPORT_STATUS_CHOICES, default=EXPORT_STATUS_GENERATING |
| 358 | + ) |
| 359 | + total_export = models.IntegerField(null=True) |
| 360 | + |
| 361 | + class Meta: |
| 362 | + verbose_name = _("invoice export manager") |
| 363 | + verbose_name_plural = _("invoice export managers") |
| 364 | + |
| 365 | + def set_completed_and_save(self) -> None: |
| 366 | + self.status = EXPORT_STATUS_SUCCESS |
| 367 | + self.completed_time = timezone.now() |
| 368 | + self.save() |
| 369 | + |
| 370 | + def set_failed_and_save(self) -> None: |
| 371 | + self.status = EXPORT_STATUS_ERROR |
| 372 | + self.save() |
| 373 | + |
| 374 | + def get_absolute_url(self) -> str: |
| 375 | + return reverse("apply:projects:invoices") |
0 commit comments