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

This commit is contained in:
Faheedkhan 2025-06-26 18:00:09 +03:00
commit 75c800d9de
5 changed files with 54 additions and 51 deletions

View File

@ -97,7 +97,7 @@ class InjectDealerMiddleware:
request.is_staff = False
if hasattr(request.user, "dealer"):
request.is_dealer = True
if hasattr(request.user, "staffmember"):
elif hasattr(request.user, "staffmember"):
request.is_staff = True
except Exception:
pass

View File

@ -31,6 +31,8 @@ from django_ledger.models import (
InvoiceModel,
AccountModel,
EntityManagementModel,
PurchaseOrderModel,
ItemTransactionModel,
)
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
@ -722,7 +724,7 @@ class Car(Base):
self.save()
@property
def logo(self):
return self.id_car_make.logo.url if self.id_car_make.logo else None
return self.id_car_make.logo.url if self.id_car_make.logo else None
class CarTransfer(models.Model):
car = models.ForeignKey(
@ -2835,3 +2837,18 @@ class PaymentHistory(models.Model):
######################################################################################################
######################################################################################################
######################################################################################################
class PoItemsUploaded(models.Model):
dealer = models.ForeignKey(Dealer, on_delete=models.CASCADE, null=True, blank=True)
po = models.ForeignKey(
PurchaseOrderModel, on_delete=models.CASCADE, null=True, blank=True, related_name="items"
)
item = models.ForeignKey(
ItemTransactionModel,
on_delete=models.CASCADE,
null=True,
blank=True,
related_name="po_items",
)
status = models.CharField(max_length=100, null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

View File

@ -2929,21 +2929,22 @@ class UserCreateView(
return self.form_invalid(form)
email = form.cleaned_data["email"]
password = "Tenhal@123"
try:
user = User.objects.create_user(
username=email, email=email, password=password
)
user.is_staff = True
user.save()
except IntegrityError as e:
if User.objects.filter(email=email).exists():
messages.error(
self.request,
_(
"A user with this email already exists. Please use a different email."
),
)
return redirect("user_create")
return redirect("user_create", dealer_slug=dealer.slug)
password = "Tenhal@123"
user = User.objects.create_user(
username=email, email=email, password=password
)
user.is_staff = True
user.save()
staff_member = StaffMember.objects.create(user=user)
for service in form.cleaned_data["service_offered"]:
staff_member.services_offered.add(service)
@ -9535,6 +9536,11 @@ class PurchaseOrderMarkAsApprovedView(BasePurchaseOrderActionActionView):
class PurchaseOrderMarkAsFulfilledView(BasePurchaseOrderActionActionView):
action_name = "mark_as_fulfilled"
def get(self, request, dealer_slug, entity_slug, po_pk, *args, **kwargs):
po = get_object_or_404(PurchaseOrderModel, pk=po_pk)
for item in po.get_itemtxs_data()[0]:
models.PoItemsUploaded.objects.create(po=po, item=item, status="fulfilled")
return super().get(request, dealer_slug, entity_slug, po_pk, *args, **kwargs)
class PurchaseOrderMarkAsCanceledView(BasePurchaseOrderActionActionView):
action_name = "mark_as_canceled"
@ -9602,36 +9608,23 @@ class BillModelActionForceMigrateView(BaseBillActionView):
def view_items_inventory(request, dealer_slug, entity_slug, po_pk):
dealer = get_object_or_404(models.Dealer, slug=dealer_slug)
get_object_or_404(models.Dealer, slug=dealer_slug)
po = PurchaseOrderModel.objects.get(pk=po_pk)
items = po.get_itemtxs_data()[0]
items_per_page = 30
paginator = Paginator(items, items_per_page)
items = po.items.all()
page_number = request.GET.get("page")
try:
page_obj = paginator.get_page(page_number)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
page_obj = paginator.get_page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results.
page_obj = paginator.get_page(paginator.num_pages)
return render(
request,
"purchase_orders/po_upload_cars.html",
{"po": po, "items": items, "page_obj": page_obj},
)
return render(request,"purchase_orders/po_upload_cars.html",{"po": po, "items": items})
def upload_cars(request, dealer_slug, pk=None):
item = None
po_item = None
dealer = get_object_or_404(models.Dealer, slug=dealer_slug)
response = redirect("upload_cars", dealer_slug=dealer_slug)
if pk:
item = get_object_or_404(ItemTransactionModel, pk=pk)
po_item = models.PoItemsUploaded.objects.get(dealer=dealer, item=item)
response = redirect("upload_cars", dealer_slug=dealer_slug, pk=pk)
if item.item_model.additional_info.get("uploaded"):
if po_item.status == "uploaded":
messages.add_message(request, messages.ERROR, "Item already uploaded.")
return redirect(
"view_items_inventory",
@ -9645,7 +9638,6 @@ def upload_cars(request, dealer_slug, pk=None):
try:
if item:
item = ItemTransactionModel.objects.get(pk=pk)
data = [x.strip() for x in item.item_model.name.split("||")]
make = models.CarMake.objects.filter(is_sa_import=True).get(
name=data[0]
@ -9725,9 +9717,9 @@ def upload_cars(request, dealer_slug, pk=None):
)
car.add_colors(exterior=exterior, interior=interior)
cars_created += 1
if item:
item.item_model.additional_info["uploaded"] = True
item.item_model.save()
if po_item:
po_item.status = "uploaded"
po_item.save()
messages.success(request, f"Successfully imported {cars_created} cars")
return response

View File

@ -66,7 +66,11 @@
<button class="btn btn-sm dropdown-toggle dropdown-caret-none transition-none btn-reveal fs-10" type="button" data-bs-toggle="dropdown" data-boundary="window" aria-haspopup="true" aria-expanded="false" data-bs-reference="parent"><span class="fas fa-ellipsis-h fs-10"></span></button>
<div class="dropdown-menu dropdown-menu-end py-2">
<a href="{% url 'purchase_order_detail' request.dealer.slug po.pk %}" class="dropdown-item text-success-dark">{% trans 'Detail' %}</a>
<a href="{% url 'view_items_inventory' dealer_slug=request.dealer.slug entity_slug=entity_slug po_pk=po.pk %}" class="dropdown-item text-success-dark">{% trans 'View Inventory Items' %}</a>
{% if po.po_status == 'fulfilled' %}
<a href="{% url 'view_items_inventory' dealer_slug=request.dealer.slug entity_slug=entity_slug po_pk=po.pk %}" class="dropdown-item text-success-dark">{% trans 'View Inventory Items' %}</a>
{% else %}
<button class="dropdown-item text-warning-dark" disabled><span class="fas fa-exclamation-triangle me-1"></span> Fulfill the PO Before Viewing Inventory</button>
{% endif %}
</div>
</div>
</td>

View File

@ -33,16 +33,16 @@
</tr>
</thead>
<tbody>
{% for item in items %}
{% for i in items %}
<tr>
<th scope="row">{{ item.item_model }}</th>
<th scope="row">{{ item.po_quantity }}</th>
<th scope="row">{{ item.po_unit_cost }}</th>
<th scope="row">{{ i.item.item_model }}</th>
<th scope="row">{{ i.item.po_quantity }}</th>
<th scope="row">{{ i.item.po_unit_cost }}</th>
<th scope="row">
{% if item.item_model.additional_info.uploaded %}
{% if i.status == "uploaded" %}
<i data-feather="check-circle" class="text-success"></i>
{% else %}
<a href="{% url 'upload_cars' request.dealer.slug item.pk %}" class="btn btn-sm btn-phoenix-primary">
<a href="{% url 'upload_cars' request.dealer.slug i.item.pk %}" class="btn btn-sm btn-phoenix-primary">
<i data-feather="upload" class="me-2"></i>Upload Data
</a>
{% endif %}
@ -52,15 +52,5 @@
</tbody>
</table>
</div>
{% if page_obj.paginator.num_pages > 1 %}
<div class="d-flex justify-content-end mt-3">
<div class="d-flex">
{% include 'partials/pagination.html'%}
</div>
</div>
{% endif %}
<div>
{% endblock content %}