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

This commit is contained in:
odoo-syria-team 2025-11-16 12:38:21 +03:00
commit 609dd6da5d
7 changed files with 293 additions and 192 deletions

View File

@ -2690,7 +2690,6 @@ msgstr "المرتد"
#: model:ir.model.fields,field_description:odex_benefit.field_service_request__branch_custom_id
#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_search
#: model_terms:ir.ui.view,arch_db:odex_benefit.service_request_search
#: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_search
msgid "Branch"
msgstr "الفرع"
@ -2716,6 +2715,11 @@ msgstr "نوع الفرع"
msgid "Branches"
msgstr "فروع الرياض"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__branch_custom_ids
msgid "Branches"
msgstr "الفروع"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_benefits_representative__can_publish
#: model:ir.model.fields,field_description:odex_benefit.field_external_benefits__can_publish
@ -5017,11 +5021,6 @@ msgstr "خدمات استثنائية"
msgid "Excluded from suspension?"
msgstr "مستثنى من إيقاف الخدمة"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__expense_type
msgid "Expense Type"
msgstr "نوع الاجراء"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_benefit_category__expenses_ids
#: model:ir.model.fields,field_description:odex_benefit.field_benefit_need__expenses_ids
@ -5203,11 +5202,6 @@ msgstr "ديون الأسرة"
msgid "Family Domain"
msgstr ""
#. module: odex_benefit
#: model:ir.model.fields.selection,name:odex_benefit.selection__confirm_benefit_expense__expense_type__family_expense
msgid "Family Expense"
msgstr "مصروف التغذية الشهرية"
#. module: odex_benefit
#: code:addons/odex_benefit/models/family_expense.py:0
#: code:addons/odex_benefit/wizards/family_expense_move_wiz.py:0
@ -5792,7 +5786,6 @@ msgstr "تاريخ التخرج"
#. module: odex_benefit
#: model_terms:ir.ui.view,arch_db:odex_benefit.grant_benefit_search
#: model_terms:ir.ui.view,arch_db:odex_benefit.service_request_search
#: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_search
msgid "Group By"
msgstr ""
@ -7863,11 +7856,6 @@ msgstr ""
msgid "Meal Card"
msgstr "بطاقة الغذاء"
#. module: odex_benefit
#: model:ir.model.fields.selection,name:odex_benefit.selection__confirm_benefit_expense__expense_type__family_invoice
msgid "Meal Card Invoice"
msgstr "فاتورة كرت الغذاء"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_family_validation_setting__meal_expense
msgid "Meal Expense"
@ -11578,13 +11566,11 @@ msgid "Total Monthly Meals"
msgstr "إجمالي مصروف الغذاء للأسر"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__total_move_lines
#: model:ir.model.fields,field_description:odex_benefit.field_grant_benefit__total_move_lines
msgid "Total Move Lines"
msgstr "القيود اليومية"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__total_moves
#: model:ir.model.fields,field_description:odex_benefit.field_service_request__total_moves
msgid "Total Move"
msgstr "القيود اليومية"
@ -14445,7 +14431,6 @@ msgstr "أمر الصرف تم"
#. module: odex_benefit
#: model_terms:ir.ui.view,arch_db:odex_benefit.seasonal_service_form_view
#: model_terms:ir.ui.view,arch_db:odex_benefit.service_request_form
#: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_form
msgid "Payment Done"
msgstr "تم الدفع"
@ -16775,7 +16760,6 @@ msgstr "الحصول على دورة تأهيلية"
#. module: odex_benefit
#: model_terms:ir.ui.view,arch_db:odex_benefit.service_request_form
#: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_form
msgid "Total Moves"
msgstr "القيد المحاسبي"
@ -16876,6 +16860,7 @@ msgid "Payment Order State"
msgstr "حالة أمر الدفع"
#. module: odex_benefit
#: model:ir.model.fields.selection,name:odex_benefit.selection__confirm_benefit_expense__move_state__none
#: model:ir.model.fields.selection,name:odex_benefit.selection__confirm_benefit_expense__payment_state__none
#: model:ir.model.fields.selection,name:odex_benefit.selection__seasonal_service__payment_order_state__none
#: model:ir.model.fields.selection,name:odex_benefit.selection__service_request__payment_order_state__none
@ -16884,6 +16869,7 @@ msgid "None"
msgstr "لا يوجد"
#. module: odex_benefit
#: model:ir.model.fields.selection,name:odex_benefit.selection__confirm_benefit_expense__move_state__waiting
#: model:ir.model.fields.selection,name:odex_benefit.selection__confirm_benefit_expense__payment_state__waiting
#: model:ir.model.fields.selection,name:odex_benefit.selection__seasonal_service__payment_order_state__waiting
#: model:ir.model.fields.selection,name:odex_benefit.selection__service_request__payment_order_state__waiting
@ -16891,6 +16877,7 @@ msgid "Waiting Payment"
msgstr "في انتظار الدفع"
#. module: odex_benefit
#: model:ir.model.fields.selection,name:odex_benefit.selection__confirm_benefit_expense__move_state__done
#: model:ir.model.fields.selection,name:odex_benefit.selection__confirm_benefit_expense__payment_state__done
#: model:ir.model.fields.selection,name:odex_benefit.selection__seasonal_service__payment_order_state__done
#: model:ir.model.fields.selection,name:odex_benefit.selection__service_request__payment_order_state__done
@ -16946,7 +16933,6 @@ msgstr "موافقة المسؤول"
#. module: odex_benefit
#: model_terms:ir.ui.view,arch_db:odex_benefit.seasonal_service_form_view
#: model_terms:ir.ui.view,arch_db:odex_benefit.service_request_form
#: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_form
msgid "Payment Waiting"
msgstr "في انتظار الدفع"
@ -17058,9 +17044,16 @@ 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
#, python-format
msgid "Payment Orders"
msgstr "أوامر صرف الخدمات"
#. module: odex_benefit
#: code:addons/odex_benefit/models/family_expense.py:0
#, python-format
msgid "Payment Orders"
msgstr "أوامر الصرف"
#. module: odex_benefit
#: code:addons/odex_benefit/wizards/family_bank_report_wizard.py:0
#, python-format
@ -17108,4 +17101,49 @@ msgstr "فواتير الموردين"
#. module: odex_benefit
#: model_terms:ir.ui.view,arch_db:odex_benefit.service_request_form
msgid "Return to Family"
msgstr "إرجاع للأسرة"
msgstr "إرجاع للأسرة"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__family_monthly_othaime
msgid "Total Othaim"
msgstr "إجمالي العثيم"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__move_state
msgid "Move State"
msgstr "حالة الفاتورة"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__family_count_expense
msgid "Family Count (Monthly Expense)"
msgstr "إجمالي عدد الأسر للمصروف الشهري"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__family_count_othaim
msgid "Family Count (Othaim)"
msgstr "إجمالي عدد الأسر للعثيم"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__member_count_expense
msgid "Member Count (Monthly Expense)"
msgstr "إجمالي عدد الأفراد للمصروف الشهري"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_confirm_benefit_expense__member_count_othaim
msgid "Member Count (Othaim)"
msgstr "إجمالي عدد الأفراد للعثيم"
#. module: odex_benefit
#: model:ir.model.fields,field_description:odex_benefit.field_benefit_expense_line__family_monthly_othaime
msgid "Othaim Total Monthly"
msgstr "إجمالي العثيم الشهري"
#. module: odex_benefit
#: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_form
msgid "<span class=\"o_stat_text\">Othaime Invoice</span>"
msgstr "<span class=\"o_stat_text\">فاتورة العثيم</span>"
#. module: odex_benefit
#: model_terms:ir.ui.view,arch_db:odex_benefit.view_confirm_benefit_expense_form
msgid "<span class=\"o_stat_text\">Payment Orders</span>"
msgstr "<span class=\"o_stat_text\">أوامر الصرف</span>"

