Merge branch 'dev_odex25_ensan' of https://github.com/expsa/odex25-standard-modules into partial_extend_payment

This commit is contained in:
Nossibaelhadi 2025-11-19 13:22:35 +03:00
commit c159c7554e
24 changed files with 602 additions and 124 deletions

View File

@ -1140,6 +1140,7 @@ msgstr "نموذج الأنشطة"
#: model:ir.model.fields,field_description:odex_benefit.field_services_settings__active
#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__active
#: model:ir.model.fields,field_description:odex_benefit.field_visits_types__active
#: model:ir.model.fields,field_description:odex_benefit.field_return_reason__active
msgid "Active"
msgstr "نشط"
@ -2741,6 +2742,7 @@ msgstr "بإمكانه النشر "
#: model_terms:ir.ui.view,arch_db:odex_benefit.benefit_zkat_form
#: model_terms:ir.ui.view,arch_db:odex_benefit.generate_reports_view_form
#: model_terms:ir.ui.view,arch_db:odex_benefit.receive_food_basket_form
#: model_terms:ir.ui.view,arch_db:odex_benefit.return_reason_wizard_form
#: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_form
#: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_search
#: model_terms:ir.ui.view,arch_db:odex_benefit.view_family_bank_report_wizard_form
@ -3187,6 +3189,7 @@ msgid "Configuration"
msgstr "إعدادات ملف الأسرة"
#. module: odex_benefit
#: model_terms:ir.ui.view,arch_db:odex_benefit.return_reason_wizard_form
#: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_form
#: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_search
#: model_terms:ir.ui.view,arch_db:odex_benefit.view_exchange_order_wizard_form
@ -8418,6 +8421,7 @@ msgstr "نهاية الوقت المعين للنشاط"
#: model:ir.model.fields,field_description:odex_benefit.field_visit_location__benefit_name
#: model:ir.model.fields,field_description:odex_benefit.field_visits_types__name
#: model_terms:ir.ui.view,arch_db:odex_benefit.benefits_representative_view_form
#: model:ir.model.fields,field_description:odex_benefit.field_return_reason__name
#: model_terms:ir.ui.view,arch_db:odex_benefit.external_benefit_view_form
#: model_terms:ir.ui.view,arch_db:odex_benefit.family_member_form
#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_form
@ -14419,6 +14423,11 @@ msgstr "أمر الصرف"
msgid "Payment Order"
msgstr "أمر الصرف"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_service_request__payment_order_count
msgid "Number of Payment Orders"
msgstr "عدد أوامر الصرف"
#. module: odex_benefit
#: model_terms:ir.ui.view,arch_db:odex_benefit.seasonal_service_form_view
#: model:ir.model.fields,field_description:odex_benefit.field_seasonal_service__benefit_ids
@ -14694,6 +14703,7 @@ msgstr "هل أنت متأكد أنك تريد الإرجاع للاخصائي؟
#. module: odex_benefit
#: code:addons/odex_benefit/models/benefit.py:0
#: model:ir.model,name:odex_benefit.model_entity_return_reason_wizard
#: model:ir.model,name:odex_benefit.model_return_reason_wizard
#, python-format
msgid "Return Reason Wizard"
msgstr "سبب الإرجاع"
@ -14701,9 +14711,16 @@ msgstr "سبب الإرجاع"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_entity_return_reason_wizard__suspend_reason_id
#: model:ir.model.fields,field_description:odex_benefit.field_suspend_reason__is_return_reason
#: model:ir.model.fields,field_description:odex_benefit.field_return_reason_wizard__return_reason_id
msgid "Return Reason"
msgstr "سبب الإرجاع"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expense_line__return_reason_id
#: model:ir.model.fields,field_description:odex_benefit.field_service_request__return_reason_id
msgid "Return Reason"
msgstr "سبب إرجاع البنك"
#. module: odex_benefit
#: model_terms:ir.ui.view,arch_db:odex_benefit.view_entity_return_reason_wizard_form
msgid "Retrun"
@ -17051,6 +17068,8 @@ msgstr "يرجى اختيار دفتر اليومية قبل إنشاء القي
#: model_terms:ir.ui.view,arch_db:odex_benefit.payment_orders_tree
#: model_terms:ir.ui.view,arch_db:odex_benefit.view_family_bank_report_wizard_form
#: model:ir.model.fields,field_description:odex_benefit.field_family_bank_report_wizard__payment_order_ids
#: model:ir.model.fields,field_description:odex_benefit.field_service_request__payment_order_ids
#: model_terms:ir.ui.view,arch_db:odex_benefit.service_request_form
#, python-format
msgid "Payment Orders"
msgstr "أوامر صرف الخدمات"
@ -17255,3 +17274,92 @@ msgid ""
msgstr ""
"<i class=\"fa fa-calculator text-success\" style=\"font-size: 20px; margin-bottom: 4px;\"/>\n"
" <span style=\"font-size: 12px; color: #555;\">الإجمالي</span>"
#. module: odex_benefit
#: model:ir.ui.menu,name:odex_benefit.menu_accounting_others
msgid "Others"
msgstr "اخرى"
#. module: odex_benefit
#: model:ir.actions.act_window,name:odex_benefit.return_reason_action
#: model:ir.model,name:odex_benefit.model_return_reason
#: model:ir.ui.menu,name:odex_benefit.menu_return_reason
msgid "Return Reasons"
msgstr "أسباب الإرجاع"
#. module: odex_benefit
#: model_terms:ir.actions.act_window,help:odex_benefit.return_reason_action
msgid "Create New Return Reason"
msgstr "إنشاء سبب إرجاع جديد"
#. module: odex_benefit
#: code:addons/odex_benefit/models/family_expense_line.py:0
#: code:addons/odex_benefit/models/service_request.py:0
#: model_terms:ir.ui.view,arch_db:odex_benefit.payment_orders_form
#: model_terms:ir.ui.view,arch_db:odex_benefit.return_reason_wizard_form
#, python-format
msgid "Bank Return"
msgstr "رجيع البنك"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expense_line__is_return
msgid "Is Returned?"
msgstr "هل هو رجيع؟"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_return_reason_wizard__line_id
msgid "Line ID"
msgstr "رقم"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_return_reason_wizard__line_model
msgid "Line Model"
msgstr "النموذج"
#. module: odex_benefit
#: model:ir.model.fields.selection,name:odex_benefit.selection__service_request__state__return_to_bank
msgid "Return to Bank"
msgstr "رجيع البنك"
#. module: odex_benefit
#: model_terms:ir.ui.view,arch_db:odex_benefit.service_request_form
msgid "Processed"
msgstr "تمت المعالجة"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__is_return_calculation
msgid "Return Calculation Mode"
msgstr "حساب الرجيع"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__return_expense_line_ids
msgid "Selected Return Lines"
msgstr "سطور الرجيع"
#. module: odex_benefit
#: code:addons/odex_benefit/models/family_expense.py:0
#, python-format
msgid "Please select at least one return line to calculate."
msgstr "يرجى اختيار سطر رجيع واحد على الأقل للحساب."
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expense_line__return_confirm_id
msgid "Return Confirm"
msgstr "تأكيد الرجيع"
#. module: odex_benefit
#: model:ir.model.fields,help:odex_benefit.field_confirm_benefit_expense__is_return_calculation
msgid ""
"Enable to calculate returned amounts instead of regular monthly expense."
msgstr "تمكين لحساب المبالغ المرجعة بدلاً من المصروف الشهري العادي."
#. module: odex_benefit
#: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_form
msgid "Return Lines"
msgstr "سطور الرجيع"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__line_domain_ids
msgid "Return Line Domain"
msgstr "مجال سطر الرجيع"

