From e28c88af889ef7be03a3f1ec82c33e3e22353590 Mon Sep 17 00:00:00 2001 From: eman Date: Thu, 7 Nov 2024 03:57:19 +0200 Subject: [PATCH] Payment Orders --- odex25_ensan/odex_benefit/__manifest__.py | 3 + .../odex_benefit/data/sequence_data.xml | 11 +++ .../odex_benefit/data/server_actions.xml | 13 +++ odex25_ensan/odex_benefit/models/__init__.py | 1 + .../odex_benefit/models/payment_order.py | 49 +++++++++++ .../odex_benefit/models/service_request.py | 23 +++++- .../odex_benefit/security/ir.model.access.csv | 4 +- .../odex_benefit/views/actions_and_menus.xml | 2 +- .../views/family_expense_view.xml | 2 +- .../odex_benefit/views/payment_order.xml | 82 +++++++++++++++++++ .../odex_benefit/views/service_request.xml | 21 ++++- odex25_ensan/odex_benefit/wizards/__init__.py | 1 + .../wizards/exchange_order_wizard.py | 18 ++++ .../wizards/exchange_order_wizard.xml | 25 ++++++ 14 files changed, 248 insertions(+), 7 deletions(-) create mode 100644 odex25_ensan/odex_benefit/data/server_actions.xml create mode 100644 odex25_ensan/odex_benefit/models/payment_order.py create mode 100644 odex25_ensan/odex_benefit/views/payment_order.xml create mode 100644 odex25_ensan/odex_benefit/wizards/exchange_order_wizard.py create mode 100644 odex25_ensan/odex_benefit/wizards/exchange_order_wizard.xml diff --git a/odex25_ensan/odex_benefit/__manifest__.py b/odex25_ensan/odex_benefit/__manifest__.py index 427c769aa..140271ad4 100644 --- a/odex25_ensan/odex_benefit/__manifest__.py +++ b/odex25_ensan/odex_benefit/__manifest__.py @@ -13,6 +13,7 @@ 'security/security_view.xml', 'security/ir.model.access.csv', 'data/scheduled_actions.xml', + 'data/server_actions.xml', 'data/email_temps.xml', 'views/benefit_view.xml', 'views/users_inherit.xml', @@ -21,6 +22,7 @@ 'wizards/researcher_wizard.xml', 'wizards/suspend_reason_wizard.xml', 'wizards/exception_wizard.xml', + 'wizards/exchange_order_wizard.xml', 'views/visit.xml', 'views/main_service.xml', 'views/member_location.xml', @@ -29,6 +31,7 @@ 'views/ir_attachment_inherit.xml', 'views/changes_requests.xml', 'views/education_settings.xml', + 'views/payment_order.xml', # 'views/res_config_settings_view.xml', # 'views/benefit_expenses_view.xml', 'views/sms_view.xml', diff --git a/odex25_ensan/odex_benefit/data/sequence_data.xml b/odex25_ensan/odex_benefit/data/sequence_data.xml index 5040e66b2..ce42ec8c7 100644 --- a/odex25_ensan/odex_benefit/data/sequence_data.xml +++ b/odex25_ensan/odex_benefit/data/sequence_data.xml @@ -53,4 +53,15 @@ 4 + + + Payment Orders Sequence + payment.orders.sequence + P/ + + + + + 4 + \ No newline at end of file diff --git a/odex25_ensan/odex_benefit/data/server_actions.xml b/odex25_ensan/odex_benefit/data/server_actions.xml new file mode 100644 index 000000000..9a3250372 --- /dev/null +++ b/odex25_ensan/odex_benefit/data/server_actions.xml @@ -0,0 +1,13 @@ + + + + + + Exchange orders + + + code + action = records.action_open_exchange_order_wizard() + + + \ No newline at end of file diff --git a/odex25_ensan/odex_benefit/models/__init__.py b/odex25_ensan/odex_benefit/models/__init__.py index 69188a2e6..35628cfcc 100644 --- a/odex25_ensan/odex_benefit/models/__init__.py +++ b/odex25_ensan/odex_benefit/models/__init__.py @@ -25,4 +25,5 @@ from . import family_expense from . import services_settings from . import res_country_inherit from . import service_request +from . import payment_order # from . import res_config_settings \ No newline at end of file diff --git a/odex25_ensan/odex_benefit/models/payment_order.py b/odex25_ensan/odex_benefit/models/payment_order.py new file mode 100644 index 000000000..085e4d03e --- /dev/null +++ b/odex25_ensan/odex_benefit/models/payment_order.py @@ -0,0 +1,49 @@ +from odoo import fields, models, api, _ + + +class PaymentOrders(models.Model): + _name = 'payment.orders' + _description = "Payment Orders" + + name = fields.Char(string="Code", copy=False, readonly=True, default=lambda x: _('New')) + ref_num = fields.Char(string='Ref. Number') + payment_order_date = fields.Datetime(string="Payment Order Date",default=fields.Datetime.now) + accountant_id = fields.Many2one('res.users',string='Accountant') + payment_order_description = fields.Char(string='Payment Order Description') + service_requests_ids = fields.One2many('service.request', 'payment_order_id', string ='Service Requests') + state = fields.Selection(string='Status', selection=[('draft', 'Draft'),('accountant_approve', 'accountant Approve'),('department_manager_approve', 'Department Manager Approve') + ,('accounting_approve', 'Accounting Approve'),('general_manager_approve', 'General Manager Approve'),('refused', 'Refused')]) + + @api.model + def create(self, vals): + res = super(PaymentOrders, self).create(vals) + if not res.name or res.name == _('New'): + res.name = self.env['ir.sequence'].sudo().next_by_code('payment.orders.sequence') or _('New') + return res + + @api.model + def search(self, args, offset=0, limit=None, order=None, count=False): + if self.env.user and self.env.user.id and self.env.user.has_group( + "odex_benefit.group_benefit_accountant_accept"): + args += [('accountant_id', '=', self.env.user.id)] + return super(PaymentOrders, self).search(args, offset, limit, order, count) + + def action_accountant_approve(self): + for rec in self: + rec.state = 'accountant_approve' + + def action_department_manager_approve(self): + for rec in self: + rec.state = 'department_manager_approve' + + def action_accounting_approve(self): + for rec in self: + rec.state = 'accounting_approve' + + def action_general_manager_approve(self): + for rec in self: + rec.state = 'general_manager_approve' + + def action_refuse(self): + for rec in self: + rec.state = 'refused' \ No newline at end of file diff --git a/odex25_ensan/odex_benefit/models/service_request.py b/odex25_ensan/odex_benefit/models/service_request.py index d025340b4..422e92b65 100644 --- a/odex25_ensan/odex_benefit/models/service_request.py +++ b/odex25_ensan/odex_benefit/models/service_request.py @@ -1,4 +1,3 @@ -from gevent.os import nb_write from odoo import fields, models, api, _ from odoo.exceptions import UserError, ValidationError from datetime import timedelta @@ -78,6 +77,8 @@ class ServiceRequest(models.Model): restoration_max_amount = fields.Float(string='Restoration Max Amount',compute='_get_restoration_max_amount') has_money_to_pay_first_payment = fields.Selection([('yes', 'Yes'), ('no', 'No')],string='Has money to pay first payment?') has_money_field_is_appearance = fields.Boolean(string='Has money Field is appearance?',compute='_get_money_field_is_appearance') + payment_order_id = fields.Many2one('payment.orders',string='Payment Order') + is_payment_order_done = fields.Boolean(string='Is Payment Order Done?') state = fields.Selection([ ('draft', 'Draft'), ('researcher', 'Researcher'), @@ -344,4 +345,22 @@ class ServiceRequest(models.Model): for rec in self: rec.state= 'draft' - + def action_open_exchange_order_wizard(self): + ids = [] + for rec in self: + ids.append(rec.id) + default_service_ids = ids + service_requests = self.env['service.request'].browse(ids) + if any(request.state not in 'accounting_approve' for request in service_requests): + raise UserError(_("All selected requests should be in Accounting Approve state")) + if any(request.payment_order_id for request in service_requests): + raise UserError(_("All selected requests should be not has payment order")) + else: + return { + 'type': 'ir.actions.act_window', + 'name': 'Exchange Order', + 'res_model': 'exchange.order.wizard', + 'view_mode': 'form', + 'target': 'new', + 'context': {'default_service_ids': ids} + } diff --git a/odex25_ensan/odex_benefit/security/ir.model.access.csv b/odex25_ensan/odex_benefit/security/ir.model.access.csv index 7163a9a25..428ba10b3 100644 --- a/odex25_ensan/odex_benefit/security/ir.model.access.csv +++ b/odex25_ensan/odex_benefit/security/ir.model.access.csv @@ -127,4 +127,6 @@ access_marital_status,access_marital_status,model_marital_status,base.group_user access_service_attachments_settings,access_service_attachments_settings,model_service_attachments_settings,base.group_user,1,1,1,1 access_home_restoration_lines,access_home_restoration_lines,model_home_restoration_lines,base.group_user,1,1,1,1 access_home_maintenance_lines,access_home_maintenance_lines,model_home_maintenance_lines,base.group_user,1,1,1,1 -access_home_maintenance_items,access_home_maintenance_items,model_home_maintenance_items,base.group_user,1,1,1,1 \ No newline at end of file +access_home_maintenance_items,access_home_maintenance_items,model_home_maintenance_items,base.group_user,1,1,1,1 +access_exchange_order_wizard,access_exchange_order_wizard,model_exchange_order_wizard,base.group_user,1,1,1,1 +access_payment_orders,access_payment_orders,model_payment_orders,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/odex25_ensan/odex_benefit/views/actions_and_menus.xml b/odex25_ensan/odex_benefit/views/actions_and_menus.xml index 98703d7a3..5a9d6c9ff 100644 --- a/odex25_ensan/odex_benefit/views/actions_and_menus.xml +++ b/odex25_ensan/odex_benefit/views/actions_and_menus.xml @@ -541,7 +541,7 @@ Services Requests service.request tree,form - [('state','=','second_approve')] + ['|','|',('state','=','second_approve'),('state','=','accounting_approve'),('state','=','refused')]

