diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index 040e7fa..a5eaed3 100644 Binary files a/core/__pycache__/models.cpython-311.pyc and b/core/__pycache__/models.cpython-311.pyc differ diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 21ff9b5..87e4473 100644 Binary files a/core/__pycache__/urls.cpython-311.pyc and b/core/__pycache__/urls.cpython-311.pyc differ diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 1ac853d..d38b33f 100644 Binary files a/core/__pycache__/views.cpython-311.pyc and b/core/__pycache__/views.cpython-311.pyc differ diff --git a/core/migrations/0008_quotation_sale_quotation_quotationitem.py b/core/migrations/0008_quotation_sale_quotation_quotationitem.py new file mode 100644 index 0000000..330807a --- /dev/null +++ b/core/migrations/0008_quotation_sale_quotation_quotationitem.py @@ -0,0 +1,45 @@ +# Generated by Django 5.2.7 on 2026-02-02 09:49 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0007_sale_balance_due_sale_due_date_sale_invoice_number_and_more'), + ] + + operations = [ + migrations.CreateModel( + name='Quotation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('quotation_number', models.CharField(blank=True, max_length=50, verbose_name='Quotation Number')), + ('total_amount', models.DecimalField(decimal_places=3, max_digits=15, verbose_name='Total Amount')), + ('discount', models.DecimalField(decimal_places=3, default=0, max_digits=15, verbose_name='Discount')), + ('status', models.CharField(choices=[('draft', 'Draft'), ('sent', 'Sent'), ('accepted', 'Accepted'), ('rejected', 'Rejected'), ('converted', 'Converted to Invoice')], default='draft', max_length=20, verbose_name='Status')), + ('valid_until', models.DateField(blank=True, null=True, verbose_name='Valid Until')), + ('terms_and_conditions', models.TextField(blank=True, verbose_name='Terms and Conditions')), + ('notes', models.TextField(blank=True, verbose_name='Notes')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='quotations', to='core.customer')), + ], + ), + migrations.AddField( + model_name='sale', + name='quotation', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='converted_sale', to='core.quotation'), + ), + migrations.CreateModel( + name='QuotationItem', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('quantity', models.PositiveIntegerField(verbose_name='Quantity')), + ('unit_price', models.DecimalField(decimal_places=3, max_digits=12, verbose_name='Unit Price')), + ('line_total', models.DecimalField(decimal_places=3, max_digits=15, verbose_name='Line Total')), + ('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.product')), + ('quotation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='core.quotation')), + ], + ), + ] diff --git a/core/migrations/0009_purchasereturn_purchasereturnitem_salereturn_and_more.py b/core/migrations/0009_purchasereturn_purchasereturnitem_salereturn_and_more.py new file mode 100644 index 0000000..e215b8a --- /dev/null +++ b/core/migrations/0009_purchasereturn_purchasereturnitem_salereturn_and_more.py @@ -0,0 +1,60 @@ +# Generated by Django 5.2.7 on 2026-02-02 10:00 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0008_quotation_sale_quotation_quotationitem'), + ] + + operations = [ + migrations.CreateModel( + name='PurchaseReturn', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('return_number', models.CharField(blank=True, max_length=50, verbose_name='Return Number')), + ('total_amount', models.DecimalField(decimal_places=3, max_digits=15, verbose_name='Total Amount')), + ('notes', models.TextField(blank=True, verbose_name='Notes')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('purchase', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='returns', to='core.purchase')), + ('supplier', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='purchase_returns', to='core.supplier')), + ], + ), + migrations.CreateModel( + name='PurchaseReturnItem', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('quantity', models.PositiveIntegerField(verbose_name='Quantity')), + ('cost_price', models.DecimalField(decimal_places=3, max_digits=12, verbose_name='Cost Price')), + ('line_total', models.DecimalField(decimal_places=3, max_digits=15, verbose_name='Line Total')), + ('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.product')), + ('purchase_return', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='core.purchasereturn')), + ], + ), + migrations.CreateModel( + name='SaleReturn', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('return_number', models.CharField(blank=True, max_length=50, verbose_name='Return Number')), + ('total_amount', models.DecimalField(decimal_places=3, max_digits=15, verbose_name='Total Amount')), + ('notes', models.TextField(blank=True, verbose_name='Notes')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sale_returns', to='core.customer')), + ('sale', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='returns', to='core.sale')), + ], + ), + migrations.CreateModel( + name='SaleReturnItem', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('quantity', models.PositiveIntegerField(verbose_name='Quantity')), + ('unit_price', models.DecimalField(decimal_places=3, max_digits=12, verbose_name='Unit Price')), + ('line_total', models.DecimalField(decimal_places=3, max_digits=15, verbose_name='Line Total')), + ('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.product')), + ('sale_return', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='core.salereturn')), + ], + ), + ] diff --git a/core/migrations/__pycache__/0008_quotation_sale_quotation_quotationitem.cpython-311.pyc b/core/migrations/__pycache__/0008_quotation_sale_quotation_quotationitem.cpython-311.pyc new file mode 100644 index 0000000..b628003 Binary files /dev/null and b/core/migrations/__pycache__/0008_quotation_sale_quotation_quotationitem.cpython-311.pyc differ diff --git a/core/migrations/__pycache__/0009_purchasereturn_purchasereturnitem_salereturn_and_more.cpython-311.pyc b/core/migrations/__pycache__/0009_purchasereturn_purchasereturnitem_salereturn_and_more.cpython-311.pyc new file mode 100644 index 0000000..40e202f Binary files /dev/null and b/core/migrations/__pycache__/0009_purchasereturn_purchasereturnitem_salereturn_and_more.cpython-311.pyc differ diff --git a/core/models.py b/core/models.py index 4569aea..2c98bf5 100644 --- a/core/models.py +++ b/core/models.py @@ -71,6 +71,7 @@ class Sale(models.Model): ] customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, null=True, blank=True, related_name="sales") + quotation = models.ForeignKey('Quotation', on_delete=models.SET_NULL, null=True, blank=True, related_name="converted_sale") invoice_number = models.CharField(_("Invoice Number"), max_length=50, blank=True) total_amount = models.DecimalField(_("Total Amount"), max_digits=15, decimal_places=3) paid_amount = models.DecimalField(_("Paid Amount"), max_digits=15, decimal_places=3, default=0) @@ -117,6 +118,38 @@ class SalePayment(models.Model): def __str__(self): return f"Payment of {self.amount} for Sale #{self.sale.id}" +class Quotation(models.Model): + STATUS_CHOICES = [ + ('draft', _('Draft')), + ('sent', _('Sent')), + ('accepted', _('Accepted')), + ('rejected', _('Rejected')), + ('converted', _('Converted to Invoice')), + ] + + customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, null=True, blank=True, related_name="quotations") + quotation_number = models.CharField(_("Quotation Number"), max_length=50, blank=True) + total_amount = models.DecimalField(_("Total Amount"), max_digits=15, decimal_places=3) + discount = models.DecimalField(_("Discount"), max_digits=15, decimal_places=3, default=0) + status = models.CharField(_("Status"), max_length=20, choices=STATUS_CHOICES, default='draft') + valid_until = models.DateField(_("Valid Until"), null=True, blank=True) + terms_and_conditions = models.TextField(_("Terms and Conditions"), blank=True) + notes = models.TextField(_("Notes"), blank=True) + created_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return f"Quotation #{self.id} - {self.customer.name if self.customer else 'Guest'}" + +class QuotationItem(models.Model): + quotation = models.ForeignKey(Quotation, on_delete=models.CASCADE, related_name="items") + product = models.ForeignKey(Product, on_delete=models.CASCADE) + quantity = models.PositiveIntegerField(_("Quantity")) + unit_price = models.DecimalField(_("Unit Price"), max_digits=12, decimal_places=3) + line_total = models.DecimalField(_("Line Total"), max_digits=15, decimal_places=3) + + def __str__(self): + return f"{self.product.name_en} x {self.quantity}" + class Purchase(models.Model): PAYMENT_TYPE_CHOICES = [ ('cash', _('Cash')), @@ -175,6 +208,48 @@ class PurchasePayment(models.Model): def __str__(self): return f"Payment of {self.amount} for Purchase #{self.purchase.id}" +class SaleReturn(models.Model): + sale = models.ForeignKey(Sale, on_delete=models.SET_NULL, null=True, blank=True, related_name="returns") + customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, null=True, blank=True, related_name="sale_returns") + return_number = models.CharField(_("Return Number"), max_length=50, blank=True) + total_amount = models.DecimalField(_("Total Amount"), max_digits=15, decimal_places=3) + notes = models.TextField(_("Notes"), blank=True) + created_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return f"Sale Return #{self.id} - {self.customer.name if self.customer else 'Guest'}" + +class SaleReturnItem(models.Model): + sale_return = models.ForeignKey(SaleReturn, on_delete=models.CASCADE, related_name="items") + product = models.ForeignKey(Product, on_delete=models.CASCADE) + quantity = models.PositiveIntegerField(_("Quantity")) + unit_price = models.DecimalField(_("Unit Price"), max_digits=12, decimal_places=3) + line_total = models.DecimalField(_("Line Total"), max_digits=15, decimal_places=3) + + def __str__(self): + return f"{self.product.name_en} x {self.quantity}" + +class PurchaseReturn(models.Model): + purchase = models.ForeignKey(Purchase, on_delete=models.SET_NULL, null=True, blank=True, related_name="returns") + supplier = models.ForeignKey(Supplier, on_delete=models.SET_NULL, null=True, blank=True, related_name="purchase_returns") + return_number = models.CharField(_("Return Number"), max_length=50, blank=True) + total_amount = models.DecimalField(_("Total Amount"), max_digits=15, decimal_places=3) + notes = models.TextField(_("Notes"), blank=True) + created_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return f"Purchase Return #{self.id} - {self.supplier.name if self.supplier else 'N/A'}" + +class PurchaseReturnItem(models.Model): + purchase_return = models.ForeignKey(PurchaseReturn, on_delete=models.CASCADE, related_name="items") + product = models.ForeignKey(Product, on_delete=models.CASCADE) + quantity = models.PositiveIntegerField(_("Quantity")) + cost_price = models.DecimalField(_("Cost Price"), max_digits=12, decimal_places=3) + line_total = models.DecimalField(_("Line Total"), max_digits=15, decimal_places=3) + + def __str__(self): + return f"{self.product.name_en} x {self.quantity}" + class SystemSetting(models.Model): business_name = models.CharField(_("Business Name"), max_length=200, default="Meezan Accounting") address = models.TextField(_("Address"), blank=True) @@ -187,4 +262,4 @@ class SystemSetting(models.Model): registration_number = models.CharField(_("Registration Number"), max_length=50, blank=True) def __str__(self): - return self.business_name + return self.business_name \ No newline at end of file diff --git a/core/templates/base.html b/core/templates/base.html index 0602d98..9b79024 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -47,19 +47,31 @@ {% trans "Dashboard" %} + +
| Product | +SKU | +Action | +
|---|---|---|
|
+ {{ product.name_en }}
+ {{ product.name_ar }}
+ |
+ {{ product.sku }} |
+ + + | +
| Product | +Qty of Labels | ++ |
|---|
{{ settings.phone }}
{{ settings.email }}
{% if settings.vat_number %} -{% trans "VAT" %}: {{ settings.vat_number }}
+{% trans "VAT" %} / الضريبة: {{ settings.vat_number }}
{% endif %}| {% trans "Item Description" %} | -{% trans "Unit Price" %} | -{% trans "Quantity" %} | -{% trans "Total" %} | +
+ {% trans "Item Description" %}
+ وصف العنصر
+ |
+
+ {% trans "Unit Price" %}
+ سعر الوحدة
+ |
+
+ {% trans "Quantity" %}
+ الكمية
+ |
+
+ {% trans "Total" %}
+ المجموع
+ |
|---|---|---|---|---|---|---|---|
| - | {% trans "Subtotal" %} | +
+ {% trans "Subtotal" %}
+ المجموع الفرعي
+ |
{{ settings.currency_symbol }}{{ sale.total_amount|add:sale.discount|floatformat:3 }} | ||||
| - | {% trans "Discount" %} | +
+ {% trans "Discount" %}
+ الخصم
+ |
-{{ settings.currency_symbol }}{{ sale.discount|floatformat:3 }} | ||||
| - | {% trans "Grand Total" %} | +
+ {% trans "Grand Total" %}
+ المجموع الكلي
+ |
{{ settings.currency_symbol }}{{ sale.total_amount|floatformat:3 }} | ||||
| - | {% trans "Total Paid" %} | +
+ {% trans "Total Paid" %}
+ إجمالي المدفوع
+ |
{{ settings.currency_symbol }}{{ sale.paid_amount|floatformat:3 }} | ||||
| - | {% trans "Balance Due" %} | +
+ {% trans "Balance Due" %}
+ الرصيد المستحق
+ |
{{ settings.currency_symbol }}{{ sale.balance_due|floatformat:3 }} | ||||
| {% trans "Date" %} | -{% trans "Method" %} | -{% trans "Amount" %} | -{% trans "Notes" %} | +{% trans "Date" %} / التاريخ | +{% trans "Method" %} / الطريقة | +{% trans "Amount" %} / المبلغ | +{% trans "Notes" %} / ملاحظات |
|---|---|---|---|---|---|---|---|
| {% trans "Item Description" %} | -{% trans "Cost Price" %} | -{% trans "Quantity" %} | -{% trans "Total" %} | +
+ {% trans "Item Description" %}
+ وصف العنصر
+ |
+
+ {% trans "Cost Price" %}
+ سعر التكلفة
+ |
+
+ {% trans "Quantity" %}
+ الكمية
+ |
+
+ {% trans "Total" %}
+ المجموع
+ |
|---|---|---|---|---|---|---|---|
| - | {% trans "Grand Total" %} | +
+ {% trans "Grand Total" %}
+ المجموع الكلي
+ |
{{ settings.currency_symbol }}{{ purchase.total_amount|floatformat:3 }} | ||||
| - | {% trans "Total Paid" %} | +
+ {% trans "Total Paid" %}
+ إجمالي المدفوع
+ |
{{ settings.currency_symbol }}{{ purchase.paid_amount|floatformat:3 }} | ||||
| - | {% trans "Balance Due" %} | +
+ {% trans "Balance Due" %}
+ الرصيد المستحق
+ |
{{ settings.currency_symbol }}{{ purchase.balance_due|floatformat:3 }} | ||||
| {% trans "Date" %} | -{% trans "Method" %} | -{% trans "Amount" %} | -{% trans "Notes" %} | +{% trans "Date" %} / التاريخ | +{% trans "Method" %} / الطريقة | +{% trans "Amount" %} / المبلغ | +{% trans "Notes" %} / ملاحظات |
|---|---|---|---|---|---|---|---|
| {% trans "Product" %} | +{% trans "Cost Price" %} | +{% trans "Quantity" %} | +{% trans "Total" %} | ++ |
|---|---|---|---|---|
|
+ [[ item.name_en ]]
+ [[ item.sku ]]
+ |
+ + + | ++ + | +[[ currencySymbol ]][[ (item.price * item.quantity).toFixed(3) ]] | ++ + | +
| + {% trans "Search and add products to this return." %} + | +||||
{{ settings.address }}
+{{ settings.phone }}
+{{ settings.email }}
+|
+ {% trans "Item Description" %}
+ وصف العنصر
+ |
+
+ {% trans "Cost Price" %}
+ سعر التكلفة
+ |
+
+ {% trans "Quantity" %}
+ الكمية
+ |
+
+ {% trans "Total" %}
+ المجموع
+ |
+
|---|---|---|---|
|
+ {{ item.product.name_en }}
+ {{ item.product.name_ar }}
+ |
+ {{ settings.currency_symbol }}{{ item.cost_price|floatformat:3 }} | +{{ item.quantity }} | +{{ settings.currency_symbol }}{{ item.line_total|floatformat:3 }} | +
| + |
+ {% trans "Total Credit" %}
+ إجمالي الرصيد المسترد
+ |
+ {{ settings.currency_symbol }}{{ purchase_return.total_amount|floatformat:3 }} | +|
{{ purchase_return.notes }}
+{% trans "Purchase Return Confirmation" %} / تأكيد مرتجع مشتريات
+{% trans "Software by Meezan" %} / برمجة ميزان
+{% trans "Manage returns to suppliers" %}
+| {% trans "Return #" %} | +{% trans "Date" %} | +{% trans "Supplier" %} | +{% trans "Original Purchase" %} | +{% trans "Total Amount" %} | +{% trans "Actions" %} | +
|---|---|---|---|---|---|
| + {{ return.return_number|default:return.id }} + | +{{ return.created_at|date:"Y-m-d" }} | +{{ return.supplier.name|default:"N/A" }} | ++ {% if return.purchase %} + + #{{ return.purchase.invoice_number|default:return.purchase.id }} + + {% else %} + N/A + {% endif %} + | +{{ site_settings.currency_symbol }}{{ return.total_amount|floatformat:3 }} | +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
|
+ {% trans "No purchase returns found." %} + |
+ |||||
| {% trans "Product" %} | +{% trans "Unit Price" %} | +{% trans "Quantity" %} | +{% trans "Total" %} | ++ |
|---|---|---|---|---|
|
+ [[ item.name_en ]]
+ [[ item.sku ]]
+ |
+ + + | ++ + | +[[ currencySymbol ]][[ (item.price * item.quantity).toFixed(3) ]] | ++ + | +
| + {% trans "Search and add products to this quotation." %} + | +||||
{{ settings.address }}
+{{ settings.phone }}
+{{ settings.email }}
+ {% if settings.vat_number %} +{% trans "VAT" %} / الضريبة: {{ settings.vat_number }}
+ {% endif %} +|
+ {% trans "Item Description" %}
+ وصف العنصر
+ |
+
+ {% trans "Unit Price" %}
+ سعر الوحدة
+ |
+
+ {% trans "Quantity" %}
+ الكمية
+ |
+
+ {% trans "Total" %}
+ المجموع
+ |
+
|---|---|---|---|
|
+ {{ item.product.name_en }}
+ {{ item.product.name_ar }}
+ |
+ {{ settings.currency_symbol }}{{ item.unit_price|floatformat:3 }} | +{{ item.quantity }} | +{{ settings.currency_symbol }}{{ item.line_total|floatformat:3 }} | +
| + |
+ {% trans "Subtotal" %}
+ المجموع الفرعي
+ |
+ {{ settings.currency_symbol }}{{ quotation.total_amount|add:quotation.discount|floatformat:3 }} | +|
| + |
+ {% trans "Discount" %}
+ الخصم
+ |
+ -{{ settings.currency_symbol }}{{ quotation.discount|floatformat:3 }} | +|
| + |
+ {% trans "Grand Total" %}
+ المجموع الكلي
+ |
+ {{ settings.currency_symbol }}{{ quotation.total_amount|floatformat:3 }} | +|
{{ quotation.notes }}
+{% trans "This is a computer generated quotation." %} / هذا عرض سعر تم إنشاؤه بواسطة الكمبيوتر.
+{% trans "Software by Meezan" %} / برمجة ميزان
+{% trans "Manage and track your price proposals" %}
+| {% trans "Quotation #" %} | +{% trans "Date" %} | +{% trans "Customer" %} | +{% trans "Total" %} | +{% trans "Status" %} | +{% trans "Valid Until" %} | +{% trans "Actions" %} | +
|---|---|---|---|---|---|---|
| + {{ q.quotation_number|default:q.id }} + | +{{ q.created_at|date:"Y-m-d" }} | +{{ q.customer.name|default:_("Guest") }} | +{{ site_settings.currency_symbol }}{{ q.total_amount|floatformat:3 }} | ++ {% if q.status == 'draft' %} + {% trans "Draft" %} + {% elif q.status == 'sent' %} + {% trans "Sent" %} + {% elif q.status == 'accepted' %} + {% trans "Accepted" %} + {% elif q.status == 'converted' %} + {% trans "Converted" %} + {% elif q.status == 'rejected' %} + {% trans "Rejected" %} + {% endif %} + | +{{ q.valid_until|date:"Y-m-d"|default:"-" }} | +
+
+
+
+
+ {% if q.status != 'converted' %}
+
+ {% endif %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
|
+ {% trans "No quotations found." %} + |
+ ||||||
| {% trans "Product" %} | +{% trans "Unit Price" %} | +{% trans "Quantity" %} | +{% trans "Total" %} | ++ |
|---|---|---|---|---|
|
+ [[ item.name_en ]]
+ [[ item.sku ]]
+ |
+ + + | ++ + | +[[ currencySymbol ]][[ (item.price * item.quantity).toFixed(3) ]] | ++ + | +
| + {% trans "Search and add products to this return." %} + | +||||
{{ settings.address }}
+{{ settings.phone }}
+{{ settings.email }}
+|
+ {% trans "Item Description" %}
+ وصف العنصر
+ |
+
+ {% trans "Unit Price" %}
+ سعر الوحدة
+ |
+
+ {% trans "Quantity" %}
+ الكمية
+ |
+
+ {% trans "Total" %}
+ المجموع
+ |
+
|---|---|---|---|
|
+ {{ item.product.name_en }}
+ {{ item.product.name_ar }}
+ |
+ {{ settings.currency_symbol }}{{ item.unit_price|floatformat:3 }} | +{{ item.quantity }} | +{{ settings.currency_symbol }}{{ item.line_total|floatformat:3 }} | +
| + |
+ {% trans "Total Refund" %}
+ إجمالي المبلغ المرتجع
+ |
+ {{ settings.currency_symbol }}{{ sale_return.total_amount|floatformat:3 }} | +|
{{ sale_return.notes }}
+{% trans "Sales Return Confirmation" %} / تأكيد مرتجع مبيعات
+{% trans "Software by Meezan" %} / برمجة ميزان
+{% trans "Manage customer product returns" %}
+| {% trans "Return #" %} | +{% trans "Date" %} | +{% trans "Customer" %} | +{% trans "Original Sale" %} | +{% trans "Total Amount" %} | +{% trans "Actions" %} | +
|---|---|---|---|---|---|
| + {{ return.return_number|default:return.id }} + | +{{ return.created_at|date:"Y-m-d" }} | +{{ return.customer.name|default:_("Guest") }} | ++ {% if return.sale %} + + #{{ return.sale.invoice_number|default:return.sale.id }} + + {% else %} + N/A + {% endif %} + | +{{ site_settings.currency_symbol }}{{ return.total_amount|floatformat:3 }} | +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
|
+ {% trans "No sales returns found." %} + |
+ |||||