View File

@ -707,7 +707,7 @@ class SuspendReason(models.Model):
_name = 'suspend.reason'
_description = "Suspend - Reason"
name = fields.Char(string="Name")
name = fields.Char(string="Name", required=True)
is_stop_reason = fields.Boolean(string="Stop Reason",default=False)
is_reject_reason = fields.Boolean(string="Reject Reason",default=False)
is_return_reason = fields.Boolean(string="Return Reason",default=False)
@ -715,6 +715,13 @@ class SuspendReason(models.Model):
is_incomplete_visit_reason = fields.Boolean(string="Incomplete Visit Reason",default=False)
active = fields.Boolean(default=True)
class ReturnReason(models.Model):
_name = "return.reason"
_description = "Return Reasons"
name = fields.Char(string="Name", required=True)
active = fields.Boolean(string="Active", default=True)
class BranchSettings(models.Model):
_name = 'branch.settings'
_description = "Branch Settings"

View File

@ -88,6 +88,15 @@ class ConfirmBenefitExpense(models.Model):
member_count_othaim = fields.Integer(string="Member Count (Othaim)", compute='_get_family_monthly_values',
store=True, )
is_return_calculation = fields.Boolean(string="Return Calculation Mode", default=False,
help="Enable to calculate returned amounts instead of regular monthly expense."
)
return_expense_line_ids = fields.One2many(comodel_name='benefit.expense.line', inverse_name='return_confirm_id',
string="Selected Return Lines",
domain="[('is_return', '=', True)]", )
line_domain_ids = fields.Many2many(comodel_name='benefit.expense.line', compute='_compute_domain_ids',
string="Return Line Domain",
)
@api.depends('payment_order_id', 'payment_order_id.state', 'move_id', 'move_id.state')
def _compute_payment_move_state(self):
@ -148,6 +157,29 @@ class ConfirmBenefitExpense(models.Model):
}
line.write(vals)
def _calculate_return_lines(self):
self.ensure_one()
return_lines = self.return_expense_line_ids
if not return_lines:
raise UserError(_("Please select at least one return line to calculate."))
lines = []
for line in return_lines:
lines.append((0, 0, {
'family_id': line.family_id.id,
'branch_id': line.branch_id.id,
'family_category_id': line.family_category_id.id,
'meal_card': line.meal_card,
'benefit_member_count': line.benefit_member_count,
'start_date': self.start_date,
'end_date': self.end_date,
'family_monthly_income': line.family_monthly_income,
'family_monthly_meals': line.family_monthly_meals,
'family_monthly_clotting': line.family_monthly_clotting,
'family_monthly_othaime': 0,
}))
self.benefit_expense_line_ids = lines
def action_calculate(self):
for rec in self:
if rec.state != 'draft':
@ -160,6 +192,9 @@ class ConfirmBenefitExpense(models.Model):
if not rec.cash_expense and not rec.meal_expense and not rec.cloth_expense:
raise UserError(_("At least one expense type should be selected."))
if rec.is_return_calculation:
rec._calculate_return_lines()
else:
rec.benefit_expense_line_ids.unlink()
lines = []
for fam in families:
@ -181,11 +216,28 @@ class ConfirmBenefitExpense(models.Model):
raise UserError(_("You can only recalculate when status is 'Calculated'."))
rec._update_benefit_expense_lines()
@api.depends('branch_custom_ids', 'start_date', 'end_date')
@api.depends('is_return_calculation', 'branch_custom_ids', 'start_date', 'end_date')
def _compute_domain_ids(self):
for rec in self:
# Define base domain for family selection
Line = self.env['benefit.expense.line']
validation_setting = self.env["family.validation.setting"].search([], limit=1)
if rec.is_return_calculation:
domain = [
('start_date', '<=', rec.end_date),
('end_date', '>=', rec.start_date),
('is_return', '=', True),
('return_reason_id', '!=', False),
('return_confirm_id', '=', False),
]
if rec.branch_custom_ids:
domain.append(('branch_id', 'in', rec.branch_custom_ids.ids))
return_lines = Line.search(domain)
rec.line_domain_ids = return_lines
rec.family_domain_ids = return_lines.mapped('family_id')
else:
# Define base domain for family selection
base_domain = ['|', ('state', '=', 'second_approve'), '&',
('state', 'in', ('waiting_approve', 'first_approve')), ('action_type', '=', 'suspended')]
if rec.branch_custom_ids:
@ -206,6 +258,7 @@ class ConfirmBenefitExpense(models.Model):
base_domain.append(('id', 'not in', conflicting_family_ids))
rec.family_domain_ids = self.env['grant.benefit'].search(base_domain)
rec.line_domain_ids = self.env['benefit.expense.line'].browse([])
@api.onchange('branch_custom_ids')
def _onchange_branch_custom_ids(self):
@ -320,6 +373,7 @@ class ConfirmBenefitExpense(models.Model):
})
rec.payment_order_id = payment_order
if not rec.is_return_calculation:
# Create Vendor Bill for Meal Card Invoice(othaime)
account_id = validation_setting.meal_expense_account_id
invoice_lines = []

