From 6a43c10c8998a84b351bf44ba33308eee8b5b202 Mon Sep 17 00:00:00 2001 From: ismail Date: Tue, 18 Mar 2025 00:24:27 +0300 Subject: [PATCH] update ledgers --- inventory/signals.py | 9 ++- inventory/urls.py | 16 ++++- inventory/views.py | 58 ++++++++++++++++++- scripts/run.py | 18 +++++- templates/inventory/car_detail.html | 5 +- .../journal_entry/journal_entry_list.html | 34 +++++++---- templates/ledger/ledger/ledger_detail.html | 3 +- templates/ledger/ledger/ledger_list.html | 22 ++++++- 8 files changed, 143 insertions(+), 22 deletions(-) diff --git a/inventory/signals.py b/inventory/signals.py index 64758555..93ded9ae 100644 --- a/inventory/signals.py +++ b/inventory/signals.py @@ -90,7 +90,7 @@ def create_ledger_entity(sender, instance, created, **kwargs): entity = EntityModel.create_entity( name=entity_name, admin=instance.user, - use_accrual_method=False, + use_accrual_method=True, fy_start_month=1, ) @@ -909,3 +909,10 @@ def check_if_vat_exists(sender, instance, created, **kwargs): # current_staff_count = instance.dealer.staff.count() # if current_staff_count > allowed_users: # raise ValidationError(_("You have reached the maximum number of staff users allowed for your plan.")) + + +@receiver(post_save, sender=models.Dealer) +def create_make_ledger_accounts(sender, instance, created, **kwargs): + if created: + entity_name = instance.user.dealer.name + entity = EntityModel.objects.get(name=entity_name) \ No newline at end of file diff --git a/inventory/urls.py b/inventory/urls.py index 21765357..9101c4f2 100644 --- a/inventory/urls.py +++ b/inventory/urls.py @@ -412,8 +412,20 @@ urlpatterns = [ "ledgers/", views.LedgerModelListView.as_view(), name="ledger_list" ), path( - "ledgers//detail//", views.LedgerModelDetailView.as_view(), name="ledger_detail" - ), + "ledgers//detail//", views.LedgerModelDetailView.as_view(), name="ledger_detail" + ), + path( + "ledgers//lock_all_journals//", views.ledger_lock_all_journals, name="lock_all_journals" + ), + path( + "ledgers//unlock_all_journals//", views.ledger_unlock_all_journals, name="unlock_all_journals" + ), + path( + "ledgers//post_all_journals//", views.ledger_post_all_journals, name="post_all_journals" + ), + path( + "ledgers//unpost_all_journals//", views.ledger_unpost_all_journals, name="unpost_all_journals" + ), # path( # "ledgers/create/", views.LedgerModelCreateView.as_view(), name="ledger_create" # ), diff --git a/inventory/views.py b/inventory/views.py index 4f02f134..f7de2cd0 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -4072,10 +4072,12 @@ class LedgerModelListView(LoginRequiredMixin, ListView,ArchiveIndexView): qs = qs.visible() return qs -class LedgerModelDetailView(InvoiceModelDetailViewBase): +# class LedgerModelDetailView(InvoiceModelDetailViewBase): +class LedgerModelDetailView(LoginRequiredMixin, DetailView): model = LedgerModel context_object_name = "ledger" template_name = "ledger/ledger/ledger_detail.html" + # class LedgerModelCreateView(LoginRequiredMixin,SuccessMessageMixin, CreateView): # model = LedgerModel @@ -4143,6 +4145,9 @@ class JournalEntryCreateView(LoginRequiredMixin,SuccessMessageMixin, CreateView) def JournalEntryDeleteView(request,pk): journal_entry = get_object_or_404(JournalEntryModel, pk=pk) ledger = journal_entry.ledger + if not journal_entry.can_delete(): + messages.error(request, 'Journal Entry cannot be deleted') + return redirect("journalentry_list", pk=ledger.pk) journal_entry.delete() messages.success(request, 'Journal Entry deleted') return redirect("journalentry_list", pk=ledger.pk) @@ -4162,4 +4167,53 @@ def JournalEntryTransactionsView(request, pk): class JournalEntryModelTXSDetailView(JournalEntryModelTXSDetailViewBase): - template_name = 'ledger/journal_entry/journal_entry_txs.html' \ No newline at end of file + template_name = 'ledger/journal_entry/journal_entry_txs.html' + + +def ledger_lock_all_journals(request,entity_slug,pk): + ledger = LedgerModel.objects.filter(pk=pk).first() + if ledger.is_locked(): + messages.error(request, "Ledger is already locked.") + return redirect("journalentry_list", pk=ledger.pk) + ledger.lock_journal_entries() + ledger.lock() + ledger.save() + return redirect("journalentry_list", pk=ledger.pk) + +def ledger_unlock_all_journals(request,entity_slug,pk): + ledger = LedgerModel.objects.filter(pk=pk).first() + if not ledger.is_locked(): + messages.error(request, "Ledger is already Unlocked.") + return redirect("journalentry_list", pk=ledger.pk) + + ledger.unlock() + ledger.save() + qs = ledger.journal_entries.locked() + for je in qs: + je.unlock() + je.save() + return redirect("journalentry_list", pk=ledger.pk) + +def ledger_post_all_journals(request,entity_slug,pk): + ledger = LedgerModel.objects.filter(pk=pk).first() + if ledger.is_posted(): + messages.error(request, "Ledger is already posted.") + return redirect("journalentry_list", pk=ledger.pk) + ledger.post_journal_entries() + ledger.post() + ledger.save() + return redirect("journalentry_list", pk=ledger.pk) + +def ledger_unpost_all_journals(request,entity_slug,pk): + ledger = LedgerModel.objects.filter(pk=pk).first() + if not ledger.is_posted(): + messages.error(request, "Ledger is already Unposted.") + return redirect("journalentry_list", pk=ledger.pk) + qs = ledger.journal_entries.posted() + for je in qs: + je.mark_as_unposted() + je.save() + + ledger.unpost() + ledger.save() + return redirect("journalentry_list", pk=ledger.pk) diff --git a/scripts/run.py b/scripts/run.py index ca76ad5d..68973e77 100644 --- a/scripts/run.py +++ b/scripts/run.py @@ -16,6 +16,7 @@ from django_ledger.io.io_core import get_localdate from datetime import datetime, timedelta from django.utils import timezone import hashlib +from django_ledger.io import roles User = get_user_model() @@ -152,4 +153,19 @@ def run(): # EntityManagementModel.objects.create(entity=,user=) # print(Permission.objects.filter(codename__icontains='customermodel').first().codename) - print(os.getenv("DJANGO_ALLOWED_HOSTS")) + # print(os.getenv("DJANGO_ALLOWED_HOSTS")) + + + car_makes = CarMake.objects.all()[:1] + entity = EntityModel.objects.get(admin__email="ismail.mosa.ibrahim@gmail.com") + coa = entity.get_default_coa() + + cogs = entity.get_default_coa_accounts().filter(role=roles.COGS).first() + + for index,make in enumerate(car_makes): + code = f"{cogs.code}000{index}" + coa_account,account = entity.create_account(name=make.name,code=code,role=roles.COGS,coa_model=coa,balance_type="debit",active=True) + account = cogs.add_child(instance=account) + account.refresh_from_db() + account.save() + \ No newline at end of file diff --git a/templates/inventory/car_detail.html b/templates/inventory/car_detail.html index ee9835fa..c6792620 100644 --- a/templates/inventory/car_detail.html +++ b/templates/inventory/car_detail.html @@ -7,7 +7,7 @@ opacity: 0.5; pointer-events: none; } - img { + .car_status { position: absolute; top: 13%; left: 90%; @@ -17,7 +17,6 @@ {% endblock customCSS %} {% block content %} - {% if not car.ready %} {% if car.status == 'sold' %} - + {% endif %} diff --git a/templates/ledger/journal_entry/journal_entry_list.html b/templates/ledger/journal_entry/journal_entry_list.html index 56923be5..5f03d337 100644 --- a/templates/ledger/journal_entry/journal_entry_list.html +++ b/templates/ledger/journal_entry/journal_entry_list.html @@ -32,10 +32,26 @@
-
- +

