Initial commit on branch odoo_DuyDat

This commit is contained in:
Duy Dat
2025-06-13 14:20:29 +07:00
commit 7819a1d6db
228 changed files with 4502 additions and 0 deletions
+5
View File
@@ -0,0 +1,5 @@
# -*- coding: utf-8 -*-
from . import controllers
from . import models
from . import wizard
+37
View File
@@ -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',
],
}
@@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import controllers
@@ -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
)
+30
View File
@@ -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>
+1
View File
@@ -0,0 +1 @@
from . import add_employee_wizard,models,employee_report
@@ -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,
}
+11
View File
@@ -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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_employee_profile_user employee.profile model_employee_profile employee_management.group_employee_user 1 0 0 0
3 access_employee_profile_admin employee.profile model_employee_profile employee_management.group_employee_admin 1 1 1 1
4 access_add_employee_wizard_user add.employee.wizard model_add_employee_wizard employee_management.group_employee_user 0 0 0 0
5 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>
+7
View File
@@ -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>