Saltar al contenido
Marcos Peña
Menú
  • Acerca de…
Menú

Control horario según normativa

Publicada el mayo 20, 2019mayo 20, 2019 por Marcos

Escenario

El domingo pasado entró en vigor en toda España la obligatoriedad para las empresas de registrar diariamente la jornada de trabajo de sus empleados. Para llevar el control, basta con mantener una hoja de cálculo en la que el trabajador refleje las horas de entrada y de salida, que ha de estar disponible en caso de una inspección de trabajo.

Problema

Por poco que sea, lleva tiempo mantener la hoja de cálculo, se nos puede olvidar y, es probable que, en muchos casos, siempre tengamos que rellenar los mismos datos.

Solución

¡Automatización! Para esta ocasión vamos a usar python, y el módulo xlwt para generar hojas de cálculo Excel:
Shell
1
$ pip3 install xlwt
Un primera versión, en la que se recorra un listado de empleados y cree un fichero por cada uno, sería:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
COMPANY_WORKERS = ['Freya', 'Aesir', 'Balder', 'Delling']
DESTINATION_FOLDER = '/tmp'
 
locale.setlocale(locale.LC_ALL, '')
now = datetime.datetime.now()
 
def run():
for worker in COMPANY_WORKERS:
workbook = Workbook()
# add_sheet is used to create sheet.
sheet = workbook.add_sheet('Hoja 1')
sheet.write(0, 1, 'NOMBRE EMPRESA: GAMCO S.L.')
sheet.write(3, 4, '{0} {1}'.format(get_month_name(now.month), now.year))
sheet.write(4, 0, 'NOMBRE TRABAJADOR: ' + worker )
sheet.write(5, 0, 'DIA')
sheet.write(5, 1, 'HORA ENTRADA')
sheet.write(5, 2, 'HORA SALIDA')
sheet.write(5, 3, 'TOTAL HORAS')
sheet.write(5, 4, 'FIRMA DEL TRABAJADOR')
dayrow = 7
num_days = calendar.monthrange(now.year, now.month)[1]
days = [datetime.date(now.year, now.month, day) for day in range(1, num_days + 1)]
for day in days:
sheet.write(dayrow, 0, str(day.day))
sheet.write(dayrow, 1, '09:00')
sheet.write(dayrow, 2, '17:00')
sheet.write(dayrow, 3, '8')
dayrow = dayrow + 1
workbook.save(DESTINATION_FOLDER + '/' + '{0}_{1}_{2}.xls'.format(worker, now.year, now.month))
 
def get_month_name(month_no):
    return locale.nl_langinfo(locale.__dict__["MON_" + str(month_no)])
 
if __name__ == '__main__':
    run()
Esta versión tiene un pero. Cuenta todos los días del año. Para que solo tenga en cuenta de lunes a viernes, habría que hacer una pequeña modificación:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
COMPANY_WORKERS = ['Freya', 'Aesir', 'Balder', 'Delling']
DESTINATION_FOLDER = '/tmp'
 
locale.setlocale(locale.LC_ALL, '')
now = datetime.datetime.now()
 
def run():
for worker in COMPANY_WORKERS:
workbook = Workbook()
# add_sheet is used to create sheet.
sheet = workbook.add_sheet('Hoja 1')
sheet.write(0, 1, 'NOMBRE EMPRESA: GAMCO S.L.')
sheet.write(3, 4, '{0} {1}'.format(get_month_name(now.month), now.year))
sheet.write(4, 0, 'NOMBRE TRABAJADOR: ' + worker )
sheet.write(5, 0, 'DIA')
sheet.write(5, 1, 'HORA ENTRADA')
sheet.write(5, 2, 'HORA SALIDA')
sheet.write(5, 3, 'TOTAL HORAS')
sheet.write(5, 4, 'FIRMA DEL TRABAJADOR')
        dayrow = 7
        day_of_month = datetime.datetime(year=now.year, month=now.month, day=1)
        actual_month = now.month
num_days = calendar.monthrange(now.year, now.month)[1]
        while day_of_month.month == actual_month:
            if not is_weekend(day_of_month):
                minutes = randint(0, 59)
                sheet.write(dayrow, 0, str(day_of_month.day))
                sheet.write(dayrow, 1, '{:02d}:{:02d}'.format(worker['start_hour'], minutes))
                sheet.write(dayrow, 2, '{:02d}:{:02d}'.format(worker['exit_hour'], minutes))
                sheet.write(dayrow, 3, '8')
                dayrow = dayrow + 1
            day_of_month = day_of_month + datetime.timedelta(days=1)
