@ -0,0 +1,35 @@ |
|||||
|
OHRMS Advance Salary' |
||||
|
===================== |
||||
|
|
||||
|
Advance Salary In HR. |
||||
|
|
||||
|
Installation |
||||
|
============ |
||||
|
- www.odoo.com/documentation/10.0/setup/install.html |
||||
|
- Install our custom addon |
||||
|
|
||||
|
License |
||||
|
======= |
||||
|
GNU AFFERO GENERAL PUBLIC LICENSE, Version 3 (AGPLv3) |
||||
|
(http://www.gnu.org/licenses/agpl.html) |
||||
|
|
||||
|
Bug Tracker |
||||
|
=========== |
||||
|
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. |
||||
|
|
||||
|
Credits |
||||
|
======= |
||||
|
* Cybrosys Techno Solutions <https://www.cybrosys.com> |
||||
|
|
||||
|
Author |
||||
|
------ |
||||
|
|
||||
|
Developers: Anusha P P <anusha@cybrosys.in> |
||||
|
Sreejith P <sreejith@cybrosys.in> |
||||
|
|
||||
|
Maintainer |
||||
|
---------- |
||||
|
|
||||
|
This module is maintained by Cybrosys Technologies. |
||||
|
|
||||
|
For support and more information, please visit https://www.cybrosys.com. |
@ -0,0 +1,4 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
|
||||
|
import models |
||||
|
|
@ -0,0 +1,51 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
################################################################################### |
||||
|
# A part of OpenHRMS Project <https://www.openhrms.com> |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# Copyright (C) 2018-TODAY Cybrosys Technologies (<https://www.cybrosys.com>). |
||||
|
# Author: Anusha P P (<https://www.cybrosys.com>) |
||||
|
# |
||||
|
# This program is free software: you can modify |
||||
|
# it under the terms of the GNU Affero General Public License (AGPL) as |
||||
|
# published by the Free Software Foundation, either version 3 of the |
||||
|
# License, or (at your option) any later version. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU Affero General Public License for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU Affero General Public License |
||||
|
# along with this program. If not, see <https://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
################################################################################### |
||||
|
{ |
||||
|
'name': 'OHRMS Advance Salary', |
||||
|
'version': '10.0.1.0.0', |
||||
|
'summary': 'Advance Salary In HR', |
||||
|
'description': """ |
||||
|
Helps you to manage Advance Salary Request of your company's staff. |
||||
|
""", |
||||
|
'category': 'Human Resources', |
||||
|
'author': "Cybrosys Techno Solutions", |
||||
|
'company': 'Cybrosys Techno Solutions', |
||||
|
'maintainer': 'Cybrosys Techno Solutions', |
||||
|
'website': "https://www.openhrms.com", |
||||
|
'depends': [ |
||||
|
'hr_payroll', 'hr', 'account_accountant', 'hr_contract', 'hr_loan', |
||||
|
], |
||||
|
'data': [ |
||||
|
'security/ir.model.access.csv', |
||||
|
'security/security.xml', |
||||
|
'views/salary_structure.xml', |
||||
|
'views/salary_advance.xml', |
||||
|
], |
||||
|
'demo': [], |
||||
|
'images': ['static/description/banner.jpg'], |
||||
|
'license': 'AGPL-3', |
||||
|
'installable': True, |
||||
|
'auto_install': False, |
||||
|
'application': False, |
||||
|
} |
||||
|
|
@ -0,0 +1,5 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
import salary_advance |
||||
|
import salary_structure |
||||
|
import hr_advance_payslip |
||||
|
|
@ -0,0 +1,29 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
from datetime import datetime |
||||
|
from odoo import models |
||||
|
from odoo.exceptions import except_orm |
||||
|
|
||||
|
|
||||
|
class SalaryRuleInput(models.Model): |
||||
|
_inherit = 'hr.payslip' |
||||
|
|
||||
|
def get_inputs(self, contract_ids, date_from, date_to): |
||||
|
"""This Compute the other inputs to employee payslip. |
||||
|
""" |
||||
|
res = super(SalaryRuleInput, self).get_inputs(contract_ids, date_from, date_to) |
||||
|
print self, contract_ids, date_from, date_to |
||||
|
contract_obj = self.env['hr.contract'] |
||||
|
emp_id = contract_obj.browse(contract_ids[0]).employee_id |
||||
|
adv_salary = self.env['salary.advance'].search([('employee_id', '=', emp_id.id)]) |
||||
|
print emp_id, adv_salary |
||||
|
for adv_obj in adv_salary: |
||||
|
current_date = datetime.strptime(date_from, '%Y-%m-%d').date().month |
||||
|
date = adv_obj.date |
||||
|
existing_date = datetime.strptime(date, '%Y-%m-%d').date().month |
||||
|
if current_date == existing_date: |
||||
|
state = adv_obj.state |
||||
|
amount = adv_obj.advance |
||||
|
for result in res: |
||||
|
if state == 'approve' and amount != 0 and result.get('code') == 'SAR': |
||||
|
result['amount'] = amount |
||||
|
return res |
@ -0,0 +1,186 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
import time |
||||
|
from datetime import datetime |
||||
|
from odoo import fields, models, api, _ |
||||
|
from odoo.exceptions import except_orm |
||||
|
from odoo import exceptions |
||||
|
|
||||
|
|
||||
|
class SalaryAdvancePayment(models.Model): |
||||
|
_name = "salary.advance" |
||||
|
_inherit = ['mail.thread', 'ir.needaction_mixin'] |
||||
|
|
||||
|
name = fields.Char(string='Name', readonly=True, select=True, default=lambda self: 'Adv/') |
||||
|
employee_id = fields.Many2one('hr.employee', string='Employee', required=True) |
||||
|
date = fields.Date(string='Date', required=True, default=lambda self: fields.Date.today()) |
||||
|
reason = fields.Text(string='Reason') |
||||
|
currency_id = fields.Many2one('res.currency', string='Currency', required=True, |
||||
|
default=lambda self: self.env.user.company_id.currency_id) |
||||
|
company_id = fields.Many2one('res.company', string='Company', required=True, |
||||
|
default=lambda self: self.env.user.company_id) |
||||
|
advance = fields.Float(string='Advance', required=True) |
||||
|
payment_method = fields.Many2one('account.journal', string='Payment Method') |
||||
|
exceed_condition = fields.Boolean(string='Exceed than maximum', |
||||
|
help="The Advance is greater than the maximum percentage in salary structure") |
||||
|
department = fields.Many2one('hr.department', string='Department') |
||||
|
state = fields.Selection([('draft', 'Draft'), |
||||
|
('submit', 'Submitted'), |
||||
|
('waiting_approval', 'Waiting Approval From Accounts'), |
||||
|
('approve', 'Approved'), |
||||
|
('cancel', 'Cancelled'), |
||||
|
('reject', 'Rejected')], string='Status', default='draft', track_visibility='onchange') |
||||
|
debit = fields.Many2one('account.account', string='Debit Account') |
||||
|
credit = fields.Many2one('account.account', string='Credit Account') |
||||
|
journal = fields.Many2one('account.journal', string='Journal') |
||||
|
employee_contract_id = fields.Many2one('hr.contract', string='Contract') |
||||
|
|
||||
|
def onchange_employee_id(self, employee_id): |
||||
|
if employee_id: |
||||
|
employee_obj = self.env['hr.employee'].browse(employee_id) |
||||
|
department_id = employee_obj.department_id.id |
||||
|
domain = [('employee_id', '=', employee_id)] |
||||
|
return {'value': {'department': department_id}, 'domain': { |
||||
|
'employee_contract_id': domain, |
||||
|
}} |
||||
|
|
||||
|
@api.onchange('company_id') |
||||
|
def onchange_company_id(self): |
||||
|
company = self.company_id |
||||
|
domain = [('company_id.id', '=', company.id)] |
||||
|
result = { |
||||
|
'domain': { |
||||
|
'journal': domain, |
||||
|
}, |
||||
|
|
||||
|
} |
||||
|
return result |
||||
|
|
||||
|
@api.one |
||||
|
def submit_to_manager(self): |
||||
|
self.state = 'submit' |
||||
|
|
||||
|
@api.one |
||||
|
def cancel(self): |
||||
|
self.state = 'cancel' |
||||
|
|
||||
|
@api.one |
||||
|
def reject(self): |
||||
|
self.state = 'reject' |
||||
|
|
||||
|
@api.model |
||||
|
def create(self, vals): |
||||
|
vals['name'] = self.env['ir.sequence'].get('salary.advance.seq') or ' ' |
||||
|
res_id = super(SalaryAdvancePayment, self).create(vals) |
||||
|
return res_id |
||||
|
|
||||
|
@api.one |
||||
|
def approve_request(self): |
||||
|
"""This Approve the employee salary advance request. |
||||
|
""" |
||||
|
emp_obj = self.env['hr.employee'] |
||||
|
address = emp_obj.browse([self.employee_id.id]).address_home_id |
||||
|
if not address.id: |
||||
|
raise except_orm('Error!', 'Define home address for employee') |
||||
|
salary_advance_search = self.search([('employee_id', '=', self.employee_id.id), ('id', '!=', self.id), |
||||
|
('state', '=', 'approve')]) |
||||
|
current_month = datetime.strptime(self.date, '%Y-%m-%d').date().month |
||||
|
for each_advance in salary_advance_search: |
||||
|
existing_month = datetime.strptime(each_advance.date, '%Y-%m-%d').date().month |
||||
|
if current_month == existing_month: |
||||
|
raise except_orm('Error!', 'Advance can be requested once in a month') |
||||
|
if not self.employee_contract_id: |
||||
|
raise except_orm('Error!', 'Define a contract for the employee') |
||||
|
struct_id = self.employee_contract_id.struct_id |
||||
|
if not struct_id.max_percent or not struct_id.advance_date: |
||||
|
raise except_orm('Error!', 'Max percentage or advance days are not provided in Contract') |
||||
|
adv = self.advance |
||||
|
amt = (self.employee_contract_id.struct_id.max_percent * self.employee_contract_id.wage) / 100 |
||||
|
if adv > amt and not self.exceed_condition: |
||||
|
raise except_orm('Error!', 'Advance amount is greater than allotted') |
||||
|
|
||||
|
if not self.advance: |
||||
|
raise except_orm('Warning', 'You must Enter the Salary Advance amount') |
||||
|
payslip_obj = self.env['hr.payslip'].search([('employee_id', '=', self.employee_id.id), |
||||
|
('state', '=', 'done'), ('date_from', '<=', self.date), |
||||
|
('date_to', '>=', self.date)]) |
||||
|
if payslip_obj: |
||||
|
raise except_orm('Warning', "This month salary already calculated") |
||||
|
|
||||
|
for slip in self.env['hr.payslip'].search([('employee_id', '=', self.employee_id.id)]): |
||||
|
slip_moth = datetime.strptime(slip.date_from, '%Y-%m-%d').date().month |
||||
|
if current_month == slip_moth + 1: |
||||
|
slip_day = datetime.strptime(slip.date_from, '%Y-%m-%d').date().day |
||||
|
current_day = datetime.strptime(self.date, '%Y-%m-%d').date().day |
||||
|
if current_day - slip_day < struct_id.advance_date: |
||||
|
raise exceptions.Warning( |
||||
|
_('Request can be done after "%s" Days From prevoius month salary') % struct_id.advance_date) |
||||
|
self.state = 'waiting_approval' |
||||
|
|
||||
|
@api.one |
||||
|
def approve_request_acc_dept(self): |
||||
|
"""This Approve the employee salary advance request from accounting department. |
||||
|
""" |
||||
|
salary_advance_search = self.search([('employee_id', '=', self.employee_id.id), ('id', '!=', self.id), |
||||
|
('state', '=', 'approve')]) |
||||
|
current_month = datetime.strptime(self.date, '%Y-%m-%d').date().month |
||||
|
for each_advance in salary_advance_search: |
||||
|
existing_month = datetime.strptime(each_advance.date, '%Y-%m-%d').date().month |
||||
|
print current_month, existing_month |
||||
|
if current_month == existing_month: |
||||
|
raise except_orm('Error!', 'Advance can be requested once in a month') |
||||
|
if not self.debit or not self.credit or not self.journal: |
||||
|
raise except_orm('Warning', "You must enter Debit & Credit account and journal to approve ") |
||||
|
if not self.advance: |
||||
|
raise except_orm('Warning', 'You must Enter the Salary Advance amount') |
||||
|
|
||||
|
move_obj = self.env['account.move'] |
||||
|
timenow = time.strftime('%Y-%m-%d') |
||||
|
line_ids = [] |
||||
|
debit_sum = 0.0 |
||||
|
credit_sum = 0.0 |
||||
|
for request in self: |
||||
|
amount = request.advance |
||||
|
request_name = request.employee_id.name |
||||
|
reference = request.name |
||||
|
journal_id = request.journal.id |
||||
|
move = { |
||||
|
'narration': 'Salary Advance Of ' + request_name, |
||||
|
'ref': reference, |
||||
|
'journal_id': journal_id, |
||||
|
'date': timenow, |
||||
|
'state': 'posted', |
||||
|
} |
||||
|
|
||||
|
debit_account_id = request.debit.id |
||||
|
credit_account_id = request.credit.id |
||||
|
|
||||
|
if debit_account_id: |
||||
|
debit_line = (0, 0, { |
||||
|
'name': request_name, |
||||
|
'account_id': debit_account_id, |
||||
|
'journal_id': journal_id, |
||||
|
'date': timenow, |
||||
|
'debit': amount > 0.0 and amount or 0.0, |
||||
|
'credit': amount < 0.0 and -amount or 0.0, |
||||
|
'currency_id': self.currency_id.id, |
||||
|
}) |
||||
|
line_ids.append(debit_line) |
||||
|
debit_sum += debit_line[2]['debit'] - debit_line[2]['credit'] |
||||
|
|
||||
|
if credit_account_id: |
||||
|
credit_line = (0, 0, { |
||||
|
'name': request_name, |
||||
|
'account_id': credit_account_id, |
||||
|
'journal_id': journal_id, |
||||
|
'date': timenow, |
||||
|
'debit': amount < 0.0 and -amount or 0.0, |
||||
|
'credit': amount > 0.0 and amount or 0.0, |
||||
|
'currency_id': self.currency_id.id, |
||||
|
}) |
||||
|
line_ids.append(credit_line) |
||||
|
credit_sum += credit_line[2]['credit'] - credit_line[2]['debit'] |
||||
|
|
||||
|
move.update({'line_ids': line_ids}) |
||||
|
move_id = move_obj.create(move) |
||||
|
self.state = 'approve' |
||||
|
return True |
@ -0,0 +1,11 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
|
||||
|
from odoo import fields, models |
||||
|
|
||||
|
|
||||
|
class SalaryStructure(models.Model): |
||||
|
_inherit = 'hr.payroll.structure' |
||||
|
|
||||
|
max_percent = fields.Integer(string='Max.Salary Advance Percentage') |
||||
|
advance_date = fields.Integer(string='Salary Advance-After days') |
||||
|
|
|
@ -0,0 +1,35 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<data> |
||||
|
|
||||
|
<record id="rule_advance_salary_multi_company" model="ir.rule"> |
||||
|
<field name="name">Advance Request Multi Company</field> |
||||
|
<field name="model_id" ref="model_salary_advance"/> |
||||
|
<field eval="True" name="global"/> |
||||
|
<field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="hr_salary_advance_manager_rule" model="ir.rule"> |
||||
|
<field name="name">Salary Advance</field> |
||||
|
<field name="model_id" ref="model_salary_advance"/> |
||||
|
<field name="groups" eval="[(4, ref('hr.group_hr_user')),(4, ref('account.group_account_user'))]"/> |
||||
|
<field name="perm_write" eval="True"/> |
||||
|
<field name="perm_read" eval="True"/> |
||||
|
<field name="perm_create" eval="True"/> |
||||
|
<field name="perm_unlink" eval="True"/> |
||||
|
</record> |
||||
|
|
||||
|
<record id="hr_salary_advance_employee_rule" model="ir.rule"> |
||||
|
<field name="name">Salary Advance Rule For Employee</field> |
||||
|
<field name="domain_force">[('employee_id.user_id','=',user.id)]</field> |
||||
|
<field name="global" eval="True"/> |
||||
|
<field name="model_id" ref="model_salary_advance"/> |
||||
|
<field name="groups" eval="[(4,ref('base.group_user'))]"/> |
||||
|
<field name="perm_write" eval="True"/> |
||||
|
<field name="perm_read" eval="True"/> |
||||
|
<field name="perm_create" eval="True"/> |
||||
|
<field name="perm_unlink" eval="True"/> |
||||
|
</record> |
||||
|
|
||||
|
</data> |
||||
|
</odoo> |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 96 KiB |
After Width: | Height: | Size: 115 KiB |
After Width: | Height: | Size: 221 KiB |
After Width: | Height: | Size: 32 KiB |
@ -0,0 +1,133 @@ |
|||||
|
<section class="oe_container "> |
||||
|
<div class="oe_row"> |
||||
|
<h2 class="oe_slogan">OpenHRMS</h2> |
||||
|
<h3 class="oe_slogan">Most advanced open source HR management software</h3> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container"> |
||||
|
<div class="oe_row oe_spaced oe_mt32"> |
||||
|
<div class="oe_span"> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<a href="https://www.openhrms.com/#request-demo"> |
||||
|
<img src="HRMS-BUTTON.png"> |
||||
|
</a> |
||||
|
<div class="oe_demo_footer oe_centeralign">Online Demo</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
</section> |
||||
|
<section class="oe_container oe_dark"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<h2 class="oe_slogan">HR Salary Advance</h2> |
||||
|
<h3 class="oe_slogan">Manage salary advance request of employees</h3> |
||||
|
<h4 class="oe_slogan"><a href="https://www.cybrosys.com">Cybrosys Technologies</a></h4> |
||||
|
</div> |
||||
|
<div class="oe_row oe_spaced" style="padding-left:65px;"> |
||||
|
<h4>Features:</h4> |
||||
|
<div> |
||||
|
<span style="color:green;"> ☑ </span>Employee can request for advance salary.<br/> |
||||
|
<span style="color:green;"> ☑ </span>Set advance salary percentage limit in salary structure.<br/> |
||||
|
<span style="color:green;"> ☑ </span>Set salary advance days in salary structure.<br/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<div class="" style="text-align: center;"> |
||||
|
<div class="oe_picture"> |
||||
|
<h3 class="oe_slogan">Overview</h3> |
||||
|
<p class="oe_mt32"> |
||||
|
HR Salary Advance is a component of Open HRMS suit. HR Salary Advance |
||||
|
module helps the user to manage salary advance requests from employees. You can configure advance salary rules, |
||||
|
set advance salary limit, minimum number of days, and provide advance salary to employees |
||||
|
</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container oe_dark"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<div class="" style="text-align: center;"> |
||||
|
<h3 class="oe_slogan">Configuration</h3> |
||||
|
<p>Add salary advance Rules in Salary Structure and provide the max.advance percentage and advance days</p> |
||||
|
<div class="oe_span12"> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<img style="border:10px solid white;" src="salary_advance_rule.png"> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<div class="" style="text-align: center;"> |
||||
|
<h3 class="oe_slogan">Advance Request</h3> |
||||
|
<p>Employee can create Advance request</p> |
||||
|
<div class="oe_span12"> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<img style="border:10px solid white;" src="salary_request.png"> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container oe_dark"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<div class="" style="text-align: center;"> |
||||
|
<h3 class="oe_slogan">Salary Advance request approval From Hr & Accounts Department</h3> |
||||
|
<div class="oe_span12"> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<img style="border:10px solid white;" src="advance_request_approval.png"> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
<section class="oe_container"> |
||||
|
<div class="oe_row oe_spaced"> |
||||
|
<div class="" style="text-align: center;"> |
||||
|
<h3 class="oe_slogan">Employee Payslip</h3> |
||||
|
<p>When we create payslip salary advance will be deducted from the salary</p> |
||||
|
<div class="oe_span12"> |
||||
|
<div class="oe_demo oe_picture oe_screenshot"> |
||||
|
<img style="border:10px solid white;" src="salary_advance_deduction.png"> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
||||
|
|
||||
|
<div class="row section-content"> |
||||
|
<div class="col-md-6 img-content"> |
||||
|
<h3>Our Odoo Services</h3> |
||||
|
</div> <div class="bc-span col-md-12"><div class="inner-span"><a target="_blank" href="https://www.openhrms.com"><img class="img-border img-responsive thumbnail" src="cybro-service.png"></a></div></div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<section class="oe_container oe_dark"> |
||||
|
<h2 class="oe_slogan" style="margin-top:20px;" >Need Any Help?</h2> |
||||
|
<div class="oe_slogan" style="margin-top:10px !important;"> |
||||
|
<div> |
||||
|
<a class="btn btn-primary btn-lg mt8" |
||||
|
style="color: #FFFFFF !important;border-radius: 0;" href="https://www.cybrosys.com"><i |
||||
|
class="fa fa-envelope"></i> Email </a> <a |
||||
|
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" |
||||
|
href="https://www.cybrosys.com/contact/"><i |
||||
|
class="fa fa-phone"></i> Contact Us </a> <a |
||||
|
class="btn btn-primary btn-lg mt8" style="color: #FFFFFF !important;border-radius: 0;" |
||||
|
href="https://www.cybrosys.com/odoo-customization-and-installation/"><i |
||||
|
class="fa fa-check-square"></i> Request Customization </a> |
||||
|
</div> |
||||
|
<br> |
||||
|
<img src="cybro_logo.png" style="width: 190px; margin-bottom: 20px;" class="center-block"> |
||||
|
</div> |
||||
|
</section> |
||||
|
|
After Width: | Height: | Size: 121 KiB |
After Width: | Height: | Size: 93 KiB |
After Width: | Height: | Size: 87 KiB |
@ -0,0 +1,146 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<odoo> |
||||
|
<data> |
||||
|
|
||||
|
<record id="view_salary_advance_form" model="ir.ui.view"> |
||||
|
<field name="name">salary.advance.form</field> |
||||
|
<field name="model">salary.advance</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form string="Salary Advance"> |
||||
|
<header> |
||||
|
<button name="submit_to_manager" string="Submit" type="object" states="draft" class="oe_highlight"/> |
||||
|
<button name="approve_request" string="Approve" type="object" states="submit" class="oe_highlight" groups="hr.group_hr_manager,hr.group_hr_user"/> |
||||
|
<button name="approve_request_acc_dept" string="Approve" type="object" states="waiting_approval" class="oe_highlight" groups="account.group_account_manager,account.group_account_user"/> |
||||
|
<button name="cancel" string="Cancel" type="object" states="draft,submit"/> |
||||
|
<button name="reject" string="Reject" type="object" states="waiting_approval"/> |
||||
|
<field name="state" widget="statusbar" statusbar_visible="draft,submit,waiting_approval,approve,cancel,reject"/> |
||||
|
</header> |
||||
|
<sheet> |
||||
|
<div class="oe_title oe_left"> |
||||
|
<h2> |
||||
|
<field name="name" class="oe_inline" readonly="1"/> |
||||
|
</h2> |
||||
|
</div> |
||||
|
<group> |
||||
|
<group> |
||||
|
<field name="employee_id" on_change="onchange_employee_id(employee_id)"/> |
||||
|
<field name="department"/> |
||||
|
<field name="date"/> |
||||
|
<field name="reason"/> |
||||
|
<field name="exceed_condition" groups="hr.group_hr_manager,hr.group_hr_user"/> |
||||
|
</group> |
||||
|
<group> |
||||
|
<field name="advance"/> |
||||
|
<field name="currency_id" groups="base.group_multi_currency"/> |
||||
|
<field name="company_id" groups="base.group_multi_currency"/> |
||||
|
<field name="credit" attrs="{'invisible':[('state', '=', 'draft'), ('state', '=', 'submit')]}" groups="account.group_account_manager"/> |
||||
|
<field name="debit" attrs="{'invisible':[('state', '=', 'draft'), ('state', '=', 'submit')]}" groups="account.group_account_manager"/> |
||||
|
<field name="journal" attrs="{'invisible': [('state', '=', 'draft'), ('state', '=', 'submit')]}" groups="account.group_account_manager"/> |
||||
|
<field name="employee_contract_id" attrs="{'invisible': ['|', ('state', '=', 'draft'), ('state', '=', 'approve')]}" groups="hr.group_hr_manager,hr.group_hr_user"/> |
||||
|
</group> |
||||
|
</group> |
||||
|
</sheet> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record model="ir.ui.view" id="view_salary_advance_tree"> |
||||
|
<field name="name">salary.advance.tree</field> |
||||
|
<field name="model">salary.advance</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<tree string="Salary Advance"> |
||||
|
<field name="employee_id"/> |
||||
|
<field name="date"/> |
||||
|
<field name="advance"/> |
||||
|
<field name="state"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="view_salary_advance_filter" model="ir.ui.view"> |
||||
|
<field name="name">salary.advance.select</field> |
||||
|
<field name="model">salary.advance</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<search string="Search"> |
||||
|
<field name="name" string="Salary Advance" filter_domain="['|',('name','ilike',self)]"/> |
||||
|
<field name="employee_id"/> |
||||
|
<field name="state"/> |
||||
|
<filter string="My Requests" domain="[('employee_id.user_id.id','=',uid)]" name="my_requests_filter"/> |
||||
|
<filter domain="[('state', '=', 'draft')]" string="To Submit" name="to_report" help="New Requests"/> |
||||
|
<filter domain="[('state','in',('submit','waiting_approval'))]" string="To Approve" name="submitted" help="Submitted Requests"/> |
||||
|
<filter domain="[('state', '=', 'approve')]" string="Approved" name="approved" help="Approved Requests"/> |
||||
|
<separator/> |
||||
|
<group expand="0" string="Group By"> |
||||
|
<filter string="Employee" domain="[]" context="{'group_by':'employee_id'}"/> |
||||
|
<filter name="State" string="State" domain="[]" context="{'group_by':'state'}"/> |
||||
|
<filter string="Date" domain="[]" context="{'group_by':'date'}"/> |
||||
|
</group> |
||||
|
</search> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="action_my_salary_advance" model="ir.actions.act_window"> |
||||
|
<field name="name">Salary Advance</field> |
||||
|
<field name="type">ir.actions.act_window</field> |
||||
|
<field name="res_model">salary.advance</field> |
||||
|
<field name="view_type">form</field> |
||||
|
<field name="view_mode">tree,form</field> |
||||
|
<field name="search_view_id" ref="view_salary_advance_filter"/> |
||||
|
<field name="context">{'search_default_my_requests_filter':1}</field> |
||||
|
<field name="domain">[('employee_id.user_id', '=', uid)]</field> |
||||
|
<field name="help" type="html"> |
||||
|
<p class="oe_view_nocontent_create"> |
||||
|
Create Requests. |
||||
|
</p> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="action_my_salary_advance_request_approved" model="ir.actions.act_window"> |
||||
|
<field name="name">Salary Advance</field> |
||||
|
<field name="type">ir.actions.act_window</field> |
||||
|
<field name="res_model">salary.advance</field> |
||||
|
<field name="view_type">form</field> |
||||
|
<field name="view_mode">tree,form</field> |
||||
|
<field name="search_view_id" ref="view_salary_advance_filter"/> |
||||
|
<field name="context">{'search_default_approved':1}</field> |
||||
|
<field name="domain">[('employee_id.user_id', '=', uid)]</field> |
||||
|
<field name="help" type="html"> |
||||
|
<p class="oe_view_nocontent_create"> |
||||
|
Create Requests. |
||||
|
</p> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="action_salary_advance_to_approve" model="ir.actions.act_window"> |
||||
|
<field name="name">Salary Advance</field> |
||||
|
<field name="type">ir.actions.act_window</field> |
||||
|
<field name="res_model">salary.advance</field> |
||||
|
<field name="view_type">form</field> |
||||
|
<field name="view_mode">tree,form</field> |
||||
|
<field name="search_view_id" ref="view_salary_advance_filter"/> |
||||
|
<field name="context">{'search_default_submitted': 1}</field> |
||||
|
<field name="domain"></field> |
||||
|
<field name="help" type="html"> |
||||
|
<p class="oe_view_nocontent_create"> |
||||
|
Create Requests. |
||||
|
</p> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="ir_seq_hr_advance" model="ir.sequence"> |
||||
|
<field name="name">Salary Advance Request</field> |
||||
|
<field name="code">salary.advance.seq</field> |
||||
|
<field name="prefix">SAR </field> |
||||
|
<field name="padding">4</field> |
||||
|
<field name="number_increment">1</field> |
||||
|
<field name="number_next_actual">1</field> |
||||
|
<field name="implementation">standard</field> |
||||
|
<field name="company_id" eval="False"/> |
||||
|
</record> |
||||
|
|
||||
|
<menuitem id="parent_menu_salary_advance" name="Advance" parent="hr_loan.menu_hr_loans_and_advances" sequence="7"/> |
||||
|
<menuitem id="menu_my_salary_advance" action="action_my_salary_advance" parent="parent_menu_salary_advance" name="Request Salary Advance" sequence="1" /> |
||||
|
<menuitem id="menu_salary_advance" action="action_salary_advance_to_approve" parent="parent_menu_salary_advance" name="Salary Advance To Approve" sequence="3" groups="hr.group_hr_manager,hr.group_hr_user,account.group_account_manager"/> |
||||
|
<menuitem id="menu_my_salary_advance_approved" action="action_my_salary_advance_request_approved" parent="parent_menu_salary_advance" name="My Approved Salary Advance" sequence="2" /> |
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,33 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<odoo> |
||||
|
<data> |
||||
|
<!-- advance salary rule --> |
||||
|
<record id="hr_payslip_rule_advance" model="hr.salary.rule"> |
||||
|
<field name="code">SAR</field> |
||||
|
<field name="name">Advance Salary</field> |
||||
|
<field name="category_id" ref="hr_payroll.DED"/> |
||||
|
<field name="amount_select">code</field> |
||||
|
<field name="amount_python_compute">result = inputs.SAR and - (inputs.SAR.amount)</field> |
||||
|
<field name="appears_on_payslip" eval="True"/> |
||||
|
<field name="sequence" eval="190"/> |
||||
|
</record> |
||||
|
|
||||
|
<record id="hr_rule_input_advance" model="hr.rule.input"> |
||||
|
<field name="code">SAR</field> |
||||
|
<field name="name">Salary Advance</field> |
||||
|
<field name="input_id" ref="hr_payslip_rule_advance"/> |
||||
|
</record> |
||||
|
<!-- salary structure --> |
||||
|
<record model="ir.ui.view" id="model_salary_structure"> |
||||
|
<field name="name">salary.structure.form</field> |
||||
|
<field name="model">hr.payroll.structure</field> |
||||
|
<field name="inherit_id" ref="hr_payroll.view_hr_employee_grade_form"/> |
||||
|
<field name="arch" type="xml"> |
||||
|
<xpath expr="//field[@name='parent_id']" position="after"> |
||||
|
<field name="max_percent"/> |
||||
|
<field name="advance_date"/> |
||||
|
</xpath> |
||||
|
</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |