diff --git a/.github/workflows/production_pull_code.yml b/.github/workflows/production_pull_code.yml index 1384dbbf9..6254be019 100644 --- a/.github/workflows/production_pull_code.yml +++ b/.github/workflows/production_pull_code.yml @@ -26,7 +26,7 @@ jobs: run: | echo "** [INFO] Running on branch --> ${GITHUB_REF#refs/heads/}" mkdir -p ~/master_branch_sha - echo "${{ github.sha }}" > ~/master_branch_sha/${GITHUB_REF#refs/heads/} + echo "$(date '+%Y-%m-%d %H:%M:%S') - ${{ github.sha }}" >> ~/master_branch_sha/${GITHUB_REF#refs/heads/} sudo chmod +x ${{ secrets.CYBER_STANDARD_FOLDER_PATH }}/scripts/pull_code.sh sudo ${{ secrets.CYBER_STANDARD_FOLDER_PATH }}/scripts/pull_code.sh ${{ secrets.CYBER_PROJECT_USER }} ${{ secrets.CYBER_STANDARD_FOLDER_PATH }} ${{ secrets.CYBER_MASTER_SERVICE }} master ${GITHUB_REF#refs/heads/master_} ${GITHUB_REF#refs/heads/} ${{ secrets.GH_TOKEN }} @@ -40,7 +40,7 @@ jobs: run: | echo "** [INFO] Running on branch --> ${GITHUB_REF#refs/heads/}" mkdir -p ~/master_branch_sha - echo "${{ github.sha }}" > ~/master_branch_sha/${GITHUB_REF#refs/heads/} + echo "$(date '+%Y-%m-%d %H:%M:%S') - ${{ github.sha }}" >> ~/master_branch_sha/${GITHUB_REF#refs/heads/} sudo chmod +x ${{ secrets.ENSAN_STANDARD_FOLDER_PATH }}/scripts/pull_code.sh sudo ${{ secrets.ENSAN_STANDARD_FOLDER_PATH }}/scripts/pull_code.sh ${{ secrets.ENSAN_PROJECT_USER }} ${{ secrets.ENSAN_STANDARD_FOLDER_PATH }} ${{ secrets.ENSAN_MASTER_SERVICE }} master ${GITHUB_REF#refs/heads/master_} ${GITHUB_REF#refs/heads/} ${{ secrets.GH_TOKEN }} @@ -54,7 +54,7 @@ jobs: run: | echo "** [INFO] Running on branch --> ${GITHUB_REF#refs/heads/}" mkdir -p ~/master_branch_sha - echo "${{ github.sha }}" > ~/master_branch_sha/${GITHUB_REF#refs/heads/} + echo "$(date '+%Y-%m-%d %H:%M:%S') - ${{ github.sha }}" >> ~/master_branch_sha/${GITHUB_REF#refs/heads/} sudo chmod +x ${{ secrets.HELPDESK_STANDARD_FOLDER_PATH }}/scripts/pull_code.sh sudo ${{ secrets.HELPDESK_STANDARD_FOLDER_PATH }}/scripts/pull_code.sh ${{ secrets.HELPDESK_PROJECT_USER }} ${{ secrets.HELPDESK_STANDARD_FOLDER_PATH }} ${{ secrets.HELPDESK_MASTER_SERVICE }} master ${GITHUB_REF#refs/heads/master_} ${GITHUB_REF#refs/heads/} ${{ secrets.GH_TOKEN }} @@ -68,7 +68,7 @@ jobs: run: | echo "** [INFO] Running on branch --> ${GITHUB_REF#refs/heads/}" mkdir -p ~/master_branch_sha - echo "${{ github.sha }}" > ~/master_branch_sha/${GITHUB_REF#refs/heads/} + echo "$(date '+%Y-%m-%d %H:%M:%S') - ${{ github.sha }}" >> ~/master_branch_sha/${GITHUB_REF#refs/heads/} sudo chmod +x ${{ secrets.KAZ_STANDARD_FOLDER_PATH }}/scripts/pull_code.sh sudo ${{ secrets.KAZ_STANDARD_FOLDER_PATH }}/scripts/pull_code.sh ${{ secrets.KAZ_PROJECT_USER }} ${{ secrets.KAZ_STANDARD_FOLDER_PATH }} ${{ secrets.KAZ_MASTER_SERVICE }} master ${GITHUB_REF#refs/heads/master_} ${GITHUB_REF#refs/heads/} ${{ secrets.GH_TOKEN }} sudo systemctl restart odoo-server-stage.service @@ -83,7 +83,7 @@ jobs: run: | echo "** [INFO] Running on branch --> ${GITHUB_REF#refs/heads/}" mkdir -p ~/master_branch_sha - echo "${{ github.sha }}" > ~/master_branch_sha/${GITHUB_REF#refs/heads/} + echo "$(date '+%Y-%m-%d %H:%M:%S') - ${{ github.sha }}" >> ~/master_branch_sha/${GITHUB_REF#refs/heads/} sudo chmod +x ${{ secrets.TWAHOD_STANDARD_FOLDER_PATH }}/scripts/pull_code.sh sudo ${{ secrets.TWAHOD_STANDARD_FOLDER_PATH }}/scripts/pull_code.sh ${{ secrets.TWAHOD_PROJECT_USER }} ${{ secrets.TWAHOD_STANDARD_FOLDER_PATH }} ${{ secrets.TWAHOD_MASTER_SERVICE }} master ${GITHUB_REF#refs/heads/master_} ${GITHUB_REF#refs/heads/} ${{ secrets.GH_TOKEN }} @@ -97,7 +97,7 @@ jobs: run: | echo "** [INFO] Running on branch --> ${GITHUB_REF#refs/heads/}" mkdir -p ~/master_branch_sha - echo "${{ github.sha }}" > ~/master_branch_sha/${GITHUB_REF#refs/heads/} + echo "$(date '+%Y-%m-%d %H:%M:%S') - ${{ github.sha }}" >> ~/master_branch_sha/${GITHUB_REF#refs/heads/} sudo chmod +x ${{ secrets.EKRAM_STANDARD_FOLDER_PATH }}/scripts/pull_code.sh sudo ${{ secrets.EKRAM_STANDARD_FOLDER_PATH }}/scripts/pull_code.sh ${{ secrets.EKRAM_PROJECT_USER }} ${{ secrets.EKRAM_STANDARD_FOLDER_PATH }} ${{ secrets.EKRAM_MASTER_SERVICE }} master ${GITHUB_REF#refs/heads/master_} ${GITHUB_REF#refs/heads/} ${{ secrets.GH_TOKEN }} diff --git a/odex25_sales/crm_expense/models/hr_expence.py b/odex25_sales/crm_expense/models/hr_expence.py index 91dd1b5f2..0ea943cd3 100644 --- a/odex25_sales/crm_expense/models/hr_expence.py +++ b/odex25_sales/crm_expense/models/hr_expence.py @@ -1,9 +1,73 @@ # -*- coding: utf-8 -*- from odoo import api, fields, models - +from odoo.tools import float_round +from collections import defaultdict class HrExpense(models.Model): _inherit = "hr.expense" crm_lead_id = fields.Many2one('crm.lead', 'CRM Lead') + + + def action_move_create(self): + # Filter out refused expenses + expenses = self.filtered(lambda x: not x.is_refused) + + # Group expenses by their respective sheets + expenses_by_sheet = {} + for expense in expenses: + sheet = expense.sheet_id + if sheet not in expenses_by_sheet: + expenses_by_sheet[sheet] = self.env['hr.expense'] + expenses_by_sheet[sheet] += expense + + # Get moves and line values using the filtered expenses + move_group_by_sheet = expenses._get_account_move_by_sheet() + move_line_values_by_expense = expenses._get_account_move_line_values() + + # Process each expense sheet + for sheet, sheet_expenses in expenses_by_sheet.items(): + move = move_group_by_sheet[sheet.id] + + # Collect all move line values for this sheet + all_move_line_values = [] + for expense in sheet_expenses: + all_move_line_values.extend(move_line_values_by_expense.get(expense.id, [])) + + # Consolidate lines by account_id + grouped_lines = defaultdict(lambda: {'debit': 0.0, 'credit': 0.0, 'values': {}}) + for line in all_move_line_values: + account_id = line['account_id'] + grouped_lines[account_id]['debit'] += line.get('debit', 0.0) + grouped_lines[account_id]['credit'] += line.get('credit', 0.0) + if not grouped_lines[account_id]['values']: + grouped_lines[account_id]['values'] = { + k: v for k, v in line.items() if k not in ('debit', 'credit') + } + + # Prepare final move lines with consolidated values + final_move_lines = [] + for account_group in grouped_lines.values(): + line_data = account_group['values'].copy() + line_data['debit'] = float_round(account_group['debit'], precision_digits=2) + line_data['credit'] = float_round(account_group['credit'], precision_digits=2) + final_move_lines.append((0, 0, line_data)) + + # Update the move with new lines (clear existing first) + move.write({'line_ids': [(5, 0, 0)] + final_move_lines}) + + # Link the move to the expense sheet + sheet.write({'account_move_id': move.id}) + + # Mark as paid if all expenses are company-paid + if all(expense.payment_mode == 'company_account' for expense in sheet_expenses): + sheet.paid_expense_sheets() + + # Post all generated accounting moves + for move in move_group_by_sheet.values(): + move._post() + + return move_group_by_sheet + + diff --git a/odex25_sales/dev_membership/data/mail_template.xml b/odex25_sales/dev_membership/data/mail_template.xml index 41d7f8704..8d50b91b7 100644 --- a/odex25_sales/dev_membership/data/mail_template.xml +++ b/odex25_sales/dev_membership/data/mail_template.xml @@ -1,5 +1,7 @@ + + Membership Created 20 @@ -100,5 +102,5 @@ Your membership ${(object.name)} was expired on ${object.datetime_convert()} date. ]]> - + diff --git a/odex25_sales/dev_membership/i18n/ar_001.po b/odex25_sales/dev_membership/i18n/ar_001.po index 3a508bae9..4b97bdfb5 100644 --- a/odex25_sales/dev_membership/i18n/ar_001.po +++ b/odex25_sales/dev_membership/i18n/ar_001.po @@ -1577,6 +1577,7 @@ msgstr "طباعة المرشحين للعضوية" + #. module: dev_membership #: code:addons/dev_membership/models/res_partner.py:0 #, python-format @@ -1597,6 +1598,28 @@ msgid "Mobile number is required for members." msgstr "رقم الجوال مطلوب للأعضاء." +======= +#. module: dev_membership +#: code:addons/dev_membership/models/res_partner.py:10 +#, python-format +msgid "Mobile number must be unique." +msgstr "رقم الهاتف يجب أن يكون فريداً." + + +#. module: dev_membership +#: code:addons/dev_membership/models/res_partner.py:10 +#, python-format +msgid "ID number must be unique." +msgstr "رقم الهوية يجب أن يكون فريداً." + + + +#. module: dev_membership +#: code:addons/dev_membership/models/res_partner.py:10 +#, python-format +msgid "Mobile number must be exactly 10 digits." +msgstr "رقم الهاتف يجب أن يتكون من 10 أرقام بالضبط." + diff --git a/odex25_sales/dev_membership/models/membership_cancel_request.py b/odex25_sales/dev_membership/models/membership_cancel_request.py index 8a9802cd5..3f8490119 100644 --- a/odex25_sales/dev_membership/models/membership_cancel_request.py +++ b/odex25_sales/dev_membership/models/membership_cancel_request.py @@ -28,7 +28,8 @@ class MembershipCancellationRequest(models.Model): rec.membership_id.partner_id.memebership_end_date = request_date rec.membership_id.request_date = request_date rec.state = 'approved' - rec.membership_id.state = 'cancel' + if rec.membership_id.state=='active': + rec.membership_id.state = 'cancel' rec.membership_id.partner_id.check_active_membership() def action_reject(self): diff --git a/odex25_sales/dev_membership/models/res_partner.py b/odex25_sales/dev_membership/models/res_partner.py index 6223b7db9..e435cb7c0 100644 --- a/odex25_sales/dev_membership/models/res_partner.py +++ b/odex25_sales/dev_membership/models/res_partner.py @@ -19,7 +19,10 @@ _logger = logging.getLogger(__name__) class Partner(models.Model): _inherit = 'res.partner' - is_member = fields.Boolean(string='Is Member') + is_member = fields.Boolean(string='Is Member' ,default=False) + mobile = fields.Char(copy=False) + identification_number = fields.Char(copy=False) + membership_count = fields.Integer(string="Membership Count", compute="_get_membership_count") active_membership_id = fields.Many2one('dev.membership', string='Membership', compute='check_active_membership') membrship_level = fields.Many2one('membership.level',string='Membrship level',store=True,compute='_compute_membership_level') @@ -187,16 +190,22 @@ class Partner(models.Model): if record.is_member and not record.mobile: raise ValidationError(_("Mobile number is required for members.")) - @api.constrains('identification_number') + + + + + + @api.constrains('mobile', 'identification_number','email') def _check_unique_mobile_id(self): for record in self: - # if record.mobile: - # existing_mobile = self.search([ - # ('mobile', '=', record.mobile), - # ('id', '!=', record.id) - # ], limit=1) - # if existing_mobile : - # raise ValidationError(_("Mobile number must be unique.")) + if record.mobile: + existing_mobile = self.search([ + ('mobile', '=', record.mobile), + ('id', '!=', record.id) + ], limit=1) + if existing_mobile: + raise ValidationError(_("Mobile number must be unique.")) + if record.identification_number: existing_id = self.search([ ('identification_number', '=', record.identification_number), @@ -204,21 +213,26 @@ class Partner(models.Model): ], limit=1) if existing_id: raise ValidationError(_("ID number must be unique.")) - - # @api.constrains('mobile') - # def _check_mobile_format(self): - - # for record in self: - # print("Checking mobile format: %s", record.mobile) - # if record.mobile and (len(record.mobile) != 10 or not record.mobile.isdigit()) and not record.user_ids: - # raise ValidationError(_("Mobile number must be exactly 10 digits.")) - + + + + + @api.onchange('mobile') + def _check_mobile_format(self): + print("Test constraint running!") + for record in self: + print("Checking mobile format: %s", record.mobile) + if record.mobile and (len(record.mobile) != 10 or not record.mobile.isdigit()): + raise ValidationError(_("Mobile number must be exactly 10 digits.")) + + + + - \ No newline at end of file diff --git a/odex25_sales/dev_membership/views/dev_membership.xml b/odex25_sales/dev_membership/views/dev_membership.xml index 3ec72d24e..6d6c44264 100644 --- a/odex25_sales/dev_membership/views/dev_membership.xml +++ b/odex25_sales/dev_membership/views/dev_membership.xml @@ -48,7 +48,7 @@ attrs="{'invisible':['|',('membership_id','!=',False),('state','not in',['expire','active','cancel'])]}"/> - + diff --git a/odex25_sales/dev_membership/views/partner_extended.xml b/odex25_sales/dev_membership/views/partner_extended.xml index 8446de55f..f60385503 100644 --- a/odex25_sales/dev_membership/views/partner_extended.xml +++ b/odex25_sales/dev_membership/views/partner_extended.xml @@ -170,10 +170,7 @@ res.partner - - - - + @@ -241,6 +238,11 @@ {'required':[('is_member','=',True)]} + + {'required':[('is_member','=',True)]} + + + {'invisible':[('is_member','=',True)]} @@ -274,6 +276,9 @@ res.partner + + {'required':[('is_member','=',True)]} + @@ -292,6 +297,7 @@ res.partner.search res.partner + 20 diff --git a/odex25_sales/odex25_sale_subscription/data/mail_template_data.xml b/odex25_sales/odex25_sale_subscription/data/mail_template_data.xml index aea2f67be..8dd4934d9 100644 --- a/odex25_sales/odex25_sale_subscription/data/mail_template_data.xml +++ b/odex25_sales/odex25_sale_subscription/data/mail_template_data.xml @@ -1,5 +1,7 @@ - + + + Subscription: Payment Failure @@ -466,4 +468,6 @@ ${object.partner_id.lang} + + diff --git a/odex25_sales/odex25_website_event_track_gantt/i18n/ar.po b/odex25_sales/odex25_website_event_track_gantt/i18n/ar.po index 926c47a6b..7324d3bab 100644 --- a/odex25_sales/odex25_website_event_track_gantt/i18n/ar.po +++ b/odex25_sales/odex25_website_event_track_gantt/i18n/ar.po @@ -113,7 +113,6 @@ msgid "State" msgstr "المحافظة" #. module: odex25_website_event_track_gantt -#: model:ir.model.fields,field_description:odex25_website_event_track_gantt.field_event_event__state_id #: model_terms:ir.ui.view,arch_db:odex25_website_event_track_gantt.event_event_view_form msgid "Country" msgstr "الدولة" @@ -158,3 +157,29 @@ msgstr "أسم مسؤول التواصل" #: model:ir.model.fields,field_description:odex25_website_event_track_gantt.field_event_sponsor__contact_person msgid "Partner contact person" msgstr "أسم مسؤول التواصل عند الشريك" + +#. module: odex25_website_event_track_gantt +#: model:ir.model.fields,field_description:odex25_website_event_track_gantt.field_event_event__department_id +msgid "Parent Department" +msgstr "الإدارة" + +#. module: odex25_website_event_track_gantt +#: model:ir.model.fields,field_description:odex25_website_event_track_gantt.field_event_event__branch_name +msgid "Department Branch" +msgstr "الفرع التابع للإدارة" + +#. module: odex25_website_event_track_gantt +#: model:ir.model.fields,field_description:odex25_website_event_track_gantt.field_event_event__departments_id +msgid "Department" +msgstr "الإدارة التابع لها الفعالية" + +#. module: odex25_website_event_track_gantt +#: model:ir.model.fields,field_description:odex25_website_event_track_gantt.field_event_event__branchs_name +msgid "Departments Branch" +msgstr "الفرع التابع للإدارة" + +#. module: odex25_website_event_track_gantt +#: model:ir.model.fields,field_description:odex25_website_event_track_gantt.field_event_event__job_title +msgid "Job Position" +msgstr "المنصب الوظيفي" + diff --git a/odex25_sales/odex25_website_event_track_gantt/models/event_event.py b/odex25_sales/odex25_website_event_track_gantt/models/event_event.py index 0cde461b2..b748597d2 100644 --- a/odex25_sales/odex25_website_event_track_gantt/models/event_event.py +++ b/odex25_sales/odex25_website_event_track_gantt/models/event_event.py @@ -24,6 +24,39 @@ class Event(models.Model): state_id = fields.Many2one("res.country.state", string='State', ondelete='restrict', domain="[('country_id', '=?', country_id)]", related="address_id.state_id", readonly=True) country_id = fields.Many2one('res.country', string='Country', ondelete='restrict', related="address_id.country_id", readonly=True) + job_title = fields.Many2one( + string='Job Position', + related='user_id.employee_id.job_id', + store=True, + readonly=True + ) + + department_id = fields.Many2one( + 'hr.department', + string='Parent Department', + related='user_id.employee_id.department_id', + store=True, + readonly=True + ) + + branch_name = fields.Char( + string='Department Branch', + related='user_id.employee_id.department_id.branch_name.name', + store=True, + readonly=True + ) + + departments_id = fields.Many2one( + 'hr.department',string='Department' + + ) + branchs_name = fields.Char( + string='Departments Branch', + related='departments_id.branch_name.name', + store=True, + readonly=True + ) + @api.depends('date_begin', 'date_end') def _compute_remaining_time(self): diff --git a/odex25_sales/odex25_website_event_track_gantt/views/event_event_views.xml b/odex25_sales/odex25_website_event_track_gantt/views/event_event_views.xml index 4e24f73b3..e0bfb1651 100644 --- a/odex25_sales/odex25_website_event_track_gantt/views/event_event_views.xml +++ b/odex25_sales/odex25_website_event_track_gantt/views/event_event_views.xml @@ -21,9 +21,21 @@ - + + + + + + + + + + + + + {'show_address': 1, 'default_is_event_address': True,'default_is_company': True} diff --git a/odex25_sales/odex25_website_event_track_gantt/views/res_partner_views.xml b/odex25_sales/odex25_website_event_track_gantt/views/res_partner_views.xml index 7f31736b7..d9d356143 100644 --- a/odex25_sales/odex25_website_event_track_gantt/views/res_partner_views.xml +++ b/odex25_sales/odex25_website_event_track_gantt/views/res_partner_views.xml @@ -6,11 +6,16 @@ 10 - - - - - + + + + + + + + + + {'required': [('is_sponsor', '=', True)],'invisible':[('company_type','!=','company')]} diff --git a/odex25_sales/sale_custom/data/mail_data.xml b/odex25_sales/sale_custom/data/mail_data.xml index 49cafa3cf..6ba09fd33 100644 --- a/odex25_sales/sale_custom/data/mail_data.xml +++ b/odex25_sales/sale_custom/data/mail_data.xml @@ -1,6 +1,7 @@ - + +
Your membership ${(object.name)} was expired on ${object.datetime_convert()} date.