Browse Source

Jan 16 [ADD] : Initial Commit 'manpower_supply_management'

pull/302/head
AjmalCybro 1 year ago
parent
commit
49e547d8af
  1. 46
      manpower_supply_management/README.rst
  2. 25
      manpower_supply_management/__init__.py
  3. 74
      manpower_supply_management/__manifest__.py
  4. 24
      manpower_supply_management/controllers/__init__.py
  5. 51
      manpower_supply_management/controllers/labour_supply.py
  6. 97
      manpower_supply_management/controllers/manpower_supply_management.py
  7. 39
      manpower_supply_management/controllers/portal.py
  8. 16
      manpower_supply_management/data/ir_cron_data.xml
  9. 15
      manpower_supply_management/data/ir_sequence_data.xml
  10. 12
      manpower_supply_management/data/labour_supply_website_menu.xml
  11. 6
      manpower_supply_management/doc/RELEASE_NOTES.md
  12. 25
      manpower_supply_management/models/__init__.py
  13. 47
      manpower_supply_management/models/labour_on_skill.py
  14. 244
      manpower_supply_management/models/labour_supply.py
  15. 36
      manpower_supply_management/models/skill_details.py
  16. 325
      manpower_supply_management/models/workers_details.py
  17. 22
      manpower_supply_management/report/__init__.py
  18. 60
      manpower_supply_management/report/form_print_labour_supply_templates.xml
  19. 38
      manpower_supply_management/report/labour_supply_report.py
  20. 34
      manpower_supply_management/report/labour_supply_reports.xml
  21. 164
      manpower_supply_management/report/labour_supply_templates.xml
  22. 10
      manpower_supply_management/security/ir.model.access.csv
  23. 27
      manpower_supply_management/security/labour_supply_security.xml
  24. 10
      manpower_supply_management/security/manpower_supply_management_security.xml
  25. BIN
      manpower_supply_management/static/description/assets/icons/check.png
  26. BIN
      manpower_supply_management/static/description/assets/icons/chevron.png
  27. BIN
      manpower_supply_management/static/description/assets/icons/cogs.png
  28. BIN
      manpower_supply_management/static/description/assets/icons/consultation.png
  29. BIN
      manpower_supply_management/static/description/assets/icons/ecom-black.png
  30. BIN
      manpower_supply_management/static/description/assets/icons/education-black.png
  31. BIN
      manpower_supply_management/static/description/assets/icons/hotel-black.png
  32. BIN
      manpower_supply_management/static/description/assets/icons/license.png
  33. BIN
      manpower_supply_management/static/description/assets/icons/lifebuoy.png
  34. BIN
      manpower_supply_management/static/description/assets/icons/manufacturing-black.png
  35. BIN
      manpower_supply_management/static/description/assets/icons/pos-black.png
  36. BIN
      manpower_supply_management/static/description/assets/icons/puzzle.png
  37. BIN
      manpower_supply_management/static/description/assets/icons/restaurant-black.png
  38. BIN
      manpower_supply_management/static/description/assets/icons/service-black.png
  39. BIN
      manpower_supply_management/static/description/assets/icons/trading-black.png
  40. BIN
      manpower_supply_management/static/description/assets/icons/training.png
  41. BIN
      manpower_supply_management/static/description/assets/icons/update.png
  42. BIN
      manpower_supply_management/static/description/assets/icons/user.png
  43. BIN
      manpower_supply_management/static/description/assets/icons/wrench.png
  44. BIN
      manpower_supply_management/static/description/assets/misc/categories.png
  45. BIN
      manpower_supply_management/static/description/assets/misc/check-box.png
  46. BIN
      manpower_supply_management/static/description/assets/misc/compass.png
  47. BIN
      manpower_supply_management/static/description/assets/misc/corporate.png
  48. BIN
      manpower_supply_management/static/description/assets/misc/customer-support.png
  49. BIN
      manpower_supply_management/static/description/assets/misc/cybrosys-logo.png
  50. BIN
      manpower_supply_management/static/description/assets/misc/features.png
  51. BIN
      manpower_supply_management/static/description/assets/misc/logo.png
  52. BIN
      manpower_supply_management/static/description/assets/misc/pictures.png
  53. BIN
      manpower_supply_management/static/description/assets/misc/pie-chart.png
  54. BIN
      manpower_supply_management/static/description/assets/misc/right-arrow.png
  55. BIN
      manpower_supply_management/static/description/assets/misc/star.png
  56. BIN
      manpower_supply_management/static/description/assets/misc/support.png
  57. BIN
      manpower_supply_management/static/description/assets/misc/whatsapp.png
  58. BIN
      manpower_supply_management/static/description/assets/modules/branch_transfer_image.png
  59. BIN
      manpower_supply_management/static/description/assets/modules/core_image.gif
  60. BIN
      manpower_supply_management/static/description/assets/modules/document_expiry_image.png
  61. BIN
      manpower_supply_management/static/description/assets/modules/salary_image.png
  62. BIN
      manpower_supply_management/static/description/assets/screenshots/dashboard_1.png
  63. BIN
      manpower_supply_management/static/description/assets/screenshots/dashboard_2.png
  64. BIN
      manpower_supply_management/static/description/assets/screenshots/expire_1.png
  65. BIN
      manpower_supply_management/static/description/assets/screenshots/expire_2.png
  66. BIN
      manpower_supply_management/static/description/assets/screenshots/hero.gif
  67. BIN
      manpower_supply_management/static/description/assets/screenshots/labour_supply_1.png
  68. BIN
      manpower_supply_management/static/description/assets/screenshots/labour_supply_2.png
  69. BIN
      manpower_supply_management/static/description/assets/screenshots/labour_supply_3.png
  70. BIN
      manpower_supply_management/static/description/assets/screenshots/labour_supply_4_4.png
  71. BIN
      manpower_supply_management/static/description/assets/screenshots/labour_supply_4_4_1.png
  72. BIN
      manpower_supply_management/static/description/assets/screenshots/portal_1.png
  73. BIN
      manpower_supply_management/static/description/assets/screenshots/portal_2.png
  74. BIN
      manpower_supply_management/static/description/assets/screenshots/portal_3.png
  75. BIN
      manpower_supply_management/static/description/assets/screenshots/report_1.png
  76. BIN
      manpower_supply_management/static/description/assets/screenshots/report_2.png
  77. BIN
      manpower_supply_management/static/description/assets/screenshots/report_3.png
  78. BIN
      manpower_supply_management/static/description/assets/screenshots/report_4.png
  79. BIN
      manpower_supply_management/static/description/assets/screenshots/settings.png
  80. BIN
      manpower_supply_management/static/description/assets/screenshots/website_1.png
  81. BIN
      manpower_supply_management/static/description/assets/screenshots/website_2.png
  82. BIN
      manpower_supply_management/static/description/assets/screenshots/worker_1.png
  83. BIN
      manpower_supply_management/static/description/banner.png
  84. BIN
      manpower_supply_management/static/description/icon.png
  85. 732
      manpower_supply_management/static/description/index.html
  86. 38
      manpower_supply_management/static/src/css/dashboard.css
  87. 169
      manpower_supply_management/static/src/css/material-gauge.css
  88. 57
      manpower_supply_management/static/src/css/website.css
  89. BIN
      manpower_supply_management/static/src/img/jobs.jpg
  90. BIN
      manpower_supply_management/static/src/img/worker.jpg
  91. 459
      manpower_supply_management/static/src/js/labour_supply_dashoard.js
  92. 19288
      manpower_supply_management/static/src/js/lib/Chart.bundle.js
  93. 237
      manpower_supply_management/static/src/scss/dashboard.scss
  94. 237
      manpower_supply_management/static/src/xml/labour_supply_dashoard.xml
  95. 21
      manpower_supply_management/views/labour_on_skill_views.xml
  96. 125
      manpower_supply_management/views/labour_on_supply_form_template.xml
  97. 11
      manpower_supply_management/views/labour_supply_dashboard_views.xml
  98. 146
      manpower_supply_management/views/labour_supply_portal_templates.xml
  99. 120
      manpower_supply_management/views/labour_supply_views.xml
  100. 75
      manpower_supply_management/views/labour_supply_website_template.xml

