Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
13 kB
2
Indexable
Never
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <sstream>
#include <algorithm>

using namespace std;

// Clase Empleado
class Empleado {
protected:
    string nombre;
    string apellido;
    string direccion;
    string fechaNacimiento;
    string sexo;

public:
    Empleado(const string& nombre, const string& apellido, const string& direccion, const string& fechaNacimiento, const string& sexo)
        : nombre(nombre), apellido(apellido), direccion(direccion), fechaNacimiento(fechaNacimiento), sexo(sexo) {}

    virtual ~Empleado() {}

    virtual string getRol() const = 0;
    virtual double getSueldo() const = 0;

    const string& getNombre() const {
        return nombre;
    }

    const string& getApellido() const {
        return apellido;
    }

    const string& getDireccion() const {
        return direccion;
    }

    const string& getFechaNacimiento() const {
        return fechaNacimiento;
    }

    const string& getSexo() const {
        return sexo;
    }

    virtual double calcularSalarioConDescuentos() const = 0;
};

// Clase Gerente
class Gerente : public Empleado {
private:
    static const double SUELDO_BASE;

public:
    Gerente(const string& nombre, const string& apellido, const string& direccion, const string& fechaNacimiento, const string& sexo)
        : Empleado(nombre, apellido, direccion, fechaNacimiento, sexo) {}

    string getRol() const override {
        return "Gerente";
    }

    double getSueldo() const override {
        return SUELDO_BASE;
    }

    double calcularSalarioConDescuentos() const override {
        double sueldo = getSueldo();
        double descuentoISSS = sueldo * 0.075;
        double descuentoAFP = sueldo * 0.0775;
        double salarioConDescuentos = sueldo - descuentoISSS - descuentoAFP;
        return salarioConDescuentos;
    }
};

const double Gerente::SUELDO_BASE = 5000.0;

// Clase JefeArea
class JefeArea : public Empleado {
private:
    static const double SUELDO_BASE;

public:
    JefeArea(const string& nombre, const string& apellido, const string& direccion, const string& fechaNacimiento, const string& sexo)
        : Empleado(nombre, apellido, direccion, fechaNacimiento, sexo) {}

    string getRol() const override {
        return "Jefe de Área";
    }

    double getSueldo() const override {
        return SUELDO_BASE;
    }

    double calcularSalarioConDescuentos() const override {
        double sueldo = getSueldo();
        double descuentoISSS = sueldo * 0.075;
        double descuentoAFP = sueldo * 0.0775;
        double salarioConDescuentos = sueldo - descuentoISSS - descuentoAFP;
        return salarioConDescuentos;
    }
};

const double JefeArea::SUELDO_BASE = 1500.0;

// Clase Supervisor
class Supervisor : public Empleado {
private:
    static const double SUELDO_BASE;

public:
    Supervisor(const string& nombre, const string& apellido, const string& direccion, const string& fechaNacimiento, const string& sexo)
        : Empleado(nombre, apellido, direccion, fechaNacimiento, sexo) {}

    string getRol() const override {
        return "Supervisor";
    }

    double getSueldo() const override {
        return SUELDO_BASE;
    }

    double calcularSalarioConDescuentos() const override {
        double sueldo = getSueldo();
        double descuentoISSS = sueldo * 0.075;
        double descuentoAFP = sueldo * 0.0775;
        double salarioConDescuentos = sueldo - descuentoISSS - descuentoAFP;
        return salarioConDescuentos;
    }
};

const double Supervisor::SUELDO_BASE = 750.0;

// Clase Tecnico
class Tecnico : public Empleado {
private:
    static const double SUELDO_BASE;

public:
    Tecnico(const string& nombre, const string& apellido, const string& direccion, const string& fechaNacimiento, const string& sexo)
        : Empleado(nombre, apellido, direccion, fechaNacimiento, sexo) {}

    string getRol() const override {
        return "Técnico";
    }

    double getSueldo() const override {
        return SUELDO_BASE;
    }

