0

Estoy comenzando mis estudios en Python y necesito hacer este código para mi clase.

Basicamente consiste en el registro de los trabajadores de una compañia para calcular su salario/sueldo, aplicando algunos descuentos y bonos/incentivos.

En la opción 4 del menu, debo imprimir todos los Rut/ID registrados con su respectivo sueldo final.

Necesito poner SueldoDescontado que esta en la funcion Def Calcular_Sueldo() dentro de la funcion Def Liquidaciones_Rut

Me dijeron que lo definiera como una Class y lo agregara al registro List[].

PD: si defino SueldoDescontado como global me imprime el mismo valor para todas las Rut/ID.

Espero alguien pueda ayudarme.

Aquie esta mi codigo en PasteBin

Lista = [] #<----- Array


Mess = ['enero', 'febrero', 'marzo', 'abril','mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre',
        'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre',
        'ENERO', 'FEBRERO', 'MARZO', 'ABRIL', 'MAYO', 'JUNIO', 'JULIO', 'AGOSTO', 'SEPTIEMBRE', 'OCTUBRE', 'NOVIEMBRE', 'DICIEMBRE']

Rank =  ['novato', 'experto', 'supervisor', 'administrativo',
         'Novato', 'Experto', 'Supervisor', 'Administrativo',
         'NOVATO', 'EXPERTO', 'SUPERVISOR', 'ADMINISTRATIVO']

SistemaSalud = ['a', 'b', 'c',
                'A', 'B', 'C']



class Trabajador: #Class <----
    Mes = '' 
    Año = 0
    Rut = ''
    Nombre = ''
    Categoria = ''
    DiasOff = 0
    AFP = ''
    SSalud = ''
    SueldoBruto = 0
    SueldoDescontado = 0

def Ingresar_Datos():
    Elementos = int(input('Ingrese cantidad de trabajadores que desea agregar: \n')) #<--- How many people do you want to add
    for Trabajadores in range(Elementos):
        dato = Trabajador()

        while True:
            Nombre = input("Ingrese un nombre: ") #<--- Name
            if vacio(Nombre):
                print ('No puede dejar el campo vacio')
            else:
                dato.Nombre = Nombre
                break

        while True:
            Rut = input('Ingrese Rut: ') # <---- ID Number
            if vacio(Rut):
                print ('No puede dejar el campo vacio')
            else:
                dato.Rut = Rut
                break

        while True:
            Mes = input('Ingrese mes: ') # <---- Month when start at work
            if vacio(Mes):
                print ('No puede dejar el campo vacio')
            elif Mes in Mess:
                dato.Mes = Mes
                break
            else:
                print('Mes invalido')


        while True:
            Año = input('Ingrese año: ') # <---- Year when start at work
            if vacio(Año):
                print ('No puede dejar el campo vacio')
            else:
                dato.Año = Año
                break

        while True:
            AFP = input('Ingrese AFP: ') # <---- NVM just a company name can be put here, not relevant
            if vacio(AFP):
                print ('No puede dejar el campo vacio')
            else:
                dato.AFP = AFP
                break

        while True:
            SSalud = input('Sistema de salud A B o C\nDigite opcion: ') # <---- System Health, Here is A, B or C, This make a discount%
            if vacio(SSalud):
                print ('No puede dejar el campo vacio')
            elif SSalud in SistemaSalud:
                dato.SSalud = SSalud
                break
            else:
                print ('::::::::::::::::::::ERROR Opcion Invalida::::::::::::::::::::')


        while True:
            Categoria = input('Categoria; Novato, Supervisor, Experto o Administrativo: ') # <---- Worker rank, Expert have a 2xBonus for 0 days off
            if vacio(Categoria):
                print ('No puede dejar el campo vacio')
            elif Categoria in Rank:
                dato.Categoria = Categoria
                break
            else:
                print ('::::::::::::::::::::ERROR Categoria invalida::::::::::::::::::::')


        while True:
                DiasOff = input('Ingrese cantidad de dias de ausencia: ') #<------ Days of absence, 0 days have a bonus$
                if dato.DiasOff < 0 or dato.DiasOff > 30:
                    print ('Dias de ausencia no puede ser negativo o mayor a 30')
                else:
                    dato.DiasOff = DiasOff
                    break


        while True:
            try:
                SueldoBruto = int(input('Ingrese sueldo bruto: ')) # <------- Gross Salary
                if dato.SueldoBruto < 0:
                    print ('El monto del sueldo bruto no puede ser negativo')
                else:
                    dato.SueldoBruto = SueldoBruto
                    break
            except ValueError:
                print('error')

        print("------------------------------------------------")
        Lista.append(dato)