46
manpower_supply_management/README.rst

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

25
manpower_supply_management/__init__.py

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

74
manpower_supply_management/__manifest__.py

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

24
manpower_supply_management/controllers/__init__.py

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

51
manpower_supply_management/controllers/labour_supply.py

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

97
manpower_supply_management/controllers/manpower_supply_management.py

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

39
manpower_supply_management/controllers/portal.py

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

16
manpower_supply_management/data/ir_cron_data.xml

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

15
manpower_supply_management/data/ir_sequence_data.xml

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

12
manpower_supply_management/data/labour_supply_website_menu.xml

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

6
manpower_supply_management/doc/RELEASE_NOTES.md

@ -0,0 +1,6 @@
## Module <manpower_supply_management>
#### 13.12.2023
#### Version 16.0.1.0.0
#### ADD
- Initial commit for Manpower Supply Management

25
manpower_supply_management/models/__init__.py

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

47
manpower_supply_management/models/labour_on_skill.py

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

244
manpower_supply_management/models/labour_supply.py

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

36
manpower_supply_management/models/skill_details.py

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

325
manpower_supply_management/models/workers_details.py

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

22
manpower_supply_management/report/__init__.py

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

60
manpower_supply_management/report/form_print_labour_supply_templates.xml

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

38
manpower_supply_management/report/labour_supply_report.py

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

