From 68fb46cf6515e191d6b3580c2a8fc7c7c5b844ee Mon Sep 17 00:00:00 2001 From: gitea Date: Tue, 11 Mar 2025 21:36:19 +0000 Subject: [PATCH] add ledger and journalentry --- inventory/__pycache__/apps.cpython-311.pyc | Bin 702 -> 1007 bytes inventory/__pycache__/forms.cpython-311.pyc | Bin 42196 -> 42523 bytes inventory/__pycache__/urls.cpython-311.pyc | Bin 30610 -> 31541 bytes inventory/__pycache__/views.cpython-311.pyc | Bin 236485 -> 242464 bytes inventory/apps.py | 9 +- inventory/forms.py | 9 + inventory/signals.py | 26 ++- inventory/templatetags/tenhal_tag.py | 5 +- inventory/urls.py | 28 ++++ inventory/views.py | 130 ++++++++++++++- templates/header.html | 10 +- templates/ledger/bills/bill_list.html | 2 +- .../journal_entry/includes/card_invoice.html | 149 +++++++++++++++++ .../includes/card_journal_entry.html | 58 +++++++ .../journal_entry/journal_entry_form.html | 21 +++ .../journal_entry/journal_entry_list.html | 119 ++++++++++++++ .../journal_entry_transactions.html | 49 ++++++ .../journal_entry/journal_entry_txs.html | 99 +++++++++++ templates/ledger/ledger/ledger_detail.html | 155 ++++++++++++++++++ templates/ledger/ledger/ledger_form.html | 21 +++ templates/ledger/ledger/ledger_list.html | 71 ++++++++ .../sales/estimates/estimate_detail.html | 34 +++- templates/sales/invoices/invoice_detail.html | 8 +- templates/sales/orders/purchase_order.html | 120 ++++++++++++++ 24 files changed, 1093 insertions(+), 30 deletions(-) create mode 100644 templates/ledger/journal_entry/includes/card_invoice.html create mode 100644 templates/ledger/journal_entry/includes/card_journal_entry.html create mode 100644 templates/ledger/journal_entry/journal_entry_form.html create mode 100644 templates/ledger/journal_entry/journal_entry_list.html create mode 100644 templates/ledger/journal_entry/journal_entry_transactions.html create mode 100644 templates/ledger/journal_entry/journal_entry_txs.html create mode 100644 templates/ledger/ledger/ledger_detail.html create mode 100644 templates/ledger/ledger/ledger_form.html create mode 100644 templates/ledger/ledger/ledger_list.html create mode 100644 templates/sales/orders/purchase_order.html diff --git a/inventory/__pycache__/apps.cpython-311.pyc b/inventory/__pycache__/apps.cpython-311.pyc index 4fe06dca9b68ed9469b02a21190964764d12ee24..352d3144af61d0d880c908f18a801a3cdf735b6e 100644 GIT binary patch delta 605 zcmdnT`ktM4IWI340}yOYIF+6`k@tQ*E0Dts#Gea*#B_!f#uSDehFV4-&6LBK%T&w6 z2oht?Va{c#WoBfkVa@{S0D}c=Fcvb+#8AVO!m^B!fnhZeLqH1a8n$IjKoKB@0HCQ1 z!3>)07Jfw_F-^u>>@KOvnYoEMAZA!%Nl;=*Y88uto}p=oCetmJA|Uq`XJ&DHVsc4l zS*j-cWI;yZ=v(Y55KToKKtpZ`WagEn=9T0ZRqEyDr=;c-7jc4w+4GaKQj<%HZ}Fz5 zmc-{5#U~e~0*%vTxy4ePnv+%p@&?!du<~LSAXh&~eF26hcQd+22m|d{ z$xtK$a)c0w0EI7@07Xl&F_370!yA$o7g)q@aEmp#d|+W=^&WE6ICLgq)X%oiN;VDkZ+#*U!? delta 336 zcmaFQzK@l6IWI340}!m^S(V-}k@vnA6Oh9U#GmVd$lA(wPNELxxQN#)(KrSfO0}>5zctg_S0*lxUZm|ZJ4=jwViXRv-i6WlK zKFrExLLg({rvBov$<0qG%}KQ@0=b3}WVAPs_`uA_$asT6@d7IPz{1K1G#rzdkogfL K`UQ&=*fIcKHA?yb diff --git a/inventory/__pycache__/forms.cpython-311.pyc b/inventory/__pycache__/forms.cpython-311.pyc index 5c27f5ba49a808000892b99f6c94988d6d275004..43d16c6c5d2dbde5fe5b54329bd5da4b2f614f4d 100644 GIT binary patch delta 10055 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