View File

@ -12,6 +12,7 @@ class BenefitExpenseLine(models.Model):
confirm_expense_id = fields.Many2one(comodel_name='confirm.benefit.expense', string='Confirm Benefit Expense',
ondelete='cascade')
return_confirm_id = fields.Many2one('confirm.benefit.expense', string="Return Confirm", ondelete="set null", )
family_id = fields.Many2one(comodel_name='grant.benefit', string='Family', required=True)
branch_id = fields.Many2one(comodel_name='branch.settings', string='Branch')
family_category_id = fields.Many2one(comodel_name='benefit.category', string='Family Category')
@ -25,8 +26,24 @@ class BenefitExpenseLine(models.Model):
start_date = fields.Date(string='Start Date', )
end_date = fields.Date(string='End Date', )
payment_order_id = fields.Many2one('payment.orders', string='Payment Order', ondelete="set null", copy=False)
return_reason_id = fields.Many2one("return.reason", string="Return Reason")
is_return = fields.Boolean(string="Is Returned?", default=False)
@api.depends('family_monthly_income', 'family_monthly_clotting', 'family_monthly_meals')
def _compute_total_family_expenses(self):
for rec in self:
rec.total_family_expenses = rec.family_monthly_income + rec.family_monthly_meals + rec.family_monthly_clotting
def action_return_bank(self):
self.ensure_one()
return {
'name': _("Bank Return"),
'type': 'ir.actions.act_window',
'res_model': 'return.reason.wizard',
'view_mode': 'form',
'target': 'new',
'context': {
'default_line_id': self.id,
'default_line_model': 'benefit.expense.line',
}
}

View File

@ -22,7 +22,10 @@ class PaymentOrders(models.Model):
compute='_compute_service_type_id',
inverse='_inverse_service_type_id',
store=True)
service_requests_ids = fields.One2many('service.request', 'payment_order_id', string='Service Requests')
service_requests_ids = fields.Many2many(comodel_name='service.request',
relation='service_request_payment_order_rel',
column1='payment_order_id', column2='service_request_id',
string='Service Requests', )
benefit_expense_line_ids = fields.One2many('benefit.expense.line', 'payment_order_id',
string='Benefit Expense Lines')
seasonal_requests_ids = fields.One2many('seasonal.service', 'payment_order_id', string='Seasonal Requests')
@ -78,7 +81,6 @@ class PaymentOrders(models.Model):
rec.state = 'waiting_gm'
def create_entry(self):
#todo add invoice type to the move
for rec in self:
if not rec.journal_id:
raise UserError(_("Please select a journal before creating the entry."))
@ -233,7 +235,7 @@ class PaymentOrders(models.Model):
'credit': 0.0,
}
)
total_credit += request.aid_amount
total_credit += request.requested_service_amount
elif self.type == 'benefit_expense':
validation_setting = self.env["family.validation.setting"].search([], limit=1)
for line in self.benefit_expense_line_ids:

View File

