Services_DashBoardService.js

const path = require("path");
const config = require("../config");
const JsonResponse = require("../Controllers/JsonResponse");
const ConnectedUser = require("../database/dto/ConnectedUser");
const { request } = require("http");

/**
 * @memberof Myintranet.Services
 * @inheritDoc
 */
class DashBoardService {


    constructor(db) {
        this.db = db;

    }
    /**
     * @private
     * @param {*} request 
     * @returns {Object}
     */
    async getPrevDataSuperAdmin() {
        let { db } = this;
        let prevText, prevStats;
        let actMonth = new Date().getMonth() + 1;
        let actYear = new Date().getFullYear();
        let PrevSaisie = await db.PrevHistory.count({
            where: {
                nbJours: { [db.Sequelize.Op.not]: null },
                mounth: actMonth,
                year: actYear,


            }
        });
        let PrevSaisieNon = await db.PrevHistory.count({
            where: {
                nbJours: null,
                mounth: actMonth,
                year: actYear
            }
        });
        let HandredPrev = PrevSaisie + PrevSaisieNon;
        prevText = PrevSaisie + "/" + HandredPrev + " Prev Saisies"
        if (HandredPrev === 0) {
            prevStats = [100, 0];
        } else {
            let percentSaisiePrev = (PrevSaisie * 100) / HandredPrev;
            prevStats = [percentSaisiePrev, 100 - percentSaisiePrev];
        }
        return { prevText, prevStats }
    }



    /**
     * @private
     * @param {*} request 
     * @returns {Object}
     */
    async getPrevDataAdmin(request) {
        let { db } = this;
        let prevText, prevStats;
        let actMonth = new Date().getMonth() + 1;
        let actYear = new Date().getFullYear();
        
        let connectedUser = request.user;

        let consultantsIds = [];

        let admin = await db.User.findOne({
            where: { id: connectedUser.id },
            include: {
              model: db.Employeur,
              include: db.Consultant,

            },
          });
         
        admin.Employeurs.map((emp) => {
            const ids = emp.Consultants.map((con) => con.id);
            consultantsIds = consultantsIds.concat(ids);
        });


        let mis = await db.Mission.findAll({
            where:{ ConsultantId: { [db.Sequelize.Op.in]: consultantsIds }},
        });

        // console.log(mis);

        let missionsIds = mis.map((mission) => {
            return mission.id;
        });

        // console.log(missionsIds);
        // console.log(consultantsIds);
        
        let PrevSaisie = await db.PrevHistory.count({
            where: {
                nbJours: { [db.Sequelize.Op.not]: null },
                mounth: actMonth,
                year: actYear,
                MissionId:{ [db.Sequelize.Op.in]: missionsIds }
            }
        });
        let PrevSaisieNon = await db.PrevHistory.count({
            where: {
                nbJours: null,
                mounth: actMonth,
                year: actYear,
                MissionId:{ [db.Sequelize.Op.in]: missionsIds }

            }
        });
        let HandredPrev = PrevSaisie + PrevSaisieNon;
        prevText = PrevSaisie + "/" + HandredPrev + " Prev Saisies"
        if (HandredPrev === 0) {
            prevStats = [100, 0];
        } else {
            let percentSaisiePrev = (PrevSaisie * 100) / HandredPrev;
            prevStats = [percentSaisiePrev, 100 - percentSaisiePrev];
        }
        return { prevText, prevStats }
    }