Create the Service Request

diff --git a/odex25_ensan/odex_benefit/views/family_expense_view.xml b/odex25_ensan/odex_benefit/views/family_expense_view.xml index 06bb10cf7..ae1726d32 100644 --- a/odex25_ensan/odex_benefit/views/family_expense_view.xml +++ b/odex25_ensan/odex_benefit/views/family_expense_view.xml @@ -137,7 +137,7 @@ + action="action_confirm_benefit_expense" sequence="11"/> account.move.line.form diff --git a/odex25_ensan/odex_benefit/views/payment_order.xml b/odex25_ensan/odex_benefit/views/payment_order.xml new file mode 100644 index 000000000..ab449d064 --- /dev/null +++ b/odex25_ensan/odex_benefit/views/payment_order.xml @@ -0,0 +1,82 @@ + + + + payment.orders.form + payment.orders + +
+
+
+ + +
+

+ +

+
+ + + + + + + + +
+ + + + + + + + + + + + + + + +
+
+
+
+ + payment.orders.tree + payment.orders + + + + + + + + + + + + + Payment Orders + payment.orders + tree,form + + + + + +
+
diff --git a/odex25_ensan/odex_benefit/views/service_request.xml b/odex25_ensan/odex_benefit/views/service_request.xml index 3e48b198e..3d8a4c724 100644 --- a/odex25_ensan/odex_benefit/views/service_request.xml +++ b/odex25_ensan/odex_benefit/views/service_request.xml @@ -34,6 +34,9 @@ + +