@ -121,7 +121,11 @@ class ServiceRequest(models.Model):
# maintenance_items_id = fields.Many2one('home.maintenance.lines', string="Maintenance Items")
maintenance_items_ids = fields.One2many('home.maintenance.items', 'service_request_id',
string="Maintenance Items", )
payment_order_id = fields.Many2one('payment.orders', string='Payment Order', ondelete="set null", copy=False)
payment_order_ids = fields.Many2many(comodel_name='payment.orders', relation='service_request_payment_order_rel',
column1='service_request_id',
column2='payment_order_id', string='Payment Orders', copy=False, )
payment_order_id = fields.Many2one('payment.orders', string='Payment Order', copy=False)
payment_order_count = fields.Integer(compute='_compute_payment_order', string='Number of Payment Orders')
is_payment_order_done = fields.Boolean(string='Is Payment Order Done?')
aid_amount = fields.Float(string='Aid Amount', compute='_get_aid_amount')
# Fields for alternative house
@ -172,6 +176,7 @@ class ServiceRequest(models.Model):
('projects_department', 'Waiting Projects Department'),
('gm_assistant', 'Waiting Assistant General Manager'),
('accounting_approve', 'Accounting Approve'),
('return_to_bank', 'Return to Bank'),
('approval_of_beneficiary_services', 'Approval of beneficiary services'),
('send_request_to_supplier', 'Send Request To Supplier'),
('family_received_device', 'Family Received Device'),
@ -220,6 +225,15 @@ class ServiceRequest(models.Model):
('waiting', 'Waiting Payment'),
('done', 'Done Payment'), ], copy=False, compute="_compute_payment_order_state", store=True)
total_moves = fields.Integer(string="Total Move", compute='_get_total_move_lines')
return_reason_id = fields.Many2one("return.reason", string="Return Reason")
@api.depends('payment_order_ids')
def _compute_payment_order(self):
for rec in self:
if rec.payment_order_ids:
rec.payment_order_count = len(rec.payment_order_ids)
else:
rec.payment_order_count = 0
@api.depends('payment_order_id', 'payment_order_id.state', 'vendor_bill', 'vendor_bill.state')
def _compute_payment_order_state(self):
@ -229,6 +243,7 @@ class ServiceRequest(models.Model):
if rec.payment_order_id.state == "done":
payment_order_state = "done"
rec.service_approval_date = fields.Datetime.now()
if rec.state == 'accounting_approve':
rec.state = 'send_request_to_supplier'
rec.is_payment_order_done = True
else:
@ -241,6 +256,24 @@ class ServiceRequest(models.Model):
payment_order_state = "waiting"
rec.payment_order_state = payment_order_state
def action_return_bank(self):
self.ensure_one()
return {
'name': _("Bank Return"),
'type': 'ir.actions.act_window',
'res_model': 'return.reason.wizard',
'view_mode': 'form',
'target': 'new',
'context': {
'default_line_id': self.id,
'default_line_model': 'service.request',
}
}
def action_processed(self):
for record in self:
record.state = 'accounting_approve'
@api.depends('requested_service_amount', 'service_max_amount')
def _get_money_for_payment_is_appearance(self):
for rec in self:
@ -1016,12 +1049,17 @@ class ServiceRequest(models.Model):
"• Not be linked to any payment order"
) % names)
self.env['payment.orders'].create({
payment_order = self.env['payment.orders'].create({
'state': 'draft',
'accountant_id': service_cats.accountant_id.id,
'service_requests_ids': [(6, 0, self.ids)],
'type': 'services',
})
self.write({
'payment_order_ids': [(4, payment_order.id)],
'payment_order_id': payment_order.id,
})
elif service_cats.payment_method == "invoice":
invalid_records = self.filtered(
lambda r: r.state != 'accounting_approve'
@ -1061,7 +1099,7 @@ class ServiceRequest(models.Model):
def _get_total_move_lines(self):
for rec in self:
if self.service_cat.payment_method == "payment_order":
moves = self.payment_order_id.move_id
moves = rec.payment_order_ids.mapped('move_id')
elif self.service_cat.payment_method == "invoice":
moves = self.vendor_bill
@ -1069,7 +1107,7 @@ class ServiceRequest(models.Model):
def action_open_related_move_records(self):
if self.service_cat.payment_method == "payment_order":
moves = self.payment_order_id.move_id.ids
moves = self.payment_order_ids.mapped('move_id')
elif self.service_cat.payment_method == "invoice":
moves = self.vendor_bill.ids
@ -1078,5 +1116,19 @@ class ServiceRequest(models.Model):
'type': 'ir.actions.act_window',
'res_model': 'account.move',
'view_mode': 'tree,form',
'domain': [('id', 'in', moves)],
'domain': [('id', 'in', moves.ids)],
}
def action_open_payment_orders(self):
self.ensure_one()
if not self.payment_order_ids:
raise UserError(_("No payment orders are linked to this request."))
return {
'name': _('Payment Orders'),
'type': 'ir.actions.act_window',
'res_model': 'payment.orders',
'view_mode': 'tree,form',
'domain': [('id', 'in', self.payment_order_ids.ids)],
'context': {'create': False},
}

View File

@ -168,3 +168,5 @@ access_grant_benefit_account_move_line,access_grant_benefit_account_move_line,mo
access_grant_benefit_account_move,access_grant_benefit_account_move,model_account_move,odex_benefit.group_benefit_info,1,0,0,0
access_benefit_expense_line,access_benefit_expense_line,model_benefit_expense_line,base.group_user,1,1,1,1
access_family_bank_report_wizard,access_family_bank_report_wizard,model_family_bank_report_wizard,base.group_user,1,1,1,1
access_return_reason,access_return_reason,model_return_reason,base.group_user,1,1,1,1
access_return_reason_wizard,access_return_reason_wizard,model_return_reason_wizard,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
168 access_grant_benefit_account_move access_grant_benefit_account_move model_account_move odex_benefit.group_benefit_info 1 0 0 0
169 access_benefit_expense_line access_benefit_expense_line model_benefit_expense_line base.group_user 1 1 1 1
170 access_family_bank_report_wizard access_family_bank_report_wizard model_family_bank_report_wizard base.group_user 1 1 1 1
171 access_return_reason access_return_reason model_return_reason base.group_user 1 1 1 1
172 access_return_reason_wizard access_return_reason_wizard model_return_reason_wizard base.group_user 1 1 1 1

View File

@ -295,6 +295,15 @@
</p>
</field>
</record>
<record id="return_reason_action" model="ir.actions.act_window">
<field name="name">Return Reasons</field>
<field name="res_model">return.reason</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">Create New Return Reason
</p>
</field>
</record>
<record model="ir.actions.act_window" id="domestic_labor_action">
<field name="name">The Domestic Labor</field>
<field name="res_model">domestic.labor</field>
@ -1048,48 +1057,16 @@
<menuitem id="seasonal_service_menu" name="Seasonal Services"
parent="odex_benefit.benefit_services" sequence="3" action="seasonal_service_action" />
<menuitem id="menu_refuse_reason" name="Service Refuse Reasons" parent="menu_benefits_config_others" action="action_refuse_reason"/>
<!-- <menuitem id="benefit_need_menu" name="Benefit Need" sequence="1"-->
<!-- parent="odex_benefit.benefit_services" action="benefit_need_action"/>-->
<!-- <menuitem id="benefit_zkat_main_menu" name="Benefit Zkat" sequence="2"-->
<!-- parent="odex_benefit.benefit_services"/>-->
<!-- <menuitem id="benefit_receive_zkat_menu" name="Benefit Receive Zkat" sequence="1"-->
<!-- parent="odex_benefit.benefit_zkat_main_menu" action="benefit_receive_zkat_action"/>-->
<!-- <menuitem id="benefit_zkat_menu" name="Benefit Zkat" sequence="2"-->
<!-- parent="odex_benefit.benefit_zkat_main_menu" action="benefit_zkat_action"/>-->
<!-- <menuitem id="food_basket_main_menu" name="Benefit Food Basket" sequence="3"-->
<!-- parent="odex_benefit.benefit_services"/>-->
<!-- <menuitem id="receive_food_basket_menu" name="receive Food Basket" sequence="1"-->
<!-- parent="odex_benefit.food_basket_main_menu" action="receive_food_basket_action"/>-->
<!-- <menuitem id="benefit_food_basket_menu" name="Benefit Food Basket" sequence="2"-->
<!-- parent="odex_benefit.food_basket_main_menu" action="benefit_food_basket_action"/>-->
<!-- <menuitem id="benefit_food_surplus_menu" name="Food Surplus" sequence="4"-->
<!-- parent="odex_benefit.benefit_services" action="benefit_food_surplus_action"/>-->
<!-- <menuitem id="benefit_appliances_furniture_main_menu" name="Appliances Furniture" sequence="5"-->
<!-- parent="odex_benefit.benefit_services"/>-->
<!-- <menuitem id="receive_appliances_furniture_menu" name="Receive Appliances Furniture" sequence="1"-->
<!-- parent="odex_benefit.benefit_appliances_furniture_main_menu"-->
<!-- action="receive_appliances_furniture_action"/>-->
<!-- <menuitem id="benefit_appliances_furniture_menu" name="Appliances Furniture" sequence="2"-->
<!-- parent="odex_benefit.benefit_appliances_furniture_main_menu"-->
<!-- action="benefit_appliances_furniture_action"/>-->
<!-- <menuitem id="loans_benefit_main_menu" name="Benefit Loans" sequence="6"-->
<!-- parent="odex_benefit.benefit_services"/>-->
<!-- <menuitem id="benefit_loans_menu" name="Benefit Loans" sequence="1"-->
<!-- parent="odex_benefit.loans_benefit_main_menu" action="benefit_benefit_loans_action"/>-->
<!-- <menuitem id="receive_benefit_loans_menu" name="Receive Benefit Loans" sequence="2"-->
<!-- parent="odex_benefit.loans_benefit_main_menu" action="receive_benefit_loans_action"/>-->
<!-- <menuitem id="benefit_club_menu" name="Benefit Club" sequence="7"-->
<!-- parent="odex_benefit.benefit_services" action="benefit_club_action"/>-->
<!-- <menuitem id='benefit_extra_tools' name='Extra Tools' parent='odex_benefit.benefit_services'-->
<!-- sequence="8"/>-->
<!--###########################################################-->
<!--Extra tools-->
<!--###########################################################-->
<!-- <menuitem id="food_surplus_type_menu" name="Food Surplus Type"-->
<!-- parent="benefit_extra_tools" action="food_surplus_type_action" sequence="5"/>-->
<!-- <menuitem id="benefit_programs_menu" name="benefit Club programs"-->
<!-- parent="benefit_extra_tools" action="club_programs_action" sequence="6"/>-->
<menuitem name="Others"
id="menu_accounting_others"
parent="account.menu_finance_configuration"
sequence="15"
/>
<menuitem name="Return Reasons"
id="menu_return_reason"
parent="menu_accounting_others"
action="return_reason_action"
/>
</data>
</odoo>

View File

@ -1417,5 +1417,30 @@
</tree>
</field>
</record>
<record id="return_reason_form" model="ir.ui.view">
<field name="name">return.reason.form.view</field>
<field name="model">return.reason</field>
<field name="arch" type="xml">
<form>
<sheet>
<div class="oe_title">
<h1>
<field name="name"/>
</h1>
</div>
</sheet>
</form>
</field>
</record>
<record id="return_reason_tree" model="ir.ui.view">
<field name="name">return.reason.tree.view</field>
<field name="model">return.reason</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
</tree>
</field>
</record>
</data>
</odoo>

View File

@ -18,6 +18,8 @@
<field name="family_monthly_clotting"/>
<field name="family_monthly_othaime"/>
<field name="total_family_expenses"/>
<field name="is_return" optional="hide"/>
<field name="return_reason_id" optional="hide"/>
<field name="payment_order_id" invisible="1"/>
</tree>
</field>
@ -38,6 +40,8 @@
<field name="meal_card"/>
<field name="benefit_member_count"/>
<field name="payment_order_id" invisible="1"/>
<field name="is_return" attrs="{'invisible': [('is_return', '=', False)]}"/>
<field name="return_reason_id" attrs="{'invisible': [('return_reason_id', '=', False)]}"/>
</group>
<group>
<field name="family_monthly_income"/>

View File

@ -121,6 +121,8 @@
<field name="end_date"
attrs="{'readonly':[('state', '!=', 'draft')]}"/>
</div>
<field name="is_return_calculation" widget="boolean_toggle"
attrs="{'readonly':[('state', '!=', 'draft')]}"/>
<field name="branch_custom_ids" required="1"
widget="many2many_tags" attrs="{'readonly':[('state', '!=', 'draft')]}"
/>
@ -138,6 +140,7 @@
<field name="company_id" groups="base.group_multi_company"/>
<field name="currency_id" invisible="1" groups="base.group_multi_currency"/>
<field name="available_payment_method_line_ids" invisible="1"/>
<field name="line_domain_ids" invisible="1"/>
</group>
</group>
<!-- Notebook with Families page -->
@ -257,11 +260,13 @@
attrs="{'column_invisible': [('parent.cloth_expense', '!=', True)]}"/>
<field name="total_family_expenses"/>
<field name="payment_order_id" invisible="1"/>
<field name="is_return" optional="hide"/>
<field name="return_reason_id" optional="hide"/>
</tree>
</field>
</page>
<page string="Othaim Line"
attrs="{'invisible': ['|',('state', '=', 'draft'),('meal_expense', '=', False)]}">
attrs="{'invisible': ['|','|',('is_return_calculation', '=', True),('state', '=', 'draft'),('meal_expense', '=', False)]}">
<div class="row mb-2">
<!-- Family Count -->
<div class="col-4">
@ -348,6 +353,27 @@
</tree>
</field>
</page>
<page string="Return Lines" attrs="{'invisible': [('is_return_calculation', '=', False)]}">
<field name="return_expense_line_ids" widget="many2many" domain="[('id', 'in', line_domain_ids)]"
attrs="{'readonly':[('state', '!=', 'draft')]}">
<tree>
<field name="family_id"/>
<field name="branch_id"/>
<field name="meal_card"/>
<field name="benefit_member_count"/>
<field name="family_monthly_income"
attrs="{'column_invisible': [('parent.cash_expense', '!=', True)]}"/>
<field name="family_monthly_meals"
attrs="{'column_invisible': [('parent.meal_expense', '!=', True)]}"/>
<field name="family_monthly_clotting"
attrs="{'column_invisible': [('parent.cloth_expense', '!=', True)]}"/>
<field name="total_family_expenses"/>
<field name="payment_order_id" invisible="1"/>
<field name="is_return"/>
<field name="return_reason_id"/>
</tree>
</field>
</page>
</notebook>
</sheet>
<div class="oe_chatter">

View File

@ -80,8 +80,7 @@
<notebook>
<page string="Services Requests"
attrs="{'invisible':[('type','not in',['seasonal_services','services'])]}">
<field name="service_requests_ids" widget="one2many_list"
readonly="1">
<field name="service_requests_ids" readonly="1">
<tree>
<field name="family_id"/>
<field name="benefit_type" optional="hidden"/>
@ -98,6 +97,13 @@
decoration-danger="state in ['refused']"
decoration-info="state in ['first_approve','waiting_approve']"
decoration-warning="state in ['researcher']"/>
<field name="return_reason_id" optional="hide"/>
<button name="action_return_bank"
type="object"
string="Bank Return"
class="btn btn-danger"
attrs="{'invisible': ['|',('state', '!=', 'accounting_approve'),('parent.state', '!=', 'waiting_deposit')]}"
/>
</tree>
</field>
</page>
@ -131,6 +137,14 @@
<field name="family_monthly_clotting"/>
<field name="total_family_expenses"/>
<field name="payment_order_id" invisible="1"/>
<field name="is_return" optional="hide"/>
<field name="return_reason_id" optional="hide"/>
<button name="action_return_bank"
type="object"
string="Bank Return"
class="btn btn-danger"
attrs="{'invisible': ['|',('is_return', '=', True),('parent.state', '!=', 'waiting_deposit')]}"
/>
</tree>
</field>
</page>

View File

@ -112,6 +112,11 @@
states="accounting_approve"
groups="odex_benefit.group_benefit_accounting_accept"
/>
<button name="action_processed" type="object"
string="Processed" class="oe_highlight"
states="return_to_bank"
groups="odex_benefit.group_benefit_researcher"
/>
<button name="action_supplier_approve" type="object"
string="Send Request To Supplier" class="oe_highlight"
confirm="Are you sure you want to approve ?"
@ -163,6 +168,13 @@
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button name="action_open_payment_orders"
type="object"
class="oe_stat_button"
icon="fa-money"
attrs="{'invisible': [('payment_order_count', '=', 0)]}">
<field name="payment_order_count" widget="statinfo" string="Payment Orders"/>
</button>
<button name="action_open_related_move_records"
class="oe_stat_button"
icon="fa-file-text-o"
@ -170,6 +182,7 @@
<field name="total_moves" widget="statinfo" string="Total Moves"/>
</button>
</div>
<field name="payment_order_ids" invisible="1"/>
<field name="is_payment_order_done" invisible="1"/>
<field name="payment_order_state" invisible="1"/>
<widget name="web_ribbon" title="Payment Done" bg_color="bg-success"
@ -282,6 +295,8 @@
<group>
<field name="description"
attrs="{'readonly':[('state','not in',['draft','researcher','waiting_approve'])]}"/>
<field name="return_reason_id" attrs="{'invisible': [('return_reason_id', '=', False)]}"
readonly="1"/>
<field name="return_reason" attrs="{'invisible': [('return_reason', '=', False)]}"
readonly="1"/>
<field name="specialist_note" attrs="{'invisible': [('return_reason', '=', False)]}"/>

View File

@ -14,3 +14,24 @@ class ReasonForReturnWizard(models.TransientModel):
'return_reason': record.reason,
'state': 'researcher',
})
class ReturnReasonWizard(models.TransientModel):
_name = "return.reason.wizard"
_description = "Return Reason Wizard"
line_id = fields.Integer("Line ID")
line_model = fields.Char("Line Model")
return_reason_id = fields.Many2one("return.reason", string="Return Reason", required=True)
def action_confirm(self):
self.ensure_one()
record = self.env[self.line_model].browse(self.line_id)
record.return_reason_id = self.return_reason_id.id
if hasattr(record, "is_return"):
record.is_return = True
if self.line_model == "service.request" and hasattr(record, "state"):
record.state = "return_to_bank"
record.payment_order_id = False
return {'type': 'ir.actions.act_window_close'}