34
manpower_supply_management/report/labour_supply_reports.xml

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

164
manpower_supply_management/report/labour_supply_templates.xml

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

10
manpower_supply_management/security/ir.model.access.csv

@ -0,0 +1,10 @@
id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
access_workers_details,access.workers.details,model_workers_details,manpower_supply_management_manager,1,1,1,1
access_skill_details,access.skill.details,model_skill_details,manpower_supply_management_manager,1,1,1,1
access_labour_supply,access.labour.supply,model_labour_supply,manpower_supply_management_manager,1,1,1,1
access_labour_on_skill,access.labour.on.skill,model_labour_on_skill,manpower_supply_management_manager,1,1,1,1
access_workers_details_user,access.workers.details,model_workers_details,base.group_user,1,0,0,0
access_skill_details_user,access.skill.details,model_skill_details,base.group_user,1,0,0,0
access_labour_supply_user,access.labour.supply,model_labour_supply,base.group_user,1,0,0,0
access_labour_on_skill_user,access.labour.on.skill,model_labour_on_skill,base.group_user,1,0,0,0
access_labour_supply_report,access.labour.supply.report,model_labour_supply_report,manpower_supply_management_manager,1,1,1,1
1 id name model_id/id group_id/id perm_read perm_write perm_create perm_unlink
2 access_workers_details access.workers.details model_workers_details manpower_supply_management_manager 1 1 1 1
3 access_skill_details access.skill.details model_skill_details manpower_supply_management_manager 1 1 1 1
4 access_labour_supply access.labour.supply model_labour_supply manpower_supply_management_manager 1 1 1 1
5 access_labour_on_skill access.labour.on.skill model_labour_on_skill manpower_supply_management_manager 1 1 1 1
6 access_workers_details_user access.workers.details model_workers_details base.group_user 1 0 0 0
7 access_skill_details_user access.skill.details model_skill_details base.group_user 1 0 0 0
8 access_labour_supply_user access.labour.supply model_labour_supply base.group_user 1 0 0 0
9 access_labour_on_skill_user access.labour.on.skill model_labour_on_skill base.group_user 1 0 0 0
10 access_labour_supply_report access.labour.supply.report model_labour_supply_report manpower_supply_management_manager 1 1 1 1

27
manpower_supply_management/security/labour_supply_security.xml

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

10
manpower_supply_management/security/manpower_supply_management_security.xml

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

BIN
manpower_supply_management/static/description/assets/icons/check.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
manpower_supply_management/static/description/assets/icons/chevron.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

BIN
manpower_supply_management/static/description/assets/icons/cogs.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
manpower_supply_management/static/description/assets/icons/consultation.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
manpower_supply_management/static/description/assets/icons/ecom-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

BIN
manpower_supply_management/static/description/assets/icons/education-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

BIN
manpower_supply_management/static/description/assets/icons/hotel-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

BIN
manpower_supply_management/static/description/assets/icons/license.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
manpower_supply_management/static/description/assets/icons/lifebuoy.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
manpower_supply_management/static/description/assets/icons/manufacturing-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

BIN
manpower_supply_management/static/description/assets/icons/pos-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

BIN
manpower_supply_management/static/description/assets/icons/puzzle.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

BIN
manpower_supply_management/static/description/assets/icons/restaurant-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

BIN
manpower_supply_management/static/description/assets/icons/service-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

BIN
manpower_supply_management/static/description/assets/icons/trading-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

BIN
manpower_supply_management/static/description/assets/icons/training.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

BIN
manpower_supply_management/static/description/assets/icons/update.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
manpower_supply_management/static/description/assets/icons/user.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