    double calcularSalarioConDescuentos() const override {
        double sueldo = getSueldo();
        double descuentoISSS = sueldo * 0.075;
        double descuentoAFP = sueldo * 0.0775;
        double salarioConDescuentos = sueldo - descuentoISSS - descuentoAFP;
        return salarioConDescuentos;
    }
};

const double Tecnico::SUELDO_BASE = 350.0;

// Clase ListaEmpleados
class ListaEmpleados {
private:
    vector<Empleado*> empleados;

public:
    auto begin() const { return empleados.begin(); }
    auto end() const { return empleados.end(); }


    ~ListaEmpleados() {
        for (Empleado* empleado : empleados) {
            delete empleado;
        }
    }

    void agregarEmpleado(Empleado* empleado) {
        empleados.push_back(empleado);
    }

    void ordenarPorApellido() {
        sort(empleados.begin(), empleados.end(), [](const Empleado* empleado1, const Empleado* empleado2) {
            return empleado1->getApellido() < empleado2->getApellido();
        });
    }

    void ordenarPorSueldo(bool ascendente) {
        sort(empleados.begin(), empleados.end(), [ascendente](const Empleado* empleado1, const Empleado* empleado2) {
            double sueldo1 = empleado1->calcularSalarioConDescuentos();
            double sueldo2 = empleado2->calcularSalarioConDescuentos();

            return ascendente ? sueldo1 < sueldo2 : sueldo1 > sueldo2;
        });
    }

    void mostrarCantidadPorRol() const {
        int gerentes = 0;
        int jefesArea = 0;
        int supervisores = 0;
        int tecnicos = 0;

        for (const Empleado* empleado : empleados) {
            if (dynamic_cast<const Gerente*>(empleado) != nullptr) {
                gerentes++;
            } else if (dynamic_cast<const JefeArea*>(empleado) != nullptr) {
                jefesArea++;
            } else if (dynamic_cast<const Supervisor*>(empleado) != nullptr) {
                supervisores++;
            } else if (dynamic_cast<const Tecnico*>(empleado) != nullptr) {
                tecnicos++;
            }
        }

        cout << "Cantidad de empleados por rol:" << endl;
        cout << "Gerentes: " << gerentes << endl;
        cout << "Jefes de Area: " << jefesArea << endl;
        cout << "Supervisores: " << supervisores << endl;
        cout << "Tecnicos: " << tecnicos << endl;
    }

    void imprimirLista() const {
        cout << "Lista de empleados:" << endl;
        for (const Empleado* empleado : empleados) {
            cout << "Nombre: " << empleado->getNombre() << " " << empleado->getApellido() << endl;
            cout << "Rol: " << empleado->getRol() << endl;
            cout << "Sueldo: $" << empleado->getSueldo() << endl;
            cout << "Salario con descuentos: $" << empleado->calcularSalarioConDescuentos() << endl;
            cout << "---------------------------" << endl;
        }
    }
};

// Funciones auxiliares
void mostrarMenu() {
    cout << "Menu de opciones:" << endl;
    cout << "1. Ordenar empleados por apellido" << endl;
    cout << "2. Ordenar empleados por sueldo" << endl;
    cout << "3. Mostrar cantidad de empleados por rol" << endl;
    cout << "4. Agregar nuevo empleado" << endl;
    cout << "5. Salir" << endl;
    cout << "Ingrese el número de la opción deseada: ";
}

void agregarEmpleadoPorConsola(ListaEmpleados& listaEmpleados) {
    cout << "Ingrese los datos del empleado:" << endl;
    string nombre, apellido, direccion, fechaNacimiento, sexo;
    int rol;

    cout << "Nombre: "<< endl;
    cin >> nombre;

    cout << "Apellido: "<< endl;
    cin >> apellido;

    cout << "Dirección: "<< endl;
    cin >> direccion;

    cout << "Fecha de Nacimiento: "<< endl;
    cin >> fechaNacimiento;

    cout << "Sexo: "<< endl;
    cin >> sexo;

    cout << "Rol (1: Gerente, 2: Jefe de Area, 3: Supervisor, 4: Tecnico): "<< endl;
    cin >> rol;

    

    Empleado* empleado = nullptr;

    switch (rol) {
        case 1:
            empleado = new Gerente(nombre, apellido, direccion, fechaNacimiento, sexo);
            break;
        case 2:
            empleado = new JefeArea(nombre, apellido, direccion, fechaNacimiento, sexo);
            break;
        case 3:
            empleado = new Supervisor(nombre, apellido, direccion, fechaNacimiento, sexo);
            break;
        case 4:
            empleado = new Tecnico(nombre, apellido, direccion, fechaNacimiento, sexo);
            break;
        default:
            cout << "Opcion invalida. No se agrego el empleado." << endl;
            return;
    }

    listaEmpleados.agregarEmpleado(empleado);
    cout << "Empleado agregado correctamente." << endl;
}