View File

@ -14,4 +14,21 @@
</form>
</field>
</record>
<record id="return_reason_wizard_form" model="ir.ui.view">
<field name="name">return.reason.wizard.form</field>
<field name="model">return.reason.wizard</field>
<field name="arch" type="xml">
<form string="Bank Return">
<group>
<field name="line_id" invisible="1"/>
<field name="line_model" invisible="1"/>
<field name="return_reason_id"/>
</group>
<footer>
<button name="action_confirm" type="object" string="Confirm" class="btn btn-primary"/>
<button string="Cancel" special="cancel" class="btn btn-secondary"/>
</footer>
</form>
</field>
</record>
</odoo>

View File

@ -243,6 +243,11 @@ msgstr "<strong>تاريخ الدفع:</strong>"
msgid "<strong>Payment Method:</strong>"
msgstr "<strong>طريقة الدفع:</strong>"
#. module: enasan_geidea_sponsorship
#: model_terms:ir.ui.view,arch_db:enasan_geidea_sponsorship.view_account_payment_register_form_geidea
msgid "Process on Terminal"
msgstr "الدفع على المنصة"
#. module: odex_takaful
#: model_terms:ir.ui.view,arch_db:odex_takaful.report_transfer_deduction_document
msgid "<strong>Payment Method</strong>"

