182 lines
5.6 KiB
Python
182 lines
5.6 KiB
Python
from random import randint
|
|
|
|
from django.db.models.signals import post_save, post_delete,pre_delete
|
|
from django.dispatch import receiver
|
|
from django_ledger.models import EntityModel, VendorModel, CustomerModel, UnitOfMeasureModel
|
|
from django.utils.translation import gettext_lazy as _
|
|
from . import models
|
|
|
|
|
|
@receiver(pre_delete, sender=models.Dealer)
|
|
def remove_user_account(sender, instance, **kwargs):
|
|
user = instance.user
|
|
if user:
|
|
user.delete()
|
|
|
|
@receiver(post_save, sender=models.CarReservation)
|
|
def update_car_status_on_reservation(sender, instance, created, **kwargs):
|
|
if created:
|
|
car = instance.car
|
|
car.status = models.CarStatusChoices.RESERVED
|
|
car.save()
|
|
|
|
|
|
@receiver(post_delete, sender=models.CarReservation)
|
|
def update_car_status_on_reservation_delete(sender, instance, **kwargs):
|
|
car = instance.car
|
|
if not car.get_current_reservation():
|
|
car.status = models.CarStatusChoices.AVAILABLE
|
|
car.save()
|
|
|
|
|
|
# Create Entity
|
|
@receiver(post_save, sender=models.Dealer)
|
|
def create_ledger_entity(sender, instance, created, **kwargs):
|
|
if created:
|
|
entity = EntityModel.objects.create(
|
|
name=instance.name,
|
|
admin=instance.user,
|
|
address_1=instance.address,
|
|
fy_start_month=1,
|
|
accrual_method=True,
|
|
depth=0,
|
|
)
|
|
|
|
default_coa = entity.create_chart_of_accounts(assign_as_default=True,
|
|
commit=True,
|
|
coa_name=_("Chart of Accounts"))
|
|
# entity.create_account(
|
|
# coa_model=coa,
|
|
# code=1010,
|
|
# role='asset_ca_cash',
|
|
# name=_('Cash'),
|
|
# balance_type="debit",
|
|
# )
|
|
# entity.create_account(
|
|
# coa_model=coa,
|
|
# code=1200,
|
|
# role='asset_ca_inv',
|
|
# name=_('Inventory'),
|
|
# balance_type="debit",
|
|
# active=True)
|
|
|
|
|
|
if default_coa:
|
|
entity.populate_default_coa(activate_accounts=True, coa_model=default_coa)
|
|
|
|
uom_name = _("Unit")
|
|
unit_abbr = _("U")
|
|
|
|
entity.create_uom(uom_name, unit_abbr)
|
|
|
|
print(f"Ledger entity created for Dealer: {instance.name}")
|
|
|
|
|
|
# # Create Vendor
|
|
@receiver(post_save, sender=models.Vendor)
|
|
def create_ledger_vendor(sender, instance, created, **kwargs):
|
|
|
|
if created:
|
|
entity = EntityModel.objects.filter(name=instance.dealer.name).first()
|
|
|
|
entity.create_vendor(
|
|
vendor_name=instance.name,
|
|
vendor_number=instance.crn,
|
|
address_1=instance.address,
|
|
phone=instance.phone_number,
|
|
tax_id_number=instance.vrn,
|
|
active=True,
|
|
hidden=False,
|
|
additional_info={
|
|
"arabic_name": instance.arabic_name,
|
|
"contact_person": instance.contact_person,
|
|
})
|
|
|
|
|
|
print(f"VendorModel created for Vendor: {instance.name}")
|
|
|
|
|
|
@receiver(post_save, sender=models.Customer)
|
|
def create_customer(sender, instance, created, **kwargs):
|
|
|
|
if created:
|
|
entity = EntityModel.objects.filter(name=instance.dealer.name).first()
|
|
name = f"{instance.first_name} {instance.middle_name} {instance.last_name}"
|
|
|
|
entity.create_customer(
|
|
customer_name=name,
|
|
customer_number=instance.national_id,
|
|
address_1=instance.address,
|
|
phone=instance.phone_number,
|
|
email=instance.email,
|
|
sales_tax_rate=0.15,
|
|
active=True,
|
|
hidden=False,
|
|
additional_info={}
|
|
)
|
|
|
|
print(f"Customer created: {name}")
|
|
|
|
|
|
# Create Item
|
|
@receiver(post_save, sender=models.Car)
|
|
def create_item_model(sender, instance, created, **kwargs):
|
|
item_name = f"{instance.year} - {instance.id_car_make} - {instance.id_car_model} - {instance.id_car_trim}"
|
|
uom_name = _("Car")
|
|
unit_abbr = _("C")
|
|
|
|
uom, uom_created = UnitOfMeasureModel.objects.get_or_create(
|
|
name=uom_name,
|
|
unit_abbr=unit_abbr
|
|
)
|
|
|
|
if uom_created:
|
|
print(f"UOM created: {uom_name}")
|
|
else:
|
|
print(f"Using existing UOM: {uom_name}")
|
|
|
|
entity = EntityModel.objects.filter(name=instance.dealer.name).first()
|
|
|
|
inventory_account = AccountModel.objects.first()
|
|
cogs_account = AccountModel.objects.first()
|
|
earnings_account = AccountModel.objects.first()
|
|
|
|
entity.create_i
|
|
|
|
item = ItemModel.objects.create(
|
|
entity=entity,
|
|
uom=uom,
|
|
name=item_name,
|
|
item_role=ItemModelAbstract.ITEM_ROLE_INVENTORY,
|
|
item_type=ItemModelAbstract.ITEM_TYPE_MATERIAL,
|
|
item_id=instance.vin,
|
|
sold_as_unit=True,
|
|
inventory_received=1.00,
|
|
inventory_received_value=0.00,
|
|
inventory_account=inventory_account,
|
|
for_inventory=True,
|
|
is_product_or_service=True,
|
|
cogs_account=cogs_account,
|
|
earnings_account=earnings_account,
|
|
is_active=True,
|
|
additional_info={
|
|
"remarks": instance.remarks,
|
|
"status": instance.status,
|
|
"stock_type": instance.stock_type,
|
|
"mileage": instance.mileage,
|
|
},
|
|
)
|
|
|
|
print(f"ItemModel {'created' if created else 'updated'} for Car: {item.name}")
|
|
#
|
|
#
|
|
# # update price - CarFinance
|
|
# @receiver(post_save, sender=CarFinance)
|
|
# def update_item_model_cost(sender, instance, created, **kwargs):
|
|
#
|
|
# ItemModel.objects.filter(item_id=instance.car.vin).update(
|
|
# inventory_received_value=instance.cost_price,
|
|
# default_amount=instance.cost_price,
|
|
# )
|
|
# print(f"Inventory item updated with CarFinance data for Car: {instance.car}")
|