haikal/inventory/signals.py
2024-12-17 13:33:59 +00:00

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}")