View File

@ -99,6 +99,34 @@ class DonationsDetailsLines(models.Model):
journal_id = fields.Many2one('account.journal', string="Journal",domain="[('type','=','bank')]",default=_default_journal_id)
benefit_status = fields.Selection(related='benefit_id.member_status')
ages = fields.Integer(compute='_compute_get_age_range' , store=True)
waiting_date = fields.Date(
string="تاريخ الانتظار",
compute="_compute_dates",
store=True
)
replace_date = fields.Date(
string="تاريخ الاستبدال",
compute="_compute_dates",
store=True
)
@api.depends('state')
def _compute_dates(self):
"""Automatically set waiting_date or replace_date based on state."""
for rec in self:
if rec.state == 'waiting':
print(date.today())
rec.waiting_date = date.today()
rec.replace_date = False
elif rec.state == 'replace':
rec.replace_date = date.today()
rec.waiting_date = False
else:
rec.waiting_date = False
rec.replace_date = False
# cheque_number = fields.Integer(string="Cheque Number")
# cheque_due_date = fields.Date(string="Cheque Due Date")
# cheque_file_attachment = fields.Binary(string='Cheque Attachment', attachment=True)
@ -881,6 +909,20 @@ class DonationsDetailsLines(models.Model):
if sponsorship and len(sponsorship) == 1:
message = _("Benefit IDs changed in a donation item:<br/>%s") % "<br/>".join(changes)
sponsorship.message_post(body=message)
# if 'state' in vals:
# print('In Vals')
# print("vals['state'] >>> " , vals['state'])
# if vals['state'] == 'waiting':
# vals['waiting_date'] = date.today()
# print("vals['waiting_date'] >>> " , vals['waiting_date'])
# vals['replace_date'] = False
# elif vals['state'] == 'replace':
# vals['replace_date'] = date.today()
# vals['waiting_date'] = False
# else:
# vals['waiting_date'] = False
# vals['replace_date'] = False
self.onset_benefit_id()
return res

