diff --git a/addons/zoo/__manifest__.py b/addons/zoo/__manifest__.py index b60f800..342d020 100644 --- a/addons/zoo/__manifest__.py +++ b/addons/zoo/__manifest__.py @@ -9,21 +9,12 @@ 'website': 'https://minhng.info', 'category': 'Uncategorized', # https://github.com/odoo/odoo/blob/18.0/odoo/addons/base/data/ir_module_category_data.xml 'version': '0.1', - 'depends': [ - 'product', - ], - 'data': [], - 'demo': [], - 'css': [], - # 'qweb': ['static/src/xml/*.xml'], - 'installable': True, - 'auto_install': False, - 'application': True, - - # Depends declaration + + # Dependencies 'depends': [ 'product', 'mail', + 'hr', ], # Data files declaration @@ -38,6 +29,13 @@ 'wizard/toy_add_views.xml', 'wizard/cage_update_views.xml', 'wizard/animal_feeding_views.xml', - 'views/zoo_husbandry_task_views.xml' + 'views/zoo_husbandry_task_views.xml', + 'views/zoo_keeper_views.xml', + 'views/zoo_keeper_certificate_views.xml', + 'views/zoo_keeper_speciality_views.xml', ], + + 'installable': True, + 'auto_install': False, + 'application': True, } \ No newline at end of file diff --git a/addons/zoo/demo/1_zoo_keeper_speciality.csv b/addons/zoo/demo/1_zoo_keeper_speciality.csv new file mode 100644 index 0000000..20ef21a --- /dev/null +++ b/addons/zoo/demo/1_zoo_keeper_speciality.csv @@ -0,0 +1,11 @@ +id,name,description +speciality_reptile,Reptile Care Specialist,Expertise in caring for snakeslizardsturtles and other reptiles +speciality_mammal,Mammal Care Specialist,Expertise in caring for large and small mammals +speciality_bird,Avian Care Specialist,Expertise in caring for birds and aviaries +speciality_aquatic,Aquatic Animal Specialist,Expertise in caring for fishamphibians and marine life +speciality_primate,Primate Behavior Specialist,Expertise in primate care and behavioral enrichment +speciality_carnivore,Large Carnivore Specialist,Expertise in caring for big catsbears and other carnivores +speciality_herbivore,Herbivore Nutrition Specialist,Expertise in herbivore diet planning and nutrition +speciality_nocturnal,Nocturnal Animal Specialist,Expertise in caring for nocturnal species +speciality_exotic,Exotic Species Specialist,Expertise in rare and exotic animal care +speciality_veterinary,Veterinary Assistant,Expertise in animal health monitoring and medical support diff --git a/addons/zoo/demo/2_hr_employee_keepers.csv b/addons/zoo/demo/2_hr_employee_keepers.csv new file mode 100644 index 0000000..b92a66d --- /dev/null +++ b/addons/zoo/demo/2_hr_employee_keepers.csv @@ -0,0 +1,16 @@ +id,name,is_zoo_keeper,work_email,mobile_phone,speciality_ids/id +keeper_sarah_chen,Sarah Chen,TRUE,sarah.chen@zoo.com,+1-555-0101,"speciality_reptile,speciality_exotic" +keeper_james_rodriguez,James Rodriguez,TRUE,james.rodriguez@zoo.com,+1-555-0102,"speciality_mammal,speciality_carnivore" +keeper_emily_watson,Emily Watson,TRUE,emily.watson@zoo.com,+1-555-0103,speciality_bird +keeper_michael_okonkwo,Michael Okonkwo,TRUE,michael.okonkwo@zoo.com,+1-555-0104,"speciality_primate,speciality_veterinary" +keeper_lisa_nguyen,Lisa Nguyen,TRUE,lisa.nguyen@zoo.com,+1-555-0105,speciality_aquatic +keeper_david_patel,David Patel,TRUE,david.patel@zoo.com,+1-555-0106,speciality_herbivore +keeper_anna_kowalski,Anna Kowalski,TRUE,anna.kowalski@zoo.com,+1-555-0107,"speciality_nocturnal,speciality_reptile" +keeper_robert_smith,Robert Smith,TRUE,robert.smith@zoo.com,+1-555-0108,speciality_carnivore +keeper_maria_santos,Maria Santos,TRUE,maria.santos@zoo.com,+1-555-0109,"speciality_bird,speciality_exotic" +keeper_william_jones,William Jones,TRUE,william.jones@zoo.com,+1-555-0110,speciality_mammal +keeper_sofia_garcia,Sofia Garcia,TRUE,sofia.garcia@zoo.com,+1-555-0111,speciality_primate +keeper_thomas_mueller,Thomas Mueller,TRUE,thomas.mueller@zoo.com,+1-555-0112,"speciality_veterinary,speciality_aquatic" +keeper_olivia_brown,Olivia Brown,TRUE,olivia.brown@zoo.com,+1-555-0113,"speciality_herbivore,speciality_mammal" +keeper_daniel_kim,Daniel Kim,TRUE,daniel.kim@zoo.com,+1-555-0114,speciality_exotic +keeper_isabella_rossi,Isabella Rossi,TRUE,isabella.rossi@zoo.com,+1-555-0115,"speciality_nocturnal,speciality_bird" diff --git a/addons/zoo/demo/3_zoo_keeper_certification.csv b/addons/zoo/demo/3_zoo_keeper_certification.csv new file mode 100644 index 0000000..322d521 --- /dev/null +++ b/addons/zoo/demo/3_zoo_keeper_certification.csv @@ -0,0 +1,18 @@ +id,certificate_code,name,employee_id/id,issue_date,expiry_date,description +cert_sarah_1,CERT-2023-001,Advanced Reptile Handling,keeper_sarah_chen,2023-01-15,2026-01-15,Certified in safe handling of venomous and non-venomous reptiles +cert_james_1,CERT-2023-002,Big Cat Safety Protocol,keeper_james_rodriguez,2023-02-20,2025-02-20,Certified in safe working practices around large carnivores +cert_emily_1,CERT-2023-003,Avian Health Management,keeper_emily_watson,2023-03-10,2026-03-10,Certified in bird disease prevention and health monitoring +cert_michael_1,CERT-2023-004,Primate Enrichment Specialist,keeper_michael_okonkwo,2023-04-05,2026-04-05,Certified in behavioral enrichment for primates +cert_lisa_1,CERT-2023-005,Aquatic Life Support Systems,keeper_lisa_nguyen,2023-05-12,2026-05-12,Certified in aquarium and aquatic system management +cert_david_1,CERT-2023-006,Herbivore Nutrition Certificate,keeper_david_patel,2023-06-18,2026-06-18,Certified in specialized diets for herbivorous animals +cert_anna_1,CERT-2023-007,Nocturnal Species Care,keeper_anna_kowalski,2023-07-22,2026-07-22,Certified in care and management of nocturnal animals +cert_robert_1,CERT-2023-008,Wildlife First Aid,keeper_robert_smith,2023-08-30,2025-08-30,Certified in emergency first aid for exotic animals +cert_maria_1,CERT-2023-009,Exotic Bird Training,keeper_maria_santos,2023-09-14,2026-09-14,Certified in positive reinforcement training for exotic birds +cert_william_1,CERT-2023-010,Large Mammal Husbandry,keeper_william_jones,2023-10-08,2026-10-08,Certified in care and management of large mammals +cert_sofia_1,CERT-2023-011,Primate Health Monitoring,keeper_sofia_garcia,2023-11-19,2026-11-19,Certified in primate health assessment and monitoring +cert_thomas_1,CERT-2023-012,Veterinary Assistant Wildlife,keeper_thomas_mueller,2023-12-05,2025-12-05,Certified veterinary assistant for exotic animals +cert_olivia_1,CERT-2024-001,Animal Nutrition Specialist,keeper_olivia_brown,2024-01-20,2027-01-20,Certified in zoo animal nutrition and diet formulation +cert_daniel_1,CERT-2024-002,Exotic Species Conservation,keeper_daniel_kim,2024-02-28,2027-02-28,Certified in conservation breeding programs for exotic species +cert_isabella_1,CERT-2024-003,Wildlife Behavior Analysis,keeper_isabella_rossi,2024-03-15,2027-03-15,Certified in animal behavior observation and analysis +cert_sarah_2,CERT-2024-004,Exotic Animal Transport,keeper_sarah_chen,2024-04-10,2026-04-10,Certified in safe transport of exotic reptiles +cert_james_2,CERT-2024-005,Animal CPR and Emergency Response,keeper_james_rodriguez,2024-05-22,2025-05-22,Certified in emergency medical response for zoo animals diff --git a/addons/zoo/models/__init__.py b/addons/zoo/models/__init__.py index 09e5407..1cc9acf 100644 --- a/addons/zoo/models/__init__.py +++ b/addons/zoo/models/__init__.py @@ -5,4 +5,5 @@ from . import zoo_health_record from . import zoo_diet_plan from . import zoo_diet_line from . import zoo_animal_meal -from . import zoo_husbandry_task \ No newline at end of file +from . import zoo_husbandry_task +from . import zoo_keeper \ No newline at end of file diff --git a/addons/zoo/models/__pycache__/__init__.cpython-312.pyc b/addons/zoo/models/__pycache__/__init__.cpython-312.pyc index cf9c976..66b7048 100644 Binary files a/addons/zoo/models/__pycache__/__init__.cpython-312.pyc and b/addons/zoo/models/__pycache__/__init__.cpython-312.pyc differ diff --git a/addons/zoo/models/__pycache__/zoo_keeper.cpython-312.pyc b/addons/zoo/models/__pycache__/zoo_keeper.cpython-312.pyc new file mode 100644 index 0000000..9076cfe Binary files /dev/null and b/addons/zoo/models/__pycache__/zoo_keeper.cpython-312.pyc differ diff --git a/addons/zoo/models/zoo_keeper.py b/addons/zoo/models/zoo_keeper.py new file mode 100644 index 0000000..10621b8 --- /dev/null +++ b/addons/zoo/models/zoo_keeper.py @@ -0,0 +1,102 @@ +from odoo import models, fields, api + +# --------------------------------------------------------- +# 1. MAIN MODEL: KEEPER (Inherit from HR Employee) +# --------------------------------------------------------- +class ZooKeeper(models.Model): + _inherit = 'hr.employee' + _description = 'Zoo Keeper Management' + + # flag để phân biệt Employee nào là Zoo Keepers + is_zoo_keeper = fields.Boolean(string='Is Zoo Keeper', + default=False) + + # Quan hệ với class con: Speciality (Many2many vì có thể share giữa nhiều keepers) + speciality_ids = fields.Many2many( + comodel_name='zoo.keeper.speciality', + relation='zoo_keeper_speciality_rel', + column1='employee_id', + column2='speciality_id', + string='Specialities', + help='Species or families this keeper specializes in.') + + # Quan hệ với class con: Certification (One2many vì mỗi cert là unique) + certification_ids = fields.One2many( + comodel_name='zoo.keeper.certification', + inverse_name='employee_id', + string='Certifications', + help='Certifications this keeper has.') + +# --------------------------------------------------------- +# 2. SATELLITE MODELS (Master Data) +# --------------------------------------------------------- + +class ZooKeeperSpeciality(models.Model): + _name = 'zoo.keeper.speciality' + _description = 'Zoo Keeper Speciality' + _inherit = ['mail.thread', 'mail.activity.mixin'] + + name = fields.Char(string='Name', + required=True) + + description = fields.Text(string='Description') + + # Quan hệ ngược: Many2many với hr.employee + employee_ids = fields.Many2many( + comodel_name='hr.employee', + relation='zoo_keeper_speciality_rel', + column1='speciality_id', + column2='employee_id', + string='Keepers', + help='Keepers who have this speciality') + +class ZooKeeperCertification(models.Model): + _name = 'zoo.keeper.certification' + _description = 'Zoo Keeper Certification' + _inherit = ['mail.thread', 'mail.activity.mixin'] + + # Tạo số chứng chỉ + certificate_code = fields.Char( + string='Certificate Code', + required=True, + copy=False, # Không copy khi duplicate + help='Unique certificate number') + + name = fields.Char(string='Name', + required=True) + + description = fields.Text(string='Description') + + # Link ngược về Employee + employee_id = fields.Many2one(comodel_name='hr.employee', + string='Keeper', + required=True, + ondelete='cascade') + + issue_date = fields.Date(string='Issue Date') + + expiry_date = fields.Date(string='Expiry Date') + + # File scan chứng chỉ + attachment = fields.Binary(string='Certificate Document') + + # Computed field để cảnh báo hết hạn + is_expired = fields.Boolean(compute='_compute_is_expired', + string='Expired Date') + + # Computed field để cảnh báo hết hạn + @api.depends('expiry_date') + def _compute_is_expired(self): + today = fields.Date.today() + for record in self: + if record.expiry_date and record.expiry_date < today: + record.is_expired = True + else: + record.is_expired = False + + # SQL Constraint để đảm bảo Certificate code là unique + _sql_constraints = [ + ('certificate_code_unique', + 'UNIQUE(certificate_code)', + 'Certificate Code must be unique!') + ] \ No newline at end of file diff --git a/addons/zoo/security/ir.model.access.csv b/addons/zoo/security/ir.model.access.csv index 75395b7..bebde94 100644 --- a/addons/zoo/security/ir.model.access.csv +++ b/addons/zoo/security/ir.model.access.csv @@ -12,4 +12,6 @@ access_zoo_animal_feeding_wizard,access_zoo_animal_feeding_wizard,model_zoo_anim access_zoo_animal_feeding_wizard_line,access_zoo_animal_feeding_wizard_line,model_zoo_animal_feeding_wizard_line,base.group_user,1,1,1,1 access_zoo_husbandry_task,access_zoo_husbandry_task,model_zoo_husbandry_task,base.group_user,1,1,1,1 access_zoo_husbandry_task_line,access_zoo_husbandry_task_line,model_zoo_husbandry_task_line,base.group_user,1,1,1,1 -access_zoo_cage_checklist_template,access_zoo_cage_checklist_template,model_zoo_cage_checklist_template,base.group_user,1,1,1,1 \ No newline at end of file +access_zoo_cage_checklist_template,access_zoo_cage_checklist_template,model_zoo_cage_checklist_template,base.group_user,1,1,1,1 +access_zoo_keeper_speciality,access_zoo_keeper_speciality,model_zoo_keeper_speciality,base.group_user,1,1,1,1 +access_zoo_keeper_certification,access_zoo_keeper_certification,model_zoo_keeper_certification,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/addons/zoo/views/zoo_keeper_certificate_views.xml b/addons/zoo/views/zoo_keeper_certificate_views.xml new file mode 100644 index 0000000..34a9b10 --- /dev/null +++ b/addons/zoo/views/zoo_keeper_certificate_views.xml @@ -0,0 +1,97 @@ + + + + + + zoo.keeper.certification.form.view + zoo.keeper.certification + +
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + zoo.keeper.certification.list.view + zoo.keeper.certification + + + + + + + + + + + + + + + + Certifications + zoo.keeper.certification + list,form + +

