mariomolinos

Forecasting Time Off 4

Aug 19th, 2021
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.04 KB | None | 0 0
  1. holiday_project_id = 1079
  2. holiday_task_id = 36181
  3. automation_start_date = datetime.datetime(2021, 1, 1,00) #Establecemos una fecha inicial para la creación de planning-shifts
  4.  
  5. allRecords = env['hr.leave'].search(['&',('request_date_from','>=',automation_start_date),('state',"in",['confirm', 'validate1', 'validate'])]) #Obtenemos todas las leaves de leaves Confirmados, aprobados o validados(no en draft o refused) con la fecha inicial igual o mayor que start
  6.  
  7. #PRIMERO BORRA LOS PLANNING SLOTS DEL PROYECTO DE VACACIONES.
  8. forecasts = env['planning.slot'].search(['&',('project_id',"=",holiday_project_id),('start_datetime','>=',automation_start_date)]) #todas las planning slots del proyecto vacaciones que empiecen después de la fecha consignada
  9. for f in forecasts: #para cada planning shift entre todas las que cumplan la condición de la linea anterior:
  10.     f.unlink() #borrar
  11.  
  12. #CREAR LOS PLANNING SLOTS
  13. for record in allRecords: #para cada registro entre todos los registros que cumplan la condición de la linea 14:
  14.     start = record.request_date_from       #Obtengo el campo date start de Time Off
  15.    
  16.     tz_user = record.employee_id.tz #obtengo la timezone del empleado
  17.     tz_user_str = timezone(str(tz_user)) #le doy formato string
  18.     utc = timezone("utc") #obtengo la timezone utc
  19.    
  20.     start_no_timezone = datetime.datetime(start.year, start.month, start.day, 9) #doy formato al campo start, y le asigno 9 a las horas
  21.     start_tz_user_str = tz_user_str.localize(start_no_timezone) #asigno timezone Europa/Madrid al campo start_no_timezone
  22.     start_utc = utc.localize(start_no_timezone)#asigno timezone utc al campo start_no_timezone (para poder tener dos campos naive)
  23.     diff = start_utc - start_tz_user_str #obtengo la diferencia entre start_utc y start_europe
  24.     diff_hours = diff.seconds // 3600 #obtengo la diferencia en horas en int del campo diff
  25.     start = datetime.datetime(start_no_timezone.year, start_no_timezone.month, start_no_timezone.day, 9 - diff_hours)
  26.     end = record.request_date_to           #Obtengo el campo date end de Time Off
  27.     #end = datetime.datetime.strtime(str(end), DATETIME_FORMAT) + datetime.timedelta(hours=17)
  28.     end_no_timezone = datetime.datetime(end.year, end.month, end.day,17) #Doy formato al campo end, y le asigno 17 a las horas
  29.     end_tz_user_str = tz_user_str.localize(end_no_timezone) #asigno timezone Europa/Madrid al campo start_no_timezone
  30.     end_utc = utc.localize(end_no_timezone)#asigno timezone utc al campo start_no_timezone (para poder tener dos campos naive)
  31.     diff1 = end_utc - end_tz_user_str #obtengo la diferencia entre start_utc y start_europe
  32.     diff1_hours = diff1.seconds // 3600 #obtengo la diferencia en horas en int del campo diff
  33.     end = datetime.datetime(end.year, end.month, end.day,17 - diff1_hours)
  34.    
  35.     employee = record.employee_id.id       #Obtengo el campo Employee de Time Off
  36.  
  37.     if start.month == end.month and start.year == end.year: #el slot solo ocupa un mes
  38.         forecast = env['planning.slot'].create({'employee_id': employee,'project_id':holiday_project_id, 'task_id':holiday_task_id, 'start_datetime':start, 'end_datetime':end}) #Crea una nueva planning shift con los siguientes datos.
  39.     else:
  40.         m = (((end.year - start.year) - 1) * 12) + 12 - start.month + 1 + end.month
  41.  
  42.         for i in range(1,m+1):
  43.             idate_no_timezone = datetime.datetime(start.year + (start.month + i -2 )//12, (start.month + i-2) % 12 + 1 , 1, 9) #calcula el primer día del mes en curso y fija las 9:00am
  44.             #2 1983+ (5+2-1)//12,
  45.             idate_tz_user_str = tz_user_str.localize(idate_no_timezone) #asigno timezone Europa/Madrid al campo idate_no_timezone
  46.             idate_utc = utc.localize(idate_no_timezone)#asigno timezone utc al campo idate_no_timezone (para poder tener dos campos naive)
  47.             diff2 = idate_utc - idate_tz_user_str #obtengo la diferencia entre idate_utc y idate_europe
  48.             diff2_hours = diff2.seconds // 3600 #obtengo la diferencia en horas en int del campo diff
  49.             idate = datetime.datetime(start.year + (start.month + i -2 )//12, (start.month + i-2) % 12 + 1 , 1, 9 - diff2_hours)
  50.  
  51.             if i == 1:
  52.                 #primer slot
  53.                 istart = start #9-4-1983
  54.                 # get close to the end of the month for any day, and add 4 days 'over'
  55.                 next_month = istart.replace(day=28) + datetime.timedelta(days=4) #28-4-1983 + 4 = 2-5-1983
  56.                 # subtract the number of remaining 'overage' days to get last day of current month, or said programattically said, the previous day of the first of next month
  57.                 iend = next_month - datetime.timedelta(days=next_month.day) #30-4-1983    
  58.                 iend_no_timezone = datetime.datetime(iend.year,iend.month,iend.day,17) #establece la hora del final del turno
  59.                 iend_tz_user_str = tz_user_str.localize(iend_no_timezone) #asigno timezone Europa/Madrid al campo idate_no_timezone
  60.                 iend_utc = utc.localize(iend_no_timezone)#asigno timezone utc al campo idate_no_timezone (para poder tener dos campos naive)
  61.                 diff3 = iend_utc - iend_tz_user_str #obtengo la diferencia entre idate_utc y idate_europe
  62.                 diff3_hours = diff3.seconds // 3600 #obtengo la diferencia en horas en int del campo diff  
  63.                 iend = datetime.datetime(iend.year,iend.month,iend.day,17 - diff3_hours) #establece la hora del final del turno
  64.             elif i == m:
  65.                 #último slot
  66.                 istart = idate
  67.                 iend = end                
  68.             else:
  69.                 #middle slot
  70.                 istart = idate
  71.                 # get close to the end of the month for any day, and add 4 days 'over'
  72.                 next_month = idate.replace(day=28) + datetime.timedelta(days=4) #28-4-1983 + 4 = 2-5-1983
  73.                 # subtract the number of remaining 'overage' days to get last day of current month, or said programattically said, the previous day of the first of next month
  74.                 iend = next_month - datetime.timedelta(days=next_month.day) #30-4-1983    
  75.                 iend_no_timezone = datetime.datetime(iend.year,iend.month,iend.day,17) #establece la hora del final del turno
  76.                 iend_tz_user_str = tz_user_str.localize(iend_no_timezone) #asigno timezone Europa/Madrid al campo idate_no_timezone
  77.                 iend_utc = utc.localize(iend_no_timezone)#asigno timezone utc al campo idate_no_timezone (para poder tener dos campos naive)
  78.                 diff4 = iend_utc - iend_tz_user_str #obtengo la diferencia entre idate_utc y idate_europe
  79.                 diff4_hours = diff4.seconds // 3600 #obtengo la diferencia en horas en int del campo diff  
  80.                 iend = datetime.datetime(iend.year,iend.month,iend.day,17 - diff4_hours) #establece la hora del final del turno
  81.             forecast = env['planning.slot'].create({'employee_id': employee,'project_id':holiday_project_id, 'task_id':holiday_task_id, 'start_datetime':istart, 'end_datetime':iend}) #Crea una nueva planning shift con los siguientes datos.
  82.  
  83.            
Add Comment
Please, Sign In to add comment