    /**
     * @private
     * @param {*} request 
     * @returns {Object}
     */
    async getCraDataSuperAdmin() {
        let { db } = this;
        let craText, craStats;
        let actMonth = new Date().getMonth() + 1;
        let actYear = new Date().getFullYear();
        let craSaisie = await db.CraHistory.count({
            where: {
                craFilename: { [db.Sequelize.Op.not]: null },
                mounth: actMonth,
                year: actYear
            }
        });
        let craSaisieNon = await db.CraHistory.count({
            where: {
                craFilename: null,
                mounth: actMonth,
                year: actYear
            }
        });
        let HandredCra = craSaisie + craSaisieNon;
        craText = craSaisie + "/" + HandredCra + " CRA Chargés"
        if (HandredCra === 0) {
            // base de donnée vide on qffiche 100% saisie
            craStats = [100, 0];
        } else {
            let percentSaisieCra = (craSaisie * 100) / HandredCra;
            craStats = [percentSaisieCra, 100 - percentSaisieCra];
        }
        return { craText, craStats }
    }
    /**
     * @private
     * @param {*} request 
     * @returns {Object}
     */
    async getCraDataAdmin(request) {   
        let { db } = this;
        let craText, craStats;
        let actMonth = new Date().getMonth() + 1;
        let actYear = new Date().getFullYear();

        let connectedUser = request.user;
        let consultantsIds = [];

        let admin = await db.User.findOne({
            where: { id: connectedUser.id },
            include: {
              model: db.Employeur,
              include: db.Consultant,

            },
          });

          admin.Employeurs.map((emp) => {
            const ids = emp.Consultants.map((con) => con.id);
            consultantsIds = consultantsIds.concat(ids);
        });
        let mis = await db.Mission.findAll({
            where:{ ConsultantId: { [db.Sequelize.Op.in]: consultantsIds }},
        });
        let missionsIds = mis.map((mission) => {
            return mission.id;
        });


        let craSaisie = await db.CraHistory.count({
            where: {
                craFilename: { [db.Sequelize.Op.not]: null },
                mounth: actMonth,
                year: actYear,
                MissionId:{ [db.Sequelize.Op.in]: missionsIds }

            }
        });
        let craSaisieNon = await db.CraHistory.count({
            where: {
                craFilename: null,
                mounth: actMonth,
                year: actYear,
                MissionId:{ [db.Sequelize.Op.in]: missionsIds }

            }
        });
        let HandredCra = craSaisie + craSaisieNon;
        craText = craSaisie + "/" + HandredCra + " CRA Chargés"
        if (HandredCra === 0) {
            // base de donnée vide on qffiche 100% saisie
            craStats = [100, 0];
        } else {
            let percentSaisieCra = (craSaisie * 100) / HandredCra;
            craStats = [percentSaisieCra, 100 - percentSaisieCra];
        }
        return { craText, craStats }
    }


    /**
 * @private
 * @param {*} request 
 * @returns {Object}
 */
    async getCraYearDataSuperAdmin() {
        let { db } = this;
        let craYearStatsSasie = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        let craYearStatsNonSasie = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        let craText, craStats;
        let actYear = new Date().getFullYear();
        for (let i = 0; i < 12; i++) {
            let craSaisie = await db.CraHistory.count({
                where: {
                    craFilename: { [db.Sequelize.Op.not]: null },
                    mounth: i + 1,
                    year: actYear
                }
            });
            craYearStatsSasie[i] = craSaisie
            let craSaisieNon = await db.CraHistory.count({
                where: {
                    craFilename: null,
                    mounth: i + 1,
                    year: actYear
                }
            });
            craYearStatsNonSasie[i] = craSaisieNon
        }
        return { craYearStatsSasie, craYearStatsNonSasie }
    }
    /**
     * @private
     * @param {*} request 
     * @returns {Object}
     */
    async getCraYearDataAdmin(request) { 
        let { db } = this;
        let craYearStatsSasie = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        let craYearStatsNonSasie = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        let craText, craStats;
        let actYear = new Date().getFullYear();
    
        let connectedUser = request.user;
        let consultantsIds = [];

        let admin = await db.User.findOne({
            where: { id: connectedUser.id },
            include: {
              model: db.Employeur,
              include: db.Consultant,

            },
          });
         
        admin.Employeurs.map((emp) => {
            const ids = emp.Consultants.map((con) => con.id);
            consultantsIds = consultantsIds.concat(ids);
        });
        let mis = await db.Mission.findAll({
            where:{ ConsultantId: { [db.Sequelize.Op.in]: consultantsIds }},
        });
        let missionsIds = mis.map((mission) => {
            return mission.id;
        });


        for (let i = 0; i < 12; i++) {
            let craSaisie = await db.CraHistory.count({
                where: {
                    craFilename: { [db.Sequelize.Op.not]: null },
                    mounth: i + 1,
                    year: actYear,
                    MissionId:{ [db.Sequelize.Op.in]: missionsIds }

                }
            });
            craYearStatsSasie[i] = craSaisie
            let craSaisieNon = await db.CraHistory.count({
                where: {
                    craFilename: null,
                    mounth: i + 1,
                    year: actYear,
                    MissionId:{ [db.Sequelize.Op.in]: missionsIds }
                }
            });
            craYearStatsNonSasie[i] = craSaisieNon
        }
        return { craYearStatsSasie, craYearStatsNonSasie }
    }
    /**
     * @private
     * @param {*} request 
     * @returns {Object}
     */
    async getYearPrevDataSuperAdmin() {
        let { db } = this;
        let prevYearStatsSasie = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        let prevYearStatsNonSasie = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

        let actYear = new Date().getFullYear();


        for (let i = 0; i < 12; i++) {
            let PrevSaisie = await db.PrevHistory.count({
                where: {
                    nbJours: { [db.Sequelize.Op.not]: null },
                    mounth: i + 1,
                    year: actYear
                }
            });
            prevYearStatsSasie[i] = PrevSaisie
            let PrevSaisieNon = await db.PrevHistory.count({
                where: {
                    nbJours: null,
                    mounth: i + 1,
                    year: actYear
                }
            });
            prevYearStatsNonSasie[i] = PrevSaisieNon

        }
        return { prevYearStatsSasie, prevYearStatsNonSasie }
    }
    /**
     * @private
     * @param {*} request 
     * @returns {Object}
     */
    async getYearPrevDataAdmin(request) { 
        let { db } = this;
        let prevYearStatsSasie = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        let prevYearStatsNonSasie = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        let actYear = new Date().getFullYear();

        let connectedUser = request.user;
        let consultantsIds = [];

        let admin = await db.User.findOne({
            where: { id: connectedUser.id},
            include: {
                model: db.Employeur,
                include: db.Consultant
            },
        });

        admin.Employeurs.map((emp) => {
            const ids = emp.Consultants.map((con) => con.id);
            consultantsIds = consultantsIds.concat(ids);
            }); 

        let mis = await db.Mission.findAll({
            where: { ConsultantId: { [db.Sequelize.Op.in]: consultantsIds}},
        });
        let missionsIds = mis.map((mission) => {
            return mission.id;
        });
        
        for (let i = 0; i < 12; i++) {
            let PrevSaisie = await db.PrevHistory.count({
                where: {
                    nbJours: { [db.Sequelize.Op.not]: null },
                    mounth: i + 1,
                    year: actYear,
                    MissionId:{ [db.Sequelize.Op.in]: missionsIds }
                }
            });
            prevYearStatsSasie[i] = PrevSaisie
            let PrevSaisieNon = await db.PrevHistory.count({
                where: {
                    nbJours: null,
                    mounth: i + 1,
                    year: actYear,
                    MissionId:{ [db.Sequelize.Op.in]: missionsIds }
                }
            });
            prevYearStatsNonSasie[i] = PrevSaisieNon

        }
        return { prevYearStatsSasie, prevYearStatsNonSasie }
    }


