Services_EmployeurService.js
const CrudService = require("./CrudService");
const crypto = require("crypto");
function slugify (str) {
str = str.replace(/^\s+|\s+$/g, ''); // trim
str = str.toLowerCase();
// remove accents, swap ñ for n, etc
let from = "àáäâèéëêìíïîòóöôùúüûñç·/_,:;";
let to = "aaaaeeeeiiiioooouuuunc------";
for (let i=0, l=from.length ; i<l ; i++) {
str = str.replace(new RegExp(from.charAt(i), 'g'), to.charAt(i));
}
str = str.replace(/[^a-z0-9 -]/g, '') // remove invalid chars
.replace(/\s+/g, '-') // collapse whitespace and replace by -
.replace(/-+/g, '-'); // collapse dashes
return str;
}
/**
* @extends Myintranet.Services.CrudService
* @memberof Myintranet.Services
* @inheritDoc
*/
class EmployeurService extends CrudService {
constructor(db) {
super(db.Employeur);
this.db = db;
}
async getAll(request) {
let { db } = this;
let connectedUser = request.user;
if (connectedUser.type === "SuperAdmin") {
return db.Employeur.findAll({});
} else if (connectedUser.type === "Admin") {
let admin = await db.User.findOne({
where: { id: connectedUser.id },
include: { model: db.Employeur },
});
let employeursIds = admin.Employeurs.map((emp) => {
return emp.id;
});
return db.Employeur.findAll({
where: { id: { [db.Sequelize.Op.in]: employeursIds } },
});
} else {
//Consultant
throw new Error(
"Un consultant ne peu pas consulter la liste des Employeurs, seul un admin ou un super admin le peuvent!"
);
}
}
async findByText(request) {
let { text } = request.body;
let { db } = this;
let { user } = request.user;
return new Promise((resolve, reject) => {
db.Employeur.findAll({
where: {
[db.Sequelize.Op.or]: {
denominationSocial: { [db.Sequelize.Op.like]: "%" + text + "%" },
contact: { [db.Sequelize.Op.like]: "%" + text + "%" },
address:{ [db.Sequelize.Op.like]: "%" + text + "%" },
}
},
order: [["createdAt", "DESC"]],
})
.then((users) => {
resolve(users);
})
.catch((err) => {
reject(err);
});
});
}
async add(request) {
let { db } = this;
let connected = request.user;
let data = request.body;
data.slug = slugify(data.denominationSocial)
//console.log(connected)
const t = await db.sequelize.transaction();
try {
await db.Action.create(
{
UtilisateurId: connected.id,
meta: JSON.stringify(data),
type: "creation",
text: `<b>${connected.firstname} ${
connected.firstname
}</b> a créé l'employeur : <b>${
data.denominationSocial
}</b>. le : ${new Date(Date.now()).toLocaleString("fr-FR")}`,
},
{ transaction: t }
);
let Client = await db.Employeur.create(data, { transaction: t });
await t.commit();
return Client;
} catch (e) {
await t.rollback();
throw e;
}
}
async update(request) {
let data = request.body,
connected = request.user;
data.slug = slugify(data.denominationSocial)
let { db } = this;
const t = await db.sequelize.transaction();
let id = null;
if (request.body.id) {
id = request.body.id;
} else if (request.params.id) {
id = request.params.id;
} else if (request.query.id) {
id = request.query.id;
}
try {
if (!id) {
throw new Error("cant update with no id");
} else {
await db.Action.create(
{
UtilisateurId: connected.id,
meta: JSON.stringify(data),
type: "mise a jour",
text: `<b>${connected.firstname} ${
connected.firstname
}</b> a modifié l'employeur : <b>${
data.denominationSocial
}</b> le : ${new Date(Date.now()).toLocaleString("fr-FR")}`,
},
{ transaction: t }
);
let updateRes = await db.Employeur.update(data, { where: { id } });
await t.commit();
return updateRes;
}
} catch (e) {
await t.rollback();
throw e;
}
}
async delete(request) {
let { db } = this;
let connected = request.user;
let id = this.__getIdFromRequest(request);
const t = await db.sequelize.transaction();
try {
if (!id) {
throw new Error("On ne peut pas supprimer un élément sans son ID");
} else {
let empDelete = await db.Employeur.findOne({
where: { id },
include: db.Consultant,
});
// let empMissions = await db.Mission.findAll({where: {EmployeurId: id}});
if (empDelete.Consultants.length === 0) {
// let empConsultants = await db.Consultant.findAll({where: {EmployeurId: id}});
await db.Action.create(
{
UtilisateurId: connected.id,
meta: JSON.stringify(empDelete.toJSON()),
type: "suppression",
text: `<b>${connected.firstname} ${
connected.firstname
}</b> a supprimé l'employeur : <b>${
empDelete.denominationSocial
}</b> le : ${new Date(Date.now()).toLocaleString("fr-FR")}`,
},
{ transaction: t }
);
await empDelete.destroy({ force: false }, { transaction: t });
return await t.commit();
} else {
throw new Error(
`${empDelete.denominationSocial} est associé à des consultants. Impossible de le supprimer.`
);
// throw new Error(`${empDelete.denominationSocial} est associé à des missions. Impossible de le supprimer.`);
}
}
} catch (error) {
await t.rollback();
throw error;
}
}
}
module.exports = EmployeurService;