Initial commit: Cybrosys Odoo packages (10 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:49:21 +02:00
commit 54ed047508
751 changed files with 13707 additions and 0 deletions

View file

@ -0,0 +1,50 @@
# Open HRMS Loan Management
Helps you to manage Loan Requests of your company's staff.
## Installation
```bash
pip install odoo-bringout-cybrosys-ohrms_loan
```
## Dependencies
This addon depends on:
- base
- hr
- payroll
## Manifest Information
- **Name**: Open HRMS Loan Management
- **Version**: 16.0.1.0.0
- **Category**: Generic Modules/Human Resources
- **License**: AGPL-3
- **Installable**: True
## Source
Custom addon from bringout-cybrosys vendor, addon `ohrms_loan`.
## License
This package maintains the original AGPL-3 license from the addon.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Reports: doc/REPORTS.md
- Security: doc/SECURITY.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md

View file

@ -0,0 +1,32 @@
# Architecture
```mermaid
flowchart TD
U[Users] -->|HTTP| V[Views and QWeb Templates]
V --> C[Controllers]
V --> W[Wizards Transient Models]
C --> M[Models and ORM]
W --> M
M --> R[Reports]
DX[Data XML] --> M
S[Security ACLs and Groups] -. enforces .-> M
subgraph Ohrms_loan Module - ohrms_loan
direction LR
M:::layer
W:::layer
C:::layer
V:::layer
R:::layer
S:::layer
DX:::layer
end
classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px
```
Notes
- Views include tree/form/kanban templates and report templates.
- Controllers provide website/portal routes when present.
- Wizards are UI flows implemented with `models.TransientModel`.
- Data XML loads data/demo records; Security defines groups and access.

View file

@ -0,0 +1,3 @@
# Configuration
Refer to Odoo settings for ohrms_loan. Configure related models, access rights, and options as needed.

View file

@ -0,0 +1,3 @@
# Controllers
This module does not define custom HTTP controllers.

View file

@ -0,0 +1,7 @@
# Dependencies
This addon depends on:
- base
- [hr](../../odoo-bringout-oca-ocb-hr)
- [payroll](../../odoo-bringout-oca-payroll-payroll)

View file

@ -0,0 +1,4 @@
# FAQ
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
- Q: How to enable? A: Start server with --addon ohrms_loan or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-cybrosys-ohrms_loan"
# or
uv pip install odoo-bringout-cybrosys-ohrms_loan"
```

View file

@ -0,0 +1,16 @@
# Models
Detected core models and extensions in ohrms_loan.
```mermaid
classDiagram
class hr_loan
class hr_loan_line
class hr_employee
class hr_payslip
class hr_payslip_input
```
Notes
- Classes show model technical names; fields omitted for brevity.
- Items listed under _inherit are extensions of existing models.

View file

@ -0,0 +1,6 @@
# Overview
Packaged Odoo addon: ohrms_loan. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon ohrms_loan
- License: LGPL-3

View file

@ -0,0 +1,3 @@
# Reports
This module does not define custom reports.

View file

@ -0,0 +1,41 @@
# Security
Access control and security definitions in ohrms_loan.
## Access Control Lists (ACLs)
Model access permissions defined in:
- **[ir.model.access.csv](../ohrms_loan/security/ir.model.access.csv)**
- 7 model access rules
## Record Rules
Row-level security rules defined in:
## Security Groups & Configuration
Security groups and permissions defined in:
- **[security.xml](../ohrms_loan/security/security.xml)**
```mermaid
graph TB
subgraph "Security Layers"
A[Users] --> B[Groups]
B --> C[Access Control Lists]
C --> D[Models]
B --> E[Record Rules]
E --> F[Individual Records]
end
```
Security files overview:
- **[ir.model.access.csv](../ohrms_loan/security/ir.model.access.csv)**
- Model access permissions (CRUD rights)
- **[security.xml](../ohrms_loan/security/security.xml)**
- Security groups, categories, and XML-based rules
Notes
- Access Control Lists define which groups can access which models
- Record Rules provide row-level security (filter records by user/group)
- Security groups organize users and define permission sets
- All security is enforced at the ORM level by Odoo

View file

@ -0,0 +1,5 @@
# Troubleshooting
- Ensure Python and Odoo environment matches repo guidance.
- Check database connectivity and logs if startup fails.
- Validate that dependent addons listed in DEPENDENCIES.md are installed.

View file

@ -0,0 +1,7 @@
# Usage
Start Odoo including this addon (from repo root):
```bash
python3 scripts/nix_odoo_web_server.py --db-name mydb --addon ohrms_loan
```

View file

@ -0,0 +1,3 @@
# Wizards
This module does not include UI wizards.

View file

@ -0,0 +1,35 @@
Open HRMS Loan Management
=========================
Manage Loan Requests.
Installation
============
- www.odoo.com/documentation/15.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>
Maintainer
----------
This module is maintained by Cybrosys Technologies.
For support and more information, please visit https://www.cybrosys.com.

View file

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import models

View file

@ -0,0 +1,51 @@
# -*- coding: utf-8 -*-
###################################################################################
# A part of OpenHRMS Project <https://www.openhrms.com>
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2022-TODAY Cybrosys Technologies (<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': 'Open HRMS Loan Management',
'version': '16.0.1.0.0',
'summary': 'Manage Loan Requests',
'description': """
Helps you to manage Loan Requests of your company's staff.
""",
'category': 'Generic Modules/Human Resources',
'author': "Cybrosys Techno Solutions,Open HRMS",
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'live_test_url': 'https://youtu.be/lAT5cqVZTZI',
'website': "https://www.openhrms.com",
'depends': [
'base', 'hr', 'payroll'
],
'data': [
'security/ir.model.access.csv',
'security/security.xml',
'views/hr_loan_seq.xml',
'data/salary_rule_loan.xml',
'views/hr_loan.xml',
'views/hr_payroll.xml',
],
'images': ['static/description/banner.png'],
'license': 'AGPL-3',
'installable': True,
'auto_install': False,
'application': False,
}

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!--Adding a salary rule for loan-->
<!--
<data noupdate="0">
<record id="hr_rule_loan" model="hr.salary.rule">
<field name="code">LOAN</field>
<field name="name">Kredit</field>
<field name="category_id" ref="l10n_bs_hr_payroll_fuelboss.OBUST"/>
<field name="amount_select">code</field>
<field name="amount_python_compute">result = inputs.LOAN and - (inputs.LOAN.amount)</field>
<field name="appears_on_payslip" eval="True"/>
<field name="sequence" eval="60"/>
<field name="company_id" search="[('name','ilike','Fuelboss doo Zenica')]" model="res.company"/>
</record>
<record id="hr_rule_input_loan" model="hr.rule.input">
<field name="code">LOAN</field>
<field name="name">Kredit</field>
<field name="input_id" ref="hr_rule_loan"/>
</record>
</data>
-->
</odoo>

View file

@ -0,0 +1,11 @@
## Module <ohrms_loan>
#### 18.10.2021
#### Version 15.0.1.0.0
##### ADD
- Initial commit for Open HRMS Project
#### 26.07.2022
#### Version 15.0.1.1.0
##### UPDATE
- Change the PO file

View file

@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
from . import hr_loan
from . import hr_payroll

View file

@ -0,0 +1,156 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api, _
from datetime import datetime
from dateutil.relativedelta import relativedelta
from odoo.exceptions import ValidationError, UserError
class HrLoan(models.Model):
_name = 'hr.loan'
_inherit = ['mail.thread', 'mail.activity.mixin']
_description = "Loan Request"
@api.model
def default_get(self, field_list):
result = super(HrLoan, self).default_get(field_list)
if result.get('user_id'):
ts_user_id = result['user_id']
else:
ts_user_id = self.env.context.get('user_id', self.env.user.id)
result['employee_id'] = self.env['hr.employee'].search([('user_id', '=', ts_user_id)], limit=1).id
return result
@api.onchange('employee_id')
def onchange_employee(self):
if not self.employee_id:
return
employee = self.employee_id
self.company_id = self.env['res.company'].search([('id', '=', employee.company_id.id)], limit=1)
def _compute_loan_amount(self):
total_paid = 0.0
self.name = self.name or self.env['ir.sequence'].next_by_code('hr.loan.seq')
for loan in self:
for line in loan.loan_lines:
if line.paid:
total_paid += line.amount
balance_amount = loan.loan_amount - total_paid
loan.total_amount = loan.loan_amount
loan.balance_amount = balance_amount
loan.total_paid_amount = total_paid
name = fields.Char(string="Loan Name", readonly=True, help="Name of the loan")
date = fields.Date(string="Date", default=fields.Date.today(), readonly=True, help="Date")
employee_id = fields.Many2one('hr.employee', string="Employee", required=True, help="Employee")
department_id = fields.Many2one('hr.department', related="employee_id.department_id", readonly=True,
string="Department", help="Employee")
installment = fields.Integer(string="No Of Installments", default=1, help="Number of installments")
payment_date = fields.Date(string="Payment Start Date", required=True, default=fields.Date.today(), help="Date of "
"the "
"paymemt")
loan_lines = fields.One2many('hr.loan.line', 'loan_id', string="Loan Line", index=True)
company_id = fields.Many2one('res.company', 'Company', readonly=True, help="Company",
default=lambda self: self.env.user.company_id,
states={'draft': [('readonly', False)]})
currency_id = fields.Many2one('res.currency', string='Currency', required=True, help="Currency",
default=lambda self: self.env.user.company_id.currency_id)
job_position = fields.Many2one('hr.job', related="employee_id.job_id", readonly=True, string="Job Position",
help="Job position")
loan_amount = fields.Float(string="Loan Amount", required=True, help="Loan amount")
total_amount = fields.Float(string="Total Amount", store=True, readonly=True, compute='_compute_loan_amount',
help="Total loan amount")
balance_amount = fields.Float(string="Balance Amount", store=True, compute='_compute_loan_amount', help="Balance amount")
total_paid_amount = fields.Float(string="Total Paid Amount", store=True, compute='_compute_loan_amount',
help="Total paid amount")
state = fields.Selection([
('draft', 'Draft'),
('waiting_approval_1', 'Submitted'),
('approve', 'Approved'),
('refuse', 'Refused'),
('cancel', 'Canceled'),
], string="State", default='draft', track_visibility='onchange', copy=False, )
@api.model
def create(self, values):
loan_count = self.env['hr.loan'].search_count(
[('employee_id', '=', values['employee_id']), ('state', '=', 'approve'),
('balance_amount', '!=', 0)])
if loan_count:
raise ValidationError(_("The employee has already a pending installment"))
else:
#values['name'] = self.env['ir.sequence'].get('hr.loan.seq') or ' '
#number = payslip.number or self.env["ir.sequence"].next_by_code(
# "salary.slip"
#)
values['name'] = False
res = super(HrLoan, self).create(values)
return res
def compute_installment(self):
"""This automatically create the installment the employee need to pay to
company based on payment start date and the no of installments.
"""
for loan in self:
loan.loan_lines.unlink()
date_start = datetime.strptime(str(loan.payment_date), '%Y-%m-%d')
amount = loan.loan_amount / loan.installment
for i in range(1, loan.installment + 1):
self.env['hr.loan.line'].create({
'date': date_start,
'amount': amount,
'employee_id': loan.employee_id.id,
'loan_id': loan.id})
date_start = date_start + relativedelta(months=1)
loan._compute_loan_amount()
return True
def action_refuse(self):
return self.write({'state': 'refuse'})
def action_submit(self):
self.write({'state': 'waiting_approval_1'})
def action_cancel(self):
self.write({'state': 'cancel'})
def action_approve(self):
for data in self:
if not data.loan_lines:
raise ValidationError(_("Please Compute installment"))
else:
self.write({'state': 'approve'})
def unlink(self):
for loan in self:
if loan.state not in ('draft', 'cancel'):
raise UserError(
'You cannot delete a loan which is not in draft or cancelled state')
return super(HrLoan, self).unlink()
class InstallmentLine(models.Model):
_name = "hr.loan.line"
_description = "Installment Line"
date = fields.Date(string="Payment Date", required=True, help="Date of the payment")
employee_id = fields.Many2one('hr.employee', string="Employee", help="Employee")
amount = fields.Float(string="Amount", required=True, help="Amount")
paid = fields.Boolean(string="Paid", help="Paid")
loan_id = fields.Many2one('hr.loan', string="Loan Ref.", help="Loan")
payslip_id = fields.Many2one('hr.payslip', string="Payslip Ref.", help="Payslip")
class HrEmployee(models.Model):
_inherit = "hr.employee"
def _compute_employee_loans(self):
"""This compute the loan amount and total loans count of an employee.
"""
self.loan_count = self.env['hr.loan'].search_count([('employee_id', '=', self.id)])
loan_count = fields.Integer(string="Loan Count", compute='_compute_employee_loans')

View file

@ -0,0 +1,94 @@
# -*- coding: utf-8 -*-
import time
import babel
from odoo import models, fields, api, tools, _
from datetime import datetime
class HrPayslipInput(models.Model):
_inherit = 'hr.payslip.input'
loan_line_id = fields.Many2one('hr.loan.line', string="Loan Installment", help="Loan installment")
class HrPayslip(models.Model):
_inherit = 'hr.payslip'
#@api.onchange('employee_id', 'date_from', 'date_to')
#def onchange_employee(self):
# if (not self.employee_id) or (not self.date_from) or (not self.date_to):
# return
# employee = self.employee_id
# date_from = self.date_from
# date_to = self.date_to
# contract_ids = []
# ttyme = datetime.fromtimestamp(time.mktime(time.strptime(str(date_from), "%Y-%m-%d")))
# locale = self.env.context.get('lang') or 'en_US'
# self.name = _('Salary Slip of %s for %s') % (
# employee.name, tools.ustr(babel.dates.format_date(date=ttyme, format='MMMM-y', locale=locale)))
# self.company_id = employee.company_id
#
# if not self.env.context.get('contract') or not self.contract_id:
# contract_ids = self.get_contract(employee, date_from, date_to)
# if not contract_ids:
# return
# self.contract_id = self.env['hr.contract'].browse(contract_ids[0])
#
# if not self.contract_id.struct_id:
# return
# self.struct_id = self.contract_id.struct_id
#
# # computation of the salary input
# contracts = self.env['hr.contract'].browse(contract_ids)
# worked_days_line_ids = self.get_worked_day_lines(contracts, date_from, date_to)
# worked_days_lines = self.worked_days_line_ids.browse([])
# for r in worked_days_line_ids:
# worked_days_lines += worked_days_lines.new(r)
# self.worked_days_line_ids = worked_days_lines
# if contracts:
# input_line_ids = self.get_inputs(contracts, date_from, date_to)
# input_lines = self.input_line_ids.browse([])
# for r in input_line_ids:
# input_lines += input_lines.new(r)
# self.input_line_ids = input_lines
# return
def get_inputs(self, contract_ids, date_from, date_to):
"""This Compute the other inputs to employee payslip.
"""
res = super(HrPayslip, self).get_inputs(contract_ids, date_from, date_to)
contract_obj = self.env['hr.contract']
contract_for_loan = None
for contract in contract_ids:
if not ('INO' in contract.struct_id.code):
contract_for_loan = contract
break
if not contract_for_loan:
return res
emp_id = contract_obj.browse(contract_for_loan.id).employee_id
lon_obj = self.env['hr.loan'].search([('employee_id', '=', emp_id.id), ('state', '=', 'approve')])
for loan in lon_obj:
for loan_line in loan.loan_lines:
# pick unpaid lines
if date_from <= loan_line.date <= date_to and not loan_line.paid:
for result in res:
if result.get('code') == 'LOAN':
result['amount_qty'] = 1
result['amount'] = loan_line.amount
result['loan_line_id'] = loan_line.id
return res
def action_payslip_done(self):
# + calculate loan amount
for line in self.input_line_ids:
if line.loan_line_id:
line.loan_line_id.paid = True
line.loan_line_id.payslip_id = self.id
line.loan_line_id.loan_id._compute_loan_amount()
return super(HrPayslip, self).action_payslip_done()

View file

@ -0,0 +1,8 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_hr_loan_user,hr.loan.group_user,model_hr_loan,base.group_user,1,1,1,0
access_hr_jobuser,hr.job.group_user,hr.model_hr_job,base.group_user,1,1,1,0
access_hr_loan_line_user,hr.loan.line.group_user,model_hr_loan_line,base.group_user,1,1,0,0
access_hr_loan_officer,hr.loan.group_hr_user,model_hr_loan,hr.group_hr_user,1,1,1,1
access_hr_loan_line_officer,hr.loan.line.group_hr_user,model_hr_loan_line,hr.group_hr_user,1,1,1,1
access_hr_loan_manager,hr.loan,model_hr_loan,hr.group_hr_manager,1,1,1,1
access_hr_loan_line_manager,hr.loan.line,model_hr_loan_line,hr.group_hr_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_hr_loan_user hr.loan.group_user model_hr_loan base.group_user 1 1 1 0
3 access_hr_jobuser hr.job.group_user hr.model_hr_job base.group_user 1 1 1 0
4 access_hr_loan_line_user hr.loan.line.group_user model_hr_loan_line base.group_user 1 1 0 0
5 access_hr_loan_officer hr.loan.group_hr_user model_hr_loan hr.group_hr_user 1 1 1 1
6 access_hr_loan_line_officer hr.loan.line.group_hr_user model_hr_loan_line hr.group_hr_user 1 1 1 1
7 access_hr_loan_manager hr.loan model_hr_loan hr.group_hr_manager 1 1 1 1
8 access_hr_loan_line_manager hr.loan.line model_hr_loan_line hr.group_hr_manager 1 1 1 1

View file

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="rule_hr_loan" model="ir.rule">
<field name="name">Loan Request Multi Company</field>
<field name="model_id" ref="model_hr_loan"/>
<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_loan_manager_rule" model="ir.rule">
<field name="name">Loan Forms Modification Accounts and Hr</field>
<field name="model_id" ref="model_hr_loan"/>
<field name="groups" eval="[(4, ref('hr.group_hr_user'))]"/>
<field name="perm_write" eval="1"/>
<field name="perm_read" eval="1"/>
<field name="perm_create" eval="1"/>
<field name="perm_unlink" eval="1"/>
</record>
<record id="hr_loan_rule" model="ir.rule">
<field name="name">User: Modify own loan only</field>
<field name="model_id" ref="model_hr_loan"/>
<field name="domain_force">[('employee_id.user_id','=',user.id)]</field>
<field name="perm_read" eval="1"/>
<field name="perm_write" eval="1"/>
<field name="perm_create" eval="1"/>
<field name="perm_unlink" eval="1"/>
<field name="groups" eval="[(4,ref('base.group_user'))]"/>
</record>
</data>
</odoo>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 656 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 408 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 808 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

View file

@ -0,0 +1,565 @@
<div style="background-color: #00438B; min-height: 600px; width: 100%; padding: 15px; position: relative;">
<!-- TITLE BAR -->
<div
style="border-bottom: 1px solid #3369a2; padding: 15px; display: flex; justify-content: space-between; align-items: center;">
<img src="assets/misc/open-hrms-logo.png" width="60" height="51" />
</div>
<!-- END OF TITLE BAR -->
<!-- APP HERO -->
<h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;">OpenHRMS Loan Management</h1>
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;"> Manage Loan Request of Employees</p>
<!-- END OF APP HERO -->
<img src="assets/screenshots/hero.gif"
style="width: 75%; height: auto; position: absolute; margin-left: auto; margin-right: auto; top: 45%; left: 12%; right: auto;" />
</div>
<!-- NAVIGATION SECTION -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #00438B; padding: 15px 0px; margin-top: 300px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/compass.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Explore This
Module</h2>
</div>
<div class="row my-4" style="font-family: 'Montserrat', sans-serif;">
<div class="col-sm-12 col-md-6 my-3">
<a href="#overview">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #00438B; font-size: 24px; font-weight: 500; display: block;">Overview</span>
<span
style="color: #00438B; font-size: 16px; font-weight: 400; color:#282F33; display: block;">Learn
more about this
module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36" />
</div>
</a>
</div>
<div class="col-sm-12 col-md-6 my-3">
<a href="#features">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #00438B; font-size: 24px; font-weight: 500; display: block;">Features</span>
<span
style="color: #00438B; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View
features of this
module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36" />
</div>
</a>
</div>
<div class="col-sm-12 col-md-6 my-3">
<a href="#screenshots">
<div class="d-flex justify-content-between align-items-center"
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
<div>
<span style="color: #00438B; font-size: 24px; font-weight: 500; display: block;">Screenshots</span>
<span
style="color: #00438B; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View
screenshots for this
module</span>
</div>
<img src="assets/misc/right-arrow.png" width="36" height="36" />
</div>
</a>
</div>
</div>
<!-- END OF NAVIGATION SECTION -->
<!-- OVERVIEW SECTION -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #00438B; padding: 15px 0px;" id="overview">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/pie-chart.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Overview
</h2>
</div>
<div class="row" style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;">
<div class="col-sm-12 py-4">
Open HRMS Loan is a component of Open HRMS suit. Open HRMS Loan module helps the user to
configure different loan policies, assign approval authority, conduct the verification
process and sanction loan for employees.
</div>
</div>
<!-- END OF OVERVIEW SECTION -->
<!-- FEATURES SECTION -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #00438B; padding: 15px 0px;" id="features">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/features.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Features
</h2>
</div>
<div class="row" style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;">
<div class="col-sm-12 col-md-6">
<div class="d-flex align-items-start" style="margin-top: 40px; margin-bottom: 40px">
<img src="assets/misc/check-box.png" class="mr-2" />
<div>
<span
style="display: block; font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> Employee can create loan request</span>
</div>
</div>
<div class="d-flex align-items-start" style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2" />
<div>
<span
style="display: block; font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> Double layer approval, from Accounting & HR Department.</span>
</div>
</div>
<div class="d-flex align-items-start" style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2" />
<div>
<span
style="display: block; font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> Loan amount is deducted from the salary.</span>
</div>
</div>
<div class="d-flex align-items-start" style="margin-top: 30px; margin-bottom: 30px">
<img src="assets/misc/check-box.png" class="mr-2" />
<div>
<span
style="display: block; font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> Current month installment is automatically listed in payslip.</span>
</div>
</div>
</div>
</div>
<!-- END OF FEATURES SECTION -->
<!-- SCREENSHOTS SECTION -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #00438B; padding: 15px 0px;" id="screenshots">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/pictures.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Screenshots
</h2>
</div>
<div class="row">
<div class="col-sm-12">
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Enabling option</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Enable the option "Loan Approval From Accounting Department" In accounting settings</p>
<img src="assets/screenshots/screenshot-1.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Adding deduction rule</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">Add the deduction rule for loan in Salary Structure.</p>
<img src="/assets/screenshots/screenshot-2.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Creating request</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> Employee can create loan request</p>
<img src="assets/screenshots/screenshot-3.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Making decisions</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> Once the HR department has given the Approval, the accounts department take the
decision.</p>
<img src="assets/screenshots/screenshot-4.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Listing pending
installments</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> When we create the payslip, all the pending installments of the month will be listed
there.</p>
<img src="assets/screenshots/screenshot-5.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Checking loan
requests changes deducted installments to paid</h3>
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;">When we check the Loan request again, the deducted installments will be changed to paid.</p>
<img src="assets/screenshots/screenshot-6.png" class="img-thumbnail">
</div>
</div>
</div>
<!-- END OF SCREENSHOTS SECTION -->
<!-- RELATED PRODUCTS -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #00438B; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/categories.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Related
Products
</h2>
</div>
<div class="row">
<div class="col-sm-12">
<div id="demo1" class="row carousel slide" data-ride="carousel">
<!-- The slideshow -->
<!-- The slideshow -->
<div class="carousel-inner">
<div class="carousel-item active" style="min-height:0px">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/ohrms_core/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px" src="./assets/modules/core_image.gif">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/hr_multi_company/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px" src="./assets/modules/multi_image.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/ohrms_overtime" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./assets/modules/overtime_image.png">
</div>
</a>
</div>
</div>
<div class="carousel-item" style="min-height:0px">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/oh_appraisal/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px"
src="./assets/modules/appraisal_image.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/hr_employee_updation/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px" src="./assets/modules/info_image.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/ohrms_salary_advance/" target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-top-left-radius:10px; border-top-right-radius:10px" src="./assets/modules/salary_image.png">
</div>
</a>
</div>
</div>
</div>
<!-- Left and right controls -->
<a class="carousel-control-prev" href="#demo1" data-slide="prev" style="width:35px; color:#000"> <span
class="carousel-control-prev-icon"><i class="fa fa-chevron-left" style="font-size:24px"></i></span>
</a> <a class="carousel-control-next" href="#demo1" data-slide="next" style="width:35px; color:#000">
<span class="carousel-control-next-icon"><i class="fa fa-chevron-right"
style="font-size:24px"></i></span>
</a>
</div>
</div>
</div>
<!-- END OF RELATED PRODUCTS -->
<!-- OUR SERVICES -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #00438B; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="/assets/misc/star.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our Services
</h2>
</div>
<div class="container my-5">
<div class="row">
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/cogs.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Customization</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/wrench.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/lifebuoy.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Support</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/user.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Hire
Odoo
Developer</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #54a0ff !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/puzzle.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Integration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/update.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Migration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/consultation.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Consultancy</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/training.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/license.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Licensing Consultancy</h6>
</div>
</div>
</div>
<!-- END OF END OF OUR SERVICES -->
<!-- OUR INDUSTRIES -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #00438B; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="/assets/misc/corporate.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our
Industries
</h2>
</div>
<div class="container my-5">
<div class="row">
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/trading-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Trading
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easily procure
and
sell your products</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/pos-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
POS
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easy
configuration
and convivial experience</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/education-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Education
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
A platform for
educational management</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/manufacturing-black.png" class="img-responsive mb-3" height="48px"
width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Manufacturing
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Plan, track and
schedule your operations</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/ecom-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
E-commerce &amp; Website
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Mobile
friendly,
awe-inspiring product pages</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/service-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Service Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Keep track of
services and invoice</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/restaurant-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Restaurant
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Run your bar or
restaurant methodically</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="./assets/icons/hotel-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Hotel Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
An
all-inclusive
hotel management application</p>
</div>
</div>
</div>
</div>
<!-- END OF END OF OUR INDUSTRIES -->
<!-- SUPPORT -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #00438B; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="/assets/misc/customer-support.png" />
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Support
</h2>
</div>
<div class="container mt-5">
<div class="row">
<div class="col-sm-12 col-md-6">
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4"
style="background-color: #00438B; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;">
<img src="/assets/misc/support.png" height="48" width="48" style="width: 42px; height: 42px;" />
</div>
<div>
<h4>Need Help?</h4>
<p style="line-height: 100%;">Got questions or need help? Get in touch.</p>
<a href="mailto:odoo@cybrosys.com">
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #00438B;">
odoo@cybrosys.com</p>
</a>
</div>
</div>
</div>
<div class="col-sm-12 col-md-6">
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4"
style="background-color: #2AC44D; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;">
<img src="/assets/misc/whatsapp.png" height="52" width="52" style="width: 52px; height: 52px;" />
</div>
<div>
<h4>WhatsApp</h4>
<p style="line-height: 100%;">Say hi to us on WhatsApp!</p>
<a href="https://api.whatsapp.com/send?phone=918606827707">
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #00438B;">+91 86068
27707</p>
</a>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12 my-5 d-flex justify-content-center align-items-center">
<img src="/assets/misc/logo.png" width="144" height="31"
style="width:144px; height: 31px; margin-top: 40px;" />
</div>
</div>
</div>
<!-- END OF SUPPORT -->

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -0,0 +1,159 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!--Loan Tree view-->
<record id="hr_loan_tree_view" model="ir.ui.view">
<field name="name">hr.loan.tree</field>
<field name="model">hr.loan</field>
<field name="arch" type="xml">
<tree string="Loan Requests">
<field name="name"/>
<field name="employee_id"/>
<field name="loan_amount"/>
<field name="date"/>
<field name="state"/>
</tree>
</field>
</record>
<!--Loan Form view-->
<record id="hr_loan_form_view" model="ir.ui.view">
<field name="name">hr.loan.form</field>
<field name="model">hr.loan</field>
<field name="arch" type="xml">
<form string="Loan Request">
<header>
<button name="compute_installment" type="object" string="Compute Installment" class="oe_highlight" attrs="{'invisible':[('state','in',('approve', 'refuse'))]}"/>
<button name="action_submit" type="object" string="Submit" states="draft" class="oe_highlight"/>
<button name="action_cancel" type="object" string="Cancel" states="draft" />
<button name="action_approve" type="object" string="Approve" states="waiting_approval_1" class="oe_highlight" groups="hr.group_hr_manager,hr.group_hr_user"/>
<button name="action_refuse" type="object" string="Refuse" states="draft,waiting_approval_1" class="oe_highlight" groups="hr.group_hr_manager,hr.group_hr_user"/>
<field name="state" widget="statusbar" statusbar_visible="draft,waiting_approval_1,approve" />
</header>
<sheet>
<div class="oe_button_box" name="button_box">
</div>
<div class="oe_title">
<h1>
<field name="name" readonly="1"/>
</h1>
</div>
<group col="4">
<field name="employee_id" options="{'no_create': True}" attrs="{'readonly':[('state','=','approve')]}"/>
<field name="date"/>
<field name="department_id"/>
<field name="job_position"/>
<field name="loan_amount" attrs="{'readonly':[('state','=','approve')]}"/>
<field name="installment" attrs="{'readonly':[('state','=','approve')]}"/>
<field name="payment_date" attrs="{'readonly':[('state','=','approve')]}"/>
<field name="company_id" options="{'no_create': True}" groups="base.group_multi_company"/>
<field name="currency_id" options="{'no_create': True}" />
</group>
<notebook>
<page string="Installments">
<field name="loan_lines">
<tree string="Installments" editable="bottom">
<field name="date"/>
<field name="amount"/>
<field name="paid" readonly="1" invisible="1"/>
</tree>
</field>
<group class="oe_subtotal_footer oe_right" colspan="2" >
<field name="total_amount" widget="monetary" options="{'currency_field': 'currency_id'}"/>
<field name="total_paid_amount" widget="monetary" options="{'currency_field': 'currency_id'}"/>
<field name="balance_amount" class="oe_subtotal_footer_separator" widget="monetary" options="{'currency_field': 'currency_id'}"/>
</group>
<div class="oe_clear"/>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<!--loan search view-->
<record id="view_loan_request_search_form" model="ir.ui.view">
<field name="name">hr.loan.search.form</field>
<field name="model">hr.loan</field>
<field name="arch" type="xml">
<search string="Loan">
<filter string="My Requests" name="myrequest" domain="[('employee_id.user_id.id', '=', uid)]" />
<field name="employee_id" string="Employee"/>
<field name="department_id" string="Department"/>
<filter string="Employee" name="employee_id" context="{'group_by':'employee_id'}"/>
<filter string="Department" name="department_id" context="{'group_by':'department_id'}"/>
<filter string="Status" name="status" context="{'group_by':'state'}"/>
</search>
</field>
</record>
<!--loan menu-->
<menuitem name="Loans &amp; Advances"
id="menu_hr_loans_and_advances" parent="hr.menu_hr_root"
sequence="20"/>
<record id="action_hr_loan_request" model="ir.actions.act_window">
<field name="name">Request for Loan</field>
<field name="res_model">hr.loan</field>
<field name="view_mode">tree,form</field>
<!--
<field name="context">{'search_default_myrequest': 1}</field>
-->
<field name="search_view_id" ref="view_loan_request_search_form"/>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to create a new Loan request.
</p><p>
Use this menu to create loan requests.
</p>
</field>
</record>
<menuitem name="Loan"
id="menu_base_hr_loan_request"
parent = "menu_hr_loans_and_advances"
sequence="1"/>
<menuitem name="Request for Loan"
parent="menu_base_hr_loan_request"
id="menu_hr_loan_request"
action="action_hr_loan_request"/>
<!-- Shortcuts -->
<record id="act_hr_employee_loan_request" model="ir.actions.act_window">
<field name="name">Loans</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">hr.loan</field>
<field name="binding_model_id" ref="hr.model_hr_employee"/>
<field name="view_mode">tree,form</field>
<!--
<field name="context">{'search_default_myloan': 1}</field>
-->
<field name="view_id" eval="hr_loan_tree_view"/>
</record>
<!-- HR employee inherit Loans -->
<record id="view_employee_form_loan_inherit" model="ir.ui.view">
<field name="name">hr.employee.loan.form.inherit</field>
<field name="model">hr.employee</field>
<field name="inherit_id" ref="hr.view_employee_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='button_box']" position="inside">
<button name="%(act_hr_employee_loan_request)d"
type="action"
class="oe_stat_button"
icon="fa-calendar"
groups="hr.group_hr_manager,hr.group_hr_user">
<field name="loan_count" widget="statinfo" string="Loans"/>
</button>
</xpath>
</field>
</record>
</odoo>

View file

@ -0,0 +1,12 @@
<?xml version="1.0" ?>
<odoo>
<record id="ir_seq_hr_loan" model="ir.sequence">
<field name="name">Loan Request</field>
<field name="code">hr.loan.seq</field>
<field name="prefix">LOAN/</field>
<field name="padding">4</field>
<field name="number_increment">1</field>
<field name="number_next_actual">1</field>
<field name="implementation">standard</field>
</record>
</odoo>

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="hr_payslip_form_inherit_view" model="ir.ui.view">
<field name="name">hr.payslip.form.loan</field>
<field name="model">hr.payslip</field>
<field name="inherit_id" ref="payroll.hr_payslip_view_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='input_line_ids']//tree//field[@name='sequence']" position="after">
<field name="loan_line_id" invisible="1"/>
</xpath>
</field>
</record>
</odoo>

View file

@ -0,0 +1,44 @@
[project]
name = "odoo-bringout-cybrosys-ohrms_loan"
version = "16.0.0"
description = "Open HRMS Loan Management - Manage Loan Requests"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-ocb-base>=16.0.0",
"odoo-bringout-oca-ocb-hr>=16.0.0",
"odoo-bringout-cybrosys-payroll>=16.0.0",
"requests>=2.25.1"
]
readme = "README.md"
requires-python = ">= 3.11"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Office/Business",
]
[project.urls]
homepage = "https://github.com/bringout/0"
repository = "https://github.com/bringout/0"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["ohrms_loan"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]