Sfoglia il codice sorgente

feat: Implement standard Odoo date filter like Sales module

- Add date field to hr.efficiency model for standard date filtering
- Replace custom date filters with standard Odoo date filter
- Configure filter to show 5 months (2 previous + current + 2 next)
- Set current month as default selection
- Fix missing calculation_date field in model and views
- Update action context to apply date filter by default
root 5 mesi fa
parent
commit
308738ac7c

+ 26 - 8
hr_efficiency/models/hr_efficiency.py

@@ -19,17 +19,20 @@ class HrEfficiency(models.Model):
     _rec_name = 'display_name'
     _active_name = 'active'
 
-    active = fields.Boolean('Active', default=True, help='Technical field to archive old records')
-    month_year = fields.Char('Month Year', required=True, index=True, help="Format: YYYY-MM")
-    employee_id = fields.Many2one('hr.employee', 'Employee', required=True, index=True, domain=[('employee_type', '=', 'employee')])
-    company_id = fields.Many2one('res.company', 'Company', required=True, default=lambda self: self.env.company)
+    # Basic fields
+    name = fields.Char('Name', compute='_compute_display_name', store=True)
+    employee_id = fields.Many2one('hr.employee', 'Employee', required=True, domain=[('employee_type', '=', 'employee')])
+    month_year = fields.Char('Month Year', required=True, help="Format: YYYY-MM (e.g., 2024-08)")
+    date = fields.Date('Date', compute='_compute_date', store=True, help="Date field for standard Odoo date filters")
+    company_id = fields.Many2one('res.company', 'Company', default=lambda self: self.env.company)
+    active = fields.Boolean('Active', default=True)
     calculation_date = fields.Datetime('Calculation Date', default=fields.Datetime.now, help='When this calculation was performed')
     
-    # Available hours (considering holidays and time off)
-    available_hours = fields.Float('Available Hours', digits=(10, 2), help="Total available hours considering holidays and time off")
+    # Available hours (what employee should work)
+    available_hours = fields.Float('Available Hours', digits=(10, 2), help="Total hours employee should work in the month")
     
-    # Planned hours
-    planned_hours = fields.Float('Planned Hours', digits=(10, 2), help="Total hours planned in planning module")
+    # Planned hours (what was planned)
+    planned_hours = fields.Float('Planned Hours', digits=(10, 2), help="Total hours planned for the month")
     planned_billable_hours = fields.Float('Planned Billable Hours', digits=(10, 2), help="Hours planned on billable projects")
     planned_non_billable_hours = fields.Float('Planned Non-Billable Hours', digits=(10, 2), help="Hours planned on non-billable projects")
     
@@ -53,6 +56,21 @@ class HrEfficiency(models.Model):
     # Note: Removed unique constraint to allow historical tracking
     # Multiple records can exist for the same employee and month
 
+    @api.depends('month_year')
+    def _compute_date(self):
+        """
+        Compute date field from month_year for standard Odoo date filters
+        """
+        for record in self:
+            if record.month_year:
+                try:
+                    year, month = record.month_year.split('-')
+                    record.date = date(int(year), int(month), 1)
+                except (ValueError, AttributeError):
+                    record.date = False
+            else:
+                record.date = False
+
     @api.depends('actual_billable_hours', 'actual_non_billable_hours')
     def _compute_total_actual_hours(self):
         for record in self:

+ 11 - 27
hr_efficiency/views/hr_efficiency_views.xml

@@ -19,10 +19,10 @@
                     <field name="actual_non_billable_hours" sum="Total Actual Non-Billable"/>
                     <field name="total_actual_hours" sum="Total Actual"/>
                     <field name="expected_hours_to_date" sum="Total Expected"/>
-                                         <field name="overall_efficiency_display" widget="badge"
-                            decoration-danger="overall_efficiency_display == '0.00' or overall_efficiency &lt; 80"
-                            decoration-success="overall_efficiency >= 90"
-                            decoration-warning="overall_efficiency >= 80 and overall_efficiency &lt; 90"/>
+                    <field name="overall_efficiency_display" widget="badge"
+                           decoration-danger="overall_efficiency_display == '0.00' or overall_efficiency &lt; 80"
+                           decoration-success="overall_efficiency >= 90"
+                           decoration-warning="overall_efficiency >= 80 and overall_efficiency &lt; 90"/>
                 </list>
             </field>
         </record>
@@ -91,33 +91,17 @@
                     <field name="month_year"/>
                     <field name="company_id" groups="base.group_multi_company"/>
                     