def vacio(x):
    if x and x.strip():
        return False
    return True 


def Calcular_Sueldo():
    Bono = 50000 #<-------- Bonus for 0 Days of absence
    for Trabajadores in Lista:
        print('Nombre trabajador: ',Trabajadores.Nombre,'\n')

        if Trabajadores.DiasOff == '0' and Trabajadores.Categoria == ('experto') or Trabajadores.DiasOff == '0' and Trabajadores.Categoria == ('Experto') or Trabajadores.DiasOff == '0' and Trabajadores.Categoria == ('EXPERTO'):
            SueldoBono = Trabajadores.SueldoBruto + Bono*2 #<-------- There is if 0 days absence and rank experto, 2xBonus
            print('Sueldo bruto + Bono (Experto) por 0 faltas: ',SueldoBono)


        elif Trabajadores.DiasOff == '0': #<-------- Bonus for 0 Days of absence, nvm about rank here
            SueldoBono = Trabajadores.SueldoBruto + Bono
            print('Sueldo bruto + Bono por 0 faltas: ',SueldoBono)


        else:
            SueldoBono = Trabajadores.SueldoBruto #<-------- No bonus for days absence
            print('Tiene faltas/ausencia, no tiene derecho a Bono: ',SueldoBono)


        DctoAFP = SueldoBono - (SueldoBono * 0.1) #<-------- This makes a 10% descuento for AFP, the nvm'company name
        print('Sueldo bruto + Recorte del 10% por AFP ',Trabajadores.AFP,': ',DctoAFP)



        if Trabajadores.SSalud == 'a' or Trabajadores.SSalud == 'A': #<-------- If Sistem Health is A, make a 5,7% discount
            DctoSalud = (DctoAFP/100) * 5.7
            print('Recorte del sistema de salud A: ',DctoSalud)
            SueldoDescontado = DctoAFP - DctoSalud #<-------------------------- This Variable --------- !"#$"!#%!"#%!#"%"#$%$"#----------
            print('Total a pagar: ',SueldoDescontado)





        if Trabajadores.SSalud == 'b' or Trabajadores.SSalud == 'B': #<-------- If Sistem Health is B, make a 6.1% discount
            DctoSalud = (DctoAFP/100) * 6.1
            print('Recorte del sistema de salud B: ',DctoSalud)
            SueldoDescontado = DctoAFP - DctoSalud #<-------------------------- This Variable --------- !"#$"!#%!"#%!#"%"#$%$"#----------
            print('Total a pagar: ',SueldoDescontado)





        if Trabajadores.SSalud == 'c' or Trabajadores.SSalud == 'C': #<-------- If Sistem Health is C, make a 6.5% discount
            DctoSalud = (DctoAFP/100) * 6.5
            print('Recorte del sistema de salud C: ',DctoSalud)
            SueldoDescontado = DctoAFP - DctoSalud #<-------------------------- This Variable --------- !"#$"!#%!"#%!#"%"#$%$"#----------
            print('Total a pagar: ',SueldoDescontado)




    print('--------------------------------------')

def Liquidaciones_Rut(): #<------- Here i need to print all the ID's number's with his Final Salary (SueldoDescontado)
    for Trabajadores in Lista:
        print('Rut: ',Trabajadores.Rut,'Total a pagar: $',SueldoDescontado) #<----- To here --------- !"#$"!#%!"#%!#"%"#$%$"#----------




def Listar_Empleados(): #<------------------ Here just print the names of all workers
    for Trabajadores in Lista:
        print("Empleados registrados: ", Trabajadores.Nombre)






