Explorar el Código

aplicacion m22_planning agrega columna real_working_days_count al modelo planning.slot y basado en el codigo de _compute_allocated_hours pone como fecha inicial el 1er día del mes de la fecha inicial del slot y fecha final el ultimo dia del mes de la fecha inicial

Roberto Pineda hace 1 año
padre
commit
f00a20a9f7

+ 1 - 0
m22_planning/__init__.py

@@ -0,0 +1 @@
+from . import models

+ 13 - 0
m22_planning/__manifest__.py

@@ -0,0 +1,13 @@
+{
+    'name': 'M22 Planning Extension',
+    'version': '1.0',
+    'category': 'Services/Planning',
+    'summary': 'Adds real working days count to planning slots',
+    'depends': ['planning'],
+    'data': [
+        'views/planning_slot_views.xml',
+    ],
+    'license': 'LGPL-3',
+    'installable': True,
+    'auto_install': False,
+}

BIN
m22_planning/__pycache__/__init__.cpython-38.pyc


+ 1 - 0
m22_planning/models/__init__.py

@@ -0,0 +1 @@
+from . import planning_slot

BIN
m22_planning/models/__pycache__/__init__.cpython-38.pyc


BIN
m22_planning/models/__pycache__/planning_slot.cpython-38.pyc


BIN
m22_planning/models/__pycache__/resource.cpython-38.pyc


+ 67 - 0
m22_planning/models/planning_slot.py

@@ -0,0 +1,67 @@
+import calendar
+from collections import defaultdict
+from datetime import date, datetime, timedelta, time
+from dateutil.relativedelta import relativedelta
+import logging
+import pytz
+import uuid
+from math import modf
+from random import randint
+
+from odoo import api, fields, models, _
+from odoo.addons.resource.models.resource import Intervals, sum_intervals, string_to_datetime
+from odoo.addons.resource.models.resource_mixin import timezone_datetime
+from odoo.exceptions import UserError, AccessError
+from odoo.osv import expression
+from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT, float_utils, format_datetime
+
+_logger = logging.getLogger(__name__)
+
+class PlanningSlot(models.Model):
+    _inherit = 'planning.slot'
+
+    real_working_days_count = fields.Float(
+        string='Real Working Days',
+        compute='_compute_real_working_days_count',
+        store=True,
+    )
+
+    @api.depends('start_datetime', 'end_datetime', 'resource_id')
+    def _compute_real_working_days_count(self):
+        slots_per_calendar = defaultdict(set)
+        planned_dates_per_calendar_id = defaultdict(lambda: (datetime.max, datetime.min))
+        for slot in self:
+            if not slot.employee_id:
+                slot.real_working_days_count = 0
+                continue
+            slots_per_calendar[slot.resource_id.calendar_id].add(slot.id)
+            datetime_begin, datetime_end = planned_dates_per_calendar_id[slot.resource_id.calendar_id.id]
+
+            start_datetime = slot.start_datetime
+            first_day_of_month = datetime(start_datetime.year, start_datetime.month, 1)
+            last_day = calendar.monthrange(start_datetime.year, start_datetime.month)[1]
+            last_day_of_month = datetime(start_datetime.year, start_datetime.month, last_day)
+
+            datetime_begin = min(datetime_begin, first_day_of_month)
+            datetime_end = max(datetime_end, last_day_of_month)
+            planned_dates_per_calendar_id[slot.resource_id.calendar_id.id] = datetime_begin, datetime_end
+        for calendar_slot, slot_ids in slots_per_calendar.items():
+            slots = self.env['planning.slot'].browse(list(slot_ids))
+            if not calendar_slot:
+                slots.real_working_days_count = 0
+                continue
+            datetime_begin, datetime_end = planned_dates_per_calendar_id[calendar_slot.id]
+            datetime_begin = timezone_datetime(datetime_begin)
+            datetime_end = timezone_datetime(datetime_end)
+            resources = slots.resource_id
+            day_total = calendar_slot._get_resources_day_total(datetime_begin, datetime_end, resources)
+            intervals = calendar_slot._work_intervals_batch(datetime_begin, datetime_end, resources)
+            for slot in slots:
+                slot.real_working_days_count = calendar_slot._get_days_data(
+                    intervals[slot.resource_id.id] & Intervals([(
+                        timezone_datetime(first_day_of_month),
+                        timezone_datetime(last_day_of_month),
+                        self.env['resource.calendar.attendance']
+                    )]),
+                    day_total[slot.resource_id.id]
+                )['days']

+ 13 - 0
m22_planning/views/planning_slot_views.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+    <record id="planning_view_pivot_inherit" model="ir.ui.view">
+        <field name="name">planning.slot.pivot.inherit</field>
+        <field name="model">planning.slot</field>
+        <field name="inherit_id" ref="planning.planning_view_pivot"/>
+        <field name="arch" type="xml">
+            <xpath expr="//field[@name='allocated_hours']" position="after">
+                <field name="real_working_days_count" type="measure"/>
+            </xpath>
+        </field>
+    </record>
+</odoo>