+ Add a new Certification +

+

+ Track keeper certifications, issue and expiry dates. +

+
+
+ + + + +
+
\ No newline at end of file diff --git a/addons/zoo/views/zoo_keeper_speciality_views.xml b/addons/zoo/views/zoo_keeper_speciality_views.xml new file mode 100644 index 0000000..e7647a4 --- /dev/null +++ b/addons/zoo/views/zoo_keeper_speciality_views.xml @@ -0,0 +1,80 @@ + + + + + + zoo.keeper.speciality.form.view + zoo.keeper.speciality + +
+ +
+
+ + + + + + + + + + + + + + + + + +
+ + + +
+
+ + + + zoo.keeper.speciality.list.view + zoo.keeper.speciality + + + + + + + + + + + + Specialities + zoo.keeper.speciality + list,form + +

+ Add a new Speciality +

+

+ Create keeper specialities like Reptile Care, Mammal Care, etc. +

+
+
+ + + + +
+
\ No newline at end of file diff --git a/addons/zoo/views/zoo_keeper_views.xml b/addons/zoo/views/zoo_keeper_views.xml new file mode 100644 index 0000000..f97560e --- /dev/null +++ b/addons/zoo/views/zoo_keeper_views.xml @@ -0,0 +1,86 @@ + + + + + + hr.employee.form.zoo.inherit + hr.employee + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + hr.employee.search.zoo.inherit + hr.employee + + + + + + + + + + + + Keepers + hr.employee + list,form,kanban + [('is_zoo_keeper', '=', True)] + {'default_is_zoo_keeper': True} + +

