Este repositorio centraliza las operaciones relacionadas con el modelo CandidatoOferta en Matchify, proporcionando funciones para gestionar las candidaturas a ofertas de empleo, incluyendo el conteo de aplicaciones y la verificación de estado.

import CandidatoOferta from '../models/CandidatoOferta.js';
import Empresa from "../models/Empresa.js";
import OfertaEmpleo from "../models/OfertaEmpleo.js";
import User from "../models/User.js";

// Buscar todas las candidaturas por empresa
export const findAllCandidatosByEmpresa = async (empresaId) => {
    return await CandidatoOferta.findAll({
        include: [
            {
                model: OfertaEmpleo,
                as: 'ofertaEmpleo',
                where: { empresaId },
            },
            {
                model: User,
                as: 'candidato',
                attributes: ['id', 'username', 'email']
            }
        ]
    });
};

// Buscar un candidato por su ID
export const findCandidatoById = async (candidatoId) => {
    return await CandidatoOferta.findByPk(candidatoId);
};

// Actualizar el estado de un candidato
export const updateCandidatoStatus = async (candidatoId, estado) => {
    const candidato = await findCandidatoById(candidatoId);
    if (!candidato) {
        throw new Error('Candidato no encontrado');
    }
    candidato.estado = estado;
    await candidato.save();
    return candidato;
};

// Verificar si el usuario ya ha aplicado a una oferta
export const checkApplication = async (usuarioId, ofertaEmpleoId) => {
    return await CandidatoOferta.findOne({
        where: { usuarioId, ofertaEmpleoId },
    });
};

// Aplicar a una oferta de empleo
export const applyToJobOffer = async (usuarioId, ofertaEmpleoId) => {
    return await CandidatoOferta.create({
        usuarioId,
        ofertaEmpleoId,
        estado: 'pendiente',
    });
};

export const getApplicationCountsByStatusFromDB = async (usuarioId) => {
    try {
        console.log(`Obteniendo conteos para usuarioId: ${usuarioId}`);

        const countAceptadas = await CandidatoOferta.count({
            where: { usuarioId, estado: 'aceptada' }
        });

        const countRechazadas = await CandidatoOferta.count({
            where: { usuarioId, estado: 'rechazada' }
        });

        const countPendientes = await CandidatoOferta.count({
            where: { usuarioId, estado: 'pendiente' }
        });

        return [
            { estado: 'aceptada', cantidad: countAceptadas },
            { estado: 'rechazada', cantidad: countRechazadas },
            { estado: 'pendiente', cantidad: countPendientes },
        ];

    } catch (error) {
        console.error('Error al obtener los conteos de la base de datos:', error);
        throw new Error('Error al obtener los conteos de las solicitudes.');
    }
};

Explicación de cada función

  1. findAllCandidatosByEmpresa(empresaId):
  2. findCandidatoById(candidatoId):
  3. updateCandidatoStatus(candidatoId, estado):
  4. checkApplication(usuarioId, ofertaEmpleoId):
  5. applyToJobOffer(usuarioId, ofertaEmpleoId):
  6. getApplicationCountsByStatusFromDB(usuarioId):