This commit is contained in:
= 2025-03-20 20:37:39 +03:00
parent 62813388d7
commit 3f89935d1b
10 changed files with 484 additions and 493 deletions

View File

@ -1,4 +1,4 @@
# Generated by Django 5.1.6 on 2025-03-06 01:43 # Generated by Django 4.2.20 on 2025-03-20 17:15
from django.db import migrations, models from django.db import migrations, models

View File

@ -1,7 +1,7 @@
# Generated by Django 5.1.6 on 2025-03-06 01:43 # Generated by Django 4.2.20 on 2025-03-20 17:15
import django.db.models.deletion
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
@ -9,8 +9,8 @@ class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
('haikalbot', '0001_initial'),
('inventory', '0001_initial'), ('inventory', '0001_initial'),
('haikalbot', '0001_initial'),
] ]
operations = [ operations = [

View File

@ -5,8 +5,8 @@ class InventoryConfig(AppConfig):
name = 'inventory' name = 'inventory'
def ready(self): def ready(self):
import inventory.signals import inventory.signals
# from decimal import Decimal from decimal import Decimal
# from inventory.models import VatRate from inventory.models import VatRate
# VatRate.objects.get_or_create(rate=Decimal('0.15'), is_active=True) VatRate.objects.get_or_create(rate=Decimal('0.15'), is_active=True)

File diff suppressed because it is too large Load Diff

View File

@ -1,18 +0,0 @@
# Generated by Django 5.1.7 on 2025-03-16 19:09
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('inventory', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='saleorder',
name='payment_method',
field=models.CharField(choices=[('cash', 'Cash'), ('finance', 'Finance'), ('lease', 'Lease'), ('credit_card', 'Credit Card'), ('bank_transfer', 'Bank Transfer'), ('SADAD', 'SADAD')], max_length=20),
),
]

View File

@ -358,8 +358,6 @@ class Car(models.Model):
vendor = models.ForeignKey( vendor = models.ForeignKey(
VendorModel, VendorModel,
models.DO_NOTHING, models.DO_NOTHING,
null=True,
blank=True,
related_name="cars", related_name="cars",
verbose_name=_("Vendor"), verbose_name=_("Vendor"),
) )

View File

@ -623,7 +623,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="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="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) 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) @receiver(post_save, sender=models.Dealer)
def create_dealer_groups(sender, instance, created, **kwargs): def create_dealer_groups(sender, instance, created, **kwargs):
@ -658,7 +658,7 @@ def create_ledger_vendor(sender, instance, created, **kwargs):
}, },
} }
) )
coa = entity.get_default_coa() coa = entity.get_default_coa()
last_account = entity.get_all_accounts().filter(role=roles.LIABILITY_CL_ACC_PAYABLE).order_by('-created').first() last_account = entity.get_all_accounts().filter(role=roles.LIABILITY_CL_ACC_PAYABLE).order_by('-created').first()
# code = f"{int(last_account.code)}{1:03d}" # code = f"{int(last_account.code)}{1:03d}"
@ -674,7 +674,7 @@ def create_ledger_vendor(sender, instance, created, **kwargs):
coa_model=coa, coa_model=coa,
balance_type="credit", balance_type="credit",
active=True active=True
) )
print(f"VendorModel created for Vendor: {instance.name}") print(f"VendorModel created for Vendor: {instance.name}")
@ -898,11 +898,6 @@ def create_dealer_settings(sender, instance, created, **kwargs):
bill_prepaid_account=instance.entity.get_all_accounts().filter(role=roles.ASSET_CA_PREPAID).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() 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) # @receiver(post_save, sender=EstimateModel)
# def update_estimate_status(sender, instance,created, **kwargs): # def update_estimate_status(sender, instance,created, **kwargs):
@ -951,7 +946,7 @@ def create_make_ledger_accounts(sender, instance, created, **kwargs):
# coa_model=entity.get_default_coa(), # coa_model=entity.get_default_coa(),
# balance_type="credit", # balance_type="credit",
# active=True # active=True
# ) # )
@receiver(post_save, sender=models.CarFinance) @receiver(post_save, sender=models.CarFinance)
def update_finance_cost(sender, instance, created, **kwargs): def update_finance_cost(sender, instance, created, **kwargs):
@ -969,17 +964,17 @@ def update_finance_cost(sender, instance, created, **kwargs):
) )
ledger.additional_info["je_number"] = journal.je_number ledger.additional_info["je_number"] = journal.je_number
ledger.save() ledger.save()
inventory_account = entity.get_default_coa_accounts().filter(role=roles.ASSET_CA_INVENTORY).first() inventory_account = entity.get_default_coa_accounts().filter(role=roles.ASSET_CA_INVENTORY).first()
vendor_account = entity.get_default_coa_accounts().get(name=vendor.vendor_name) vendor_account = entity.get_default_coa_accounts().get(name=vendor.vendor_name)
# Debit Inventory Account # Debit Inventory Account
TransactionModel.objects.create( TransactionModel.objects.create(
journal_entry=journal, journal_entry=journal,
account=inventory_account, account=inventory_account,
amount=instance.total + instance.total_additionals, amount=instance.total + instance.total_additionals,
tx_type='debit' tx_type='debit'
) )
# Credit Vendor Account # Credit Vendor Account
TransactionModel.objects.create( TransactionModel.objects.create(
@ -1003,13 +998,13 @@ def update_finance_cost(sender, instance, created, **kwargs):
inventory_account = entity.get_default_coa_accounts().filter(role=roles.ASSET_CA_INVENTORY).first() inventory_account = entity.get_default_coa_accounts().filter(role=roles.ASSET_CA_INVENTORY).first()
vendor_account = entity.get_default_coa_accounts().get(name=vendor.vendor_name, active=True) vendor_account = entity.get_default_coa_accounts().get(name=vendor.vendor_name, active=True)
# Debit Inventory Account # Debit Inventory Account
TransactionModel.objects.create( TransactionModel.objects.create(
journal_entry=journal, journal_entry=journal,
account=inventory_account, account=inventory_account,
amount=instance.cost_price, amount=instance.cost_price,
tx_type='debit' tx_type='debit'
) )
# Credit Vendor Account # Credit Vendor Account
TransactionModel.objects.create( TransactionModel.objects.create(
@ -1023,9 +1018,9 @@ def update_finance_cost(sender, instance, created, **kwargs):
journal = JournalEntryModel.objects.filter(je_number=ledger.additional_info.get("je_number")).first() journal = JournalEntryModel.objects.filter(je_number=ledger.additional_info.get("je_number")).first()
debit = journal.get_transaction_queryset().filter(tx_type='debit').first() debit = journal.get_transaction_queryset().filter(tx_type='debit').first()
credit = journal.get_transaction_queryset().filter(tx_type='credit').first() credit = journal.get_transaction_queryset().filter(tx_type='credit').first()
debit.amount = instance.cost_price debit.amount = instance.cost_price
credit.amount = instance.cost_price credit.amount = instance.cost_price
debit.save() debit.save()
credit.save() credit.save()

View File

@ -4070,8 +4070,9 @@ class LedgerModelListView(LoginRequiredMixin, ListView,ArchiveIndexView):
show_all = False show_all = False
show_current = False show_current = False
show_visible = False show_visible = False
allow_empty = True
def get_queryset(self): def get_queryset(self):
qs = super().get_queryset() qs = super().get_queryset()
dealer = get_user_type(self.request) dealer = get_user_type(self.request)
@ -4091,51 +4092,51 @@ 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"
# form_class = forms.LedgerModelCreateForm # form_class = forms.LedgerModelCreateForm
# success_message = "Ledger created" # success_message = "Ledger created"
# def get_form(self, form_class=None): # def get_form(self, form_class=None):
# dealer = get_user_type(self.request) # dealer = get_user_type(self.request)
# form = forms.LedgerModelCreateForm(entity_slug=dealer.entity.slug,user_model=dealer.entity.admin,**self.get_form_kwargs()) # form = forms.LedgerModelCreateForm(entity_slug=dealer.entity.slug,user_model=dealer.entity.admin,**self.get_form_kwargs())
# return form # return form
# def get_success_url(self): # def get_success_url(self):
# return reverse('ledger_list') # return reverse('ledger_list')
# def form_valid(self, form): # def form_valid(self, form):
# instance = form.save(commit=False) # instance = form.save(commit=False)
# dealer = get_user_type(self.request) # dealer = get_user_type(self.request)
# instance.entity = dealer.entity # instance.entity = dealer.entity
# instance.save() # instance.save()
# return super().form_valid(form) # return super().form_valid(form)
class JournalEntryListView(LoginRequiredMixin, ListView): class JournalEntryListView(LoginRequiredMixin, ListView):
model = JournalEntryModel model = JournalEntryModel
context_object_name = "journal_entries" context_object_name = "journal_entries"
template_name = "ledger/journal_entry/journal_entry_list.html" template_name = "ledger/journal_entry/journal_entry_list.html"
def get_queryset(self): def get_queryset(self):
qs = super().get_queryset() qs = super().get_queryset()
ledger = LedgerModel.objects.filter(pk=self.kwargs['pk']).first() ledger = LedgerModel.objects.filter(pk=self.kwargs['pk']).first()
qs = qs.filter(ledger=ledger) qs = qs.filter(ledger=ledger)
return qs return qs
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context['ledger'] = LedgerModel.objects.filter(pk=self.kwargs['pk']).first() context['ledger'] = LedgerModel.objects.filter(pk=self.kwargs['pk']).first()
return context return context
class JournalEntryCreateView(LoginRequiredMixin,SuccessMessageMixin, CreateView): class JournalEntryCreateView(LoginRequiredMixin,SuccessMessageMixin, CreateView):
model = JournalEntryModel model = JournalEntryModel
template_name = "ledger/journal_entry/journal_entry_form.html" template_name = "ledger/journal_entry/journal_entry_form.html"
form_class = forms.JournalEntryModelCreateForm form_class = forms.JournalEntryModelCreateForm
ledger_model = None ledger_model = None
success_message = "Journal Entry created" success_message = "Journal Entry created"
def get_form(self, form_class=None): def get_form(self, form_class=None):
dealer = get_user_type(self.request) dealer = get_user_type(self.request)
ledger = LedgerModel.objects.filter(pk=self.kwargs['pk']).first() ledger = LedgerModel.objects.filter(pk=self.kwargs['pk']).first()
@ -4150,11 +4151,11 @@ class JournalEntryCreateView(LoginRequiredMixin,SuccessMessageMixin, CreateView)
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context["ledger"] = LedgerModel.objects.filter(pk=self.kwargs['pk']).first() context["ledger"] = LedgerModel.objects.filter(pk=self.kwargs['pk']).first()
return context return context
def get_success_url(self): def get_success_url(self):
ledger = LedgerModel.objects.filter(pk=self.kwargs['pk']).first() ledger = LedgerModel.objects.filter(pk=self.kwargs['pk']).first()
return reverse("journalentry_list", kwargs={"pk": ledger.pk}) return reverse("journalentry_list", kwargs={"pk": ledger.pk})
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)
@ -4182,7 +4183,7 @@ 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): def ledger_lock_all_journals(request,entity_slug,pk):
ledger = LedgerModel.objects.filter(pk=pk).first() ledger = LedgerModel.objects.filter(pk=pk).first()
@ -4199,7 +4200,7 @@ def ledger_unlock_all_journals(request,entity_slug,pk):
if not ledger.is_locked(): if not ledger.is_locked():
messages.error(request, "Ledger is already Unlocked.") messages.error(request, "Ledger is already Unlocked.")
return redirect("journalentry_list", pk=ledger.pk) return redirect("journalentry_list", pk=ledger.pk)
ledger.unlock() ledger.unlock()
ledger.save() ledger.save()
qs = ledger.journal_entries.locked() qs = ledger.journal_entries.locked()
@ -4224,10 +4225,10 @@ def ledger_unpost_all_journals(request,entity_slug,pk):
messages.error(request, "Ledger is already Unposted.") messages.error(request, "Ledger is already Unposted.")
return redirect("journalentry_list", pk=ledger.pk) return redirect("journalentry_list", pk=ledger.pk)
qs = ledger.journal_entries.posted() qs = ledger.journal_entries.posted()
for je in qs: for je in qs:
je.mark_as_unposted() je.mark_as_unposted()
je.save() je.save()
ledger.unpost() ledger.unpost()
ledger.save() ledger.save()
return redirect("journalentry_list", pk=ledger.pk) return redirect("journalentry_list", pk=ledger.pk)

View File

@ -29,8 +29,6 @@ commonmark
contourpy contourpy
crispy-bootstrap5 crispy-bootstrap5
cryptography cryptography
cssselect2
ctranslate2
cycler cycler
Cython Cython
decorator decorator

View File

@ -1,4 +1,5 @@
from inventory.models import * from inventory.models import *
from django_ledger.models import VendorModel
from rich import print from rich import print
import random import random
import datetime import datetime
@ -8,6 +9,9 @@ from inventory.services import decodevin
def run(): def run():
# car = Car.objects.filter(vin='2C3HD46R4WH170267') # car = Car.objects.filter(vin='2C3HD46R4WH170267')
dealer = Dealer.objects.first()
vendors = [VendorModel.objects.create(vendor_name=f'vendor{i}',entity_model=dealer.entity) for i in range(1, 5)]
vin_list = [ vin_list = [
"1B3ES56C13D120225", "1B3ES56C13D120225",
"1GB4KYC86FF131536", "1GB4KYC86FF131536",
@ -24,8 +28,8 @@ def run():
] ]
for vin in vin_list: for vin in vin_list:
try: try:
for _ in range(15): for _ in range(5):
dealer = Dealer.objects.get(user__email="ismail.mosa.ibrahim@gmail.com")
vin = f"{vin[:-4]}{random.randint(0, 9)}{random.randint(0, 9)}{random.randint(0, 9)}{random.randint(0, 9)}" vin = f"{vin[:-4]}{random.randint(0, 9)}{random.randint(0, 9)}{random.randint(0, 9)}{random.randint(0, 9)}"
result = decodevin(vin) result = decodevin(vin)
make = CarMake.objects.get(name=result["maker"]) make = CarMake.objects.get(name=result["maker"])
@ -35,13 +39,14 @@ def run():
year = result["modelYear"] year = result["modelYear"]
serie = random.choice(model.carserie_set.all()) serie = random.choice(model.carserie_set.all())
trim = random.choice(serie.cartrim_set.all()) trim = random.choice(serie.cartrim_set.all())
vendor = random.choice(vendors)
car = Car.objects.create( car = Car.objects.create(
vin=vin, vin=vin,
id_car_make=make, id_car_make=make,
id_car_model=model, id_car_model=model,
id_car_serie=serie, id_car_serie=serie,
id_car_trim=trim, id_car_trim=trim,
vendor=vendor,
year=(int(year) or 2025), year=(int(year) or 2025),
receiving_date=datetime.datetime.now(), receiving_date=datetime.datetime.now(),
dealer=dealer, dealer=dealer,