This commit is contained in:
Faheedkhan 2025-06-22 20:08:26 +03:00
parent 10cb1235d6
commit 979e82b071
17 changed files with 32 additions and 237 deletions

View File

@ -1,4 +1,4 @@
# Generated by Django 5.2.1 on 2025-06-18 15:44
# Generated by Django 5.1.7 on 2025-06-22 10:44
import datetime
import django.core.validators
@ -21,7 +21,7 @@ class Migration(migrations.Migration):
('appointment', '0001_initial'),
('auth', '0012_alter_user_first_name_max_length'),
('contenttypes', '0002_remove_content_type_name'),
('django_ledger', '0022_alter_billmodel_bill_items_and_more'),
('django_ledger', '0021_alter_bankaccountmodel_account_model_and_more'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
@ -637,15 +637,8 @@ class Migration(migrations.Migration):
name='SaleOrder',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('payment_method', models.CharField(choices=[('cash', 'Cash'), ('finance', 'Finance'), ('lease', 'Lease'), ('credit_card', 'Credit Card'), ('bank_transfer', 'Bank Transfer'), ('sadad', 'SADAD')], max_length=20)),
('comments', models.TextField(blank=True, null=True)),
('formatted_order_id', models.CharField(editable=False, max_length=10, unique=True)),
('agreed_price', models.DecimalField(decimal_places=2, help_text='The final agreed-upon selling price of the vehicle.', max_digits=12)),
('down_payment_amount', models.DecimalField(decimal_places=2, default=0.0, help_text='The initial payment made by the customer.', max_digits=12)),
('trade_in_value', models.DecimalField(decimal_places=2, default=0.0, help_text='The value of any vehicle traded in by the customer.', max_digits=12)),
('loan_amount', models.DecimalField(decimal_places=2, default=0.0, help_text='The amount financed by a bank or third-party lender.', max_digits=12)),
('total_paid_amount', models.DecimalField(decimal_places=2, default=0.0, help_text='Sum of down payment, trade-in value, and loan amount received so far.', max_digits=12)),
('remaining_balance', models.DecimalField(decimal_places=2, default=0.0, help_text='The remaining amount due from the customer or financing.', max_digits=12)),
('status', models.CharField(choices=[('PENDING_APPROVAL', 'Pending Approval'), ('APPROVED', 'Approved'), ('IN_FINANCING', 'In Financing'), ('PARTIALLY_PAID', 'Partially Paid'), ('FULLY_PAID', 'Fully Paid'), ('PENDING_DELIVERY', 'Pending Delivery'), ('DELIVERED', 'Delivered'), ('CANCELLED', 'Cancelled')], default='PENDING_APPROVAL', help_text='Current status of the sales order.', max_length=20)),
('order_date', models.DateTimeField(default=django.utils.timezone.now, help_text='The date and time the sales order was created.')),
('expected_delivery_date', models.DateField(blank=True, help_text='The planned date for vehicle delivery.', null=True)),
@ -654,15 +647,13 @@ class Migration(migrations.Migration):
('cancellation_reason', models.TextField(blank=True, help_text='Reason for cancellation, if applicable.', null=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('car', models.ForeignKey(blank=True, help_text='The specific vehicle (VIN) being sold.', null=True, on_delete=django.db.models.deletion.PROTECT, related_name='sales_orders', to='inventory.car')),
('created_by', models.ForeignKey(help_text='The user who created this sales order.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_sales_orders', to=settings.AUTH_USER_MODEL)),
('customer', models.ForeignKey(help_text='The customer making the purchase.', on_delete=django.db.models.deletion.PROTECT, related_name='sales_orders', to='inventory.customer')),
('estimate', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sale_orders', to='django_ledger.estimatemodel', verbose_name='Estimate')),
('created_by', models.ForeignKey(blank=True, help_text='The user who created this sales order.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_sales_orders', to=settings.AUTH_USER_MODEL)),
('customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sale_orders', to='inventory.customer', verbose_name='Customer')),
('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sale_orders', to='inventory.dealer')),
('estimate', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sale_orders', to='django_ledger.estimatemodel', verbose_name='Estimate')),
('invoice', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sale_orders', to='django_ledger.invoicemodel', verbose_name='Invoice')),
('journal_entry', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='django_ledger.journalentrymodel')),
('last_modified_by', models.ForeignKey(help_text='The user who last modified this sales order.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='modified_sales_orders', to=settings.AUTH_USER_MODEL)),
('opportunity', models.OneToOneField(help_text='The associated sales opportunity for this order.', on_delete=django.db.models.deletion.CASCADE, related_name='sales_order', to='inventory.opportunity')),
('trade_in_vehicle', models.ForeignKey(blank=True, help_text='The vehicle traded in by the customer, if any.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='traded_in_on_orders', to='inventory.car')),
('last_modified_by', models.ForeignKey(blank=True, help_text='The user who last modified this sales order.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='modified_sales_orders', to=settings.AUTH_USER_MODEL)),
('opportunity', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sale_orders', to='inventory.opportunity', verbose_name='Opportunity')),
],
options={
'verbose_name': 'Sales Order',

View File

@ -1,17 +0,0 @@
# Generated by Django 5.2.1 on 2025-06-18 15:46
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('inventory', '0001_initial'),
]
operations = [
migrations.RemoveField(
model_name='saleorder',
name='journal_entry',
),
]

View File

@ -1,20 +0,0 @@
# Generated by Django 5.2.1 on 2025-06-18 15:46
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('django_ledger', '0022_alter_billmodel_bill_items_and_more'),
('inventory', '0002_remove_saleorder_journal_entry'),
]
operations = [
migrations.AddField(
model_name='saleorder',
name='journal_entry',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='django_ledger.journalentrymodel'),
),
]

View File

@ -1,61 +0,0 @@
# Generated by Django 5.2.1 on 2025-06-19 13:27
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('inventory', '0003_saleorder_journal_entry'),
]
operations = [
migrations.RemoveField(
model_name='saleorder',
name='agreed_price',
),
migrations.RemoveField(
model_name='saleorder',
name='customer',
),
migrations.RemoveField(
model_name='saleorder',
name='down_payment_amount',
),
migrations.RemoveField(
model_name='saleorder',
name='estimate',
),
migrations.RemoveField(
model_name='saleorder',
name='journal_entry',
),
migrations.RemoveField(
model_name='saleorder',
name='loan_amount',
),
migrations.RemoveField(
model_name='saleorder',
name='opportunity',
),
migrations.RemoveField(
model_name='saleorder',
name='payment_method',
),
migrations.RemoveField(
model_name='saleorder',
name='remaining_balance',
),
migrations.RemoveField(
model_name='saleorder',
name='total_paid_amount',
),
migrations.RemoveField(
model_name='saleorder',
name='trade_in_value',
),
migrations.RemoveField(
model_name='saleorder',
name='trade_in_vehicle',
),
]

View File

@ -1,17 +0,0 @@
# Generated by Django 5.2.1 on 2025-06-19 13:34
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('inventory', '0004_remove_saleorder_agreed_price_and_more'),
]
operations = [
migrations.RemoveField(
model_name='saleorder',
name='car',
),
]

View File

@ -1,20 +0,0 @@
# Generated by Django 5.2.1 on 2025-06-19 13:51
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('inventory', '0005_remove_saleorder_car'),
]
operations = [
migrations.AddField(
model_name='saleorder',
name='dealer',
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='sale_orders', to='inventory.dealer'),
preserve_default=False,
),
]

View File

@ -1,20 +0,0 @@
# Generated by Django 5.2.1 on 2025-06-19 13:59
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('django_ledger', '0022_alter_billmodel_bill_items_and_more'),
('inventory', '0006_saleorder_dealer'),
]
operations = [
migrations.AddField(
model_name='saleorder',
name='estimate',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sale_orders', to='django_ledger.estimatemodel', verbose_name='Estimate'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 5.2.1 on 2025-06-19 14:00
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('inventory', '0007_saleorder_estimate'),
]
operations = [
migrations.AddField(
model_name='saleorder',
name='opportunity',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sale_orders', to='inventory.opportunity', verbose_name='Opportunity'),
),
]

View File

@ -1,19 +0,0 @@
# Generated by Django 5.2.1 on 2025-06-19 14:19
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('inventory', '0008_saleorder_opportunity'),
]
operations = [
migrations.AddField(
model_name='saleorder',
name='customer',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sale_orders', to='inventory.customer', verbose_name='Customer'),
),
]

View File

@ -1,26 +0,0 @@
# Generated by Django 5.2.1 on 2025-06-19 14:34
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('inventory', '0009_saleorder_customer'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AlterField(
model_name='saleorder',
name='created_by',
field=models.ForeignKey(blank=True, help_text='The user who created this sales order.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_sales_orders', to=settings.AUTH_USER_MODEL),
),
migrations.AlterField(
model_name='saleorder',
name='last_modified_by',
field=models.ForeignKey(blank=True, help_text='The user who last modified this sales order.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='modified_sales_orders', to=settings.AUTH_USER_MODEL),
),
]

View File

@ -1,3 +1,4 @@
from typing import Union
from random import randint
from django import template

View File

@ -1107,6 +1107,7 @@ urlpatterns = [
views.PurchaseOrderMarkAsVoidView.as_view(),
name="po-action-mark-as-void",
),
path('inv/dashboard',views.inventory_dash,name='inv_dash')
]
handler404 = "inventory.views.custom_page_not_found_view"

View File

@ -9504,4 +9504,12 @@ class InventoryListView(InventoryListViewBase):
self.queryset = ItemTransactionModel.objects.inventory_pipeline_aggregate(
entity_slug=dealer.entity.slug,
)
return super().get_queryset()
return super().get_queryset()
def inventory_dash(request):
cars=models.Car.objects.all()
context={
'cars':cars
}
return render(request,'inv_dash.html',context)

4
templates/inv_dash.html Normal file
View File

@ -0,0 +1,4 @@
{% extends 'base.html' %}
{% block content %}
<h1>inventory dash</h1>
{%endblock%}

View File

@ -16,7 +16,10 @@
</div>
<div class="card-body p-0">
{% if inventory_ordered %}
<div class="table-responsive">
{% inventory_table inventory_ordered %}
</div>
{% else %}

View File

@ -5,6 +5,7 @@
<table class="table table-hover table-bordered align-middle">
<thead class="table-light">
<tr class="text-center">
<th class="py-3 text-start">{% trans "Created at" %}</th>
<th class="py-3 text-start">{% trans "Item" %}</th>
<th class="py-3">{% trans "UOM" %}</th>
<th class="py-3">{% trans "Quantity" %}</th>
@ -12,8 +13,12 @@
</tr>
</thead>
<tbody>
{% for i in inventory_list %}
<tr class="hover-actions-trigger">
<td class="ps-2 fw-medium">{{ i.item_model__name }}</td>
<td class="ps-2 fw-medium">{{ i.item_model__name }}</td>
<td class="text-center">{{ i.item_model__uom__name }}</td>
<td class="text-end pe-3">{{ i.total_quantity | floatformat:3 }}</td>

View File

@ -1,3 +1,4 @@
{% extends 'base.html' %}
{% load i18n %}
{% load static %}