{% trans "Journal Entries" %}

- {% trans "Add Journal Entry" %} +
+ {% if ledger.is_posted %} + {% if ledger.is_locked %} + {% trans 'UnLock All' %} + {% else %} + {% trans 'Lock All' %} + {% endif %} + {% endif %} + {% if not ledger.is_locked %} + {% if ledger.is_posted %} + {% trans 'UnPost All' %} + {% else %} + {% trans 'Post All' %} + {% endif %} + {% endif %} + {% trans "Add Journal Entry" %} +
+
@@ -92,21 +108,19 @@ data-bs-reference="parent"> - {% empty %} - {% trans "No Bank Accounts Found" %} + {% trans "No Bank Accounts Found" %} {% endfor %} diff --git a/templates/ledger/ledger/ledger_detail.html b/templates/ledger/ledger/ledger_detail.html index ebe847df..ca363116 100644 --- a/templates/ledger/ledger/ledger_detail.html +++ b/templates/ledger/ledger/ledger_detail.html @@ -6,8 +6,7 @@ {% block content %}
-
- {{invoice}} +
{% include 'ledger/journal_entry/includes/card_invoice.html' with invoice=invoice entity_slug=view.kwargs.entity_slug style='invoice-detail' %}
diff --git a/templates/ledger/ledger/ledger_list.html b/templates/ledger/ledger/ledger_list.html index cd715f5b..1f7f09f9 100644 --- a/templates/ledger/ledger/ledger_list.html +++ b/templates/ledger/ledger/ledger_list.html @@ -25,7 +25,27 @@ {% for ledger in ledgers %} - {{ ledger.get_wrapped_model_instance }} + {% if ledger.invoicemodel %} + {{ ledger.get_wrapped_model_instance }} +
+ + {% if ledger.invoicemodel.is_past_due %} + {% trans "Past Due" %} + {% elif ledger.invoicemodel.is_approved %} + {% trans "Approved" %} + {% elif ledger.invoicemodel.is_canceled %} + {% trans "Canceled" %} + {% elif ledger.invoicemodel.is_draft %} + {% trans "Draft" %} + {% elif ledger.invoicemodel.is_review %} + {% trans "In Review" %} + {% elif ledger.invoicemodel.is_paid %} + {% trans "Paid" %} + {% endif %} + {% elif ledger.billmodel %} + {{ ledger.get_wrapped_model_instance }} + {% endif %} +