void escribirEmpleadosEnArchivo(const ListaEmpleados& listaEmpleados, const string& nombreArchivo) {
    ofstream archivo(nombreArchivo);

    if (!archivo) {
        cout << "Error al abrir el archivo." << endl;
        return;
    }

    for (const Empleado* empleado : listaEmpleados) {
        archivo << empleado->getRol() << "," << empleado->getNombre() << "," << empleado->getApellido() << ","
                << empleado->getDireccion() << "," << empleado->getFechaNacimiento() << "," << empleado->getSexo() << endl;
    }

    archivo.close();
    cout << "Empleados guardados en el archivo correctamente." << endl;
}

//Función para leer empleados
void leerEmpleadosDeArchivo(ListaEmpleados& listaEmpleados, const string& nombreArchivo) {
    ifstream archivo(nombreArchivo);

    if (!archivo) {
        cout << "Error al abrir el archivo." << endl;
        return;
    }

    string linea;
    while (getline(archivo, linea)) {
        stringstream ss(linea);
        string rol, nombre, apellido, direccion, fechaNacimiento, sexo;

        getline(ss, rol, ',');
        getline(ss, nombre, ',');
        getline(ss, apellido, ',');
        getline(ss, direccion, ',');
        getline(ss, fechaNacimiento, ',');
        getline(ss, sexo, ',');

        Empleado* empleado = nullptr;

        if (rol == "Gerente") {
            empleado = new Gerente(nombre, apellido, direccion, fechaNacimiento, sexo);
        } else if (rol == "Jefe de Area") {
            empleado = new JefeArea(nombre, apellido, direccion, fechaNacimiento, sexo);
        } else if (rol == "Supervisor") {
            empleado = new Supervisor(nombre, apellido, direccion, fechaNacimiento, sexo);
        } else if (rol == "Tecnico") {
            empleado = new Tecnico(nombre, apellido, direccion, fechaNacimiento, sexo);
        } else {
            cout << "Error al leer el archivo. Rol desconocido: " << rol << endl;
            continue;
        }

        listaEmpleados.agregarEmpleado(empleado);
    }

    archivo.close();
    cout << "Empleados cargados desde el archivo correctamente." << endl;
}

int main() {
    //Creando el archivo de texto "empleados.txt"
    //ofstream archivoSalida("empleados.txt");

    ListaEmpleados listaEmpleados;
    string nombreArchivo = "empleados.txt";

    leerEmpleadosDeArchivo(listaEmpleados, nombreArchivo);

    int opcion;
    do {
        mostrarMenu();
        cin >> opcion;

        switch (opcion) {
            case 1:
                listaEmpleados.ordenarPorApellido();
                listaEmpleados.imprimirLista();
                break;
            case 2:
                bool ascendente;
                cout << "Ordenar de menor a mayor (0) o de mayor a menor (1)? ";
                cin >> ascendente;
                listaEmpleados.ordenarPorSueldo(ascendente);
                listaEmpleados.imprimirLista();
                
                break;
            case 3:
                listaEmpleados.mostrarCantidadPorRol();
                break;
            case 4:
                agregarEmpleadoPorConsola(listaEmpleados);
                break;
            case 5:
                escribirEmpleadosEnArchivo(listaEmpleados, nombreArchivo);
                break;
            case 6:
                cout << "Vuelva pronto" << endl;
                break;
            default:
                cout << "Opcion invalida. Intente de nuevo." << endl;
                break;
        }

    } while (opcion != 6);

    return 0;
}