revert back to product instead of invetory in itemmodel
This commit is contained in:
parent
c0718cbf20
commit
f5c15feca1
18
inventory/migrations/0012_carfinance_is_sold.py
Normal file
18
inventory/migrations/0012_carfinance_is_sold.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 5.1.7 on 2025-05-25 14:19
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('inventory', '0011_alter_car_item_model'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='carfinance',
|
||||||
|
name='is_sold',
|
||||||
|
field=models.BooleanField(default=False),
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -612,6 +612,13 @@ class Car(Base):
|
|||||||
specs = CarSpecificationValue.objects.filter(id_car_trim=self.id_car_trim)
|
specs = CarSpecificationValue.objects.filter(id_car_trim=self.id_car_trim)
|
||||||
return specs
|
return specs
|
||||||
|
|
||||||
|
def get_inventory_account(self):
|
||||||
|
return self.dealer.entity.get_all_accounts().filter(name=f"Inventory:{self.id_car_make.name}").first()
|
||||||
|
def get_revenue_account(self):
|
||||||
|
return self.dealer.entity.get_all_accounts().filter(name=f"Revenue:{self.id_car_make.name}").first()
|
||||||
|
def get_cogs_account(self):
|
||||||
|
return self.dealer.entity.get_all_accounts().filter(name=f"Cogs:{self.id_car_make.name}").first()
|
||||||
|
|
||||||
class CarTransfer(models.Model):
|
class CarTransfer(models.Model):
|
||||||
car = models.ForeignKey(
|
car = models.ForeignKey(
|
||||||
"Car",
|
"Car",
|
||||||
@ -709,6 +716,8 @@ class CarFinance(models.Model):
|
|||||||
verbose_name=_("Discount Amount"),
|
verbose_name=_("Discount Amount"),
|
||||||
default=Decimal("0.00"),
|
default=Decimal("0.00"),
|
||||||
)
|
)
|
||||||
|
is_sold = models.BooleanField(default=False)
|
||||||
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def total(self):
|
def total(self):
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
from inventory.tasks import create_coa_accounts
|
from decimal import Decimal
|
||||||
|
from inventory.tasks import create_coa_accounts, create_make_accounts
|
||||||
from django.contrib.auth.models import Group
|
from django.contrib.auth.models import Group
|
||||||
from django.db.models.signals import post_save, post_delete
|
from django.db.models.signals import post_save, post_delete
|
||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
@ -10,7 +11,8 @@ from django_ledger.models import (
|
|||||||
ItemModel,
|
ItemModel,
|
||||||
JournalEntryModel,
|
JournalEntryModel,
|
||||||
TransactionModel,
|
TransactionModel,
|
||||||
LedgerModel
|
LedgerModel,
|
||||||
|
AccountModel
|
||||||
)
|
)
|
||||||
from . import models
|
from . import models
|
||||||
from django.utils.timezone import now
|
from django.utils.timezone import now
|
||||||
@ -208,16 +210,21 @@ def create_item_model(sender, instance, created, **kwargs):
|
|||||||
uom = entity.get_uom_all().get(name="Unit")
|
uom = entity.get_uom_all().get(name="Unit")
|
||||||
|
|
||||||
if not instance.item_model:
|
if not instance.item_model:
|
||||||
product = entity.create_item_product(
|
inventory = entity.create_item_product(
|
||||||
name=instance.vin,
|
name=instance.vin,
|
||||||
item_type=ItemModel.ITEM_TYPE_MATERIAL,
|
item_type=ItemModel.ITEM_TYPE_MATERIAL,
|
||||||
uom_model=uom,
|
uom_model=uom,
|
||||||
coa_model=coa,
|
coa_model=coa,
|
||||||
)
|
)
|
||||||
instance.item_model = product
|
# inventory = entity.create_item_inventory(
|
||||||
product.additional_info = {}
|
# name=instance.vin,
|
||||||
product.additional_info.update({'car_info': instance.to_dict()})
|
# uom_model=uom,
|
||||||
product.save()
|
# item_type=ItemModel.ITEM_TYPE_LUMP_SUM
|
||||||
|
# )
|
||||||
|
instance.item_model = inventory
|
||||||
|
inventory.additional_info = {}
|
||||||
|
inventory.additional_info.update({'car_info': instance.to_dict()})
|
||||||
|
inventory.save()
|
||||||
else:
|
else:
|
||||||
instance.item_model.additional_info.update({'car_info': instance.to_dict()})
|
instance.item_model.additional_info.update({'car_info': instance.to_dict()})
|
||||||
instance.item_model.save()
|
instance.item_model.save()
|
||||||
@ -237,7 +244,42 @@ def update_item_model_cost(sender, instance, created, **kwargs):
|
|||||||
:param kwargs: Additional keyword arguments passed during the signal invocation.
|
:param kwargs: Additional keyword arguments passed during the signal invocation.
|
||||||
:return: None
|
:return: None
|
||||||
"""
|
"""
|
||||||
|
if created and not instance.is_sold:
|
||||||
|
entity = instance.car.dealer.entity
|
||||||
|
coa = entity.get_default_coa()
|
||||||
|
inventory_account = entity.get_all_accounts().filter(name=f'Inventory:{instance.car.id_car_make.name}').first()
|
||||||
|
if not inventory_account:
|
||||||
|
inventory_account = create_make_accounts(entity,coa,[instance.car.id_car_make],"Inventory",roles.ASSET_CA_INVENTORY,"debit")
|
||||||
|
|
||||||
|
cogs = entity.get_all_accounts().filter(name=f'Cogs:{instance.car.id_car_make.name}').first()
|
||||||
|
if not cogs:
|
||||||
|
cogs = create_make_accounts(entity,coa,[instance.car.id_car_make],"Cogs",roles.COGS,"debit")
|
||||||
|
revenue = entity.get_all_accounts().filter(name=f'Revenue:{instance.car.id_car_make.name}').first()
|
||||||
|
if not revenue:
|
||||||
|
revenue = create_make_accounts(entity,coa,[instance.car.id_car_make],"Revenue",roles.ASSET_CA_RECEIVABLES,"credit")
|
||||||
|
|
||||||
|
cash_account = entity.get_all_accounts().filter(name="Cash",role=roles.ASSET_CA_CASH).first()
|
||||||
|
|
||||||
|
ledger = LedgerModel.objects.create(entity=entity, name=f"Inventory Purchase - {instance.car}")
|
||||||
|
je = JournalEntryModel.objects.create(
|
||||||
|
ledger=ledger,
|
||||||
|
description=f"Acquired {instance.car} for inventory",
|
||||||
|
)
|
||||||
|
TransactionModel.objects.create(
|
||||||
|
journal_entry=je,
|
||||||
|
account=inventory_account,
|
||||||
|
amount=Decimal(instance.cost_price),
|
||||||
|
tx_type="debit",
|
||||||
|
description="",
|
||||||
|
)
|
||||||
|
|
||||||
|
TransactionModel.objects.create(
|
||||||
|
journal_entry=je,
|
||||||
|
account=cash_account,
|
||||||
|
amount=Decimal(instance.cost_price),
|
||||||
|
tx_type="credit",
|
||||||
|
description="",
|
||||||
|
)
|
||||||
|
|
||||||
instance.car.item_model.default_amount = instance.selling_price
|
instance.car.item_model.default_amount = instance.selling_price
|
||||||
if not isinstance(instance.car.item_model.additional_info, dict):
|
if not isinstance(instance.car.item_model.additional_info, dict):
|
||||||
@ -695,7 +737,6 @@ def save_journal(car_finance,ledger,vendor):
|
|||||||
account=vendor_account,
|
account=vendor_account,
|
||||||
amount=car_finance.cost_price,
|
amount=car_finance.cost_price,
|
||||||
tx_type='credit',
|
tx_type='credit',
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@receiver(post_save, sender=models.CarFinance)
|
@receiver(post_save, sender=models.CarFinance)
|
||||||
|
|||||||
@ -560,28 +560,37 @@ def create_accounts_for_make(dealer,makes):
|
|||||||
entity = dealer.entity
|
entity = dealer.entity
|
||||||
coa = entity.get_default_coa()
|
coa = entity.get_default_coa()
|
||||||
|
|
||||||
|
name = ["Inventory", "Revenue", "Cogs"]
|
||||||
|
role = [roles.ASSET_CA_INVENTORY,roles.ASSET_CA_RECEIVABLES, roles.COGS]
|
||||||
|
balance_type = ["debit","credit","debit"]
|
||||||
|
|
||||||
|
for name,role,balance_type in zip(name,role,balance_type):
|
||||||
|
create_make_accounts(entity,coa,makes,name,role,balance_type)
|
||||||
|
|
||||||
|
def create_make_accounts(entity,coa,makes,name,role,balance_type):
|
||||||
for make in makes:
|
for make in makes:
|
||||||
last_account = entity.get_all_accounts().filter(role=roles.ASSET_CA_RECEIVABLES).order_by('-created').first()
|
last_account = entity.get_all_accounts().filter(role=role).order_by('-created').first()
|
||||||
if len(last_account.code) == 4:
|
if len(last_account.code) == 4:
|
||||||
code = f"{int(last_account.code)}{1:03d}"
|
code = f"{int(last_account.code)}{1:03d}"
|
||||||
elif len(last_account.code) > 4:
|
elif len(last_account.code) > 4:
|
||||||
code = f"{int(last_account.code)+1}"
|
code = f"{int(last_account.code)+1}"
|
||||||
|
acc = entity.get_all_accounts().filter(
|
||||||
if not entity.get_all_accounts().filter(
|
name=f"{name}:{make.name}",
|
||||||
name=make.name,
|
role=role,
|
||||||
role=roles.ASSET_CA_RECEIVABLES,
|
|
||||||
coa_model=coa,
|
coa_model=coa,
|
||||||
balance_type="credit",
|
balance_type=balance_type,
|
||||||
active=True
|
active=True
|
||||||
).exists():
|
).first()
|
||||||
entity.create_account(
|
if not acc:
|
||||||
name=make.name,
|
acc = entity.create_account(
|
||||||
|
name=f"{name}:{make.name}",
|
||||||
code=code,
|
code=code,
|
||||||
role=roles.ASSET_CA_RECEIVABLES,
|
role=role,
|
||||||
coa_model=coa,
|
coa_model=coa,
|
||||||
balance_type="credit",
|
balance_type=balance_type,
|
||||||
active=True
|
active=True
|
||||||
)
|
)
|
||||||
|
return acc
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1146,44 +1146,49 @@ def handle_account_process(invoice,amount,finance_data):
|
|||||||
entity = invoice.ledger.entity
|
entity = invoice.ledger.entity
|
||||||
coa = entity.get_default_coa()
|
coa = entity.get_default_coa()
|
||||||
|
|
||||||
make_account = entity.get_all_accounts().filter(name=car.id_car_make.name,role=roles.COGS).first()
|
cash_account = entity.get_all_accounts().filter(name="Cash", role=roles.ASSET_CA_CASH).first()
|
||||||
if not make_account:
|
inventory_account = car.get_inventory_account()
|
||||||
last_account = entity.get_all_accounts().filter(role=roles.COGS).order_by('-created').first()
|
revenue_account = car.get_revenue_account()
|
||||||
if len(last_account.code) == 4:
|
cogs_account = car.get_cogs_account()
|
||||||
code = f"{int(last_account.code)}{1:03d}"
|
|
||||||
elif len(last_account.code) > 4:
|
|
||||||
code = f"{int(last_account.code)+1}"
|
|
||||||
|
|
||||||
make_account = entity.create_account(
|
# make_account = entity.get_all_accounts().filter(name=car.id_car_make.name,role=roles.COGS).first()
|
||||||
name=car.id_car_make.name,
|
# if not make_account:
|
||||||
code=code,
|
# last_account = entity.get_all_accounts().filter(role=roles.COGS).order_by('-created').first()
|
||||||
role=roles.COGS,
|
# if len(last_account.code) == 4:
|
||||||
coa_model=coa,
|
# code = f"{int(last_account.code)}{1:03d}"
|
||||||
balance_type="debit",
|
# elif len(last_account.code) > 4:
|
||||||
active=True
|
# code = f"{int(last_account.code)+1}"
|
||||||
)
|
|
||||||
|
|
||||||
# get or create additional services account
|
# make_account = entity.create_account(
|
||||||
additional_services_account = entity.get_default_coa_accounts().filter(name="Additional Services",role=roles.COGS).first()
|
# name=car.id_car_make.name,
|
||||||
if not additional_services_account:
|
# code=code,
|
||||||
last_account = entity.get_all_accounts().filter(role=roles.COGS).order_by('-created').first()
|
# role=roles.COGS,
|
||||||
if len(last_account.code) == 4:
|
# coa_model=coa,
|
||||||
code = f"{int(last_account.code)}{1:03d}"
|
# balance_type="debit",
|
||||||
elif len(last_account.code) > 4:
|
# active=True
|
||||||
code = f"{int(last_account.code)+1}"
|
# )
|
||||||
|
|
||||||
additional_services_account = entity.create_account(
|
# # get or create additional services account
|
||||||
name="Additional Services",
|
# additional_services_account = entity.get_default_coa_accounts().filter(name="Additional Services",role=roles.COGS).first()
|
||||||
code=code,
|
# if not additional_services_account:
|
||||||
role=roles.COGS,
|
# last_account = entity.get_all_accounts().filter(role=roles.COGS).order_by('-created').first()
|
||||||
coa_model=coa,
|
# if len(last_account.code) == 4:
|
||||||
balance_type="debit",
|
# code = f"{int(last_account.code)}{1:03d}"
|
||||||
active=True
|
# elif len(last_account.code) > 4:
|
||||||
)
|
# code = f"{int(last_account.code)+1}"
|
||||||
|
|
||||||
inventory_account = entity.get_default_coa_accounts().filter(role=roles.ASSET_CA_INVENTORY).first()
|
# additional_services_account = entity.create_account(
|
||||||
|
# name="Additional Services",
|
||||||
|
# code=code,
|
||||||
|
# role=roles.COGS,
|
||||||
|
# coa_model=coa,
|
||||||
|
# balance_type="debit",
|
||||||
|
# active=True
|
||||||
|
# )
|
||||||
|
|
||||||
vat_payable_account = entity.get_default_coa_accounts().get(name="VAT Payable", active=True)
|
# inventory_account = entity.get_default_coa_accounts().filter(role=roles.ASSET_CA_INVENTORY).first()
|
||||||
|
|
||||||
|
# vat_payable_account = entity.get_default_coa_accounts().get(name="VAT Payable", active=True)
|
||||||
|
|
||||||
|
|
||||||
journal = JournalEntryModel.objects.create(
|
journal = JournalEntryModel.objects.create(
|
||||||
@ -1191,16 +1196,53 @@ def handle_account_process(invoice,amount,finance_data):
|
|||||||
description=f"Payment for Invoice {invoice.invoice_number}",
|
description=f"Payment for Invoice {invoice.invoice_number}",
|
||||||
ledger=invoice.ledger,
|
ledger=invoice.ledger,
|
||||||
locked=False,
|
locked=False,
|
||||||
origin="Payment",
|
origin=f"Sale of {car.name}{car.vin}: Invoice {invoice.invoice_number}",
|
||||||
)
|
)
|
||||||
|
|
||||||
TransactionModel.objects.create(
|
TransactionModel.objects.create(
|
||||||
journal_entry=journal,
|
journal_entry=journal,
|
||||||
account=make_account, # Debit car make Account
|
account=cash_account,
|
||||||
amount=Decimal(finance_data.get("grand_total")),
|
amount=Decimal(finance_data.get("grand_total")),
|
||||||
tx_type="debit",
|
tx_type="debit",
|
||||||
description="Payment Received",
|
description="",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
TransactionModel.objects.create(
|
||||||
|
journal_entry=journal,
|
||||||
|
account=revenue_account,
|
||||||
|
amount=Decimal(finance_data.get("grand_total")),
|
||||||
|
tx_type="credit",
|
||||||
|
description="",
|
||||||
|
)
|
||||||
|
|
||||||
|
journal_cogs = JournalEntryModel.objects.create(
|
||||||
|
posted=False,
|
||||||
|
description=f"COGS of {car.name}{car.vin}: Invoice {invoice.invoice_number}",
|
||||||
|
ledger=invoice.ledger,
|
||||||
|
locked=False,
|
||||||
|
origin="Payment",
|
||||||
|
)
|
||||||
|
TransactionModel.objects.create(
|
||||||
|
journal_entry=journal_cogs,
|
||||||
|
account=cogs_account,
|
||||||
|
amount=Decimal(car.finances.cost_price),
|
||||||
|
tx_type="debit",
|
||||||
|
description="",
|
||||||
|
)
|
||||||
|
|
||||||
|
TransactionModel.objects.create(
|
||||||
|
journal_entry=journal_cogs,
|
||||||
|
account=inventory_account,
|
||||||
|
amount=Decimal(car.finances.cost_price),
|
||||||
|
tx_type="credit",
|
||||||
|
description="",
|
||||||
|
)
|
||||||
|
|
||||||
|
car.item_model.for_inventory = False
|
||||||
|
car.finances.is_sold = True
|
||||||
|
car.finances.save()
|
||||||
|
car.item_model.save()
|
||||||
|
|
||||||
# TransactionModel.objects.create(
|
# TransactionModel.objects.create(
|
||||||
# journal_entry=journal,
|
# journal_entry=journal,
|
||||||
# account=additional_services_account, # Debit Additional Services
|
# account=additional_services_account, # Debit Additional Services
|
||||||
@ -1209,13 +1251,13 @@ def handle_account_process(invoice,amount,finance_data):
|
|||||||
# description="Additional Services",
|
# description="Additional Services",
|
||||||
# )
|
# )
|
||||||
|
|
||||||
TransactionModel.objects.create(
|
# TransactionModel.objects.create(
|
||||||
journal_entry=journal,
|
# journal_entry=journal,
|
||||||
account=inventory_account, # Credit Inventory account
|
# account=inventory_account, # Credit Inventory account
|
||||||
amount=Decimal(finance_data.get("grand_total")),
|
# amount=Decimal(finance_data.get("grand_total")),
|
||||||
tx_type="credit",
|
# tx_type="credit",
|
||||||
description="Account Adjustment",
|
# description="Account Adjustment",
|
||||||
)
|
# )
|
||||||
|
|
||||||
# TransactionModel.objects.create(
|
# TransactionModel.objects.create(
|
||||||
# journal_entry=journal,
|
# journal_entry=journal,
|
||||||
|
|||||||
@ -3587,7 +3587,7 @@ def create_estimate(request, pk=None):
|
|||||||
customer_id = data.get("customer")
|
customer_id = data.get("customer")
|
||||||
# terms = data.get("terms")
|
# terms = data.get("terms")
|
||||||
# customer = entity.get_customers().filter(pk=customer_id).first()
|
# customer = entity.get_customers().filter(pk=customer_id).first()
|
||||||
customer = models.Customer.objects.filter(pk=customer_id).first()
|
customer = models.Customer.objects.filter(pk=int(customer_id)).first()
|
||||||
|
|
||||||
items = data.get("item", [])
|
items = data.get("item", [])
|
||||||
quantities = data.get("quantity", [])
|
quantities = data.get("quantity", [])
|
||||||
@ -3662,27 +3662,39 @@ def create_estimate(request, pk=None):
|
|||||||
]
|
]
|
||||||
items_txs = []
|
items_txs = []
|
||||||
for item in items_list:
|
for item in items_list:
|
||||||
car_instance = ItemModel.objects.filter(
|
# car_instance = ItemModel.objects.filter(
|
||||||
additional_info__car_info__hash=item.get("item_id")
|
# additional_info__car_info__hash=item.get("item_id")
|
||||||
).all()
|
# ).all()
|
||||||
|
# for i in car_instance[: int(quantities[0])]:
|
||||||
|
# items_txs.append(
|
||||||
|
# {
|
||||||
|
# "item_number": i.item_number,
|
||||||
|
# "quantity": 1,
|
||||||
|
# "unit_cost": i.additional_info.get("car_finance").get(
|
||||||
|
# "selling_price"
|
||||||
|
# ),
|
||||||
|
# "unit_revenue": i.additional_info.get("car_finance").get(
|
||||||
|
# "selling_price"
|
||||||
|
# ),
|
||||||
|
# "total_amount": (
|
||||||
|
# i.additional_info.get("car_finance").get("total_vat")
|
||||||
|
# ),
|
||||||
|
# }
|
||||||
|
# )
|
||||||
|
car_instance = models.Car.objects.filter(hash=item.get("item_id"),finances__is_sold=False).all()
|
||||||
|
|
||||||
for i in car_instance[: int(quantities[0])]:
|
for i in car_instance[: int(quantities[0])]:
|
||||||
items_txs.append(
|
items_txs.append(
|
||||||
{
|
{
|
||||||
"item_number": i.item_number,
|
"item_number": i.item_model.item_number,
|
||||||
"quantity": 1,
|
"quantity": 1,
|
||||||
"unit_cost": i.additional_info.get("car_finance").get(
|
"unit_cost": round(float(i.finances.selling_price)),
|
||||||
"selling_price"
|
"unit_revenue": round(float(i.finances.selling_price)),
|
||||||
),
|
"total_amount": round(float(i.finances.total_vat)),
|
||||||
"unit_revenue": i.additional_info.get("car_finance").get(
|
|
||||||
"selling_price"
|
|
||||||
),
|
|
||||||
"total_amount": (
|
|
||||||
i.additional_info.get("car_finance").get("total_vat")
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
estimate_itemtxs = {
|
estimate_itemtxs = {
|
||||||
item.get("item_number"): {
|
item.get("item_number"): {
|
||||||
"unit_cost": item.get("unit_cost"),
|
"unit_cost": item.get("unit_cost"),
|
||||||
@ -3704,12 +3716,20 @@ def create_estimate(request, pk=None):
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
estimate.migrate_itemtxs(
|
try:
|
||||||
itemtxs=estimate_itemtxs,
|
estimate.migrate_itemtxs(
|
||||||
commit=True,
|
itemtxs=estimate_itemtxs,
|
||||||
operation=EstimateModel.ITEMIZE_APPEND,
|
commit=True,
|
||||||
)
|
operation=EstimateModel.ITEMIZE_APPEND,
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
estimate.delete()
|
||||||
|
return JsonResponse(
|
||||||
|
{
|
||||||
|
"status": "error",
|
||||||
|
"message": e,
|
||||||
|
}
|
||||||
|
)
|
||||||
if isinstance(items, list):
|
if isinstance(items, list):
|
||||||
for item in estimate_itemtxs.keys():
|
for item in estimate_itemtxs.keys():
|
||||||
item_instance = ItemModel.objects.filter(item_number=item).first()
|
item_instance = ItemModel.objects.filter(item_number=item).first()
|
||||||
|
|||||||
@ -20,7 +20,7 @@
|
|||||||
<div class="alert alert-outline-warning d-flex align-items-center"
|
<div class="alert alert-outline-warning d-flex align-items-center"
|
||||||
role="alert">
|
role="alert">
|
||||||
<i class="fa-solid fa-circle-info fs-6"></i>
|
<i class="fa-solid fa-circle-info fs-6"></i>
|
||||||
<p class="mb-0 flex-1">{{ _("Please Add A Vendor, Before Adding A Car .") }}</p>
|
<p class="mb-0 flex-1">{{ _("Please Add A Vendor, Before Adding A Car .") }} <a href="{% url 'vendor_create' %}" class="ms-3 text-body-primary fs-9" >{{ _("Add Vendor") }}</a> </p>
|
||||||
<button class="btn-close"
|
<button class="btn-close"
|
||||||
type="button"
|
type="button"
|
||||||
data-bs-dismiss="alert"
|
data-bs-dismiss="alert"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user