RJE&7WbeO1d zsE())$FJb{H>iIeQWanmouC^&kas*U0qS8|sC$?ejibIg+{jEWs2Ne^xrr%@6BQ%W z)P))zp)21)-9#-JrIC}UbEDLG8#RTIf-xFtLA8(3PG3O1J4QSGaE$I-;-nQioYd)Y z(gOsH{J}|E{Hv3CDqK{%T{J7;5?P}Y5OFo+`3n;8z(q^^3-udry38o*H8(w$-@02_ zf*B5Zs$joIL4tY@O>ueXs@G8Op?-w%y^LVG8r|`jA=S%71DXuA7SCy@4WqU^1{;LbwyxjbPM>#|uQ^|Ut!koZ% zj&@0%(RHoqOshImTGyA+^`!w`9!dyVvyd&#mg8OY6-Uy*XtI@6L*` ztf?onQfEE8jnm9Hw{2`$=cO55w=UIY_ef~>L>^PgUSiH}Dcdo8>2DBvq`0F#DQE(s zaF&r(3c~?WZe!%y^7D<*98mLa77f9>0hMrp!Sm7^zJvS>gITBv8ib1sx@0gI)C)!# zE^}H2-w%qy8AkmwxF4(#1{hgo@NrNr*cjPmP#O}O9E?1&t#7|-(U>{-bgJ`QN@7k+ z%o&L}>t&X42!sysJ_Zx;Qb@)78N}h2Ap@UaFb7|R42Lc;I9a@P_l7(9nHJ-_rrl?I zsu z0)DlR-XBg$ENO`)Be7)9Gl#Vl-inEWjghMq{t^>;H=_{jjg##$n1aqY*&c(F3JAv4 z!YKtiFa`W1P7aJwzXIMTG{DHNfc%6gI2es7;7CH`os7mInlSJ_22r?8AjV({{+KYx zry0yCwl;AdUW+TCd6FCin|W3VJ(HqvLWym3D`B2c4*;CABDuY+1M4^{ae;K3+4KT8o!JcVyXpF|n;M>!p)`_%G g^e9x8BkNcw+>o|Vd4@{cLgD4Yg~IsLI61kg_cL5E%X6x?E?xpVY)eD z7N>r5)9ex47G=w_=+H&~FfnR$nUa9nRPMFxnw|e(07RPTdJW+6O(fjB2qI57vw zB^=#9Awf>28Xjio!I7!vw!`ksi{Mr-B~##_T1y)4Z^-2r!T0KMn9f@UEm=YMJ*ye| zvWwtkc8JAFa+a~SeXiYwEw>O#bJF2*&ZqEpZU{>AVo;?iVwu}C7g)P8pUs@<$^V4o zK7y&d5-8JVb04$bE^Rh6X-gqO+9RaRS(?oqr6V(gOC#|b z1V1Eib`NbKhWy14f|e)6|KeGBy_hnhOpcEk zxwv`aL{(T!KeT4LEzFlk`0^-U9y5`o3mp>S!;Uh-Wu26rojSrjtbeYvfb@UuEF@HQ z(ap-cXwEgVGhFYc3q9?o zODr){)|(44sTU$k zH0%Gwm}H>^uV(DC&>|--^!Q&{Xy$zjo%@`X-e9$rM#ikP(hsdP=PKh8V8No9ki@HjGwc}4K_O8Nps4ax_ow{p~SflK{HhyU9$R| zBFr~L_=YIo5F1G}!)s1@++)t?32!>--l;CS>sr_U&$Hg8ky#d)VV{c*Ut;{nRfe~* z6$S_NvbrQv&p_FHwxcx(4i4%>TM{#85_~%-i7vE2(gC-m45I8vVx`Rrg%IvZ1GQTz zjN`~AaJep2q4A&ZBviNxk590_PQN;Y17BcWK8a4fK-*oM}pWY-iCv!~`obC;iyhxwWaUlZkPV*Qw5SHk0fBs$Q1O3($< zML$|V3H3oq2%_yE+hoC1kbKe@*aT;S_M}q!rCFS1)4h* ze8fCxfmE0#7DO9Oh1)}tFosqMs$spbUd7hm0-K4vi1HGQ6L}e>6;2J4zaNwi72F?| zl$~h3s=4ELK+0$utP3ec3yut^pe-bcgJ?b#>?P($3#s5Du@ST#DtH=_gmJVgC>bHI zkT&-UHX;ou&G6ocUTi@zropulNi?CE(?A#{pAuRhDTG)*nmY{w#5`z$H292I5RH`l nGCoKiU5PLr&A^ diff --git a/inventory/__pycache__/views.cpython-311.pyc b/inventory/__pycache__/views.cpython-311.pyc index b7129e6d97d29dd1bc573cffc8282e85a177cd77..20176a128bfbbe926536f5b38ba27cc58e45d66d 100644 GIT binary patch delta 55154 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%0DWNLv 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 JFCb3@{su_C-!cFI diff --git a/inventory/apps.py b/inventory/apps.py index 9a82aef1..849693ce 100644 --- a/inventory/apps.py +++ b/inventory/apps.py @@ -5,8 +5,7 @@ class InventoryConfig(AppConfig): name = 'inventory' def ready(self): - import inventory.signals - # from decimal import Decimal - # from inventory.models import VatRate - # VatRate.objects.get_or_create(rate=Decimal('0.15'), is_active=True) - + import inventory.signals + from decimal import Decimal + from inventory.models import VatRate + VatRate.objects.get_or_create(rate=Decimal('0.15'), is_active=True) diff --git a/inventory/forms.py b/inventory/forms.py index befa4506..6cd912b5 100644 --- a/inventory/forms.py +++ b/inventory/forms.py @@ -21,7 +21,9 @@ from django_ledger.forms.estimate import ( EstimateModelCreateForm as EstimateModelCreateFormBase, ) +# from django_ledger.forms.ledger import LedgerModelCreateForm as LedgerModelCreateFormBase from django_ledger.forms.bill import BillModelCreateForm as BillModelCreateFormBase +from django_ledger.forms.journal_entry import JournalEntryModelCreateForm as JournalEntryModelCreateFormBase from .models import ( Dealer, @@ -953,3 +955,10 @@ class DealersMakeForm(forms.Form): for car_make in self.cleaned_data["car_makes"]: DealersMake.objects.create(dealer=self.dealer, car_make=car_make) + + +class JournalEntryModelCreateForm(JournalEntryModelCreateFormBase): + pass + +# class LedgerModelCreateForm(LedgerModelCreateFormBase): +# pass \ No newline at end of file diff --git a/inventory/signals.py b/inventory/signals.py index 76094df6..64758555 100644 --- a/inventory/signals.py +++ b/inventory/signals.py @@ -82,11 +82,6 @@ def create_car_location(sender, instance, created, **kwargs): except Exception as e: print(f"Failed to create CarLocation for car {instance.vin}: {e}") -@receiver(post_save, sender=models.Dealer) -def create_dealer_settings(sender, instance, created, **kwargs): - if created: - models.DealerSettings.objects.create(dealer=instance) - # Create Entity @receiver(post_save, sender=models.Dealer) def create_ledger_entity(sender, instance, created, **kwargs): @@ -624,8 +619,7 @@ def create_ledger_entity(sender, instance, created, **kwargs): entity.create_account(coa_model=coa, code="6302", role=roles.EXPENSE_OTHER, name=_("Taxes"), balance_type="debit", active=True) entity.create_account(coa_model=coa, code="6303", role=roles.EXPENSE_OTHER, name=_("Foreign Currency Translation"), balance_type="debit", active=True) entity.create_account(coa_model=coa, code="6304", role=roles.EXPENSE_OTHER, name=_("Interest Expenses"), balance_type="debit", active=True) - - + @receiver(post_save, sender=models.Dealer) def create_dealer_groups(sender, instance, created, **kwargs): @@ -872,6 +866,24 @@ def update_car_status_on_reservation_update(sender, instance, **kwargs): car.status = models.CarStatusChoices.AVAILABLE car.save() +@receiver(post_save, sender=models.Dealer) +def create_dealer_settings(sender, instance, created, **kwargs): + if created: + models.DealerSettings.objects.create( + dealer=instance, + invoice_cash_account=instance.entity.get_all_accounts().filter(role=roles.ASSET_CA_CASH).first(), + invoice_prepaid_account=instance.entity.get_all_accounts().filter(role=roles.ASSET_CA_RECEIVABLES).first(), + invoice_unearned_account=instance.entity.get_all_accounts().filter(role=roles.LIABILITY_CL_DEFERRED_REVENUE).first(), + bill_cash_account=instance.entity.get_all_accounts().filter(role=roles.ASSET_CA_CASH).first(), + bill_prepaid_account=instance.entity.get_all_accounts().filter(role=roles.ASSET_CA_PREPAID).first(), + bill_unearned_account=instance.entity.get_all_accounts().filter(role=roles.LIABILITY_CL_ACC_PAYABLE).first() + ) + +@receiver(post_save, sender=models.Dealer) +def check_if_vat_exists(sender, instance, created, **kwargs): + if created: + models.VatRate.objects.get_create(is_active=True) + # @receiver(post_save, sender=EstimateModel) # def update_estimate_status(sender, instance,created, **kwargs): diff --git a/inventory/templatetags/tenhal_tag.py b/inventory/templatetags/tenhal_tag.py index c410ef04..14e45fa2 100644 --- a/inventory/templatetags/tenhal_tag.py +++ b/inventory/templatetags/tenhal_tag.py @@ -13,6 +13,7 @@ from django import template from django.db.models import Sum from django.urls import reverse from django.utils.formats import number_format +from decimal import Decimal # from django_ledger import __version__ # from django_ledger.forms.app_filters import EntityFilterForm, ActivityFilterForm @@ -27,7 +28,9 @@ from django_ledger.io.io_core import validate_activity, get_localdate register = template.Library() - +@register.filter() +def to_int(value): + return Decimal(value).quantize(Decimal("0.01")) # @register.simple_tag(name='current_version') # def current_version(): # return __version__ diff --git a/inventory/urls.py b/inventory/urls.py index c73cc237..21765357 100644 --- a/inventory/urls.py +++ b/inventory/urls.py @@ -407,6 +407,33 @@ urlpatterns = [ name="representative_delete", ), # Ledger URLS + # Ledger + path( + "ledgers/", views.LedgerModelListView.as_view(), name="ledger_list" + ), + path( + "ledgers//detail//", views.LedgerModelDetailView.as_view(), name="ledger_detail" + ), + # path( + # "ledgers/create/", views.LedgerModelCreateView.as_view(), name="ledger_create" + # ), + path( + "journalentries//list/", views.JournalEntryListView.as_view(), name="journalentry_list" + ), + path( + "journalentries//create/", views.JournalEntryCreateView.as_view(), name="journalentry_create" + ), + path( + "journalentries//delete/", views.JournalEntryDeleteView, name="journalentry_delete" + ), + path( + "journalentries//transactions/", + views.JournalEntryTransactionsView, + name="journalentry_transactions", + ), + path('journalentries///detail//txs/', + views.JournalEntryModelTXSDetailView.as_view(), + name='journalentry_txs'), # Bank Account path( "bank_accounts/", views.BankAccountListView.as_view(), name="bank_account_list" @@ -597,6 +624,7 @@ urlpatterns = [ name="bill_mark_as_paid", ), + # orders path("orders/", views.OrderListView.as_view(), name="order_list_view"), diff --git a/inventory/views.py b/inventory/views.py index 23f4af1c..4f02f134 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -48,12 +48,15 @@ from django.views.generic import ( UpdateView, DeleteView, TemplateView, + ArchiveIndexView, ) ##################################################################### # Django Ledger from django_ledger.io import roles from django_ledger.utils import accruable_net_summary +from django_ledger.views.invoice import InvoiceModelDetailView as InvoiceModelDetailViewBase +from django_ledger.views import LedgerModelListView as LedgerModelListViewBase,JournalEntryModelTXSDetailView as JournalEntryModelTXSDetailViewBase from django_ledger.forms.account import AccountModelCreateForm, AccountModelUpdateForm from django_ledger.views.entity import EntityModelDetailBaseView,EntityModelDetailHandlerView from django_ledger.forms.item import ( @@ -85,6 +88,7 @@ from django_ledger.models import ( CustomerModel, ItemModel, BillModel, + LedgerModel, VendorModel, ) from django_ledger.views.financial_statement import ( @@ -214,7 +218,7 @@ def dealer_signup(request, *args, **kwargs): user.groups.add(group) for perm in Permission.objects.filter(content_type__app_label__in=["inventory","django_ledger"]): group.permissions.add(perm) - + StaffMember.objects.create(user=user) models.Dealer.objects.create( user=user, @@ -2569,6 +2573,8 @@ def invoice_create(request, pk): invoice.save() messages.success(request, "Invoice created successfully!") return redirect("invoice_detail", pk=invoice.pk) + else: + print(form.errors) form = forms.InvoiceModelCreateForm( entity_slug=entity.slug, user_model=entity.admin ) @@ -3993,7 +3999,7 @@ class CarListViewTable(LoginRequiredMixin, ExportMixin, SingleTableView): @login_required def DealerSettingsView(request,pk): - dealer_setting = get_object_or_404(models.DealerSettings, pk=pk) + dealer_setting = get_object_or_404(models.DealerSettings, dealer__pk=pk) dealer = get_user_type(request) if request.method == 'POST': form = forms.DealerSettingsForm(request.POST, instance=dealer_setting) @@ -4038,4 +4044,122 @@ def assign_car_makes(request): existing_car_makes = models.DealersMake.objects.filter(dealer=dealer).values_list("car_make", flat=True) form = forms.DealersMakeForm(initial={"car_makes": existing_car_makes}, dealer=dealer) - return render(request, "dealers/assign_car_makes.html", {"form": form}) \ No newline at end of file + return render(request, "dealers/assign_car_makes.html", {"form": form}) + + +class LedgerModelListView(LoginRequiredMixin, ListView,ArchiveIndexView): + model = LedgerModel + context_object_name = "ledgers" + template_name = "ledger/ledger/ledger_list.html" + date_field = 'created' + ordering = '-created' + show_all = False + show_current = False + show_visible = False + + + def get_queryset(self): + qs = super().get_queryset() + dealer = get_user_type(self.request) + qs = qs.filter(entity=dealer.entity) + qs = qs.select_related('billmodel', 'invoicemodel') + qs = qs.order_by('-created') + if self.show_all: + return qs + if self.show_current: + qs = qs.current() + if self.show_visible: + qs = qs.visible() + return qs + +class LedgerModelDetailView(InvoiceModelDetailViewBase): + model = LedgerModel + context_object_name = "ledger" + template_name = "ledger/ledger/ledger_detail.html" + +# class LedgerModelCreateView(LoginRequiredMixin,SuccessMessageMixin, CreateView): +# model = LedgerModel +# template_name = "ledger/ledger/ledger_form.html" +# form_class = forms.LedgerModelCreateForm +# success_message = "Ledger created" + +# def get_form(self, form_class=None): +# dealer = get_user_type(self.request) +# form = forms.LedgerModelCreateForm(entity_slug=dealer.entity.slug,user_model=dealer.entity.admin,**self.get_form_kwargs()) +# return form +# def get_success_url(self): +# return reverse('ledger_list') + +# def form_valid(self, form): +# instance = form.save(commit=False) +# dealer = get_user_type(self.request) +# instance.entity = dealer.entity +# instance.save() +# return super().form_valid(form) + +class JournalEntryListView(LoginRequiredMixin, ListView): + model = JournalEntryModel + context_object_name = "journal_entries" + template_name = "ledger/journal_entry/journal_entry_list.html" + + def get_queryset(self): + qs = super().get_queryset() + ledger = LedgerModel.objects.filter(pk=self.kwargs['pk']).first() + qs = qs.filter(ledger=ledger) + return qs + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['ledger'] = LedgerModel.objects.filter(pk=self.kwargs['pk']).first() + return context + +class JournalEntryCreateView(LoginRequiredMixin,SuccessMessageMixin, CreateView): + model = JournalEntryModel + template_name = "ledger/journal_entry/journal_entry_form.html" + form_class = forms.JournalEntryModelCreateForm + ledger_model = None + success_message = "Journal Entry created" + + def get_form(self, form_class=None): + dealer = get_user_type(self.request) + ledger = LedgerModel.objects.filter(pk=self.kwargs['pk']).first() + form = forms.JournalEntryModelCreateForm( + entity_model=dealer.entity, + ledger_model=ledger, + **self.get_form_kwargs() + ) + form.fields.pop('entity_unit') + return form + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context["ledger"] = LedgerModel.objects.filter(pk=self.kwargs['pk']).first() + return context + + def get_success_url(self): + ledger = LedgerModel.objects.filter(pk=self.kwargs['pk']).first() + return reverse("journalentry_list", kwargs={"pk": ledger.pk}) + + +def JournalEntryDeleteView(request,pk): + journal_entry = get_object_or_404(JournalEntryModel, pk=pk) + ledger = journal_entry.ledger + journal_entry.delete() + messages.success(request, 'Journal Entry deleted') + return redirect("journalentry_list", pk=ledger.pk) + +def JournalEntryTransactionsView(request, pk): + journal = JournalEntryModel.objects.filter(pk=pk).first() + transactions = ( + TransactionModel.objects.filter(journal_entry=journal) + .order_by("account__code") + .all() + ) + return render( + request, + "ledger/journal_entry/journal_entry_transactions.html", + {"journal_entry": journal, "transactions": transactions}, + ) + + +class JournalEntryModelTXSDetailView(JournalEntryModelTXSDetailViewBase): + template_name = 'ledger/journal_entry/journal_entry_txs.html' \ No newline at end of file diff --git a/templates/header.html b/templates/header.html index 2c65bcbd..05cd65b0 100644 --- a/templates/header.html +++ b/templates/header.html @@ -249,6 +249,14 @@ {% endif %} {% if perms.django_ledger.view_itemmodel %} +

+ {% endif %} - {% endif %} {% if perms.django_ledger.view_itemmodel %}