View File

@ -35,10 +35,6 @@ class ConfirmBenefitExpense(models.Model):
('cancel', 'Cancelled'),
('confirm', 'Confirmed'),
], string='Status', default='draft', required=True, copy=False, tracking=True)
expense_type = fields.Selection(selection=[
('family_expense', 'Family Expense'),
('family_invoice', 'Meal Card Invoice'),
], string='Expense Type', default='family_expense', required=True)
name = fields.Char(string="Name", states={'confirm': [('readonly', True)]}, copy=False)
date = fields.Date(string="Date", default=fields.Date.context_today, required=False,
states={'confirm': [('readonly', True)]})
@ -57,13 +53,15 @@ class ConfirmBenefitExpense(models.Model):
payment_order_id = fields.Many2one('payment.orders', string='Payment Order', ondelete="set null", copy=False)
move_id = fields.Many2one('account.move', ondelete='cascade')
available_payment_method_line_ids = fields.Many2many(comodel_name='account.payment.method.line')
total_moves = fields.Integer(string="Total Move", compute='_get_total_move_lines')
total_move_lines = fields.Integer(string="Total Move Lines", compute='_get_total_move_lines')
family_monthly_income = fields.Float(string="Total Monthly Income", compute='_get_family_monthly_values')
family_monthly_meals = fields.Float(string="Total Monthly Meals", compute='_get_family_monthly_values')
family_monthly_clotting = fields.Float(string="Total Monthly Clotting", compute='_get_family_monthly_values')
family_monthly_total = fields.Float(string="Total", compute='_get_family_monthly_values')
branch_custom_id = fields.Many2one(comodel_name='branch.settings', string="Branch")
family_monthly_income = fields.Float(string="Total Monthly Income", compute='_get_family_monthly_values',
store=True)
family_monthly_meals = fields.Float(string="Total Monthly Meals", compute='_get_family_monthly_values', store=True)
family_monthly_clotting = fields.Float(string="Total Monthly Clotting", compute='_get_family_monthly_values',
store=True)
family_monthly_othaime = fields.Float(string="Total Othaim", compute='_get_family_monthly_values', store=True)
family_monthly_total = fields.Float(string="Total", compute='_get_family_monthly_values', store=True)
branch_custom_ids = fields.Many2many(comodel_name='branch.settings', relation='confirm_benefit_expense_branch_rel',
column1='expense_id', column2='branch_id', string="Branches")
family_domain_ids = fields.Many2many(comodel_name='grant.benefit', compute='_compute_domain_ids')
company_id = fields.Many2one('res.company', default=lambda self: self.env.company)
currency_id = fields.Many2one(comodel_name='res.currency', string="Company Currency",
@ -71,25 +69,41 @@ class ConfirmBenefitExpense(models.Model):
payment_state = fields.Selection(string='Payment State', selection=[
('none', 'None'),
('waiting', 'Waiting Payment'),
('done', 'Done Payment'), ], copy=False, compute="_compute_payment_state", store=True)
('done', 'Done Payment'), ], copy=False, compute="_compute_payment_move_state", store=True)
move_state = fields.Selection(string='Move State', selection=[
('none', 'None'),
('waiting', 'Waiting Payment'),
('done', 'Done Payment'), ], copy=False, compute="_compute_payment_move_state", store=True)
family_count_expense = fields.Integer(string="Family Count (Monthly Expense)",
compute='_get_family_monthly_values', store=True)
family_count_othaim = fields.Integer(string="Family Count (Othaim)", compute='_get_family_monthly_values',
store=True)
member_count_expense = fields.Integer(string="Member Count (Monthly Expense)", compute='_get_family_monthly_values',
store=True, )
member_count_othaim = fields.Integer(string="Member Count (Othaim)", compute='_get_family_monthly_values',
store=True, )
@api.depends('payment_order_id', 'payment_order_id.state', 'move_id', 'move_id.state')
def _compute_payment_state(self):
def _compute_payment_move_state(self):
for rec in self:
payment_state = 'none'
move_state = 'none'
if rec.payment_order_id:
if rec.payment_order_id.state == "done":
payment_state = "done"
rec.state = "confirm"
else:
payment_state = "waiting"
elif rec.move_id:
if rec.move_id:
if rec.move_id.state == "posted":
payment_state = "done"
rec.state = "confirm"
move_state = "done"
else:
payment_state = "waiting"
move_state = "waiting"
rec.move_state = move_state
rec.payment_state = payment_state
if rec.move_state == 'done' and rec.payment_state == 'done':
rec.state = 'confirm'
@api.model
def create(self, vals):
@ -107,9 +121,14 @@ class ConfirmBenefitExpense(models.Model):
income, meals, clotting = 0, 0, 0
if not family:
continue
monthly_meals = family.family_monthly_meals
if self.expense_type == 'family_expense' and family.meal_card:
monthly_meals = 0.0
monthly_meals = 0.0 if family.meal_card else family.family_monthly_meals
othaime = family.family_monthly_meals if family.meal_card else 0.0
if self.cash_expense:
income = family.family_monthly_income
if self.meal_expense:
meals = monthly_meals
if self.cloth_expense:
clotting = family.family_monthly_clotting
vals = {
'branch_id': family.branch_custom_id.id,
'family_category_id': family.benefit_category_id.id,
@ -117,25 +136,11 @@ class ConfirmBenefitExpense(models.Model):
'benefit_member_count': family.benefit_member_count,
'start_date': self.start_date,
'end_date': self.end_date,
'family_monthly_income': income,
'family_monthly_meals': meals,
'family_monthly_clotting': clotting,
'family_monthly_othaime': othaime,
}
if self.expense_type == 'family_expense':
if self.cash_expense:
income = family.family_monthly_income
if self.meal_expense:
meals = monthly_meals
if self.cloth_expense:
clotting = family.family_monthly_clotting
vals.update({
'family_monthly_income': income,
'family_monthly_meals': meals,
'family_monthly_clotting': clotting,
})
else:
vals.update({
'family_monthly_income': 0.0,
'family_monthly_meals': monthly_meals,
'family_monthly_clotting': 0.0,
})
line.write(vals)
def action_calculate(self):
@ -147,9 +152,9 @@ class ConfirmBenefitExpense(models.Model):
if not families:
raise UserError(_("Please select at least one family to calculate."))
if rec.expense_type == 'family_expense':
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."))
# Todo ask awatif
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."))
rec.benefit_expense_line_ids.unlink()
lines = []
@ -172,45 +177,41 @@ class ConfirmBenefitExpense(models.Model):
raise UserError(_("You can only recalculate when status is 'Calculated'."))
rec._update_benefit_expense_lines()
@api.depends('expense_type', 'date', 'branch_custom_id', 'start_date', 'end_date')
@api.depends('branch_custom_ids', 'start_date', 'end_date')
def _compute_domain_ids(self):
for rec in self:
# Define base domain for family selection
validation_setting = self.env["family.validation.setting"].search([], limit=1)
base_domain = ['|', ('state', '=', 'second_approve'), '&',
('state', 'in', ('waiting_approve', 'first_approve')), ('action_type', '=', 'suspended')]
if rec.branch_custom_id:
base_domain.append(('branch_custom_id', '=', rec.branch_custom_id.id))
if rec.branch_custom_ids:
base_domain.append(('branch_custom_id', 'in', rec.branch_custom_ids.ids))
min_income = validation_setting.benefit_category_ids.mapped('mini_income_amount')
max_income = validation_setting.benefit_category_ids.mapped('max_income_amount')
base_domain.extend([('member_income', '>=', min(min_income)), ('member_income', '<=', max(max_income))])
base_domain.extend([('benefit_category_id', '!=', False)])
if rec.expense_type == 'family_invoice':
base_domain.append(('meal_card', '=', True))
# if rec.date:
if rec.start_date and rec.end_date:
# Calculate the start date for the past month range
# month_ago = rec.date - relativedelta(months=1)
# Search for conflicting records of the same expense type within the past month
conflicting_records = self.search([
('id', '!=', rec._origin.id),
('start_date', '<=', rec.end_date),
('end_date', '>=', rec.start_date),
('expense_type', '=', rec.expense_type),
])
if conflicting_records:
# Gather the family IDs that are already associated with the same expense type
conflicting_family_ids = conflicting_records.mapped('family_ids').ids
base_domain.append(('id', 'not in', conflicting_family_ids))
rec.family_domain_ids = self.env['grant.benefit'].search(base_domain)
@api.onchange('branch_custom_id')
def _onchange_branch_custom_id(self):
if self.branch_custom_id:
@api.onchange('branch_custom_ids')
def _onchange_branch_custom_ids(self):
if self.branch_custom_ids:
allowed_families = self.env['grant.benefit'].search([
('id', 'in', self.family_ids.ids),
('branch_custom_id', 'in', self.branch_custom_ids.ids),
])
self.family_ids = [(6, 0, allowed_families.ids)]
else:
self.family_ids = [(5, 0, 0)]
def unlink(self):
@ -222,15 +223,26 @@ class ConfirmBenefitExpense(models.Model):
@api.depends('benefit_expense_line_ids')
def _get_family_monthly_values(self):
for rec in self:
rec.family_monthly_income = sum(rec.benefit_expense_line_ids.mapped('family_monthly_income'))
rec.family_monthly_meals = sum(rec.benefit_expense_line_ids.mapped('family_monthly_meals'))
rec.family_monthly_clotting = sum(rec.benefit_expense_line_ids.mapped('family_monthly_clotting'))
lines = rec.benefit_expense_line_ids
rec.family_monthly_income = sum(lines.mapped('family_monthly_income'))
rec.family_monthly_meals = sum(lines.mapped('family_monthly_meals'))
rec.family_monthly_clotting = sum(lines.mapped('family_monthly_clotting'))
rec.family_monthly_othaime = sum(lines.mapped('family_monthly_othaime'))
rec.family_monthly_total = rec.family_monthly_income + rec.family_monthly_meals + rec.family_monthly_clotting
expense_lines = lines.filtered(lambda l: not l.meal_card)
othaim_lines = lines.filtered('meal_card')
rec.family_count_expense = len(expense_lines.mapped('family_id'))
rec.member_count_expense = sum(expense_lines.mapped('benefit_member_count'))
rec.family_count_othaim = len(othaim_lines.mapped('family_id'))
rec.member_count_othaim = sum(othaim_lines.mapped('benefit_member_count'))
def action_assistant_manager(self):
if self.expense_type != 'family_expense':
self.state = 'assistant_general_manager'
return
# Todo ask awatif
# if self.expense_type != 'family_expense':
# self.state = 'assistant_general_manager'
# return
disbursement_date = False
# if not disbursement_date:
@ -256,28 +268,13 @@ class ConfirmBenefitExpense(models.Model):
self.state = 'cancel'
def action_reset_to_draft(self):
self.benefit_expense_line_ids.unlink()
self.payment_order_id.unlink()
self.move_id.unlink()
self.benefit_expense_line_ids.unlink()
self.state = 'draft'
def _get_total_move_lines(self):
for rec in self:
if self.expense_type == 'family_expense':
moves = self.payment_order_id.move_id
else:
moves = self.move_id
rec.total_moves = len(moves)
rec.total_move_lines = len(moves.mapped('line_ids'))
def action_open_related_move_records(self):
""" Opens a tree view with related records filtered by a dynamic domain """
if self.expense_type == 'family_expense':
moves = self.payment_order_id.move_id.ids
else:
moves = self.move_id.ids
moves = self.move_id.ids
return {
'name': _('Vendor Bills'),
'type': 'ir.actions.act_window',
@ -286,63 +283,77 @@ class ConfirmBenefitExpense(models.Model):
'domain': [('id', 'in', moves)],
}
def action_open_related_payment_orders(self):
payment_orders = self.payment_order_id.ids
return {
'name': _('Payment Orders'),
'type': 'ir.actions.act_window',
'res_model': 'payment.orders',
'view_mode': 'tree,form',
'domain': [('id', 'in', payment_orders)],
}
def action_accounting_transfer(self):
for rec in self:
validation_setting = self.env["family.validation.setting"].search([], limit=1)
lines = rec.benefit_expense_line_ids
if not lines:
raise UserError(_("Please make sure you have benefit expense lines."))
if rec.expense_type == 'family_expense':
families = lines.mapped('family_id')
invalid_families = families.filtered(
lambda f: f.state != 'second_approve'
or (f.state in ('waiting_approve', 'first_approve') and f.action_type == 'suspended')
)
if invalid_families:
raise UserError(_(
"Some selected benefits are not in valid state or are suspended:\n%s"
) % ", ".join(invalid_families.mapped('name')))
if not validation_setting.cash_expense_account_id or not validation_setting.meal_expense_account_id or not validation_setting.clothing_expense_account_id:
raise UserError(_("Please configure the expense accounts in the validation settings."))
families = lines.mapped('family_id')
invalid_families = families.filtered(
lambda f: f.state != 'second_approve'
or (f.state in ('waiting_approve', 'first_approve') and f.action_type == 'suspended')
)
if invalid_families:
raise UserError(_(
"Some selected benefits are not in valid state or are suspended:\n%s"
) % ", ".join(invalid_families.mapped('name')))
credit_account_id = validation_setting.account_id.id
if not validation_setting.cash_expense_account_id or not validation_setting.meal_expense_account_id or not validation_setting.clothing_expense_account_id:
raise UserError(_("Please configure the expense accounts in the validation settings."))
if not credit_account_id:
raise UserError(_("Please select credit account."))
credit_account_id = validation_setting.account_id.id
payment_order = self.env['payment.orders'].create({
'state': 'draft',
'accountant_id': validation_setting.accountant_id.id,
'benefit_expense_line_ids': [(6, 0, rec.benefit_expense_line_ids.ids)],
'type': 'benefit_expense',
})
rec.payment_order_id = payment_order
else:
account_id = validation_setting.meal_expense_account_id
invoice_lines = []
for line in lines:
family = line.family_id
invoice_lines.append((0, 0, {
'name': f'{family.name}/{family.code}',
'account_id': account_id.id,
'quantity': 1,
'benefit_family_id': family.id,
'price_unit': line.family_monthly_meals,
'analytic_account_id': family.branch_family_id.branch.analytic_account_id.id
}))
invoice_vals = {
'move_type': 'in_invoice',
'partner_id': validation_setting.meal_partner_id.id,
'invoice_date': rec.date,
'family_confirm_id': rec.id,
'benefit_family_ids': [(6, 0, rec.benefit_expense_line_ids.mapped('family_id').ids)],
'journal_id': validation_setting.journal_id.id,
'invoice_line_ids': invoice_lines,
'ref': rec.name,
}
if not credit_account_id:
raise UserError(_("Please select credit account."))
invoice = self.env['account.move'].create(invoice_vals)
rec.move_id = invoice
# todo if have paymnet or move dont create again
# Create Payment Order for Benefit Expense
payment_order = self.env['payment.orders'].create({
'state': 'draft',
'accountant_id': validation_setting.accountant_id.id,
'benefit_expense_line_ids': [(6, 0, rec.benefit_expense_line_ids.ids)],
'type': 'benefit_expense',
})
rec.payment_order_id = payment_order
# Create Vendor Bill for Meal Card Invoice(othaime)
account_id = validation_setting.meal_expense_account_id
invoice_lines = []
for line in lines.filtered(lambda l: l.meal_card):
family = line.family_id
invoice_lines.append((0, 0, {
'name': f'{family.name}/{family.code}',
'account_id': account_id.id,
'quantity': 1,
'benefit_family_id': family.id,
'price_unit': line.family_monthly_othaime,
'analytic_account_id': family.branch_family_id.branch.analytic_account_id.id
}))
invoice_vals = {
'move_type': 'in_invoice',
'partner_id': validation_setting.meal_partner_id.id,
'invoice_date': rec.date,
'family_confirm_id': rec.id,
'benefit_family_ids': [(6, 0, rec.benefit_expense_line_ids.mapped('family_id').ids)],
'journal_id': validation_setting.journal_id.id,
'invoice_line_ids': invoice_lines,
'ref': rec.name,
}
invoice = self.env['account.move'].create(invoice_vals)
rec.move_id = invoice
return True

