Merge branch 'main' of http://10.10.1.136:3000/ismail/haikal into frontend

This commit is contained in:
Faheedkhan 2025-08-05 19:49:31 +03:00
commit e6e2ed0150
7 changed files with 29 additions and 20 deletions

View File

@ -728,6 +728,9 @@ class Car(Base):
def additional_services(self): def additional_services(self):
return self.finances.additional_services.all() return self.finances.additional_services.all()
@property @property
def total_additional_services(self):
return sum([service.price_ for service in self.additional_services])
@property
def ready(self): def ready(self):
try: try:
return all( return all(
@ -2467,7 +2470,7 @@ class Notification(models.Model):
user = models.ForeignKey( user = models.ForeignKey(
User, on_delete=models.CASCADE, related_name="notifications" User, on_delete=models.CASCADE, related_name="notifications"
) )
message = models.CharField(max_length=255, verbose_name=_("Message")) message = models.TextField(verbose_name=_("Message"))
is_read = models.BooleanField(default=False, verbose_name=_("Is Read")) is_read = models.BooleanField(default=False, verbose_name=_("Is Read"))
created = models.DateTimeField(auto_now_add=True, verbose_name=_("Created")) created = models.DateTimeField(auto_now_add=True, verbose_name=_("Created"))
@ -2751,7 +2754,7 @@ class SaleOrder(models.Model):
blank=True, blank=True,
) )
comments = models.TextField(blank=True, null=True) comments = models.TextField(blank=True, null=True)
formatted_order_id = models.CharField(max_length=10, unique=True, editable=False) formatted_order_id = models.CharField(max_length=255, unique=True, editable=False)
# Status and Dates # Status and Dates
status = models.CharField( status = models.CharField(

View File

@ -1125,7 +1125,7 @@ def estimate_in_review_notification(sender, instance, created, **kwargs):
url=reverse( url=reverse(
"estimate_detail", "estimate_detail",
kwargs={"dealer_slug": dealer.slug, "pk": instance.pk}, kwargs={"dealer_slug": dealer.slug, "pk": instance.pk},
), )
), ),
) )

View File

@ -69,7 +69,7 @@ def create_coa_accounts(instance):
"role": roles.ASSET_CA_CASH, "role": roles.ASSET_CA_CASH,
"balance_type": roles.DEBIT, "balance_type": roles.DEBIT,
"locked": False, "locked": False,
"default": False, "default": False,
}, },
{ {
"code": "1030", "code": "1030",

View File

@ -1055,7 +1055,8 @@ class CarFinanceCalculator:
quantity = self._get_quantity(item) quantity = self._get_quantity(item)
car = item.item_model.car car = item.item_model.car
unit_price = Decimal(car.finances.marked_price) unit_price = Decimal(car.finances.marked_price)
discount = self.extra_info.data.get("discount",0)
sell_price = unit_price - Decimal(discount)
return { return {
"item_number": item.item_model.item_number, "item_number": item.item_model.item_number,
"vin": car.vin, #car_info.get("vin"), "vin": car.vin, #car_info.get("vin"),
@ -1071,8 +1072,13 @@ class CarFinanceCalculator:
"discount": car.finances.discount_amount, "discount": car.finances.discount_amount,
"quantity": quantity, "quantity": quantity,
"unit_price": unit_price, "unit_price": unit_price,
"total": unit_price * Decimal(quantity), "sell_price": sell_price,
"total_vat": car.finances.total_vat, "total": unit_price,
"total_vat": sell_price * self.vat_rate,
"total_discount": discount,
"final_price": sell_price + (sell_price * self.vat_rate),
"total_additionals": car.total_additional_services,
"grand_total": sell_price + (sell_price * self.vat_rate) + car.total_additional_services,
"additional_services": car.additional_services,# self._get_nested_value( "additional_services": car.additional_services,# self._get_nested_value(
#item, self.ADDITIONAL_SERVICES_KEY #item, self.ADDITIONAL_SERVICES_KEY
#), #),
@ -1087,10 +1093,10 @@ class CarFinanceCalculator:
Decimal(item.price_) for item in self._get_additional_services()) Decimal(item.price_) for item in self._get_additional_services())
total_discount = self.extra_info.data.get("discount",0) total_discount = self.extra_info.data.get("discount",0)
total_price_discounted = total_price total_price_discounted = total_price
if total_discount: if total_discount:
total_price_discounted = total_price - Decimal(total_discount) total_price_discounted = total_price - Decimal(total_discount)
print(total_price_discounted)
total_vat_amount = total_price_discounted * self.vat_rate total_vat_amount = total_price_discounted * self.vat_rate
return { return {
@ -1371,10 +1377,10 @@ def _post_sale_and_cogs(invoice, dealer):
).first().item_model.car ).first().item_model.car
qty = Decimal(car_data['quantity']) qty = Decimal(car_data['quantity'])
net_car_price = Decimal(car_data['total']) net_car_price = Decimal(car_data['total']) - Decimal(car_data['total_discount'])
net_add_price = Decimal(data['total_additionals']) net_additionals_price = Decimal(data['total_additionals'])
vat_amount = Decimal(data['total_vat_amount']) * qty vat_amount = Decimal(data['total_vat_amount']) * qty
grand_total = net_car_price + net_add_price + vat_amount grand_total = net_car_price + net_additionals_price + vat_amount
cost_total = Decimal(car_data['cost_price']) * qty cost_total = Decimal(car_data['cost_price']) * qty
# ------------------------------------------------------------------ # ------------------------------------------------------------------
@ -1420,12 +1426,12 @@ def _post_sale_and_cogs(invoice, dealer):
tx_type='credit' tx_type='credit'
) )
if net_add_price > 0: if net_additionals_price > 0:
# Cr Sales Additional Services # Cr Sales Additional Services
TransactionModel.objects.create( TransactionModel.objects.create(
journal_entry=je_sale, journal_entry=je_sale,
account=add_rev, account=add_rev,
amount=net_add_price, amount=net_additionals_price,
tx_type='credit' tx_type='credit'
) )

