update ledgers
This commit is contained in:
parent
da1619b874
commit
6a43c10c89
@ -90,7 +90,7 @@ def create_ledger_entity(sender, instance, created, **kwargs):
|
|||||||
entity = EntityModel.create_entity(
|
entity = EntityModel.create_entity(
|
||||||
name=entity_name,
|
name=entity_name,
|
||||||
admin=instance.user,
|
admin=instance.user,
|
||||||
use_accrual_method=False,
|
use_accrual_method=True,
|
||||||
fy_start_month=1,
|
fy_start_month=1,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -909,3 +909,10 @@ def check_if_vat_exists(sender, instance, created, **kwargs):
|
|||||||
# current_staff_count = instance.dealer.staff.count()
|
# current_staff_count = instance.dealer.staff.count()
|
||||||
# if current_staff_count > allowed_users:
|
# if current_staff_count > allowed_users:
|
||||||
# raise ValidationError(_("You have reached the maximum number of staff users allowed for your plan."))
|
# 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)
|
||||||
@ -412,7 +412,19 @@ urlpatterns = [
|
|||||||
"ledgers/", views.LedgerModelListView.as_view(), name="ledger_list"
|
"ledgers/", views.LedgerModelListView.as_view(), name="ledger_list"
|
||||||
),
|
),
|
||||||
path(
|
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(
|
# path(
|
||||||
# "ledgers/create/", views.LedgerModelCreateView.as_view(), name="ledger_create"
|
# "ledgers/create/", views.LedgerModelCreateView.as_view(), name="ledger_create"
|
||||||
|
|||||||
@ -4072,11 +4072,13 @@ class LedgerModelListView(LoginRequiredMixin, ListView,ArchiveIndexView):
|
|||||||
qs = qs.visible()
|
qs = qs.visible()
|
||||||
return qs
|
return qs
|
||||||
|
|
||||||
class LedgerModelDetailView(InvoiceModelDetailViewBase):
|
# class LedgerModelDetailView(InvoiceModelDetailViewBase):
|
||||||
|
class LedgerModelDetailView(LoginRequiredMixin, DetailView):
|
||||||
model = LedgerModel
|
model = LedgerModel
|
||||||
context_object_name = "ledger"
|
context_object_name = "ledger"
|
||||||
template_name = "ledger/ledger/ledger_detail.html"
|
template_name = "ledger/ledger/ledger_detail.html"
|
||||||
|
|
||||||
|
|
||||||
# class LedgerModelCreateView(LoginRequiredMixin,SuccessMessageMixin, CreateView):
|
# class LedgerModelCreateView(LoginRequiredMixin,SuccessMessageMixin, CreateView):
|
||||||
# model = LedgerModel
|
# model = LedgerModel
|
||||||
# template_name = "ledger/ledger/ledger_form.html"
|
# template_name = "ledger/ledger/ledger_form.html"
|
||||||
@ -4143,6 +4145,9 @@ class JournalEntryCreateView(LoginRequiredMixin,SuccessMessageMixin, CreateView)
|
|||||||
def JournalEntryDeleteView(request,pk):
|
def JournalEntryDeleteView(request,pk):
|
||||||
journal_entry = get_object_or_404(JournalEntryModel, pk=pk)
|
journal_entry = get_object_or_404(JournalEntryModel, pk=pk)
|
||||||
ledger = journal_entry.ledger
|
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()
|
journal_entry.delete()
|
||||||
messages.success(request, 'Journal Entry deleted')
|
messages.success(request, 'Journal Entry deleted')
|
||||||
return redirect("journalentry_list", pk=ledger.pk)
|
return redirect("journalentry_list", pk=ledger.pk)
|
||||||
@ -4163,3 +4168,52 @@ def JournalEntryTransactionsView(request, pk):
|
|||||||
|
|
||||||
class JournalEntryModelTXSDetailView(JournalEntryModelTXSDetailViewBase):
|
class JournalEntryModelTXSDetailView(JournalEntryModelTXSDetailViewBase):
|
||||||
template_name = 'ledger/journal_entry/journal_entry_txs.html'
|
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)
|
||||||
|
|||||||
@ -16,6 +16,7 @@ from django_ledger.io.io_core import get_localdate
|
|||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
import hashlib
|
import hashlib
|
||||||
|
from django_ledger.io import roles
|
||||||
|
|
||||||
User = get_user_model()
|
User = get_user_model()
|
||||||
|
|
||||||
@ -152,4 +153,19 @@ def run():
|
|||||||
|
|
||||||
# EntityManagementModel.objects.create(entity=,user=)
|
# EntityManagementModel.objects.create(entity=,user=)
|
||||||
# print(Permission.objects.filter(codename__icontains='customermodel').first().codename)
|
# 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()
|
||||||
|
|
||||||
@ -7,7 +7,7 @@
|
|||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
img {
|
.car_status {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 13%;
|
top: 13%;
|
||||||
left: 90%;
|
left: 90%;
|
||||||
@ -17,7 +17,6 @@
|
|||||||
{% endblock customCSS %}
|
{% endblock customCSS %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
{% if not car.ready %}
|
{% if not car.ready %}
|
||||||
<div class="alert alert-outline-warning d-flex align-items-center" role="alert">
|
<div class="alert alert-outline-warning d-flex align-items-center" role="alert">
|
||||||
<i class="fa-solid fa-circle-info fs-6"></i>
|
<i class="fa-solid fa-circle-info fs-6"></i>
|
||||||
@ -407,7 +406,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% if car.status == 'sold' %}
|
{% 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 %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@ -33,9 +33,25 @@
|
|||||||
|
|
||||||
<div class="row mt-4">
|
<div class="row mt-4">
|
||||||
<div class="d-flex justify-content-between mb-2">
|
<div class="d-flex justify-content-between mb-2">
|
||||||
|
|
||||||
<h3 class="">{% trans "Journal Entries" %}</h3>
|
<h3 class="">{% trans "Journal Entries" %}</h3>
|
||||||
<a href="{% url 'journalentry_create' ledger.pk %}" class="btn btn-sm btn-phoenix-primary ">{% trans "Add Journal Entry" %}</a>
|
<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>
|
||||||
|
|
||||||
<div class="table-responsive px-1 scrollbar">
|
<div class="table-responsive px-1 scrollbar">
|
||||||
@ -93,20 +109,18 @@
|
|||||||
<span class="fas fa-ellipsis-h fs-10"></span>
|
<span class="fas fa-ellipsis-h fs-10"></span>
|
||||||
</button>
|
</button>
|
||||||
<div class="dropdown-menu dropdown-menu-end py-2">
|
<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_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>
|
<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>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% empty %}
|
{% empty %}
|
||||||
<tr>
|
<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>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|||||||
@ -7,7 +7,6 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-4">
|
<div class="col-md-4">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
{{invoice}}
|
|
||||||
<div class="col-12 mb-4">
|
<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' %}
|
{% include 'ledger/journal_entry/includes/card_invoice.html' with invoice=invoice entity_slug=view.kwargs.entity_slug style='invoice-detail' %}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -25,7 +25,27 @@
|
|||||||
{% for ledger in ledgers %}
|
{% for ledger in ledgers %}
|
||||||
<tr class="hover-actions-trigger btn-reveal-trigger position-static">
|
<tr class="hover-actions-trigger btn-reveal-trigger position-static">
|
||||||
<td class="align-middle product white-space-nowrap">
|
<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>
|
||||||
<td class="align-middle product white-space-nowrap">
|
<td class="align-middle product white-space-nowrap">
|
||||||
<a class="btn btn-sm btn-primary"
|
<a class="btn btn-sm btn-primary"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user