From 92e94e7265647d70a2996d6bcbc368672e3441c4 Mon Sep 17 00:00:00 2001 From: Marwan Alwali Date: Mon, 23 Dec 2024 17:41:24 +0300 Subject: [PATCH 1/3] update --- inventory/pdf_generator.py | 4 +- locale/ar/LC_MESSAGES/django.mo | Bin 129550 -> 119423 bytes locale/ar/LC_MESSAGES/django.po | 1191 ++++++++++--------------- templates/sales/quotation_detail.html | 2 +- 4 files changed, 455 insertions(+), 742 deletions(-) diff --git a/inventory/pdf_generator.py b/inventory/pdf_generator.py index e8a2febf..c4086eeb 100644 --- a/inventory/pdf_generator.py +++ b/inventory/pdf_generator.py @@ -1,3 +1,4 @@ +from nltk.app.wordnet_app import page_from_reference from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer from reportlab.lib import colors from reportlab.lib.pagesizes import A4 @@ -62,7 +63,7 @@ def generate_quotation_pdf(response, quotation, services): # Car Details Table elements.append(Paragraph("Car Details", heading_style)) - car_data = [["VIN", "Model", "Year", "Quantity", "Price", "VAT %", "Total"]] + car_data = [["رقم الهيكل", "الموديل", "سنة الصنع", "الكمية", "السعر", "الضريبة", "الإجمالي"]] for item in quotation.quotation_cars.all(): car_data.append([ item.car.vin, @@ -117,5 +118,6 @@ def generate_quotation_pdf(response, quotation, services): ])) elements.append(additional_table) + # Build PDF doc.build(elements) \ No newline at end of file diff --git a/locale/ar/LC_MESSAGES/django.mo b/locale/ar/LC_MESSAGES/django.mo index 32e776f401e71301ee3bf095d092aa3bdc492570..547b33b1e5cb33889464c63ffc74df78a5993aea 100644 GIT binary patch delta 32339 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 diff --git a/locale/ar/LC_MESSAGES/django.po b/locale/ar/LC_MESSAGES/django.po index fe137289..e590aac7 100644 --- a/locale/ar/LC_MESSAGES/django.po +++ b/locale/ar/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-12-19 15:20+0300\n" +"POT-Creation-Date: 2024-12-23 14:25+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -19,76 +19,77 @@ msgstr "" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" -#: api/models.py:6 inventory/models.py:144 +#: api/models.py:6 inventory/models.py:160 #: templates/inventory/car_detail.html:96 templates/inventory/car_form.html:83 #: templates/inventory/car_inventory.html:35 #: templates/inventory/car_list.html:67 templates/inventory/car_list.html:69 -#: templates/sales/quotation_detail.html:32 +#: templates/sales/quotation_detail.html:60 +#: templates/sales/quotation_pdf.html:41 msgid "VIN" msgstr "رقم الهيكل" -#: car_inventory/settings.py:203 +#: car_inventory/settings.py:191 msgid "English" msgstr "الإنجليزية" -#: car_inventory/settings.py:204 +#: car_inventory/settings.py:192 msgid "Arabic" msgstr "العربية" -#: car_inventory/settings.py:269 templates/index.html:59 +#: car_inventory/settings.py:252 templates/index.html:59 #: templates/index.html:62 templates/index.html:80 templates/index.html:87 #: templates/index.html:116 templates/index.html:122 templates/index.html:128 #: templates/index.html:163 templates/index.html:171 templates/index.html:179 msgid "SAR" msgstr "ريال سعودي" -#: inventory/forms.py:134 inventory/models.py:439 +#: inventory/forms.py:148 inventory/models.py:373 #: templates/inventory/car_detail.html:168 msgid "Custom Date" msgstr "تاريخ البطاقة الجمركية" -#: inventory/forms.py:183 +#: inventory/forms.py:197 msgid "Both exterior and interior colors must be selected." msgstr "يجب اختيار اللونين الخارجي والداخلي." -#: inventory/models.py:33 +#: inventory/models.py:36 msgid "logo" msgstr "الشعار" -#: inventory/models.py:124 +#: inventory/models.py:127 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/invoice/tags/invoice_item_formset.html:21 msgid "Available" msgstr "متاح" -#: inventory/models.py:125 +#: inventory/models.py:128 msgid "Sold" msgstr "تم البيع" -#: inventory/models.py:126 +#: inventory/models.py:129 msgid "Hold" msgstr "في الانتظار" -#: inventory/models.py:127 +#: inventory/models.py:130 msgid "Damaged" msgstr "تالف" -#: inventory/models.py:128 +#: inventory/models.py:131 msgid "Reserved" msgstr "محجوزة" -#: inventory/models.py:132 +#: inventory/models.py:135 msgid "New" msgstr "جديد" -#: inventory/models.py:133 +#: inventory/models.py:136 msgid "Used" msgstr "مستعمل" -#: inventory/models.py:137 inventory/models.py:460 +#: inventory/models.py:140 inventory/models.py:394 msgid "Owner" msgstr "المالك" -#: inventory/models.py:138 templates/header.html:50 +#: inventory/models.py:141 templates/header.html:50 #: venv/lib/python3.11/site-packages/django_ledger/io/roles.py:440 #: venv/lib/python3.11/site-packages/django_ledger/io/roles.py:526 #: venv/lib/python3.11/site-packages/django_ledger/models/items.py:521 @@ -96,229 +97,34 @@ msgstr "المالك" msgid "Inventory" msgstr "المخزن" -#: inventory/models.py:139 +#: inventory/models.py:142 msgid "Accountent" msgstr "المحاسب" -#: inventory/models.py:140 +#: inventory/models.py:143 msgid "Sales" msgstr "المبيعات" -#: inventory/models.py:146 inventory/models.py:589 -msgid "Dealer" -msgstr "المعرض" - -#: inventory/models.py:155 inventory/models.py:632 -#: templates/inventory/car_detail.html:142 -#: templates/inventory/car_form.html:230 -#: venv/lib/python3.11/site-packages/django_ledger/models/bill.py:359 -#: venv/lib/python3.11/site-packages/django_ledger/models/vendor.py:191 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/tags/bill_table.html:12 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/vendor/tags/vendor_table.html:10 -msgid "Vendor" -msgstr "المورد" - -#: inventory/models.py:163 -msgid "Make" -msgstr "الصانع" - -#: inventory/models.py:171 templates/sales/quotation_detail.html:33 -msgid "Model" -msgstr "الموديل" - -#: inventory/models.py:173 templates/inventory/car_form.html:118 -#: templates/inventory/car_inventory.html:36 -#: templates/sales/quotation_detail.html:34 -msgid "Year" -msgstr "السنة" - -#: inventory/models.py:180 templates/inventory/car_form.html:182 -msgid "Series" -msgstr "السلسلة" - -#: inventory/models.py:188 -msgid "Trim" -msgstr "الفئة" - -#: inventory/models.py:194 inventory/models.py:731 -#: templates/inventory/car_detail.html:120 -#: templates/inventory/car_list.html:163 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/tags/bill_table.html:10 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/estimate/includes/card_estimate.html:12 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/estimate/includes/estimate_table.html:12 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/purchase_order/includes/card_po.html:15 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/purchase_order/includes/po_item_formset.html:23 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/purchase_order/tags/po_item_table.html:12 -msgid "Status" -msgstr "الحالة" - -#: inventory/models.py:200 templates/inventory/car_detail.html:124 -#: templates/inventory/car_form.html:248 templates/inventory/car_list.html:177 -msgid "Stock Type" -msgstr "نوع المخزون" - -#: inventory/models.py:202 inventory/models.py:729 -#: templates/inventory/car_detail.html:147 -#: templates/inventory/car_form.html:301 templates/inventory/car_list.html:200 -#: templates/sales/quotation_detail.html:24 -msgid "Remarks" -msgstr "ملاحظات" - -#: inventory/models.py:203 templates/inventory/car_detail.html:128 -#: templates/inventory/car_form.html:265 templates/inventory/car_list.html:191 -#: templates/inventory/car_list.html:192 -msgid "Mileage" -msgstr "عدد الكيلومترات" - -#: inventory/models.py:204 templates/inventory/car_detail.html:132 -#: templates/inventory/car_form.html:283 -msgid "Receiving Date" -msgstr "تاريخ الاستلام" - -#: inventory/models.py:207 inventory/models.py:333 inventory/models.py:437 -#: inventory/models.py:454 inventory/models.py:504 inventory/models.py:769 -#: templates/sales/sales_order_detail.html:24 -msgid "Car" -msgstr "السيارة" - -#: inventory/models.py:208 -msgid "Cars" -msgstr "السيارات" - -#: inventory/models.py:334 templates/inventory/car_detail.html:338 -msgid "Reserved By" -msgstr "محجوز بواسطة" - -#: inventory/models.py:335 -msgid "Reserved At" -msgstr "تاريخ الحجز" - -#: inventory/models.py:336 -msgid "Reserved Until" -msgstr "محجوز حتى" - -#: inventory/models.py:344 templates/inventory/car_detail.html:38 -msgid "Car Reservation" -msgstr "حجز السيارة" - -#: inventory/models.py:345 -msgid "Car Reservations" -msgstr "حجوزات السيارات" - -#: inventory/models.py:351 templates/inventory/car_detail.html:223 -msgid "Cost Price" -msgstr "سعر التكلفة" - -#: inventory/models.py:352 templates/inventory/car_detail.html:228 -#: templates/sales/sales_order_detail.html:25 -msgid "Selling Price" -msgstr "سعر البيع" - -#: inventory/models.py:355 -msgid "Profit Margin" -msgstr "هامش الربح" - -#: inventory/models.py:359 -msgid "Vat Amount" -msgstr "مبلغ ضريبة القيمة المضافة" - -#: inventory/models.py:361 templates/inventory/car_detail.html:248 -msgid "Discount Amount" -msgstr "مبلغ الخصم" - -#: inventory/models.py:363 templates/inventory/car_detail.html:236 -msgid "Registration Fee" -msgstr "رسوم التسجيل" - -#: inventory/models.py:365 templates/inventory/car_detail.html:232 -#: templates/sales/quotation_detail.html:77 -msgid "Administration Fee" -msgstr "الرسوم الادارية" - -#: inventory/models.py:367 templates/inventory/car_detail.html:240 -#: templates/sales/quotation_detail.html:83 -msgid "Transportation Fee" -msgstr "رسوم النقل" - -#: inventory/models.py:369 templates/inventory/car_detail.html:244 -#: templates/sales/quotation_detail.html:89 -msgid "Custom Card Fee" -msgstr "رسوم البطاقة الجمركية" - -#: inventory/models.py:382 -#, python-format -msgid "Invalid decimal operation: %s" -msgstr "عملية عشرية غير صالحة: %s" - -#: inventory/models.py:386 inventory/models.py:387 -msgid "Car Financial Details" -msgstr "تفاصيل المالية للسيارة" - -#: inventory/models.py:391 inventory/models.py:404 inventory/models.py:676 -#: inventory/models.py:693 templates/dealers/dealer_detail.html:26 +#: inventory/models.py:147 inventory/models.py:325 inventory/models.py:338 +#: inventory/models.py:612 inventory/models.py:629 +#: templates/dealers/dealer_detail.html:26 #: templates/organizations/organization_list.html:17 #: templates/representatives/representative_list.html:17 -#: templates/sales/quotation_detail.html:15 templates/users/user_detail.html:46 +#: templates/sales/quotation_detail.html:43 +#: templates/sales/quotation_pdf.html:33 templates/users/user_detail.html:47 #: templates/vendors/vendors_list.html:34 templates/vendors/view_vendor.html:46 #: venv/lib/python3.11/site-packages/django_ledger/forms/coa.py:16 #: venv/lib/python3.11/site-packages/django_ledger/forms/coa.py:37 msgid "Name" msgstr "الاسم" -#: inventory/models.py:392 inventory/models.py:405 inventory/models.py:558 -#: inventory/models.py:620 inventory/models.py:677 inventory/models.py:694 -#: templates/users/user_detail.html:47 +#: inventory/models.py:148 inventory/models.py:326 inventory/models.py:339 +#: inventory/models.py:492 inventory/models.py:554 inventory/models.py:613 +#: inventory/models.py:630 templates/users/user_detail.html:48 msgid "Arabic Name" msgstr "الاسم بالعربية" -#: inventory/models.py:393 inventory/models.py:406 -msgid "RGB" -msgstr "آر جي بي" - -#: inventory/models.py:396 inventory/models.py:397 -#: templates/inventory/add_colors.html:13 -msgid "Exterior Colors" -msgstr "الألوان الخارجية" - -#: inventory/models.py:409 inventory/models.py:410 -#: templates/inventory/add_colors.html:32 -msgid "Interior Colors" -msgstr "الألوان الداخلية" - -#: inventory/models.py:427 -msgid "Color" -msgstr "اللون" - -#: inventory/models.py:428 -msgid "Colors" -msgstr "الألوان" - -#: inventory/models.py:438 templates/inventory/car_detail.html:164 -msgid "Custom Number" -msgstr "رقم البطاقة الجمركية" - -#: inventory/models.py:442 templates/inventory/car_detail.html:23 -#: templates/inventory/car_detail.html:173 -msgid "Custom Card" -msgstr "البطاقة الجمركية" - -#: inventory/models.py:443 -msgid "Custom Cards" -msgstr "البطاقات الجمركية" - -#: inventory/models.py:461 -msgid "Dealer who owns the car." -msgstr "التاجر الذي يمتلك السيارة." - -#: inventory/models.py:467 -msgid "Showroom" -msgstr "صالة العرض" - -#: inventory/models.py:468 -msgid "Dealer where the car is displayed (can be the owner)." -msgstr "التاجر الذي تُعرض السيارة في صالته (يمكن أن يكون المالك)." - -#: inventory/models.py:473 +#: inventory/models.py:149 inventory/models.py:407 #: venv/lib/python3.11/site-packages/django_ledger/forms/coa.py:17 #: venv/lib/python3.11/site-packages/django_ledger/forms/coa.py:38 #: venv/lib/python3.11/site-packages/django_ledger/models/data_import.py:61 @@ -331,158 +137,334 @@ msgstr "التاجر الذي تُعرض السيارة في صالته (يمك msgid "Description" msgstr "الوصف" -#: inventory/models.py:474 +#: inventory/models.py:150 templates/sales/quotation_detail.html:64 +#: templates/sales/quotation_pdf.html:45 +msgid "Price" +msgstr "السعر" + +#: inventory/models.py:153 inventory/models.py:154 +msgid "Additional Services" +msgstr "الخدمات الإضافية" + +#: inventory/models.py:162 inventory/models.py:523 +msgid "Dealer" +msgstr "المعرض" + +#: inventory/models.py:171 inventory/models.py:566 +#: templates/inventory/car_detail.html:142 +#: templates/inventory/car_form.html:230 +#: venv/lib/python3.11/site-packages/django_ledger/models/bill.py:359 +#: venv/lib/python3.11/site-packages/django_ledger/models/vendor.py:191 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/tags/bill_table.html:12 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/vendor/tags/vendor_table.html:10 +msgid "Vendor" +msgstr "المورد" + +#: inventory/models.py:179 +msgid "Make" +msgstr "الصانع" + +#: inventory/models.py:187 templates/sales/quotation_detail.html:61 +#: templates/sales/quotation_pdf.html:42 +msgid "Model" +msgstr "الموديل" + +#: inventory/models.py:189 templates/inventory/car_form.html:118 +#: templates/inventory/car_inventory.html:36 +#: templates/sales/quotation_detail.html:62 +#: templates/sales/quotation_pdf.html:43 +msgid "Year" +msgstr "السنة" + +#: inventory/models.py:196 templates/inventory/car_form.html:182 +msgid "Series" +msgstr "السلسلة" + +#: inventory/models.py:204 +msgid "Trim" +msgstr "الفئة" + +#: inventory/models.py:210 templates/inventory/car_detail.html:120 +#: templates/inventory/car_list.html:163 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/tags/bill_table.html:10 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/estimate/includes/card_estimate.html:12 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/estimate/includes/estimate_table.html:12 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/purchase_order/includes/card_po.html:15 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/purchase_order/includes/po_item_formset.html:23 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/purchase_order/tags/po_item_table.html:12 +msgid "Status" +msgstr "الحالة" + +#: inventory/models.py:216 templates/inventory/car_detail.html:124 +#: templates/inventory/car_form.html:248 templates/inventory/car_list.html:177 +msgid "Stock Type" +msgstr "نوع المخزون" + +#: inventory/models.py:218 inventory/models.py:668 +#: templates/inventory/car_detail.html:147 +#: templates/inventory/car_form.html:301 templates/inventory/car_list.html:200 +#: templates/sales/quotation_detail.html:52 +msgid "Remarks" +msgstr "ملاحظات" + +#: inventory/models.py:219 templates/inventory/car_detail.html:128 +#: templates/inventory/car_form.html:265 templates/inventory/car_list.html:191 +#: templates/inventory/car_list.html:192 +msgid "Mileage" +msgstr "عدد الكيلومترات" + +#: inventory/models.py:220 templates/inventory/car_detail.html:132 +#: templates/inventory/car_form.html:283 +msgid "Receiving Date" +msgstr "تاريخ الاستلام" + +#: inventory/models.py:223 inventory/models.py:264 inventory/models.py:371 +#: inventory/models.py:388 inventory/models.py:438 inventory/models.py:739 +#: templates/sales/sales_order_detail.html:24 +msgid "Car" +msgstr "السيارة" + +#: inventory/models.py:224 +msgid "Cars" +msgstr "السيارات" + +#: inventory/models.py:265 templates/inventory/car_detail.html:332 +msgid "Reserved By" +msgstr "محجوز بواسطة" + +#: inventory/models.py:266 +msgid "Reserved At" +msgstr "تاريخ الحجز" + +#: inventory/models.py:267 +msgid "Reserved Until" +msgstr "محجوز حتى" + +#: inventory/models.py:275 templates/inventory/car_detail.html:38 +msgid "Car Reservation" +msgstr "حجز السيارة" + +#: inventory/models.py:276 +msgid "Car Reservations" +msgstr "حجوزات السيارات" + +#: inventory/models.py:282 templates/inventory/car_detail.html:223 +msgid "Cost Price" +msgstr "سعر التكلفة" + +#: inventory/models.py:283 templates/inventory/car_detail.html:228 +#: templates/sales/sales_order_detail.html:25 +msgid "Selling Price" +msgstr "سعر البيع" + +#: inventory/models.py:284 templates/inventory/car_detail.html:232 +msgid "Discount Amount" +msgstr "مبلغ الخصم" + +#: inventory/models.py:321 inventory/models.py:322 +msgid "Car Financial Details" +msgstr "تفاصيل المالية للسيارة" + +#: inventory/models.py:327 inventory/models.py:340 +msgid "RGB" +msgstr "آر جي بي" + +#: inventory/models.py:330 inventory/models.py:331 +#: templates/inventory/add_colors.html:13 +msgid "Exterior Colors" +msgstr "الألوان الخارجية" + +#: inventory/models.py:343 inventory/models.py:344 +#: templates/inventory/add_colors.html:32 +msgid "Interior Colors" +msgstr "الألوان الداخلية" + +#: inventory/models.py:361 +msgid "Color" +msgstr "اللون" + +#: inventory/models.py:362 +msgid "Colors" +msgstr "الألوان" + +#: inventory/models.py:372 templates/inventory/car_detail.html:164 +msgid "Custom Number" +msgstr "رقم البطاقة الجمركية" + +#: inventory/models.py:376 templates/inventory/car_detail.html:23 +#: templates/inventory/car_detail.html:173 +msgid "Custom Card" +msgstr "البطاقة الجمركية" + +#: inventory/models.py:377 +msgid "Custom Cards" +msgstr "البطاقات الجمركية" + +#: inventory/models.py:395 +msgid "Dealer who owns the car." +msgstr "التاجر الذي يمتلك السيارة." + +#: inventory/models.py:401 +msgid "Showroom" +msgstr "صالة العرض" + +#: inventory/models.py:402 +msgid "Dealer where the car is displayed (can be the owner)." +msgstr "التاجر الذي تُعرض السيارة في صالته (يمكن أن يكون المالك)." + +#: inventory/models.py:408 msgid "Optional description about the showroom placement." msgstr "وصف اختياري حول وضع السيارة في صالة العرض." -#: inventory/models.py:478 inventory/models.py:733 inventory/models.py:814 -#: templates/sales/quotation_list.html:17 +#: inventory/models.py:412 inventory/models.py:673 inventory/models.py:795 +#: templates/sales/quotation_list.html:18 msgid "Created At" msgstr "تاريخ الإنشاء" -#: inventory/models.py:482 +#: inventory/models.py:416 msgid "Last Updated" msgstr "آخر تحديث" -#: inventory/models.py:486 +#: inventory/models.py:420 msgid "Car Location" msgstr "موقع السيارة" -#: inventory/models.py:487 +#: inventory/models.py:421 msgid "Car Locations" msgstr "مواقف السيارات" -#: inventory/models.py:506 +#: inventory/models.py:440 msgid "Plate Number" msgstr "رقم اللوحة" -#: inventory/models.py:507 +#: inventory/models.py:441 msgid "Text 1" msgstr "النص 1" -#: inventory/models.py:508 +#: inventory/models.py:442 msgid "Text 2" msgstr "النص 2" -#: inventory/models.py:509 +#: inventory/models.py:443 msgid "Text 3" msgstr "النص 3" -#: inventory/models.py:510 +#: inventory/models.py:444 msgid "Registration Date" msgstr "تاريخ التسجيل" -#: inventory/models.py:513 +#: inventory/models.py:447 msgid "Registration" msgstr "التسجيل" -#: inventory/models.py:514 +#: inventory/models.py:448 msgid "Registrations" msgstr "تسجيل السيارات" -#: inventory/models.py:522 inventory/models.py:659 +#: inventory/models.py:456 inventory/models.py:593 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/chart_of_accounts/includes/coa_card.html:38 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/closing_entry/tags/closing_entry_table.html:12 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/ledger/tags/ledgers_table.html:17 msgid "Created" msgstr "تاريخ الإنشاء" -#: inventory/models.py:523 +#: inventory/models.py:457 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/chart_of_accounts/includes/coa_card.html:41 msgid "Updated" msgstr "تم التحديث" -#: inventory/models.py:555 inventory/models.py:615 inventory/models.py:678 +#: inventory/models.py:489 inventory/models.py:549 inventory/models.py:614 #: templates/dealers/dealer_detail.html:31 msgid "Commercial Registration Number" msgstr "رقم السجل التجاري" -#: inventory/models.py:557 inventory/models.py:618 inventory/models.py:679 +#: inventory/models.py:491 inventory/models.py:552 inventory/models.py:615 #: templates/dealers/dealer_detail.html:35 msgid "VAT Registration Number" msgstr "رقم التسجيل في ضريبة القيمة المضافة" -#: inventory/models.py:559 inventory/models.py:621 +#: inventory/models.py:493 inventory/models.py:555 msgid "English Name" msgstr "الاسم بالإنجليزية" -#: inventory/models.py:560 inventory/models.py:623 inventory/models.py:654 -#: inventory/models.py:680 inventory/models.py:696 +#: inventory/models.py:494 inventory/models.py:557 inventory/models.py:588 +#: inventory/models.py:616 inventory/models.py:632 #: templates/customers/view_customer.html:53 -#: templates/dealers/dealer_detail.html:40 templates/users/user_detail.html:50 +#: templates/dealers/dealer_detail.html:40 templates/users/user_detail.html:51 #: templates/vendors/view_vendor.html:52 #: venv/lib/python3.11/site-packages/django_ledger/models/mixins.py:113 msgid "Phone Number" msgstr "رقم الهاتف" -#: inventory/models.py:562 inventory/models.py:625 inventory/models.py:657 -#: inventory/models.py:681 inventory/models.py:697 +#: inventory/models.py:496 inventory/models.py:559 inventory/models.py:591 +#: inventory/models.py:617 inventory/models.py:633 #: templates/customers/view_customer.html:54 #: templates/dealers/dealer_detail.html:44 #: templates/organizations/organization_detail.html:11 #: templates/representatives/representative_detail.html:10 -#: templates/sales/quotation_detail.html:17 templates/users/user_detail.html:51 +#: templates/sales/quotation_detail.html:45 +#: templates/sales/quotation_pdf.html:34 templates/users/user_detail.html:52 #: templates/vendors/vendors_list.html:36 templates/vendors/view_vendor.html:58 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/customer/tags/customer_table.html:10 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/vendor/tags/vendor_table.html:11 msgid "Address" msgstr "العنوان" -#: inventory/models.py:565 inventory/models.py:628 inventory/models.py:682 +#: inventory/models.py:499 inventory/models.py:562 inventory/models.py:618 #: templates/vendors/vendors_list.html:35 msgid "Logo" msgstr "الشعار" -#: inventory/models.py:572 +#: inventory/models.py:506 msgid "Parent Dealer" msgstr "المعرض الرئيسي" -#: inventory/models.py:578 +#: inventory/models.py:512 msgid "Dealer Type" msgstr "نوع المعرض" -#: inventory/models.py:590 +#: inventory/models.py:524 msgid "Dealers" msgstr "المعارض" -#: inventory/models.py:622 templates/vendors/view_vendor.html:49 +#: inventory/models.py:556 templates/vendors/view_vendor.html:49 msgid "Contact Person" msgstr "الشخص المسؤول" -#: inventory/models.py:633 templates/header.html:142 templates/header.html:157 +#: inventory/models.py:567 templates/header.html:142 templates/header.html:157 #: templates/vendors/vendor_form.html:4 templates/vendors/vendors_list.html:4 #: templates/vendors/vendors_list.html:5 templates/vendors/vendors_list.html:11 msgid "Vendors" msgstr "الموردين" -#: inventory/models.py:644 templates/customers/customer_list.html:51 +#: inventory/models.py:578 templates/customers/customer_list.html:51 #: templates/customers/view_customer.html:46 msgid "First Name" msgstr "الاسم الأول" -#: inventory/models.py:646 templates/customers/customer_list.html:52 +#: inventory/models.py:580 templates/customers/customer_list.html:52 #: templates/customers/view_customer.html:47 msgid "Middle Name" msgstr "اسم الأب" -#: inventory/models.py:648 templates/customers/customer_list.html:53 +#: inventory/models.py:582 templates/customers/customer_list.html:53 #: templates/customers/view_customer.html:48 msgid "Last Name" msgstr "اسم العائلة" -#: inventory/models.py:649 templates/customers/view_customer.html:51 +#: inventory/models.py:583 templates/customers/view_customer.html:51 #: templates/vendors/view_vendor.html:55 #: venv/lib/python3.11/site-packages/django_ledger/models/mixins.py:111 msgid "Email" msgstr "البريد الإلكتروني" -#: inventory/models.py:651 templates/customers/customer_list.html:54 +#: inventory/models.py:585 templates/customers/customer_list.html:54 #: templates/customers/view_customer.html:52 msgid "National ID" msgstr "رقم الهوية الوطنية" -#: inventory/models.py:662 inventory/models.py:721 -#: templates/sales/quotation_list.html:14 +#: inventory/models.py:596 inventory/models.py:660 +#: templates/sales/quotation_list.html:15 #: templates/sales/sales_order_detail.html:12 #: venv/lib/python3.11/site-packages/django_ledger/models/customer.py:199 #: venv/lib/python3.11/site-packages/django_ledger/models/estimate.py:252 @@ -492,36 +474,36 @@ msgstr "رقم الهوية الوطنية" msgid "Customer" msgstr "العميل" -#: inventory/models.py:663 templates/customers/customer_list.html:3 +#: inventory/models.py:597 templates/customers/customer_list.html:3 #: templates/customers/customer_list.html:6 msgid "Customers" msgstr "العملاء" -#: inventory/models.py:685 +#: inventory/models.py:621 msgid "Organization" msgstr "منظمة" -#: inventory/models.py:686 templates/organizations/organization_list.html:3 +#: inventory/models.py:622 templates/organizations/organization_list.html:3 #: templates/organizations/organization_list.html:6 msgid "Organizations" msgstr "منظمات" -#: inventory/models.py:695 +#: inventory/models.py:631 #: templates/representatives/representative_detail.html:8 #: templates/representatives/representative_list.html:18 msgid "ID Number" msgstr "رقم الهوية" -#: inventory/models.py:701 +#: inventory/models.py:637 msgid "Representative" msgstr "ممثل" -#: inventory/models.py:702 templates/representatives/representative_list.html:3 +#: inventory/models.py:638 templates/representatives/representative_list.html:3 #: templates/representatives/representative_list.html:6 msgid "Representatives" msgstr "ممثلون" -#: inventory/models.py:710 +#: inventory/models.py:648 #: venv/lib/python3.11/site-packages/django_ledger/models/bill.py:338 #: venv/lib/python3.11/site-packages/django_ledger/models/estimate.py:223 #: venv/lib/python3.11/site-packages/django_ledger/models/invoice.py:299 @@ -529,11 +511,11 @@ msgstr "ممثلون" msgid "Draft" msgstr "مسودة" -#: inventory/models.py:711 +#: inventory/models.py:649 msgid "Confirmed" msgstr "مؤكد" -#: inventory/models.py:712 +#: inventory/models.py:650 #: venv/lib/python3.11/site-packages/django_ledger/models/bill.py:342 #: venv/lib/python3.11/site-packages/django_ledger/models/estimate.py:228 #: venv/lib/python3.11/site-packages/django_ledger/models/invoice.py:304 @@ -542,30 +524,23 @@ msgstr "مؤكد" msgid "Canceled" msgstr "ملغى" -#: inventory/models.py:727 +#: inventory/models.py:666 #: venv/lib/python3.11/site-packages/django_ledger/models/transactions.py:491 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/purchase_order/includes/po_item_formset.html:22 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/purchase_order/tags/po_item_table.html:11 msgid "Amount" msgstr "المبلغ" -#: inventory/models.py:734 +#: inventory/models.py:674 msgid "Updated At" msgstr "تم التحديث" -#: inventory/models.py:744 -msgid "Only draft quotations can be confirmed." -msgstr "لا يمكن تأكيد سوى العروض التقديرية المسودة." - -#: inventory/models.py:751 -msgid "Cannot cancel a confirmed quotation." -msgstr "لا يمكن إلغاء عرض تقديري تم تأكيده." - -#: inventory/models.py:764 inventory/models.py:812 +#: inventory/models.py:734 inventory/models.py:793 msgid "Quotation" msgstr "عزرص سعر" -#: inventory/models.py:771 templates/sales/quotation_detail.html:35 +#: inventory/models.py:741 templates/sales/quotation_detail.html:63 +#: templates/sales/quotation_pdf.html:44 #: venv/lib/python3.11/site-packages/django_ledger/models/items.py:1068 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/bill_detail.html:97 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/tags/bill_item_formset.html:21 @@ -578,146 +553,150 @@ msgstr "عزرص سعر" msgid "Quantity" msgstr "الكمية" -#: inventory/models.py:816 templates/sales/quotation_list.html:16 +#: inventory/models.py:797 templates/sales/quotation_list.html:17 #: templates/sales/sales_order_detail.html:16 #: templates/sales/sales_order_detail.html:27 msgid "Total Amount" msgstr "المبلغ الإجمالي" -#: inventory/signals.py:75 +#: inventory/signals.py:78 #: venv/lib/python3.11/site-packages/django_ledger/models/accounts.py:436 #: venv/lib/python3.11/site-packages/django_ledger/models/coa.py:152 msgid "Chart of Accounts" msgstr "قائمة الحسابات" -#: inventory/utils.py:25 +#: inventory/utils.py:28 msgid "success" msgstr "ناجحة" -#: inventory/utils.py:26 +#: inventory/utils.py:29 msgid "error" msgstr "خطأ" -#: inventory/utils.py:27 templates/accounts/password_change.html:32 +#: inventory/utils.py:30 templates/accounts/password_change.html:32 msgid "Forgot Password?" msgstr "نسيت كلمة المرور؟" -#: inventory/views.py:80 +#: inventory/views.py:106 msgid "You are not associated with any dealer." msgstr "أنت غير مرتبط بأي معرض." -#: inventory/views.py:245 templates/header.html:33 templates/index.html:20 +#: inventory/views.py:292 templates/header.html:33 templates/index.html:20 #: templates/inventory/car_inventory.html:4 #: templates/inventory/car_inventory.html:7 msgid "inventory" msgstr "المخزون" -#: inventory/views.py:386 +#: inventory/views.py:434 msgid "Car finance details saved successfully." msgstr "تم حفظ تفاصيل المالية للسيارة بنجاح." -#: inventory/views.py:402 +#: inventory/views.py:450 msgid "Car finance details updated successfully." msgstr "تم تحديث تفاصيل المالية للسيارة بنجاح." -#: inventory/views.py:412 +#: inventory/views.py:465 msgid "Car updated successfully." msgstr "تم تحديث السيارة بنجاح" -#: inventory/views.py:424 +#: inventory/views.py:477 msgid "Car deleted successfully." msgstr "تم حذف السيارة بنجاح." -#: inventory/views.py:469 +#: inventory/views.py:522 msgid "Custom Card added successfully." msgstr "تم إضافة البطاقة الجمركية بنجاح." -#: inventory/views.py:478 +#: inventory/views.py:531 msgid "This car is already reserved." msgstr "هذه السيارة محجوزة بالفعل." -#: inventory/views.py:488 +#: inventory/views.py:539 msgid "Car reserved successfully." msgstr "تم حجز السيارة بنجاح." -#: inventory/views.py:505 +#: inventory/views.py:560 msgid "Reservation renewed successfully." msgstr "تم تجديد الحجز بنجاح" -#: inventory/views.py:510 +#: inventory/views.py:565 msgid "Reservation canceled successfully." msgstr "تم إلغاء الحجز بنجاح." -#: inventory/views.py:514 +#: inventory/views.py:570 msgid "Invalid action." msgstr "إجراء غير صالح." -#: inventory/views.py:516 +#: inventory/views.py:574 msgid "Invalid request method." msgstr "طريقة الطلب غير صالحة" -#: inventory/views.py:536 +#: inventory/views.py:595 msgid "Dealer created successfully." msgstr "تم إنشاء المعرض بنجاح." -#: inventory/views.py:543 +#: inventory/views.py:603 msgid "Dealer updated successfully." msgstr "تم تحديث المعرض بنجاح." -#: inventory/views.py:562 +#: inventory/views.py:625 msgid "Dealer deleted successfully." msgstr "تم حذف المعرض بنجاح." -#: inventory/views.py:566 templates/customers/customer_form.html:4 +#: inventory/views.py:630 templates/customers/customer_form.html:4 #: templates/header.html:62 templates/header.html:77 msgid "customers" msgstr "العملاء" -#: inventory/views.py:601 +#: inventory/views.py:675 msgid "Customer created successfully." msgstr "تم إنشاء العميل بنجاح." -#: inventory/views.py:609 +#: inventory/views.py:690 msgid "Customer updated successfully." msgstr "تم تحديث العميل بنجاح." -#: inventory/views.py:615 +#: inventory/views.py:697 msgid "Customer deleted successfully." msgstr "تم حذف العميل بنجاح." -#: inventory/views.py:639 +#: inventory/views.py:727 msgid "Vendor created successfully." msgstr "تم إنشاء المورد بنجاح." -#: inventory/views.py:647 +#: inventory/views.py:742 msgid "Vendor updated successfully." msgstr "تم تحديث المورد بنجاح" -#: inventory/views.py:653 +#: inventory/views.py:749 msgid "Vendor deleted successfully." msgstr "تم حذف المورد بنجاح." -#: inventory/views.py:675 +#: inventory/views.py:774 msgid "Quotation created successfully." msgstr "تم إنشاء عرض السعر بنجاح." -#: inventory/views.py:763 +#: inventory/views.py:862 +msgid "Quotation already approved." +msgstr "تمت الموافقة على العرض بالفعل." + +#: inventory/views.py:877 msgid "Quotation confirmed and sales order created." msgstr "تم تأكيد عرض السعر وإنشاء أمر البيع." -#: inventory/views.py:812 +#: inventory/views.py:933 msgid "User created successfully." msgstr "تم إنشاء المستخدم بنجاح." -#: inventory/views.py:821 +#: inventory/views.py:946 msgid "You have reached the maximum number of users." msgstr "لقد وصلت إلى الحد الأقصى لعدد المستخدمين." -#: inventory/views.py:842 +#: inventory/views.py:976 msgid "User updated successfully." msgstr "تم تحديث المستخدم بنجاح" -#: inventory/views.py:863 +#: inventory/views.py:1002 msgid "User deleted successfully." msgstr "تم حذف المستخدم بنجاح." @@ -845,7 +824,7 @@ msgstr "حفظ" #: templates/inventory/add_colors.html:56 #: templates/inventory/add_custom_card.html:8 #: templates/inventory/car_confirm_delete.html:14 -#: templates/inventory/car_detail.html:362 +#: templates/inventory/car_detail.html:356 #: templates/inventory/car_finance_form.html:41 #: templates/inventory/color_palette.html:107 #: templates/inventory/reserve_car.html:30 @@ -864,7 +843,7 @@ msgid "Cancel" msgstr "إلغاء" #: templates/customers/customer_list.html:21 -#: templates/inventory/car_list.html:70 templates/users/user_list.html:20 +#: templates/inventory/car_list.html:70 templates/users/user_list.html:19 msgid "search" msgstr "بحث" @@ -877,11 +856,11 @@ msgid "Customers List" msgstr "قائمة العملاء" #: templates/customers/customer_list.html:55 -#: templates/inventory/car_detail.html:340 +#: templates/inventory/car_detail.html:334 #: templates/inventory/car_inventory.html:40 #: templates/organizations/organization_list.html:21 #: templates/representatives/representative_list.html:20 -#: templates/sales/quotation_list.html:18 +#: templates/sales/quotation_list.html:19 #: templates/vendors/vendors_list.html:37 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/account/tags/account_txs_table.html:29 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/account/tags/accounts_table.html:29 @@ -914,7 +893,7 @@ msgstr "الإجراءات" #: templates/inventory/car_inventory.html:76 #: templates/organizations/organization_list.html:32 #: templates/representatives/representative_list.html:30 -#: templates/sales/quotation_list.html:32 templates/users/user_list.html:61 +#: templates/sales/quotation_list.html:40 templates/users/user_list.html:60 #: templates/vendors/vendors_list.html:56 msgid "view" msgstr "عرض" @@ -933,7 +912,7 @@ msgstr "السابق" msgid "Next" msgstr "التالي" -#: templates/customers/view_customer.html:4 templates/users/user_detail.html:4 +#: templates/customers/view_customer.html:4 templates/users/user_detail.html:5 msgid "View Customer" msgstr "عرض العميل" @@ -942,30 +921,33 @@ msgid "Are you sure you want to delete this customer?" msgstr "هل أنت متأكد أنك تريد حذف هذا العميل؟" #: templates/customers/view_customer.html:26 -#: templates/inventory/car_detail.html:48 templates/users/user_detail.html:26 +#: templates/inventory/car_detail.html:48 +#: templates/sales/quotation_detail.html:20 templates/users/user_detail.html:27 #: templates/vendors/view_vendor.html:29 #: venv/lib/python3.11/site-packages/django/forms/widgets.py:802 msgid "No" msgstr "لا" #: templates/customers/view_customer.html:31 -#: templates/inventory/car_detail.html:52 templates/users/user_detail.html:31 +#: templates/inventory/car_detail.html:52 +#: templates/sales/quotation_detail.html:24 templates/users/user_detail.html:32 #: templates/vendors/view_vendor.html:32 #: venv/lib/python3.11/site-packages/django/forms/widgets.py:801 msgid "Yes" msgstr "نعم" #: templates/customers/view_customer.html:41 -#: templates/sales/quotation_detail.html:13 +#: templates/sales/quotation_detail.html:41 +#: templates/sales/quotation_pdf.html:32 msgid "Customer Details" msgstr "تفاصيل العميل" #: templates/customers/view_customer.html:61 #: templates/inventory/car_detail.html:207 -#: templates/inventory/car_detail.html:395 +#: templates/inventory/car_detail.html:391 #: templates/organizations/organization_detail.html:14 #: templates/representatives/representative_detail.html:13 -#: templates/users/user_detail.html:59 templates/vendors/view_vendor.html:64 +#: templates/users/user_detail.html:60 templates/vendors/view_vendor.html:64 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/customer/includes/card_customer.html:28 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_table.html:83 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/ledger/tags/ledgers_table.html:101 @@ -976,7 +958,7 @@ msgstr "تحديث" #: templates/customers/view_customer.html:67 #: templates/organizations/organization_detail.html:17 #: templates/representatives/representative_detail.html:16 -#: templates/users/user_detail.html:65 templates/vendors/view_vendor.html:67 +#: templates/users/user_detail.html:66 templates/vendors/view_vendor.html:67 #: venv/lib/python3.11/site-packages/django/forms/formsets.py:499 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/bill_delete.html:28 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/tags/bill_item_formset.html:25 @@ -1008,7 +990,7 @@ msgid "Delete" msgstr "حذف" #: templates/customers/view_customer.html:72 -#: templates/inventory/car_detail.html:397 templates/users/user_detail.html:70 +#: templates/inventory/car_detail.html:393 templates/users/user_detail.html:71 msgid "Back to List" msgstr "العودة إلى القائمة" @@ -1018,7 +1000,6 @@ msgid "Dealer Details" msgstr "تفاصيل المعرض" #: templates/dealers/dealer_detail.html:45 -#: templates/sales/quotation_detail.html:97 msgid "N/A" msgstr "غير متوفر" @@ -1149,24 +1130,24 @@ msgstr "500" msgid "Internal Server Error" msgstr "خطأ داخلي في الخادم" -#: templates/haikalbot/chatbot.html:4 templates/haikalbot/chatbot.html:23 -#: templates/haikalbot/chatbot.html:28 templates/haikalbot/chatbot.html:79 +#: templates/haikalbot/chatbot.html:4 templates/haikalbot/chatbot.html:22 +#: templates/haikalbot/chatbot.html:27 templates/haikalbot/chatbot.html:78 msgid "HaikalBot" msgstr "هيكل بوت" -#: templates/haikalbot/chatbot.html:28 +#: templates/haikalbot/chatbot.html:27 msgid "Hello! How can I assist you today?" msgstr "مرحبًا! كيف يمكنني مساعدتك اليوم؟" -#: templates/haikalbot/chatbot.html:33 +#: templates/haikalbot/chatbot.html:32 msgid "Type your message here..." msgstr "اكتب رسالتك هنا..." -#: templates/haikalbot/chatbot.html:34 +#: templates/haikalbot/chatbot.html:33 msgid "Send" msgstr "إرسال" -#: templates/haikalbot/chatbot.html:78 +#: templates/haikalbot/chatbot.html:77 msgid "You" msgstr "أنت" @@ -1380,7 +1361,8 @@ msgid "Select exterior and interior colors for" msgstr "اختر الألوان الخارجية والداخلية لـ" #: templates/inventory/car_detail.html:5 templates/inventory/car_detail.html:92 -#: templates/sales/quotation_detail.html:28 +#: templates/sales/quotation_detail.html:56 +#: templates/sales/quotation_pdf.html:37 msgid "Car Details" msgstr "تفاصيل السيارة" @@ -1441,7 +1423,7 @@ msgid "Our Showroom" msgstr "معرضنا" #: templates/inventory/car_detail.html:195 -#: templates/inventory/car_detail.html:393 +#: templates/inventory/car_detail.html:389 #: templates/inventory/transfer_car.html:23 msgid "transfer" msgstr "نقل" @@ -1454,14 +1436,21 @@ msgstr "لا يوجد موقع متاح." msgid "Financial Details" msgstr "التفاصيل المالية" -#: templates/inventory/car_detail.html:252 +#: templates/inventory/car_detail.html:236 +msgid "Additional Fee" +msgstr "رسوم إضافية" + +#: templates/inventory/car_detail.html:248 +#: templates/sales/quotation_detail.html:99 +#: templates/sales/quotation_pdf.html:67 #: templates/sales/sales_order_detail.html:26 msgid "VAT Amount" msgstr "مبلغ ضريبة القيمة المضافة" -#: templates/inventory/car_detail.html:256 -#: templates/inventory/inventory_stats.html:60 -#: templates/sales/quotation_detail.html:38 +#: templates/inventory/car_detail.html:252 +#: templates/inventory/inventory_stats.html:61 +#: templates/sales/quotation_detail.html:66 +#: templates/sales/quotation_pdf.html:47 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/bill_detail.html:98 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/bill_detail.html:127 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/bills/tags/bill_item_formset.html:24 @@ -1479,66 +1468,66 @@ msgstr "مبلغ ضريبة القيمة المضافة" msgid "Total" msgstr "الإجمالي" -#: templates/inventory/car_detail.html:264 +#: templates/inventory/car_detail.html:260 msgid "Edit Finance Details" msgstr "تعديل التفاصيل المالية" -#: templates/inventory/car_detail.html:269 +#: templates/inventory/car_detail.html:265 msgid "No finance details available." msgstr "لا توجد تفاصيل مالية متاحة." -#: templates/inventory/car_detail.html:272 +#: templates/inventory/car_detail.html:268 msgid "Add Finance Details" msgstr "إضافة التفاصيل المالية" -#: templates/inventory/car_detail.html:282 +#: templates/inventory/car_detail.html:277 msgid "Colors Details" msgstr "تفاصيل الألوان" -#: templates/inventory/car_detail.html:290 +#: templates/inventory/car_detail.html:284 msgid "Exterior" msgstr "الخارجي" -#: templates/inventory/car_detail.html:301 +#: templates/inventory/car_detail.html:295 msgid "Interior" msgstr "الداخلي" -#: templates/inventory/car_detail.html:315 +#: templates/inventory/car_detail.html:309 msgid "No colors available for this car." msgstr "لا تتوفر ألوان لهذه السيارة." -#: templates/inventory/car_detail.html:321 +#: templates/inventory/car_detail.html:315 msgid "Get Colors" msgstr "الحصول على الألوان" -#: templates/inventory/car_detail.html:332 +#: templates/inventory/car_detail.html:326 msgid "Reservations Details" msgstr "تفاصيل الحجز" -#: templates/inventory/car_detail.html:339 +#: templates/inventory/car_detail.html:333 msgid "Expires At" msgstr "ينتهي في" -#: templates/inventory/car_detail.html:356 +#: templates/inventory/car_detail.html:350 msgid "Renew" msgstr "تجديد" -#: templates/inventory/car_detail.html:368 +#: templates/inventory/car_detail.html:362 msgid "Expired" msgstr "ينتهي في" -#: templates/inventory/car_detail.html:379 +#: templates/inventory/car_detail.html:375 #: templates/inventory/reserve_car.html:29 msgid "Reserve" msgstr "حجز" -#: templates/inventory/car_detail.html:476 +#: templates/inventory/car_detail.html:472 #: templates/inventory/car_list.html:542 #: templates/partials/specifications_modal.html:11 msgid "No specifications available." msgstr "لا توجد مواصفات متاحة." -#: templates/inventory/car_detail.html:480 +#: templates/inventory/car_detail.html:476 #: templates/inventory/car_list.html:546 msgid "Error loading specifications." msgstr "حدث خطأ أثناء تحميل المواصفات." @@ -1709,24 +1698,24 @@ msgstr "إحصائيات المخزون" msgid "Total Cars in Inventory" msgstr "إجمالي السيارات في المخزون" -#: templates/inventory/inventory_stats.html:39 +#: templates/inventory/inventory_stats.html:40 msgid "models" msgstr "الموديلات" -#: templates/inventory/inventory_stats.html:51 +#: templates/inventory/inventory_stats.html:52 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/closing_entry/tags/closing_entry_table.html:43 msgid "Details" msgstr "التفاصيل" -#: templates/inventory/inventory_stats.html:54 +#: templates/inventory/inventory_stats.html:55 msgid "Trims" msgstr "الفئات" -#: templates/inventory/inventory_stats.html:63 +#: templates/inventory/inventory_stats.html:64 msgid "No trims available" msgstr "لا يوجد فئات متاحة." -#: templates/inventory/inventory_stats.html:69 +#: templates/inventory/inventory_stats.html:70 msgid "No models available." msgstr "لا توجد موديلات متاحة." @@ -1808,64 +1797,77 @@ msgstr "إضافة ممثل" msgid "No representatives found." msgstr "لم يتم العثور على ممثلين." -#: templates/sales/quotation_detail.html:8 +#: templates/sales/quotation_detail.html:10 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/components/modals_v2.html:11 +msgid "Confirm" +msgstr "تأكيد" + +#: templates/sales/quotation_detail.html:14 +msgid "Are you sure" +msgstr "هل أنت متأكد" + +#: templates/sales/quotation_detail.html:36 +#: templates/sales/quotation_pdf.html:31 msgid "Quotation Details" msgstr "تفاصيل عرض السعر" -#: templates/sales/quotation_detail.html:18 +#: templates/sales/quotation_detail.html:46 +#: templates/sales/quotation_pdf.html:35 msgid "VAT No" msgstr "الرقم الضريبي" -#: templates/sales/quotation_detail.html:21 +#: templates/sales/quotation_detail.html:49 msgid "Quotation Information" msgstr "معلومات عرض السعر" -#: templates/sales/quotation_detail.html:22 +#: templates/sales/quotation_detail.html:50 msgid "Quotation No" msgstr "رقم عرض السعر" -#: templates/sales/quotation_detail.html:23 +#: templates/sales/quotation_detail.html:51 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/includes/card_journal_entry.html:15 msgid "Date" msgstr "التاريخ" -#: templates/sales/quotation_detail.html:36 -msgid "Price" -msgstr "السعر" - -#: templates/sales/quotation_detail.html:37 -#: templates/sales/quotation_detail.html:71 +#: templates/sales/quotation_detail.html:65 +#: templates/sales/quotation_pdf.html:46 msgid "VAT" msgstr "ضريبة القيمة المضافة" -#: templates/sales/quotation_detail.html:56 +#: templates/sales/quotation_detail.html:84 msgid "Totals" msgstr "الإجمالي" -#: templates/sales/quotation_detail.html:65 +#: templates/sales/quotation_detail.html:93 msgid "Additional Costs" msgstr "التكاليف الإضافية" -#: templates/sales/quotation_detail.html:69 +#: templates/sales/quotation_detail.html:97 msgid "Additions" msgstr "الإضافات" -#: templates/sales/quotation_detail.html:70 +#: templates/sales/quotation_detail.html:98 msgid "Cost" msgstr "التكلفة" -#: templates/sales/quotation_detail.html:72 +#: templates/sales/quotation_detail.html:100 msgid "Total Cost with VAT" msgstr "التكلفة الإجمالية مع ضريبة القيمة المضافة" -#: templates/sales/quotation_detail.html:95 -msgid "Registration Fee (No VAT)" -msgstr "رسوم التسجيل (بدون ضريبة القيمة المضافة)" - -#: templates/sales/quotation_detail.html:104 +#: templates/sales/quotation_detail.html:122 msgid "Back to Quotations" msgstr "العودة إلى العروض" +#: templates/sales/quotation_detail.html:124 +msgid "Approve Quotation" +msgstr "الموافقة على العرض" + +#: templates/sales/quotation_detail.html:132 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/estimate/includes/card_estimate.html:80 +#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/invoice/includes/card_invoice.html:161 +msgid "Approve" +msgstr "الموافقة" + #: templates/sales/quotation_form.html:5 templates/sales/quotation_form.html:9 msgid "Create Quotation" msgstr "إنشاء عرض" @@ -1874,14 +1876,34 @@ msgstr "إنشاء عرض" msgid "Quotations" msgstr "العروض" -#: templates/sales/quotation_list.html:15 +#: templates/sales/quotation_list.html:14 +msgid "Quotation Number" +msgstr "رقم عرض السعر" + +#: templates/sales/quotation_list.html:16 msgid "Total Cars" msgstr "إجمالي السيارات" -#: templates/sales/quotation_list.html:39 +#: templates/sales/quotation_list.html:47 msgid "No Quotations Found" msgstr "لم يتم العثور على عروض" +#: templates/sales/quotation_pdf.html:7 +msgid "Quotation PDF" +msgstr "عرض الأسعار بصيغة PDF" + +#: templates/sales/quotation_pdf.html:65 +msgid "Summary" +msgstr "الملخص" + +#: templates/sales/quotation_pdf.html:66 +msgid "Total Sales Before VAT" +msgstr "إجمالي المبيعات قبل ضريبة القيمة المضافة" + +#: templates/sales/quotation_pdf.html:68 +msgid "Total Sales After VAT" +msgstr "إجمالي المبيعات بعد ضريبة القيمة المضافة" + #: templates/sales/sales_order_detail.html:2 #: templates/sales/sales_order_detail.html:5 msgid "Sales Order Details" @@ -1895,15 +1917,15 @@ msgstr "معرّف العرض" msgid "Cars in Sales Order" msgstr "السيارات في أمر البيع" -#: templates/users/user_detail.html:19 +#: templates/users/user_detail.html:20 msgid "Are you sure you want to delete this user?" msgstr "هل أنت متأكد أنك تريد حذف هذا المستخدم؟" -#: templates/users/user_detail.html:41 +#: templates/users/user_detail.html:42 msgid "User Details" msgstr "تفاصيل المستخدم" -#: templates/users/user_detail.html:52 +#: templates/users/user_detail.html:53 msgid "Role" msgstr "الدور" @@ -1916,27 +1938,27 @@ msgstr "المستخدمون" msgid "Edit User" msgstr "تحديث العميل" -#: templates/users/user_list.html:42 +#: templates/users/user_list.html:41 msgid "name" msgstr "الاسم" -#: templates/users/user_list.html:43 +#: templates/users/user_list.html:42 msgid "arabic name" msgstr "الاسم بالعربية" -#: templates/users/user_list.html:44 +#: templates/users/user_list.html:43 msgid "phone number" msgstr "رقم الهاتف" -#: templates/users/user_list.html:45 +#: templates/users/user_list.html:44 msgid "address" msgstr "العنوان" -#: templates/users/user_list.html:46 +#: templates/users/user_list.html:45 msgid "role" msgstr "الدور" -#: templates/users/user_list.html:47 +#: templates/users/user_list.html:46 msgid "actions" msgstr "الإجراءات" @@ -2208,6 +2230,10 @@ msgstr "خطأ غير معروف" msgid "Could not open file {filename!r}: {message}" msgstr "تعذر فتح الملف {filename!r}: {message}" +#: venv/lib/python3.11/site-packages/click/formatting.py:156 +msgid "Usage:" +msgstr "الاستخدام:" + #: venv/lib/python3.11/site-packages/click/parser.py:231 msgid "Argument {name!r} takes {nargs} values." msgstr "الوسيطة {name!r} تتطلب {nargs} قيمة." @@ -2430,6 +2456,8 @@ msgstr "أدخل “Slug” صالح يتكون من أحرف يونكود وأ #: venv/lib/python3.11/site-packages/django/core/validators.py:339 #: venv/lib/python3.11/site-packages/django/core/validators.py:353 #: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2215 +#, fuzzy, python-format +#| msgid "Enter a valid %(protocol)s address." msgid "Enter a valid %(protocol)s address." msgstr "أدخل صالح." @@ -2653,8 +2681,8 @@ msgstr "تاريخ (بدون وقت)" #: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1556 #, python-format msgid "" -"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." -"uuuuuu]][TZ] format." +"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD " +"HH:MM[:ss[.uuuuuu]][TZ] format." msgstr "" "القيمة “%(value)s” تحتوي على تنسيق غير صالح. يجب أن تكون بالتنسيق YYYY-MM-DD " "HH:MM[:ss[.uuuuuu]][TZ]." @@ -2684,8 +2712,8 @@ msgstr "رقم عشري" #: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1859 #, python-format msgid "" -"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." -"uuuuuu] format." +"“%(value)s” value has an invalid format. It must be in [DD] " +"[[HH:]MM:]ss[.uuuuuu] format." msgstr "" "القيمة “%(value)s” تحتوي على تنسيق غير صالح. يجب أن تكون بالتنسيق [DD] " "[[HH:]MM:]ss[.uuuuuu]." @@ -2773,8 +2801,8 @@ msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" -"القيمة “%(value)s” تحتوي على تنسيق غير صالح. يجب أن تكون بالتنسيق HH:MM[:ss[." -"uuuuuu]]." +"القيمة “%(value)s” تحتوي على تنسيق غير صالح. يجب أن تكون بالتنسيق " +"HH:MM[:ss[.uuuuuu]]." #: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2525 #, python-format @@ -3542,8 +3570,8 @@ msgstr "لا توجد %(verbose_name_plural)s متاحة" #: venv/lib/python3.11/site-packages/django/views/generic/dates.py:652 #, python-format msgid "" -"Future %(verbose_name_plural)s not available because %(class_name)s." -"allow_future is False." +"Future %(verbose_name_plural)s not available because " +"%(class_name)s.allow_future is False." msgstr "" "%(verbose_name_plural)s المستقبلية غير متاحة لأن %(class_name)s. الخاصية " "allow_future هي False." @@ -3995,13 +4023,6 @@ msgstr "لا يمكن إنشاء إدخالات يومية جديدة على د msgid "Entity Unit" msgstr "وحدة الكيان" -#: venv/lib/python3.11/site-packages/django_ledger/forms/journal_entry.py:68 -msgid "" -"Invalid timestamp {self.cleaned_data[\"timestamp\"]} due to Closing Entries." -msgstr "" -"الطابع الزمني غير صالح {self.cleaned_data[\"timestamp\"]} بسبب إدخالات " -"الإغلاق." - #: venv/lib/python3.11/site-packages/django_ledger/forms/ledger.py:43 #: venv/lib/python3.11/site-packages/django_ledger/models/ledger.py:192 msgid "Ledger External ID" @@ -4039,30 +4060,10 @@ msgstr "يجب أن يتكون اسم الوحدة من 10 أحرف على ال msgid "Must provide all City/State/Zip/Country" msgstr "يجب توفير جميع المعلومات: المدينة/الولاية/الرمز البريدي/الدولة" -#: venv/lib/python3.11/site-packages/django_ledger/io/io_core.py:830 -#: venv/lib/python3.11/site-packages/django_ledger/io/io_core.py:836 -#, python-brace-format -msgid "" -"Cannot commit transactions. The journal entry date {je_timestamp} is on a " -"closed period." -msgstr "" -"لا يمكن تأكيد المعاملات. تاريخ الإدخال اليومي {je_timestamp} يقع في فترة " -"مغلقة." - #: venv/lib/python3.11/site-packages/django_ledger/io/io_core.py:842 msgid "Cannot commit on locked ledger" msgstr "لا يمكن تأكيد المعاملات على دفتر حسابات مقفل" -#: venv/lib/python3.11/site-packages/django_ledger/io/io_core.py:878 -msgid "Invalid timestamp type {type(je_timestamp)}" -msgstr "نوع الطابع الزمني غير صالح {type(je_timestamp)}" - -#: venv/lib/python3.11/site-packages/django_ledger/io/io_core.py:881 -#, python-brace-format -msgid "Unable to retrieve Journal Entry model with Timestamp {je_timestamp}" -msgstr "" -"غير قادر على استرداد نموذج الإدخال اليومي بالطابع الزمني {je_timestamp}" - #: venv/lib/python3.11/site-packages/django_ledger/io/io_core.py:956 #: venv/lib/python3.11/site-packages/django_ledger/io/io_core.py:1011 #: venv/lib/python3.11/site-packages/django_ledger/io/io_core.py:1066 @@ -4070,14 +4071,6 @@ msgstr "" msgid "PDF support not enabled. Install PDF support from Pipfile." msgstr "دعم PDF غير ممكّن. قم بتثبيت دعم PDF من Pipfile." -#: venv/lib/python3.11/site-packages/django_ledger/io/io_generator.py:87 -#, python-brace-format -msgid "" -"User {user_model} must have admin privileges for entity model {entity_model}." -msgstr "" -"يجب أن يمتلك المستخدم {user_model} صلاحيات المدير لنموذج الكيان " -"{entity_model}." - #: venv/lib/python3.11/site-packages/django_ledger/io/io_library.py:203 msgid "Ledger Model must be a string or UUID or LedgerModel" msgstr "يجب أن يكون نموذج دفتر الحسابات عبارة عن سلسلة أو UUID أو LedgerModel" @@ -4092,33 +4085,10 @@ msgstr "يجب أن تكون مجموع الأرصدة والخصوم متساو msgid "Transactions already committed" msgstr "المعاملات مؤكدة بالفعل" -#: venv/lib/python3.11/site-packages/django_ledger/io/io_library.py:290 -#, python-brace-format -msgid "Cannot transact on a locked ledger: {ledger_model}" -msgstr "لا يمكن إجراء معاملات على دفتر حسابات مقفل: {ledger_model}" - #: venv/lib/python3.11/site-packages/django_ledger/io/io_library.py:307 msgid "Cannot commit transactions to a non-existing ledger" msgstr "لا يمكن تأكيد المعاملات على دفتر حسابات غير موجود" -#: venv/lib/python3.11/site-packages/django_ledger/io/io_library.py:327 -#, python-brace-format -msgid "Cannot commit transactions to a non-existing ledger_xid {k}" -msgstr "لا يمكن تأكيد المعاملات على دفتر حسابات غير موجود ledger_xid {k}" - -#: venv/lib/python3.11/site-packages/django_ledger/io/io_library.py:335 -#, python-brace-format -msgid "Ledger UUID {k} not found." -msgstr "لم يتم العثور على UUID دفتر الحسابات {k}." - -#: venv/lib/python3.11/site-packages/django_ledger/io/io_library.py:356 -#, python-brace-format -msgid "" -"Account code {tx.account_code} not found. Is account available and not " -"locked?" -msgstr "" -"لم يتم العثور على رمز الحساب {tx.account_code}. هل الحساب متاح وغير مقفل؟" - #: venv/lib/python3.11/site-packages/django_ledger/io/roles.py:437 #: venv/lib/python3.11/site-packages/django_ledger/io/roles.py:523 msgid "Current Asset" @@ -4373,7 +4343,7 @@ msgstr "يجب أن يكون رمز الحساب مزيجاً من الحروف #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_txs_table.html:12 #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/journal_entry/tags/je_txs_table.html:44 msgid "Credit" -msgstr "ائتمان" +msgstr "دائن" #: venv/lib/python3.11/site-packages/django_ledger/models/accounts.py:423 #: venv/lib/python3.11/site-packages/django_ledger/models/transactions.py:474 @@ -4438,28 +4408,6 @@ msgstr "يجب أن تكون رموز الحساب فريدة لكل نموذج msgid "Only one default account for role permitted." msgstr "يُسمح بحساب افتراضي واحد فقط للدور." -#: venv/lib/python3.11/site-packages/django_ledger/models/accounts.py:745 -msgid "" -"Cannot lock account {self.code}: {self.name}. Active: {self.is_active()}" -msgstr "لا يمكن تنشيط الحساب {self.code}: {self.name}. نشط: {self.is_active()}" - -#: venv/lib/python3.11/site-packages/django_ledger/models/accounts.py:760 -msgid "" -"Cannot unlock account {self.code}: {self.name}. Active: {self.is_active()}" -msgstr "لا يمكن تنشيط الحساب {self.code}: {self.name}. نشط: {self.is_active()}" - -#: venv/lib/python3.11/site-packages/django_ledger/models/accounts.py:788 -msgid "" -"Cannot activate account {self.code}: {self.name}. Active: {self.is_active()}" -msgstr "لا يمكن تنشيط الحساب {self.code}: {self.name}. نشط: {self.is_active()}" - -#: venv/lib/python3.11/site-packages/django_ledger/models/accounts.py:815 -msgid "" -"Cannot deactivate account {self.code}: {self.name}. Active: {self." -"is_active()}" -msgstr "" -"لا يمكن إلغاء تنشيط الحساب {self.code}: {self.name}. نشط: {self.is_active()}" - #: venv/lib/python3.11/site-packages/django_ledger/models/bank_account.py:126 #: venv/lib/python3.11/site-packages/django_ledger/models/closing_entry.py:67 #: venv/lib/python3.11/site-packages/django_ledger/models/closing_entry.py:378 @@ -4613,11 +4561,6 @@ msgstr "هل تريد إبطال الفاتورة %s؟" msgid "Do you want to mark Bill %s as Canceled?" msgstr "هل تريد وضع الفاتورة %s كملغاة؟" -#: venv/lib/python3.11/site-packages/django_ledger/models/bill.py:1653 -#, python-brace-format -msgid "Bill {self.bill_number} cannot be deleted..." -msgstr "لا يمكن حذف الفاتورة {self.bill_number}..." - #: venv/lib/python3.11/site-packages/django_ledger/models/closing_entry.py:69 msgid "Closing Date" msgstr "تاريخ الإغلاق" @@ -4631,55 +4574,31 @@ msgstr "تم النشر" msgid "Only one Closing Entry for Date Allowed." msgstr "مسموح بإدخال إغلاق واحد فقط لكل تاريخ." -#: venv/lib/python3.11/site-packages/django_ledger/models/closing_entry.py:193 -#, python-brace-format -msgid "Closing Entry {self.closing_date} is already posted." -msgstr "إدخال الإغلاق {self.closing_date} تم نشره بالفعل." - -#: venv/lib/python3.11/site-packages/django_ledger/models/closing_entry.py:212 -#, python-brace-format -msgid "Are you sure you want to post Closing Entry dated {self.closing_date}?" -msgstr "هل أنت متأكد أنك تريد نشر إدخال الإغلاق المؤرخ في {self.closing_date}؟" - -#: venv/lib/python3.11/site-packages/django_ledger/models/closing_entry.py:230 -#, python-brace-format -msgid "Closing Entry {self.closing_date} is not posted." -msgstr "إدخال الإغلاق {self.closing_date} لم يتم نشره." - -#: venv/lib/python3.11/site-packages/django_ledger/models/closing_entry.py:252 -#, python-brace-format -msgid "" -"Are you sure you want to unpost Closing Entry dated {self.closing_date}?" -msgstr "" -"هل أنت متأكد أنك تريد إلغاء نشر إدخال الإغلاق المؤرخ في {self.closing_date}؟" - #: venv/lib/python3.11/site-packages/django_ledger/models/closing_entry.py:270 msgid "Cannot update transactions of a posted Closing Entry." msgstr "لا يمكن تحديث المعاملات لإدخال إغلاق تم نشره." -#: venv/lib/python3.11/site-packages/django_ledger/models/closing_entry.py:283 -#, python-brace-format +#: venv/lib/python3.11/site-packages/django_ledger/models/closing_entry.py:284 +#, fuzzy +#| msgid "" +#| "Are you sure you want to update all Closing Entry {self.closing_date} " +#| "transactions? This action will delete existing closing entry transactions " +#| "and create new ones." msgid "" -"Are you sure you want to update all Closing Entry {self.closing_date} " -"transactions? This action will delete existing closing entry transactions " -"and create new ones." +"This action will delete existing closing entry transactions and create new " +"ones." msgstr "" -"هل أنت متأكد من أنك تريد تحديث جميع معاملات إدخال الإغلاق {self." -"closing_date}؟ سيؤدي هذا الإجراء إلى حذف معاملات الإغلاق الحالية وإنشاء " -"معاملات جديدة." +"هل أنت متأكد من أنك تريد تحديث جميع معاملات إدخال الإغلاق " +"{self.closing_date}؟ سيؤدي هذا الإجراء إلى حذف معاملات الإغلاق الحالية " +"وإنشاء معاملات جديدة." #: venv/lib/python3.11/site-packages/django_ledger/models/closing_entry.py:302 msgid "Cannot delete a posted Closing Entry" msgstr "لا يمكن حذف إدخال إغلاق تم نشره" -#: venv/lib/python3.11/site-packages/django_ledger/models/closing_entry.py:314 -#, python-brace-format -msgid "" -"Are you sure you want to delete Closing Entry {self.closing_date}? This " -"action cannot be undone." -msgstr "" -"هل أنت متأكد من أنك تريد حذف إدخال الإغلاق {self.closing_date}؟ لا يمكن " -"التراجع عن هذا الإجراء." +#: venv/lib/python3.11/site-packages/django_ledger/models/closing_entry.py:315 +msgid "This action cannot be undone." +msgstr "لا يمكن التراجع عن هذا الإجراء." #: venv/lib/python3.11/site-packages/django_ledger/models/closing_entry.py:373 msgid "Account Model" @@ -4729,23 +4648,6 @@ msgstr "وصف قائمة الحسابات" msgid "Chart of Account" msgstr "قائمة الحسابات" -#: venv/lib/python3.11/site-packages/django_ledger/models/coa.py:221 -#, python-brace-format -msgid "" -"The account model {account_model} is not part of the chart of accounts {self." -"name}." -msgstr "نموذج الحساب {account_model} ليس جزءًا من قائمة الحسابات {self.name}." - -#: venv/lib/python3.11/site-packages/django_ledger/models/coa.py:319 -#, python-brace-format -msgid "CoA {self.uuid} already has a slug" -msgstr "قائمة الحسابات {self.uuid} تحتوي بالفعل على معرف" - -#: venv/lib/python3.11/site-packages/django_ledger/models/coa.py:563 -#, python-brace-format -msgid "The Chart of Accounts {self.slug} is already default" -msgstr "قائمة الحسابات {self.slug} هي بالفعل القائمة الافتراضية" - #: venv/lib/python3.11/site-packages/django_ledger/models/coa.py:613 msgid "The Chart of Accounts is currently active." msgstr "قائمة الحسابات نشطة حاليًا." @@ -4783,11 +4685,6 @@ msgstr "اكتمل استيراد المهمة" msgid "Import Job Model" msgstr "نموذج مهمة الاستيراد" -#: venv/lib/python3.11/site-packages/django_ledger/models/data_import.py:102 -#, python-brace-format -msgid "Are you sure you want to delete Import Job {self.description}?" -msgstr "هل أنت متأكد أنك تريد حذف مهمة الاستيراد {self.description}؟" - #: venv/lib/python3.11/site-packages/django_ledger/models/data_import.py:207 msgid "Parent Transaction" msgstr "المعاملة الأصلية" @@ -4813,34 +4710,11 @@ msgstr "نموذج وحدة الكيان" msgid "Staged Transaction Model" msgstr "نموذج المعاملة المتدرجة" -#: venv/lib/python3.11/site-packages/django_ledger/models/data_import.py:385 -#, python-brace-format -msgid "Staged Transaction {self.uuid} already split." -msgstr "المعاملة المتدرجة {self.uuid} تم تقسيمها بالفعل." - #: venv/lib/python3.11/site-packages/django_ledger/models/data_import.py:510 msgid "Invalid Bank Account for LedgerModel. No matching Entity Model found." msgstr "" "حساب مصرفي غير صالح لنموذج دفتر الحسابات. لم يتم العثور على نموذج كيان مطابق." -#: venv/lib/python3.11/site-packages/django_ledger/models/entity.py:435 -#, python-brace-format -msgid "" -"The Closing Entry Model {closing_entry_model} does not belong to Entity " -"{self.name}" -msgstr "" -"نموذج إدخال الإغلاق {closing_entry_model} لا ينتمي إلى الكيان {self.name}" - -#: venv/lib/python3.11/site-packages/django_ledger/models/entity.py:439 -#, python-brace-format -msgid "The Closing Entry Model date {closing_entry_model.closing_date} " -msgstr "تاريخ نموذج إدخال الإغلاق {closing_entry_model.closing_date} " - -#: venv/lib/python3.11/site-packages/django_ledger/models/entity.py:538 -#, python-brace-format -msgid "Cannot create closing entry with a future date {closing_date}." -msgstr "لا يمكن إنشاء إدخال إغلاق بتاريخ مستقبلي {closing_date}." - #: venv/lib/python3.11/site-packages/django_ledger/models/entity.py:769 msgid "Default Chart of Accounts" msgstr "قائمة الحسابات الافتراضية" @@ -4879,26 +4753,10 @@ msgstr "الكيان الأصلي غير صالح." msgid "Only slug, UUID or EntityModel allowed." msgstr "مسموح فقط بالمعرف، UUID أو نموذج الكيان." -#: venv/lib/python3.11/site-packages/django_ledger/models/entity.py:962 -#, python-brace-format -msgid "" -"Cannot replace existing slug {self.slug}. Use force_update=True if needed." -msgstr "" -"لا يمكن استبدال المعرف الحالي {self.slug}. استخدم force_update=True إذا لزم " -"الأمر." - #: venv/lib/python3.11/site-packages/django_ledger/models/entity.py:1361 msgid "No default_coa found." msgstr "لم يتم العثور على قائمة حسابات افتراضية." -#: venv/lib/python3.11/site-packages/django_ledger/models/entity.py:2022 -#, python-brace-format -msgid "" -"Invalid Account Type: choices are {BankAccountModel.VALID_ACCOUNT_TYPES}" -msgstr "" -"نوع الحساب غير صالح: الخيارات المتاحة هي {BankAccountModel." -"VALID_ACCOUNT_TYPES}" - #: venv/lib/python3.11/site-packages/django_ledger/models/entity.py:2815 msgid "" "Closing books must be called by providing closing_date or " @@ -5171,11 +5029,6 @@ msgstr "هل تريد إبطال الفاتورة %s؟" msgid "Do you want to mark Invoice %s as Canceled?" msgstr "هل تريد إلغاء الفاتورة %s؟" -#: venv/lib/python3.11/site-packages/django_ledger/models/invoice.py:1556 -#, python-brace-format -msgid "Invoice {self.invoice_number} cannot be deleted..." -msgstr "لا يمكن حذف الفاتورة {self.invoice_number}..." - #: venv/lib/python3.11/site-packages/django_ledger/models/items.py:126 msgid "Unit of Measure Name" msgstr "اسم وحدة القياس" @@ -5522,27 +5375,6 @@ msgstr "إدخالات دفتر اليومية" msgid "Cannot post an empty Journal Entry." msgstr "لا يمكن نشر إدخال دفتر يومية فارغ." -#: venv/lib/python3.11/site-packages/django_ledger/models/journal_entry.py:1215 -#, python-brace-format -msgid "" -"Are you sure you want to delete JournalEntry Model {self.je_number} on " -"Ledger {self.ledger.name}?" -msgstr "" -"هل أنت متأكد أنك تريد حذف نموذج إدخال الدفتر {self.je_number} على دفتر " -"الأستاذ {self.ledger.name}؟" - -#: venv/lib/python3.11/site-packages/django_ledger/models/journal_entry.py:1220 -#, python-brace-format -msgid "JournalEntryModel {self.uuid} cannot be deleted..." -msgstr "لا يمكن حذف نموذج إدخال الدفتر {self.uuid}..." - -#: venv/lib/python3.11/site-packages/django_ledger/models/journal_entry.py:1357 -#, python-brace-format -msgid "Cannot add Journal Entries to locked LedgerModel {instance.ledger_id}" -msgstr "" -"لا يمكن إضافة إدخالات دفتر اليومية إلى دفتر الأستاذ المقفل {instance." -"ledger_id}" - #: venv/lib/python3.11/site-packages/django_ledger/models/ledger.py:193 msgid "User Defined Ledger ID" msgstr "معرف دفتر الأستاذ المعرّف بواسطة المستخدم" @@ -5572,64 +5404,6 @@ msgstr "دفتر الأستاذ المخفي" msgid "Ledgers" msgstr "دفاتر الأستاذ" -#: venv/lib/python3.11/site-packages/django_ledger/models/ledger.py:268 -#, python-brace-format -msgid "earliest_timestamp not present in LedgerModel {self.uuid}" -msgstr "أول طابع زمني غير موجود في نموذج دفتر الأستاذ {self.uuid}" - -#: venv/lib/python3.11/site-packages/django_ledger/models/ledger.py:455 -#, python-brace-format -msgid "Ledger {self.name} cannot be posted. UUID: {self.uuid}" -msgstr "لا يمكن نشر دفتر الأستاذ {self.name}. UUID: {self.uuid}" - -#: venv/lib/python3.11/site-packages/django_ledger/models/ledger.py:491 -#, python-brace-format -msgid "Ledger {self.uuid} cannot be unposted." -msgstr "لا يمكن إلغاء نشر دفتر الأستاذ {self.uuid}" - -#: venv/lib/python3.11/site-packages/django_ledger/models/ledger.py:520 -#, python-brace-format -msgid "Ledger {self.name} cannot be locked. UUID: {self.uuid}" -msgstr "لا يمكن قفل دفتر الأستاذ {self.name}. UUID: {self.uuid}" - -#: venv/lib/python3.11/site-packages/django_ledger/models/ledger.py:554 -#, python-brace-format -msgid "Ledger {self.name} cannot be un-locked. UUID: {self.uuid}" -msgstr "لا يمكن إلغاء قفل دفتر الأستاذ {self.name}. UUID: {self.uuid}" - -#: venv/lib/python3.11/site-packages/django_ledger/models/ledger.py:573 -#, python-brace-format -msgid "Ledger {self.name} cannot be hidden. UUID: {self.uuid}" -msgstr "لا يمكن إخفاء دفتر الأستاذ {self.name}. UUID: {self.uuid}" - -#: venv/lib/python3.11/site-packages/django_ledger/models/ledger.py:591 -#, python-brace-format -msgid "Ledger {self.name} cannot be un-hidden. UUID: {self.uuid}" -msgstr "لا يمكن إلغاء إخفاء دفتر الأستاذ {self.name}. UUID: {self.uuid}" - -#: venv/lib/python3.11/site-packages/django_ledger/models/ledger.py:608 -msgid "" -"LedgerModel {self.name} cannot be deleted because posted is {self." -"is_posted()} " -msgstr "" -"لا يمكن حذف نموذج دفتر الأستاذ {self.name} لأن الحالة المنشورة هي {self." -"is_posted()}" - -#: venv/lib/python3.11/site-packages/django_ledger/models/ledger.py:620 -#, python-brace-format -msgid "" -"Journal Entries with date {earliest_date} cannot be deleted because of " -"latest closing " -msgstr "لا يمكن حذف إدخالات الدفتر بتاريخ {earliest_date} بسبب الإغلاق الأخير" - -#: venv/lib/python3.11/site-packages/django_ledger/models/ledger.py:721 -msgid "" -"Are you sure you want to delete Ledger {self.name} from Entity {self." -"get_entity_name()}?" -msgstr "" -"هل أنت متأكد أنك تريد حذف دفتر الأستاذ {self.name} من الكيان {self." -"get_entity_name()}؟" - #: venv/lib/python3.11/site-packages/django_ledger/models/mixins.py:48 msgid "Slug field must contain at least 10 characters." msgstr "يجب أن يحتوي حقل المعرف الفريد على 10 أحرف على الأقل." @@ -5838,12 +5612,6 @@ msgstr "المعاملات" msgid "Cannot transact on root accounts" msgstr "لا يمكن إجراء المعاملات على الحسابات الجذرية" -#: venv/lib/python3.11/site-packages/django_ledger/models/transactions.py:563 -#, python-brace-format -msgid "" -"Cannot create or modify transactions on account model {instance.account}." -msgstr "لا يمكن إنشاء أو تعديل المعاملات على نموذج الحساب {instance.account}." - #: venv/lib/python3.11/site-packages/django_ledger/models/transactions.py:568 msgid "Cannot modify transactions on locked journal entries." msgstr "لا يمكن تعديل المعاملات على إدخالات دفتر اليومية المقفلة." @@ -6436,10 +6204,6 @@ msgstr "طلب ميزة جديدة" msgid "Mark As Paid" msgstr "وضع كمدفوع" -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/components/modals_v2.html:11 -msgid "Confirm" -msgstr "تأكيد" - #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/components/period_navigator.html:26 msgid "Month" msgstr "الشهر" @@ -6641,11 +6405,6 @@ msgstr "تقدم الفاتورة" msgid "Received Progress" msgstr "تقدم الاستلام" -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/estimate/includes/card_estimate.html:80 -#: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/invoice/includes/card_invoice.html:161 -msgid "Approve" -msgstr "الموافقة" - #: venv/lib/python3.11/site-packages/django_ledger/templates/django_ledger/estimate/includes/estimate_item_table.html:12 msgid "Unit Sale Price" msgstr "سعر البيع للوحدة" @@ -7232,11 +6991,6 @@ msgstr "حسابات الكيان" msgid "Update Account" msgstr "تحديث الحساب" -#: venv/lib/python3.11/site-packages/django_ledger/views/account.py:132 -#, python-brace-format -msgid "Update Account: {self.object.code} - {self.object.name}" -msgstr "تحديث الحساب: {self.object.code} - {self.object.name}" - #: venv/lib/python3.11/site-packages/django_ledger/views/bank_account.py:33 msgid "Bank Accounts" msgstr "الحسابات المصرفية" @@ -7283,31 +7037,18 @@ msgstr "إنشاء مهمة استيراد" msgid "Multiple statements detected. Multiple account import is not supported." msgstr "تم اكتشاف بيانات متعددة. استيراد حسابات متعددة غير مدعوم." -#: venv/lib/python3.11/site-packages/django_ledger/views/data_import.py:92 -msgid "" -"Account Number ***{ofx_account_number[-4:]} not recognized. Please " -"{create_link} Bank Account model before importing transactions" -msgstr "" -"رقم الحساب ***{ofx_account_number[-4:]} غير معروف. يرجى {create_link} نموذج " -"حساب بنكي قبل استيراد المعاملات" +#: venv/lib/python3.11/site-packages/django_ledger/views/data_import.py:93 +msgid "Account model before importing transactions" +msgstr "نموذج الحساب قبل استيراد المعاملات" -#: venv/lib/python3.11/site-packages/django_ledger/views/data_import.py:111 -msgid "" -"Account Number ***{ofx_account_number[-4:]} not active. Please " -"{activate_link} before importing new transactions" -msgstr "" -"رقم الحساب ***{ofx_account_number[-4:]} غير نشط. يرجى {activate_link} قبل " -"استيراد المعاملات الجديدة" +#: venv/lib/python3.11/site-packages/django_ledger/views/data_import.py:112 +msgid " before importing new transactions" +msgstr "قبل استيراد المعاملات الجديدة" #: venv/lib/python3.11/site-packages/django_ledger/views/data_import.py:141 msgid "Data Import Jobs" msgstr "مهام استيراد البيانات" -#: venv/lib/python3.11/site-packages/django_ledger/views/data_import.py:177 -#, python-brace-format -msgid "Successfully updated Import Job {self.object.description}" -msgstr "تم تحديث مهمة الاستيراد {self.object.description} بنجاح" - #: venv/lib/python3.11/site-packages/django_ledger/views/data_import.py:207 msgid "Import Job Staged Txs" msgstr "معاملات مهام الاستيراد المسرّحة" @@ -7375,20 +7116,6 @@ msgstr "وحدات القياس" msgid "Create Unit of Measure" msgstr "إنشاء وحدة قياس" -#: venv/lib/python3.11/site-packages/django_ledger/views/item.py:85 -#, python-brace-format -msgid "User {self.request.user.username} cannot access entity {entity_slug}." -msgstr "" -"المستخدم {self.request.user.username} لا يمكنه الوصول إلى الكيان " -"{entity_slug}." - -#: venv/lib/python3.11/site-packages/django_ledger/views/item.py:95 -#, python-brace-format -msgid "" -"The Unit of Measure {unit_abbr} already created for Entity {entity_model." -"name}." -msgstr "وحدة القياس {unit_abbr} تم إنشاؤها بالفعل للكيان {entity_model.name}." - #: venv/lib/python3.11/site-packages/django_ledger/views/item.py:103 msgid "Update Unit of Measure" msgstr "تحديث وحدة القياس" @@ -7489,26 +7216,10 @@ msgstr "بيان التدفق النقدي لدفتر الأستاذ:" msgid "Invalid quarter number" msgstr "رقم ربع غير صالح" -#: venv/lib/python3.11/site-packages/django_ledger/views/mixins.py:94 -#, python-brace-format -msgid "Invalid quarter format. Cannot parse {quarter} into integer." -msgstr "تنسيق ربع غير صالح. لا يمكن تحليل {quarter} إلى عدد صحيح." - #: venv/lib/python3.11/site-packages/django_ledger/views/mixins.py:106 msgid "No quarter specified" msgstr "لم يتم تحديد ربع" -#: venv/lib/python3.11/site-packages/django_ledger/views/mixins.py:277 -#: venv/lib/python3.11/site-packages/django_ledger/views/mixins.py:285 -#, python-brace-format -msgid "Must provide {query_param} date parameter." -msgstr "يجب تقديم معامل التاريخ {query_param}." - -#: venv/lib/python3.11/site-packages/django_ledger/views/mixins.py:298 -#, python-brace-format -msgid "Invalid {query_param} {param_date} provided" -msgstr "تم تقديم {query_param} {param_date} غير صالح" - #: venv/lib/python3.11/site-packages/django_ledger/views/mixins.py:330 msgid "ENTITY_SLUG_URL_KWARG must be provided." msgstr "يجب توفير ENTITY_SLUG_URL_KWARG." diff --git a/templates/sales/quotation_detail.html b/templates/sales/quotation_detail.html index e9082ce8..f4c7a419 100644 --- a/templates/sales/quotation_detail.html +++ b/templates/sales/quotation_detail.html @@ -62,7 +62,7 @@ {% trans "Year" %} {% trans "Quantity" %} {% trans "Price" %} - {% trans "VAT %" %} + {% trans "VAT" %} {% trans "Total" %} From 9e8ef1978f4950e25acf4ad59ed7d221869dca96 Mon Sep 17 00:00:00 2001 From: Marwan Alwali Date: Mon, 23 Dec 2024 17:49:53 +0300 Subject: [PATCH 2/3] update --- inventory/__pycache__/models.cpython-311.pyc | Bin 46060 -> 46060 bytes inventory/signals.py | 205 ++++++------------- 2 files changed, 59 insertions(+), 146 deletions(-) diff --git a/inventory/__pycache__/models.cpython-311.pyc b/inventory/__pycache__/models.cpython-311.pyc index d75733871d0a9022848f5c12e695a18ab515452d..c95fcdda963eb4f21ff5ce613fbf006228e2342f 100644 GIT binary patch delta 24 ecmaF!oaxPTCf?<|yj%=Gu(&)k{qaWL`>>>>>> d57702ea7abaa3ad61315b9d593fbd8c32e314e2 from django.utils.translation import gettext_lazy as _ from . import models + # @receiver(post_save, sender=models.SaleQuotation) # def link_quotation_to_entity(sender, instance, created, **kwargs): # if created: @@ -34,72 +22,21 @@ from . import models # user = instance.user # if user: # user.delete() - -User = get_user_model() - -@receiver(post_save, sender=User) -def create_user_profile(sender, instance, created, **kwargs): - if created: - dealer = models.Dealer.objects.create(user=instance, name=instance.username) - # dealer.user.set_password("Tenhal@123") - dealer.save() - -@receiver(post_save, sender=models.Car) -def create_product_for_car(sender, instance, created, **kwargs): - if created: - entity = EntityModel.objects.get(name=instance.dealer.get_root_dealer.name) - - product_model = entity.create_item_product( - name=f"{instance.year} {instance.id_car_make} {instance.id_car_model} {instance.id_car_trim}", - uom_model=entity.get_uom_all().first(), - item_type=ItemModel.ITEM_TYPE_OTHER, - coa_model=entity.get_default_coa(), - ) - print(f"Created product: {product_model.name}") - - -@receiver(post_save, sender=models.CarFinance) -def update_product_default_value(sender, instance, **kwargs): - # Get the associated car - car = instance.car - - # Get the entity associated with the dealer - entity = EntityModel.objects.get(name=car.dealer.get_root_dealer.name) # Assuming the dealer's name matches the entity name - - # Get the product in Django Ledger associated with the car - items_products = entity.get_items_products() - - try: - product_model = items_products.get( - name=f"{car.year} {car.id_car_make} {car.id_car_model} {car.id_car_trim}" - ) - except ItemModel.DoesNotExist: - print(f"Product for car {car} does not exist in Django Ledger.") - return - - # Update the default value per unit of measure for the product - product_model.default_amount = instance.selling_price - product_model.save() - - print(f"Updated product {product_model.name} with default value: {product_model.default_amount}") - @receiver(post_save, sender=models.Car) def create_car_location(sender, instance, created, **kwargs): """ - Signal to create or update the car's location when a car instance is saved. - """ + Signal to create or update the car's location when a car instance is saved. + """ try: if created: if instance.dealer is None: - raise ValueError( - f"Cannot create CarLocation for car {instance.vin}: dealer is missing." - ) + raise ValueError(f"Cannot create CarLocation for car {instance.vin}: dealer is missing.") models.CarLocation.objects.create( car=instance, owner=instance.dealer, showroom=instance.dealer, - description=f"Initial location set for car {instance.vin}.", + description=f"Initial location set for car {instance.vin}." ) print("Car Location created") except Exception as e: @@ -126,27 +63,6 @@ def update_car_status_on_reservation_delete(sender, instance, **kwargs): @receiver(post_save, sender=models.Dealer) def create_ledger_entity(sender, instance, created, **kwargs): if created: -<<<<<<< HEAD - # Group.objects.get(name=instance.dealer_type.lower()).user_set.add(instance.user) - try: - entity, created = EntityModel.objects.get_or_create( - name=instance.get_root_dealer.name, - admin=instance.get_root_dealer.user, - # address_1=instance.address, - accrual_method=False, - fy_start_month=1, - depth=0, - ) - if created: - default_coa = entity.create_chart_of_accounts( - assign_as_default=True, commit=True, coa_name=_("Chart of Accounts") - ) - if default_coa: - entity.populate_default_coa( - activate_accounts=True, coa_model=default_coa - ) - print(f"Ledger entity created for Dealer: {instance.name}") -======= entity, created = EntityModel.objects.get_or_create( name=instance.get_root_dealer.name, admin=instance.get_root_dealer.user, @@ -163,67 +79,66 @@ def create_ledger_entity(sender, instance, created, **kwargs): if default_coa: entity.populate_default_coa(activate_accounts=True, coa_model=default_coa) print(f"Ledger entity created for Dealer: {instance.name}") ->>>>>>> d57702ea7abaa3ad61315b9d593fbd8c32e314e2 - entity.create_account( - coa_model=default_coa, - code="10100", - role='asset_ca_cash', - name=_('Cash'), - balance_type="debit", - ) - entity.create_account( - coa_model=default_coa, - code="11000", - role='asset_ca_recv', - name=_('Accounts Receivable'), - balance_type="debit", - ) - entity.create_account( - coa_model=default_coa, - code="12000", - role='asset_ca_inv', - name=_('Inventory'), - balance_type="debit", - active=True) - - entity.create_account( - coa_model=default_coa, - code="20100", - role='lia_cl_acc_payable', - name=_('Accounts Payable'), - balance_type="credit", - active=True) - - entity.create_account( - coa_model=default_coa, - code="40100", - role='in_operational', - name=_('Sales Income'), - balance_type="credit", - active=True) - - entity.create_account( - coa_model=default_coa, - code="50100", - role='cogs_regular', - name=_('Cost of Goods Sold'), - balance_type="debit", - active=True) - except Exception as e: - print(f"Failed to create Ledger entity for Dealer: {instance.name}. Error: {e}") - - # entity = EntityModel.objects.filter(name=instance.dealer.name).first() + # entity.create_account( + # coa_model=coa, + # code=1010, + # role='asset_ca_cash', + # name=_('Cash'), + # balance_type="debit", + # ) + # entity.create_account( + # coa_model=coa, + # code=1100, + # role='asset_ca_recv', + # name=_('Accounts Receivable'), + # balance_type="debit", + # ) + # entity.create_account( + # coa_model=coa, + # code=1200, + # role='asset_ca_inv', + # name=_('Inventory'), + # balance_type="debit", + # active=True) # + # entity.create_account( + # coa_model=coa, + # code=2010, + # role='lia_cl_acc_payable', + # name=_('Accounts Payable'), + # balance_type="credit", + # active=True) + # + # entity.create_account( + # coa_model=coa, + # code=4010, + # role='in_operational', + # name=_('Sales Income'), + # balance_type="credit", + # active=True) + # + # entity.create_account( + # coa_model=coa, + # code=5010, + # role='cogs_regular', + # name=_('Cost of Goods Sold'), + # balance_type="debit", + # active=True) + + + # uom_name = _("Unit") # unit_abbr = _("U") # # entity.create_uom(uom_name, unit_abbr) + # Create Vendor @receiver(post_save, sender=models.Vendor) def create_ledger_vendor(sender, instance, created, **kwargs): + if created: entity = EntityModel.objects.filter(name=instance.dealer.name).first() @@ -238,8 +153,8 @@ def create_ledger_vendor(sender, instance, created, **kwargs): additional_info={ "arabic_name": instance.arabic_name, "contact_person": instance.contact_person, - }, - ) + }) + print(f"VendorModel created for Vendor: {instance.name}") @@ -247,9 +162,7 @@ def create_ledger_vendor(sender, instance, created, **kwargs): @receiver(post_save, sender=models.Customer) def create_customer(sender, instance, created, **kwargs): if created: - entity = EntityModel.objects.filter( - name=instance.dealer.get_root_dealer.name - ).first() + entity = EntityModel.objects.filter(name=instance.dealer.get_root_dealer.name).first() name = f"{instance.first_name} {instance.middle_name} {instance.last_name}" entity.create_customer( @@ -261,7 +174,7 @@ def create_customer(sender, instance, created, **kwargs): "sales_tax_rate": 0.15, "active": True, "hidden": False, - "additional_info": {}, + "additional_info": {} } ) From 167b6862e96040ebfef34255448e7478654bf49a Mon Sep 17 00:00:00 2001 From: Marwan Alwali Date: Tue, 24 Dec 2024 16:48:01 +0300 Subject: [PATCH 3/3] update --- inventory/__pycache__/views.cpython-311.pyc | Bin 61859 -> 61859 bytes inventory/models.py | 45 +++++++- inventory/views.py | 120 ++++++-------------- 3 files changed, 81 insertions(+), 84 deletions(-) diff --git a/inventory/__pycache__/views.cpython-311.pyc b/inventory/__pycache__/views.cpython-311.pyc index 7fa01829707025d69227e988f7d4ca1078aff16d..2b8c0b67856b7446a4214563e1e6651cb1db45d9 100644 GIT binary patch delta 24 ecmZ4dn0fJIX5Qtzyj%=GaJM2e{pCj9X&(V=-U&Vc delta 24 fcmZ4dn0fJIX5Qtzyj%=G@McR!`p1pD(>?+KZe|IP diff --git a/inventory/models.py b/inventory/models.py index b06f04db..1b62f54d 100644 --- a/inventory/models.py +++ b/inventory/models.py @@ -798,4 +798,47 @@ class SalesOrder(models.Model): ) def __str__(self): - return f"Sales Order #{self.id} from Quotation #{self.quotation.id}" \ No newline at end of file + return f"Sales Order #{self.id} from Quotation #{self.quotation.id}" + + +class Payment(models.Model): + METHOD_CHOICES = [ + ('cash', _('cash')), + ('credit', _('credit')), + ('transfer', _('transfer')), + ('debit', _('debit')), + ('SADAD', _('SADAD')), + ] + quotation = models.ForeignKey(SaleQuotation, on_delete=models.CASCADE, related_name="payments") + amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name=_("amount")) + payment_method = models.CharField(choices=METHOD_CHOICES, max_length=50, verbose_name=_("method")) + reference_number = models.CharField(max_length=100, null=True, blank=True, verbose_name=_("reference number")) + payment_date = models.DateField(auto_now_add=True, verbose_name=_("date")) + + # def save(self, *args, **kwargs): + # super().save(*args, **kwargs) + # self.quotation.remaining_balance -= self.amount + # if self.quotation.remaining_balance <= 0: + # self.quotation.is_paid = True + # self.quotation.save() + + class Meta: + verbose_name = _("payment") + verbose_name_plural = _("payments") + + def __str__(self): + return f"Payment of {self.amount} on {self.date} for {self.order}" + + +class Refund(models.Model): + payment = models.OneToOneField(Payment, on_delete=models.CASCADE, related_name="refund") + amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name=_("amount")) + reason = models.TextField(blank=True, verbose_name=_("reason")) + refund_date = models.DateField(auto_now_add=True, verbose_name=_("refund date")) + + class Meta: + verbose_name = _("refund") + verbose_name_plural = _("refunds") + + def __str__(self): + return f"Refund of {self.amount} on {self.refund_date}" \ No newline at end of file diff --git a/inventory/views.py b/inventory/views.py index 71f5a81b..14d86ae2 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -1,8 +1,8 @@ -from django_ledger.models import EntityModel, InvoiceModel,EntityUnitModel,LedgerModel +from django_ledger.models import EntityModel, InvoiceModel import logging import json from decimal import Decimal -from django_ledger.models import TransactionModel, AccountModel,JournalEntryModelfrom .pdf_generator import generate_quotation_pdf +from .pdf_generator import generate_quotation_pdf from django.shortcuts import HttpResponse from django.template.loader import render_to_string # from weasyprint import HTML @@ -300,7 +300,7 @@ class CarInventory(LoginRequiredMixin, ListView): make_id = self.kwargs['make_id'] model_id = self.kwargs['model_id'] trim_id = self.kwargs['trim_id'] - + cars = models.Car.objects.filter( dealer=self.request.user.dealer.get_root_dealer, id_car_make=make_id, @@ -784,6 +784,8 @@ class QuotationListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): def get_queryset(self): status = self.request.GET.get("status") + # queryset = models.SaleQuotation.objects.all() + print(self.request.user.dealer.get_root_dealer.sales.all()) queryset = self.request.user.dealer.get_root_dealer.sales.all() if status: queryset = queryset.filter(status=status) @@ -808,99 +810,51 @@ class QuotationDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailVie @login_required def generate_invoice(request, pk): - quotation = get_object_or_404(models.SaleQuotation, pk=pk) + quotation = get_object_or_404(models.SaleQuotation, pk=pk) if not quotation.is_approved: messages.error( request, "Quotation must be approved before converting to an invoice." ) else: entity = quotation.entity - coa_qs, coa_map = entity.get_all_coa_accounts() - cash_account = coa_qs.first().get_coa_accounts().filter(name="Cash") - customer = entity.get_customers().filter(customer_name=quotation.customer.get_full_name).first() - - invoice_model = entity.create_invoice( - customer_model=customer, - terms=InvoiceModel.TERMS_NET_30, - cash_account=cash_account.first(), - coa_model=coa_qs.first(), + customer = ( + entity.get_customers() + .filter(customer_name=quotation.customer.get_full_name) + .first() ) - - name_list = [f"{instance.car.year} {instance.car.id_car_make} {instance.car.id_car_model} {instance.car.id_car_trim}" for instance in quotation.quotation_cars.all()] - - invoices_item_models = invoice_model.get_item_model_qs().filter(name__in=name_list) - invoice_itemtxs = { - im.item_number: { - "unit_cost": im.default_amount, - "quantity": 1, - "total_amount": im.default_amount, - } - for im in invoices_item_models - } - - invoice_itemtxs = invoice_model.migrate_itemtxs( - itemtxs=invoice_itemtxs, commit=True, operation=InvoiceModel.ITEMIZE_APPEND + print(customer) + invoices = entity.create_invoice( + customer_model=customer, terms=InvoiceModel.TERMS_NET_30 ) - - ledger = entity.create_ledger( - name=f"Payment Ledger for Invoice {invoice_model}", - posted=True - ) - - entity_unit,created = EntityUnitModel.objects.get_or_create( - name="Sales Department", - entity=entity, - document_prefix="SD" - ) - - journal_entry = JournalEntryModel.objects.create( - entity_unit=entity_unit, - posted=False, - description=f"Payment for Invoice {invoice_model}", - ledger=ledger, - locked=False, - origin="Payment", - ) - - - - accounts_receivable = coa_qs.first().get_coa_accounts().filter(name="Accounts Receivable").first() - if not accounts_receivable: - accounts_receivable = entity.create_account( - code="AR", - role="asset", - name="Accounts Receivable", - coa_model=coa_qs.first(), - balance_type="credit" - ) - - TransactionModel.objects.create( - journal_entry=journal_entry, - account=cash_account.first(), # Debit Cash - amount=invoice_model.amount_due, # Payment amount - tx_type='debit', - description="Payment Received", - ) - - TransactionModel.objects.create( - journal_entry=journal_entry, - account=accounts_receivable, # Credit Accounts Receivable - amount=invoice_model.amount_due, # Payment amount - tx_type='credit', - description="Payment Received", - ) - invoice_model.mark_as_review() - print("reviewed") - invoice_model.mark_as_approved(entity_slug=entity.slug, user_model=request.user.dealer.get_root_dealer.user) - print("approved") - invoice_model.mark_as_paid(entity_slug=entity.slug, user_model=request.user.dealer.get_root_dealer.user) - print("paid") - + # invoice_itemtxs = { + # f"{qc}": { + # "unit_cost": f"{qc.car.finances.selling_price}", + # "quantity": f"{qc.quantity}", + # "total_amount": f"{qc.total_vat}", + # } + # for qc in quotation.quotation_cars.all() + # } + # invoice_itemtxs = { + # "test":{ + # "unit_cost": "1000", + # "quantity": "1", + # "total_amount": "1000", + # }, + # "test1":{ + # "unit_cost": "1000", + # "quantity": "1", + # "total_amount": "1000", + # } + # } + # invoice_itemtxs = invoices.migrate_itemtxs( + # itemtxs=invoice_itemtxs, commit=True, operation=InvoiceModel.ITEMIZE_APPEND + # ) messages.success(request, "Invoice created") return redirect("quotation_detail", pk=pk) # return redirect('django_ledger:invoice-detail', entity_slug=quotation.entity.slug, invoice_pk=invoice.uuid) + @login_required def confirm_quotation(request, pk): quotation = get_object_or_404(models.SaleQuotation, pk=pk)