View File

@ -20,6 +20,7 @@ class BenefitExpenseLine(models.Model):
family_monthly_income = fields.Float(string="Family Monthly Income")
family_monthly_meals = fields.Float(string="Family Monthly Meals")
family_monthly_clotting = fields.Float(string="Family Monthly Clotting")
family_monthly_othaime = fields.Float(string="Othaim Total Monthly")
total_family_expenses = fields.Float(string="Total Family Expenses", compute='_compute_total_family_expenses')
start_date = fields.Date(string='Start Date', )
end_date = fields.Date(string='End Date', )

View File

@ -16,6 +16,7 @@
<field name="family_monthly_income"/>
<field name="family_monthly_meals"/>
<field name="family_monthly_clotting"/>
<field name="family_monthly_othaime"/>
<field name="total_family_expenses"/>
<field name="payment_order_id" invisible="1"/>
</tree>
@ -43,6 +44,7 @@
<field name="family_monthly_meals"/>
<field name="family_monthly_clotting"/>
<field name="total_family_expenses" readonly="1"/>
<field name="family_monthly_othaime"/>
</group>
</group>
<group invisible="1">

View File

@ -9,8 +9,7 @@
<field name="family_expense_seq"/>
<field name="date"/>
<field name="name" string="Description"/>
<field name="expense_type"/>
<field name="branch_custom_id"/>
<field name="branch_custom_ids" widget="many2many_tags"/>
<field name="currency_id" invisible="1" groups="base.group_multi_currency"/>
<field name="family_monthly_total" decoration-bf="1" widget="monetary"
options="{'currency_field': 'currency_id'}"/>
@ -26,6 +25,11 @@
decoration-warning="payment_state == 'waiting'"
decoration-success="payment_state == 'done'"
/>
<field name="move_state"
widget="badge"
decoration-success="move_state == 'done'"
decoration-warning="move_state == 'waiting'"
decoration-muted="move_state == 'none'"/>
</tree>
</field>
</record>
@ -59,25 +63,44 @@
<button string="Accounting Transfer" type="object" name="action_accounting_transfer"
class="oe_highlight"
attrs="{'invisible': ['|','|',('state', '!=', 'accounting_approve'),'&amp;',('payment_order_id','!=',False),('expense_type','=','family_expense'),'&amp;',('move_id','!=',False),('expense_type','=','family_invoice')]}"
attrs="{'invisible': ['|','|',('state', '!=', 'accounting_approve'),('payment_order_id','!=',False),('move_id','!=',False)]}"
/>
<button string="Reset" type="object" name="action_reset_to_draft" class="btn btn-danger"
states="accounting_approve"/>
</header>
<sheet>
<div class="oe_button_box" name="button_box">
<button name="action_open_related_payment_orders"
class="oe_stat_button"
icon="fa-file-text-o"
type="object" attrs="{'invisible': [('payment_order_id', '=', False)]}">
<div class="o_field_widget o_stat_info">
<span class="o_stat_text">Payment Orders</span>
<span class="o_stat_value">
<field name="payment_state"
widget="badge"
decoration-success="payment_state == 'done'"
decoration-warning="payment_state == 'waiting'"
decoration-muted="payment_state == 'none'"/>
</span>
</div>
</button>
<button name="action_open_related_move_records"
class="oe_stat_button"
icon="fa-file-text-o"
type="object" attrs="{'invisible': [('total_moves', '=', 0)]}">
<field name="total_moves" widget="statinfo" string="Total Moves"/>
type="object" attrs="{'invisible': [('move_id', '=', False)]}">
<div class="o_field_widget o_stat_info">
<span class="o_stat_text">Othaime Invoice</span>
<span class="o_stat_value">
<field name="move_state"
widget="badge"
decoration-success="move_state == 'done'"
decoration-warning="move_state == 'waiting'"
decoration-muted="move_state == 'none'"/>
</span>
</div>
</button>
</div>
<field name="payment_state" invisible="1"/>
<widget name="web_ribbon" title="Payment Done" bg_color="bg-success"
attrs="{'invisible': [('payment_state', '!=', 'done')]}"/>
<widget name="web_ribbon" title="Payment Waiting" bg_color="bg-warning"
attrs="{'invisible': [('payment_state', '!=', 'waiting')]}"/>
<field name="family_domain_ids" widget="many2many_tags" invisible="1"/>
<div class="oe_title">
<h1>
@ -97,52 +120,55 @@
<field name="end_date"
attrs="{'readonly':[('state', '!=', 'draft')]}"/>
</div>
<field name="branch_custom_id" required="1"
attrs="{'readonly':[('state', '!=', 'draft')]}"/>
<!-- <field name="payment_method_id" attrs="{'invisible': [('expense_type', '=', 'family_invoice')],'required': [('expense_type', '=', 'family_expense')]}"/>-->
<field name="branch_custom_ids" required="1"
widget="many2many_tags" attrs="{'readonly':[('state', '!=', 'draft')]}"
/>
</group>
<group>
<field name="expense_type" required="1" attrs="{'readonly':[('state', '!=', 'draft')]}"/>
<field name="date" required="1" attrs="{'readonly':[('state', '!=', 'draft')]}"/>
<field name="payment_order_id" readonly="1"
attrs="{'invisible': [('payment_order_id', '=', False)]}"/>
<field name="payment_order_id" invisible="1"/>
<field name="move_id" invisible="1"/>
<field name="cash_expense" widget="boolean_toggle"
attrs="{'readonly':[('state', '!=', 'draft')]}"/>
<field name="meal_expense" widget="boolean_toggle"
attrs="{'readonly':[('state', '!=', 'draft')]}"/>
<field name="cloth_expense" widget="boolean_toggle"
attrs="{'readonly':[('state', '!=', 'draft')]}"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="currency_id" invisible="1" groups="base.group_multi_currency"/>
</group>
</group>
<!-- Conditional fields based on expense_type -->
<group>
<group>
<field name="available_payment_method_line_ids" invisible="1"/>
<field name="cash_expense"
attrs="{'invisible': [('expense_type', '=', 'family_invoice')], 'readonly':[('state', '!=', 'draft')]}"/>
<field name="meal_expense"
attrs="{'invisible': [('expense_type', '=', 'family_invoice')], 'readonly':[('state', '!=', 'draft')]}"/>
<field name="cloth_expense"
attrs="{'invisible': [('expense_type', '=', 'family_invoice')], 'readonly':[('state', '!=', 'draft')]}"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>
<group>
<field name="currency_id" invisible="1" groups="base.group_multi_currency"/>
<field name="family_monthly_income" widget="monetary"
options="{'currency_field': 'currency_id'}"
attrs="{'invisible': ['|',('expense_type', '=', 'family_invoice'),('cash_expense', '=', False)]}"/>
attrs="{'invisible': [('cash_expense', '=', False)]}"/>
<field name="family_monthly_meals" widget="monetary"
options="{'currency_field': 'currency_id'}"
attrs="{'invisible': [('expense_type', '=', 'family_expense'),('meal_expense', '=', False)]}"/>
attrs="{'invisible': [('meal_expense', '=', False)]}"/>
<field name="family_monthly_clotting" widget="monetary"
options="{'currency_field': 'currency_id'}"
attrs="{'invisible': ['|',('expense_type', '=', 'family_invoice'),('cloth_expense', '=', False)]}"/>
attrs="{'invisible': [('cloth_expense', '=', False)]}"/>
<field name="family_monthly_total" widget="monetary"
options="{'currency_field': 'currency_id'}"/>
</group>
<group>
<field name="family_count_expense"/>
<field name="member_count_expense"/>
<field name="family_count_othaim"/>
<field name="member_count_othaim"/>
<field name="family_monthly_othaime" widget="monetary"
options="{'currency_field': 'currency_id'}"
/>
</group>
</group>
<!-- Notebook with Families page -->
<notebook>
<page string="Family Monthly Expense" attrs="{'invisible': [('state', '=', 'draft')]}">
<field name="benefit_expense_line_ids" readonly="1">
<tree editable="bottom">
<tree>
<field name="family_id"/>
<field name="branch_id"/>
<field name="family_category_id"/>
@ -157,13 +183,39 @@
<field name="family_monthly_clotting"
attrs="{'column_invisible': [('parent.cloth_expense', '!=', True)]}"/>
<field name="total_family_expenses"/>
<field name="family_monthly_othaime"/>
<field name="payment_order_id" invisible="1"/>
</tree>
</field>
</page>
<page string="Families">
<field name="family_ids" attrs="{'readonly':[('state', '!=', 'draft')]}"
domain="[('id', 'in', family_domain_ids)]"/>
domain="[('id', 'in', family_domain_ids)]">
<tree>
<field name="code" decoration-bf="1"/>
<field name="benefit_partner_name"/>
<field name="benefit_category_id"/>
<field name="create_date" optional="hide"/>
<field name="meal_card"/>
<field name="father_id_number" optional="hide"/>
<field name="sms_phone"/>
<field name="benefit_member_count"/>
<field name="non_member_count" optional="hide"/>
<field name="researcher_id"/>
<field name="branch_custom_id"/>
<field name="district_id"/>
<field name="last_visit_date" optional="hide"/>
<field name="acc_number" optional="hide"/>
<field name="family_member_id" optional="hide"/>
<field name="acc_holder_name" optional="hide"/>
<field name="state" widget="badge"
decoration-success="state in ['first_approve', 'second_approve']"
decoration-muted="state in ['draft','new']"
decoration-danger="state in ['refused','suspended_second_approve']"
decoration-warning="state in ['first_refusal','waiting_approve']"
decoration-info="state not in ('waiting_approve','draft','new','first_approve', 'second_approve','first_refusal','refused','suspended_second_approve')"/>
</tree>
</field>
</page>
</notebook>
</sheet>
@ -182,9 +234,6 @@
<field name="model">confirm.benefit.expense</field>
<field name="arch" type="xml">
<search>
<group string="Group By">
<filter string="Branch" name="branch_custom_id" context="{'group_by': 'branch_custom_id'}"/>
</group>
<separator/>
<filter string="Draft" name="draft" domain="[('state','=','draft')]"/>
<separator/>

