Merge branch 'dev_odex25_sales' into chnage-in-membership-system

This commit is contained in:
ahmed-nouri051 2025-06-03 15:45:13 +02:00 committed by GitHub
commit 7040140f56
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 232 additions and 42 deletions

View File

@ -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 }}

View File

@ -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

View File

@ -1,5 +1,7 @@
<?xml version="1.0" ?>
<odoo>
<data noupdate="1">
<record id="mt_dev_membership_created" model="mail.message.subtype">
<field name="name">Membership Created</field>
<field name="sequence">20</field>
@ -100,5 +102,5 @@
<p>Your membership <b>${(object.name)}</b> was expired on <b>${object.datetime_convert()}</b> date.</p>
]]></field>
</record>
</data>
</odoo>

View File

@ -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 أرقام بالضبط."

View File

@ -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):

View File

@ -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."))

View File

@ -48,7 +48,7 @@
attrs="{'invisible':['|',('membership_id','!=',False),('state','not in',['expire','active','cancel'])]}"/>
<button name="%(dev_membership.membership_request_cancel_wizard_action)d" type="action" string="Cancel"
attrs="{'invisible': ([('state', 'not in', ['active','expire'])])}"/>
<field name="state" widget="statusbar" statusbar_visible="draft,confirm,activeexpire,cancel"/>
<field name="state" widget="statusbar" statusbar_visible="draft,confirm,active,expire,cancel"/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">

View File

@ -170,10 +170,7 @@
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='title']" position="replace"></xpath>
<xpath expr="//sheet/group/group[2]/field[@name='mobile']" position="before">
<field name="is_member" />
@ -241,6 +238,11 @@
<xpath expr="//field[@name='function']" position="attributes">
<attribute name="attrs">{'required':[('is_member','=',True)]}</attribute>
</xpath>
<xpath expr="//field[@name='mobile']" position="attributes">
<attribute name="attrs">{'required':[('is_member','=',True)]}</attribute>
</xpath>
<xpath expr="//field[@name='company_type']" position="attributes">
<attribute name="attrs">{'invisible':[('is_member','=',True)]}</attribute>
</xpath>
@ -274,6 +276,9 @@
<field name="model">res.partner</field>
<field name="inherit_id" ref="partner_custom.partner_view_property_cusotm"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='identification_number']" position="attributes">
<attribute name="attrs">{'required':[('is_member','=',True)]}</attribute>
</xpath>
<xpath expr="//group[@name='identifcation_info']" position="after">
<group>
<field name="gender" attrs="{'required':[('is_member','=',True)]}"/>
@ -292,6 +297,7 @@
<record id="view_search_res_partner" model="ir.ui.view">
<field name="name">res.partner.search</field>
<field name="model">res.partner</field>
<field name="priority">20</field>
<field name="arch" type="xml">
<search string="Res Partner Search">
<field name="name"/>

View File

@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<odoo >
<data noupdate="1">
<!-- Recurrent payment emails -->
<record id="email_payment_close" model="mail.template">
<field name="name">Subscription: Payment Failure</field>
@ -466,4 +468,6 @@
<field name="lang">${object.partner_id.lang}</field>
<field name="auto_delete" eval="True"/>
</record>
</data >
</odoo>

View File

@ -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 "المنصب الوظيفي"

View File

@ -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):

View File

@ -21,9 +21,21 @@
<field name="remaining_days"/>
<field name="remaining_hours"/>
</xpath>
<xpath expr="//field[@name='tag_ids']" position="after">
<xpath expr="//field[@name='tag_ids']" position="after">
<field name="Description_event"/>
</xpath>
<xpath expr="//field[@name='user_id']" position="after">
<field name="job_title"/>
<field name="department_id"/>
<field name="branch_name"/>
</xpath>
<xpath expr="//field[@name='event_type_id']" position="before">
<field name="departments_id"/>
<field name="branchs_name"/>
</xpath>
<xpath expr="//field[@name='address_id']" position="attributes">
<attribute name="context">{'show_address': 1, 'default_is_event_address': True,'default_is_company':
True}

View File

@ -6,11 +6,16 @@
<field name="priority">10</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='category_id']" position="after">
<field name="is_event_address" readonly="1"/>
<field name="is_organizer" readonly="1"/>
<field name="is_sponsor" readonly="1"/>
</xpath>
<xpath expr="//page[5]" position="after">
<page name="event_info" string="بيانات الفعالية" groups="event.group_event_manager">
<group>
<field name="is_event_address" readonly="1"/>
<field name="is_organizer" readonly="1"/>
<field name="is_sponsor" readonly="1"/>
</group>
</page>
</xpath>
<xpath expr="//field[@name='website']" position="attributes">
<attribute name="attrs">{'required': [('is_sponsor', '=',
True)],'invisible':[('company_type','!=','company')]}

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<data noupdate="1">
<record id="sale.email_template_edi_sale" model="mail.template">
<field name="body_html" type="html">
<div style="margin: 0px; padding: 0px;">