+ Add a new Zoo Keeper +

+

+ Manage keeper profiles, specialities, and certifications. +

+
+
+ + + + + + + + +
+
\ No newline at end of file diff --git a/addons/zoo_plus/__manifest__.py b/addons/zoo_plus/__manifest__.py index cd46409..2183939 100644 --- a/addons/zoo_plus/__manifest__.py +++ b/addons/zoo_plus/__manifest__.py @@ -8,10 +8,18 @@ 'version': '0.1', 'depends': [ 'zoo', # <-- depends on zoo (parent - Folder name) addon + 'point_of_sale', # <-- depends on point_of_sale addon ], 'data': [ 'security/ir.model.access.csv', ], + + 'assets': { + 'point_of_sale._assets_pos': [ + 'zoo_plus/static/src/xml/product_card_name_template.xml', + 'zoo_plus/static/src/xml/product_price.xml', + ], + }, 'demo': [], 'css': [], # 'qweb': ['static/src/xml/*.xml'], diff --git a/addons/zoo_plus/static/src/xml/product_card_name_template.xml b/addons/zoo_plus/static/src/xml/product_card_name_template.xml new file mode 100644 index 0000000..bf14b0b --- /dev/null +++ b/addons/zoo_plus/static/src/xml/product_card_name_template.xml @@ -0,0 +1,11 @@ + + + + + font-family: "Cambria"; + font-weight: 600; + font-size: 120%; + color: #2563eb; + + + \ No newline at end of file diff --git a/addons/zoo_plus/static/src/xml/product_price.xml b/addons/zoo_plus/static/src/xml/product_price.xml new file mode 100644 index 0000000..f295bdd --- /dev/null +++ b/addons/zoo_plus/static/src/xml/product_price.xml @@ -0,0 +1,20 @@ + + + + + font-family: "Aptos"; + font-weight: 600; + font-size: 120%; + color: #6711d6ff; + + + + + + font-weight: bold; + text-decoration: underline; + color: #7618f1ff; + + + + \ No newline at end of file