update ledgers

This commit is contained in:
ismail 2025-03-18 00:24:27 +03:00
parent da1619b874
commit 6a43c10c89
8 changed files with 143 additions and 22 deletions

View File

@ -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)

View File

@ -412,7 +412,19 @@ urlpatterns = [
"ledgers/", views.LedgerModelListView.as_view(), name="ledger_list"
),
path(
"ledgers/<slug:entity_slug>/detail/<uuid:invoice_pk>/", views.LedgerModelDetailView.as_view(), name="ledger_detail"
"ledgers/<slug:entity_slug>/detail/<uuid:pk>/", views.LedgerModelDetailView.as_view(), name="ledger_detail"
),
path(
"ledgers/<slug:entity_slug>/lock_all_journals/<uuid:pk>/", views.ledger_lock_all_journals, name="lock_all_journals"
),
path(
"ledgers/<slug:entity_slug>/unlock_all_journals/<uuid:pk>/", views.ledger_unlock_all_journals, name="unlock_all_journals"
),
path(
"ledgers/<slug:entity_slug>/post_all_journals/<uuid:pk>/", views.ledger_post_all_journals, name="post_all_journals"
),
path(
"ledgers/<slug:entity_slug>/unpost_all_journals/<uuid:pk>/", views.ledger_unpost_all_journals, name="unpost_all_journals"
),
# path(
# "ledgers/create/", views.LedgerModelCreateView.as_view(), name="ledger_create"

View File

@ -4072,11 +4072,13 @@ 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
# template_name = "ledger/ledger/ledger_form.html"
@ -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)
@ -4163,3 +4168,52 @@ def JournalEntryTransactionsView(request, pk):
class JournalEntryModelTXSDetailView(JournalEntryModelTXSDetailViewBase):
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)

View File

@ -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()

View File

@ -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 %}
<div class="alert alert-outline-warning d-flex align-items-center" role="alert">
<i class="fa-solid fa-circle-info fs-6"></i>
@ -407,7 +406,7 @@
</div>
</div>
{% if car.status == 'sold' %}
<img src="{% static 'images/sold.png' %}" width="200" height="100" alt="">
<img class="car_status" src="{% static 'images/sold.png' %}" width="200" height="100" alt="">
{% endif %}
</div>

View File

@ -33,10 +33,26 @@
<div class="row mt-4">
<div class="d-flex justify-content-between mb-2">
<h3 class="">{% trans "Journal Entries" %}</h3>
<div class="d-flex gap-2">
{% if ledger.is_posted %}
{% if ledger.is_locked %}
<a class="btn btn-sm btn-phoenix-danger" href="{% url 'unlock_all_journals' ledger.entity_slug ledger.pk %} ">{% trans 'UnLock All' %}</a>
{% else %}
<a class="btn btn-sm btn-phoenix-danger" href="{% url 'lock_all_journals' ledger.entity_slug ledger.pk %} ">{% trans 'Lock All' %}</a>
{% endif %}
{% endif %}
{% if not ledger.is_locked %}
{% if ledger.is_posted %}
<a class="btn btn-sm btn-phoenix-success" href="{% url 'unpost_all_journals' ledger.entity_slug ledger.pk %} ">{% trans 'UnPost All' %}</a>
{% else %}
<a class="btn btn-sm btn-phoenix-success" href="{% url 'post_all_journals' ledger.entity_slug ledger.pk %} ">{% trans 'Post All' %}</a>
{% endif %}
{% endif %}
<a href="{% url 'journalentry_create' ledger.pk %}" class="btn btn-sm btn-phoenix-primary">{% trans "Add Journal Entry" %}</a>
</div>
</div>
</div>
<div class="table-responsive px-1 scrollbar">
<table class="table fs-9 mb-0 border-top border-translucent">
@ -93,20 +109,18 @@
<span class="fas fa-ellipsis-h fs-10"></span>
</button>
<div class="dropdown-menu dropdown-menu-end py-2">
<a class="dropdown-item" href="#">{% trans "View" %}</a>
<a class="dropdown-item" href="#">{% trans "Edit" %}</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="{% url 'journalentry_delete' je.pk %}">{% trans "Delete" %}</a>
<a class="dropdown-item" href="{% url 'journalentry_transactions' je.pk %}">{% trans "View" %}</a>
<a class="dropdown-item" href="{% url 'journalentry_txs' je.entity_slug je.ledger_id je.pk %}">{% trans "Transactions" %}</a>
{% if je.can_delete %}
<a class="dropdown-item" href="{% url 'journalentry_delete' je.pk %}">{% trans "Delete" %}</a>
{% endif %}
</div>
</div>
</td>
</tr>
{% empty %}
<tr>
<td colspan="6" class="text-center">{% trans "No Bank Accounts Found" %}</td>
<td colspan="8" class="text-center">{% trans "No Bank Accounts Found" %}</td>
</tr>
{% endfor %}
</tbody>

View File

@ -7,7 +7,6 @@
<div class="row">
<div class="col-md-4">
<div class="row">
{{invoice}}
<div class="col-12 mb-4">
{% include 'ledger/journal_entry/includes/card_invoice.html' with invoice=invoice entity_slug=view.kwargs.entity_slug style='invoice-detail' %}
</div>

View File

@ -25,7 +25,27 @@
{% for ledger in ledgers %}
<tr class="hover-actions-trigger btn-reveal-trigger position-static">
<td class="align-middle product white-space-nowrap">
<a href="#">{{ ledger.get_wrapped_model_instance }}</a>
{% if ledger.invoicemodel %}
<a href="{% url 'invoice_detail' ledger.invoicemodel.pk %}">{{ ledger.get_wrapped_model_instance }}</a>
<br>
<small>
{% if ledger.invoicemodel.is_past_due %}
<span class="badge badge-phoenix badge-phoenix-danger">{% trans "Past Due" %}</span>
{% elif ledger.invoicemodel.is_approved %}
<span class="badge badge-phoenix badge-phoenix-success">{% trans "Approved" %}</span>
{% elif ledger.invoicemodel.is_canceled %}
<span class="badge badge-phoenix badge-phoenix-secondary">{% trans "Canceled" %}</span>
{% elif ledger.invoicemodel.is_draft %}
<span class="badge badge-phoenix badge-phoenix-warning">{% trans "Draft" %}</span>
{% elif ledger.invoicemodel.is_review %}
<span class="badge badge-phoenix badge-phoenix-info">{% trans "In Review" %}</span>
{% elif ledger.invoicemodel.is_paid %}
<span class="badge badge-phoenix badge-phoenix-success">{% trans "Paid" %}</span>
{% endif %}
{% elif ledger.billmodel %}
<a href="{% url 'bill_detail' ledger.billmodel.pk %}">{{ ledger.get_wrapped_model_instance }}</a>
{% endif %}
</small>
</td>
<td class="align-middle product white-space-nowrap">
<a class="btn btn-sm btn-primary"