Services_PrevCraService.js

const path = require("path");
const config = require("../config");
const fs = require('fs');

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


    constructor(db) {
        this.db = db;

    }


    async VerifDM(request) {
        let {db} = this;
        let {prev, cra} = request.body
        const t = await db.sequelize.transaction();
        try {


            let existingPrev = await db.PrevHistory.findOne({where: {id: prev.id}});
            existingPrev.updated = false;
            await existingPrev.save({transaction: t})
            if (cra && cra !== "undefined") {
                let existingCra = await db.CraHistory.findOne({where: {id: cra.id}});
                existingCra.updated = false;
                await existingCra.save({transaction: t})
            }

            let condition = {
                where: {id: existingPrev.MissionId},
                include: [db.Client, db.Employeur,
                    {model: db.Consultant, include: db.User}]
            };
            await t.commit();
            let m = await db.Mission.findOne(condition);
            let mjson = m.toJSON();
            mjson.CraHistories = (await m.getCraHistories({order: [['year', 'ASC'], ['mounth', 'ASC']]}));
            mjson.PrevHistories = (await m.getPrevHistories({order: [['year', 'ASC'], ['mounth', 'ASC']]}));

            return mjson;
        } catch (e) {
            await t.rollback();
            throw e;
        }
    }


    async createActivitiesForMission(request) {
        let {db} = this;
        let {id, year, mounth} = request.body;
        let connected = request.user;
        const t = await db.sequelize.transaction();
        try {
            let mission = await db.Mission.findOne({where: {id}});
            let existingPrev = await db.PrevHistory.findOne({where: {MissionId: mission.id, year, mounth}});
            let existingCra = await db.CraHistory.findOne({where: {MissionId: mission.id, year, mounth}});
            console.log(year, mounth)
            if (existingPrev || existingCra) {
                throw new Error("Une activité pour ce mois existe déjà.");
            }
            //need to create activities here CRA and prev
            this.missionId = mission.id;
            //manage actions for history

            let prev = await db.PrevHistory.create({
                mounth,
                year,
                MissionId: this.missionId,
                tjm: mission.tjm,
            }, {transaction: t});
            await db.Action.create({
                UtilisateurId: connected.id,
                MissionId: mission.id,
                PrevId: prev.id,
                meta: JSON.stringify(prev),
                type: "création",
                text: `<b>${connected.firstname} ${connected.lastname}</b> a créer une activité pour Prev : <b>${prev.id}</b> le : ${(new Date(Date.now())).toLocaleString("fr-FR")}`
            }, {transaction: t});
            let cra = await db.CraHistory.create({
                mounth,
                year,
                MissionId: mission.id,
                tjm: mission.tjm,
            }, {transaction: t});
            await db.Action.create({
                UtilisateurId: connected.id,
                MissionId: mission.id,
                CraId: cra.id,
                meta: JSON.stringify(cra),
                type: "création",
                text: `<b>${connected.firstname} ${connected.lastname}</b> a créer une activité pour Prev : <b>${cra.id}</b> le : ${(new Date(Date.now())).toLocaleString("fr-FR")}`
            }, {transaction: t});

            await t.commit();
            let condition = {
                where: {id},
                include: [
                    db.Client,
                    db.Employeur,
                    {model: db.Missionfiles},
                    {model: db.Consultant, include: db.User}]
            };
            let m = await db.Mission.findOne(condition);
            let mjson = m.toJSON();
            mjson.CraHistories = (await m.getCraHistories({order: [['year', 'ASC'], ['mounth', 'ASC']]}));
            mjson.PrevHistories = (await m.getPrevHistories({order: [['year', 'ASC'], ['mounth', 'ASC']]}));


            return mjson;
        } catch (e) {
            await t.rollback();
            throw e;
        }
    }

    async saisiePrevFromWebsite(request) {
        let {logger} = request;
        let {db} = this;
        let {id, nbJours} = request.body;
        let connected = request.user;
        const t = await db.sequelize.transaction();
        try {
            let activite = await db.PrevHistory.findOne({where: {id}});
            if (connected.type === "Consultant") {
                activite.updated = (activite.updated || activite.nbJours != null && activite.nbJours + "" !== nbJours + "");

            }
            activite.nbJours = nbJours;
            let mission = await db.Mission.findOne({
                where: {id: activite.MissionId},
                include: [{model: db.Consultant, include: db.User}, {model: db.Client}]
            })
            if (!mission) {
                throw new Error("mission non trouvée " + activite.MissionId)
            }
            await db.Action.create({
                UtilisateurId: connected.id,
                MissionId: mission.id,
                PrevId: activite.id,
                meta: JSON.stringify(activite),
                type: "mise a jour",
                text: `<b>${connected.firstname} ${connected.lastname}</b> a saisie Le Prev depuis son portail: <b>${activite.nbJours}</b> le : ${(new Date(Date.now())).toLocaleString("fr-FR")}`
            }, {transaction: t});
            await activite.save({transaction: t})
            await t.commit();
            return activite;
        } catch (e) {
            await t.rollback();
            logger.error(e);
            throw e;
        }
    }

    async getCraFileName(request) {
        let {logger} = request;
        try {
            let {id} = request.params;
            let cra = await this.db.CraHistory.findOne({where: {id}});
            let filename = cra.craFilename;
            let mission = await this.db.Consultant2Client.findOne({
                where: {id: cra.MissionId},
                include: [{model: this.db.Consultant, include: this.db.User}, {model: this.db.Client}]
            })
            let slug = mission.Consultant.id + "-" + mission.Consultant.foldername
            let slugMiision = "mission-" + mission.foldername
            let activityDir = path.join(config.storageLocation, slug, slugMiision, "CRA", cra.mounth + "-" + cra.year)
            let fullFilePath = path.join(activityDir, filename);
            return path.resolve(fullFilePath)
        } catch (e) {
            logger.error(e);
            throw e;
        }
    }

    async getCraFromActionFileName(request) {
        let {logger} = request;
        try {
            let {id} = request.params;
            let action = await this.db.Action.findOne({where: {id}});
            let cra = await this.db.CraHistory.findOne({where: {id: action.CraId}});
            let filename = action.craFilename;
            let mission = await this.db.Consultant2Client.findOne({
                where: {id: cra.MissionId},
                include: [{model: this.db.Consultant, include: this.db.User}, {model: this.db.Client}]
            })
            let slug = mission.Consultant.id + "-" + mission.Consultant.foldername
            let slugMiision = "mission-" + mission.foldername;
            let activityDir = path.join(config.storageLocation, slug, slugMiision, "CRA", cra.mounth + "-" + cra.year)
            let fullFilePath = path.join(activityDir, filename);
            return path.resolve(fullFilePath)
        } catch (e) {
            logger.error(e);
            throw e;
        }
    }

    async saisiePrevAndCraFromLink(request) {
        let {linkId, nbJours, id} = request.body;
        let {logger} = request;
        let {db} = this;
        const t = await db.sequelize.transaction();
        try {
            // recup du liens
            let link = await db.SecuredLink.findOne({where: {id: linkId}});
            if (!link) {
                throw new Error("Link non trouvée " + linkId)
            }

            let mission = await db.Mission.findOne({
                where: {id: link.MissionId},
                include: [{model: db.Consultant, include: db.User}, {model: db.Client}]
            })
            if (!mission) {
                throw new Error("mission non trouvée " + mission.id)
            }
            let connected = mission.Consultant.Utilisateur;

            //Gestion Cra
            let linkCra, LinkPrev, prevActivite, craActivite;
            if (link.reason === "PREV") {
                prevActivite = await db.PrevHistory.findOne({where: {id: link.prevId}});
                craActivite = null;


            } else {
                if (!link.craId) {
                    throw new Error("Le liens est erroné veuillez réessayez plus tard")
                }
                craActivite = await db.CraHistory.findOne({where: {id: link.craId}});
                prevActivite = await db.PrevHistory.findOne({where: {id: link.prevId}});
            }
            if (craActivite && request.files && request.files.cra) {

                craActivite.updated = craActivite.craFilename != null;
                craActivite.updatedBy = connected.id;
                craActivite.craFilename = "CRA_" + craActivite.mounth + craActivite.year + "_" + mission.Consultant.Utilisateur.firstname + "_" + mission.Consultant.Utilisateur.lastname + "." + request.files.cra.name.split('.').pop();
                let slug = mission.Consultant.id + "-" + mission.Consultant.foldername;
                let slugMiision = "mission-" + mission.foldername;
                let activityDir = path.join(config.storageLocation, slug, slugMiision, "CRA", craActivite.mounth + "-" + craActivite.year);
                let CraFullPath = path.join(activityDir, craActivite.craFilename);
                if (fs.existsSync(CraFullPath)) {
                    let newCraName = "CRA_" + craActivite.mounth + craActivite.year + "_" + mission.Consultant.Utilisateur.firstname + "_" + mission.Consultant.Utilisateur.lastname + (new Date()).getTime() + "." + request.files.cra.name.split('.').pop();
                    let newCraFullPath = path.join(activityDir, newCraName);
                    await fs.renameSync(CraFullPath, newCraFullPath);
                    let oldAction = await db.Action.findOne({
                        where: {
                            type: "mise a jour",
                            MissionId: mission.id,
                            CraId: craActivite.id,
                            craFilename: craActivite.craFilename,
                        }
                    })

                    if (oldAction) {
                        oldAction.craFilename = newCraName;
                        await oldAction.save({transaction: t})
                    }

                }
                await db.Action.create({
                    UtilisateurId: connected.id,
                    MissionId: mission.id,
                    CraId: craActivite?.id || null,
                    prevId: prevActivite?.id,
                    meta: JSON.stringify(craActivite),
                    craFilename: craActivite.craFilename,
                    type: "mise a jour",
                    text: `<b>${connected.firstname} ${connected.lastname}</b> a uploader son CRA depuis le liens: <b>${craActivite.craFilename}</b> le : ${(new Date(Date.now())).toLocaleString("fr-FR")}`
                }, {transaction: t});
                await request.files.cra.mv(CraFullPath);
                await craActivite.save({transaction: t});
            }

            //Gestion Prev
            // prevActivite = await db.PrevHistory.findOne({where: {id: LinkPrev.activiteId}});
            if (prevActivite) {
                prevActivite.updated = (prevActivite.updated || prevActivite.nbJours != null && prevActivite.nbJours + "" !== nbJours + "");
                prevActivite.nbJours = nbJours
                prevActivite.updatedBy = connected.id
                await db.Action.create({
                    UtilisateurId: connected.id,
                    MissionId: mission.id,
                    PrevId: prevActivite.id,
                    meta: JSON.stringify(prevActivite),
                    type: "mise a jour",
                    text: `<b>${connected.firstname} ${connected.lastname}</b> a saisie son Prev depuis le liens: <b>${prevActivite.nbJours}</b> le : ${(new Date(Date.now())).toLocaleString("fr-FR")}`
                }, {transaction: t});
                await prevActivite.save({transaction: t})
            }
            await link.destroy({force: true, transaction: t});
            await t.commit();
            return {};

        } catch (e) {
            await t.rollback();
            throw e;
        }
    }

    async saisieCraFromWebSite(request) {
        let {db} = this;
        let {id} = request.body;
        let {logger} = request;
        let connected = request.user;
        const t = await db.sequelize.transaction();
        try {
            let activite = await db.CraHistory.findOne({where: {id}});
            if (!activite) {
                throw new Error("Activite non trouvée " + id)
            }
            let mission = await db.Mission.findOne({
                where: {id: activite.MissionId},
                include: [{model: db.Consultant, include: db.User}, {model: db.Client}]
            })
            if (!mission) {
                throw new Error("mission non trouvée " + activite.MissionId)
            }
            if (connected.type === "Consultant") {
                activite.updated = activite.craFilename != null;
            }
            activite.updatedBy = request.user.id;
            activite.craFilename = "CRA_" + activite.mounth + activite.year + "_" + mission.Consultant.Utilisateur.firstname + "_" + mission.Consultant.Utilisateur.lastname + "." + request.files.cra.name.split('.').pop();
            let slug = mission.Consultant.id + "-" + mission.Consultant.foldername
            let slugMiision = "mission-" + mission.foldername
            let activityDir = path.join(config.storageLocation, slug, slugMiision, "CRA", activite.mounth + "-" + activite.year)
            let CraFullPath = path.join(activityDir, activite.craFilename);

            if (fs.existsSync(CraFullPath)) {
                let newCraName = "CRA_" + activite.mounth + activite.year + "_" + mission.Consultant.Utilisateur.firstname + "_" + mission.Consultant.Utilisateur.lastname + (new Date()).getTime() + "." + request.files.cra.name.split('.').pop();
                let newCraFullPath = path.join(activityDir, newCraName);
                await fs.renameSync(CraFullPath, newCraFullPath);
                let oldAction = await db.Action.findOne({
                    where: {
                        type: "mise a jour",
                        MissionId: mission.id,
                        CraId: activite.id,
                        craFilename: activite.craFilename,
                    }
                })
                oldAction.craFilename = newCraName;
                await oldAction.save({transaction: t})
            }

            await db.Action.create({
                UtilisateurId: connected.id,
                MissionId: mission.id,
                CraId: activite.id,
                meta: JSON.stringify(activite),
                craFilename: activite.craFilename,
                type: "mise a jour",
                text: `<b>${connected.firstname} ${connected.lastname}</b> a uploader son CRA depuis son portail: <b>${activite.craFilename}</b> le : ${(new Date(Date.now())).toLocaleString("fr-FR")}`
            }, {transaction: t});
            await request.files.cra.mv(CraFullPath);
            await activite.save({transaction: t});
            //console.log(activityDir);

            await t.commit();
            return activite;
        } catch (e) {
            await t.rollback();
            logger.error(e);
            throw e;
        }


    }


    async verifyCra(request) {
        let {db} = this;
        let {id} = request.body;
        const t = await db.sequelize.transaction();
        try {
            let cra = await db.CraHistory.findOne({where: {id}});
            if (!cra) {
                throw new Error("CRA non trouvé");
            }
            cra.verified = true;
            cra.updated = false;
            await cra.save({transaction: t});
            await db.Action.create({
                UtilisateurId: request.user.id,
                CraId: cra.id,
                MissionId: cra.MissionId,
                type: "verification du cra",
                text: `<b>${request.user.firstname} ${request.user.lastname}</b> a vérifié le CRA : <b>${cra.craFilename}</b> le ${(new Date()).toLocaleString()}`
            }, {transaction: t});

            await t.commit();
            return cra;
        } catch (e) {
            await t.rollback();
            throw e;
        }
    }
}

module.exports = PrevCraService