@@ -50,6 +53,7 @@ + @@ -176,6 +180,7 @@ + @@ -200,14 +205,26 @@ - + - + + + + + + + + + + + + + diff --git a/odex25_ensan/odex_benefit/wizards/__init__.py b/odex25_ensan/odex_benefit/wizards/__init__.py index 7ee1add2d..2a9dbdfe2 100644 --- a/odex25_ensan/odex_benefit/wizards/__init__.py +++ b/odex25_ensan/odex_benefit/wizards/__init__.py @@ -4,4 +4,5 @@ from . import entity_black_list_wizard from . import researcher_wizard from . import suspend_reason_wizard from . import exception_wizard +from . import exchange_order_wizard diff --git a/odex25_ensan/odex_benefit/wizards/exchange_order_wizard.py b/odex25_ensan/odex_benefit/wizards/exchange_order_wizard.py new file mode 100644 index 000000000..a8228f17b --- /dev/null +++ b/odex25_ensan/odex_benefit/wizards/exchange_order_wizard.py @@ -0,0 +1,18 @@ +from odoo import models, fields, api + +class ExchangeOrderWizard(models.TransientModel): + _name = 'exchange.order.wizard' + _description = 'Wizard to Assign Accounting that Exchange Orders' + + accountant_id = fields.Many2one('res.users',string='Accountant') + + def create_payment_order(self): + active_ids = self.env.context.get('default_service_ids') + service_requests = self.env['service.request'].browse(active_ids) + for service in service_requests: + service.is_payment_order_done = True + self.env['payment.orders'].create({ + 'state':'draft', + 'accountant_id':self.accountant_id.id, + 'service_requests_ids' : service_requests.ids + }) diff --git a/odex25_ensan/odex_benefit/wizards/exchange_order_wizard.xml b/odex25_ensan/odex_benefit/wizards/exchange_order_wizard.xml new file mode 100644 index 000000000..a1e12a079 --- /dev/null +++ b/odex25_ensan/odex_benefit/wizards/exchange_order_wizard.xml @@ -0,0 +1,25 @@ + + + exchange.order.wizard.form + exchange.order.wizard + +
+ + + +
+
+
+
+
+ + + + Exchange Order + exchange.order.wizard + form + new + +