View File

@ -281,6 +281,14 @@ class ResPartner(models.Model):
if 'mobile' in vals:
self._check_phone_numbers(vals['mobile'])
vals['mobile'] = self.phone_format(vals['mobile'])
if 'name' in vals :
if self.kafel_id:
self.kafel_id.name = vals['name']
if 'mobile' in vals :
if self.kafel_id:
self.kafel_id.login = vals['mobile']
res = super(ResPartner, self).write(vals)
return res

View File

@ -61,11 +61,12 @@
<field name="name">donations.details.lines.view.tree</field>
<field name="model">donations.details.lines</field>
<field name="arch" type="xml">
<tree default_order="create_date asc" create="0" edit="0">
<tree default_order="create_date asc , waiting_date asc , replace_date asc" create="0" edit="0" >
<field name="sponsorship_scheduling_line_ids" invisible="1" />
<field name="direct_debit" invisible="1" />
<field name="sequence_no" />
<field name="sponsor_id" />
<field name="sponsor_phone" widget="phone"/>
<field name="donation_type" optional="show"/>
<field name="sponsorship_duration" optional="hide"/>
@ -84,6 +85,8 @@
<field name="benefit_id" optional="hide" />
<field name="sponsorship_creation_date" />
<field name="create_date" optional="hide"/>
<field name="waiting_date" widget="date" optional="hide"/>
<field name="replace_date" widget="date" optional="hide"/>
<field name="state" widget="badge"
decoration-muted="state == 'draft'"
decoration-warning="state == 'waiting'"
@ -179,6 +182,7 @@
<group>
<group string="Donation Information">
<field name="ages" invisible="1" />
<field name="waiting_date" widget="date" />
<field name="donation_type" invisible="1"/>
<field name="donation_types"
attrs="{'invisible': [('donation_type', '!=', 'donation')], 'readonly': [('parent_state', '!=', 'draft')]}" />
@ -362,16 +366,18 @@
<field name="name">Donations Details Lines waiting</field>
<field name="res_model">donations.details.lines</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('state', '=', 'waiting')]</field>
<field name="search_view_id" ref="donations_details_lines_view_search"/>
<field name="context">{'create': False, 'delete': False, 'search_default_filter_waiting': 1}</field>
<field name="context">{'create': False, 'delete': False}</field>
</record>
<record id="donations_details_lines_replace_action" model="ir.actions.act_window">
<field name="name">Donations Details Lines Replacement</field>
<field name="res_model">donations.details.lines</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('state', '=', 'replace')]</field>
<field name="search_view_id" ref="donations_details_lines_view_search"/>
<field name="context">{'create': False, 'delete': False, 'search_default_filter_replace': 1}</field>
<field name="context">{'create': False, 'delete': False}</field>
</record>
</odoo>

View File

@ -13,11 +13,13 @@
<menuitem id="donations_details_lines_app_menu" parent="kafalat_main_menu"
name="Donations Details Lines" action="donations_details_lines_action" sequence="2"/>
<menuitem id="donations_details_lines_waiting_app_menu" parent="menu_replacement_root"
name="Donations Details Lines Waiting Benefit" action="donations_details_lines_waiting_action" sequence="3"/>
<menuitem id="donations_details_lines_to_replace_app_menu" parent="menu_replacement_root"
name="Donations Details Lines To Replace Benefit" action="donations_details_lines_replace_action" sequence="4"/>
name="Donations Details Lines To Replace Benefit" action="donations_details_lines_replace_action" sequence="3"/>
<menuitem id="donations_details_lines_waiting_app_menu" parent="menu_replacement_root"
name="Donations Details Lines Waiting Benefit" action="donations_details_lines_waiting_action" sequence="4"/>
<!-- TODO WE WILL USE IT LATER DON'T REMOVE THIS -->
<!-- START OF THE BLOCK -->

