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