View File

@ -584,7 +584,7 @@
font-size:14px;
">
<i class="fa fa-file-text-o"
style="color:#198754; font-size:14px;"></i>
style="color:#198754; font-size:14px;"/>
</div>
<div style="display:flex; flex-direction:column; line-height:1;">
@ -618,7 +618,7 @@
</span>
</t>
<i class="fa fa-chevron-left"
style="color:#9aa5a0; font-size:12px;"></i>
style="color:#9aa5a0; font-size:12px;"/>
</div>
</div>
</a>

View File

@ -1351,7 +1351,7 @@ class TakafulSponsorship(models.Model):
current_invoice = self.journal_entry_ids.filtered(lambda r: r.move_type == 'out_invoice' and r.state == 'draft')
if current_invoice:
invoice_values['invoice_line_ids'] = [(5, 0, 0)] + invoice_line_vals
current_invoice.write(invoice_values)
current_invoice.sudo().write(invoice_values)
invoice_id = current_invoice
else:
invoice_values.update({'invoice_line_ids': invoice_line_vals, 'name': self.env['ir.sequence'].next_by_code('account.move.accrsp')})
@ -1365,7 +1365,7 @@ class TakafulSponsorship(models.Model):
line.tax_ids = taxes
line.product_uom_id = line._get_computed_uom()
invoice_id.action_post()
invoice_id.sudo().action_post()
# Search for the notification message for 'create_kafala'
notification = self.env['takaful.notification'].sudo().search(
@ -1776,7 +1776,7 @@ class TakafulSponsorship(models.Model):
if rec.state != 'confirmed':
raise ValidationError(_("You can only reset to draft a confirmed sponsorship."))
move_ids = rec.journal_entry_ids.filtered(lambda l: l.move_type == 'out_invoice')
move_ids.button_draft()
move_ids.sudo().button_draft()
self.write({'state': 'draft'})
all_donation_lines = (self.donations_details_lines + self.donations_details_lines_mechanism_ids).filtered(
lambda r: r.display_type == False)