Initial commit on branch odoo_DuyDat
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import controllers
|
||||
from . import models
|
||||
from . import wizard
|
||||
@@ -0,0 +1,37 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
{
|
||||
'name': "employee_management",
|
||||
|
||||
'summary': "Short (1 phrase/line) summary of the module's purpose",
|
||||
|
||||
'description': """
|
||||
Long description of module's purpose
|
||||
""",
|
||||
|
||||
'author': "My Company",
|
||||
'website': "https://www.yourcompany.com",
|
||||
|
||||
# Categories can be used to filter modules in modules listing
|
||||
# Check https://github.com/odoo/odoo/blob/15.0/odoo/addons/base/data/ir_module_category_data.xml
|
||||
# for the full list
|
||||
'category': 'management',
|
||||
'version': '0.1',
|
||||
|
||||
# any module necessary for this one to work correctly
|
||||
'depends': ['base'],
|
||||
|
||||
# always loaded
|
||||
'data': [
|
||||
'security/ir.model.access.csv',
|
||||
'security/employee_security.xml',
|
||||
'views/employee_profile_view.xml',
|
||||
'views/add_employee_wizard_view.xml',
|
||||
'views/menu_item.xml',
|
||||
'views/employee_report_view.xml',
|
||||
],
|
||||
# only loaded in demonstration mode
|
||||
'demo': [
|
||||
'demo/demo.xml',
|
||||
],
|
||||
}
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import controllers
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,26 @@
|
||||
from odoo import http
|
||||
from odoo.http import request
|
||||
import json
|
||||
|
||||
class EmployeeController(http.Controller):
|
||||
|
||||
@http.route('/employees', type='http', auth='none', methods=['GET'], csrf=False)
|
||||
def get_employees(self, **kwargs):
|
||||
employees = request.env['employee.profile'].sudo().search([])
|
||||
|
||||
result = []
|
||||
for emp in employees:
|
||||
result.append({
|
||||
'id': emp.id,
|
||||
'name': emp.name,
|
||||
'email': emp.email,
|
||||
'phone': emp.phone,
|
||||
'position': emp.position,
|
||||
})
|
||||
|
||||
# Trả về JSON response
|
||||
return http.Response(
|
||||
json.dumps({'status': 'success', 'employees': result}),
|
||||
content_type='application/json',
|
||||
status=200
|
||||
)
|
||||
@@ -0,0 +1,30 @@
|
||||
<odoo>
|
||||
<data>
|
||||
<!--
|
||||
<record id="object0" model="employee_management.employee_management">
|
||||
<field name="name">Object 0</field>
|
||||
<field name="value">0</field>
|
||||
</record>
|
||||
|
||||
<record id="object1" model="employee_management.employee_management">
|
||||
<field name="name">Object 1</field>
|
||||
<field name="value">10</field>
|
||||
</record>
|
||||
|
||||
<record id="object2" model="employee_management.employee_management">
|
||||
<field name="name">Object 2</field>
|
||||
<field name="value">20</field>
|
||||
</record>
|
||||
|
||||
<record id="object3" model="employee_management.employee_management">
|
||||
<field name="name">Object 3</field>
|
||||
<field name="value">30</field>
|
||||
</record>
|
||||
|
||||
<record id="object4" model="employee_management.employee_management">
|
||||
<field name="name">Object 4</field>
|
||||
<field name="value">40</field>
|
||||
</record>
|
||||
-->
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -0,0 +1 @@
|
||||
from . import add_employee_wizard,models,employee_report
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,44 @@
|
||||
from odoo import models, fields
|
||||
|
||||
class AddEmployeeWizard(models.TransientModel):
|
||||
_name = 'add.employee.wizard'
|
||||
_description = 'Add Employee Wizard'
|
||||
|
||||
# Thông tin từ res.partner
|
||||
name = fields.Char(string='Name', required=True)
|
||||
email = fields.Char(string='Email')
|
||||
phone = fields.Char(string='Phone')
|
||||
image_1920 = fields.Image(string="Avatar")
|
||||
|
||||
# Thông tin riêng của employee
|
||||
employee_code = fields.Char(string='Employee Code', required=True)
|
||||
department = fields.Char(string='Department')
|
||||
position = fields.Char(string='Position')
|
||||
|
||||
def action_add_employee(self):
|
||||
|
||||
self.ensure_one()
|
||||
|
||||
# Tạo partner
|
||||
partner = self.env['res.partner'].create({
|
||||
'name': self.name,
|
||||
'email': self.email,
|
||||
'phone': self.phone,
|
||||
'image_1920': self.image_1920,
|
||||
})
|
||||
|
||||
# Tạo employee.profile gắn với partner_id
|
||||
employee = self.env['employee.profile'].create({
|
||||
'partner_id': partner.id,
|
||||
'employee_code': self.employee_code,
|
||||
'department': self.department,
|
||||
'position': self.position,
|
||||
})
|
||||
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'res_model': 'employee.profile',
|
||||
'res_id': employee.id,
|
||||
'view_mode': 'form',
|
||||
'target': 'current',
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
from odoo import models
|
||||
|
||||
class MyReport(models.AbstractModel):
|
||||
_name = 'report.employee_management.my_report_template' # module.template
|
||||
_description = 'Employee Profile Report'
|
||||
|
||||
def _get_report_values(self, docids, data=None):
|
||||
# Lấy tất cả bản ghi employee.profile
|
||||
docs = self.env['employee.profile'].browse(docids)
|
||||
|
||||
return {
|
||||
'doc_model': 'employee.profile',
|
||||
'docs': docs,
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
from odoo import models, fields
|
||||
|
||||
class EmployeeProfile(models.Model):
|
||||
_name = 'employee.profile'
|
||||
_inherits = {'res.partner': 'partner_id'}
|
||||
_description = 'Employee Profile'
|
||||
|
||||
partner_id = fields.Many2one('res.partner', string='Partner', required=True, ondelete='cascade')
|
||||
employee_code = fields.Char(string='Employee Code', required=True, unique=True)
|
||||
department = fields.Char(string='Department')
|
||||
position = fields.Char(string='Position')
|
||||
@@ -0,0 +1,24 @@
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
|
||||
<!-- Category for your module -->
|
||||
<record id="module_category_employee_management" model="ir.module.category">
|
||||
<field name="name">Employee Management</field>
|
||||
<field name="description">Access rights for employee management</field>
|
||||
<field name="sequence">10</field>
|
||||
</record>
|
||||
|
||||
<!-- Admin Group -->
|
||||
<record id="group_employee_admin" model="res.groups">
|
||||
<field name="name">Employee Admin</field>
|
||||
<field name="category_id" ref="employee_management.module_category_employee_management"/>
|
||||
</record>
|
||||
|
||||
<!-- User Group -->
|
||||
<record id="group_employee_user" model="res.groups">
|
||||
<field name="name">Employee User</field>
|
||||
<field name="category_id" ref="employee_management.module_category_employee_management"/>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
@@ -0,0 +1,5 @@
|
||||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
access_employee_profile_user,employee.profile,model_employee_profile,employee_management.group_employee_user,1,0,0,0
|
||||
access_employee_profile_admin,employee.profile,model_employee_profile,employee_management.group_employee_admin,1,1,1,1
|
||||
access_add_employee_wizard_user,add.employee.wizard,model_add_employee_wizard,employee_management.group_employee_user,0,0,0,0
|
||||
access_add_employee_wizard_admin,add.employee.wizard,model_add_employee_wizard,employee_management.group_employee_admin,1,1,1,1
|
||||
|
@@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<odoo>
|
||||
<!-- Wizard Form View -->
|
||||
<record id="view_add_employee_wizard_form" model="ir.ui.view">
|
||||
<field name="name">add.employee.wizard.form</field>
|
||||
<field name="model">add.employee.wizard</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Add New Employee">
|
||||
<group>
|
||||
<field name="image_1920" widget="image"/>
|
||||
<field name="name"/>
|
||||
<field name="email"/>
|
||||
<field name="phone"/>
|
||||
<field name="employee_code"/>
|
||||
<field name="department"/>
|
||||
<field name="position"/>
|
||||
</group>
|
||||
<footer>
|
||||
<button name="action_add_employee" string="Add Employee" type="object" class="btn-primary"/>
|
||||
<button string="Cancel" special="cancel"/>
|
||||
</footer>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Action mở wizard -->
|
||||
<record id="action_add_employee_wizard" model="ir.actions.act_window">
|
||||
<field name="name">Add Employee</field>
|
||||
<field name="res_model">add.employee.wizard</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="target">new</field>
|
||||
</record>
|
||||
<menuitem id="menu_add_employee"
|
||||
name="Add Employee"
|
||||
parent="menu_emplyee_profile"
|
||||
action="action_add_employee_wizard"/>
|
||||
|
||||
</odoo>
|
||||
@@ -0,0 +1,97 @@
|
||||
<odoo>
|
||||
<!-- Kanban View -->
|
||||
<record id="view_employee_profile_kanban" model="ir.ui.view">
|
||||
<field name="name">employee.profile.kanban</field>
|
||||
<field name="model">employee.profile</field>
|
||||
<field name="arch" type="xml">
|
||||
<kanban class="o_kanban_example" create="true">
|
||||
<templates>
|
||||
<t t-name="kanban-box">
|
||||
<div class="oe_kanban_global_click o_kanban_card d-flex" style="display: flex; align-items: center;">
|
||||
<!-- Hình ảnh -->
|
||||
<div class="o_kanban_image" style="height: 100px; width: 100px; flex-shrink: 0;">
|
||||
<field name="image_1920" widget="image" class="oe_avatar"/>
|
||||
</div>
|
||||
|
||||
<!-- Thông tin chi tiết -->
|
||||
<div class="o_kanban_details" style="padding-left: 10px; flex: 1;">
|
||||
<strong>
|
||||
<field name="name"/>
|
||||
</strong>
|
||||
<div>
|
||||
<field name="employee_code"/>
|
||||
</div>
|
||||
<div>
|
||||
<field name="email"/>
|
||||
</div>
|
||||
<div>
|
||||
<field name="phone"/>
|
||||
</div>
|
||||
<div>
|
||||
<field name="department"/>
|
||||
</div>
|
||||
<div>
|
||||
<field name="position"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</t>
|
||||
</templates>
|
||||
</kanban>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_employee_list_custom" model="ir.ui.view">
|
||||
<field name="name">employee.profile.list</field>
|
||||
<field name="model">employee.profile</field> <!-- Đổi model nếu không phải employee.profile -->
|
||||
<field name="arch" type="xml">
|
||||
<list string="Employees">
|
||||
<field name="name"/>
|
||||
<field name="employee_code"/>
|
||||
<field name="email"/>
|
||||
<field name="phone"/>
|
||||
<field name="department"/>
|
||||
<field name="position"/>
|
||||
<field name="image_1920" widget="image" class="oe_avatar"/>
|
||||
</list>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_employee_profile_form" model="ir.ui.view">
|
||||
<field name="name">employee.profile.form</field>
|
||||
<field name="model">employee.profile</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Employee Profile" group="employee_management.group_employee_admin">
|
||||
<header>
|
||||
<button name="%(report_employee_profile)d" string="Print Profile" type="action" class="oe_highlight"/>
|
||||
</header>
|
||||
<sheet style="max-width: 50%; margin: auto;">
|
||||
<group col="2">
|
||||
<group style="width:20%;">
|
||||
<field name="image_1920" widget="image" nolabel="1" class="oe_avatar" options="{'preview_image': 'image_1920'}"/>
|
||||
</group>
|
||||
<group style="flex: 1;">
|
||||
<field name="name"/>
|
||||
<field name="employee_code"/>
|
||||
<field name="email"/>
|
||||
<field name="phone"/>
|
||||
<field name="department"/>
|
||||
<field name="position"/>
|
||||
</group>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<!-- Action -->
|
||||
<record id="action_employee_profile" model="ir.actions.act_window">
|
||||
<field name="name">Employee Profiles</field>
|
||||
<field name="res_model">employee.profile</field>
|
||||
<field name="view_mode">kanban,list,form</field>
|
||||
<field name="views" eval="[
|
||||
(ref('view_employee_profile_kanban'), 'kanban'),
|
||||
(ref('view_employee_list_custom'), 'list')
|
||||
]"/>
|
||||
</record>
|
||||
</odoo>
|
||||
@@ -0,0 +1,61 @@
|
||||
<odoo>
|
||||
<!-- QWeb Report Template -->
|
||||
<template id="report_employee_profile_template">
|
||||
<t t-call="web.html_container">
|
||||
<t t-call="web.external_layout">
|
||||
<div class="page">
|
||||
<h2 style="text-align: center;">Employee Profile Report</h2>
|
||||
|
||||
<table class="table table-sm table-bordered" style="width: 100%; border-collapse: collapse;" border="1">
|
||||
<thead style="background-color: #f2f2f2;">
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Employee Code</th>
|
||||
<th>Email</th>
|
||||
<th>Phone</th>
|
||||
<th>Department</th>
|
||||
<th>Position</th>
|
||||
<th>Image</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<t t-foreach="docs" t-as="doc">
|
||||
<tr>
|
||||
<td>
|
||||
<t t-esc="doc.name"/>
|
||||
</td>
|
||||
<td>
|
||||
<t t-esc="doc.employee_code"/>
|
||||
</td>
|
||||
<td>
|
||||
<t t-esc="doc.email"/>
|
||||
</td>
|
||||
<td>
|
||||
<t t-esc="doc.phone"/>
|
||||
</td>
|
||||
<td>
|
||||
<t t-esc="doc.department"/>
|
||||
</td>
|
||||
<td>
|
||||
<t t-esc="doc.position"/>
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
</t>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</t>
|
||||
</t>
|
||||
</template>
|
||||
|
||||
<!-- Report Action -->
|
||||
<record id="report_employee_profile" model="ir.actions.report">
|
||||
<field name="name">Employee Profile Report</field>
|
||||
<field name="model">employee.profile</field>
|
||||
<field name="report_type">qweb-pdf</field>
|
||||
<field name="report_name">employee_management.report_employee_profile_template</field>
|
||||
<field name="report_file">employee_management.report_employee_profile_template</field>
|
||||
<field name="print_report_name">'EmployeeProfile_' + (object.name or '')</field>
|
||||
</record>
|
||||
</odoo>
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<odoo>
|
||||
<!-- Menu Gốc -->
|
||||
<menuitem id="menu_employee_root" name="Employee Management" sequence="10"/>
|
||||
<menuitem id="menu_emplyee_profile" name="Profiles" parent="menu_employee_root" action="action_employee_profile"/>
|
||||
<menuitem id="menu_employee_add" name="Add Employee" parent="menu_employee_root" action="employee_management.action_add_employee_wizard"/>
|
||||
</odoo>
|
||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user