View File

@ -4807,7 +4807,7 @@ class EstimateDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailView
finance_data = calculator.get_finance_data() finance_data = calculator.get_finance_data()
invoice_obj = InvoiceModel.objects.all().filter(ce_model=estimate).first() invoice_obj = InvoiceModel.objects.all().filter(ce_model=estimate).first()
kwargs["data"] = finance_data kwargs["data"] = finance_data
print(kwargs["data"])
kwargs["invoice"] = invoice_obj kwargs["invoice"] = invoice_obj
try: try:
car_finances = estimate.get_itemtxs_data()[0].first().item_model.car.finances car_finances = estimate.get_itemtxs_data()[0].first().item_model.car.finances
@ -5465,9 +5465,9 @@ def invoice_create(request, dealer_slug, pk):
invoice_itemtxs = { invoice_itemtxs = {
i.get("item_number"): { i.get("item_number"): {
"unit_cost": i.get("total_vat"), "unit_cost": i.get("grand_total"),
"quantity": i.get("quantity"), "quantity": 1,
"total_amount": i.get("total_vat"), "total_amount": i.get("grand_total"),
} }
for i in finance_data.get("cars") for i in finance_data.get("cars")
} }

View File

@ -20,7 +20,7 @@
<li class="collapsed-nav-item-title d-none">{% trans "Inventory"|capfirst %}</li> <li class="collapsed-nav-item-title d-none">{% trans "Inventory"|capfirst %}</li>
{% if perms.inventory.add_car %} {% if perms.inventory.add_car %}
<li class="nav-item"> <li class="nav-item">
<a hx-boost="true" id="btn-add-car" class="nav-link btn-add-car" href="{% url 'car_add' request.dealer.slug %}"> <a hx-boost="false" id="btn-add-car" class="nav-link btn-add-car" href="{% url 'car_add' request.dealer.slug %}">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<span class="nav-link-icon"><span class="fas fa-plus-circle"></span></span><span class="nav-link-text">{% trans "add car"|capfirst %}</span> <span class="nav-link-icon"><span class="fas fa-plus-circle"></span></span><span class="nav-link-text">{% trans "add car"|capfirst %}</span>
</div> </div>
@ -164,7 +164,7 @@
<li class="collapsed-nav-item-title d-none">{% trans 'sales'|capfirst %}</li> <li class="collapsed-nav-item-title d-none">{% trans 'sales'|capfirst %}</li>
{% if perms.django_ledger.add_estimatemodel %} {% if perms.django_ledger.add_estimatemodel %}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{% url 'estimate_create' request.dealer.slug %}"> <a hx-boost="false" class="nav-link" href="{% url 'estimate_create' request.dealer.slug %}">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<span class="nav-link-icon"><span class="fas fa-handshake"></span></span><span class="nav-link-text">{% trans "create quotation"|capfirst %}</span> <span class="nav-link-icon"><span class="fas fa-handshake"></span></span><span class="nav-link-text">{% trans "create quotation"|capfirst %}</span>
</div> </div>

View File

@ -191,7 +191,7 @@
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}