Merge pull request #1703 from expsa/ensan_services_tasks_27_10

Payment Orders
This commit is contained in:
enagahh 2024-11-07 03:58:23 +02:00 committed by GitHub
commit c4fe08eb9c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 248 additions and 7 deletions

View File

@ -14,6 +14,7 @@
'security/ir.model.access.csv',
'views/actions_and_menus.xml',
'data/scheduled_actions.xml',
'data/server_actions.xml',
'data/email_temps.xml',
'views/benefit_view.xml',
@ -25,6 +26,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',
@ -33,6 +35,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',

View File

@ -53,4 +53,15 @@
<field eval="False" name="company_id"/>
<field name="padding">4</field>
</record>
<!-- Sequence for payment orders -->
<record id="payment_orders_sequence" model="ir.sequence">
<field name="name">Payment Orders Sequence</field>
<field name="code">payment.orders.sequence</field>
<field name="prefix">P/</field>
<field eval="1" name="number_next"/>
<field eval="1" name="number_increment"/>
<field eval="True" name="use_date_range"/>
<field eval="False" name="company_id"/>
<field name="padding">4</field>
</record>
</odoo>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!-- Used to bring a menu inside action menu -->
<record id="server_action_exchange_orders" model="ir.actions.server">
<field name="name">Exchange orders</field>
<field name="model_id" ref="odex_benefit.model_service_request"/>
<field name="binding_model_id" ref="odex_benefit.model_service_request"/>
<field name="state">code</field>
<field name="code">action = records.action_open_exchange_order_wizard()</field>
</record>
</data>
</odoo>

View File

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

View File

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

View File

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

View File

@ -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
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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
127 access_service_attachments_settings access_service_attachments_settings model_service_attachments_settings base.group_user 1 1 1 1
128 access_home_restoration_lines access_home_restoration_lines model_home_restoration_lines base.group_user 1 1 1 1
129 access_home_maintenance_lines access_home_maintenance_lines model_home_maintenance_lines base.group_user 1 1 1 1
130 access_home_maintenance_items access_home_maintenance_items model_home_maintenance_items base.group_user 1 1 1 1
131 access_exchange_order_wizard access_exchange_order_wizard model_exchange_order_wizard base.group_user 1 1 1 1
132 access_payment_orders access_payment_orders model_payment_orders base.group_user 1 1 1 1

View File

@ -541,7 +541,7 @@
<field name="name">Services Requests</field>
<field name="res_model">service.request</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('state','=','second_approve')]</field>
<field name="domain">['|','|',('state','=','second_approve'),('state','=','accounting_approve'),('state','=','refused')]</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">Create the Service Request
</p>

View File

@ -137,7 +137,7 @@
<!-- Menu Item -->
<menuitem id="menu_confirm_benefit_expense" name="Benefit Expense Flow" parent="account.menu_finance_payables"
action="action_confirm_benefit_expense" sequence="10"/>
action="action_confirm_benefit_expense" sequence="11"/>
<record id="view_move_line_tree_new_code" model="ir.ui.view">
<field name="name">account.move.line.form</field>

View File

@ -0,0 +1,82 @@
<odoo>
<data>
<record id="payment_orders_form" model="ir.ui.view">
<field name="name">payment.orders.form</field>
<field name="model">payment.orders</field>
<field name="arch" type="xml">
<form string="Payment Orders">
<header>
<button name="action_accountant_approve" type="object" states="draft"
string="Accountant Approve" class="oe_highlight" groups="odex_benefit.group_benefit_accountant_accept"/>
<button name="action_department_manager_approve" type="object" states="accountant_approve"
string="Department Manager Approve" class="oe_highlight" groups="odex25_account_payment_fix.group_depart_manager"/>
<button name="action_accounting_approve" type="object" states="department_manager_approve"
string="Accounting Approve" class="oe_highlight" groups="odex25_account_payment_fix.group_accounting_manager"/>
<button name="action_general_manager_approve" type="object" states="accounting_approve"
string="General Manager Approve" class="oe_highlight" groups="odex25_account_payment_fix.group_general_manager"/>
<button name="action_refuse" type="object" states="draft,accountant_approve,department_manager_approve,accounting_approve,general_manager_approve"
string="Refuse" class="oe_highlight"/>
<field name="state" widget="statusbar"/>
</header>
<sheet>
<group>
<div class="oe_title">
<h1>
<field name="name" readonly="1"/>
</h1>
</div>
<group>
<field name="payment_order_date"/>
<field name="accountant_id"/>
</group>
<group>
<field name="payment_order_description"/>
<field name="ref_num"/>
</group>
</group>
<notebook>
<page string="Services Requests">
<field name="service_requests_ids" widget="one2many_list" readonly="1">
<tree editable="bottom">
<field name="family_id"/>
<field name="member_id"/>
<field name="branch_custom_id"/>
<field name="account_id"/>
<field name="name"/>
<field name="description"/>
<field name="paid_rent_amount"/>
</tree>
</field>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record id="payment_orders_tree" model="ir.ui.view">
<field name="name">payment.orders.tree</field>
<field name="model">payment.orders</field>
<field name="arch" type="xml">
<tree string="Payment Orders">
<field name="name" readonly="1"/>
<field name="payment_order_date"/>
<field name="accountant_id"/>
<field name="payment_order_description"/>
<field name="state"/>
</tree>
</field>
</record>
<!-- Action -->
<record id="action_payment_orders" model="ir.actions.act_window">
<field name="name">Payment Orders</field>
<field name="res_model">payment.orders</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="payment_orders_tree"/>
</record>
<!-- Menu Item -->
<menuitem id="menu_payment_orders" name="Payment Orders" parent="account.menu_finance_payables"
action="action_payment_orders" sequence="10"/>
</data>
</odoo>