    /**
     * @private
     * @param {*} request 
     * @returns {Object}
     */
    async getDashBoardDataAdmin(request) {
        // let t = await db.sequelize.transaction();

        try {
            let dd = {};
            dd.connected = new ConnectedUser(request.user);

            let prevData = await this.getPrevDataAdmin(request);
            dd.prevText = prevData.prevText;
            dd.prevStats = prevData.prevStats;


            let craData = await this.getCraDataAdmin(request);
            dd.craText = craData.craText;
            dd.craStats = craData.craStats;


            let craYearData = await this.getCraYearDataAdmin(request);
            dd.craYearStats = craYearData;


            let prevYearData = await this.getYearPrevDataAdmin(request);
            dd.prevYearStats = prevYearData;


            return dd;
        } catch (e) {
            throw e;
        }

    }

    /**
     * @private
     * @param {*} request 
     * @returns {Object}
     */
    async getDashBoardDataSuperAdmin(request) {
        // let t = await db.sequelize.transaction();    


        try {
            let dd = {};
            dd.connected = new ConnectedUser(request.user);

            let prevData = await this.getPrevDataSuperAdmin();
            dd.prevText = prevData.prevText;
            dd.prevStats = prevData.prevStats;


            let craData = await this.getCraDataSuperAdmin();
            dd.craText = craData.craText;
            dd.craStats = craData.craStats;


            let craYearData = await this.getCraYearDataSuperAdmin();
            dd.craYearStats = craYearData;


            let prevYearData = await this.getYearPrevDataSuperAdmin();
            dd.prevYearStats = prevYearData;


            return dd;
        } catch (e) {
            throw e;
        }

    }
/**
 *  recupére les donnees statistiques affichées dans le dashboard pour l'admin et le superadmin
 * @param {*} request 
 * @returns {Object}
 */
    async getDashBoardData(request) {
        return request.user.type === "SuperAdmin" ? await this.getDashBoardDataSuperAdmin(request) : await this.getDashBoardDataAdmin(request);
    }
}

module.exports = DashBoardService;