View File

@ -514,6 +514,7 @@
<group>
<group>
<field name="ages" invisible="1"/>
<field name="waiting_date" invisible="1" widget="date"/>
<field name="family_id"
attrs="{'invisible': [('sponsorship_type','=','group'), ('parent.record_type','=','sponsorship')],
'readonly': ['|', ('sponsorship_type', '!=', 'group'), ('parent.record_type','!=','donation')],

View File

@ -90,7 +90,7 @@
</div>
</group>
<group>
<field name="kafel_id" readonly="1"/>
<field name="kafel_id" readonly="1" invisible="1"/>
</group>
<group name="group_top">
<group name="group_main" colspan="2">

View File

@ -30,11 +30,17 @@ class AccountRegisterPayment(models.TransientModel):
transaction_file_attachment = fields.Binary(string='Transaction Attachment', attachment=False)
transaction_attachment_file_name = fields.Char('Transaction File Name', required=False)
payment_method = fields.Selection(selection=[("cash", "Cash"), ("bank", "Bank Transfer"), ("check", "Check")], string="Payment Method", required=True, default="cash")
machine_id = fields.Many2one('geidea.terminals' , 'الماكينة')
check_number = fields.Char(string='Check Number')
check_due_date = fields.Date(string='Check Due Date')
sponsorship_payment = fields.Boolean(string='Sponsorship Payment', default=False)
@api.onchange("machine_id")
def onchange_machine_id(self):
for rec in self:
if rec.machine_id:
rec.journal_id = rec.machine_id.journal_id
@api.onchange("takaful_payment_method_id")
def onchange_takaful_payment_method_id(self):
for rec in self:
@ -49,6 +55,7 @@ class AccountRegisterPayment(models.TransientModel):
if j_type:
return {"domain": {"journal_id": [("type", "=", j_type)]}}
@api.depends('source_amount', 'source_amount_currency', 'source_currency_id', 'company_id', 'currency_id', 'payment_date')
def _compute_amount(self):
if self.env.context.get('sponsorship_payment_skip_compute_amount'):
@ -67,6 +74,7 @@ class AccountRegisterPayment(models.TransientModel):
else:
rec.takaful_payment_method = "cash"
def _create_payments(self):
sponsorship_line_ids = self.env.context.get('sponsorship_line_ids')
sponsorship_lines = self.env['donations.details.lines'].browse(sponsorship_line_ids).filtered(lambda r: r.display_type == False)

View File

@ -51,6 +51,71 @@
attrs="{'invisible': ['|', ('sponsorship_payment', '=', False), ('takaful_payment_method','not in',['bank', 'check'])], 'required': [('sponsorship_payment', '=', True), ('takaful_payment_method','=','bank')]}"/>
<field name="transaction_attachment_file_name" invisible="1"/>
</xpath>
<!--<xpath expr="//group" position="after">-->
<!-- <notebook>-->
<!-- <page string="Sub Payments" attrs="{'invisible': [('group_payment', '=', False)]}">-->
<!-- <field name="account_payment_register_ids" attrs="{'invisible': [('group_payment', '=', False)]}" nolabel="1">-->
<!-- <tree editable="bottom" delete="true" create="true">-->
<!-- <field name="sponsorship_payment" invisible="1"/>-->
<!-- <field name="takaful_payment_method" invisible="1"/>-->
<!-- <field name="available_partner_bank_ids" invisible="1"/>-->
<!-- <field name="company_id" invisible="1"/>-->
<!-- <field name="takaful_payment_method_id" options="{'no_create': True, 'no_create_edit': True}"/>-->
<!-- <field name="journal_id" string="Association Journal"/>-->
<!-- <field name="amount"/>-->
<!-- <field name="check_number"-->
<!-- attrs="{-->
<!-- 'invisible': [-->
<!-- ('takaful_payment_method','!=','check')-->
<!-- ],-->
<!-- 'required': [-->
<!-- ('takaful_payment_method','=','check')-->
<!-- ]-->
<!-- }"-->
<!-- optional="hide"/>-->
<!-- <field name="check_due_date"-->
<!-- attrs="{-->
<!-- 'invisible': [-->
<!-- ('takaful_payment_method','!=','check')-->
<!-- ],-->
<!-- 'required': [-->
<!-- ('takaful_payment_method','=','check')-->
<!-- ]-->
<!-- }"-->
<!-- optional="hide"/>-->
<!-- <field name="partner_bank_id"-->
<!-- context="{-->
<!-- 'form_view_ref': 'odex_takaful.res_partner_bank_view_form_quick_create',-->
<!-- 'default_partner_id': context.get('force_sponsorship_line_partner_id')-->
<!-- }"-->
<!-- attrs="{-->
<!-- 'required': [-->
<!-- ('takaful_payment_method','=','bank')-->
<!-- ],-->
<!-- 'invisible': [-->
<!-- ('takaful_payment_method','!=','bank')-->
<!-- ]-->
<!-- }"-->
<!-- readonly="0"-->
<!-- optional="hide"/>-->
<!-- <field name="transaction_file_attachment"-->
<!-- widget="binary"-->
<!-- filename="transaction_attachment_file_name"-->
<!-- attrs="{-->
<!-- 'invisible': [-->
<!-- ('takaful_payment_method','not in',['bank', 'check'])-->
<!-- ],-->
<!-- 'required': ['|',-->
<!-- ('takaful_payment_method','=','bank'),-->
<!-- ('takaful_payment_method','=','check')-->
<!-- ]-->
<!-- }"-->
<!-- optional="hide"/>-->
<!-- </tree>-->
<!-- </field>-->
<!-- </page>-->
<!-- </notebook>-->
<!-- </xpath>-->
<!-- <xpath expr="//footer/button[@name='action_create_payments']" position="after">-->
<!-- <button name="action_register_all_lines"-->
<!-- type="object"-->