Controllers_ConsultantController.js


const ConsultantService = require("../Services/ConsultantService");
const CrudController = require("./CrudController");
const JsonResponse = require("./JsonResponse");
const logger = require("../Logger");
const path = require("path");
const ConsultantValidatorAdd = require("../Validators/ConsultantValidatorAdd");
const ConsultantDto = require("../database/dto/ConsultantDto");
const ConsultantValidatorUpdate = require("../Validators/ConsultantValidatorUpdate")


/**
 * @extends Myintranet.Controllers.CrudController
 * @memberOf Myintranet.Controllers
 * @inheritDoc
 */
class ConsultantController extends CrudController {
    constructor(db) {
        let service = new ConsultantService(db);
        super(service, ConsultantValidatorAdd, db, ConsultantValidatorUpdate);
    }

    /**
     * recupére un document pour download
     * @param request
     * @param response
     */
    // downloadDocs(request, response) {
    //     this.service.getFullDocPathname(request.params.id).then(({ filePath, fileName }) => {
    //         console.log(filePath, fileName)
    //         response.setHeader('Content-Disposition', 'attachement; filename=' + fileName);
    //         response.sendFile(filePath);
    //     }).catch(err => {
    //         logger.error(err.message, err);
    //         response.json(new JsonResponse(false, err, err.message));

    //     })
    // }

    downloadDocs(request, response) {
        this.service.getFullDocPathname(request.params.id).then((data) => {
            console.log(data)
            response.setHeader('Content-Disposition', 'attachement; filename=' + path.basename(data));
            response.sendFile(data);
        }).catch(err => {
            logger.error(err.message, err);
            response.json(new JsonResponse(false, err, err.message));

        })
    }




    
    /**
     * upload un document du consultants
     * @param request
     * @param response
     */
    docs1upload(request, response) {
        this.service.uploadDocs1Files(request).then((data) => {
            response.json(new JsonResponse(true, data, ""));
        }).catch(err => {
            logger.error(err.message, err);
            response.json(new JsonResponse(false, err, err.message));

        })

    }

    /**
     * recupére un document pour preview
     * @param request
     * @param response
     */
    getDocs1(request, response) {
        this.service.getDocs1(request).then(data => {
            response.json(new JsonResponse(true, data, ""));
        }).catch(err => {
            logger.error(err.message, err);
            response.json(new JsonResponse(false, err, err.message));

        })
    }


    validateSunscriber(request, response) {
        //TODO: Create service method and validators
        console.log(request.body)

        this.service.validateSunscriber(request).then(data => {
            response.json(new JsonResponse(true, data, ""));
        }).catch(err => {
            logger.error(err.message, err);
            response.json(new JsonResponse(false, err, err.message));

        })
    }


    reSendNotificationPrev(request, response) {


    }

    reSendNotificationCra(request, response) {


    }

    /**
     * Ajoute un nouveau consultant au system
     * @param request
     * @param response
     */
    add(request, response) {
        this.service.add(request).then(data => {
            response.json(new JsonResponse(true, data, ""));
        }).catch(err => {
            if (err.parent && err.parent.code === "ER_DUP_ENTRY") {
                response.json(new JsonResponse(false, err, err.errors[0].path + "=>" + err.errors[0].value + " exist deja"));
            } else {
                logger.error(err.message, err);
                response.json(new JsonResponse(false, err, err.message));
            }
        })
        // let errors = this.isValidForAdd(request);
        // if (errors.length === 0) {
        //     this.service.add(request).then(data => {
        //         response.json(new JsonResponse(true, data, ""));
        //     }).catch(err => {
        //         if (err.parent && err.parent.code === "ER_DUP_ENTRY") {
        //             response.json(new JsonResponse(false, err, err.errors[0].path + "=>" + err.errors[0].value + " exist deja"));
        //         } else {
        //             logger.error(err.message, err);
        //             response.json(new JsonResponse(false, err, err.message));
        //         }
        //     })
        // } else {
        //     logger.error(errors[0], errors);
        //     let e = errors.map((err) => {
        //         return err.message;
        //     })
        //     response.json(new JsonResponse(false, e, errors[0].message));
        // }
    }
    addConsultant(request, response) {
        this.service.addConsultantforAdmin(request).then(data => {
            response.json(new JsonResponse(true, data, ""));
        }).catch(err => {
            if (err.parent && err.parent.code === "ER_DUP_ENTRY") {
                response.json(new JsonResponse(false, err, err.errors[0].path + "=>" + err.errors[0].value + " existe déjà"));
            } else {
                logger.error(err.message, err);
                response.json(new JsonResponse(false, err, err.message));
            }
        });
    }
    

    /**
     * recuprére les donnée de la chart du chiffre d'affaire
     * @param request
     * @param response
     */
    getCAdata(request, response) {
        // recuparation de l'id des params de la route /:id
        let {id} = request.params;
        // recuperatoion de l'objet de dbase de donnée 
        let {db} = this;
        //recuperation de l'année en cours
        let date = new Date(Date.now());
        let year = date.getFullYear(); // YYYY    ex:2019

        //creation d'un tableau de data a afficher dans la chart des chiffres d'affaire
        let data = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]// donnees a zero pour 12 mois
        let condition = {
            where: {id},
            include: [
                {
                    model: db.User,
                }, {
                    model: db.Mission,
                    include: [
                        {model: db.Client},
                        {model: db.CraHistory},  // add the where condition to exclude old mounths
                        {model: db.PrevHistory, where: {year}}, // add the where condition to exclude old mounths
                        {model: db.Employeur}]
                }
            ]
        };

        db.Consultant.findOne(condition).then(consultant => {
            for (const mission of consultant.Missions) {
                if (mission.dateEnd === null) {
                    //Cette boucle parcourt les prévisions associées à chaque mission. 
                    for (const prev of mission.PrevHistories) {
                        //Cette ligne accumule les valeurs de CA en fonction des prévisions et des jours facturables pour chaque mois. 
                        if (prev.nbJours) {
                            data[parseInt(prev.mounth) - 1] += parseFloat(prev.nbJours) * parseFloat(mission.tjm)
                        }
                    }
                }

            }
            response.json(new JsonResponse(true, data, ""));
        }).catch(err => {
            response.json(new JsonResponse(false, err, err.message));
        })
    }

    /**
     * recupére le photo de profile sans securité
     * @param request
     * @param response
     */
    getPublicAvatar(request, response) {
        let id = request.params.userId;
        let {db} = this;
        let condition = {
            where: {id},
        };
        db.User.findOne(condition).then(user => {
            // console.log(user.pic)
            if (user.pic) {
                response.contentType(user.picType);
                response.send(Buffer.from(user.pic, 'binary'));
            } else {
                response.sendFile(path.resolve("./staticFiles/profile.jpg"));
            }
        }).catch(err => {
            response.json(new JsonResponse(false, err, err.message));
        })

    }

    // FilterPrevandCra (request,response){
    //     this.service.FilterPrevandCra(request).then(data => {
    //         response.json(new JsonResponse(true, data, ""));
    //     }).catch(err => {
    //         logger.error(err.message, err);
    //         response.json(new JsonResponse(false, err, err.message));

    //     })
    // }
    getSubs(request, response) {
        this.service.getAllSubs(request)
            .then(data => {
                response.json(new JsonResponse(true, data, ""));
            })
            .catch(err => {
                logger.error(err.message, err);
                response.json(new JsonResponse(false, err, err.message));
            })
    }

    toDto(data) {
        return new ConsultantDto(data);
    }

}

module.exports = ConsultantController;