From f5765cfc30f003bab4d88b72a04b9fbc5e4edca6 Mon Sep 17 00:00:00 2001 From: younes Date: Mon, 3 Nov 2025 09:52:41 +0100 Subject: [PATCH 1/9] [IMP] odex_benefit: changer module logo --- .../odex_benefit/static/description/icon1.png | Bin 7954 -> 11026 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/odex25_ensan/odex_benefit/static/description/icon1.png b/odex25_ensan/odex_benefit/static/description/icon1.png index 03f43d4996675e5f16c7f2dca4cb49ac2138d635..a352c38a133f88bb71e2f7b7c3371f96951db370 100644 GIT binary patch literal 11026 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 K-)lNQ|Nj8`dM literal 7954 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 Date: Mon, 3 Nov 2025 11:26:30 +0200 Subject: [PATCH 2/9] benf category --- odex25_ensan/odex_benefit/i18n/ar_001.po | 3 + .../odex_benefit/security/security_view.xml | 75 +++++++++++-------- 2 files changed, 45 insertions(+), 33 deletions(-) diff --git a/odex25_ensan/odex_benefit/i18n/ar_001.po b/odex25_ensan/odex_benefit/i18n/ar_001.po index 751f8e08a..f3ffbd9eb 100644 --- a/odex25_ensan/odex_benefit/i18n/ar_001.po +++ b/odex25_ensan/odex_benefit/i18n/ar_001.po @@ -2016,6 +2016,9 @@ msgstr "بيانات المستفيدين" msgid "Beneficiaries Management" msgstr "فئات المستفيدين" + + + #. module: odex_benefit #: model:res.groups,name:odex_benefit.group_benefit_manager msgid "Beneficiaries Manager" diff --git a/odex25_ensan/odex_benefit/security/security_view.xml b/odex25_ensan/odex_benefit/security/security_view.xml index b123f7b35..347e7887c 100644 --- a/odex25_ensan/odex_benefit/security/security_view.xml +++ b/odex25_ensan/odex_benefit/security/security_view.xml @@ -1,18 +1,27 @@ - + + + + + + + + Beneficiaries Management + فئات المستفيدين Helps you manage Beneficiaries Program 1 - - - - - - - + + + + + + + + Beneficiaries Inforamtion @@ -38,12 +47,12 @@ - - - - - - + + + + + + Beneficiaries Manager @@ -89,25 +98,25 @@ - + Accounting Accept - + Bank Account Information - + Service Request Accountant Accept - + Payment Orders Accountant Accept - + Accept income and expenses @@ -130,7 +139,7 @@ Family Services Manager - + @@ -178,7 +187,7 @@ - + Show All Visit Location @@ -208,9 +217,9 @@ [ '|', - ('create_uid','=',user.id), - ('researcher_team.employee_id', 'in', user.employee_id.ids) - ] + ('create_uid','=',user.id), + ('researcher_team.employee_id', 'in', user.employee_id.ids) + ] @@ -256,9 +265,9 @@ [ '|', - ('create_uid','=',user.id), - ('researcher_id.employee_id', 'in', user.employee_id.ids) - ] + ('create_uid','=',user.id), + ('researcher_id.employee_id', 'in', user.employee_id.ids) + ] @@ -277,9 +286,9 @@ [ '|', - ('create_uid','=',user.id), - ('researcher_id.employee_id', 'in', user.employee_id.ids) - ] + ('create_uid','=',user.id), + ('researcher_id.employee_id', 'in', user.employee_id.ids) + ] @@ -289,9 +298,9 @@ [ '|', - ('family_id.branch_custom_id.branch.manager_id', '=', user.employee_id.id), - ('family_id.branch_custom_id.branch.operation_manager_id', '=', user.employee_id.id) - ] + ('family_id.branch_custom_id.branch.manager_id', '=', user.employee_id.id), + ('family_id.branch_custom_id.branch.operation_manager_id', '=', user.employee_id.id) + ] From c856c76f223aaa2d9b3b9399a65028f66699e7cb Mon Sep 17 00:00:00 2001 From: younes Date: Mon, 3 Nov 2025 10:47:35 +0100 Subject: [PATCH 3/9] [FIX] odex_benefit: FIX bug --- odex25_ensan/odex_benefit/models/family_members.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/odex25_ensan/odex_benefit/models/family_members.py b/odex25_ensan/odex_benefit/models/family_members.py index 3318dc512..ed6315b9f 100644 --- a/odex25_ensan/odex_benefit/models/family_members.py +++ b/odex25_ensan/odex_benefit/models/family_members.py @@ -777,7 +777,7 @@ class FamilyMemberProfile(models.Model): rec.member_id_number ) existing_member = rec.search([ - ('id', '!=', rec.id), + ('id', '!=', rec._origin.id), ('member_id_number', '=', rec.member_id_number), ('relationn.relation_type', 'not in', ['mother', 'replacement_mother']) ], limit=1) @@ -785,7 +785,7 @@ class FamilyMemberProfile(models.Model): raise ValidationError(_("This ID already exists.")) if rec.relationn.relation_type not in ['mother', 'replacement_mother']: conflict_family = rec.env['grant.benefit'].search([ - ('id', '!=', family.id), + ('id', '!=', family._origin.id), '|', '|', ('father_id_number', '=', rec.member_id_number), ('mother_id_number', '=', rec.member_id_number), From c54aad910289d1169a6a3cebe235c8899700d036 Mon Sep 17 00:00:00 2001 From: eslamtalaat74 Date: Mon, 3 Nov 2025 11:57:18 +0200 Subject: [PATCH 4/9] benf category --- .../odex_benefit/security/security_view.xml | 75 ++++++++----------- 1 file changed, 33 insertions(+), 42 deletions(-) diff --git a/odex25_ensan/odex_benefit/security/security_view.xml b/odex25_ensan/odex_benefit/security/security_view.xml index 347e7887c..b123f7b35 100644 --- a/odex25_ensan/odex_benefit/security/security_view.xml +++ b/odex25_ensan/odex_benefit/security/security_view.xml @@ -1,27 +1,18 @@ - - - - - - - - + Beneficiaries Management - فئات المستفيدين Helps you manage Beneficiaries Program 1 - - - - - - - - + + + + + + + Beneficiaries Inforamtion @@ -47,12 +38,12 @@ - - - - - - + + + + + + Beneficiaries Manager @@ -98,25 +89,25 @@ - + Accounting Accept - + Bank Account Information - + Service Request Accountant Accept - + Payment Orders Accountant Accept - + Accept income and expenses @@ -139,7 +130,7 @@ Family Services Manager - + @@ -187,7 +178,7 @@ - + Show All Visit Location @@ -217,9 +208,9 @@ [ '|', - ('create_uid','=',user.id), - ('researcher_team.employee_id', 'in', user.employee_id.ids) - ] + ('create_uid','=',user.id), + ('researcher_team.employee_id', 'in', user.employee_id.ids) + ] @@ -265,9 +256,9 @@ [ '|', - ('create_uid','=',user.id), - ('researcher_id.employee_id', 'in', user.employee_id.ids) - ] + ('create_uid','=',user.id), + ('researcher_id.employee_id', 'in', user.employee_id.ids) + ] @@ -286,9 +277,9 @@ [ '|', - ('create_uid','=',user.id), - ('researcher_id.employee_id', 'in', user.employee_id.ids) - ] + ('create_uid','=',user.id), + ('researcher_id.employee_id', 'in', user.employee_id.ids) + ] @@ -298,9 +289,9 @@ [ '|', - ('family_id.branch_custom_id.branch.manager_id', '=', user.employee_id.id), - ('family_id.branch_custom_id.branch.operation_manager_id', '=', user.employee_id.id) - ] + ('family_id.branch_custom_id.branch.manager_id', '=', user.employee_id.id), + ('family_id.branch_custom_id.branch.operation_manager_id', '=', user.employee_id.id) + ] From 170bfc6bf16c2c108e578dcac24736fc68c3265c Mon Sep 17 00:00:00 2001 From: eslamtalaat74 Date: Mon, 3 Nov 2025 12:00:45 +0200 Subject: [PATCH 5/9] benf category --- .../odex_benefit/security/security_view.xml | 73 +++++++++++-------- 1 file changed, 41 insertions(+), 32 deletions(-) diff --git a/odex25_ensan/odex_benefit/security/security_view.xml b/odex25_ensan/odex_benefit/security/security_view.xml index b123f7b35..6488d4951 100644 --- a/odex25_ensan/odex_benefit/security/security_view.xml +++ b/odex25_ensan/odex_benefit/security/security_view.xml @@ -6,13 +6,22 @@ 1 - - - - - - - + + ir.module.category,name + ar_001 + model + + Beneficiaries Management + فئات المستفيدين + + + + + + + + + Beneficiaries Inforamtion @@ -38,12 +47,12 @@ - - - - - - + + + + + + Beneficiaries Manager @@ -89,25 +98,25 @@ - + Accounting Accept - + Bank Account Information - + Service Request Accountant Accept - + Payment Orders Accountant Accept - + Accept income and expenses @@ -130,7 +139,7 @@ Family Services Manager - + @@ -178,7 +187,7 @@ - + Show All Visit Location @@ -208,9 +217,9 @@ [ '|', - ('create_uid','=',user.id), - ('researcher_team.employee_id', 'in', user.employee_id.ids) - ] + ('create_uid','=',user.id), + ('researcher_team.employee_id', 'in', user.employee_id.ids) + ] @@ -256,9 +265,9 @@ [ '|', - ('create_uid','=',user.id), - ('researcher_id.employee_id', 'in', user.employee_id.ids) - ] + ('create_uid','=',user.id), + ('researcher_id.employee_id', 'in', user.employee_id.ids) + ] @@ -277,9 +286,9 @@ [ '|', - ('create_uid','=',user.id), - ('researcher_id.employee_id', 'in', user.employee_id.ids) - ] + ('create_uid','=',user.id), + ('researcher_id.employee_id', 'in', user.employee_id.ids) + ] @@ -289,9 +298,9 @@ [ '|', - ('family_id.branch_custom_id.branch.manager_id', '=', user.employee_id.id), - ('family_id.branch_custom_id.branch.operation_manager_id', '=', user.employee_id.id) - ] + ('family_id.branch_custom_id.branch.manager_id', '=', user.employee_id.id), + ('family_id.branch_custom_id.branch.operation_manager_id', '=', user.employee_id.id) + ] From 42b875e8b3243783acd34bb62f27b5c53b7966f6 Mon Sep 17 00:00:00 2001 From: eslamtalaat74 Date: Mon, 3 Nov 2025 12:12:03 +0200 Subject: [PATCH 6/9] benf category --- odex25_ensan/odex_benefit/security/security_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/odex25_ensan/odex_benefit/security/security_view.xml b/odex25_ensan/odex_benefit/security/security_view.xml index 6488d4951..aaf8c7b4b 100644 --- a/odex25_ensan/odex_benefit/security/security_view.xml +++ b/odex25_ensan/odex_benefit/security/security_view.xml @@ -1,5 +1,5 @@ - + Beneficiaries Management Helps you manage Beneficiaries Program From 1034fe3c8a6ae3a91c53637c6d39eba70bda8239 Mon Sep 17 00:00:00 2001 From: younes Date: Mon, 3 Nov 2025 14:03:06 +0100 Subject: [PATCH 7/9] [IMP] odex_benefit: imp benefit --- .../odex_benefit/models/seasonal_service.py | 12 ++- .../odex_benefit/models/service_request.py | 2 + .../odex_benefit/views/actions_and_menus.xml | 1 + .../views/seasonal_service_view.xml | 98 ++++++++++--------- .../odex_benefit/views/service_request.xml | 1 + odex25_ensan/odex_takaful/i18n/ar_001.po | 2 +- .../odex_takaful/security/security_data.xml | 15 ++- .../views/takaful_menus_actions.xml | 2 +- 8 files changed, 80 insertions(+), 53 deletions(-) diff --git a/odex25_ensan/odex_benefit/models/seasonal_service.py b/odex25_ensan/odex_benefit/models/seasonal_service.py index 2848d2bb7..72a444f13 100644 --- a/odex25_ensan/odex_benefit/models/seasonal_service.py +++ b/odex25_ensan/odex_benefit/models/seasonal_service.py @@ -33,6 +33,10 @@ class SeasonalService(models.Model): ], string='state', default='draft', tracking=True, copy=False) is_payment_order_done = fields.Boolean(string='Is Payment Order Done?', copy=False) account_id = fields.Many2one('account.account', string='Expenses Account', related="service_type_id.account_id") + service_requests_ids = fields.One2many('service.request', 'seasonal_service_id', string='Service Requests') + benefit_ids = fields.Many2many(comodel_name='grant.benefit', relation='benefit_grant_seasonal_service_rel', + column1='seasonal_service_id', + column2='benefit_id', string='Families',copy=False) @api.depends('service_type_id','service_type_id.benefit_category_ids') @@ -128,12 +132,16 @@ class SeasonalService(models.Model): def action_approval_of_beneficiary_services(self): for rec in self: - if not rec.family_ids: - raise UserError(_("You Must Enter Families First")) + if not rec.service_requests_ids: + raise UserError(_("You must add at least one service request.")) + + rec.service_requests_ids.write({'state': 'accounting_approve'}) + rec.state = 'approval_of_beneficiary_services' def action_accounting_approve(self): for rec in self: + rec.service_requests_ids.write({'state': 'send_request_to_supplier'}) rec.state = 'accounting_approve' diff --git a/odex25_ensan/odex_benefit/models/service_request.py b/odex25_ensan/odex_benefit/models/service_request.py index e1c003bad..9550dd2be 100644 --- a/odex25_ensan/odex_benefit/models/service_request.py +++ b/odex25_ensan/odex_benefit/models/service_request.py @@ -190,6 +190,8 @@ class ServiceRequest(models.Model): string="Driving License") owner_identity = fields.Many2many('ir.attachment', 'request_owner_identity_rel', 'request_id', 'attachment_id', string="Owner Identity") + seasonal_service_id = fields.Many2one('seasonal.service', string='Seasonal Service', ondelete='cascade') + is_seasonal = fields.Boolean(string='Is Seasonal Service?',related='service_cat.is_seasonal_service') @api.depends('requested_service_amount', 'service_max_amount') def _get_money_for_payment_is_appearance(self): diff --git a/odex25_ensan/odex_benefit/views/actions_and_menus.xml b/odex25_ensan/odex_benefit/views/actions_and_menus.xml index 12d84a9ae..9c0e6685e 100644 --- a/odex25_ensan/odex_benefit/views/actions_and_menus.xml +++ b/odex25_ensan/odex_benefit/views/actions_and_menus.xml @@ -540,6 +540,7 @@ Services Requests service.request tree,form + [('is_seasonal','=',False)]

Create the Service Request

diff --git a/odex25_ensan/odex_benefit/views/seasonal_service_view.xml b/odex25_ensan/odex_benefit/views/seasonal_service_view.xml index 78aef4859..b7d1c8ed1 100644 --- a/odex25_ensan/odex_benefit/views/seasonal_service_view.xml +++ b/odex25_ensan/odex_benefit/views/seasonal_service_view.xml @@ -9,77 +9,83 @@
- + + attrs="{'invisible': [('is_payment_order_done', '=', False)]}"/> - - + + + attrs="{'readonly': [('state', '!=', 'draft')]}"/> - + attrs="{'readonly': [('state', '!=', 'draft')]}"/> + + }"/> - - - - + + + + + attrs="{'readonly': [('state', '!=', 'draft')]}"> - - - - - + + + + + + + + + + +
- - + groups="base.group_user"/> + +
@@ -91,14 +97,14 @@ seasonal.service - - - - - - - - + + + + + + + +
diff --git a/odex25_ensan/odex_benefit/views/service_request.xml b/odex25_ensan/odex_benefit/views/service_request.xml index c8c5f0cc7..7d105fa91 100644 --- a/odex25_ensan/odex_benefit/views/service_request.xml +++ b/odex25_ensan/odex_benefit/views/service_request.xml @@ -256,6 +256,7 @@ + diff --git a/odex25_ensan/odex_takaful/i18n/ar_001.po b/odex25_ensan/odex_takaful/i18n/ar_001.po index 8cd3708ec..435f3a302 100644 --- a/odex25_ensan/odex_takaful/i18n/ar_001.po +++ b/odex25_ensan/odex_takaful/i18n/ar_001.po @@ -3283,7 +3283,7 @@ msgstr "نظام الكفلاء ونقاط البيع" #. module: odex_takaful #: model:res.groups,name:odex_takaful.group_kufula_user msgid "Kufula User" -msgstr "" +msgstr "مستخدم الكفالات" #. module: odex_takaful #: model:ir.model.fields,field_description:odex_takaful.field_takaful_sponsor__lang diff --git a/odex25_ensan/odex_takaful/security/security_data.xml b/odex25_ensan/odex_takaful/security/security_data.xml index c670b35b8..d53169341 100644 --- a/odex25_ensan/odex_takaful/security/security_data.xml +++ b/odex25_ensan/odex_takaful/security/security_data.xml @@ -213,9 +213,18 @@ Responsible Users can access related Sponsorships - - [('sponsor_id.responsible_user_ids', 'in', [user.id])] - + [('create_uid','=',user.id)] + + + + + + + + Users can access related Donations Details Lines + + + [('create_uid','=',user.id)] diff --git a/odex25_ensan/odex_takaful/views/takaful_menus_actions.xml b/odex25_ensan/odex_takaful/views/takaful_menus_actions.xml index e3c5aae3e..6d737ef33 100644 --- a/odex25_ensan/odex_takaful/views/takaful_menus_actions.xml +++ b/odex25_ensan/odex_takaful/views/takaful_menus_actions.xml @@ -1,6 +1,6 @@ - + Date: Mon, 3 Nov 2025 18:08:22 +0400 Subject: [PATCH 8/9] [IMP] donation_details_lines: add donation amount field; update donation catalog controls for better quantity handling --- .../models/donation_details_lines.py | 1 + .../models/takaful_sponorship_model.py | 1 + .../src/js/donation_catalog_controls.js | 68 ++++---- .../odex_takaful/views/product_views.xml | 157 ++++++++---------- 4 files changed, 107 insertions(+), 120 deletions(-) diff --git a/odex25_ensan/odex_takaful/models/donation_details_lines.py b/odex25_ensan/odex_takaful/models/donation_details_lines.py index b08b7728f..a44af72f0 100644 --- a/odex25_ensan/odex_takaful/models/donation_details_lines.py +++ b/odex25_ensan/odex_takaful/models/donation_details_lines.py @@ -388,6 +388,7 @@ class DonationsDetailsLines(models.Model): "donation_types": 'donation', "name": product.name, "donation_qty": _qty, + "donation_amount": product.lst_price }) else: if existing: diff --git a/odex25_ensan/odex_takaful/models/takaful_sponorship_model.py b/odex25_ensan/odex_takaful/models/takaful_sponorship_model.py index 1d2ea1bb2..63336a5a3 100644 --- a/odex25_ensan/odex_takaful/models/takaful_sponorship_model.py +++ b/odex25_ensan/odex_takaful/models/takaful_sponorship_model.py @@ -328,6 +328,7 @@ class TakafulSponsorship(models.Model): "donation_types": 'donation', "name": product.name, "donation_qty": _qty, + "donation_amount": product.lst_price }) else: # remove if qty <= 0 diff --git a/odex25_ensan/odex_takaful/static/src/js/donation_catalog_controls.js b/odex25_ensan/odex_takaful/static/src/js/donation_catalog_controls.js index f4160cad6..b8faa33cb 100644 --- a/odex25_ensan/odex_takaful/static/src/js/donation_catalog_controls.js +++ b/odex25_ensan/odex_takaful/static/src/js/donation_catalog_controls.js @@ -3,6 +3,13 @@ // Attach event handlers immediately using event delegation // Odoo converts 'name' attribute to 'data-name' in rendered HTML +$(document).on('click', 'button[data-name="add_quantity_button_request"]', function(e) { + e.preventDefault(); + e.stopPropagation(); + handleQuantityChange($(this), 'first_add'); + return false; // ensure Odoo's default kanban action handler does not run +}); + $(document).on('click', 'button[data-name="add_quantity_button_so"]', function(e) { e.preventDefault(); e.stopPropagation(); @@ -24,6 +31,9 @@ window.__dc_add = function(btn) { window.__dc_remove = function(btn) { return __dc_handle(btn, 'remove'); }; +window.__dc_first_add = function(btn) { + return __dc_handle(btn, 'first_add'); +}; function __dc_handle(btn, operation) { try { @@ -36,6 +46,7 @@ function __dc_handle(btn, operation) { } async function handleQuantityChange($button, operation) { + // Get the kanban record (product card) container const $kanbanRecord = $button.closest('.o_kanban_record'); if (!$kanbanRecord.length) { @@ -43,24 +54,26 @@ async function handleQuantityChange($button, operation) { } // Get quantity display element from the button's parent container using stable custom classes - const $container = $button.closest('.dc-qty-controls'); - const $quantityDisplay = $container.find('.dc-qty-badge'); - - if (!$quantityDisplay.length) { - return; + let $container = $button.closest('.dc-qty-controls'); + if (operation === 'first_add'){ + $container = $kanbanRecord.find('.dc-qty-controls') } + let $quantityDisplay = $container.find('.dc-qty-badge'); + // if (!$quantityDisplay.length) { + // return; + // } // Extract product ID from the image URL const $img = $kanbanRecord.find('.o_kanban_image img'); - if (!$img.length) { - return; - } + // if (!$img.length) { + // return; + // } const imgSrc = $img.attr('src'); const match = imgSrc.match(/[&?]id=(\d+)/); - if (!match || !match[1]) { - return; - } + // if (!match || !match[1]) { + // return; + // } const productId = parseInt(match[1]); let currentQuantity = parseFloat($quantityDisplay.text()) || 0; @@ -68,10 +81,6 @@ async function handleQuantityChange($button, operation) { // Prevent going below zero for remove operation if (operation === 'remove' && currentQuantity <= 0) { - $quantityDisplay.addClass('bg-warning').removeClass('bg-secondary'); - setTimeout(() => { - $quantityDisplay.removeClass('bg-warning').addClass('bg-secondary'); - }, 300); return; } @@ -108,16 +117,22 @@ async function handleQuantityChange($button, operation) { // Calculate new quantity let newQuantity = currentQuantity; - if (operation === 'add') { - newQuantity += 1; - } else if (operation === 'remove') { - newQuantity -= 1; + if (operation === 'first_add'){ + $button.addClass('d-none'); + $kanbanRecord.find('.dc-qty-controls').removeClass("d-none"); + } + + if (operation === 'add' || operation === 'first_add') { + newQuantity = newQuantity + 1; + } + + if (operation === 'remove') { + newQuantity = newQuantity - 1; } // Update display optimistically $quantityDisplay.text(newQuantity.toFixed(2)); - try { // Call server to update quantity await $.ajax({ @@ -139,22 +154,13 @@ async function handleQuantityChange($button, operation) { throw info; }); - // Visual feedback - flash color based on operation - if (operation === 'add') { - $quantityDisplay.addClass('bg-success').removeClass('bg-secondary'); - } else { - $quantityDisplay.addClass('bg-info').removeClass('bg-secondary'); - } - setTimeout(() => { - $quantityDisplay.removeClass('bg-success bg-info').addClass('bg-secondary'); - }, 300); } catch (error) { // Revert on error $quantityDisplay.text(currentQuantity.toFixed(2)); - $quantityDisplay.addClass('bg-danger').removeClass('bg-secondary'); + // $quantityDisplay.addClass('bg-danger').removeClass('bg-secondary'); setTimeout(() => { - $quantityDisplay.removeClass('bg-danger').addClass('bg-secondary'); + // $quantityDisplay.removeClass('bg-danger').addClass('bg-secondary'); }, 1000); } finally { // Re-enable buttons diff --git a/odex25_ensan/odex_takaful/views/product_views.xml b/odex25_ensan/odex_takaful/views/product_views.xml index 4396d1eab..bdc236ef2 100644 --- a/odex25_ensan/odex_takaful/views/product_views.xml +++ b/odex25_ensan/odex_takaful/views/product_views.xml @@ -4,34 +4,37 @@ product.template - - - + + +
-
+ style="min-height: 100px;width: 25%;"> +
Product + alt="Product" class="o_image_64_contain" style="width: 100%;object-fit: cover;height: 100px;"/>
+
+ Amount: + +
-
+ style="justify-content: space-between;"> +
- +
-
    + @@ -40,77 +43,51 @@ -
+ +
- - + + - - - - - - - - - - -
- - - - - - - - +
+
+
+ +
+
+ +
+
+ +
+
- - - - - - - - - - - - - - - - - - -
@@ -119,6 +96,7 @@ + product.template.tree.sponsorship @@ -126,23 +104,24 @@
-
- - - + + +
odex.takaful.product.template.form.view product.template - + - + - + \ No newline at end of file From cf082e3988a2184c1bed0f25f4345df385240657 Mon Sep 17 00:00:00 2001 From: Abdurrahman Saber Date: Mon, 3 Nov 2025 17:18:20 +0200 Subject: [PATCH 9/9] [IMP] odex_takaful: reset to draft, multiple line extension --- .../odex_takaful/data/server_actions.xml | 8 + .../odex_takaful/models/account_move.py | 13 +- .../models/donation_details_lines.py | 5 +- .../odex_takaful/models/res_partner.py | 15 +- .../models/takaful_sponorship_model.py | 94 +------- .../odex_takaful/security/ir.model.access.csv | 1 + .../views/takaful_sponorship_view.xml | 5 +- .../wizards/account_payment_register.py | 5 +- .../wizards/donation_extension_wizard.py | 227 +++++++++++------- .../wizards/donation_extension_wizard.xml | 34 ++- 10 files changed, 213 insertions(+), 194 deletions(-) diff --git a/odex25_ensan/odex_takaful/data/server_actions.xml b/odex25_ensan/odex_takaful/data/server_actions.xml index c4bdf4c4c..ee01e5634 100644 --- a/odex25_ensan/odex_takaful/data/server_actions.xml +++ b/odex25_ensan/odex_takaful/data/server_actions.xml @@ -10,5 +10,13 @@ action = records.action_unlink_sponsor_and_related() + + + Extend Donation + + + code + action = records.action_extend_sponsorship() + \ No newline at end of file diff --git a/odex25_ensan/odex_takaful/models/account_move.py b/odex25_ensan/odex_takaful/models/account_move.py index b67c5434f..eaaebd7ec 100644 --- a/odex25_ensan/odex_takaful/models/account_move.py +++ b/odex25_ensan/odex_takaful/models/account_move.py @@ -7,13 +7,22 @@ from collections import defaultdict class AccountMove(models.Model): _inherit = 'account.move' - takaful_sponsorship_id = fields.Many2one('takaful.sponsorship') + takaful_sponsorship_id = fields.Many2one('takaful.sponsorship', compute='_compute_takaful_sponsorship_id', store=True) is_refund_sponsorship = fields.Boolean(string='Is Refund Sponsorship', default=False) sponsorship_scheduling_line = fields.Many2one('sponsorship.scheduling.line') payment_details_line = fields.Many2one('payment.details.lines') sponsorship_id = fields.Many2one('takaful.sponsorship', string='Sponsorship', readonly=True, ) payment_id = fields.Many2one('account.payment', string='Payment', copy=False) + @api.depends('state') + def _compute_takaful_sponsorship_id(self): + for move in self: + if not move.takaful_sponsorship_id: + partials = move.line_ids.matched_debit_ids | move.line_ids.matched_credit_ids + takaful_sponsorship_ids = (partials.debit_move_id.move_id.takaful_sponsorship_id | partials.credit_move_id.move_id.takaful_sponsorship_id) + move.takaful_sponsorship_id = takaful_sponsorship_ids[-1] if takaful_sponsorship_ids else False + else: + move.takaful_sponsorship_id = move.takaful_sponsorship_id def action_move_line_create(self): ''' Confirm the vouchers given in ids and create the journal entries for each of them @@ -239,5 +248,5 @@ class AccountMove(models.Model): class AccountMoveLines(models.Model): _inherit = 'account.move.line' - takaful_sponsorship_id = fields.Many2one('takaful.sponsorship') + takaful_sponsorship_id = fields.Many2one('takaful.sponsorship', related='move_id.takaful_sponsorship_id', store=True) diff --git a/odex25_ensan/odex_takaful/models/donation_details_lines.py b/odex25_ensan/odex_takaful/models/donation_details_lines.py index a44af72f0..b6145bfe9 100644 --- a/odex25_ensan/odex_takaful/models/donation_details_lines.py +++ b/odex25_ensan/odex_takaful/models/donation_details_lines.py @@ -934,7 +934,6 @@ class DonationsDetailsLines(models.Model): """ Open wizard to extend donation detail line """ - self.ensure_one() return { 'type': 'ir.actions.act_window', @@ -943,9 +942,7 @@ class DonationsDetailsLines(models.Model): 'view_mode': 'form', 'target': 'new', 'context': { - 'default_donation_detail_id': self.id, - 'default_current_end_date': self.end_date, - 'default_amount': self.product_template_id.list_price, + 'donation_detail_ids': self.ids, }, } diff --git a/odex25_ensan/odex_takaful/models/res_partner.py b/odex25_ensan/odex_takaful/models/res_partner.py index 4390bf9cd..8c54daa2e 100644 --- a/odex25_ensan/odex_takaful/models/res_partner.py +++ b/odex25_ensan/odex_takaful/models/res_partner.py @@ -5,8 +5,7 @@ from odoo.exceptions import UserError, ValidationError, Warning from dateutil.parser import parse import re from odoo.osv import expression -SAUDI_MOBILE_PATTERN = r"^(05|5)(5|0|3|6|4|9|1|8|7)([0-9]{7})$" - +SAUDI_MOBILE_PATTERN = r"^(\+?966)?0?5[013456789][0-9]{7}$" class IrActionsServer(models.Model): _inherit = 'ir.actions.server' @@ -407,3 +406,15 @@ class ResPartner(models.Model): else: rec.name = " " +class ResPartnerBank(models.Model): + _inherit = 'res.partner.bank' + + def name_get(self): + result = [] + for bank in self: + if bank.bank_id: + name = f"{bank.acc_number} - {bank.bank_id.name}" + else: + name = f"{bank.acc_number}" + result.append((bank.id, name)) + return result \ No newline at end of file diff --git a/odex25_ensan/odex_takaful/models/takaful_sponorship_model.py b/odex25_ensan/odex_takaful/models/takaful_sponorship_model.py index 63336a5a3..6b0724671 100644 --- a/odex25_ensan/odex_takaful/models/takaful_sponorship_model.py +++ b/odex25_ensan/odex_takaful/models/takaful_sponorship_model.py @@ -15,7 +15,7 @@ import requests from odoo.osv import expression import logging -SAUDI_MOBILE_PATTERN = r"^(05|5)(5|0|3|6|4|9|1|8|7)([0-9]{7})$" +SAUDI_MOBILE_PATTERN = r"^(\+?966)?0?5[013456789][0-9]{7}$" def trunc_datetime(someDate): @@ -755,6 +755,7 @@ class TakafulSponsorship(models.Model): taxes = line.move_id.fiscal_position_id.map_tax(taxes, partner=line.partner_id) line.tax_ids = taxes line.product_uom_id = line._get_computed_uom() + bill_id.action_post() else: sponsorship.state = sponsorship.state @@ -1068,90 +1069,11 @@ class TakafulSponsorship(models.Model): rec.expected_cancel_date = None rec.due_days = 0 - # On Change - # @api.onchange('sponsorship_class', 'sponsorship_type', 'benefit_id', 'benefit_ids') - # def sponsorship_fully_value(self): - # if self.sponsorship_class == 'fully' and self.benefit_ids and self.sponsorship_type == 'group': - # self.update({'contribution_value': sum( - # self.benefit_ids.mapped('benefit_needs_value'))}) - # elif self.sponsorship_class == 'fully' and self.benefit_id and self.sponsorship_type == 'person': - # self.update( - # {'contribution_value': self.benefit_id.benefit_needs_value}) - # else: - # self.update({'contribution_value': 0}) - - # @api.constrains('contribution_value') - # def check_contribution_value(self): - # if not self.sponsor_id: - # raise ValidationError( - # _(u'Please Select The Sponsor')) - - # if not self.sponsorship_type: - # raise ValidationError( - # _(u'Please Select Sponsorship Type')) - # - # if not self.benefit_type: - # raise ValidationError( - # _(u'Please Select Sponsorship Beneficiary Type')) - # - # if not self.sponsorship_class: - # raise ValidationError( - # _(u'Please Select Sponsorship Class')) - # - # if not self.sponsorship_duration: - # raise ValidationError( - # _(u'Please Select Sponsorship Duration')) - # - # if not self.benefit_id and self.sponsorship_type == 'person': - # raise ValidationError( - # _(u'Please Select a Beneficiary For Sponsorship Person')) - # - # if len(self.benefit_ids) < 2 and self.sponsorship_type == 'group': - # raise ValidationError( - # _(u'Please Select At least Two Beneficiaries For Sponsorship Group')) - # - # if self.sponsorship_class == 'partial': - # default_sponsorship = int( - # self.env['ir.config_parameter'].sudo().get_param('odex_takaful_base.min_kafala', 0)) - # - # if self.benefit_ids and self.sponsorship_type == 'group': - # benefit_count = len(self.benefit_ids) - # else: - # benefit_count = 1 - # - # if default_sponsorship <= 0: - # raise ValidationError( - # _(u'Min kafala value should be defined by administration')) - # - # total_sponsorship = default_sponsorship * benefit_count - # if self.contribution_value < total_sponsorship: - # raise ValidationError( - # _(u'Kafala value should be equal or greater than') + ' ' + str(total_sponsorship)) - - # Model Operations @api.model def create(self, vals): if vals.get('code', 'New') == 'New': vals['code'] = self.env['ir.sequence'].sudo().next_by_code('sponsorship.sequence') - # if vals.get('benefit_type') == 'orphan': - # main_code = self.env['ir.sequence'].sudo( - # ).next_by_code('sponsorship.sequence') - # sub_code = self.env['ir.sequence'].sudo().next_by_code( - # 'sponsorship.orphan.sequence') - # if main_code and sub_code: - # defualt_code = 'OR/' + str(main_code) + '/' + sub_code - # vals.update({"code": defualt_code}) - - # elif vals.get('benefit_type') == 'widow': - # main_code = self.env['ir.sequence'].sudo( - # ).next_by_code('sponsorship.sequence') - # sub_code = self.env['ir.sequence'].sudo().next_by_code( - # 'sponsorship.widow.sequence') - # if main_code and sub_code: - # defualt_code = 'WI/' + str(main_code) + '/' + sub_code - # vals.update({"code": defualt_code}) - - # Valid Sponsor Mobile + sponsor_phone = vals.get('sponsor_phone', False) if sponsor_phone: self._check_phone_numbers(sponsor_phone) @@ -1730,6 +1652,7 @@ class TakafulSponsorship(models.Model): 'dont_redirect_to_payments': True, 'sponsorship_line_ids': sponsorship_line_ids.ids, 'sponsorship_payment': True, + 'sponsorship_payment_skip_compute_amount': True, 'default_sponsorship_payment': True, 'force_sponsorship_line_partner_id': self.sponsor_id.id, }, @@ -1743,6 +1666,15 @@ class TakafulSponsorship(models.Model): sponsorship_line_ids = (rec.donations_details_lines | rec.donations_details_lines_mechanism_ids).filtered(lambda l: not l.direct_debit) rec.show_register_payment = rec.with_context(exclude_direct_debit=True).amount_paid < sum(sponsorship_line_ids.mapped('total_donation_amount')) + def action_reset_to_draft(self): + for rec in self: + 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.button_cancel() + self.write({'state': 'draft'}) + class AnotherSponsors(models.Model): _name = "donate.for.another.person" diff --git a/odex25_ensan/odex_takaful/security/ir.model.access.csv b/odex25_ensan/odex_takaful/security/ir.model.access.csv index 25899b728..7c34b0b99 100644 --- a/odex25_ensan/odex_takaful/security/ir.model.access.csv +++ b/odex25_ensan/odex_takaful/security/ir.model.access.csv @@ -45,6 +45,7 @@ access_group_kufula_user_account_partial_reconcile,access_group_kufula_user_acco access_group_kufula_user_account_full_reconcile,access_group_kufula_user_account_full_reconcile,account.model_account_full_reconcile,odex_takaful.group_kufula_user,1,1,1,0 access_donation_extension_wizard,donation.extension.wizard.access,model_donation_extension_wizard,base.group_user,1,1,1,1 access_donation_extension_history,donation.extension.history.access,model_donation_extension_history,odex_takaful.group_kufula_user,1,1,1,0 +access_donation_extension_wizard_line,donation.extension.wizard.line.access,model_donation_extension_wizard_line,odex_takaful.group_kufula_user,1,1,1,0 access_replace_sponsor_wizard,replace.sponsor.wizard.access,model_replace_sponsor_wizard,odex_takaful.group_replace_sponsor,1,1,1,1 diff --git a/odex25_ensan/odex_takaful/views/takaful_sponorship_view.xml b/odex25_ensan/odex_takaful/views/takaful_sponorship_view.xml index b5ddf7845..d13a75436 100644 --- a/odex25_ensan/odex_takaful/views/takaful_sponorship_view.xml +++ b/odex25_ensan/odex_takaful/views/takaful_sponorship_view.xml @@ -39,6 +39,9 @@