@ -0,0 +1,46 @@ |
|||||
|
.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg |
||||
|
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html |
||||
|
:alt: License: AGPL-3 |
||||
|
|
||||
|
Manpower Supply Management |
||||
|
========================== |
||||
|
* Module which helps manage manpower supply companies |
||||
|
|
||||
|
Configuration |
||||
|
============= |
||||
|
- www.odoo.com/documentation/16.0/setup/install.html |
||||
|
- Install our custom addon |
||||
|
|
||||
|
License |
||||
|
------- |
||||
|
GNU AFFERO GENERAL PUBLIC LICENSE Version 3 (AGPL v3) |
||||
|
(https://www.gnu.org/licenses/agpl-3.0-standalone.html) |
||||
|
|
||||
|
Company |
||||
|
------- |
||||
|
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__ |
||||
|
|
||||
|
Credits |
||||
|
------- |
||||
|
* Developer:(V16) Ranjith R , Contact : odoo@cybrosys.com |
||||
|
|
||||
|
Contacts |
||||
|
-------- |
||||
|
* Mail Contact : odoo@cybrosys.com |
||||
|
* Website : https://cybrosys.com |
||||
|
|
||||
|
Bug Tracker |
||||
|
----------- |
||||
|
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. |
||||
|
|
||||
|
Maintainer |
||||
|
========== |
||||
|
.. image:: https://cybrosys.com/images/logo.png |
||||
|
:target: https://cybrosys.com |
||||
|
This module is maintained by Cybrosys Technologies. |
||||
|
|
||||
|
For support and more information, please visit https://www.cybrosys.com |
||||
|
|
||||
|
Further information |
||||
|
=================== |
||||
|
HTML Description: `<static/description/index.html>`__ |
@ -0,0 +1,25 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Ranjith R(<https://www.cybrosys.com>) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# 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 (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
########################################################################### |
||||
|
from . import controllers |
||||
|
from . import models |
||||
|
from . import report |
||||
|
from . import wizard |
@ -0,0 +1,74 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Ranjith R(<https://www.cybrosys.com>) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# 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 (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
########################################################################### |
||||
|
{ |
||||
|
'name': 'Manpower Supply Management', |
||||
|
'version': '16.0.1.0.0', |
||||
|
'category': 'Human Resources', |
||||
|
'summary': 'Manage man power supply', |
||||
|
'description': "The Manpower Supply module in Odoo automates the process of" |
||||
|
" matching client requirements with suitable resources and " |
||||
|
"streamlines the allocation and management of manpower, " |
||||
|
"ensuring efficient service delivery.", |
||||
|
'author': 'Cybrosys Techno Solutions', |
||||
|
'company': 'Cybrosys Techno Solutions', |
||||
|
'maintainer': 'Cybrosys Techno Solutions', |
||||
|
'website': 'https://www.cybrosys.com', |
||||
|
'depends': ['website', 'account', 'portal', 'contacts'], |
||||
|
'data': [ |
||||
|
'security/manpower_supply_management_security.xml', |
||||
|
'security/labour_supply_security.xml', |
||||
|
'security/ir.model.access.csv', |
||||
|
'data/ir_sequence_data.xml', |
||||
|
'data/labour_supply_website_menu.xml', |
||||
|
'data/ir_cron_data.xml', |
||||
|
'views/workers_details_views.xml', |
||||
|
'views/skill_details_views.xml', |
||||
|
'views/labour_supply_views.xml', |
||||
|
'views/labour_on_skill_views.xml', |
||||
|
'views/labour_supply_website_template.xml', |
||||
|
'views/labour_on_supply_form_template.xml', |
||||
|
'views/labour_supply_portal_templates.xml', |
||||
|
'views/labour_supply_dashboard_views.xml', |
||||
|
'wizard/labour_supply_report_views.xml', |
||||
|
'report/labour_supply_templates.xml', |
||||
|
'report/labour_supply_reports.xml', |
||||
|
'report/form_print_labour_supply_templates.xml' |
||||
|
], |
||||
|
'assets': { |
||||
|
'web.assets_backend': [ |
||||
|
'/manpower_supply_management/static/src/js/labour_supply_dashoard.js', |
||||
|
'/manpower_supply_management/static/src/css/dashboard.css', |
||||
|
'/manpower_supply_management/static/src/scss/dashboard.scss', |
||||
|
'/manpower_supply_management/static/src/css/material-gauge.css', |
||||
|
'/manpower_supply_management/static/src/js/lib/Chart.bundle.js', |
||||
|
'/manpower_supply_management/static/src/xml/labour_supply_dashoard.xml', |
||||
|
], |
||||
|
'web.assets_frontend': [ |
||||
|
'/manpower_supply_management/static/src/css/website.css', |
||||
|
] |
||||
|
}, |
||||
|
'images': ['static/description/banner.png'], |
||||
|
'license': 'AGPL-3', |
||||
|
'installable': True, |
||||
|
'auto_install': False, |
||||
|
'application': True, |
||||
|
} |
@ -0,0 +1,24 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Ranjith R(<https://www.cybrosys.com>) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# 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 (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
########################################################################### |
||||
|
from . import manpower_supply_management |
||||
|
from . import portal |
||||
|
from . import labour_supply |
@ -0,0 +1,51 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Ranjith R(<https://www.cybrosys.com>) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# 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 (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
########################################################################### |
||||
|
from odoo import http |
||||
|
from odoo.http import request |
||||
|
|
||||
|
|
||||
|
class LabourSupply(http.Controller): |
||||
|
""" Class to create a route for labour supply details in website""" |
||||
|
|
||||
|
@http.route(['/labour_supplies'], type='http', auth='user', |
||||
|
website=True) |
||||
|
def create_labour_on_supply(self): |
||||
|
""" Function to render template to website""" |
||||
|
labour_supplies = request.env['labour.supply'].search( |
||||
|
[('customer_id.id', '=', |
||||
|
request.env.user.commercial_partner_id.id)]) |
||||
|
return request.render('manpower_supply_management.portal_labour_supply', |
||||
|
{'labour_supplies_portal': labour_supplies, |
||||
|
'page_name': 'labour_supplies_contract'}) |
||||
|
|
||||
|
@http.route(['/labour_supplies/<int:contract>'], type='http', |
||||
|
auth="user", website=True) |
||||
|
def labour_on_supply_details(self, contract): |
||||
|
""" Function to render template and pass value to website""" |
||||
|
labour_contract_rec = request.env['labour.supply'].browse(contract) |
||||
|
labour_contract_line_rec = request.env['labour.on.skill'].search( |
||||
|
[('labour_supply_id', '=', contract)]) |
||||
|
return http.request.render( |
||||
|
'manpower_supply_management.portal_labour_supply_details', |
||||
|
{'labour_contract_line_rec': labour_contract_line_rec, |
||||
|
'labour_contract_rec': labour_contract_rec, |
||||
|
'page_name': 'labour_supplies'}) |
@ -0,0 +1,97 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Ranjith R(<https://www.cybrosys.com>) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# 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 (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
########################################################################### |
||||
|
from odoo import http, fields |
||||
|
from odoo.http import request |
||||
|
|
||||
|
|
||||
|
class WebsiteForm(http.Controller): |
||||
|
""" Class to create a routes to website form for labor supply creation""" |
||||
|
|
||||
|
@http.route(['/labour_supply'], type='http', auth='user', |
||||
|
website=True) |
||||
|
def labour_supply(self): |
||||
|
""" Function to render template to website""" |
||||
|
if request.env.user._is_admin(): |
||||
|
customers = request.env['res.users'].sudo().search([]) |
||||
|
else: |
||||
|
customers = request.env.user |
||||
|
values = {'customer': customers} |
||||
|
return request.render( |
||||
|
'manpower_supply_management.online_labour_supply_form', values) |
||||
|
|
||||
|
@http.route(['/labour_supply/submit'], type='http', auth='user', |
||||
|
website=True) |
||||
|
def create_labour_supply(self, **post): |
||||
|
""" Function to render template and pass value to website""" |
||||
|
if (post.get('from_date') > post.get('to_date') or post.get( |
||||
|
'from_date') < str(fields.Date.today()) or |
||||
|
post.get('from_date') < str(fields.Date.today())): |
||||
|
if request.env.user._is_admin(): |
||||
|
customers = request.env['res.users'].sudo().search([]) |
||||
|
else: |
||||
|
customers = request.env.user |
||||
|
values = {'customer': customers, 'alert': True} |
||||
|
return request.render( |
||||
|
'manpower_supply_management.online_labour_supply_form', values) |
||||
|
else: |
||||
|
skills = request.env['skill.details'].sudo().search([]) |
||||
|
order = request.env['labour.supply'].sudo().create({ |
||||
|
'customer_id': post.get('customer_id'), |
||||
|
'from_date': post.get('from_date'), |
||||
|
'to_date': post.get('to_date') |
||||
|
}) |
||||
|
return request.render( |
||||
|
'manpower_supply_management.labour_on_supply_form' |
||||
|
, {'labour_supplies': order, 'skills': skills}) |
||||
|
|
||||
|
@http.route(['/labour_on_supply/add'], type='http', auth='user', |
||||
|
website=True) |
||||
|
def create_labour_on_supply(self, **post): |
||||
|
""" Function to render template and pass value to website""" |
||||
|
if (post.get('from_date') > post.get('to_date') or post.get( |
||||
|
'from_date') < str(fields.Date.today()) or |
||||
|
post.get('from_date') < str(fields.Date.today())): |
||||
|
skills = request.env['skill.details'].sudo().search([]) |
||||
|
order = request.env['labour.supply'].sudo().browse( |
||||
|
int(post.get('labour_supply'))) |
||||
|
return request.render( |
||||
|
'manpower_supply_management.labour_on_supply_form' |
||||
|
, {'labour_supplies': order, 'skills': skills, 'alert': True}) |
||||
|
else: |
||||
|
skills = request.env['skill.details'].sudo().search([]) |
||||
|
request.env['labour.on.skill'].sudo().create({ |
||||
|
'skill_id': post.get('skill'), |
||||
|
'from_date': post.get('from_date'), |
||||
|
'to_date': post.get('to_date'), |
||||
|
'number_of_labour_required': post.get('required_number'), |
||||
|
'labour_supply_id': post.get('labour_supply')}) |
||||
|
labour_supply_record = request.env['labour.supply'].sudo().browse( |
||||
|
int(post.get('labour_supply'))) |
||||
|
return request.render( |
||||
|
'manpower_supply_management.labour_on_supply_form', |
||||
|
{'labour_supplies': labour_supply_record, 'skills': skills}) |
||||
|
|
||||
|
@http.route(['/labour_on_supply/complete'], type='http', auth='user', |
||||
|
website=True) |
||||
|
def create_labour_on_supply_completed(self): |
||||
|
""" Function to render template to website""" |
||||
|
return request.render("manpower_supply_management.tmp_form_success") |
@ -0,0 +1,39 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Ranjith R(<https://www.cybrosys.com>) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# 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 (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
########################################################################### |
||||
|
from odoo.addons.portal.controllers import portal |
||||
|
from odoo.http import request |
||||
|
|
||||
|
|
||||
|
class CustomerPortal(portal.CustomerPortal): |
||||
|
""" |
||||
|
This class represents a customer portal. |
||||
|
It is responsible for preparing home portal values. |
||||
|
""" |
||||
|
|
||||
|
def _prepare_home_portal_values(self, counters): |
||||
|
values = super()._prepare_home_portal_values(counters) |
||||
|
if 'contact_count' in counters: |
||||
|
values['contact_count'] = request.env[ |
||||
|
'labour.supply'].search_count( |
||||
|
[('customer_id.id', '=', |
||||
|
request.env.user.commercial_partner_id.id)]) |
||||
|
return values |
@ -0,0 +1,16 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<!-- Schedule Action to change state of the labour if it expired --> |
||||
|
<data noupdate="1"> |
||||
|
<record id="ir_cron_labour_contract_expiration" model="ir.cron"> |
||||
|
<field name="name">labour contract expiry</field> |
||||
|
<field name="model_id" ref="model_labour_supply"/> |
||||
|
<field name="type">ir.action.server</field> |
||||
|
<field name="state">code</field> |
||||
|
<field name="code">model.cron_change_state()</field> |
||||
|
<field name="interval_number">1</field> |
||||
|
<field name="interval_type">days</field> |
||||
|
<field name="numbercall">-1</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,15 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<!-- Unique sequence for the model labour.supply --> |
||||
|
<data noupdate="1"> |
||||
|
<record id="sequence_labour_supply_id" model="ir.sequence"> |
||||
|
<field name="name">Labour supply</field> |
||||
|
<field name="code">labour.supply</field> |
||||
|
<field name="active">TRUE</field> |
||||
|
<field name="prefix">LS</field> |
||||
|
<field name="padding">6</field> |
||||
|
<field name="number_next">1</field> |
||||
|
<field name="number_increment">1</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,12 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<!-- Menu for labour request in website--> |
||||
|
<data noupdate="1"> |
||||
|
<record id="menu_labour_supply" model="website.menu"> |
||||
|
<field name="name">Labour Supply</field> |
||||
|
<field name="url">/labour_supply</field> |
||||
|
<field name="parent_id" ref="website.main_menu"/> |
||||
|
<field name="sequence">22</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,6 @@ |
|||||
|
## Module <manpower_supply_management> |
||||
|
|
||||
|
#### 13.12.2023 |
||||
|
#### Version 16.0.1.0.0 |
||||
|
#### ADD |
||||
|
- Initial commit for Manpower Supply Management |
@ -0,0 +1,25 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Ranjith R(<https://www.cybrosys.com>) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# 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 (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
########################################################################### |
||||
|
from . import labour_on_skill |
||||
|
from . import labour_supply |
||||
|
from . import skill_details |
||||
|
from . import workers_details |
@ -0,0 +1,47 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Ranjith R(<https://www.cybrosys.com>) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# 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 (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
########################################################################### |
||||
|
from odoo import fields, models |
||||
|
|
||||
|
|
||||
|
class LabourOnSkill(models.Model): |
||||
|
""" |
||||
|
This model is used to create a table field in the main model |
||||
|
for managing labor allocation based on skills. |
||||
|
""" |
||||
|
|
||||
|
_name = "labour.on.skill" |
||||
|
_description = "Selection of labour on skill" |
||||
|
_rec_name = "skill_id" |
||||
|
|
||||
|
skill_id = fields.Many2one('skill.details', |
||||
|
string="Skill required", required=True, |
||||
|
help="Field to choose skill") |
||||
|
number_of_labour_required = fields.Integer( |
||||
|
string="Number of labours required", |
||||
|
help="Field to give number of labour required") |
||||
|
labour_supply_id = fields.Many2one( |
||||
|
'labour.supply', |
||||
|
help="Many2one field to represent labour supply") |
||||
|
from_date = fields.Date(string="From date", required=True, |
||||
|
help="Field to choose from date") |
||||
|
to_date = fields.Date(string="To date", required=True, |
||||
|
help="Field to choose to date") |
@ -0,0 +1,244 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Ranjith R(<https://www.cybrosys.com>) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# 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 (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
########################################################################### |
||||
|
from datetime import datetime |
||||
|
from odoo import api, fields, models |
||||
|
from odoo.exceptions import ValidationError |
||||
|
|
||||
|
|
||||
|
class LabourSupply(models.Model): |
||||
|
""" |
||||
|
Class to create contract for labour supply |
||||
|
""" |
||||
|
_name = "labour.supply" |
||||
|
_description = "Contract creation" |
||||
|
_inherit = ['mail.thread', 'mail.activity.mixin'] |
||||
|
_rec_name = 'sequence_number' |
||||
|
|
||||
|
sequence_number = fields.Char(string="Sequence Number", readonly=True, |
||||
|
copy=False, default="New", |
||||
|
help="Field to specify sequence number") |
||||
|
customer_id = fields.Many2one('res.partner', string="Customer", |
||||
|
help="Field to choose customer", |
||||
|
required=True) |
||||
|
skill_ids = fields.One2many('labour.on.skill', |
||||
|
'labour_supply_id', |
||||
|
string="Skills Required", required=True, |
||||
|
help="Field to choose skill and number " |
||||
|
"required") |
||||
|
company_id = fields.Many2one('res.company', string='Company', |
||||
|
required=True, |
||||
|
default=lambda self: self.env.company) |
||||
|
from_date = fields.Date(string="From date", tracking=True, |
||||
|
help="Field to choose from date") |
||||
|
to_date = fields.Date(string="To date", tracking=True, |
||||
|
help="Field to choose to date") |
||||
|
state = fields.Selection([('draft', 'Draft'), ('ready', 'Ready'), |
||||
|
('confirmed', 'Confirmed'), |
||||
|
('invoiced', 'Invoiced'), |
||||
|
('canceled', 'Canceled'), |
||||
|
('expired', 'Expired')], |
||||
|
string="State", default="draft", tracking=True, |
||||
|
help="Field to specify state") |
||||
|
workers_ids = fields.Many2many('workers.details', |
||||
|
string="Select workers", |
||||
|
readonly=True, |
||||
|
help="Field to choose workers") |
||||
|
total_amount = fields.Monetary(tracking=True, readonly=True, |
||||
|
string="Total Amount", help="Total amount") |
||||
|
currency_id = fields.Many2one('res.currency', |
||||
|
string='Currency', help="Currency", |
||||
|
related='company_id.currency_id') |
||||
|
period = fields.Integer(string="Period", help="The period of contract") |
||||
|
invoice_id = fields.Many2one('account.move', string="Invoice", |
||||
|
help="The invoice of contract") |
||||
|
is_alert = fields.Boolean(string="Alert", |
||||
|
help="Boolean field to control the visibility " |
||||
|
"of alert visibility") |
||||
|
view_workers_page = fields.Boolean(default=False, string="View worker page", |
||||
|
help="Field to control the" |
||||
|
" visibility of workers page ") |
||||
|
|
||||
|
@api.model |
||||
|
def create(self, vals): |
||||
|
""" |
||||
|
Summary: |
||||
|
function return sequence number for record |
||||
|
Args: |
||||
|
vals:To store the sequence created |
||||
|
return: |
||||
|
result:return sequence created |
||||
|
""" |
||||
|
vals['sequence_number'] = self.env['ir.sequence'].next_by_code( |
||||
|
'labour.supply') or 'New' |
||||
|
return super(LabourSupply, self).create(vals) |
||||
|
|
||||
|
def cron_change_state(self): |
||||
|
""" |
||||
|
Summary: |
||||
|
function changes the state of worker |
||||
|
when the worker have ongoing work |
||||
|
and also change the state when the contact expire |
||||
|
""" |
||||
|
labour_supplies = self.env['labour.supply'].search( |
||||
|
[('state', 'not in', ['draft', 'cancel'])]) |
||||
|
for labour_supply in labour_supplies: |
||||
|
if labour_supply.to_date < fields.Date.today(): |
||||
|
labour_supply.write({'state': 'expired'}) |
||||
|
for worker in labour_supply.workers_ids: |
||||
|
worker.write({'state': 'available'}) |
||||
|
labours_supplies = self.env['labour.supply'].search( |
||||
|
[('state', '=', 'invoiced')]) |
||||
|
for contract in labours_supplies: |
||||
|
if contract.from_date == fields.Date.today(): |
||||
|
for labour in contract.workers_ids: |
||||
|
labour.write({'state': 'not_available'}) |
||||
|
|
||||
|
def action_confirm(self): |
||||
|
""" |
||||
|
Summary: |
||||
|
function confirm the record state |
||||
|
""" |
||||
|
self.write({'state': 'confirmed'}) |
||||
|
|
||||
|
def action_draft(self): |
||||
|
""" |
||||
|
Summary: |
||||
|
function change the record state to draft |
||||
|
""" |
||||
|
self.total_amount = 0 |
||||
|
self.workers_ids = False |
||||
|
self.view_workers_page = False |
||||
|
self.is_alert = False |
||||
|
self.state = 'draft' |
||||
|
|
||||
|
def action_cancel(self): |
||||
|
""" |
||||
|
summary: |
||||
|
function change the record state to cancelled |
||||
|
""" |
||||
|
for worker in self.workers_ids: |
||||
|
worker.write({'state': 'available'}) |
||||
|
self.write({'state': 'canceled'}) |
||||
|
|
||||
|
def action_create_invoice(self): |
||||
|
""" |
||||
|
summary: |
||||
|
function change the record state to invoice, |
||||
|
create invoice on the basis of total amount and |
||||
|
return invoice |
||||
|
""" |
||||
|
if self.from_date == fields.Date.today(): |
||||
|
for worker in self.workers_ids: |
||||
|
worker.write({'state': 'not_available'}) |
||||
|
invoice = self.env['account.move'].create({ |
||||
|
'move_type': 'out_invoice', |
||||
|
'partner_id': self.customer_id.id, |
||||
|
'currency_id': self.currency_id.id, |
||||
|
'invoice_date': self.to_date, |
||||
|
'invoice_origin': self.sequence_number, |
||||
|
'invoice_line_ids': [(0, 0, { |
||||
|
'name': "contract cost", |
||||
|
'quantity': 1, |
||||
|
'price_unit': self.total_amount, |
||||
|
})], |
||||
|
}) |
||||
|
self.invoice_id = invoice.id |
||||
|
self.write({'state': 'invoiced'}) |
||||
|
return { |
||||
|
'name': 'create_invoice', |
||||
|
'type': 'ir.actions.act_window', |
||||
|
'view_mode': 'form', |
||||
|
'res_id': invoice.id, |
||||
|
'res_model': 'account.move', |
||||
|
'target': 'current' |
||||
|
} |
||||
|
|
||||
|
def action_labour_supply_invoices(self): |
||||
|
""" |
||||
|
Summary: |
||||
|
function returns invoice of current record |
||||
|
return: |
||||
|
returns invoices created |
||||
|
""" |
||||
|
return { |
||||
|
'name': 'Create Invoice', |
||||
|
'type': 'ir.actions.act_window', |
||||
|
'view_mode': 'tree,form', |
||||
|
'res_model': 'account.move', |
||||
|
'domain': [('invoice_origin', '=', self.sequence_number)] |
||||
|
} |
||||
|
|
||||
|
def action_fetch(self): |
||||
|
""" |
||||
|
Summary: |
||||
|
function change the record state to Ready, |
||||
|
calculate total amount according workers assigned |
||||
|
also calculate the total from date and to date """ |
||||
|
self.workers_ids = False |
||||
|
self.total_amount = 0 |
||||
|
if self.skill_ids: |
||||
|
date_list = [] |
||||
|
for skill in self.skill_ids: |
||||
|
if skill.from_date < fields.Date.today() or \ |
||||
|
skill.to_date < fields.Date.today(): |
||||
|
raise ValidationError("Enter valid date ") |
||||
|
if skill.to_date < skill.from_date: |
||||
|
raise ValidationError("Invalid start date and end date ") |
||||
|
labour_not_available = self.env['labour.supply'].search( |
||||
|
[('state', '=', "invoiced"), |
||||
|
('from_date', '<', fields.Date.today()) |
||||
|
, ('to_date', '>', fields.Date.today())]).mapped( |
||||
|
'workers_ids.id') |
||||
|
labours_selected = [] |
||||
|
for skill in self.skill_ids: |
||||
|
count = 0 |
||||
|
date_list.append(skill.from_date) |
||||
|
date_list.append(skill.to_date) |
||||
|
worker_details = self.env['workers.details'].search([]) |
||||
|
labour_available = worker_details.search( |
||||
|
[('skill_ids', '=', skill.skill_id.id), |
||||
|
('state', '=', 'available'), |
||||
|
('id', 'not in', labours_selected), |
||||
|
('id', 'not in', labour_not_available)]).mapped('id') |
||||
|
labours_selected = labours_selected + labour_available |
||||
|
if len(labour_available) < skill.number_of_labour_required: |
||||
|
self.is_alert = True |
||||
|
for worker in worker_details: |
||||
|
if worker.id in labour_available: |
||||
|
if count < skill.number_of_labour_required: |
||||
|
count = count + 1 |
||||
|
self.write({'workers_ids': [(4, worker.id,)]}) |
||||
|
date_start = datetime.strptime(str(skill.from_date), |
||||
|
'%Y-%m-%d') |
||||
|
date_end = datetime.strptime(str(skill.to_date), |
||||
|
'%Y-%m-%d') |
||||
|
period = date_end - date_start |
||||
|
self.period = int(str(period.days)) |
||||
|
self.total_amount = self.total_amount + ( |
||||
|
worker.rate * (self.period + 1)) |
||||
|
date_list = sorted(date_list) |
||||
|
self.from_date = date_list[0] |
||||
|
self.to_date = date_list[-1] |
||||
|
self.view_workers_page = True |
||||
|
self.state = 'ready' |
||||
|
else: |
||||
|
raise ValidationError("Enter Skill Required") |
@ -0,0 +1,36 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Ranjith R(<https://www.cybrosys.com>) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# 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 (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
########################################################################### |
||||
|
from odoo import fields, models |
||||
|
|
||||
|
|
||||
|
class SkillDetails(models.Model): |
||||
|
""" |
||||
|
Class to create skill for workers |
||||
|
""" |
||||
|
_name = "skill.details" |
||||
|
_description = "Skill type" |
||||
|
|
||||
|
name = fields.Char(string="Name", help="Field to give name of skill", |
||||
|
required=True) |
||||
|
company_id = fields.Many2one('res.company', string='Company', |
||||
|
required=True, help="Company", |
||||
|
default=lambda self: self.env.company) |
@ -0,0 +1,325 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Ranjith R(<https://www.cybrosys.com>) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# 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 (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
########################################################################### |
||||
|
from dateutil.relativedelta import relativedelta |
||||
|
from odoo import api, fields, models |
||||
|
|
||||
|
|
||||
|
class WorkersDetails(models.Model): |
||||
|
""" |
||||
|
Class to create workers |
||||
|
""" |
||||
|
_name = "workers.details" |
||||
|
_description = "Workers" |
||||
|
_inherit = ['mail.thread', 'mail.activity.mixin'] |
||||
|
|
||||
|
name = fields.Char(string="Name", required=True, help="Field to type name") |
||||
|
skill_ids = fields.Many2many('skill.details', string="Skills", |
||||
|
help="Field to choose skills of worker") |
||||
|
related_partner_id = fields.Many2one('res.partner', |
||||
|
string="Related partner", |
||||
|
readonly=True, |
||||
|
help="Field represent the related " |
||||
|
"partner") |
||||
|
wage = fields.Monetary(string="Wage per day", |
||||
|
help="Field to give wage of worker") |
||||
|
rate = fields.Monetary(string="Rate per day", |
||||
|
help="Field to give rate of worker") |
||||
|
phone_number = fields.Char(string="Phone number", |
||||
|
help="Field to give address of worker") |
||||
|
email = fields.Char(string=" Email", help="Field to give email of worker") |
||||
|
currency_id = fields.Many2one('res.currency', |
||||
|
string='Currency', help="Currency", |
||||
|
related='company_id.currency_id') |
||||
|
company_id = fields.Many2one('res.company', string='Company', |
||||
|
required=True, help="Company", |
||||
|
default=lambda self: self.env.company) |
||||
|
image_worker = fields.Binary(string="Image", |
||||
|
help="Field to give image of worker") |
||||
|
state = fields.Selection( |
||||
|
[('available', 'Available'), |
||||
|
('not_available', 'Not Available')], default="available", |
||||
|
string="State", help="Field to specify state of worker") |
||||
|
|
||||
|
@api.model |
||||
|
def create(self, vals): |
||||
|
""" Function to created related partner""" |
||||
|
partner = self.env['res.partner'].create({ |
||||
|
'name': vals['name'], |
||||
|
'phone': vals['phone_number'], |
||||
|
'email': vals['email'], |
||||
|
'image_1920': vals['image_worker'], |
||||
|
}) |
||||
|
vals['related_partner_id'] = partner.id |
||||
|
self.related_partner_id = vals['related_partner_id'] |
||||
|
return super(WorkersDetails, self).create(vals) |
||||
|
|
||||
|
@api.model |
||||
|
def get_labour_supply_details(self): |
||||
|
""" Summary: |
||||
|
function to get the number of ongoing contract for dashboard |
||||
|
return: |
||||
|
length of ongoing contract |
||||
|
""" |
||||
|
labour_supply_ongoing = self.env['labour.supply'].search_count( |
||||
|
[('from_date', '<=', fields.Date.today()), |
||||
|
('to_date', '>=', fields.Date.today()), |
||||
|
('state', '=', 'invoiced'), |
||||
|
('company_id', '=', self.env.company.id)]) |
||||
|
return {'ongoing_contract': labour_supply_ongoing} |
||||
|
|
||||
|
@api.model |
||||
|
def get_workers_count(self): |
||||
|
""" Summary: |
||||
|
function to get the number of workers for dashboard |
||||
|
return: |
||||
|
states and count of labour supply in that state |
||||
|
""" |
||||
|
state = [] |
||||
|
count = [] |
||||
|
workers = self.env['workers.details'].search( |
||||
|
[('company_id', '=', self.env.company.id)]) |
||||
|
not_available_labour = workers.filtered( |
||||
|
lambda record: record.state == 'not_available') |
||||
|
state.append("Not Available") |
||||
|
count.append(len(not_available_labour)) |
||||
|
available_labour = workers.filtered( |
||||
|
lambda record: record.state == 'available') |
||||
|
state.append("Available") |
||||
|
count.append(len(available_labour)) |
||||
|
values = { |
||||
|
'state': state, |
||||
|
'count': count, |
||||
|
} |
||||
|
return values |
||||
|
|
||||
|
@api.model |
||||
|
def get_top_customer(self): |
||||
|
""" Summary: |
||||
|
function to top ten customer for dashboard |
||||
|
return: |
||||
|
return record of customers |
||||
|
""" |
||||
|
query = ( |
||||
|
'select res_partner.id,res_partner.name,' |
||||
|
'res_partner.email,count(labour_supply.company_id)\n' |
||||
|
' from labour_supply\n' |
||||
|
' inner join res_partner on ' |
||||
|
'res_partner.id=labour_supply.customer_id') |
||||
|
query += f" where labour_supply.company_id = {self.env.company.id:d} " |
||||
|
query += """group by res_partner.id order by count desc limit 10""" |
||||
|
self.env.cr.execute(query) |
||||
|
datas = self.env.cr.dictfetchall() |
||||
|
return {'customer': datas} |
||||
|
|
||||
|
@api.model |
||||
|
def get_skills_available(self): |
||||
|
""" Summary: |
||||
|
function to get skill available for dashboard |
||||
|
return: |
||||
|
skills as data |
||||
|
""" |
||||
|
|
||||
|
query = """select name,company_id from skill_details""" |
||||
|
query += f" where skill_details.company_id = {self.env.company.id:d} " |
||||
|
query += """limit 10""" |
||||
|
self.env.cr.execute(query) |
||||
|
datas = self.env.cr.dictfetchall() |
||||
|
return {'skill': datas} |
||||
|
|
||||
|
@api.model |
||||
|
def get_workers_available(self): |
||||
|
""" Summary: |
||||
|
function to get the number of workers for dashboard |
||||
|
return: |
||||
|
worker details |
||||
|
""" |
||||
|
query = """select * from workers_details |
||||
|
where state ='available'""" |
||||
|
query += f" and workers_details.company_id = {self.env.company.id:d} " |
||||
|
query += """limit 10""" |
||||
|
self.env.cr.execute(query) |
||||
|
datas = self.env.cr.dictfetchall() |
||||
|
|
||||
|
return {'workers': datas} |
||||
|
|
||||
|
@api.model |
||||
|
def get_total_invoiced_amount(self): |
||||
|
""" |
||||
|
Summary: |
||||
|
function to get the number of contract on the |
||||
|
basis of customer and state for dashboard |
||||
|
return: |
||||
|
total invoice amount |
||||
|
""" |
||||
|
labour_supply_ongoing = self.env['labour.supply'].search( |
||||
|
[('state', '=', 'invoiced'), |
||||
|
('company_id', '=', self.env.user.company_id.id)]) |
||||
|
invoiced_amount = 0 |
||||
|
for contract in labour_supply_ongoing: |
||||
|
invoiced_amount = invoiced_amount + contract.total_amount |
||||
|
return {'invoiced_amount': invoiced_amount} |
||||
|
|
||||
|
@api.model |
||||
|
def get_expected_amount(self): |
||||
|
""" |
||||
|
Summary: |
||||
|
function to get expecting amount |
||||
|
return: |
||||
|
total expecting amount |
||||
|
""" |
||||
|
labour_supply_ongoing = self.env['labour.supply'].search( |
||||
|
[('state', 'not in', ['ready', 'expired', 'draft'])]) |
||||
|
expected_amount = 0 |
||||
|
for contract in labour_supply_ongoing: |
||||
|
expected_amount = expected_amount + contract.total_amount |
||||
|
return {'expected_amount': expected_amount} |
||||
|
|
||||
|
@api.model |
||||
|
def get_contract_count_state(self): |
||||
|
"""Summary:function to get the number of contract on the basis of |
||||
|
customer and state for dashboard initially |
||||
|
return: |
||||
|
count and state |
||||
|
""" |
||||
|
state = [] |
||||
|
count = [] |
||||
|
labour_supply = self.env['labour.supply'].search( |
||||
|
[('company_id', '=', self.env.company.id)]) |
||||
|
labour_supply_draft = labour_supply.filtered( |
||||
|
lambda record: record.state == 'draft') |
||||
|
state.append("Draft") |
||||
|
count.append(len(labour_supply_draft)) |
||||
|
labour_supply_ready = labour_supply.filtered( |
||||
|
lambda record: record.state == 'ready') |
||||
|
state.append("Ready") |
||||
|
count.append(len(labour_supply_ready)) |
||||
|
labour_supply_confirm = labour_supply.filtered( |
||||
|
lambda record: record.state == 'confirm') |
||||
|
state.append("Confirm") |
||||
|
count.append(len(labour_supply_confirm)) |
||||
|
labour_supply_invoiced = labour_supply.filtered( |
||||
|
lambda record: record.state == 'invoiced') |
||||
|
state.append("Invoiced") |
||||
|
count.append(len(labour_supply_invoiced)) |
||||
|
labour_supply_expired = labour_supply.filtered( |
||||
|
lambda record: record.state == 'expired') |
||||
|
state.append("Expired") |
||||
|
count.append(len(labour_supply_expired)) |
||||
|
labour_supply_cancelled = labour_supply.filtered( |
||||
|
lambda record: record.state == 'cancelled') |
||||
|
state.append("Cancelled") |
||||
|
count.append(len(labour_supply_cancelled)) |
||||
|
values = { |
||||
|
'state': state, |
||||
|
'count': count, |
||||
|
} |
||||
|
return values |
||||
|
|
||||
|
@api.model |
||||
|
def get_contract_amount(self): |
||||
|
""" |
||||
|
Summary: |
||||
|
function to get the amount of contract on the |
||||
|
return: |
||||
|
sequence and amount""" |
||||
|
sequence = [] |
||||
|
amount = [] |
||||
|
labour_supply = self.env['labour.supply'].search( |
||||
|
[('company_id', '=', self.env.company.id)], limit=5) |
||||
|
for contract in labour_supply: |
||||
|
sequence.append(contract.sequence_number) |
||||
|
amount.append(contract.total_amount) |
||||
|
values = { |
||||
|
'sequence': sequence, |
||||
|
'amount': amount, |
||||
|
} |
||||
|
return values |
||||
|
|
||||
|
@api.model |
||||
|
def get_details_amount(self, option): |
||||
|
""" |
||||
|
Summary: |
||||
|
function to get the amount of contract on the basis of filter |
||||
|
dashboard initially |
||||
|
Args: |
||||
|
option:filter value on dashboard |
||||
|
returns: |
||||
|
partner and amount |
||||
|
""" |
||||
|
sample_date = fields.Date.today() |
||||
|
first_day = sample_date + relativedelta(day=1) |
||||
|
last_day = sample_date + relativedelta(day=31) |
||||
|
first_month = first_day + relativedelta(month=1) |
||||
|
last_month = last_day + relativedelta(month=12) |
||||
|
sequence = [] |
||||
|
amount = [] |
||||
|
labour_supply = self.env['labour.supply'].search( |
||||
|
[('company_id', '=', self.env.company.id)], limit=5) |
||||
|
|
||||
|
if option == 'daily': |
||||
|
labour_supply = labour_supply.filtered( |
||||
|
lambda record: record.from_date == sample_date) |
||||
|
elif option == "monthly": |
||||
|
labour_supply = labour_supply.filtered( |
||||
|
lambda record: first_day <= record.from_date <= last_day) |
||||
|
elif option == "yearly": |
||||
|
labour_supply = labour_supply.filtered( |
||||
|
lambda record: first_month <= record.from_date <= last_month) |
||||
|
|
||||
|
for contract in labour_supply: |
||||
|
sequence.append(contract.sequence_number) |
||||
|
amount.append(contract.total_amount) |
||||
|
|
||||
|
values = { |
||||
|
'sequence': sequence, |
||||
|
'amount': amount, |
||||
|
} |
||||
|
return values |
||||
|
|
||||
|
@api.model |
||||
|
def get_contract_count_customer(self): |
||||
|
""" |
||||
|
Summary: |
||||
|
function to get the number of contract on the basis of |
||||
|
customer and state for dashboard initially |
||||
|
returns: |
||||
|
partner and count of contract |
||||
|
""" |
||||
|
labour_supply = self.env['labour.supply'].search( |
||||
|
[('company_id', '=', self.env.company.id)]) |
||||
|
|
||||
|
customer = [] |
||||
|
customer_id = [] |
||||
|
count = [] |
||||
|
for contract in labour_supply: |
||||
|
if contract.customer_id.id not in customer_id: |
||||
|
number = self.env['labour.supply'].search_count( |
||||
|
[('customer_id', '=', contract.customer_id.id), |
||||
|
('company_id', '=', self.env.company.id)]) |
||||
|
customer.append(contract.customer_id.name) |
||||
|
customer_id.append(contract.customer_id.id) |
||||
|
count.append(number) |
||||
|
values = { |
||||
|
'name': customer, |
||||
|
'count': count, |
||||
|
} |
||||
|
return values |
@ -0,0 +1,22 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Ranjith R(<https://www.cybrosys.com>) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# 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 (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
########################################################################### |
||||
|
from . import labour_supply_report |
@ -0,0 +1,60 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<!-- Template for print pdf--> |
||||
|
<odoo> |
||||
|
<template id="form_print_labour_supply"> |
||||
|
<t t-call="web.html_container"> |
||||
|
<t t-call="web.external_layout"> |
||||
|
<div class="page"> |
||||
|
<center> |
||||
|
<h1>Labour Supply Form Print</h1> |
||||
|
</center> |
||||
|
<div class="row mt32 mb32"> |
||||
|
<div class="col-3"> |
||||
|
<strong>customer:</strong> |
||||
|
<h4> |
||||
|
<t t-esc="labour_supply.customer_id.name"/> |
||||
|
</h4> |
||||
|
</div> |
||||
|
<br/> |
||||
|
<div class="col-3"> |
||||
|
<strong>From Date:</strong> |
||||
|
<t t-esc="labour_supply.from_date"/> |
||||
|
</div> |
||||
|
<br/> |
||||
|
<div class="col-3"> |
||||
|
<strong>To Date:</strong> |
||||
|
<t t-esc="labour_supply.to_date"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
<br/> |
||||
|
<table class="table table-sm"> |
||||
|
<thead> |
||||
|
<tr> |
||||
|
<th>skill</th> |
||||
|
<th>From Date</th> |
||||
|
<th>To Date</th> |
||||
|
<th>Required Number</th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<tbody> |
||||
|
<tr t-foreach="labour_supply.skill_ids" t-as="line"> |
||||
|
<td class="text-center"> |
||||
|
<span t-esc="line.skill_id['name']"/> |
||||
|
</td> |
||||
|
<td class="text-center"> |
||||
|
<span t-esc="line['from_date']"/> |
||||
|
</td> |
||||
|
<td class="text-center"> |
||||
|
<span t-esc="line['to_date']"/> |
||||
|
</td> |
||||
|
<td class="text-center"> |
||||
|
<span t-esc="line['number_of_labour_required']"/> |
||||
|
</td> |
||||
|
</tr> |
||||
|
</tbody> |
||||
|
</table> |
||||
|
</div> |
||||
|
</t> |
||||
|
</t> |
||||
|
</template> |
||||
|
</odoo> |
@ -0,0 +1,38 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################# |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
||||
|
# Author: Ranjith R(<https://www.cybrosys.com>) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# 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 (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
########################################################################### |
||||
|
from odoo import api, models |
||||
|
|
||||
|
|
||||
|
class LabourSupplyPrint(models.AbstractModel): |
||||
|
""" Class to print form view of contract""" |
||||
|
|
||||
|
_name = 'report.manpower_supply_management.form_print_labour_supply' |
||||
|
_description = "Report for labour supply" |
||||
|
|
||||
|
@api.model |
||||
|
def _get_report_values(self, docids, data=None): |
||||
|
""" Function to print form view""" |
||||
|
labour_supply = self.env['labour.supply'].browse(docids) |
||||
|
return { |
||||
|
'docs_ids': docids, |
||||
|
'labour_supply': labour_supply |
||||
|
} |
@ -0,0 +1,34 @@ |
|||||
|
<?xml version="1.0" encoding='utf-8'?> |
||||
|
<odoo> |
||||
|
<!-- Actions for pdf report when filter is Customer Wise --> |
||||
|
<record id="action_labour_supply_report" model="ir.actions.report"> |
||||
|
<field name="name">Labour Supply Report</field> |
||||
|
<field name="model">labour.supply.report</field> |
||||
|
<field name="report_type">qweb-pdf</field> |
||||
|
<field name="report_name">manpower_supply_management.report_labour_supply</field> |
||||
|
<field name="report_file">manpower_supply_management.report_labour_supply</field> |
||||
|
<field name="binding_type" ref="model_labour_supply_report"/> |
||||
|
<field name="binding_type">report</field> |
||||
|
</record> |
||||
|
<!-- Actions for pdf report when filter is State Wise --> |
||||
|
<record id="action_labour_supply_report_second" |
||||
|
model="ir.actions.report"> |
||||
|
<field name="name">Labour Supply Report</field> |
||||
|
<field name="model">labour.supply.report</field> |
||||
|
<field name="report_type">qweb-pdf</field> |
||||
|
<field name="report_name">manpower_supply_management.report_labour_supply_state_wise</field> |
||||
|
<field name="report_file">manpower_supply_management.report_labour_supply_state_wise</field> |
||||
|
<field name="binding_type" ref="model_labour_supply_report"/> |
||||
|
<field name="binding_type">report</field> |
||||
|
</record> |
||||
|
<!-- Actions for pdf report server action print--> |
||||
|
<record id="action_labour_supply_form_print" model="ir.actions.report"> |
||||
|
<field name="name">Print</field> |
||||
|
<field name="model">labour.supply</field> |
||||
|
<field name="report_type">qweb-pdf</field> |
||||
|
<field name="report_name">manpower_supply_management.form_print_labour_supply</field> |
||||
|
<field name="report_file">report.manpower_supply_management.form_print_labour_supply</field> |
||||
|
<field name="binding_model_id" ref="model_labour_supply"/> |
||||
|
<field name="binding_type">report</field> |
||||
|
</record> |
||||
|
</odoo> |
@ -0,0 +1,164 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<!-- Template for pdf report--> |
||||
|
<template id="report_labour_supply"> |
||||
|
<t t-call="web.html_container"> |
||||
|
<t t-call="web.external_layout"> |
||||
|
<div class="page"> |
||||
|
<center> |
||||
|
<h1>Labour Supply Report</h1> |
||||
|
</center> |
||||
|
<div class="row mt32 mb32"> |
||||
|
<div class="col-3"> |
||||
|
<strong>customer:</strong> |
||||
|
<h4> |
||||
|
<t t-esc="customer_id"/> |
||||
|
</h4> |
||||
|
</div> |
||||
|
<div class="col-3"> |
||||
|
<strong>From Date:</strong> |
||||
|
<p t-esc="from_date"/> |
||||
|
</div> |
||||
|
<div class="col-3"> |
||||
|
<strong>To Date:</strong> |
||||
|
<p t-esc="to_date"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
<br/> |
||||
|
<table class="table table-sm"> |
||||
|
<thead> |
||||
|
<tr> |
||||
|
<th>Sequence number</th> |
||||
|
<th>From Date</th> |
||||
|
<th>To Date</th> |
||||
|
<th>Total Amount</th> |
||||
|
<th>State</th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<tbody> |
||||
|
<tr t-foreach="datas" t-as="line"> |
||||
|
<td class="text-center"> |
||||
|
<span t-esc="line['sequence_number']"/> |
||||
|
</td> |
||||
|
<td class="text-center"> |
||||
|
<span t-esc="line['from_date']"/> |
||||
|
</td> |
||||
|
<td class="text-center"> |
||||
|
<span t-esc="line['to_date']"/> |
||||
|
</td> |
||||
|
<td class="text-center"> |
||||
|
<span t-esc="line['total_amount']" |
||||
|
t-esc-options='{"widget": "monetary", |
||||
|
"display_currency": o.company_id.currency_id}'/> |
||||
|
</td> |
||||
|
<td class="text-center"> |
||||
|
<t t-if="line['state']=='ready'"> |
||||
|
<span>Ready</span> |
||||
|
</t> |
||||
|
<t t-if="line['state']=='invoiced'"> |
||||
|
<span>Invoiced</span> |
||||
|
</t> |
||||
|
<t t-if="line['state']=='confirmed'"> |
||||
|
<span>Confirmed</span> |
||||
|
</t> |
||||
|
<t t-if="line['state']=='draft'"> |
||||
|
<span>Draft</span> |
||||
|
</t> |
||||
|
<t t-if="line['state']=='expired'"> |
||||
|
<span>Expired</span> |
||||
|
</t> |
||||
|
<t t-if="line['state']=='canceled'"> |
||||
|
<span>Canceled</span> |
||||
|
</t> |
||||
|
</td> |
||||
|
</tr> |
||||
|
</tbody> |
||||
|
</table> |
||||
|
</div> |
||||
|
</t> |
||||
|
</t> |
||||
|
</template> |
||||
|
<!-- Template for pdf report--> |
||||
|
<template id="report_labour_supply_state_wise"> |
||||
|
<t t-call="web.html_container"> |
||||
|
<t t-call="web.external_layout"> |
||||
|
<div class="page"> |
||||
|
<center> |
||||
|
<h1>Labour Supply Report</h1> |
||||
|
</center> |
||||
|
<div class="row mt32 mb32"> |
||||
|
<div class="col-3"> |
||||
|
<strong>State:</strong> |
||||
|
<h4> |
||||
|
<t t-if="state_id=='ready'"> |
||||
|
<span>Ready</span> |
||||
|
</t> |
||||
|
<t t-if="state_id!='ready'"> |
||||
|
<span t-esc="state_id"/> |
||||
|
</t> |
||||
|
</h4> |
||||
|
</div> |
||||
|
<div class="col-3"> |
||||
|
<strong>From Date:</strong> |
||||
|
<p t-esc="from_date"/> |
||||
|
</div> |
||||
|
<div class="col-3"> |
||||
|
<strong>To Date:</strong> |
||||
|
<p t-esc="to_date"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
<br/> |
||||
|
<table class="table table-sm"> |
||||
|
<thead> |
||||
|
<tr> |
||||
|
<th>Sequence number</th> |
||||
|
<th>From Date</th> |
||||
|
<th>To Date</th> |
||||
|
<th>Total Amount</th> |
||||
|
<th>State</th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<tbody> |
||||
|
<tr t-foreach="datas" t-as="line"> |
||||
|
<td class="text-center"> |
||||
|
<span t-esc="line['sequence_number']"/> |
||||
|
</td> |
||||
|
<td class="text-center"> |
||||
|
<span t-esc="line['from_date']"/> |
||||
|
</td> |
||||
|
<td class="text-center"> |
||||
|
<span t-esc="line['to_date']"/> |
||||
|
</td> |
||||
|
<td class="text-center"> |
||||
|
<span t-esc="line['total_amount']" |
||||
|
t-esc-options='{"widget": "monetary", |
||||
|
"display_currency": o.company_id.currency_id}'/> |
||||
|
</td> |
||||
|
<td class="text-center"> |
||||
|
<t t-if="line['state']=='ready'"> |
||||
|
<span>Ready</span> |
||||
|
</t> |
||||
|
<t t-if="line['state']=='invoiced'"> |
||||
|
<span>Invoiced</span> |
||||
|
</t> |
||||
|
<t t-if="line['state']=='confirmed'"> |
||||
|
<span>Confirmed</span> |
||||
|
</t> |
||||
|
<t t-if="line['state']=='draft'"> |
||||
|
<span>Draft</span> |
||||
|
</t> |
||||
|
<t t-if="line['state']=='expired'"> |
||||
|
<span>Expired</span> |
||||
|
</t> |
||||
|
<t t-if="line['state']=='canceled'"> |
||||
|
<span>Canceled</span> |
||||
|
</t> |
||||
|
</td> |
||||
|
</tr> |
||||
|
</tbody> |
||||
|
</table> |
||||
|
</div> |
||||
|
</t> |
||||
|
</t> |
||||
|
</template> |
||||
|
</odoo> |
|
@ -0,0 +1,27 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<!-- Multi-company record filtration and security group--> |
||||
|
<data noupdate="1"> |
||||
|
<record id="labour_supply_rule_company" model="ir.rule"> |
||||
|
<field name="name">Labour Supply Multi-Company</field> |
||||
|
<field name="model_id" ref="model_labour_supply"/> |
||||
|
<field name="domain_force"> |
||||
|
['|',('company_id','=',False),('company_id', 'in', company_ids)] |
||||
|
</field> |
||||
|
</record> |
||||
|
<record id="skill_details_rule_company" model="ir.rule"> |
||||
|
<field name="name">Skill Multi-Company</field> |
||||
|
<field name="model_id" ref="model_skill_details"/> |
||||
|
<field name="domain_force"> |
||||
|
['|',('company_id','=',False),('company_id', 'in', company_ids)] |
||||
|
</field> |
||||
|
</record> |
||||
|
<record id="workers_details_rule_company" model="ir.rule"> |
||||
|
<field name="name">Workers Details Multi-Company</field> |
||||
|
<field name="model_id" ref="model_workers_details"/> |
||||
|
<field name="domain_force"> |
||||
|
['|',('company_id','=',False),('company_id', 'in', company_ids)] |
||||
|
</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |
@ -0,0 +1,10 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<!-- Multi-company record filtration and security group--> |
||||
|
<data noupdate="1"> |
||||
|
<record id="manpower_supply_management_manager" model="res.groups"> |
||||
|
<field name="name">Manage Manpower Supply Management</field> |
||||
|
<field name="category_id" ref="base.module_category_hidden"/> |
||||
|
</record> |
||||
|
</data> |
||||
|
</odoo> |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 310 B |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 576 B |
After Width: | Height: | Size: 733 B |
After Width: | Height: | Size: 911 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 673 B |
After Width: | Height: | Size: 878 B |
After Width: | Height: | Size: 653 B |
After Width: | Height: | Size: 905 B |
After Width: | Height: | Size: 839 B |
After Width: | Height: | Size: 427 B |
After Width: | Height: | Size: 627 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 988 B |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 4.4 KiB |
After Width: | Height: | Size: 589 B |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 967 B |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 5.0 KiB |
After Width: | Height: | Size: 93 KiB |
After Width: | Height: | Size: 1006 KiB |
After Width: | Height: | Size: 96 KiB |
After Width: | Height: | Size: 95 KiB |
After Width: | Height: | Size: 141 KiB |
After Width: | Height: | Size: 155 KiB |
After Width: | Height: | Size: 171 KiB |
After Width: | Height: | Size: 179 KiB |
After Width: | Height: | Size: 506 KiB |
After Width: | Height: | Size: 76 KiB |
After Width: | Height: | Size: 249 KiB |
After Width: | Height: | Size: 258 KiB |
After Width: | Height: | Size: 269 KiB |
After Width: | Height: | Size: 79 KiB |
After Width: | Height: | Size: 182 KiB |
After Width: | Height: | Size: 149 KiB |
After Width: | Height: | Size: 131 KiB |
After Width: | Height: | Size: 126 KiB |
After Width: | Height: | Size: 126 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 64 KiB |
After Width: | Height: | Size: 208 KiB |
After Width: | Height: | Size: 208 KiB |
After Width: | Height: | Size: 184 KiB |
After Width: | Height: | Size: 121 KiB |
After Width: | Height: | Size: 82 KiB |
After Width: | Height: | Size: 16 KiB |
@ -0,0 +1,732 @@ |
|||||
|
<div style="background-color: #714B67; height: 810px; width: 100%; padding: 15px; position: relative;"> |
||||
|
<!-- TITLE BAR --> |
||||
|
<div class="d-flex align-items-center justify-content-between" |
||||
|
style="border-bottom: 1px solid #875A7B; padding: 15px; display: flex; justify-content: space-between; align-items: center;"> |
||||
|
<img src="assets/misc/cybrosys-logo.png" width="42" height="42" |
||||
|
style="width: 42px; height: 42px;"/> |
||||
|
<div> |
||||
|
<div style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" |
||||
|
class="mr-2"> |
||||
|
<i class="fa fa-check mr-1"></i>Community |
||||
|
</div> |
||||
|
<div style="color: #875A7B; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" |
||||
|
class="mr-2"> |
||||
|
<i class="fa fa-check mr-1"></i>Enterprise |
||||
|
</div> |
||||
|
<div style="color: #017E84; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;" |
||||
|
class="mr-2"> |
||||
|
<i class="fa fa-check mr-1"></i>Odoo.sh |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- END OF TITLE BAR --> |
||||
|
<div class="container"> |
||||
|
<div class="row"> |
||||
|
<div class="col-sm-12 col-md-12 col-lg-12"> |
||||
|
<!-- APP HERO --> |
||||
|
<h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;"> |
||||
|
Manpower Supply Management</h1> |
||||
|
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;"> |
||||
|
Manage Contract |
||||
|
Creation in a Manpower Supply Company</p> |
||||
|
<img src="assets/screenshots/hero.gif" class="img-responsive" |
||||
|
style="width: 100%; margin-left: auto; margin-right: auto;"/> |
||||
|
<!-- END OF APP HERO --> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
|
||||
|
</div> |
||||
|
|
||||
|
<!-- NAVIGATION SECTION --> |
||||
|
<div class="d-flex align-items-center" |
||||
|
style="border-bottom: 2px solid #714B67; 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: #714B67; font-size: 24px; font-weight: 500; display: block;">Overview</span> |
||||
|
<span style="color: #714B67; 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: #714B67; font-size: 24px; font-weight: 500; display: block;">Features</span> |
||||
|
<span style="color: #714B67; 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: #714B67; font-size: 24px; font-weight: 500; display: block;">Screenshots</span> |
||||
|
<span style="color: #714B67; 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 #714B67; 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"> |
||||
|
This module helps to manage contract creation in a manpower supply |
||||
|
company |
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- END OF OVERVIEW SECTION --> |
||||
|
|
||||
|
<!-- FEATURES SECTION --> |
||||
|
<div class="d-flex align-items-center" |
||||
|
style="border-bottom: 2px solid #714B67; 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-center" |
||||
|
style="margin-top: 30px; margin-bottom: 30px"> |
||||
|
<img src="assets/misc/check-box.png" class="mr-2"/> |
||||
|
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Labour Supply Contract Creation</span> |
||||
|
</div> |
||||
|
<div class="d-flex align-items-center" |
||||
|
style="margin-top: 30px; margin-bottom: 30px"> |
||||
|
<img src="assets/misc/check-box.png" class="mr-2"/> |
||||
|
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Workers Details</span> |
||||
|
</div> |
||||
|
<div class="d-flex align-items-center" |
||||
|
style="margin-top: 30px; margin-bottom: 30px"> |
||||
|
<img src="assets/misc/check-box.png" class="mr-2"/> |
||||
|
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Creation of Report in PDF</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-sm-12 col-md-6"> |
||||
|
|
||||
|
<div class="d-flex align-items-center" |
||||
|
style="margin-top: 30px; margin-bottom: 30px"> |
||||
|
<img src="assets/misc/check-box.png" class="mr-2"/> |
||||
|
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Available in Odoo 16.0 |
||||
|
Community and Enterprise.</span> |
||||
|
</div> |
||||
|
|
||||
|
<div class="d-flex align-items-center" |
||||
|
style="margin-top: 30px; margin-bottom: 30px"> |
||||
|
<img src="assets/misc/check-box.png" class="mr-2"/> |
||||
|
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Search Labour on the Basis of Skill</span> |
||||
|
</div> |
||||
|
|
||||
|
<div class="d-flex align-items-center" |
||||
|
style="margin-top: 30px; margin-bottom: 30px"> |
||||
|
<img src="assets/misc/check-box.png" class="mr-2"/> |
||||
|
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Attractive Dashboard</span> |
||||
|
</div> |
||||
|
<div class="d-flex align-items-center" |
||||
|
style="margin-top: 30px; margin-bottom: 30px"> |
||||
|
<img src="assets/misc/check-box.png" class="mr-2"/> |
||||
|
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Website Form for Online Application</span> |
||||
|
</div> |
||||
|
<div class="d-flex align-items-center" |
||||
|
style="margin-top: 30px; margin-bottom: 30px"> |
||||
|
<img src="assets/misc/check-box.png" class="mr-2"/> |
||||
|
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
||||
|
Customer Portal View</span> |
||||
|
</div> |
||||
|
|
||||
|
</div> |
||||
|
</div> |
||||
|
<!-- END OF FEATURES SECTION --> |
||||
|
|
||||
|
<!-- SCREENSHOTS SECTION --> |
||||
|
<div class="d-flex align-items-center" |
||||
|
style="border-bottom: 2px solid #714B67; 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;"> |
||||
|
User Authorization |
||||
|
</h3> |
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> |
||||
|
From the Users form view, enable the option "Manage Manpower Supply Management". </p> |
||||
|
<img src="assets/screenshots/settings.png" |
||||
|
class="img-thumbnail"><br/> |
||||
|
<br/><br/> |
||||
|
</div> |
||||
|
<div style="display: block; margin: 30px auto;"> |
||||
|
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
||||
|
From Dashboard menu, User can view |
||||
|
</h3> |
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> |
||||
|
Bar Graph ,Table,pallet views which shows the currently ongoing |
||||
|
contracts,total invoiced amount,expected |
||||
|
amount,and contract and amount in graph and in table shows |
||||
|
currently available workers and skills |
||||
|
available. </p> |
||||
|
<img src="assets/screenshots/dashboard_1.png" class="img-thumbnail"> |
||||
|
<br/> |
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> |
||||
|
|
||||
|
Line chart showing the contract on the basis of state. </p> |
||||
|
<img src="assets/screenshots/dashboard_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;"> |
||||
|
Labour Supply Contract Creation |
||||
|
</h3> |
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> |
||||
|
On "Labour Supply" menu we can generate contract by giving details such as Skill required, Number of workers needed etc.</p> |
||||
|
<img src="assets/screenshots/labour_supply_1.png" |
||||
|
class="img-thumbnail"> |
||||
|
<br/> |
||||
|
<br/> |
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> |
||||
|
After Fetch, will add available Worker's on the basis of given Skills</p> |
||||
|
<img src="assets/screenshots/labour_supply_2.png" |
||||
|
class="img-thumbnail"> |
||||
|
<br/><br/> |
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> |
||||
|
Total Amount is calculated on the basis of Rate of Worker , From |
||||
|
Date and To Date</p> |
||||
|
<img src="assets/screenshots/labour_supply_3.png" |
||||
|
class="img-thumbnail"> <br/><br/> |
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> |
||||
|
With the "CREATE INVOICE" button, we can generate an Invoice for |
||||
|
the Contract, and a smart button will be accessible to view the |
||||
|
created Invoice.</p> |
||||
|
<img src="assets/screenshots/labour_supply_4_4_1.png" |
||||
|
class="img-thumbnail"><br/><br/> |
||||
|
<img src="assets/screenshots/labour_supply_4_4.png" |
||||
|
class="img-thumbnail"><br/><br/> |
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> |
||||
|
Automatically the state change to Expired on the basis of To |
||||
|
date of the Contract.</p> |
||||
|
<img src="assets/screenshots/expire_1.png" |
||||
|
class="img-thumbnail"><br/><br/> |
||||
|
<img src="assets/screenshots/expire_2.png" |
||||
|
class="img-thumbnail"><br/><br/> |
||||
|
|
||||
|
</div> |
||||
|
<div style="display: block; margin: 30px auto;"> |
||||
|
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
||||
|
Creation of Report in PDF |
||||
|
</h3> |
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> |
||||
|
Wizard to print report with filters on the basis of |
||||
|
customer </p> |
||||
|
<img src="assets/screenshots/report_1.png" class="img-thumbnail"> |
||||
|
<br/><br/> |
||||
|
<img src="assets/screenshots/report_4.png" class="img-thumbnail"> |
||||
|
<br/><br/> |
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> |
||||
|
Wizard to print report with filters on the basis of state </p> |
||||
|
<img src="assets/screenshots/report_2.png" |
||||
|
class="img-thumbnail"><br/> |
||||
|
<img src="assets/screenshots/report_3.png" class="img-thumbnail"> |
||||
|
<br/><br/> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div style="display: block; margin: 30px auto;"> |
||||
|
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
||||
|
Workers Details |
||||
|
</h3> |
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> |
||||
|
From Configuration --> Workers, we can create and manage |
||||
|
Workers </p> |
||||
|
<img src="assets/screenshots/worker_1.png" class="img-thumbnail"> |
||||
|
<br/><br/> |
||||
|
</div> |
||||
|
<div style="display: block; margin: 30px auto;"> |
||||
|
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
||||
|
Online Application Form |
||||
|
</h3> |
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> |
||||
|
Customer can fill the requirment automatically a request will be |
||||
|
created in back end </p> |
||||
|
<img src="assets/screenshots/website_1.png" class="img-thumbnail"><br/> |
||||
|
<img src="assets/screenshots/website_2.png" class="img-thumbnail"> |
||||
|
<br/><br/> |
||||
|
</div> |
||||
|
<div style="display: block; margin: 30px auto;"> |
||||
|
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> |
||||
|
Portal View for Customer |
||||
|
</h3> |
||||
|
<p style="font-weight: 400; font-family: 'Montserrat', sans-serif; font-size: 14px;"> |
||||
|
Customer can see their contract in portal </p> |
||||
|
<img src="assets/screenshots/portal_1.png" class="img-thumbnail"><br/> |
||||
|
<img src="assets/screenshots/portal_2.png" class="img-thumbnail"><br/> |
||||
|
<img src="assets/screenshots/portal_3.png" class="img-thumbnail"> |
||||
|
<br/><br/> |
||||
|
</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/16.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/16.0/hr_employee_transfer/" |
||||
|
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/branch_transfer_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/16.0/ent_employee_documents_expiry/" |
||||
|
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/document_expiry_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/16.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 #714B67; 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 OUR SERVICES --> |
||||
|
|
||||
|
<!-- OUR INDUSTRIES --> |
||||
|
<div class="d-flex align-items-center" |
||||
|
style="border-bottom: 2px solid #714B67; 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 & 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 OUR INDUSTRIES --> |
||||
|
|
||||
|
<!-- SUPPORT --> |
||||
|
<div class="d-flex align-items-center" |
||||
|
style="border-bottom: 2px solid #714B67; 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 d-flex justify-content-center align-items-center" |
||||
|
style="background-color: #714B67; 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: #714B67;"> |
||||
|
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 d-flex justify-content-center align-items-center" |
||||
|
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: #714B67;"> |
||||
|
+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 --> |
@ -0,0 +1,38 @@ |
|||||
|
p, span, a, ul, li, button { |
||||
|
font-size: inherit; |
||||
|
font-weight: inherit; |
||||
|
line-height: inherit; |
||||
|
} |
||||
|
|
||||
|
strong { |
||||
|
font-weight: 600; |
||||
|
} |
||||
|
|
||||
|
h1, h2, h3, h4, h5, h6 { |
||||
|
line-height: 1.5em; |
||||
|
font-weight: 300; |
||||
|
} |
||||
|
|
||||
|
strong { |
||||
|
font-weight: 400; |
||||
|
} |
||||
|
|
||||
|
.sub_title { |
||||
|
font-size: 14px; |
||||
|
} |
||||
|
|
||||
|
.sub_title div span { |
||||
|
font-weight: 600; |
||||
|
} |
||||
|
|
||||
|
.chart #canvas_graph { |
||||
|
height: 400px !important; |
||||
|
} |
||||
|
|
||||
|
.highcharts-background { |
||||
|
fill: none; |
||||
|
} |
||||
|
|
||||
|
html .o_web_client > .o_action_manager { |
||||
|
overflow:scroll; |
||||
|
} |
@ -0,0 +1,169 @@ |
|||||
|
|
||||
|
|
||||
|
.gauge { |
||||
|
position: relative; |
||||
|
} |
||||
|
|
||||
|
.gauge__container { |
||||
|
margin: 0; |
||||
|
padding: 0; |
||||
|
position: absolute; |
||||
|
left: 50%; |
||||
|
overflow: hidden; |
||||
|
text-align: center; |
||||
|
-webkit-transform: translateX(-50%); |
||||
|
-moz-transform: translateX(-50%); |
||||
|
-ms-transform: translateX(-50%); |
||||
|
-o-transform: translateX(-50%); |
||||
|
transform: translateX(-50%); |
||||
|
} |
||||
|
|
||||
|
.gauge__background { |
||||
|
z-index: 0; |
||||
|
position: absolute; |
||||
|
background-color: #d8f0de; |
||||
|
top: 0; |
||||
|
border-radius: 300px 300px 0 0; |
||||
|
} |
||||
|
|
||||
|
.gauge__data { |
||||
|
z-index: 1; |
||||
|
position: absolute; |
||||
|
background-color: #00c29d; |
||||
|
margin-left: auto; |
||||
|
margin-right: auto; |
||||
|
border-radius: 300px 300px 0 0; |
||||
|
-webkit-transform-origin: center bottom; |
||||
|
-moz-transform-origin: center bottom; |
||||
|
-ms-transform-origin: center bottom; |
||||
|
-o-transform-origin: center bottom; |
||||
|
transform-origin: center bottom; |
||||
|
} |
||||
|
|
||||
|
.gauge__center { |
||||
|
z-index: 2; |
||||
|
position: absolute; |
||||
|
background-color: #f9f9f9; |
||||
|
margin-right: auto; |
||||
|
border-radius: 300px 300px 0 0; |
||||
|
} |
||||
|
|
||||
|
.gauge__marker { |
||||
|
z-index: 3; |
||||
|
background-color: #fff; |
||||
|
position: absolute; |
||||
|
width: 1px; |
||||
|
} |
||||
|
|
||||
|
.gauge__needle { |
||||
|
z-index: 4; |
||||
|
background-color: #21242c; |
||||
|
height: 3px; |
||||
|
position: absolute; |
||||
|
-webkit-transform-origin: left center; |
||||
|
-moz-transform-origin: left center; |
||||
|
-ms-transform-origin: left center; |
||||
|
-o-transform-origin: left center; |
||||
|
transform-origin: left center; |
||||
|
} |
||||
|
|
||||
|
.gauge__labels { |
||||
|
display: table; |
||||
|
margin: 0 auto; |
||||
|
position: relative; |
||||
|
} |
||||
|
|
||||
|
.gauge__label--low { |
||||
|
display: table-cell; |
||||
|
text-align: center; |
||||
|
color: #00c29d; |
||||
|
} |
||||
|
|
||||
|
.gauge__label--spacer { |
||||
|
display: table-cell; |
||||
|
} |
||||
|
|
||||
|
.gauge__label--high { |
||||
|
display: table-cell; |
||||
|
text-align: center; |
||||
|
color: #979f99; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* Now define the rules that depend on the size of |
||||
|
* the gauge. We start with sizing for a small mobile |
||||
|
* device. |
||||
|
*/ |
||||
|
|
||||
|
.gauge { height: calc(120px + 3em); } |
||||
|
.gauge__container { width: 240px; height: 120px; } |
||||
|
.gauge__marker { height: 120px; left: 119.5px; } |
||||
|
.gauge__background { width: 240px; height: 120px; } |
||||
|
.gauge__center { width: 144px; height: 72px; top: 48px; margin-left: 48px; } |
||||
|
.gauge__data { width: 240px; height: 120px; } |
||||
|
.gauge__needle { left: 120px; top: 117px; width: 120px; } |
||||
|
.gauge__labels { top: 120px; width: 240px; } |
||||
|
.gauge__label--low { width: 48px; } |
||||
|
.gauge__label--spacer { width: 144px; } |
||||
|
.gauge__label--high { width: 48px; } |
||||
|
|
||||
|
/* |
||||
|
* Increase the gauge size slightly on larger viewports. |
||||
|
*/ |
||||
|
|
||||
|
@media only screen and (min-width: 400px) { |
||||
|
.gauge { height: calc(150px + 3em); } |
||||
|
.gauge__container { width: 300px; height: 150px; } |
||||
|
.gauge__marker { height: 150px; left: 149.5px; } |
||||
|
.gauge__background { width: 300px; height: 150px; } |
||||
|
.gauge__center { width: 180px; height: 90px; top: 60px; margin-left: 60px; } |
||||
|
.gauge__data { width: 300px; height: 150px; } |
||||
|
.gauge__needle { left: 150px; top: 147px; width: 150px; } |
||||
|
.gauge__labels { top: 160px; width: 300px; font-size: 20px;} |
||||
|
.gauge__label--low { width: 60px; } |
||||
|
.gauge__label--spacer { width: 180px; } |
||||
|
.gauge__label--high { width: 60px; } |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* As an option, the `gauge--liveupdate` class can be added |
||||
|
* to the main gauge element. When this class is present, |
||||
|
* we add a transition that animates any changes to the gauge |
||||
|
* value. Currently, the app does not use this option because |
||||
|
* all the inputs that can change gauge values are present |
||||
|
* on tab panels that are different from the gauge itself. |
||||
|
* Therefore, users won't be able to see any gauge changes |
||||
|
* when they make input changes. The code is available, though, |
||||
|
* should this change. |
||||
|
*/ |
||||
|
|
||||
|
.gauge--liveupdate .gauge__data, |
||||
|
.gauge--liveupdate .gauge__needle { |
||||
|
-webkit-transition: all 1s ease-in-out; |
||||
|
-moz-transition: all 1s ease-in-out; |
||||
|
-ms-transition: all 1s ease-in-out; |
||||
|
-o-transition: all 1s ease-in-out; |
||||
|
transition: all 1s ease-in-out; |
||||
|
} |
||||
|
|
||||
|
/* |
||||
|
* For a given gauge value, x, ranging from 0.0 to 1.0, set |
||||
|
* the `transform: rotate()` property according to the |
||||
|
* following equation: `-0.5 + 0.5x turns` The default |
||||
|
* properties below represent an x value of 0. |
||||
|
*/ |
||||
|
|
||||
|
.gauge__data { |
||||
|
-webkit-transform: rotate(-.50turn); |
||||
|
-moz-transform: rotate(-.50turn); |
||||
|
-ms-transform: rotate(-.50turn); |
||||
|
-o-transform: rotate(-.50turn); |
||||
|
transform: rotate(-.50turn); |
||||
|
} |
||||
|
.gauge__needle { |
||||
|
-webkit-transform: rotate(-.50turn); |
||||
|
-moz-transform: rotate(-.50turn); |
||||
|
-ms-transform: rotate(-.50turn); |
||||
|
-o-transform: rotate(-.50turn); |
||||
|
transform: rotate(-.50turn); |
||||
|
} |
@ -0,0 +1,57 @@ |
|||||
|
.head{ |
||||
|
margin-top:25px; |
||||
|
margin-left:20px; |
||||
|
} |
||||
|
.image{ |
||||
|
background-image:url("/manpower_supply_management/static/src/img/worker.jpg"); |
||||
|
background-size:cover; |
||||
|
height:300px; |
||||
|
width:600px; |
||||
|
margin-left:-20px; |
||||
|
} |
||||
|
.image_next{ |
||||
|
background-image:url("/manpower_supply_management/static/src/img/jobs.jpg"); |
||||
|
background-size:cover; |
||||
|
height:300px; |
||||
|
width:600px; |
||||
|
margin-left:-20px; |
||||
|
} |
||||
|
.body{ |
||||
|
margin-top:-326px; |
||||
|
margin-left:875px; |
||||
|
margin-bottom:10px; |
||||
|
} |
||||
|
h1{ |
||||
|
color:rgb(102, 113, 154); |
||||
|
font-family:"Lucida consol","Courier Nem",monospace; |
||||
|
} |
||||
|
h3{ |
||||
|
color:rgb(102, 113, 154); |
||||
|
font-family:"Lucida consol","Courier Nem",monospace; |
||||
|
} |
||||
|
.link-style{ |
||||
|
width:500px; |
||||
|
height:50px; |
||||
|
border-color:#66719a; |
||||
|
} |
||||
|
.button{ |
||||
|
width:500px; |
||||
|
height:50px; |
||||
|
background-color:#66719a; |
||||
|
color:white; |
||||
|
border-color:#ed8115; |
||||
|
} |
||||
|
.button_close{ |
||||
|
width:500px; |
||||
|
height:50px; |
||||
|
background-color:red; |
||||
|
color:white; |
||||
|
border-color:red; |
||||
|
} |
||||
|
.button_back{ |
||||
|
width:200px; |
||||
|
height:30px; |
||||
|
background-color:green; |
||||
|
color:black; |
||||
|
border-color:black; |
||||
|
} |
After Width: | Height: | Size: 1.1 MiB |
After Width: | Height: | Size: 1.5 MiB |
@ -0,0 +1,459 @@ |
|||||
|
/** @odoo-module */ |
||||
|
import {loadBundle} from "@web/core/assets"; |
||||
|
|
||||
|
var AbstractAction = require('web.AbstractAction'); |
||||
|
var core = require('web.core'); |
||||
|
var QWeb = core.qweb; |
||||
|
var rpc = require('web.rpc'); |
||||
|
var CustomDashBoard = AbstractAction.extend({ |
||||
|
template: 'CustomDashBoard', |
||||
|
events: { |
||||
|
'click select[name="period"]': 'onclick_period_selection', |
||||
|
}, |
||||
|
|
||||
|
|
||||
|
init: function(parent, context) { |
||||
|
this._super(parent, context); |
||||
|
this.dashboards_templates = ['DashboardLabourSupply']; |
||||
|
this.labour_supply_details = []; |
||||
|
}, |
||||
|
willStart: function() { |
||||
|
var self = this; |
||||
|
return $.when(loadBundle(this), this._super()).then(function() { |
||||
|
return self.fetch_data(); |
||||
|
}); |
||||
|
}, |
||||
|
start: function() { |
||||
|
var self = this; |
||||
|
this.set("title", 'Dashboard'); |
||||
|
return this._super().then(function() { |
||||
|
self.render_dashboards(); |
||||
|
self.render_graphs(); |
||||
|
}); |
||||
|
}, |
||||
|
render_dashboards: function() { |
||||
|
var self = this; |
||||
|
_.each(this.dashboards_templates, function(template) { |
||||
|
self.$('.o_pj_dashboard').append(QWeb.render(template, { |
||||
|
widget: self |
||||
|
})); |
||||
|
}); |
||||
|
}, |
||||
|
render_graphs: function() { |
||||
|
var self = this; |
||||
|
self.render_get_workers_count(); |
||||
|
self.render_get_contract_count_state(); |
||||
|
self.render_get_contract_count_customer(); |
||||
|
self.render_get_contract_amount(); |
||||
|
}, |
||||
|
fetch_data: function() { |
||||
|
var self = this; |
||||
|
var def1 = this._rpc({ |
||||
|
// function to get labour contract details for dashboard
|
||||
|
model: 'workers.details', |
||||
|
method: 'get_labour_supply_details' |
||||
|
}).then(function(result) { |
||||
|
self.labour_supply_details = result['ongoing_contract'] |
||||
|
}); |
||||
|
var def2 = this._rpc({ |
||||
|
// function to get top costumer for dashboard
|
||||
|
model: 'workers.details', |
||||
|
method: 'get_top_customer' |
||||
|
}).then(function(result) { |
||||
|
self.customers = result['customer'] |
||||
|
}); |
||||
|
var def3 = this._rpc({ |
||||
|
// function to get total invoice amount for dashboard
|
||||
|
model: 'workers.details', |
||||
|
method: 'get_total_invoiced_amount' |
||||
|
}).then(function(result) { |
||||
|
self.total_invoiced_amount = result['invoiced_amount'] |
||||
|
}); |
||||
|
var def4 = this._rpc({ |
||||
|
// function to get skills available for dashboard
|
||||
|
model: 'workers.details', |
||||
|
method: 'get_skills_available' |
||||
|
}).then(function(result) { |
||||
|
self.skills = result['skill'] |
||||
|
}); |
||||
|
var def5 = this._rpc({ |
||||
|
// function to get total expected amount for dashboard
|
||||
|
model: 'workers.details', |
||||
|
method: 'get_expected_amount' |
||||
|
}).then(function(result) { |
||||
|
self.expected_amount = result['expected_amount'] |
||||
|
}); |
||||
|
var def6 = this._rpc({ |
||||
|
// function to get workers available for dashboard
|
||||
|
model: 'workers.details', |
||||
|
method: 'get_workers_available' |
||||
|
}).then(function(result) { |
||||
|
self.workers = result['workers'] |
||||
|
}); |
||||
|
return $.when(def1, def2, def3, def4, def5, def6); |
||||
|
}, |
||||
|
render_get_workers_count: function() { |
||||
|
// function to get workers count for dashboard
|
||||
|
var self = this |
||||
|
var ctx = self.$(".worker_availability"); |
||||
|
this._rpc({ |
||||
|
model: "workers.details", |
||||
|
method: "get_workers_count", |
||||
|
}).then(function(arrays) { |
||||
|
var data = { |
||||
|
labels: arrays.state, |
||||
|
datasets: [{ |
||||
|
label: "Workers", |
||||
|
data: arrays.count, |
||||
|
backgroundColor: [ |
||||
|
"#665191", |
||||
|
"#ff7c43", |
||||
|
"#ffa600", |
||||
|
"#a05195", |
||||
|
"#2f4b7c", |
||||
|
"#f95d6a", |
||||
|
"#6d5c16", |
||||
|
"#003f5c", |
||||
|
"#d45087" |
||||
|
], |
||||
|
borderColor: [ |
||||
|
"#003f5c", |
||||
|
"#2f4b7c", |
||||
|
"#f95d6a", |
||||
|
"#665191", |
||||
|
"#d45087", |
||||
|
"#ff7c43", |
||||
|
"#ffa600", |
||||
|
"#a05195", |
||||
|
"#6d5c16" |
||||
|
], |
||||
|
borderWidth: 1 |
||||
|
}, ] |
||||
|
}; |
||||
|
|
||||
|
//options
|
||||
|
var options = { |
||||
|
responsive: true, |
||||
|
title: false, |
||||
|
legend: { |
||||
|
display: true, |
||||
|
position: "right", |
||||
|
labels: { |
||||
|
fontColor: "#333", |
||||
|
fontSize: 16 |
||||
|
} |
||||
|
}, |
||||
|
scales: { |
||||
|
yAxes: [{ |
||||
|
gridLines: { |
||||
|
color: "rgba(1, 0, 0, 0)", |
||||
|
display: false, |
||||
|
}, |
||||
|
ticks: { |
||||
|
min: 0, |
||||
|
display: false, |
||||
|
} |
||||
|
}] |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
//create Chart class object
|
||||
|
var chart = new Chart(ctx, { |
||||
|
type: "doughnut", |
||||
|
data: data, |
||||
|
options: options |
||||
|
}); |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
render_get_contract_count_state: function() { |
||||
|
// function to get labour supply count for dashboard on the basis of state
|
||||
|
|
||||
|
var self = this |
||||
|
var ctx = self.$(".contract"); |
||||
|
this._rpc({ |
||||
|
model: "workers.details", |
||||
|
method: "get_contract_count_state", |
||||
|
}).then(function(arrays) { |
||||
|
var data = { |
||||
|
labels: arrays.state, |
||||
|
datasets: [{ |
||||
|
label: "Hide", |
||||
|
data: arrays.count, |
||||
|
backgroundColor: '#003f5c', |
||||
|
borderColor: '#003f5c', |
||||
|
barPercentage: 0.5, |
||||
|
barThickness: 6, |
||||
|
maxBarThickness: 8, |
||||
|
minBarLength: 0, |
||||
|
borderWidth: 1, // Specify bar border width
|
||||
|
type: 'line', // Set this data to a line chart
|
||||
|
fill: false, |
||||
|
borderWidth: 1 |
||||
|
}, ] |
||||
|
}; |
||||
|
|
||||
|
//options
|
||||
|
var options = { |
||||
|
responsive: true, |
||||
|
title: false, |
||||
|
legend: { |
||||
|
display: true, |
||||
|
position: "right", |
||||
|
labels: { |
||||
|
fontColor: "#333", |
||||
|
fontSize: 16 |
||||
|
} |
||||
|
}, |
||||
|
scales: { |
||||
|
yAxes: [{ |
||||
|
gridLines: { |
||||
|
color: "rgba(1, 0, 0, 0)", |
||||
|
display: true, |
||||
|
}, |
||||
|
ticks: { |
||||
|
min: 0, |
||||
|
display: true, |
||||
|
} |
||||
|
}] |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
//create Chart class object
|
||||
|
var chart = new Chart(ctx, { |
||||
|
type: "line", |
||||
|
data: data, |
||||
|
options: options |
||||
|
}); |
||||
|
}); |
||||
|
}, |
||||
|
render_get_contract_count_customer: function() { |
||||
|
// function to get labour supply count for dashboard on the basis of customer
|
||||
|
|
||||
|
var self = this |
||||
|
var ctx = self.$(".customer_contract"); |
||||
|
this._rpc({ |
||||
|
model: "workers.details", |
||||
|
method: "get_contract_count_customer", |
||||
|
}).then(function(arrays) { |
||||
|
var data = { |
||||
|
labels: arrays.name, |
||||
|
datasets: [{ |
||||
|
label: "Hide", |
||||
|
data: arrays.count, |
||||
|
backgroundColor: [ |
||||
|
"#665191", |
||||
|
"#ff7c43", |
||||
|
"#ffa600", |
||||
|
"#a05195", |
||||
|
"#2f4b7c", |
||||
|
"#f95d6a", |
||||
|
"#6d5c16", |
||||
|
"#003f5c", |
||||
|
"#d45087" |
||||
|
], |
||||
|
borderColor: [ |
||||
|
"#003f5c", |
||||
|
"#2f4b7c", |
||||
|
"#f95d6a", |
||||
|
"#665191", |
||||
|
"#d45087", |
||||
|
"#ff7c43", |
||||
|
"#ffa600", |
||||
|
"#a05195", |
||||
|
"#6d5c16" |
||||
|
], |
||||
|
borderWidth: 1 |
||||
|
}, ] |
||||
|
}; |
||||
|
|
||||
|
//options
|
||||
|
var options = { |
||||
|
responsive: true, |
||||
|
title: false, |
||||
|
legend: { |
||||
|
display: true, |
||||
|
position: "right", |
||||
|
labels: { |
||||
|
fontColor: "#333", |
||||
|
fontSize: 16 |
||||
|
} |
||||
|
}, |
||||
|
scales: { |
||||
|
yAxes: [{ |
||||
|
gridLines: { |
||||
|
color: "rgba(1, 0, 0, 0)", |
||||
|
display: true, |
||||
|
}, |
||||
|
ticks: { |
||||
|
min: 0, |
||||
|
display: true, |
||||
|
} |
||||
|
}] |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
//create Chart class object
|
||||
|
var chart = new Chart(ctx, { |
||||
|
type: "bar", |
||||
|
data: data, |
||||
|
options: options |
||||
|
}); |
||||
|
}); |
||||
|
}, |
||||
|
render_get_contract_amount: function() { |
||||
|
// function to get labour supply amount for dashboard on the basis of state
|
||||
|
|
||||
|
var self = this |
||||
|
var ctx = self.$(".labour_contract"); |
||||
|
this._rpc({ |
||||
|
model: "workers.details", |
||||
|
method: "get_contract_amount", |
||||
|
}).then(function(arrays) { |
||||
|
var data = { |
||||
|
labels: arrays.sequence, |
||||
|
datasets: [{ |
||||
|
label: "Hide", |
||||
|
data: arrays.amount, |
||||
|
backgroundColor: [ |
||||
|
"#665191", |
||||
|
"#ff7c43", |
||||
|
"#ffa600", |
||||
|
"#a05195", |
||||
|
"#2f4b7c", |
||||
|
"#f95d6a", |
||||
|
"#6d5c16", |
||||
|
"#003f5c", |
||||
|
"#d45087" |
||||
|
], |
||||
|
borderColor: [ |
||||
|
"#003f5c", |
||||
|
"#2f4b7c", |
||||
|
"#f95d6a", |
||||
|
"#665191", |
||||
|
"#d45087", |
||||
|
"#ff7c43", |
||||
|
"#ffa600", |
||||
|
"#a05195", |
||||
|
"#6d5c16" |
||||
|
], |
||||
|
borderWidth: 1 |
||||
|
}, ] |
||||
|
}; |
||||
|
|
||||
|
//options
|
||||
|
var options = { |
||||
|
responsive: true, |
||||
|
title: false, |
||||
|
legend: { |
||||
|
display: true, |
||||
|
position: "right", |
||||
|
labels: { |
||||
|
fontColor: "#333", |
||||
|
fontSize: 16 |
||||
|
} |
||||
|
}, |
||||
|
scales: { |
||||
|
yAxes: [{ |
||||
|
gridLines: { |
||||
|
color: "rgba(1, 0, 0, 0)", |
||||
|
display: true, |
||||
|
}, |
||||
|
ticks: { |
||||
|
min: 0, |
||||
|
display: true, |
||||
|
} |
||||
|
}] |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
//create Chart class object
|
||||
|
var chart = new Chart(ctx, { |
||||
|
type: "bar", |
||||
|
data: data, |
||||
|
options: options |
||||
|
}); |
||||
|
}); |
||||
|
}, |
||||
|
onclick_period_selection: function(events) { |
||||
|
// function to get labour supply amount for dashboard on the basis of filter
|
||||
|
|
||||
|
var option = $(events.target).val(); |
||||
|
var self = this; |
||||
|
this._rpc({ |
||||
|
model: "workers.details", |
||||
|
method: "get_details_amount", |
||||
|
args: [option] |
||||
|
}).then(function(array) { |
||||
|
var ctx = self.$(".labour_contract"); |
||||
|
var data = { |
||||
|
labels: array.sequence, |
||||
|
datasets: [{ |
||||
|
label: "Hide", |
||||
|
data: array.amount, |
||||
|
backgroundColor: [ |
||||
|
"#665193", |
||||
|
"#ff7c43", |
||||
|
"#ffa600", |
||||
|
"#a05195", |
||||
|
"#2f4b7c", |
||||
|
"#f95d6a", |
||||
|
"#6d5c16", |
||||
|
"#003f5c", |
||||
|
"#013f5c", |
||||
|
"#d45087" |
||||
|
], |
||||
|
borderColor: [ |
||||
|
"#003f5c", |
||||
|
"#2f4b7c", |
||||
|
"#f95d6a", |
||||
|
"#665191", |
||||
|
"#d45087", |
||||
|
"#003f5c", |
||||
|
"#ff7c43", |
||||
|
"#ffa600", |
||||
|
"#a05195", |
||||
|
"#6d5c16" |
||||
|
], |
||||
|
borderWidth: 1 |
||||
|
}, ] |
||||
|
}; |
||||
|
|
||||
|
//options
|
||||
|
var options = { |
||||
|
responsive: true, |
||||
|
title: false, |
||||
|
legend: { |
||||
|
display: true, |
||||
|
position: "right", |
||||
|
labels: { |
||||
|
fontColor: "#333", |
||||
|
fontSize: 16 |
||||
|
} |
||||
|
}, |
||||
|
scales: { |
||||
|
yAxes: [{ |
||||
|
gridLines: { |
||||
|
color: "rgba(1, 0, 0, 0)", |
||||
|
display: true, |
||||
|
}, |
||||
|
ticks: { |
||||
|
min: 0, |
||||
|
display: true, |
||||
|
} |
||||
|
}] |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
//create Chart class object
|
||||
|
var chart = new Chart(ctx, { |
||||
|
type: "bar", |
||||
|
data: data, |
||||
|
options: options |
||||
|
}); |
||||
|
|
||||
|
}); |
||||
|
}, |
||||
|
}) |
||||
|
core.action_registry.add('labour_supply_dashboard', CustomDashBoard); |
||||
|
return CustomDashBoard; |
@ -0,0 +1,237 @@ |
|||||
|
:root { |
||||
|
/* Primary */ |
||||
|
--mauve: #7D7EAF; |
||||
|
--pink-dark: #BD85BA; |
||||
|
--pink: #F78EAD; |
||||
|
--peach: #FFA48E; |
||||
|
--orange: #FFCA71; |
||||
|
--gold: #CEA716; |
||||
|
--green: #1EC198; |
||||
|
--grey: #a0a0a0; |
||||
|
/* Light */ |
||||
|
--mauve-light: #e5e5ef; |
||||
|
--pink-dark-light: #f2e7f1; |
||||
|
--pink-light: #fde8ef; |
||||
|
--peach-light: #ffede8; |
||||
|
--orange-light: #fff4e3; |
||||
|
--gold-light: #faf6e8; |
||||
|
--green-light: #e9f9f5; |
||||
|
--grey-light: #e0e0e0; |
||||
|
|
||||
|
/*Lighter*/ |
||||
|
--grey-lighter: #fafafa; |
||||
|
--grey-dark-lighter: #f3f3f3; |
||||
|
} |
||||
|
|
||||
|
/* Background */ |
||||
|
.bg-mauve-light { |
||||
|
background-color: var(--mauve-light); |
||||
|
} |
||||
|
|
||||
|
.bg-pink-dark-light { |
||||
|
background-color: var(--pink-dark-light); |
||||
|
} |
||||
|
|
||||
|
.bg-pink-light { |
||||
|
background-color: var(--pink-light); |
||||
|
} |
||||
|
|
||||
|
.bg-peach-light { |
||||
|
background-color: var(--peach-light); |
||||
|
} |
||||
|
|
||||
|
.bg-orange-light { |
||||
|
background-color: var(--orange-light); |
||||
|
} |
||||
|
|
||||
|
.bg-gold-light { |
||||
|
background-color: var(--gold-light); |
||||
|
} |
||||
|
|
||||
|
.bg-green-light { |
||||
|
background-color: var(--green-light); |
||||
|
} |
||||
|
|
||||
|
/* Text */ |
||||
|
.text-mauve { |
||||
|
color: var(--mauve); |
||||
|
} |
||||
|
|
||||
|
.text-pink-dark { |
||||
|
color: var(--pink-dark); |
||||
|
} |
||||
|
|
||||
|
.text-pink { |
||||
|
color: var(--pink); |
||||
|
} |
||||
|
|
||||
|
.text-peach { |
||||
|
color: var(--peach); |
||||
|
} |
||||
|
|
||||
|
.text-orange { |
||||
|
color: var(--orange); |
||||
|
} |
||||
|
|
||||
|
.text-gold { |
||||
|
color: var(--gold); |
||||
|
} |
||||
|
|
||||
|
.text-green { |
||||
|
color: var(--green); |
||||
|
} |
||||
|
|
||||
|
/* Cards */ |
||||
|
|
||||
|
.dashboard-card { |
||||
|
border-radius: 0.3rem; |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
padding: 1.7rem 1.5rem 1.5rem 1.5rem; |
||||
|
margin: 1rem auto; |
||||
|
height: 90px; |
||||
|
} |
||||
|
|
||||
|
.dashboard-card__icon-container { |
||||
|
height: 50px; |
||||
|
width: 50px; |
||||
|
border-radius: 50%; |
||||
|
} |
||||
|
|
||||
|
.dashboard-card__icon-container i { |
||||
|
font-size: 20px; |
||||
|
} |
||||
|
|
||||
|
.dashboard-card__details { |
||||
|
margin-left: 1rem; |
||||
|
max-width: 120px; |
||||
|
} |
||||
|
|
||||
|
.dashboard-card__details h3 { |
||||
|
font-weight: 700; |
||||
|
font-size: 1.5rem; |
||||
|
} |
||||
|
|
||||
|
.dashboard-card__details h4 { |
||||
|
font-weight: 700; |
||||
|
font-size: 0.7rem; |
||||
|
color: var(--grey); |
||||
|
margin-top: -5px; |
||||
|
} |
||||
|
|
||||
|
h2.section-header { |
||||
|
font-weight: 700; |
||||
|
font-size: 1.5rem; |
||||
|
} |
||||
|
|
||||
|
.chart-container { |
||||
|
border-radius: 0.3rem; |
||||
|
padding: 1rem; |
||||
|
margin: 1rem auto; |
||||
|
} |
||||
|
|
||||
|
.chart-container.card-shadow { |
||||
|
height: 100%; |
||||
|
} |
||||
|
|
||||
|
.half_chart.chart-container.card-shadow { |
||||
|
height: 49%; |
||||
|
} |
||||
|
|
||||
|
.chart-container h2 { |
||||
|
font-weight: 700; |
||||
|
font-size: 1.125rem; |
||||
|
} |
||||
|
|
||||
|
.item-container { |
||||
|
background-color: var(--grey-lighter); |
||||
|
border-radius: 0.3rem; |
||||
|
padding: 1.2rem 1rem; |
||||
|
margin: 1rem auto; |
||||
|
} |
||||
|
|
||||
|
.item-container:hover { |
||||
|
background-color: var(--grey-dark-lighter); |
||||
|
transition: all 0.3s ease-in-out; |
||||
|
cursor: pointer; |
||||
|
} |
||||
|
|
||||
|
.count-container { |
||||
|
font-weight: 700; |
||||
|
font-size: 1.7rem; |
||||
|
background-color: var(--mauve-light); |
||||
|
color: var(--mauve); |
||||
|
height: 50px; |
||||
|
width: 50px; |
||||
|
border-radius: 50%; |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
align-items: center; |
||||
|
} |
||||
|
|
||||
|
.item-header { |
||||
|
display: flex; |
||||
|
align-items: flex-start; |
||||
|
} |
||||
|
|
||||
|
.item-title h3 { |
||||
|
font-size: 1.3rem; |
||||
|
font-weight: 700; |
||||
|
} |
||||
|
|
||||
|
.item-content ul { |
||||
|
list-style: none; |
||||
|
padding-left: 0px; |
||||
|
} |
||||
|
|
||||
|
.item-content ul>li { |
||||
|
font-size: 0.9rem; |
||||
|
color: var(--grey); |
||||
|
font-weight: 700; |
||||
|
} |
||||
|
|
||||
|
/* Misc */ |
||||
|
.card-shadow { |
||||
|
-webkit-box-shadow: 1px 3px 5px 0px rgba(222, 222, 222, 1); |
||||
|
-moz-box-shadow: 1px 3px 5px 0px rgba(222, 222, 222, 1); |
||||
|
box-shadow: 1px 3px 5px 0px rgba(222, 222, 222, 1); |
||||
|
} |
||||
|
|
||||
|
/* Table */ |
||||
|
thead { |
||||
|
background-color: #e9ecf0; |
||||
|
border-bottom: none; |
||||
|
} |
||||
|
|
||||
|
.table thead th { |
||||
|
border-bottom: none; |
||||
|
} |
||||
|
|
||||
|
.table td, |
||||
|
.table th { |
||||
|
border-top: 1px solid #eceff2; |
||||
|
} |
||||
|
|
||||
|
.crm_scroll_table { |
||||
|
max-height: 395px; |
||||
|
overflow-y: auto; |
||||
|
} |
||||
|
.recent_activity_div .crm_scroll_table { |
||||
|
max-height: 435px; |
||||
|
} |
||||
|
|
||||
|
.crm_scroll_table thead { |
||||
|
position: sticky; |
||||
|
top: 0; |
||||
|
} |
||||
|
|
||||
|
.crm_scroll_table .count-container { |
||||
|
height: 45px; |
||||
|
width: 130px; |
||||
|
border-radius: 50px; |
||||
|
margin-right: 10px; |
||||
|
} |
||||
|
|
||||
|
.crm_scroll_table .item-content ul > li { |
||||
|
font-size: 1.1rem; |
||||
|
} |
@ -0,0 +1,237 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8" ?> |
||||
|
<!-- Template for dashboard--> |
||||
|
<template> |
||||
|
<t t-name="CustomDashBoard"> |
||||
|
<div class="oh_dashboards" style="margin-top: 20px;"> |
||||
|
<div class="container-fluid o_pj_dashboard"> |
||||
|
</div> |
||||
|
</div> |
||||
|
</t> |
||||
|
<t t-name="DashboardLabourSupply"> |
||||
|
<hr/> |
||||
|
<div class="crm_dash_cards row"> |
||||
|
<div class="col-sm-12 col-md-4"> |
||||
|
<div class="dashboard-card card-shadow my_lead"> |
||||
|
<div class="dashboard-card__icon-container bg-mauve-light d-flex justify-content-center |
||||
|
align-items-center"> |
||||
|
<i class="fa fa-line-chart text-mauve"/> |
||||
|
</div> |
||||
|
<div class="dashboard-card__details"> |
||||
|
<h3> |
||||
|
<span> |
||||
|
<t t-esc="widget.labour_supply_details"/> |
||||
|
</span> |
||||
|
</h3> |
||||
|
<h4>Ongoing contract</h4> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-sm-12 col-md-4"> |
||||
|
<div class="dashboard-card card-shadow my_lead"> |
||||
|
<div class="dashboard-card__icon-container bg-mauve-light d-flex justify-content-center |
||||
|
align-items-center"> |
||||
|
<i class="fa fa-circle"/> |
||||
|
</div> |
||||
|
<div class="dashboard-card__details"> |
||||
|
<h3> |
||||
|
<span> |
||||
|
<t t-esc="widget.total_invoiced_amount"/> |
||||
|
</span> |
||||
|
</h3> |
||||
|
<h4>Invoiced amount</h4> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-sm-12 col-md-4"> |
||||
|
<div class="dashboard-card card-shadow my_lead"> |
||||
|
<div class="dashboard-card__icon-container bg-mauve-light d-flex justify-content-center |
||||
|
align-items-center"> |
||||
|
<i class="fa fa-dropbox"/> |
||||
|
</div> |
||||
|
<div class="dashboard-card__details"> |
||||
|
<h3> |
||||
|
<span> |
||||
|
<t t-esc="widget.expected_amount"/> |
||||
|
</span> |
||||
|
</h3> |
||||
|
<h4>Expected amount</h4> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-xs-12 col-sm-12 col-lg-12 col-md-12"> |
||||
|
<div class="row" style="margin:0px;"> |
||||
|
<div class="col-6 col-sm-6 helpdesk inbox_tickets"> |
||||
|
<div class="leads_month_pie_div half_chart chart-container card-shadow" |
||||
|
style="height: 528px;"> |
||||
|
<h2>Labour Contract and Amount</h2> |
||||
|
<div class="form-group col-2" id="top_product_button"> |
||||
|
<select name="period" id="filter_selection" |
||||
|
selected="selected" |
||||
|
style="border-radius: 5px;border-color: currentColor;border-width: 2px;background: lightgrey;"> |
||||
|
<option id="daily" value="daily">Daily</option> |
||||
|
<option id="daily" value="monthly">Monthly |
||||
|
</option> |
||||
|
<option id="yearly" value="yearly">Yearly |
||||
|
</option> |
||||
|
<option id="totally" value="totally">Totally |
||||
|
</option> |
||||
|
</select> |
||||
|
</div> |
||||
|
<br/> |
||||
|
<div class="graph_canvas"> |
||||
|
<canvas class="labour_contract"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-6 col-sm-3 helpdesk inbox_tickets"> |
||||
|
<div class="leads_month_pie_div half_chart chart-container card-shadow" |
||||
|
style="height: 528px;"> |
||||
|
<h2>Skills</h2> |
||||
|
<hr/> |
||||
|
<div class="text-color"> |
||||
|
<table class="table table-sm"> |
||||
|
<thead> |
||||
|
<tr> |
||||
|
<th rowspan="14">Skill</th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<tbody> |
||||
|
<t t-foreach="widget.skills" t-as="skill"> |
||||
|
<tr> |
||||
|
<td> |
||||
|
<t t-esc="skill['name']"/> |
||||
|
</td> |
||||
|
|
||||
|
</tr> |
||||
|
</t> |
||||
|
</tbody> |
||||
|
</table> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-6 col-sm-3 helpdesk inbox_tickets"> |
||||
|
<div class="leads_month_pie_div half_chart chart-container card-shadow" |
||||
|
style="height: 528px;"> |
||||
|
<h2>Available Workers</h2> |
||||
|
<hr/> |
||||
|
<div class="text-color"> |
||||
|
<table class="table table-sm"> |
||||
|
<thead> |
||||
|
<tr> |
||||
|
<th rowspan="14"> |
||||
|
<center>Workers</center> |
||||
|
</th> |
||||
|
</tr> |
||||
|
<tr> |
||||
|
<th rowspan="14"> |
||||
|
<center>Rate Per Day</center> |
||||
|
</th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<tbody> |
||||
|
<t t-foreach="widget.workers" t-as="worker"> |
||||
|
<tr> |
||||
|
<td> |
||||
|
<center> |
||||
|
<t t-esc="worker['name']"/> |
||||
|
</center> |
||||
|
</td> |
||||
|
<td> |
||||
|
<center> |
||||
|
<t t-esc="worker['rate']"/> |
||||
|
</center> |
||||
|
</td> |
||||
|
</tr> |
||||
|
</t> |
||||
|
</tbody> |
||||
|
</table> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<br/> |
||||
|
<div class="col-xs-12 col-sm-12 col-lg-12 col-md-12"> |
||||
|
<div class="row" style="margin:0px;"> |
||||
|
<div class="col-6 col-sm-6 helpdesk inbox_tickets"> |
||||
|
<div class="leads_month_pie_div half_chart chart-container card-shadow" |
||||
|
style="height: 528px;"> |
||||
|
<h2>Contracts on the Basis of State</h2> |
||||
|
<div class="graph_canvas"> |
||||
|
<canvas class="contract" width="130" height="80"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-6 col-sm-6 helpdesk inbox_tickets"> |
||||
|
<div class="leads_month_pie_div half_chart chart-container card-shadow" |
||||
|
style="height: 528px;"> |
||||
|
<h2>Contracts on the Basis of Customer</h2> |
||||
|
<hr/> |
||||
|
<div class="graph_canvas"> |
||||
|
<canvas class="customer_contract" width="130" |
||||
|
height="80"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<br/> |
||||
|
<div class="col-xs-12 col-sm-12 col-lg-12 col-md-12"> |
||||
|
<div class="row" style="margin:0px;"> |
||||
|
<div class="col-6 col-sm-6 helpdesk inbox_tickets"> |
||||
|
<div class="leads_month_pie_div half_chart chart-container card-shadow" |
||||
|
style="height: 528px;"> |
||||
|
<h2>Workers Availability</h2> |
||||
|
<hr/> |
||||
|
<div class="graph_canvas"> |
||||
|
<canvas class="worker_availability" width="130" |
||||
|
height="75"/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="col-6 col-sm-6 helpdesk inbox_tickets"> |
||||
|
<div class="leads_month_pie_div half_chart chart-container card-shadow" |
||||
|
style="height: 528px;"> |
||||
|
<h2>Top 10 Customers</h2> |
||||
|
<hr/> |
||||
|
<div class="text-color"> |
||||
|
<table class="table table-sm"> |
||||
|
<thead> |
||||
|
<tr> |
||||
|
<th rowspan="14">Customers</th> |
||||
|
</tr> |
||||
|
<tr> |
||||
|
<th rowspan="14">Number of Contracts |
||||
|
</th> |
||||
|
</tr> |
||||
|
<tr> |
||||
|
<th rowspan="14">Mail Address</th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<tbody> |
||||
|
<t t-foreach="widget.customers" |
||||
|
t-as="customer"> |
||||
|
<tr> |
||||
|
<td> |
||||
|
<t t-esc="customer['name']"/> |
||||
|
</td> |
||||
|
<td> |
||||
|
<center> |
||||
|
<t t-esc="customer['count']"/> |
||||
|
</center> |
||||
|
</td> |
||||
|
<td> |
||||
|
<t t-esc="customer['email']"/> |
||||
|
</td> |
||||
|
</tr> |
||||
|
</t> |
||||
|
</tbody> |
||||
|
</table> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</t> |
||||
|
</template> |
@ -0,0 +1,21 @@ |
|||||
|
<?xml version='1.0' encoding='utf-8'?> |
||||
|
<odoo> |
||||
|
<!-- Action and menu items--> |
||||
|
<record id="labour_on_skill_action" model="ir.actions.act_window"> |
||||
|
<field name="name">Labour on skill</field> |
||||
|
<field name="res_model">labour.on.skill</field> |
||||
|
<field name="view_mode">tree</field> |
||||
|
</record> |
||||
|
<record id="labour_on_skill_view_tree" model="ir.ui.view"> |
||||
|
<field name="name">labour.on.skill.view.tree</field> |
||||
|
<field name="model">labour.on.skill</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<tree editable="bottom"> |
||||
|
<field name="skill_id" string="Skill required"/> |
||||
|
<field name="from_date" required="True"/> |
||||
|
<field name="to_date"/> |
||||
|
<field name="number_of_labour_required" required="True"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</record> |
||||
|
</odoo> |
@ -0,0 +1,125 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<!-- Template for form of labour request --> |
||||
|
<template id="labour_on_supply_form" name="Labour Supply"> |
||||
|
<t t-call="website.layout"> |
||||
|
<div id="wrap" class="oe_structure oe_empty"> |
||||
|
<div class="container"> |
||||
|
<div> |
||||
|
<h1>Fill the Requirements</h1> |
||||
|
</div> |
||||
|
<div class="image_next"/> |
||||
|
<div class="col-md-6 body"> |
||||
|
<form action="/labour_on_supply/add" method="POST"> |
||||
|
<div> |
||||
|
<br/> |
||||
|
<input type="hidden" name="csrf_token" |
||||
|
t-att-value="request.csrf_token()"/> |
||||
|
<t t-if="alert"> |
||||
|
<div style="width: 500px;"> |
||||
|
<p class="alert alert-danger" |
||||
|
role="alert"> |
||||
|
Invalid date |
||||
|
</p> |
||||
|
</div> |
||||
|
</t> |
||||
|
<label class="col-form-label col-sm-auto s_website_form_label" |
||||
|
style="width:200px"> |
||||
|
<span class="s_website_form_label_content"> |
||||
|
Skill Required |
||||
|
</span> |
||||
|
<span class="s_website_form_mark">*</span> |
||||
|
<select name="skill" class="link-style" |
||||
|
required="1"> |
||||
|
<t t-foreach="skills" t-as="skill"> |
||||
|
<option t-att-value="skill.id"> |
||||
|
<t t-esc="skill.name"/> |
||||
|
</option> |
||||
|
</t> |
||||
|
</select> |
||||
|
</label> |
||||
|
<br/> |
||||
|
<label class="col-form-label col-sm-auto s_website_form_label" |
||||
|
style="width:200px"> |
||||
|
<span class="s_website_form_label_content"> |
||||
|
From Date |
||||
|
</span> |
||||
|
<span class="s_website_form_mark">*</span> |
||||
|
<input type="date" class="link-style" |
||||
|
name="from_date" required="True"/> |
||||
|
</label> |
||||
|
<br/> |
||||
|
<label class="col-form-label col-sm-auto s_website_form_label" |
||||
|
style="width:200px"> |
||||
|
<span class="s_website_form_label_content"> |
||||
|
To Date |
||||
|
</span> |
||||
|
<span class="s_website_form_mark">*</span> |
||||
|
<input type="date" class="link-style" |
||||
|
name="to_date" required="True"/> |
||||
|
</label> |
||||
|
<br/> |
||||
|
<label class="col-form-label col-sm-auto s_website_form_label" |
||||
|
style="width:200px"> |
||||
|
<span class="s_website_form_label_content"> |
||||
|
Required Labours |
||||
|
</span> |
||||
|
<span class="s_website_form_mark">*</span> |
||||
|
<input type="number" class="link-style" |
||||
|
name="required_number" min="0" |
||||
|
required="True"/> |
||||
|
</label> |
||||
|
<br/> |
||||
|
<label class="col-form-label col-sm-auto s_website_form_label" |
||||
|
style="width:200px;display: none;"> |
||||
|
<span class="s_website_form_label_content"> |
||||
|
Labour Supply Request Number |
||||
|
</span> |
||||
|
<span class="s_website_form_mark">*</span> |
||||
|
<select name="labour_supply" |
||||
|
class="link-style" |
||||
|
required="1"> |
||||
|
<t t-foreach="labour_supplies" |
||||
|
t-as="labour_supply"> |
||||
|
<option t-value="labour_supply.id"> |
||||
|
<t t-esc="labour_supply.id" |
||||
|
readonly="True"/> |
||||
|
</option> |
||||
|
</t> |
||||
|
</select> |
||||
|
</label> |
||||
|
<br/> |
||||
|
<button class="button" type="submit" |
||||
|
style="width: 250px;">Add Requirement |
||||
|
</button> |
||||
|
<a href="/labour_on_supply/complete" |
||||
|
class="dropdown-toggle o-no-caret btn button_close" |
||||
|
type="object" style="width: 250px;">Submit |
||||
|
</a> |
||||
|
</div> |
||||
|
</form> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</t> |
||||
|
</template> |
||||
|
<template id="tmp_form_success" name="Labour Supply Request For Submitted"> |
||||
|
<t t-call="website.layout"> |
||||
|
<div id="wrap"> |
||||
|
<div class="container"> |
||||
|
<div class="col-md-12"> |
||||
|
<br/> |
||||
|
<div class="alert alert-success" align="center"> |
||||
|
LABOUR REQUEST GENERATED SUCCESSFULLY |
||||
|
<br/> |
||||
|
<a href="/labour_supply" |
||||
|
class="dropdown-toggle o-no-caret btn button_back" |
||||
|
type="object" style="width: 250px;">Go Back |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</t> |
||||
|
</template> |
||||
|
</odoo> |
@ -0,0 +1,11 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<odoo> |
||||
|
<!--Dashboard action and menu items--> |
||||
|
<record id="labour_supply_dashboard_action" model="ir.actions.client"> |
||||
|
<field name="name">Labour Supply Dashboard</field> |
||||
|
<field name="tag">labour_supply_dashboard</field> |
||||
|
</record> |
||||
|
<menuitem id="labour_supply_dashboard_menu_action" name="Dashboard" |
||||
|
parent="labour_supply_main_menu_root" sequence="1" |
||||
|
action="labour_supply_dashboard_action"/> |
||||
|
</odoo> |
@ -0,0 +1,146 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<!-- Templates for portal view--> |
||||
|
<odoo> |
||||
|
<template id="portal_my_home_menu_labour_supply" name="Portal layout : labour_supply menu entries" |
||||
|
inherit_id="portal.portal_breadcrumbs" priority="60"> |
||||
|
<xpath expr="//ol[hasclass('o_portal_submenu')]" position="inside"> |
||||
|
<li t-if="page_name == 'labour_supplies'" class="breadcrumb-item active"> |
||||
|
<a t-attf-href="/labour_supplies" aria-label="Home" title="laboursupply"> |
||||
|
<span>LabourSupply</span> |
||||
|
</a> |
||||
|
<span>/ |
||||
|
<em t-out="contract.sequence_number"/> |
||||
|
</span> |
||||
|
</li> |
||||
|
<li t-if="page_name == 'labour_supplies_contract'" class="breadcrumb-item active"> |
||||
|
<span>LabourSupply</span> |
||||
|
</li> |
||||
|
</xpath> |
||||
|
</template> |
||||
|
<template id="portal_my_home_labour_supply" name="Show Labour Supply" customize_show="True" |
||||
|
inherit_id="portal.portal_my_home" |
||||
|
priority="100"> |
||||
|
<xpath expr="//div[hasclass('o_portal_docs')]" position="inside"> |
||||
|
<t t-call="portal.portal_docs_entry"> |
||||
|
<t t-set="title">Labour Supply</t> |
||||
|
<t t-set="url" t-value="'/labour_supplies'"/> |
||||
|
<t t-set="placeholder_count" t-value="'contact_count'"/> |
||||
|
</t> |
||||
|
</xpath> |
||||
|
</template> |
||||
|
<template id="portal_labour_supply" name="My Labour Contracts"> |
||||
|
<t t-call="portal.portal_layout"> |
||||
|
<t t-set="breadcrumbs_searchbar" t-value="True"/> |
||||
|
<t t-call="portal.portal_searchbar"> |
||||
|
<t t-set="title">Labour Contract</t> |
||||
|
</t> |
||||
|
<t t-if="labour_supplies_portal" t-call="portal.portal_table"> |
||||
|
<thead> |
||||
|
<tr class="active"> |
||||
|
<th>Number</th> |
||||
|
<th class="text-end">Start Date</th> |
||||
|
<th class="text-end">End Date</th> |
||||
|
<input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/> |
||||
|
<th class="text-end">State</th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
<t t-foreach="labour_supplies_portal" t-as="contract"> |
||||
|
<tr> |
||||
|
<td> |
||||
|
<a t-attf-href="/labour_supplies/#{contract.id}"> |
||||
|
<t t-out="contract.sequence_number"/> |
||||
|
</a> |
||||
|
</td> |
||||
|
<td class="text-end"> |
||||
|
<span t-field="contract.from_date"/> |
||||
|
</td> |
||||
|
<td class="text-end"> |
||||
|
<span t-field="contract.to_date"/> |
||||
|
</td> |
||||
|
<td class="text-end"> |
||||
|
<span t-field="contract.state"/> |
||||
|
</td> |
||||
|
</tr> |
||||
|
</t> |
||||
|
</t> |
||||
|
</t> |
||||
|
</template> |
||||
|
<template id="portal_labour_supply_details" name="labour_supply_details"> |
||||
|
<t t-call="portal.portal_layout"> |
||||
|
<div class="card pb-5"> |
||||
|
<div> |
||||
|
<t t-foreach="labour_contract_rec" t-as="contract"> |
||||
|
<!-- Intro --> |
||||
|
<div class="pb-2 pt-3 card-header bg-white"> |
||||
|
<h2 class="my-0"> |
||||
|
<em t-out="contract.sequence_number"/> |
||||
|
</h2> |
||||
|
</div> |
||||
|
<!-- Informations --> |
||||
|
<div id="informations"> |
||||
|
<div class="pb-2 pt-3 card-header bg-white"> |
||||
|
<div class="row" id="ls_date"> |
||||
|
<div class="mb-3 col-6"> |
||||
|
<strong>Start Date:</strong> |
||||
|
<span t-field="contract.from_date" t-options='{"widget": "date"}'/> |
||||
|
</div> |
||||
|
<div class="mb-3 col-6"> |
||||
|
<strong>End Date:</strong> |
||||
|
<span t-field="contract.to_date" t-options='{"widget": "date"}'/> |
||||
|
</div> |
||||
|
<div class="mb-3 col-6" align="left"> |
||||
|
<span> |
||||
|
<b>Address</b> |
||||
|
</span> |
||||
|
<span t-field="contract.customer_id.name"/> |
||||
|
<br/> |
||||
|
<span t-field="contract.customer_id.street"/> |
||||
|
<br/> |
||||
|
<span t-field="contract.customer_id.zip"/> |
||||
|
<br/> |
||||
|
<span t-field="contract.customer_id.city"/> |
||||
|
<br/> |
||||
|
</div> |
||||
|
</div> |
||||
|
<section id="details" style="page-break-inside: auto;" class="mt32"> |
||||
|
<h5 id="details">Skill Requirement</h5> |
||||
|
<table t-att-data-order-id="contract.id" |
||||
|
class="table table-sm" id="labour_supply_table"> |
||||
|
<thead class="bg-100"> |
||||
|
<th class="text-center" id="product_name_header">Skill</th> |
||||
|
<th class="text-center">From Date</th> |
||||
|
<th class="text-center">To Date</th> |
||||
|
<th class="text-center">Required Number</th> |
||||
|
</thead> |
||||
|
<t t-foreach="labour_contract_line_rec" t-as="line"> |
||||
|
<tr> |
||||
|
<td class="text-center" id="skill_name"> |
||||
|
<span t-field="line.skill_id.name"/> |
||||
|
</td> |
||||
|
<td class="text-center" id="skill_from_date"> |
||||
|
<span t-field="line.from_date"/> |
||||
|
</td> |
||||
|
<td class="text-center" id="skill_to_date"> |
||||
|
<span t-field="line.to_date"/> |
||||
|
</td> |
||||
|
<td class="text-center" id="skill_number"> |
||||
|
<span t-field="line.number_of_labour_required"/> |
||||
|
</td> |
||||
|
</tr> |
||||
|
</t> |
||||
|
</table> |
||||
|
</section> |
||||
|
</div> |
||||
|
</div> |
||||
|
</t> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div id="labour_order_communication" class="mt-4"> |
||||
|
<h2>History</h2> |
||||
|
<t t-call="portal.message_thread"> |
||||
|
<t t-set="object" t-value="labour_contract_rec"/> |
||||
|
</t> |
||||
|
</div> |
||||
|
</t> |
||||
|
</template> |
||||
|
</odoo> |
@ -0,0 +1,120 @@ |
|||||
|
<?xml version='1.0' encoding='utf-8'?> |
||||
|
<!-- Form and tree view for labour supply--> |
||||
|
<odoo> |
||||
|
<record id="labour_supply_action" model="ir.actions.act_window"> |
||||
|
<field name="name">Labour Supply</field> |
||||
|
<field name="res_model">labour.supply</field> |
||||
|
<field name="view_mode">tree,form</field> |
||||
|
</record> |
||||
|
<record id="labour_supply_view_tree" model="ir.ui.view"> |
||||
|
<field name="name">labour.supply.view.tree</field> |
||||
|
<field name="model">labour.supply</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<tree default_order='create_date desc'> |
||||
|
<field name="sequence_number"/> |
||||
|
<field name="customer_id"/> |
||||
|
<field name="from_date"/> |
||||
|
<field name="to_date"/> |
||||
|
<field name="state"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</record> |
||||
|
<record id="labour_supply_view_form" model="ir.ui.view"> |
||||
|
<field name="name">labour.supply.view.form</field> |
||||
|
<field name="model">labour.supply</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form> |
||||
|
<header> |
||||
|
<button name="action_confirm" type="object" |
||||
|
class="oe_highlight" string="Confirm" |
||||
|
states='ready'/> |
||||
|
<button name="action_create_invoice" type="object" |
||||
|
class="oe_highlight" string="Create Invoice" |
||||
|
states='confirmed'/> |
||||
|
<button name="action_draft" type="object" string="Edit" |
||||
|
states='ready' |
||||
|
attrs="{'invisible': [('is_alert', '=', False)]}"/> |
||||
|
<button name="action_cancel" type="object" string="Cancel" |
||||
|
attrs="{'invisible' : [('state', 'in', ['expired', 'draft', 'canceled'])]}"/> |
||||
|
<field name="state" widget="statusbar"/> |
||||
|
</header> |
||||
|
<sheet> |
||||
|
<div name="button_box" position="inside"> |
||||
|
<button type="object" class="oe_stat_button" |
||||
|
icon="fa-pencil-square-o" |
||||
|
name="action_labour_supply_invoices" |
||||
|
states="invoiced"> |
||||
|
<span>Invoice</span> |
||||
|
</button> |
||||
|
</div> |
||||
|
<header> |
||||
|
<h1> |
||||
|
<field name="sequence_number"/> |
||||
|
</h1> |
||||
|
</header> |
||||
|
<div class="alert alert-info mb-0" role="alert" |
||||
|
attrs="{'invisible': [('is_alert', '=', False)]}"> |
||||
|
labour allocated is less than requested. |
||||
|
</div> |
||||
|
<br/> |
||||
|
<group> |
||||
|
<field name="customer_id" |
||||
|
attrs="{'readonly': [('state', 'not in', ['draft'])]}"/> |
||||
|
<field name="company_id"/> |
||||
|
<field name="is_alert" string="Shortage in Labour" |
||||
|
readonly="True" invisible="1"/> |
||||
|
</group> |
||||
|
<notebook> |
||||
|
<page name="Worker's Skill "> |
||||
|
<field name="skill_ids" required="True" |
||||
|
attrs="{'readonly': [('state', 'not in', ['draft'])]}"/> |
||||
|
<button name="action_fetch" type="object" |
||||
|
class="oe_highlight" string="Fetch" |
||||
|
states="draft"/> |
||||
|
</page> |
||||
|
<page name="Workers" |
||||
|
attrs="{'invisible' : [('view_workers_page', '=', False)]}"> |
||||
|
<field name="workers_ids"/> |
||||
|
<field name="view_workers_page" invisible="1"/> |
||||
|
<div align="right"> |
||||
|
<span>Total Amount</span> |
||||
|
<h3> |
||||
|
<field name="total_amount"/> |
||||
|
</h3> |
||||
|
</div> |
||||
|
</page> |
||||
|
</notebook> |
||||
|
</sheet> |
||||
|
<div class="oe_chatter"> |
||||
|
<field name="message_follower_ids" |
||||
|
groups="base.group_user"/> |
||||
|
<field name="message_ids"/> |
||||
|
</div> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
<record id="labour_supply_view_search" model="ir.ui.view"> |
||||
|
<field name="name">labour.supply.view.search</field> |
||||
|
<field name="model">labour.supply</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<search string="search"> |
||||
|
<field name="customer_id"/> |
||||
|
<separator/> |
||||
|
<filter string="Invoiced" name="invoiced" |
||||
|
domain="[('state', '=', 'invoiced')]"/> |
||||
|
<filter string="Expired" name="expired" |
||||
|
domain="[('state', '=', 'expired')]"/> |
||||
|
<filter string="Draft" name="draft" |
||||
|
domain="[('state', '=', 'draft')]"/> |
||||
|
<group> |
||||
|
<filter string="State" name="state" |
||||
|
context="{'group_by':'state'}"/> |
||||
|
</group> |
||||
|
</search> |
||||
|
</field> |
||||
|
</record> |
||||
|
<menuitem id="labour_supply_menu_root" name="Operation" |
||||
|
parent="labour_supply_main_menu_root" sequence="2"> |
||||
|
<menuitem id="labour_supply_menu_action" action="labour_supply_action"/> |
||||
|
</menuitem> |
||||
|
</odoo> |
@ -0,0 +1,75 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<!-- Template for form labour on skill form--> |
||||
|
<odoo> |
||||
|
<template id="online_labour_supply_form" name="Labour Supply"> |
||||
|
<t t-call="website.layout"> |
||||
|
<div id="wrap" class="oe_structure oe_empty"> |
||||
|
<div class="container"> |
||||
|
<div class="col-md-6"> |
||||
|
<h1 class="head"> |
||||
|
<b>Labour Supply</b> |
||||
|
</h1> |
||||
|
<div class="image"/> |
||||
|
</div> |
||||
|
<div class="col-md-6 body"> |
||||
|
<form action="/labour_supply/submit" method="POST"> |
||||
|
<input type="hidden" name="csrf_token" |
||||
|
t-att-value="request.csrf_token()"/> |
||||
|
<div> |
||||
|
<h3>Fill the details</h3> |
||||
|
</div> |
||||
|
<t t-if="alert"> |
||||
|
<div style="width: 500px;"> |
||||
|
<p class="alert alert-danger" role="alert"> |
||||
|
Invalid date |
||||
|
</p> |
||||
|
</div> |
||||
|
</t> |
||||
|
<label class="col-form-label col-sm-auto s_website_form_label" |
||||
|
style="width:200px"> |
||||
|
<span class="s_website_form_label_content"> |
||||
|
Customer |
||||
|
</span> |
||||
|
<span class="s_website_form_mark">*</span> |
||||
|
<select name="customer_id" class="link-style" |
||||
|
required="1"> |
||||
|
<t t-foreach="customer" t-as="customer_id"> |
||||
|
<option t-att-value="customer_id.partner_id.id"> |
||||
|
<t t-esc="customer_id.name"/> |
||||
|
</option> |
||||
|
</t> |
||||
|
</select> |
||||
|
</label> |
||||
|
<br/> |
||||
|
<label class="col-form-label col-sm-auto s_website_form_label" |
||||
|
style="width:200px"> |
||||
|
<span class="s_website_form_label_content"> |
||||
|
Expected From Date |
||||
|
</span> |
||||
|
<span class="s_website_form_mark">*</span> |
||||
|
<input type="date" class="link-style" |
||||
|
name="from_date" min="today" |
||||
|
required="True"/> |
||||
|
</label> |
||||
|
<br/> |
||||
|
<label class="col-form-label col-sm-auto s_website_form_label" |
||||
|
style="width:200px"> |
||||
|
<span class="s_website_form_label_content"> |
||||
|
Expected To Date |
||||
|
</span> |
||||
|
<span class="s_website_form_mark">*</span> |
||||
|
<input type="date" class="link-style" |
||||
|
name="to_date" min="today" |
||||
|
required="True"/> |
||||
|
</label> |
||||
|
<br/> |
||||
|
<button class="button" type="submit">Add Skill |
||||
|
Requirement |
||||
|
</button> |
||||
|
</form> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</t> |
||||
|
</template> |
||||
|
</odoo> |