From aa68fd6c3c6a75b989c6365806fc1ec40a148726 Mon Sep 17 00:00:00 2001 From: younes Date: Wed, 23 Apr 2025 13:50:34 +0100 Subject: [PATCH] Add Project Status Report to project module for tracking project progress --- odex25_project/project_base/__init__.py | 1 + odex25_project/project_base/i18n/ar_001.po | 541 +++++++++++----- .../project_base/report/__init__.py | 3 + .../report/project_report_templates.xml | 591 +++++++++++++----- .../project_base/report/project_reports.xml | 7 + .../report/project_status_report.py | 98 +++ .../static/src/fonts/DroidKufi-Bold.ttf | Bin 0 -> 81220 bytes 7 files changed, 940 insertions(+), 301 deletions(-) create mode 100644 odex25_project/project_base/report/__init__.py create mode 100644 odex25_project/project_base/report/project_status_report.py create mode 100644 odex25_project/project_base/static/src/fonts/DroidKufi-Bold.ttf diff --git a/odex25_project/project_base/__init__.py b/odex25_project/project_base/__init__.py index f2155f77c..2b2b687eb 100644 --- a/odex25_project/project_base/__init__.py +++ b/odex25_project/project_base/__init__.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- from . import models from . import wizard +from .import report diff --git a/odex25_project/project_base/i18n/ar_001.po b/odex25_project/project_base/i18n/ar_001.po index 7ef2b4a92..73b603683 100644 --- a/odex25_project/project_base/i18n/ar_001.po +++ b/odex25_project/project_base/i18n/ar_001.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-03 08:58+0000\n" -"PO-Revision-Date: 2024-06-03 08:58+0000\n" +"POT-Creation-Date: 2025-04-23 11:07+0000\n" +"PO-Revision-Date: 2025-04-23 11:07+0000\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -83,7 +83,7 @@ msgstr "" #. module: project_base #: model_terms:ir.ui.view,arch_db:project_base.view_new_project_kanban msgid "" -msgstr "" +msgstr "" #. module: project_base #: model_terms:ir.ui.view,arch_db:project_base.view_edit_project_inherit_form @@ -158,6 +158,126 @@ msgstr "التنفيذ" msgid "New" msgstr "جديد" +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Additional Work Amount" +msgstr "مبلغ الأعمال الإضافية" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Amount" +msgstr "المبلغ" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Completion Percentage" +msgstr "نسبة الإنجاز" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Completion" +msgstr "نسبة الإنجاز" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Consultant Fees" +msgstr "تكاليف المستشار" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Contract Amount" +msgstr "مبلغ العقد" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Department" +msgstr "القسم" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Due Date" +msgstr "تاريخ اﻹستحقاق" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "End Date" +msgstr "تاريخ الانتهاء" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Executive Department" +msgstr "الفرع" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Payment Status" +msgstr "حالة الدفع" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Payment" +msgstr "الدفعة" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Project Category" +msgstr "تصنيف المشروع" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Project End Date" +msgstr "تاريخ نهاية المشروع" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Project Manager" +msgstr "مدير المشروع" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Project Name" +msgstr "اسم المشروع" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Project Start Date" +msgstr "تاريخ بداية المشروع" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Stage" +msgstr "المرحلة" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Start Date" +msgstr "تاريخ البدء" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Task" +msgstr "المهام" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Tax amount" +msgstr "مبلغ الضريبة" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Tax" +msgstr "الضريبة" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Total" +msgstr "الاجمالي" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Weight" +msgstr "الوزن" + #. module: project_base #: model_terms:ir.ui.view,arch_db:project_base.print_project_invoice msgid "" @@ -177,7 +297,7 @@ msgstr "" #. module: project_base #: model_terms:ir.ui.view,arch_db:project_base.print_project_invoice msgid "Amount" -msgstr "" +msgstr "القيمة" #. module: project_base #: model_terms:ir.ui.view,arch_db:project_base.view_new_project_kanban @@ -194,6 +314,21 @@ msgstr "" msgid "View" msgstr "عرض" +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Project Details" +msgstr "وصف المشروع" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Project Payments" +msgstr "دفعات المشروع" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Project Stages" +msgstr "مراحل المشروع" + #. module: project_base #: model:ir.model.fields,help:project_base.field_sale_advance_payment_inv__advance_down_payment_method msgid "" @@ -201,8 +336,11 @@ msgid "" " according to their invoicing policy (based on ordered or delivered " "quantity)." msgstr "" +"يتم إصدار الفاتورة القياسية مع كافة بنود الطلب جاحزة لفوترتها، وفقاً لسياسة " +"الفوترة الخاصة بها (بناءً على الكميات المطلوبة أو التي تم توصيلها). " #. module: project_base +#: model:ir.model.fields,field_description:project_base.field_project_category__account_id #: model:ir.model.fields,field_description:project_base.field_project_invoice_line__account_id msgid "Account" msgstr "الحساب" @@ -211,7 +349,7 @@ msgstr "الحساب" #: model:ir.model.fields,field_description:project_base.field_project_invoice__message_needaction #: model:ir.model.fields,field_description:project_base.field_project_phase__message_needaction msgid "Action Needed" -msgstr "" +msgstr "إجراء مطلوب" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_phase__activity_ids @@ -221,17 +359,17 @@ msgstr "الانشطة" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_phase__activity_exception_decoration msgid "Activity Exception Decoration" -msgstr "" +msgstr "زخرفة استثناء النشاط" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_phase__activity_state msgid "Activity State" -msgstr "" +msgstr "حالة النشاط" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_phase__activity_type_icon msgid "Activity Type Icon" -msgstr "" +msgstr "أيقونة نوع النشاط" #. module: project_base #: model_terms:ir.ui.view,arch_db:project_base.print_project_invoice @@ -268,10 +406,31 @@ msgstr "" msgid "All Task Count" msgstr "المهام" +#. module: project_base +#: model:ir.model.fields.selection,name:project_base.selection__project_project__privacy_visibility__employees +msgid "All internal users" +msgstr "جميع المستخدمين الداخليين" + #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_phase__estimated_hours msgid "Allocated By" -msgstr "" +msgstr "ساعات العمل" + +#. module: project_base +#: model:ir.model.fields,field_description:project_base.field_project_invoice__allowed_internal_user_ids +#: model:ir.model.fields,field_description:project_base.field_project_phase__allowed_internal_user_ids +#: model:ir.model.fields,field_description:project_base.field_project_project__allowed_internal_user_ids +#: model:ir.model.fields,field_description:project_base.field_project_task__allowed_internal_user_ids +msgid "Allowed Internal Users" +msgstr "المستخدميين الداخليين المسموح لهم" + +#. module: project_base +#: model:ir.model.fields,field_description:project_base.field_project_invoice__allowed_portal_user_ids +#: model:ir.model.fields,field_description:project_base.field_project_phase__allowed_portal_user_ids +#: model:ir.model.fields,field_description:project_base.field_project_project__allowed_portal_user_ids +#: model:ir.model.fields,field_description:project_base.field_project_task__allowed_portal_user_ids +msgid "Allowed Portal Users" +msgstr "المستخدميين البوابة المسموح لهم" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_invoice_line__amount @@ -295,12 +454,28 @@ msgstr "" msgid "Attachment Count" msgstr "عدد المستندات" +#. module: project_base +#: model:ir.model.fields,field_description:project_base.field_project_category__attachment_ids +#: model:ir.model.fields,field_description:project_base.field_project_hold_reason__attachment_ids +#: model:ir.model.fields,field_description:project_base.field_project_invoice__attachment_ids +#: model:ir.model.fields,field_description:project_base.field_project_invoice_line__attachment_ids +#: model:ir.model.fields,field_description:project_base.field_project_phase__attachment_ids +#: model:ir.model.fields,field_description:project_base.field_project_phase_type__attachment_ids +#: model:ir.model.fields,field_description:project_base.field_project_team__attachment_ids +msgid "Attachments" +msgstr "" + #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_project__back_log_amount #: model_terms:ir.ui.view,arch_db:project_base.print_project_invoice msgid "Back Log Amount" msgstr "" +#. module: project_base +#: model:ir.model.fields,field_description:project_base.field_project_project__beneficiary_id +msgid "Beneficiary" +msgstr "المستفيد" + #. module: project_base #: model_terms:ir.ui.view,arch_db:project_base.project_invoice_form_view #: model_terms:ir.ui.view,arch_db:project_base.view_edit_project_phase_wizard @@ -331,7 +506,7 @@ msgstr "اختر سبب تعليق المشروع." #. module: project_base #: model:ir.model.fields,help:project_base.field_project_task_type__color_gantt msgid "Choose your color for Task Bar" -msgstr "" +msgstr "اختر لونًا لشريط المهام الخاص بك" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_project__city @@ -362,7 +537,7 @@ msgstr "مغلق" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_task_type__color_gantt msgid "Color Task Bar" -msgstr "" +msgstr "لون شريط المهام" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_category__company_id @@ -372,7 +547,7 @@ msgstr "" #: model:ir.model.fields,field_description:project_base.field_project_phase_type__company_id #: model:ir.model.fields,field_description:project_base.field_project_task_type__company_id msgid "Company" -msgstr "" +msgstr "الشركة" #. module: project_base #: model:ir.model,name:project_base.model_res_config_settings @@ -393,13 +568,14 @@ msgstr "مؤكد" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_project__consultant_id +#: model:ir.model.fields.selection,name:project_base.selection__project_invoice__invoice_type__consultant msgid "Consultant" msgstr "المستشار" #. module: project_base -#: model:ir.model.fields,field_description:project_base.field_project_project__beneficiary_id -msgid "Beneficiary" -msgstr "المستفيد" +#: model:ir.model.fields,field_description:project_base.field_project_project__consultant_cost +msgid "Consultant Cost" +msgstr "تكاليف المستشار" #. module: project_base #: model_terms:ir.ui.view,arch_db:project_base.print_project_invoice @@ -421,11 +597,6 @@ msgstr "رقم العقد" msgid "Contract Value" msgstr "مبلغ العقد" -#. module: project_base -#: model:ir.model.fields,field_description:project_base.field_project_project__consultant_cost -msgid "Consultant Cost" -msgstr "تكاليف المستشار" - #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_project__country_id #: model_terms:ir.ui.view,arch_db:project_base.view_edit_project_inherit_form @@ -438,6 +609,7 @@ msgid "Create Down Payment" msgstr "" #. module: project_base +#: model:res.groups,name:project_base.group_project_create_invoice #: model_terms:ir.ui.view,arch_db:project_base.project_invoice_form_view #: model_terms:ir.ui.view,arch_db:project_base.view_edit_project_inherit_form msgid "Create Invoice" @@ -459,7 +631,7 @@ msgstr "إنشاء فاتورة للمشروع لكل مرحلة أو كل فت #: model:ir.model.fields,field_description:project_base.field_project_phase_type__create_uid #: model:ir.model.fields,field_description:project_base.field_project_team__create_uid msgid "Created by" -msgstr "" +msgstr "أنشئ بواسطة" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_edit_project_phase__create_date @@ -472,7 +644,7 @@ msgstr "" #: model:ir.model.fields,field_description:project_base.field_project_phase_type__create_date #: model:ir.model.fields,field_description:project_base.field_project_team__create_date msgid "Created on" -msgstr "" +msgstr "أنشئ في" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_invoice__currency_id @@ -496,13 +668,11 @@ msgstr "الافتراضي في المشروع الجديد" msgid "Department" msgstr "القسم" - #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_project__department_execute_id msgid "Department to which executed" msgstr " القسم المنفذ له" - #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_invoice__name #: model_terms:ir.ui.view,arch_db:project_base.project_detail_qweb_report @@ -510,15 +680,10 @@ msgstr " القسم المنفذ له" msgid "Description" msgstr "الوصف" -#. module: project_base -#: model_terms:ir.ui.view,arch_db:project_base.view_edit_project_inherit_form -msgid "Details" -msgstr "التفاصيل" - #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_invoice_line__discount msgid "Discount (%)" -msgstr "" +msgstr "الخصم (%)" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_edit_project_phase__display_name @@ -530,8 +695,9 @@ msgstr "" #: model:ir.model.fields,field_description:project_base.field_project_phase__display_name #: model:ir.model.fields,field_description:project_base.field_project_phase_type__display_name #: model:ir.model.fields,field_description:project_base.field_project_team__display_name +#: model:ir.model.fields,field_description:project_base.field_report_project_base_project_status_qweb_report__display_name msgid "Display Name" -msgstr "" +msgstr "الاسم المعروض" #. module: project_base #: model_terms:ir.ui.view,arch_db:project_base.view_new_project_kanban @@ -545,6 +711,12 @@ msgstr "المستندات" msgid "Done" msgstr "تم" +#. module: project_base +#: code:addons/project_base/models/project_task.py:0 +#, python-format +msgid "Done Task" +msgstr "" + #. module: project_base #: model_terms:ir.ui.view,arch_db:project_base.project_invoice_form_view msgid "DowmPayment" @@ -553,17 +725,17 @@ msgstr "" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_project__is_down_payment msgid "Down Payment" -msgstr "" +msgstr "الدفعة المقدّمة" #. module: project_base #: model:ir.model.fields.selection,name:project_base.selection__sale_advance_payment_inv__advance_down_payment_method__fixed msgid "Down payment (fixed amount)" -msgstr "" +msgstr "دفعة مقدّمة (مبلغ ثابت)" #. module: project_base #: model:ir.model.fields.selection,name:project_base.selection__sale_advance_payment_inv__advance_down_payment_method__percentage msgid "Down payment (percentage)" -msgstr "" +msgstr "دفعة مقدّمة (نسبة)" #. module: project_base #: model:ir.model.fields,help:project_base.field_project_invoice_line__is_downpayment @@ -571,6 +743,8 @@ msgid "" "Down payments are made when creating invoices from a sales order. They are " "not copied when duplicating a sales order." msgstr "" +"يتم تسجيل الدفعة المقدّمة عند إنشاء الفواتير من أمر البيع. لا يتم نسخه عند " +"إنشاء نسخة من أمر البيع." #. module: project_base #: code:addons/project_base/models/project_invoice.py:0 @@ -612,6 +786,11 @@ msgstr "الموظف" msgid "Employees" msgstr "الموظفين" +#. module: project_base +#: model:ir.model.fields,help:project_base.field_project_project__allow_timesheets +msgid "Enable timesheeting on the project." +msgstr "تمكين الجدول الزمني في المشروع." + #. module: project_base #: model:ir.model.fields,field_description:project_base.field_edit_project_phase__end_date #: model:ir.model.fields,field_description:project_base.field_project_phase__end_date @@ -650,24 +829,24 @@ msgstr "عدد المهام المنتهية" #: model:ir.model.fields,field_description:project_base.field_project_invoice__message_follower_ids #: model:ir.model.fields,field_description:project_base.field_project_phase__message_follower_ids msgid "Followers" -msgstr "" +msgstr "المتابعون" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_invoice__message_channel_ids #: model:ir.model.fields,field_description:project_base.field_project_phase__message_channel_ids msgid "Followers (Channels)" -msgstr "" +msgstr "المتابعون (القنوات)" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_invoice__message_partner_ids #: model:ir.model.fields,field_description:project_base.field_project_phase__message_partner_ids msgid "Followers (Partners)" -msgstr "" +msgstr "المتابعون (الشركاء)" #. module: project_base #: model:ir.model.fields,help:project_base.field_project_phase__activity_type_icon msgid "Font awesome icon e.g. fa-tasks" -msgstr "" +msgstr "رمز الخط الرائع ، على سبيل المثال FA- المهام" #. module: project_base #: code:addons/project_base/models/project_phase.py:0 @@ -679,7 +858,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:project_base.view_phase_search_form #: model_terms:ir.ui.view,arch_db:project_base.view_project_invoice_filter msgid "Group By" -msgstr "" +msgstr "تجميع حسب" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_invoice__has_downpayment @@ -710,18 +889,19 @@ msgstr "اسباب التعليق" #: model:ir.model.fields,field_description:project_base.field_project_phase__id #: model:ir.model.fields,field_description:project_base.field_project_phase_type__id #: model:ir.model.fields,field_description:project_base.field_project_team__id +#: model:ir.model.fields,field_description:project_base.field_report_project_base_project_status_qweb_report__id msgid "ID" -msgstr "" +msgstr "المُعرف" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_phase__activity_exception_icon msgid "Icon" -msgstr "" +msgstr "الأيقونة" #. module: project_base #: model:ir.model.fields,help:project_base.field_project_phase__activity_exception_icon msgid "Icon to indicate an exception activity." -msgstr "" +msgstr "الأيقونة للإشارة إلى استثناء النشاط" #. module: project_base #: model:ir.model.fields,help:project_base.field_project_invoice__message_needaction @@ -729,7 +909,7 @@ msgstr "" #: model:ir.model.fields,help:project_base.field_project_phase__message_needaction #: model:ir.model.fields,help:project_base.field_project_phase__message_unread msgid "If checked, new messages require your attention." -msgstr "" +msgstr "إذا كان محددًا، فهناك رسائل جديدة تحتاج لرؤيتها." #. module: project_base #: model:ir.model.fields,help:project_base.field_project_invoice__message_has_error @@ -737,12 +917,18 @@ msgstr "" #: model:ir.model.fields,help:project_base.field_project_phase__message_has_error #: model:ir.model.fields,help:project_base.field_project_phase__message_has_sms_error msgid "If checked, some messages have a delivery error." -msgstr "" +msgstr "إذا كان محددًا، فقد حدث خطأ في تسليم بعض الرسائل." #. module: project_base +#: model:ir.model.fields.selection,name:project_base.selection__project_project__priority__1 +msgid "Important" +msgstr "مهم" + +#. module: project_base +#: model:ir.model.fields.selection,name:project_base.selection__project_invoice__payment_state__in_payment #: model_terms:ir.ui.view,arch_db:project_base.project_invoice_form_view msgid "In Payment" -msgstr "للدفع" +msgstr "بانتظار التسوية " #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_project__task_count_inprogress @@ -755,6 +941,16 @@ msgstr "عدد المهام قيد التنفيذ" msgid "Internal" msgstr "داخلي" +#. module: project_base +#: model:ir.model.fields.selection,name:project_base.selection__project_project__privacy_visibility__followers +msgid "Invited internal users" +msgstr "المستخدمون الداخليون المدعوون " + +#. module: project_base +#: model:ir.model.fields.selection,name:project_base.selection__project_project__privacy_visibility__portal +msgid "Invited portal users and all internal users" +msgstr "مستخدمو البوابة المدعوون وكافة المستخدمين الداخليين " + #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_invoice__invoice_id #: model:ir.model.fields,field_description:project_base.field_project_project__invoice_ids @@ -796,6 +992,7 @@ msgstr "طلب فاتورة" #. module: project_base #: code:addons/project_base/models/project_invoice.py:0 +#: code:addons/project_base/models/project_invoice.py:0 #, python-format msgid "Invoice Request " msgstr "طلب فاتورة" @@ -807,6 +1004,7 @@ msgstr "نوع الدفعة" #. module: project_base #: code:addons/project_base/models/project_invoice.py:0 +#: code:addons/project_base/models/project_invoice.py:0 #, python-format msgid "Invoice request created for project %s and need your action" msgstr "تم إنشاء طلب فاتورة للمشروع %s ويحتاج إلى إجراء من طرفك" @@ -814,7 +1012,7 @@ msgstr "تم إنشاء طلب فاتورة للمشروع %s ويحتاج إل #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_invoice_line__qty_invoiced msgid "Invoiced Quantity" -msgstr "" +msgstr "الكمية المفوترة" #. module: project_base #: code:addons/project_base/models/project.py:0 @@ -834,6 +1032,11 @@ msgstr "" msgid "Invoicing" msgstr "الدفعات" +#. module: project_base +#: model:ir.model.fields.selection,name:project_base.selection__project_invoice__payment_state__invoicing_legacy +msgid "Invoicing App Legacy" +msgstr "" + #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_project__invoice_period msgid "Invoicing Every" @@ -876,12 +1079,12 @@ msgstr "فوترة بالمراحل" #: model:ir.model.fields,field_description:project_base.field_project_invoice__message_is_follower #: model:ir.model.fields,field_description:project_base.field_project_phase__message_is_follower msgid "Is Follower" -msgstr "" +msgstr "متابع" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_invoice_line__is_downpayment msgid "Is a down payment" -msgstr "" +msgstr "هو دفعة مقدّمة" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_invoice__actual_date @@ -920,6 +1123,12 @@ msgstr "يرجى إدخال تاريخ الاستحقاق لطلب الفاتو msgid "Kindly Enter project Stage first." msgstr "يرجى إدخال مراحل المشروع أولا." +#. module: project_base +#: code:addons/project_base/models/project_invoice.py:0 +#, python-format +msgid "Kindly The invoice is not in draft state, so it cannot be unlinked." +msgstr "عفوا الفاتورة ليست في حالة مسودة ولذلك لايمكن مسحها" + #. module: project_base #: model:ir.model.fields,field_description:project_base.field_edit_project_phase____last_update #: model:ir.model.fields,field_description:project_base.field_project_category____last_update @@ -930,8 +1139,9 @@ msgstr "يرجى إدخال مراحل المشروع أولا." #: model:ir.model.fields,field_description:project_base.field_project_phase____last_update #: model:ir.model.fields,field_description:project_base.field_project_phase_type____last_update #: model:ir.model.fields,field_description:project_base.field_project_team____last_update +#: model:ir.model.fields,field_description:project_base.field_report_project_base_project_status_qweb_report____last_update msgid "Last Modified on" -msgstr "" +msgstr "آخر تعديل في" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_edit_project_phase__write_uid @@ -944,7 +1154,7 @@ msgstr "" #: model:ir.model.fields,field_description:project_base.field_project_phase_type__write_uid #: model:ir.model.fields,field_description:project_base.field_project_team__write_uid msgid "Last Updated by" -msgstr "" +msgstr "آخر تحديث بواسطة" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_edit_project_phase__write_date @@ -957,17 +1167,17 @@ msgstr "" #: model:ir.model.fields,field_description:project_base.field_project_phase_type__write_date #: model:ir.model.fields,field_description:project_base.field_project_team__write_date msgid "Last Updated on" -msgstr "" +msgstr "آخر تحديث في" #. module: project_base #: model_terms:ir.ui.view,arch_db:project_base.view_task_search_form msgid "Late Tasks" -msgstr "" +msgstr "مهام متأخره" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_project__launch_date msgid "Launch date" -msgstr "" +msgstr "تاريخ التسليم" #. module: project_base #: model_terms:ir.ui.view,arch_db:project_base.view_edit_project_inherit_form @@ -1005,7 +1215,7 @@ msgstr "الموقع" #: model:ir.model.fields,field_description:project_base.field_project_invoice__message_main_attachment_id #: model:ir.model.fields,field_description:project_base.field_project_phase__message_main_attachment_id msgid "Main Attachment" -msgstr "" +msgstr "المرفق الرئيسي" #. module: project_base #: code:addons/project_base/models/project_phase.py:0 @@ -1027,18 +1237,18 @@ msgstr "" #: model:ir.model.fields,field_description:project_base.field_project_invoice__message_has_error #: model:ir.model.fields,field_description:project_base.field_project_phase__message_has_error msgid "Message Delivery error" -msgstr "" +msgstr "خطأ في تسليم الرسائل" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_invoice__message_ids #: model:ir.model.fields,field_description:project_base.field_project_phase__message_ids msgid "Messages" -msgstr "" +msgstr "الرسائل" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_phase__my_activity_date_deadline msgid "My Activity Deadline" -msgstr "" +msgstr "نهاية الوقت المعين للنشاط" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_category__name @@ -1062,17 +1272,17 @@ msgstr "عدد المهام الجديدة" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_phase__activity_date_deadline msgid "Next Activity Deadline" -msgstr "" +msgstr "الموعد النهائي للنشاط التالي" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_phase__activity_summary msgid "Next Activity Summary" -msgstr "" +msgstr "ملخص النشاط التالي" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_phase__activity_type_id msgid "Next Activity Type" -msgstr "" +msgstr "نوع النشاط التالي" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_project__no_of_invoices @@ -1084,18 +1294,33 @@ msgstr "عدد الدفعات" msgid "No Of Paid Invoices" msgstr "المدفعوعات" +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "No chart image available" +msgstr "لا توجد صورة للرسم البياني" + #. module: project_base #: model_terms:ir.actions.act_window,help:project_base.act_project_project_2_project_task_finished #: model_terms:ir.actions.act_window,help:project_base.act_project_project_2_project_task_inprogress #: model_terms:ir.actions.act_window,help:project_base.act_project_project_2_project_task_new msgid "No tasks found. Let's create one!" -msgstr "" +msgstr "لا يوجد مهام ز للنشئ واحده!" #. module: project_base #: model_terms:ir.ui.view,arch_db:project_base.print_project_invoice msgid "No.Of Issued Invoices" msgstr "" +#. module: project_base +#: model:ir.model.fields.selection,name:project_base.selection__project_project__priority__0 +msgid "Normal" +msgstr "عادي" + +#. module: project_base +#: model:ir.model.fields.selection,name:project_base.selection__project_invoice__payment_state__not_paid +msgid "Not Paid" +msgstr "لم يدفع" + #. module: project_base #: model_terms:ir.ui.view,arch_db:project_base.project_invoice_form_view msgid "Note" @@ -1110,31 +1335,31 @@ msgstr "ملاحظات" #: model:ir.model.fields,field_description:project_base.field_project_invoice__message_needaction_counter #: model:ir.model.fields,field_description:project_base.field_project_phase__message_needaction_counter msgid "Number of Actions" -msgstr "" +msgstr "عدد الإجراءات" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_invoice__message_has_error_counter #: model:ir.model.fields,field_description:project_base.field_project_phase__message_has_error_counter msgid "Number of errors" -msgstr "" +msgstr "عدد الاخطاء" #. module: project_base #: model:ir.model.fields,help:project_base.field_project_invoice__message_needaction_counter #: model:ir.model.fields,help:project_base.field_project_phase__message_needaction_counter msgid "Number of messages which requires an action" -msgstr "" +msgstr "عدد الرسائل التي تتطلب إجراء" #. module: project_base #: model:ir.model.fields,help:project_base.field_project_invoice__message_has_error_counter #: model:ir.model.fields,help:project_base.field_project_phase__message_has_error_counter msgid "Number of messages with delivery error" -msgstr "" +msgstr "عدد الرسائل الحادث بها خطأ في التسليم" #. module: project_base #: model:ir.model.fields,help:project_base.field_project_invoice__message_unread_counter #: model:ir.model.fields,help:project_base.field_project_phase__message_unread_counter msgid "Number of unread messages" -msgstr "" +msgstr "عدد الرسائل الجديدة" #. module: project_base #: model_terms:ir.ui.view,arch_db:project_base.view_config_settings_form @@ -1160,10 +1385,11 @@ msgid "PMO" msgstr "مدير المشاريع" #. module: project_base +#: model:ir.model.fields.selection,name:project_base.selection__project_invoice__payment_state__paid #: model_terms:ir.ui.view,arch_db:project_base.project_invoice_form_view #: model_terms:ir.ui.view,arch_db:project_base.view_new_project_kanban msgid "Paid" -msgstr "مدفعوعة" +msgstr "تم دفعها" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_invoice__payment_amount @@ -1179,9 +1405,15 @@ msgstr "" #. module: project_base #: model_terms:ir.ui.view,arch_db:project_base.project_invoice_form_view msgid "Partial" -msgstr "" +msgstr "جزئي" #. module: project_base +#: model:ir.model.fields.selection,name:project_base.selection__project_invoice__payment_state__partial +msgid "Partially Paid" +msgstr "دفع جزئي" + +#. module: project_base +#: model:ir.model.fields,field_description:project_base.field_project_invoice__partner_project_id #: model_terms:ir.ui.view,arch_db:project_base.view_edit_project_inherit_form #: model_terms:ir.ui.view,arch_db:project_base.view_project_inherit #: model_terms:ir.ui.view,arch_db:project_base.view_project_project_filter_inherit @@ -1195,8 +1427,22 @@ msgstr "تاريخ الدفع" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_invoice__payment_state -msgid "Payment Status" -msgstr "حالة الدفع" +msgid "Payment State" +msgstr "" + +#. module: project_base +#: model:ir.model.fields,help:project_base.field_project_project__privacy_visibility +msgid "" +"People to whom this project and its tasks will be visible.\n" +"\n" +"- Invited internal users: when following a project, internal users will get access to all of its tasks without distinction. Otherwise, they will only get access to the specific tasks they are following.\n" +" A user with the project > administrator access right level can still access this project and its tasks, even if they are not explicitly part of the followers.\n" +"\n" +"- All internal users: all internal users can access the project and all of its tasks without distinction.\n" +"\n" +"- Invited portal users and all internal users: all internal users can access the project and all of its tasks without distinction.\n" +"When following a project, portal users will get access to all of its tasks without distinction. Otherwise, they will only get access to the specific tasks they are following." +msgstr "" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_invoice_line__product_uom_qty @@ -1272,6 +1518,11 @@ msgstr "" msgid "Print invoice" msgstr "" +#. module: project_base +#: model:ir.model.fields,field_description:project_base.field_project_project__priority +msgid "Priority" +msgstr "الأولوية" + #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_invoice_line__product_id msgid "Product" @@ -1288,6 +1539,7 @@ msgstr "نسبة الانجاز" #: model:ir.model.fields,field_description:project_base.field_project_invoice__project_id #: model:ir.model.fields,field_description:project_base.field_project_phase__project_id #: model:ir.model.fields,field_description:project_base.field_project_team__project_id +#: model:ir.model.fields.selection,name:project_base.selection__project_invoice__invoice_type__project #: model:ir.model.fields.selection,name:project_base.selection__project_task_type__stage_for__project #: model_terms:ir.ui.view,arch_db:project_base.view_phase_search_form #: model_terms:ir.ui.view,arch_db:project_base.view_project_invoice_filter @@ -1311,7 +1563,7 @@ msgstr "رقم المشروع" #: model:ir.model.fields,field_description:project_base.field_res_config_settings__module_project_budget #: model_terms:ir.ui.view,arch_db:project_base.view_config_settings_form msgid "Project Budget" -msgstr "" +msgstr "ميزانية المشروع" #. module: project_base #: model:ir.actions.act_window,name:project_base.open_project_category_form @@ -1387,6 +1639,11 @@ msgstr "" msgid "Project Location Info" msgstr "" +#. module: project_base +#: model:ir.model.fields,field_description:project_base.field_project_project__user_id +msgid "Project Manager" +msgstr "مدير المشروع" + #. module: project_base #: model:ir.model.fields,field_description:project_base.field_res_company__module_project_metrics #: model:ir.model.fields,field_description:project_base.field_res_config_settings__module_project_metrics @@ -1410,6 +1667,11 @@ msgstr "رقم المشروع" msgid "Project Overview" msgstr "" +#. module: project_base +#: model:ir.model.fields,field_description:project_base.field_project_project__project_owner +msgid "Project Owner" +msgstr "" + #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_task__phase_id msgid "Project Phase" @@ -1447,6 +1709,21 @@ msgstr "" msgid "Project Stages" msgstr "" +#. module: project_base +#: model:ir.model,name:project_base.model_report_project_base_project_status_qweb_report +msgid "Project Status QWeb Report" +msgstr "تقرير حالة المشروع" + +#. module: project_base +#: model:ir.actions.report,name:project_base.report_project_status +msgid "Project Status Report" +msgstr "تقرير حالة المشروع" + +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_status_qweb_report +msgid "Project Status Report:" +msgstr "تقرير حالة المشروع" + #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_project__project_team_ids #: model_terms:ir.ui.view,arch_db:project_base.view_edit_project_inherit_form @@ -1472,7 +1749,7 @@ msgstr "" #. module: project_base #: model:ir.actions.act_window,name:project_base.create_tast_proj msgid "Project's tasks" -msgstr "" +msgstr "مهام المشروع" #. module: project_base #: model_terms:ir.ui.view,arch_db:project_base.print_project_invoice @@ -1493,6 +1770,11 @@ msgstr "" msgid "Project: Update Project Status" msgstr "" +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.view_project_new_calendar +msgid "Projects" +msgstr "المشاريع" + #. module: project_base #: code:addons/project_base/models/sale_order.py:0 #, python-format @@ -1507,7 +1789,7 @@ msgstr "المشتريات" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_sale_order_line__phase_qty msgid "Quantity" -msgstr "" +msgstr "الكمية" #. module: project_base #: model_terms:ir.ui.view,arch_db:project_base.view_edit_project_inherit_form @@ -1587,6 +1869,7 @@ msgid "Revenue" msgstr "ايرادي" #. module: project_base +#: model:ir.model.fields.selection,name:project_base.selection__project_invoice__payment_state__reversed #: model_terms:ir.ui.view,arch_db:project_base.project_invoice_form_view msgid "Reversed" msgstr "" @@ -1602,7 +1885,7 @@ msgstr "قيد التنفيذ" #: model:ir.model.fields,field_description:project_base.field_project_invoice__message_has_sms_error #: model:ir.model.fields,field_description:project_base.field_project_phase__message_has_sms_error msgid "SMS Delivery error" -msgstr "" +msgstr "خطأ في تسليم الرسائل القصيرة" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_project__sale_order_amount @@ -1614,12 +1897,12 @@ msgstr "" #: model:ir.model.fields,field_description:project_base.field_account_move__sale_order_id #: model:ir.model.fields,field_description:project_base.field_account_payment__sale_order_id msgid "Sale" -msgstr "" +msgstr "للبيع" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_invoice_line__order_line_id msgid "Sale Line" -msgstr "" +msgstr "بند البيع" #. module: project_base #: model:ir.model,name:project_base.model_sale_advance_payment_inv @@ -1640,7 +1923,7 @@ msgstr "بند أمر المبيعات" #. module: project_base #: model:ir.model.fields,help:project_base.field_project_invoice__sale_order_id msgid "Sales order to which the project is linked." -msgstr "" +msgstr "أمر البيع الذي يرتبط به هذا المشروع. " #. module: project_base #: model:ir.model.fields,field_description:project_base.field_res_config_settings__module_project_scrum_agile @@ -1663,6 +1946,12 @@ msgstr "متسلسل" msgid "Set to Draft" msgstr "ارجاع لمسودة" +#. module: project_base +#: model_terms:ir.ui.view,arch_db:project_base.project_invoice_form_view +#: model_terms:ir.ui.view,arch_db:project_base.view_task_form2 +msgid "Settings Allowed Users" +msgstr "اعداد صلاحية المستخدمين" + #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_project__signature_date msgid "Signature Date" @@ -1720,6 +2009,10 @@ msgid "" "Today: Activity date is today\n" "Planned: Future activities." msgstr "" +"الحالة على أساس الأنشطة\n" +"المتأخرة: تاريخ الاستحقاق مر\n" +"اليوم: تاريخ النشاط هو اليوم\n" +"المخطط: الأنشطة المستقبلية." #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_project__street @@ -1772,6 +2065,12 @@ msgstr "وسوم" msgid "Task" msgstr "مهمة" +#. module: project_base +#: code:addons/project_base/models/project_task.py:0 +#, python-format +msgid "Task %s is done for project %s and needs your action" +msgstr "" + #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_task__task_progress msgid "Task Progress" @@ -1878,10 +2177,15 @@ msgstr "يجب أن يكون الوزن بين 0 و 100." msgid "This invoice is due and must be issue %s" msgstr "" +#. module: project_base +#: model:ir.model.fields,field_description:project_base.field_project_project__allow_timesheets +msgid "Timesheets" +msgstr "سجلات الأنشطة" + #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_project__to_invoice msgid "To Invoice" -msgstr "" +msgstr "في انتظار الفوترة" #. module: project_base #: model_terms:ir.actions.act_window,help:project_base.act_project_project_2_project_task_finished @@ -1896,7 +2200,7 @@ msgstr "" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_invoice__to_invoice msgid "To invoice" -msgstr "" +msgstr "على الفاتورة" #. module: project_base #: model_terms:ir.ui.view,arch_db:project_base.project_invoice_tree_view @@ -1957,7 +2261,7 @@ msgstr "النوع" #. module: project_base #: model:ir.model.fields,help:project_base.field_project_phase__activity_exception_decoration msgid "Type of the exception activity on record." -msgstr "" +msgstr "نوع النشاط الاستثنائي المسجل." #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_invoice_line__price_unit @@ -1967,19 +2271,19 @@ msgstr "المبلغ" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_invoice_line__product_uom msgid "Unit of Measure" -msgstr "" +msgstr "وحدة القياس" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_invoice__message_unread #: model:ir.model.fields,field_description:project_base.field_project_phase__message_unread msgid "Unread Messages" -msgstr "" +msgstr "الرسائل الجديدة" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_invoice__message_unread_counter #: model:ir.model.fields,field_description:project_base.field_project_phase__message_unread_counter msgid "Unread Messages Counter" -msgstr "" +msgstr "عدد الرسائل الجديدة" #. module: project_base #: model_terms:ir.ui.view,arch_db:project_base.view_config_settings_form @@ -1991,32 +2295,27 @@ msgstr "" msgid "Variance Days" msgstr "" -#. module: project_base -#: model:ir.model.fields.selection,name:project_base.selection__project_invoice__invoice_type__project -msgid "Project" -msgstr "دفعة مشروع" - #. module: project_base #: model:ir.model.fields.selection,name:project_base.selection__project_invoice__invoice_type__variation_order msgid "Variation Order" msgstr "دفعة طلب تغير" #. module: project_base -#: model:ir.model.fields.selection,name:project_base.selection__project_invoice__invoice_type__consultant -msgid "Consultant" -msgstr "دفعة مستشار" +#: model:ir.model.fields,field_description:project_base.field_project_project__privacy_visibility +msgid "Visibility" +msgstr "الظهور" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_invoice__website_message_ids #: model:ir.model.fields,field_description:project_base.field_project_phase__website_message_ids msgid "Website Messages" -msgstr "" +msgstr "رسائل الموقع" #. module: project_base #: model:ir.model.fields,help:project_base.field_project_invoice__website_message_ids #: model:ir.model.fields,help:project_base.field_project_phase__website_message_ids msgid "Website communication history" -msgstr "" +msgstr "سجل تواصل الموقع" #. module: project_base #: model:ir.model.fields,field_description:project_base.field_project_phase__weight @@ -2119,59 +2418,3 @@ msgstr "فريق المشروع" #: model_terms:ir.ui.view,arch_db:project_base.project_invoice_tree_view msgid "residual_amount" msgstr "المبلغ المتبقي" - - -#. module: project_base -#: model:ir.model.fields,field_description:project_base.field_project_invoice__allowed_internal_user_ids -#: model:ir.model.fields,field_description:project_base.field_project_phase__allowed_internal_user_ids -#: model:ir.model.fields,field_description:project_base.field_project_project__allowed_internal_user_ids -#: model:ir.model.fields,field_description:project_base.field_project_task__allowed_internal_user_ids -msgid "Allowed Internal Users" -msgstr "المستخدميين الداخليين المسموح لهم" - -#. module: project_base -#: model:ir.model.fields,field_description:project_base.field_project_invoice__allowed_portal_user_ids -#: model:ir.model.fields,field_description:project_base.field_project_phase__allowed_portal_user_ids -#: model:ir.model.fields,field_description:project_base.field_project_project__allowed_portal_user_ids -#: model:ir.model.fields,field_description:project_base.field_project_task__allowed_portal_user_ids -msgid "Allowed Portal Users" -msgstr "المستخدميين البوابة المسموح لهم" - -#. module: project_base -#: model_terms:ir.ui.view,arch_db:project_base.project_invoice_form_view -#: model_terms:ir.ui.view,arch_db:project_base.view_task_form2 -msgid "Settings Allowed Users" -msgstr "اعداد صلاحية المستخدمين" - -#. module: project_base -#: model:ir.model.fields,field_description:project_base.field_project_phase__estimated_hours -msgid "Allocated By" -msgstr "ساعات العمل" - -#. module: project_base -#: model:ir.model.fields,field_description:project_base.field_project_project__launch_date -msgid "Launch date" -msgstr "تاريخ التسليم" - -#. module: project_base -#: model:ir.model.fields,field_description:project_base.field_project_category__account_id -msgid "Account" -msgstr "الحساب" - -#. module: project_base -#: code:addons/project_base/models/project_invoice.py:0 -#, python-format -msgid "Kindly The invoice is not in draft state, so it cannot be unlinked." -msgstr "عفوا الفاتورة ليست في حالة مسودة ولذلك لايمكن مسحها" - -#. module: project_base -#: model:res.groups,name:project_base.group_project_create_invoice -msgid "Create Invoice" -msgstr "إنشاء فاتورة" - -#. module: project_base -#: model:ir.model.fields,field_description:project_base.field_project_invoice__partner_project_id -msgid "Partner" -msgstr "الجهة" - - diff --git a/odex25_project/project_base/report/__init__.py b/odex25_project/project_base/report/__init__.py new file mode 100644 index 000000000..b4f2c2483 --- /dev/null +++ b/odex25_project/project_base/report/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import project_status_report \ No newline at end of file diff --git a/odex25_project/project_base/report/project_report_templates.xml b/odex25_project/project_base/report/project_report_templates.xml index ca3015e53..c6cf123ad 100644 --- a/odex25_project/project_base/report/project_report_templates.xml +++ b/odex25_project/project_base/report/project_report_templates.xml @@ -1,167 +1,454 @@ - diff --git a/odex25_project/project_base/report/project_reports.xml b/odex25_project/project_base/report/project_reports.xml index 4f43a6cdf..1ad839d52 100644 --- a/odex25_project/project_base/report/project_reports.xml +++ b/odex25_project/project_base/report/project_reports.xml @@ -8,6 +8,13 @@ file="project_base.project_detail_qweb_report" string="Project Charter"/> + + A4 for E-Invoice diff --git a/odex25_project/project_base/report/project_status_report.py b/odex25_project/project_base/report/project_status_report.py new file mode 100644 index 000000000..6b79e5946 --- /dev/null +++ b/odex25_project/project_base/report/project_status_report.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +from odoo import api, fields, models, _ +from odoo.exceptions import UserError, ValidationError, Warning +import matplotlib.pyplot as plt +import io +import base64 +import matplotlib +matplotlib.use('Agg') +import logging + +import os +import arabic_reshaper +from bidi.algorithm import get_display +from odoo.modules.module import get_module_resource + +_logger = logging.getLogger(__name__) + + +class ReportProjectStatus(models.AbstractModel): + _name = 'report.project_base.project_status_qweb_report' + _description = 'Project Status QWeb Report' + + @api.model + def _get_report_values(self, docids, data=None): + projects = self.env['project.project'].browse(docids) + chart_map = {} + + for project in projects: + try: + chart = self._get_chart_image(project) + except Exception as e: + _logger.error(f"Chart error for project {project.id}: {str(e)}") + chart = False + + chart_map[project.id] = chart + + return { + 'doc_ids': docids, + 'doc_model': 'project.project', + 'docs': projects, + 'chart_map': chart_map, + } + + def _get_chart_image(self, project): + _logger.info( + f"Task counts - New: {project.task_count_new}, In Progress: {project.task_count_inprogress}, Done: {project.task_count_finished}") + + task_data = { + 'new': project.task_count_new or 0, + 'in_progress': project.task_count_inprogress or 0, + 'done': project.task_count_finished or 0, + } + + if sum(task_data.values()) == 0: + _logger.warning("All task counts are zero, using dummy data") + task_data = {'new': 1, 'in_progress': 1, 'done': 1} + + font_path = os.path.join(os.path.dirname(__file__), 'img', 'amiri-regular.ttf') + if not os.path.exists(font_path): + font_path = get_module_resource('project_base', 'static/fonts', 'amiri-regular.ttf') + if not font_path: + _logger.warning("Arabic font not found. Using default font.") + font_path = None + + if font_path: + prop = matplotlib.font_manager.FontProperties(fname=font_path) + else: + prop = None + + fig = plt.figure(figsize=(5, 4)) + + def format_arabic(text): + reshaped_text = arabic_reshaper.reshape(text) + bidi_text = get_display(reshaped_text) + return bidi_text + + arabicLabels = ['جديد', 'قيد التنفيذ', 'تم'] + labels = [format_arabic(label) for label in arabicLabels] + sizes = [task_data['new'], task_data['in_progress'], task_data['done']] + colors = ['#f0312e', '#add8e6', '#90ee90'] + + plt.pie(sizes, labels=labels, autopct='%1.1f%%', colors=colors, startangle=90, + textprops={'fontproperties': prop, 'fontsize': 16} if prop else {'fontsize': 16}) + plt.axis('equal') + plt.rcParams['font.size'] = 18 + title_text = format_arabic('احصائيات المهام') + plt.title(title_text, fontproperties=prop if prop else None) + + buffer = io.BytesIO() + plt.savefig(buffer, format='png', bbox_inches='tight', dpi=300) + plt.close('all') + + chart_image = base64.b64encode(buffer.getvalue()).decode('utf-8') + buffer.close() + + _logger.info(f"Generated chart image with base64 length: {len(chart_image)}") + + return chart_image diff --git a/odex25_project/project_base/static/src/fonts/DroidKufi-Bold.ttf b/odex25_project/project_base/static/src/fonts/DroidKufi-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..650919e2601dea5e83224668c74bb7e30a9e34bc GIT binary patch literal 81220 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 As{jB1 literal 0 HcmV?d00001