View File

@ -34,6 +34,9 @@
<field name="state" widget="statusbar"/>
</header>
<sheet>
<field name="is_payment_order_done" invisible="1"/>
<widget name="web_ribbon" title="Payment Order Done" bg_color="bg-success"
attrs="{'invisible': [('is_payment_order_done', '=', False)]}"/>
<group>
<div class="oe_title">
<h1>
@ -50,6 +53,7 @@
<field name="member_id" attrs="{'invisible':[('benefit_type','!=','member')],'readonly':[('state','not in',['draft','researcher','send_request'])],'required':[('benefit_type','=','member')]}"/>
<field name="account_id"/>
<field name="accountant_id" attrs="{'invisible':[('state','in',['draft','researcher','send_request','first_approve','second_approve'])]}"/>
<field name="payment_order_id" readonly="1" groups="odex_benefit.group_benefit_accounting_accept"/>
<field name="is_service_producer" invisible="1"/>
<field name="service_producer_id" attrs="{'invisible':[('is_service_producer','=',False)],'readonly':[('state','not in',['draft','researcher','send_request'])]}"/>
</group>
@ -176,6 +180,7 @@
<field name="main_service_category"/>
<field name="sub_service_category"/>
<field name="service_cat"/>
<field name="payment_order_id" groups="odex_benefit.group_benefit_accounting_accept"/>
<field name="state" widget="badge" decoration-success="state in ['second_approve']" decoration-muted="state == 'draft'"
decoration-danger="state in ['refused']"
decoration-info="state in ['first_approve','send_request']"/>
@ -200,14 +205,26 @@
<filter string="Send Request" name="send_request" domain="[('state', '=', 'send_request')]"/>
<separator/>
<separator/>
<filter string="First Approve" name="first_approve" domain="[('state', '=', 'first_approve')]"/>
<filter string="Request First Approve" name="first_approve" domain="[('state', '=', 'first_approve')]"/>
<separator/>
<separator/>
<filter string="Second Approve" name="second_approve" domain="[('state', '=', 'second_approve')]"/>
<filter string="Request Second Approve" name="second_approve" domain="[('state', '=', 'second_approve')]"/>
<separator/>
<separator/>
<filter string="Accounting Approve" name="accounting_approve" domain="[('state', '=', 'accounting_approve')]"/>
<separator/>
<separator/>
<filter string="Refused" name="refused" domain="[('state', '=', 'refused')]"/>
<separator/>
<separator/>
<filter string="Payment Order Done" name="payment_order_done" domain="[('payment_order_id', '!=', False)]"/>
<separator/>
<separator/>
<filter string="Need Payment Order" name="payment_order_done" domain="[('payment_order_id', '=', False),('state','=','accounting_approve')]"/>
<separator/>
<searchpanel>
<field name="service_cat" string="Categories" enable_counters="1" />
</searchpanel>
</search>
</field>
</record>

View File

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

View File

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

View File

@ -0,0 +1,25 @@
<odoo>
<record id="view_exchange_order_wizard_form" model="ir.ui.view">
<field name="name">exchange.order.wizard.form</field>
<field name="model">exchange.order.wizard</field>
<field name="arch" type="xml">
<form string="Exchange Order">
<group>
<field name="accountant_id"/>
</group>
<footer>
<button string="Confirm" type="object" name="create_payment_order" class="btn-primary"/>
<button string="Cancel" class="btn-secondary" special="cancel"/>
</footer>
</form>
</field>
</record>
<!-- Action to open the wizard -->
<record id="action_exchange_order_wizard" model="ir.actions.act_window">
<field name="name">Exchange Order</field>
<field name="res_model">exchange.order.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</odoo>