mariomolinos

Forecasting Time Off 5

Aug 21st, 2021
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.52 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 = timezone(str(tz_user)) #le doy formato string
  18.     utc = timezone("utc") #obtengo la timezone utc
  19.    
  20.     start = 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.localize(start) #lo localizo a la zona del usuario
  22.     start = start.astimezone(utc) #lo convierto a UTC
  23.     #start = start.replace(tzinfo = None) #lo hago naive, si esto no funciona, prueba lo siguiente:
  24.     start = datetime.datetime(start.year, start.month, start.day, start.hour)
  25.  
  26.     #start_tz_user = tz_user.localize(start_no_timezone) #asigno timezone Europa/Madrid al campo start_no_timezone
  27.     #start_utc = utc.localize(start_no_timezone)#asigno timezone utc al campo start_no_timezone (para poder tener dos campos naive)
  28.     #diff = start_utc - start_tz_user #obtengo la diferencia entre start_utc y start_europe
  29.     #diff_hours = diff.seconds // 3600 #obtengo la diferencia en horas en int del campo diff
  30.     #start = datetime.datetime(start_no_timezone.year, start_no_timezone.month, start_no_timezone.day, 9 - diff_hours)
  31.     end = record.request_date_to           #Obtengo el campo date end de Time Off
  32.     #end = datetime.datetime.strtime(str(end), DATETIME_FORMAT) + datetime.timedelta(hours=17)
  33.     end = datetime.datetime(end.year, end.month, end.day,17) #Doy formato al campo end, y le asigno 17 a las horas
  34.     end = tz_user.localize(end) #lo localizo a la zona del usuario
  35.     end = end.astimezone(utc) #lo convierto a UTC
  36.     #end = end.replace(tzinfo = None) #lo hago naive, si esto no funciona, prueba lo siguiente:
  37.     end = datetime.datetime(end.year, end.month, end.day, end.hour)
  38.     #end_tz_user = tz_user.localize(end_no_timezone) #asigno timezone Europa/Madrid al campo start_no_timezone
  39.     #end_utc = utc.localize(end_no_timezone)#asigno timezone utc al campo start_no_timezone (para poder tener dos campos naive)
  40.     #diff1 = end_utc - end_tz_user #obtengo la diferencia entre start_utc y start_europe
  41.     #diff1_hours = diff1.seconds // 3600 #obtengo la diferencia en horas en int del campo diff
  42.     #end = datetime.datetime(end.year, end.month, end.day,17 - diff1_hours)
  43.    
  44.     employee = record.employee_id.id       #Obtengo el campo Employee de Time Off
  45.  
  46.     if start.month == end.month and start.year == end.year: #el slot solo ocupa un mes
  47.         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.
  48.     else:
  49.         m = (((end.year - start.year) - 1) * 12) + 12 - start.month + 1 + end.month
  50.  
  51.         for i in range(1,m+1):
  52.             idate = 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
  53.             #2 1983+ (5+2-1)//12,
  54.             idate = tz_user.localize(idate) #lo localizo a la zona del usuario
  55.             idate = idate.astimezone(utc) #lo convierto a UTC
  56.             #idate = idate.replace(tzinfo = None) #lo hago naive, si esto no funciona, prueba lo siguiente:
  57.             idate = datetime.datetime(idate.year, idate.month, idate.day, idate.hour)
  58.             #idate_tz_user = tz_user.localize(idate_no_timezone) #asigno timezone Europa/Madrid al campo idate_no_timezone
  59.             #idate_utc = utc.localize(idate_no_timezone)#asigno timezone utc al campo idate_no_timezone (para poder tener dos campos naive)
  60.             #diff2 = idate_utc - idate_tz_user #obtengo la diferencia entre idate_utc y idate_europe
  61.             #diff2_hours = diff2.seconds // 3600 #obtengo la diferencia en horas en int del campo diff
  62.             #idate = datetime.datetime(start.year + (start.month + i -2 )//12, (start.month + i-2) % 12 + 1 , 1, 9 - diff2_hours)
  63.  
  64.             if i == 1:
  65.                 #primer slot
  66.                 istart = start #9-4-1983
  67.                 # get close to the end of the month for any day, and add 4 days 'over'
  68.                 next_month = istart.replace(day=28) + datetime.timedelta(days=4) #28-4-1983 + 4 = 2-5-1983
  69.                 # 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
  70.                 iend = next_month - datetime.timedelta(days=next_month.day) #30-4-1983    
  71.                 iend = datetime.datetime(iend.year,iend.month,iend.day,17) #establece la hora del final del turno
  72.                 iend = tz_user.localize(iend) #lo localizo a la zona del usuario
  73.                 iend = iend.astimezone(utc) #lo convierto a UTC
  74.                 #iend = iend.replace(tzinfo = None) #lo hago naive, si esto no funciona, prueba lo siguiente:
  75.                 iend = datetime.datetime(iend.year, iend.month, iend.day, iend.hour)
  76.                 #iend_tz_user = tz_user.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.                 #diff3 = iend_utc - iend_tz_user #obtengo la diferencia entre idate_utc y idate_europe
  79.                 #diff3_hours = diff3.seconds // 3600 #obtengo la diferencia en horas en int del campo diff  
  80.                 #iend = datetime.datetime(iend.year,iend.month,iend.day,17 - diff3_hours) #establece la hora del final del turno
  81.             elif i == m:
  82.                 #último slot
  83.                 istart = idate
  84.                 iend = end                
  85.             else:
  86.                 #middle slot
  87.                 istart = idate
  88.                 # get close to the end of the month for any day, and add 4 days 'over'
  89.                 next_month = idate.replace(day=28) + datetime.timedelta(days=4) #28-4-1983 + 4 = 2-5-1983
  90.                 # 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
  91.                 iend = next_month - datetime.timedelta(days=next_month.day) #30-4-1983    
  92.                 iend = datetime.datetime(iend.year,iend.month,iend.day,17) #establece la hora del final del turno
  93.                 iend = tz_user.localize(iend) #lo localizo a la zona del usuario
  94.                 iend = iend.astimezone(utc) #lo convierto a UTC
  95.                 #iend = iend.replace(tzinfo = None) #lo hago naive, si esto no funciona, prueba lo siguiente:
  96.                 iend = datetime.datetime(iend.year, iend.month, iend.day, iend.hour)
  97.                 #iend_tz_user = tz_user.localize(iend_no_timezone) #asigno timezone Europa/Madrid al campo idate_no_timezone
  98.                 #iend_utc = utc.localize(iend_no_timezone)#asigno timezone utc al campo idate_no_timezone (para poder tener dos campos naive)
  99.                 #diff4 = iend_utc - iend_tz_user #obtengo la diferencia entre idate_utc y idate_europe
  100.                 #diff4_hours = diff4.seconds // 3600 #obtengo la diferencia en horas en int del campo diff  
  101.                 #iend = datetime.datetime(iend.year,iend.month,iend.day,17 - diff4_hours) #establece la hora del final del turno
  102.             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.
  103.  
Add Comment
Please, Sign In to add comment