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