BIN
manpower_supply_management/static/description/assets/icons/wrench.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
manpower_supply_management/static/description/assets/misc/categories.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
manpower_supply_management/static/description/assets/misc/check-box.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
manpower_supply_management/static/description/assets/misc/compass.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
manpower_supply_management/static/description/assets/misc/corporate.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
manpower_supply_management/static/description/assets/misc/customer-support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
manpower_supply_management/static/description/assets/misc/cybrosys-logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
manpower_supply_management/static/description/assets/misc/features.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

BIN
manpower_supply_management/static/description/assets/misc/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
manpower_supply_management/static/description/assets/misc/pictures.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
manpower_supply_management/static/description/assets/misc/pie-chart.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
manpower_supply_management/static/description/assets/misc/right-arrow.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 967 B

BIN
manpower_supply_management/static/description/assets/misc/star.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
manpower_supply_management/static/description/assets/misc/support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
manpower_supply_management/static/description/assets/misc/whatsapp.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
manpower_supply_management/static/description/assets/modules/branch_transfer_image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

BIN
manpower_supply_management/static/description/assets/modules/core_image.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 1006 KiB

BIN
manpower_supply_management/static/description/assets/modules/document_expiry_image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
manpower_supply_management/static/description/assets/modules/salary_image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

BIN
manpower_supply_management/static/description/assets/screenshots/dashboard_1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

BIN
manpower_supply_management/static/description/assets/screenshots/dashboard_2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 KiB

BIN
manpower_supply_management/static/description/assets/screenshots/expire_1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

BIN
manpower_supply_management/static/description/assets/screenshots/expire_2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

BIN
manpower_supply_management/static/description/assets/screenshots/hero.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 506 KiB

BIN
manpower_supply_management/static/description/assets/screenshots/labour_supply_1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

BIN
manpower_supply_management/static/description/assets/screenshots/labour_supply_2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 KiB

BIN
manpower_supply_management/static/description/assets/screenshots/labour_supply_3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 KiB

BIN
manpower_supply_management/static/description/assets/screenshots/labour_supply_4_4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 269 KiB

BIN
manpower_supply_management/static/description/assets/screenshots/labour_supply_4_4_1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

BIN
manpower_supply_management/static/description/assets/screenshots/portal_1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

BIN
manpower_supply_management/static/description/assets/screenshots/portal_2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

BIN
manpower_supply_management/static/description/assets/screenshots/portal_3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

BIN
manpower_supply_management/static/description/assets/screenshots/report_1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

BIN
manpower_supply_management/static/description/assets/screenshots/report_2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

BIN
manpower_supply_management/static/description/assets/screenshots/report_3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
manpower_supply_management/static/description/assets/screenshots/report_4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

BIN
manpower_supply_management/static/description/assets/screenshots/settings.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

BIN
manpower_supply_management/static/description/assets/screenshots/website_1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

BIN
manpower_supply_management/static/description/assets/screenshots/website_2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

BIN
manpower_supply_management/static/description/assets/screenshots/worker_1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

BIN
manpower_supply_management/static/description/banner.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
manpower_supply_management/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

732
manpower_supply_management/static/description/index.html

@ -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 &amp; Website
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Mobile
friendly,
awe-inspiring product pages</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/service-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Service Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Keep track of
services and invoice</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/restaurant-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Restaurant
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Run your bar or
restaurant methodically</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/hotel-black.png"
class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Hotel Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
An
all-inclusive
hotel management application</p>
</div>
</div>
</div>
</div>
<!--END OF 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 -->

38
manpower_supply_management/static/src/css/dashboard.css

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

169
manpower_supply_management/static/src/css/material-gauge.css

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

57
manpower_supply_management/static/src/css/website.css

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

BIN
manpower_supply_management/static/src/img/jobs.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
manpower_supply_management/static/src/img/worker.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

459
manpower_supply_management/static/src/js/labour_supply_dashoard.js

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

19288
manpower_supply_management/static/src/js/lib/Chart.bundle.js

File diff suppressed because it is too large

237
manpower_supply_management/static/src/scss/dashboard.scss

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

237
manpower_supply_management/static/src/xml/labour_supply_dashoard.xml

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

21
manpower_supply_management/views/labour_on_skill_views.xml

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

125
manpower_supply_management/views/labour_on_supply_form_template.xml

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

11
manpower_supply_management/views/labour_supply_dashboard_views.xml

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

146
manpower_supply_management/views/labour_supply_portal_templates.xml

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

120
manpower_supply_management/views/labour_supply_views.xml

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

75
manpower_supply_management/views/labour_supply_website_template.xml

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

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save