-                                            <!-- Filtros de indicadores -->
-                        <filter string="High Overall Efficiency" name="high_overall_efficiency" domain="[('overall_efficiency', '>=', 90)]"/>
+                    <!-- Filtros de indicadores -->
+                    <filter string="High Overall Efficiency" name="high_overall_efficiency" domain="[('overall_efficiency', '>=', 90)]"/>
                     
                     <!-- Filtros de tipo de proyecto -->
                     <separator/>
                     <filter string="Proyectos Facturables" name="billable_projects" domain="[('planned_billable_hours', '>', 0)]"/>
                     <filter string="Proyectos No Facturables" name="non_billable_projects" domain="[('planned_non_billable_hours', '>', 0)]"/>
                     
-                                            <!-- Filtros de fecha dinámicos -->
-                        <separator/>
-                        <filter string="2 Meses Atrás" name="two_months_ago" domain="[('month_year', '=', (context_today() - relativedelta(months=2)).strftime('%Y-%m'))]"/>
-                        <filter string="Mes Anterior" name="last_month" domain="[('month_year', '=', (context_today() - relativedelta(months=1)).strftime('%Y-%m'))]"/>
-                        <filter string="Mes Actual" name="current_month" domain="[('month_year', '=', context_today().strftime('%Y-%m'))]"/>
-                        <filter string="Próximo Mes" name="next_month" domain="[('month_year', '=', (context_today() + relativedelta(months=1)).strftime('%Y-%m'))]"/>
-                        <filter string="2 Meses Adelante" name="two_months_ahead" domain="[('month_year', '=', (context_today() + relativedelta(months=2)).strftime('%Y-%m'))]"/>
-                        
-                        <!-- Filtros de trimestres dinámicos -->
-                        <separator/>
-                        <filter string="Trimestre Actual" name="current_quarter" domain="[('month_year', 'in', [(context_today() + relativedelta(month=((context_today().month-1)//3)*3+1, day=1)).strftime('%Y-%m'), (context_today() + relativedelta(month=((context_today().month-1)//3)*3+2, day=1)).strftime('%Y-%m'), (context_today() + relativedelta(month=((context_today().month-1)//3)*3+3, day=1)).strftime('%Y-%m')])]"/>
-                        <filter string="Trimestre Anterior" name="last_quarter" domain="[('month_year', 'in', [(context_today() + relativedelta(months=-3, month=((context_today().month-1)//3)*3+1, day=1)).strftime('%Y-%m'), (context_today() + relativedelta(months=-3, month=((context_today().month-1)//3)*3+2, day=1)).strftime('%Y-%m'), (context_today() + relativedelta(months=-3, month=((context_today().month-1)//3)*3+3, day=1)).strftime('%Y-%m')])]"/>
-                        <filter string="Próximo Trimestre" name="next_quarter" domain="[('month_year', 'in', [(context_today() + relativedelta(months=3, month=((context_today().month-1)//3)*3+1, day=1)).strftime('%Y-%m'), (context_today() + relativedelta(months=3, month=((context_today().month-1)//3)*3+2, day=1)).strftime('%Y-%m'), (context_today() + relativedelta(months=3, month=((context_today().month-1)//3)*3+3, day=1)).strftime('%Y-%m')])]"/>
-                        
-                        <!-- Filtros de años dinámicos -->
-                        <separator/>
-                        <filter string="Año Anterior" name="last_year" domain="[('month_year', 'like', (context_today() - relativedelta(years=1)).strftime('%Y-'))]"/>
-                        <filter string="Año Actual" name="current_year" domain="[('month_year', 'like', context_today().strftime('%Y-'))]"/>
-                        <filter string="Próximo Año" name="next_year" domain="[('month_year', 'like', (context_today() + relativedelta(years=1)).strftime('%Y-'))]"/>
+                    <!-- Filtro de fecha como ventas -->
+                    <separator/>
+                    <filter name="filter_date" date="date" default_period="month" start_month="-2" end_month="2"/>
                     
                     <!-- Filtro de archivado -->
                     <separator/>
@@ -126,7 +110,7 @@
                     
                     <group expand="0" string="Group By">
                         <filter string="Employee" name="group_employee" context="{'group_by': 'employee_id'}"/>
-                        <filter string="Month" name="group_month" context="{'group_by': 'month_year'}"/>
+                        <filter string="Month" name="group_month" context="{'group_by': 'date:month'}"/>
                         <filter string="Company" name="group_company" context="{'group_by': 'company_id'}" groups="base.group_multi_company"/>
                     </group>
                 </search>
@@ -140,7 +124,7 @@
             <field name="view_mode">list,form</field>
             <field name="view_id" ref="view_hr_efficiency_list_inherited"/>
             <field name="search_view_id" ref="view_hr_efficiency_search"/>
-            <field name="context">{'search_default_current_month': 1}</field>
+            <field name="context">{'search_default_filter_date': 1}</field>
             <field name="help" type="html">
                 <p class="o_view_nocontent_empty_folder">
                     No efficiency records found!