workbook.save(DESTINATION_FOLDER + '/' + '{0}_{1}_{2}.xls'.format(worker, now.year, now.month))
 
def is_weekend(date):
    return date.weekday() >= 5
 
def get_month_name(month_no):
    return locale.nl_langinfo(locale.__dict__["MON_" + str(month_no)])
 
if __name__ == '__main__':
    run()
Esto no deja de ser un script simple para ahorrar un poco de trabajo. Se podría mejorar añadiendo una desviación a los horarios de los trabajadores, personalizar sus horas de entrada y salida, tener en cuenta los días festivos nacionales y locales, posibilidad de guardar los ficheros en un recurso compartido… Si alquien estuviera interesado en alguna de estas características, no tiene más que pedirlo.

Deja una respuesta Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Artículos

  • abril 2022
  • marzo 2022
  • febrero 2022
  • enero 2022
  • diciembre 2021
  • noviembre 2021
  • octubre 2021
  • septiembre 2021
  • agosto 2021
  • julio 2021
  • junio 2021
  • mayo 2021
  • abril 2021
  • marzo 2021
  • febrero 2021
  • enero 2021
  • diciembre 2020
  • noviembre 2020
  • octubre 2020
  • septiembre 2020
  • agosto 2020
  • julio 2020
  • junio 2020
  • mayo 2020
  • abril 2020
  • marzo 2020
  • febrero 2020
  • enero 2020
  • diciembre 2019
  • noviembre 2019
  • octubre 2019
  • septiembre 2019
  • agosto 2019
  • julio 2019
  • junio 2019
  • mayo 2019
  • abril 2019
  • marzo 2019
  • febrero 2019
  • enero 2019
  • noviembre 2018
  • octubre 2018
  • julio 2016
  • mayo 2016
  • abril 2016
  • agosto 2015
  • febrero 2014
  • junio 2013
  • febrero 2013
  • noviembre 2012
  • octubre 2012
  • septiembre 2012
  • abril 2012
  • enero 2012

Categorías

  • Cómo
  • Consejos
  • Hacks
  • Sin sentido
  • Tutorial

Etiquetas

apache API aws cache Centos Codeigniter EAC firefox flash freebsd freenas gmail Google guacamole java Javascript jQuery kubuntu Linux mysql nas4free nginx php plesk postfix python react rtorrent Seguridad sftp sonata-admin spring spring-boot sql ssh ssl symfony symfony2 symfony4 thymeleaf ubuntu vnc wget windows wine

Entradas recientes

  • Confirmación antes de apagar
  • cURL error 60: SSL certificate problem: unable to get local issuer certificate
  • Oracle JDK 7 is NOT installed.
  • ssh: connect to host: Connection refused
  • Restringir acceso a un bucket de AWS s3 por IP

Comentarios recientes

  • Marcos en Deobbing flash
  • Irosales en Deobbing flash
  • Instalación certificado SSL de un vendedor – Marcos Peña en Instala un certificado SSL en tres pasos
  • gerMdz en Cómo instalar un certificado letsencrypt para un sitio gestionado por Cloudflare
  • Jose Olalla en Cómo ampliar el espacio en disco en 1and1

Archivos

  • abril 2022
  • marzo 2022
  • febrero 2022
  • enero 2022
  • diciembre 2021
  • noviembre 2021
  • octubre 2021
  • septiembre 2021
  • agosto 2021
  • julio 2021
  • junio 2021
  • mayo 2021
  • abril 2021
  • marzo 2021
  • febrero 2021
  • enero 2021
  • diciembre 2020
  • noviembre 2020
  • octubre 2020
  • septiembre 2020
  • agosto 2020
  • julio 2020
  • junio 2020
  • mayo 2020
  • abril 2020
  • marzo 2020
  • febrero 2020
  • enero 2020
  • diciembre 2019
  • noviembre 2019
  • octubre 2019
  • septiembre 2019
  • agosto 2019
  • julio 2019
  • junio 2019
  • mayo 2019
  • abril 2019
  • marzo 2019
  • febrero 2019
  • enero 2019
  • noviembre 2018
  • octubre 2018
  • julio 2016
  • mayo 2016
  • abril 2016
  • agosto 2015
  • febrero 2014
  • junio 2013
  • febrero 2013
  • noviembre 2012
  • octubre 2012
  • septiembre 2012
  • abril 2012
  • enero 2012

Categorías

  • Cómo
  • Consejos
  • Hacks
  • Sin sentido
  • Tutorial

Meta

  • Acceder
  • Feed de entradas
  • Feed de comentarios
  • WordPress.org
© 2022 Marcos Peña | Funciona con Minimalist Blog Tema para WordPress