opcion = 7
while (opcion != 6):
    print(' ========== Administracion NovaVision ========== ')
    print('Menu')
    print('1.- Ingresar Datos') #<-------------------------- Enter Data
    print('2.- Calcular Sueldo') #<-------------------------- Calculate Salary
    print('3.- Listar Empleados') #<----------------------------- List employees (by his name)
    print('4.- Mostrar Liquidaciones por RUT') # <--------- List numbers ID with his Respective Salary
    print('5.- Salir')
    opcion = int(input('Ingrese su opcion: '))
    if (opcion == 1):
        Ingresar_Datos() 
    elif (opcion == 2):
        Calcular_Sueldo()
    elif (opcion == 3):
       Listar_Empleados()
    elif (opcion == 4):
        Liquidaciones_Rut()
    elif (opcion == 5):
        print('Saliendo .. ')
    else:
        print ('Opcion no valida')
Pikoh
  • 17,305
  • 9
  • 38
  • 54
iFabio
  • 25
  • 1
  • 4
  • 7

1 Answers1

1

Fabio, has hecho un gran trabajo dentro del alcance de tu aplicación y realmente me pregunto porque no has podido lograrlo, si lo que te falta es algo que hiciste en todas partes de tu script menos en SueldoDescontado.

De cualquier manera, la respuesta es la siguiente:

Lo único que te ha faltado hacer es guardar la variable SueldoDescontado en cada objeto Trabajadores de la lista que recorres cuando invocas la función Calcular_Sueldo(). Te hacía el comentario al principio, porque lo has hecho a lo largo de todo tu script, pero por alguna razón en esta parte lo has olvidado. Tendría que quedar algo así: (solo pondré las partes del código que necesitan cambios)

1.Cambios en la función Calcular_Sueldo()

 if Trabajadores.SSalud == 'a' or Trabajadores.SSalud == 'A': 
        DctoSalud = (DctoAFP/100) * 5.7
        print('Recorte del sistema de salud A: ',DctoSalud)
        Trabajadores.SueldoDescontado = DctoAFP - DctoSalud
        #SueldoDescontado = DctoAFP - DctoSalud 
        print('Total a pagar: ',Trabajadores.SueldoDescontado)

 if Trabajadores.SSalud == 'b' or Trabajadores.SSalud == 'B': 
        DctoSalud = (DctoAFP/100) * 6.1
        print('Recorte del sistema de salud B: ',DctoSalud)
        Trabajadores.SueldoDescontado = DctoAFP - DctoSalud
        #SueldoDescontado = DctoAFP - DctoSalud 
        print('Total a pagar: ',Trabajadores.SueldoDescontado)

 if Trabajadores.SSalud == 'c' or Trabajadores.SSalud == 'C': 
        DctoSalud = (DctoAFP/100) * 6.5
        print('Recorte del sistema de salud C: ',DctoSalud)
        Trabajadores.SueldoDescontado = DctoAFP - DctoSalud
        #SueldoDescontado = DctoAFP - DctoSalud 
        print('Total a pagar: ',Trabajadores.SueldoDescontado)

Como puedes observar, hacemos referencia al objeto Trabajadores y a su propiedad SueldoDescontado, en vez de hacerlo solo a una variable como lo estabas haciendo antes (ver linea comentada). En la función print que sigue a continuación ya no hacemos referencia solo a la variable (como lo hacias antes) sino al objeto con su propiedad.

  1. Cambios en la funcion Liquidaciones_Rut()

    def Liquidaciones_Rut(): 
        for Trabajadores in Lista:
            print('Rut: ',Trabajadores.Rut,'Total a pagar: $',Trabajadores.SueldoDescontado) 
    

En este caso es aun mas evidente. En vez de intentar llamar a una variable SueldoDescontado que no ha sido declara en ninguna parte, llamamos al objeto que esta siendo iterado y obtenemos su propiedad SueldoDescontado que previamente hemos guardado en la función Calcular_Sueldo()

Eso deberia solucionar tu problema. Saludos.

Kenny Barrera
  • 2,075
  • 3
  • 22
  • 38
  • Muchas gracias amigo! No sabes lo bien que se siente leer tus palabras! Creeme que lo habia intentado, con un append al final y nada, poniendo dato = trabajador() entre lineas para guardar el dato alli y se me iba en un bucle infinito Tu correccion me a funcionado de maravilla!. Veo que aun cosas que me faltan por comprender, asi que seguire practicando! – iFabio Jul 09 '17 at 02:16
  • De nada Fabio. Que bueno que te ha servido mi respuesta y gracias por marcarla como aceptada. Sigue practicando y cuando te sientas en la capacidad contribuye a la comunidad respondiendo a otras preguntas. Saludos – Kenny Barrera Jul 09 '17 at 05:01