Migración a HubSpot

This commit is contained in:
David Arranz 2024-05-31 12:06:36 +02:00
parent 2cea881495
commit f129c19c91
11 changed files with 305 additions and 308 deletions

13
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,13 @@
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "attach",
"name": "Node: Nodemon",
"processId": "${command:PickProcess}",
"restart": true,
"protocol": "inspector"
}
]
}

View File

@ -1,27 +1,29 @@
module.exports = { module.exports = {
database: { database: {
username: 'lqdvi', username: "lqdvi",
password: 'Z286y386*a', password: "Z286y386*a",
database: 'lqdvi_v2', database: "lqdvi_v2",
host: 'localhost', host: "localhost",
dialect: 'mysql', dialect: "mysql",
}, },
cache: { cache: {
enabled: false, enabled: false,
defaultDuration: '1 minute', defaultDuration: "1 minute",
debug: true, debug: true,
}, },
session: { session: {
secret_token: process.env.SECRET_TOKEN || "B57J=7B`NQ$y98|~5;hc715bo09^5oz8NR+]n9r~215B91Nd9P%25_N6r!GHcOKp|18y5-73Dr5^@9k7n]5l<-41D1o", secret_token:
token_expires_in: '365d' process.env.SECRET_TOKEN ||
"B57J=7B`NQ$y98|~5;hc715bo09^5oz8NR+]n9r~215B91Nd9P%25_N6r!GHcOKp|18y5-73Dr5^@9k7n]5l<-41D1o",
token_expires_in: "365d",
}, },
server: { server: {
hostname: process.env.HOSTNAME || '127.0.0.1', hostname: process.env.HOSTNAME || "127.0.0.1",
port: process.env.PORT || 19999, port: process.env.PORT || 19999,
public_url: "" public_url: "",
}, },
cdn: { cdn: {
@ -36,16 +38,21 @@ module.exports = {
paginate: { paginate: {
limit: 10, limit: 10,
maxLimit: 50 maxLimit: 50,
}, },
vimeo: { vimeo: {
CLIENT_ID: '9581f2d0ed211dc1e31b5c825117dc1f00d77ba0', CLIENT_ID: "9581f2d0ed211dc1e31b5c825117dc1f00d77ba0",
CLIENT_SECRET: '3kf0hQ63OXSPm7z2X1qyOV4iH57Xha0cyRXn0VJneq8zHbWKjfB1/9H8KcgBgzgkzw0Y9x/xFLUAauuHLEkqHxLBw8QueanCgIZev1L5xoksrKuKX7gMvErqqP+uFNnA', CLIENT_SECRET:
ACCESS_TOKEN: 'fcc7b31fe690a768efa920e13d750449' "3kf0hQ63OXSPm7z2X1qyOV4iH57Xha0cyRXn0VJneq8zHbWKjfB1/9H8KcgBgzgkzw0Y9x/xFLUAauuHLEkqHxLBw8QueanCgIZev1L5xoksrKuKX7gMvErqqP+uFNnA",
ACCESS_TOKEN: "fcc7b31fe690a768efa920e13d750449",
}, },
sendinblue: { sendinblue: {
API_KEY: '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' API_KEY: "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",
} },
}
hubspot: {
API_KEY: "pat-eu1-36a3fff1-1877-44ae-a32e-00e91c3e650b",
},
};

View File

@ -1,10 +1,10 @@
module.exports = { module.exports = {
database: { database: {
username: 'lqdvi', username: "lqdvi",
password: 'Z286y386*a', password: "Z286y386*a",
database: 'lqdvi_v2', database: "lqdvi_v2",
host: 'localhost', host: "localhost",
dialect: 'mysql', dialect: "mysql",
/* /*
username: process.env.DB_USERNAME, username: process.env.DB_USERNAME,
@ -17,20 +17,21 @@ module.exports = {
cache: { cache: {
enabled: true, enabled: true,
defaultDuration: '1 minute', defaultDuration: "1 minute",
debug: true, debug: true,
}, },
session: { session: {
secret_token: process.env.SECRET_TOKEN || "B57J=7B`NQ$y98|~5;hc715bo09^5oz8NR+]n9r~215B91Nd9P%25_N6r!GHcOKp|18y5-73Dr5^@9k7n]5l<-41D1o", secret_token:
token_expires_in: '365d' process.env.SECRET_TOKEN ||
"B57J=7B`NQ$y98|~5;hc715bo09^5oz8NR+]n9r~215B91Nd9P%25_N6r!GHcOKp|18y5-73Dr5^@9k7n]5l<-41D1o",
token_expires_in: "365d",
}, },
server: { server: {
hostname: process.env.HOSTNAME || '127.0.0.1', hostname: process.env.HOSTNAME || "127.0.0.1",
port: process.env.PORT || 19999, port: process.env.PORT || 19999,
public_url: "https://apiapp3.loquedeverdadimporta.org/api/v3" public_url: "https://apiapp3.loquedeverdadimporta.org/api/v3",
}, },
cdn: { cdn: {
@ -45,16 +46,21 @@ module.exports = {
paginate: { paginate: {
limit: 10, limit: 10,
maxLimit: 50 maxLimit: 50,
}, },
vimeo: { vimeo: {
CLIENT_ID: '9581f2d0ed211dc1e31b5c825117dc1f00d77ba0', CLIENT_ID: "9581f2d0ed211dc1e31b5c825117dc1f00d77ba0",
CLIENT_SECRET: '3kf0hQ63OXSPm7z2X1qyOV4iH57Xha0cyRXn0VJneq8zHbWKjfB1/9H8KcgBgzgkzw0Y9x/xFLUAauuHLEkqHxLBw8QueanCgIZev1L5xoksrKuKX7gMvErqqP+uFNnA', CLIENT_SECRET:
ACCESS_TOKEN: 'fcc7b31fe690a768efa920e13d750449' "3kf0hQ63OXSPm7z2X1qyOV4iH57Xha0cyRXn0VJneq8zHbWKjfB1/9H8KcgBgzgkzw0Y9x/xFLUAauuHLEkqHxLBw8QueanCgIZev1L5xoksrKuKX7gMvErqqP+uFNnA",
ACCESS_TOKEN: "fcc7b31fe690a768efa920e13d750449",
}, },
sendinblue: { sendinblue: {
API_KEY: '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' API_KEY: "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",
} },
}
hubspot: {
API_KEY: "pat-eu1-36a3fff1-1877-44ae-a32e-00e91c3e650b",
},
};

View File

@ -15,8 +15,6 @@ function _getMemberByEmail(userEmail) {
const defaultClient = new hubspot.Client({ accessToken: config.hubspot.API_KEY }); const defaultClient = new hubspot.Client({ accessToken: config.hubspot.API_KEY });
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
console.debug("_existsMember HS:", userEmail);
defaultClient.crm.contacts.searchApi defaultClient.crm.contacts.searchApi
.doSearch({ .doSearch({
filterGroups: [ filterGroups: [
@ -63,7 +61,6 @@ function _getMemberByEmail(userEmail) {
], ],
} }
*/ */
console.debug("HS API called successfully. Returned total: " + data.total);
if (data.total === 1) { if (data.total === 1) {
resolve(data.results[0]); resolve(data.results[0]);
} else { } else {
@ -82,8 +79,6 @@ function _createMember(member) {
const defaultClient = new hubspot.Client({ accessToken: config.hubspot.API_KEY }); const defaultClient = new hubspot.Client({ accessToken: config.hubspot.API_KEY });
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
console.debug("_createMember HS:", member.email);
/** /**
* member = { * member = {
id: "3cc58b92-d144-492d-a8e8-9e1294b5b10b", id: "3cc58b92-d144-492d-a8e8-9e1294b5b10b",
@ -118,13 +113,11 @@ function _createMember(member) {
entidad_protagonista: member.entity ? member.entity : "", entidad_protagonista: member.entity ? member.entity : "",
}; };
console.debug(newContact);
defaultClient.crm.contacts.basicApi defaultClient.crm.contacts.basicApi
.create({ .create({
properties: newContact, properties: newContact,
}) })
.then(function (newContact) { .then(function (newContact) {
console.debug("HS API called successfully. Returned data: " + newContact.id);
resolve(newContact); resolve(newContact);
}) })
.catch(function (error) { .catch(function (error) {
@ -139,8 +132,6 @@ function _updateMember(email, member) {
const defaultClient = new hubspot.Client({ accessToken: config.hubspot.API_KEY }); const defaultClient = new hubspot.Client({ accessToken: config.hubspot.API_KEY });
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
console.debug("_updateMember HS:", email);
/** /**
* member = { * member = {
email: "darranz@rodax-software.com", email: "darranz@rodax-software.com",
@ -165,7 +156,7 @@ function _updateMember(email, member) {
entidad_protagonista: member.entity ? member.entity : "", entidad_protagonista: member.entity ? member.entity : "",
}, },
}) })
.then(function (response) { .then(function (updatedContact) {
/** /**
* response = { * response = {
createdAt: "2023-07-25T08:19:05.729Z", createdAt: "2023-07-25T08:19:05.729Z",
@ -190,7 +181,6 @@ function _updateMember(email, member) {
}} }}
*/ */
console.debug("HS API called successfully. Returned data: " + response);
resolve(updatedContact); resolve(updatedContact);
}) })
.catch(function (error) { .catch(function (error) {
@ -207,14 +197,11 @@ function _deleteMember(email) {
const defaultClient = new hubspot.Client({ accessToken: config.hubspot.API_KEY }); const defaultClient = new hubspot.Client({ accessToken: config.hubspot.API_KEY });
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
console.debug("_deleteMember HS:", email);
_getMemberByEmail(email).then((data) => { _getMemberByEmail(email).then((data) => {
if (data && data.id) { if (data && data.id) {
defaultClient.crm.contacts.basicApi defaultClient.crm.contacts.basicApi
.archive(data.id) .archive(data.id)
.then(function (response) { .then(function (response) {
console.debug("HS API called successfully. Returned data: " + response);
resolve(); resolve();
}) })
.catch(function (error) { .catch(function (error) {
@ -289,13 +276,9 @@ async function _addInscriptionToMember(hbContact, member) {
} }
async function _deleteInscriptionFromMember(hbContact, inscription) { async function _deleteInscriptionFromMember(hbContact, inscription) {
/**
* arg1: {id: 'c8a39de5-2de6-45e8-84b5-bda22ff81492', source: 'app', event_name: 'Sevilla 2023 - 22ª Edición', event_date: Mon Jun 03 2024 09:00:00 GMT+0200 (hora de verano de Europa central), event_marketing_list: null, }
*/
console.log(inscription);
const { const {
event: { event: {
init_date,
location: { city: delete_city, country: delete_country }, location: { city: delete_city, country: delete_country },
}, },
} = inscription; } = inscription;
@ -304,37 +287,38 @@ async function _deleteInscriptionFromMember(hbContact, inscription) {
let ciudad_del_evento = String(properties.ciudad_del_evento || "").split(";"); let ciudad_del_evento = String(properties.ciudad_del_evento || "").split(";");
if (ciudad_del_evento.includes(delete_city)) { if (ciudad_del_evento.includes(delete_city)) {
if (ciudad_del_evento.length > 1) {
ciudad_del_evento = ciudad_del_evento.filter((ciudad) => ciudad !== delete_city); ciudad_del_evento = ciudad_del_evento.filter((ciudad) => ciudad !== delete_city);
ciudad_del_evento = ciudad_del_evento.join(";"); }
} else {
ciudad_del_evento = null; // const delete_year = String(new Date(init_date).getUTCFullYear());
let ano_del_congreso = String(properties.ano_del_congreso || "").split(";");
if (ano_del_congreso.includes(delete_year)) {
if (ano_del_congreso.length > 1 || ciudad_del_evento.length === 0) {
ano_del_congreso = ano_del_congreso.filter((year) => year !== delete_year);
} }
} }
let pais = String(properties.pais || "").split(";"); let pais = String(properties.pais || "").split(";");
if (pais.includes(delete_country)) { if (pais.includes(delete_country)) {
if (pais.length > 1) { if (pais.length > 1 || ciudad_del_evento.length === 0) {
pais = pais.filter((ciudad) => ciudad !== delete_city); pais = pais.filter((item) => item !== delete_country);
pais = pais.join(";");
} else {
pais = null; //
} }
} }
const defaultClient = new hubspot.Client({ accessToken: config.hubspot.API_KEY }); const defaultClient = new hubspot.Client({ accessToken: config.hubspot.API_KEY });
const updatedContact = await defaultClient.crm.contacts.basicApi.update(hbContact.id, { const updatedContact = await defaultClient.crm.contacts.basicApi.update(hbContact.id, {
properties: { properties: {
ciudad_del_evento, ciudad_del_evento: ciudad_del_evento.join(";"),
//pais, pais: pais.join(";"),
//ano_del_congreso, ano_del_congreso: ano_del_congreso.join(";"),
tipo_de_evento: "Congreso",
}, },
}); });
return; return updatedContact;
} }
/***************************************************************************** */
async function addMemberToList(listId, member) { async function addMemberToList(listId, member) {
let hbContact = await _getMemberByEmail(member.email); let hbContact = await _getMemberByEmail(member.email);
if (hbContact && hbContact.id) { if (hbContact && hbContact.id) {
@ -356,20 +340,6 @@ async function deleteMemberFromList(listId, userEmail, inscription) {
let hbContact = await _getMemberByEmail(userEmail); let hbContact = await _getMemberByEmail(userEmail);
if (hbContact && hbContact.id) { if (hbContact && hbContact.id) {
await _deleteInscriptionFromMember(hbContact, inscription); await _deleteInscriptionFromMember(hbContact, inscription);
/*
_deleteInscriptionFromMember(hbContact, inscription).then(() => {
// ¿debo archivarlo?
// si-> _deleteMemeber(userEmail);
})
if (_hbContactWithLastInscription(hbContact)) {
return _deleteMember(userEmail);
} else {
return _updateMember(email, inscription)
}
} else {
return _createMember(member);
}*/
} }
return; return;
} }

View File

@ -1,7 +1,9 @@
const { Expo } = require('expo-server-sdk'); const { Expo } = require('expo-server-sdk');
// Create a new Expo SDK client // Create a new Expo SDK client
const expo = new Expo(); const expo = new Expo({
useFcmV1: true // this can be set to true in order to use the FCM v1 API
});
const createPushMessage = (data) => { const createPushMessage = (data) => {
const pushMessage = { const pushMessage = {

View File

@ -8,7 +8,7 @@ const crypto = require("crypto");
const securityHelper = require("../../helpers/security.helper"); const securityHelper = require("../../helpers/security.helper");
const authService = require("./auth.service"); const authService = require("./auth.service");
const userService = require("./user.service"); const userService = require("./user.service");
const marketing = require("../../helpers/sendinblue.helper"); const marketing = require("../../helpers/hubspot.helper");
const marketingService = require("../events/marketing_list.service"); const marketingService = require("../events/marketing_list.service");
const eventInscriptionService = require("../events/events_inscriptions.service"); const eventInscriptionService = require("../events/events_inscriptions.service");
const { RequestContactImportNewList } = require("sib-api-v3-sdk"); const { RequestContactImportNewList } = require("sib-api-v3-sdk");

View File

@ -298,6 +298,7 @@ const extraControllers = {
httpStatus.NOT_FOUND httpStatus.NOT_FOUND
); );
if (marketingListIdOverflow) {
try { try {
//Eliminamos miembro de la lista de mailchimp a la que está asociado //Eliminamos miembro de la lista de mailchimp a la que está asociado
@ -305,12 +306,19 @@ const extraControllers = {
} catch (error) { } catch (error) {
console.log("validate incription", error); console.log("validate incription", error);
} }
}
//Mandar correo de confirmacion de inscripcion //Mandar correo de confirmacion de inscripcion
try { try {
var member = generateMemberInscription(inscription.user, inscription, inscription.reservation); var member = generateMemberInscription(inscription.user, inscription, inscription.reservation);
/**** */
member.marketing_memberId = await eventInscriptionService._addMember(marketingListIdEvent, member); member.marketing_memberId = await eventInscriptionService._addMember(marketingListIdEvent, member);
eventInscriptionService._updateMarketingMemberOfInscription(inscription.id, member.marketing_memberId); eventInscriptionService._updateMarketingMemberOfInscription(inscription.id, member.marketing_memberId);
/*** */
member.qrConfig = QRHelper.generateQRConfig(member); member.qrConfig = QRHelper.generateQRConfig(member);
member.qrCode = await QRHelper.getInscriptionQRCode(member.qrConfig); member.qrCode = await QRHelper.getInscriptionQRCode(member.qrConfig);
member.qrCodeUrl = QRHelper.getInscriptionQRCodeUrl(inscription.id); member.qrCodeUrl = QRHelper.getInscriptionQRCodeUrl(inscription.id);

View File

@ -8,7 +8,11 @@ const eventService = require("./event.service");
const mailService = require("./mail.service"); const mailService = require("./mail.service");
const marketingListService = require("./marketing_list.service"); const marketingListService = require("./marketing_list.service");
const QRHelper = require("../../helpers/qr.helper"); const QRHelper = require("../../helpers/qr.helper");
const { extractParamsFromRequest, handleResultResponse, handleErrorResponse } = require("../../helpers/controller.helper"); const {
extractParamsFromRequest,
handleResultResponse,
handleErrorResponse,
} = require("../../helpers/controller.helper");
const { data } = require("../../core/logger"); const { data } = require("../../core/logger");
const lodash = require("lodash"); const lodash = require("lodash");
const userService = require("../auth/user.service"); const userService = require("../auth/user.service");
@ -17,15 +21,12 @@ const userService = require("../auth/user.service");
const MODULE_NAME = "[eventInscription.controller]"; const MODULE_NAME = "[eventInscription.controller]";
const controllerOptions = { MODULE_NAME }; const controllerOptions = { MODULE_NAME };
async function refreshConfirmed(inscription) { async function refreshConfirmed(inscription) {
if (!inscription) { if (!inscription) {
throw new Error("Error al eliminar inscripción, no puedo cambiar confirmados a la reserva asociada"); throw new Error("Error al eliminar inscripción, no puedo cambiar confirmados a la reserva asociada");
}; }
if (inscription.type === "online") if (inscription.type === "online") return true;
return true;
//En caso de inscripciones //En caso de inscripciones
const EventOrReservationChangeId = inscription.reservationId const EventOrReservationChangeId = inscription.reservationId
@ -39,9 +40,7 @@ async function refreshConfirmed(inscription) {
//Si la inscripción viene por una reserva modificamos los confirmados de la reserva //Si la inscripción viene por una reserva modificamos los confirmados de la reserva
if (inscription.reservationId != null) { if (inscription.reservationId != null) {
console.log("Tengo reservation>>>>>>>>>>>>>>>>>>", inscription.reservationId); console.log("Tengo reservation>>>>>>>>>>>>>>>>>>", inscription.reservationId);
NewConfirmed = await eventInscriptionService._getCountInscriptionsWithReservation( NewConfirmed = await eventInscriptionService._getCountInscriptionsWithReservation(EventOrReservationChangeId);
EventOrReservationChangeId
);
//No se tienen en cuenta los marketinglist de las otras estructuras si lo tuviera seria esto //No se tienen en cuenta los marketinglist de las otras estructuras si lo tuviera seria esto
// marketingListId = (await eventReservationService._getReservaById(EventOrReservationChangeId)) // marketingListId = (await eventReservationService._getReservaById(EventOrReservationChangeId))
// .marketing_list; // .marketing_list;
@ -49,9 +48,7 @@ async function refreshConfirmed(inscription) {
//Inscripcion de lista de espera bien de reserva o de evento de lista de espera //Inscripcion de lista de espera bien de reserva o de evento de lista de espera
} else if (inscription.overflowEventId != null) { } else if (inscription.overflowEventId != null) {
console.log("Tengo overflow>>>>>>>>>>>>>>>>>>", inscription.overflowEventId); console.log("Tengo overflow>>>>>>>>>>>>>>>>>>", inscription.overflowEventId);
NewConfirmed = await eventInscriptionService._getCountInscriptionsWithOverflowEventId( NewConfirmed = await eventInscriptionService._getCountInscriptionsWithOverflowEventId(EventOrReservationChangeId);
EventOrReservationChangeId
);
//No se tienen en cuenta los marketinglist de las otras estructuras si lo tuviera seria esto //No se tienen en cuenta los marketinglist de las otras estructuras si lo tuviera seria esto
/// marketingListId = (await eventService._getEvent(EventOrReservationChangeId)).marketing_list; /// marketingListId = (await eventService._getEvent(EventOrReservationChangeId)).marketing_list;
@ -63,7 +60,7 @@ async function refreshConfirmed(inscription) {
//No se tienen en cuenta los marketinglist de las otras estructuras si lo tuviera seria esto //No se tienen en cuenta los marketinglist de las otras estructuras si lo tuviera seria esto
//marketingListId = (await eventService._getEvent(EventOrReservationChangeId)).marketing_list; //marketingListId = (await eventService._getEvent(EventOrReservationChangeId)).marketing_list;
}; }
//Actualizamos aforo del evento o de la reserva //Actualizamos aforo del evento o de la reserva
if (inscription.reservationId != null) { if (inscription.reservationId != null) {
@ -78,7 +75,7 @@ async function refreshConfirmed(inscription) {
if (!(await eventService._updateConfirmedEvent(EventOrReservationChangeId, NewConfirmed))) { if (!(await eventService._updateConfirmedEvent(EventOrReservationChangeId, NewConfirmed))) {
throw new Error("Error al eliminar inscripción, no puedo cambiar confirmados a la inscripcion"); throw new Error("Error al eliminar inscripción, no puedo cambiar confirmados a la inscripcion");
} }
}; }
} }
const extraControllers = { const extraControllers = {
@ -90,12 +87,10 @@ const extraControllers = {
//Si no viene type es porque es una inscripción con la app antigua y el valor por defecto es onsite //Si no viene type es porque es una inscripción con la app antigua y el valor por defecto es onsite
let typeInscription = "onsite"; let typeInscription = "onsite";
if ((req.body.type) && (req.body.type === "online")) if (req.body.type && req.body.type === "online") typeInscription = "online";
typeInscription = "online";
//Si viene code es la appa antigua o la nueva //Si viene code es la appa antigua o la nueva
if (((req.body.code) && (req.body.code !== "")) if ((req.body.code && req.body.code !== "") || (req.body.group_size && req.body.group_size > 1))
|| ((req.body.group_size) && (req.body.group_size > 1)))
typeInscription = typeInscription + " group"; typeInscription = typeInscription + " group";
let dataInscription = { let dataInscription = {
@ -162,16 +157,15 @@ const extraControllers = {
); );
if (dataInscription.inscription) { if (dataInscription.inscription) {
console.log("esta es la inscripcion que ya tengo>>>>", console.log("esta es la inscripcion que ya tengo>>>>", dataInscription.inscription);
dataInscription.inscription
);
//Si la inscripcion no tiene reserva o la tiene y es la misma de la insripcion devuelvo la inscripcion //Si la inscripcion no tiene reserva o la tiene y es la misma de la insripcion devuelvo la inscripcion
if ((!dataInscription.inscription.reservationId) if (
|| ((dataInscription.reservation) && (dataInscription.inscription.reservationId == dataInscription.reservation.id))) !dataInscription.inscription.reservationId ||
(dataInscription.reservation && dataInscription.inscription.reservationId == dataInscription.reservation.id)
)
return handleResultResponse(dataInscription.inscription, null, params, res, httpStatus.OK); return handleResultResponse(dataInscription.inscription, null, params, res, httpStatus.OK);
//En caso contrario devuelvo la plaza a la reserva que tenia la inscripción anterior y apunto la inscripción a la nueva reserva //En caso contrario devuelvo la plaza a la reserva que tenia la inscripción anterior y apunto la inscripción a la nueva reserva
//ACTUALIZAMOS LA RESERVA DE LA INSCRIPCION CON LA NUEVA Y CAMBIAMOS COMFIRMADOS DEVOLVIENDO LA INSCRIPCIÓN CON LA NUEVA RESERVA //ACTUALIZAMOS LA RESERVA DE LA INSCRIPCION CON LA NUEVA Y CAMBIAMOS COMFIRMADOS DEVOLVIENDO LA INSCRIPCIÓN CON LA NUEVA RESERVA
let CountConfirmedOldReservation = await eventInscriptionService._getCountInscriptionsWithReservation( let CountConfirmedOldReservation = await eventInscriptionService._getCountInscriptionsWithReservation(
@ -198,11 +192,10 @@ const extraControllers = {
dataInscription.inscription = await eventInscriptionService._getInscriptionById(dataInscription.inscription.id); dataInscription.inscription = await eventInscriptionService._getInscriptionById(dataInscription.inscription.id);
return handleResultResponse(dataInscription.inscription, null, params, res, httpStatus.OK); return handleResultResponse(dataInscription.inscription, null, params, res, httpStatus.OK);
}; }
} catch (error) { } catch (error) {
return handleResultResponse("Error checkInscriptionByUser", error, params, res, httpStatus.NOT_FOUND); return handleResultResponse("Error checkInscriptionByUser", error, params, res, httpStatus.NOT_FOUND);
}; }
next(); next();
}, },
@ -226,17 +219,16 @@ const extraControllers = {
inscription.code_ticket_qr = await QRHelper.getInscriptionQRCode(member.qrConfig); inscription.code_ticket_qr = await QRHelper.getInscriptionQRCode(member.qrConfig);
//Si el usuario de la inscripción no es tutor limpiamos la información de la reserva //Si el usuario de la inscripción no es tutor limpiamos la información de la reserva
if (inscription.user.profile !== 'tutor') if (inscription.user.profile !== "tutor") if (inscription.reservation) inscription.reservation.assistants = null;
if (inscription.reservation) inscription.reservation.assistants = null;
if (inscription.reservation === null) { if (inscription.reservation === null) {
console.log('asigno green'); console.log("asigno green");
inscription.color = 'green'; inscription.color = "green";
/* parche */ /* parche */
inscription.reservation = { inscription.reservation = {
color: 'green', color: "green",
description: 'Entrada', description: "Entrada",
}; };
} }
@ -268,7 +260,6 @@ const extraControllers = {
} }
}, },
/////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////
//Esta función se llama solo desde APP //Esta función se llama solo desde APP
//Inscripción sin CODIGO DE RESERVA, SE MODIFICA EL CONFIRMED DEL EVENTO, YA QUE SE DESCONTARA DEL AFORO DEL EVENTO //Inscripción sin CODIGO DE RESERVA, SE MODIFICA EL CONFIRMED DEL EVENTO, YA QUE SE DESCONTARA DEL AFORO DEL EVENTO
@ -280,13 +271,7 @@ const extraControllers = {
let dataInscription = res.locals.dataInscription; let dataInscription = res.locals.dataInscription;
if (!dataInscription || !dataInscription.event) if (!dataInscription || !dataInscription.event)
return handleResultResponse( return handleResultResponse("Error prepareDataInscription requerida", null, params, res, httpStatus.NOT_FOUND);
"Error prepareDataInscription requerida",
null,
params,
res,
httpStatus.NOT_FOUND
);
let dataUser = res.locals.dataUser; let dataUser = res.locals.dataUser;
if (!dataUser) if (!dataUser)
@ -302,7 +287,6 @@ const extraControllers = {
); );
try { try {
//ONLINE //ONLINE
//Si es una inscripcion online no se validan aforos se crea inscripción y ya esta //Si es una inscripcion online no se validan aforos se crea inscripción y ya esta
if (dataInscription.type === "online" || dataInscription.type === "online group") { if (dataInscription.type === "online" || dataInscription.type === "online group") {
@ -317,23 +301,22 @@ const extraControllers = {
null null
); );
console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ENTRADA ONLINE", dataInscription.inscription); console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ENTRADA ONLINE", dataInscription.inscription);
}; }
//ONSITE INDIVIDUAL //ONSITE INDIVIDUAL
if (!dataInscription.inscription) { if (!dataInscription.inscription) {
let inscriptionsWithoutReservationAndOverflowCount = let inscriptionsWithoutReservationAndOverflowCount =
await eventInscriptionService._getCountInscriptionsWithoutReservationAndOverflow(dataInscription.event.id); await eventInscriptionService._getCountInscriptionsWithoutReservationAndOverflow(dataInscription.event.id);
++inscriptionsWithoutReservationAndOverflowCount; ++inscriptionsWithoutReservationAndOverflowCount;
console.log('Vamos a ver si hay aforo>>>>', inscriptionsWithoutReservationAndOverflowCount) console.log("Vamos a ver si hay aforo>>>>", inscriptionsWithoutReservationAndOverflowCount);
//COMPROBAMOS SI ES VALIDO O HAY QUE APUNTARLE A LA LISTA DE ESPERA DEL EVENTO //COMPROBAMOS SI ES VALIDO O HAY QUE APUNTARLE A LA LISTA DE ESPERA DEL EVENTO
if ( if (
dataInscription.event.sold_out == 0 && dataInscription.event.sold_out == 0 &&
dataInscription.event.assistants >= inscriptionsWithoutReservationAndOverflowCount dataInscription.event.assistants >= inscriptionsWithoutReservationAndOverflowCount
) { ) {
dataInscription.validated = true; dataInscription.validated = true;
console.log('actualizamos afoorooo>>>'); console.log("actualizamos afoorooo>>>");
//Actualizamos aforo del evento y creamos inscripcion //Actualizamos aforo del evento y creamos inscripcion
if ( if (
await eventService._updateConfirmedEvent( await eventService._updateConfirmedEvent(
@ -350,10 +333,11 @@ const extraControllers = {
dataInscription.source, dataInscription.source,
null, null,
null null
) );
} catch (error) { console.log('SSSSSSSSSSSSSSSSSSSSSSSSS', error) } } catch (error) {
console.log("SSSSSSSSSSSSSSSSSSSSSSSSS", error);
} }
else } else
return handleResultResponse( return handleResultResponse(
"No se ha podido actualizar el aforo del evento", "No se ha podido actualizar el aforo del evento",
null, null,
@ -361,7 +345,7 @@ const extraControllers = {
res, res,
httpStatus.NOT_FOUND httpStatus.NOT_FOUND
); );
console.log('Inscripcion hecha>>>', dataInscription.inscription); console.log("Inscripcion hecha>>>", dataInscription.inscription);
//Ponemos el evento en SOLD_OUT //Ponemos el evento en SOLD_OUT
if (dataInscription.event.assistants == inscriptionsWithoutReservationAndOverflowCount) if (dataInscription.event.assistants == inscriptionsWithoutReservationAndOverflowCount)
@ -381,7 +365,7 @@ const extraControllers = {
res, res,
httpStatus.NOT_FOUND httpStatus.NOT_FOUND
); );
}; }
//recuperamos la cantidad de apuntados al evento overflow (lista de espera) //recuperamos la cantidad de apuntados al evento overflow (lista de espera)
let ConfirmedWaitList = await eventInscriptionService._getCountInscriptionsWithOverflowEventId( let ConfirmedWaitList = await eventInscriptionService._getCountInscriptionsWithOverflowEventId(
@ -389,8 +373,10 @@ const extraControllers = {
); );
//recuperamos aforo de la lista de espera //recuperamos aforo de la lista de espera
dataInscription.overflow_event = await eventService._getEvent(dataInscription.event.overflow_eventId); dataInscription.overflow_event = await eventService._getEvent(dataInscription.event.overflow_eventId);
console.log("cantidad apuntados a lista de espera asociado, aforo >>>>>>>>>>>>>>>>>>>>>", console.log(
ConfirmedWaitList, dataInscription.overflow_event.assistants "cantidad apuntados a lista de espera asociado, aforo >>>>>>>>>>>>>>>>>>>>>",
ConfirmedWaitList,
dataInscription.overflow_event.assistants
); );
//Si no hay espacio a lista de espera damos el mismo error que no hay lista de espera //Si no hay espacio a lista de espera damos el mismo error que no hay lista de espera
@ -403,12 +389,10 @@ const extraControllers = {
res, res,
httpStatus.NOT_FOUND httpStatus.NOT_FOUND
); );
}; }
//Creamos inscripción a lista de espera //Creamos inscripción a lista de espera
if ( if (await eventService._updateConfirmedEvent(dataInscription.event.overflow_eventId, ConfirmedWaitList)) {
await eventService._updateConfirmedEvent(dataInscription.event.overflow_eventId, ConfirmedWaitList)
) {
dataInscription.inscription = await eventInscriptionService._createInscription( dataInscription.inscription = await eventInscriptionService._createInscription(
dataInscription.event.id, dataInscription.event.id,
dataUser.userResult.user.id, dataUser.userResult.user.id,
@ -421,7 +405,7 @@ const extraControllers = {
} else { } else {
console.log("No se ha podido actualizar el aforo de la lista de espera del evento"); console.log("No se ha podido actualizar el aforo de la lista de espera del evento");
return handleResultResponse( return handleResultResponse(
"o se ha podido actualizar el aforo de la lista de espera del evento", "No se ha podido actualizar el aforo de la lista de espera del evento",
null, null,
params, params,
res, res,
@ -429,28 +413,35 @@ const extraControllers = {
); );
} }
} //FIN APUNTARSE A la lista de espera si se puede } //FIN APUNTARSE A la lista de espera si se puede
}; }
dataInscription.inscription = await dataInscription.inscription.toJSON(); dataInscription.inscription = await dataInscription.inscription.toJSON();
//Incluimos correo en sendinblue //Incluimos correo en sendinblue
try { try {
marketingListService.addMarketingList(dataUser, dataInscription); marketingListService.addMarketingList(dataUser, dataInscription);
} catch (error) { console.log('Se ha producido un error al añadir a SenINBlue>>>>>>>>>>>>>>>>><<', error); } } catch (error) {
console.log("Se ha producido un error al añadir a Hubspot >>>>>>>>>>>>>>>>>", error);
}
//Mandamos correo con entrada o lista de espera //Mandamos correo con entrada o lista de espera
try { try {
mailService.sendEmailConfirm(dataUser, dataInscription); mailService.sendEmailConfirm(dataUser, dataInscription);
} catch (error) { console.log('Se ha producido un error al enviar mail>>>>>>>>>>>>>>>>><<', error); } } catch (error) {
console.log("Se ha producido un error al enviar mail>>>>>>>>>>>>>>>>><<", error);
}
return handleResultResponse(await dataInscription.inscription, null, params, res, httpStatus.CREATED); return handleResultResponse(await dataInscription.inscription, null, params, res, httpStatus.CREATED);
} catch (Error) { } catch (Error) {
return handleResultResponse("Error al crear la incripción createInscription", null, params, res, httpStatus.NOT_FOUND); return handleResultResponse(
"Error al crear la incripción createInscription",
null,
params,
res,
httpStatus.NOT_FOUND
);
} }
}, },
deleteInscription: async (req, res, next) => { deleteInscription: async (req, res, next) => {
const params = extractParamsFromRequest(req, res, {}); const params = extractParamsFromRequest(req, res, {});
const user = req.user; const user = req.user;
@ -471,7 +462,13 @@ const extraControllers = {
//En el caso de ser una inscripción grupal y el tutor se quiere quitar, se podrá hacer solo en el caso de que en la reserva no haya ya confirmados //En el caso de ser una inscripción grupal y el tutor se quiere quitar, se podrá hacer solo en el caso de que en la reserva no haya ya confirmados
if (inscription.user.profile === "tutor" && inscription.reservation && inscription.reservation.confirmed > 1) if (inscription.user.profile === "tutor" && inscription.reservation && inscription.reservation.confirmed > 1)
return handleResultResponse("No se pudo eliminar inscripción por ser tutor de grupo y tener alumnos apuntados, pongase en contacto con nosotros", null, params, res, httpStatus.NOT_FOUND) return handleResultResponse(
"No se pudo eliminar inscripción por ser tutor de grupo y tener alumnos apuntados, pongase en contacto con nosotros",
null,
params,
res,
httpStatus.NOT_FOUND
);
//Borramos inscripción //Borramos inscripción
if ((await eventInscriptionService._deleteInscription(inscription.id)) > 0) { if ((await eventInscriptionService._deleteInscription(inscription.id)) > 0) {
@ -479,41 +476,56 @@ const extraControllers = {
//En todos los casos en el que se elimine una inscripción hay que refrescar los confirmados de la reserva o del evento //En todos los casos en el que se elimine una inscripción hay que refrescar los confirmados de la reserva o del evento
//en el caso de ser un tutor que ha realizado una reserva y solo está el confirmado, se borra y punto no se actualiza nada //en el caso de ser un tutor que ha realizado una reserva y solo está el confirmado, se borra y punto no se actualiza nada
if (inscription.user.profile === "tutor" && inscription.reservation && inscription.reservation.confirmed === 1) { if (
inscription.user.profile === "tutor" &&
inscription.reservation &&
inscription.reservation.confirmed === 1
) {
//Eliminamos la reserva hecha del centro aliado //Eliminamos la reserva hecha del centro aliado
if (!((await eventReservationService._deleteReservation(inscription.reservation.id)) > 0)) if (!((await eventReservationService._deleteReservation(inscription.reservation.id)) > 0))
return handleResultResponse("No se pudo eliminar inscripción por ser tutor de grupo online y tener alumnos apuntados, pongase en contacto con nosotros", null, params, res, httpStatus.NOT_FOUND); return handleResultResponse(
"No se pudo eliminar inscripción por ser tutor de grupo online y tener alumnos apuntados, pongase en contacto con nosotros",
null,
params,
res,
httpStatus.NOT_FOUND
);
if (inscription.reservation.state === 'publish' && lodash.words(inscription.type).includes("onsite")) { if (inscription.reservation.state === "publish" && lodash.words(inscription.type).includes("onsite")) {
const eventOfReservation = await eventService._getEvent(inscription.reservation.eventId); const eventOfReservation = await eventService._getEvent(inscription.reservation.eventId);
//Modificamos los asistentes de evento (AFORO) para añadir las plazas de la reserva eliminada //Modificamos los asistentes de evento (AFORO) para añadir las plazas de la reserva eliminada
const newAforo = eventOfReservation.assistants + inscription.reservation.assistants; const newAforo = eventOfReservation.assistants + inscription.reservation.assistants;
if (!(await eventService._updateAssistantsEvent(eventOfReservation.id, newAforo))) if (!(await eventService._updateAssistantsEvent(eventOfReservation.id, newAforo)))
return handleResultResponse("No se ha podido actualizar el aforo del evento, para reservar las plazas solicitadas", null, params, res, httpStatus.NOT_FOUND); return handleResultResponse(
"No se ha podido actualizar el aforo del evento, para reservar las plazas solicitadas",
null,
params,
res,
httpStatus.NOT_FOUND
);
} }
} }
else
//En el caso de ser cualquier usuario o un tutor inscrito de forma libre o a una reserva de la que no es titular //En el caso de ser cualquier usuario o un tutor inscrito de forma libre o a una reserva de la que no es titular
//Actualizamos confirmados asistentes //Actualizamos confirmados asistentes
refreshConfirmed(inscription); else refreshConfirmed(inscription);
} } else return handleResultResponse("No se pudo eliminar inscripción", null, params, res, httpStatus.NOT_FOUND);
else
return handleResultResponse("No se pudo eliminar inscripción", null, params, res, httpStatus.NOT_FOUND);
//Quitamos correo en sendinblue //Quitamos correo en sendinblue
try { try {
await marketingListService._deleteMember(marketingListId, inscription.user.email); await marketingListService._deleteMember(marketingListId, inscription.user.email, inscription);
} catch (error) { console.log('Se ha producido un error al eliminar de SenINBlue>>>>>>>>>>>>>>>>><<', error); } } catch (error) {
console.log("Se ha producido un error al eliminar de SenINBlue>>>>>>>>>>>>>>>>><<", error);
}
//Mandamos correo de confirmación de eliminación //Mandamos correo de confirmación de eliminación
try { try {
mailService.sendEmailCancelate(inscription); mailService.sendEmailCancelate(inscription);
} catch (error) { console.log('Se ha producido un error al enviar mail>>>>>>>>>>>>>>>>><<', error); } } catch (error) {
console.log("Se ha producido un error al enviar mail>>>>>>>>>>>>>>>>><<", error);
}
console.log(">>>>>>>>>>>>>>Inscripcion eliminada con todos los pasos"); console.log(">>>>>>>>>>>>>>Inscripcion eliminada con todos los pasos");
return handleResultResponse("Inscripción eliminada", null, params, res, httpStatus.DELETEOK); return handleResultResponse("Inscripción eliminada", null, params, res, httpStatus.DELETEOK);
} catch (error) { } catch (error) {
console.log("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeerrrrrrrrrrrrrrrrrrorrrr", error); console.log("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeerrrrrrrrrrrrrrrrrrorrrr", error);
return handleResultResponse("Error al eliminar inscripción", null, params, res, httpStatus.NOT_FOUND); return handleResultResponse("Error al eliminar inscripción", null, params, res, httpStatus.NOT_FOUND);
@ -521,7 +533,6 @@ const extraControllers = {
}, },
deleteInscriptionsByUser: async (req, res, next) => { deleteInscriptionsByUser: async (req, res, next) => {
try { try {
//const context = buildContext(req, config); //const context = buildContext(req, config);
//const user = context.user ? context.user : null; //const user = context.user ? context.user : null;
@ -538,10 +549,7 @@ const extraControllers = {
} catch (error) { } catch (error) {
console.error(error); console.error(error);
} }
} },
}; };
module.exports = generateControllers(eventInscriptionService, extraControllers, controllerOptions); module.exports = generateControllers(eventInscriptionService, extraControllers, controllerOptions);

View File

@ -5,7 +5,6 @@ const _ = require("lodash");
const moment = require("moment"); const moment = require("moment");
const { generateService, parseParamsToFindOptions } = require("../../helpers/service.helper"); const { generateService, parseParamsToFindOptions } = require("../../helpers/service.helper");
const models = require("../../core/models"); const models = require("../../core/models");
const marketing = require("../../helpers/sendinblue.helper");
const Sequelize = require("sequelize"); const Sequelize = require("sequelize");
const xlsx = require("node-xlsx"); const xlsx = require("node-xlsx");
const fs = require("fs"); const fs = require("fs");
@ -37,9 +36,9 @@ const extraMethods = {
_fillInscriptionColor: (inscription) => { _fillInscriptionColor: (inscription) => {
if (inscription && inscription.type) { if (inscription && inscription.type) {
const isVirtual = inscription.type === "online" || inscription.type === "online group"; const isVirtual = inscription.type === "online" || inscription.type === "online group";
if ((inscription.reservationId === null) && (!isVirtual)) { if (inscription.reservationId === null && !isVirtual) {
// Inscripción normal // Inscripción normal
inscription.color = 'green'; inscription.color = "green";
} }
} }
@ -229,7 +228,6 @@ const extraMethods = {
}, },
_deleteInscriptionByUser: (userId) => { _deleteInscriptionByUser: (userId) => {
return models.EventInscription.destroy({ return models.EventInscription.destroy({
where: { where: {
userId: userId, userId: userId,
@ -239,7 +237,6 @@ const extraMethods = {
//Elimina todas las inscripciones de una determinada reserva/invitacion //Elimina todas las inscripciones de una determinada reserva/invitacion
_deleteInscriptionsByReservation: (reservationId) => { _deleteInscriptionsByReservation: (reservationId) => {
return models.EventInscription.destroy({ return models.EventInscription.destroy({
where: { where: {
reservationId: reservationId, reservationId: reservationId,
@ -280,23 +277,19 @@ const extraMethods = {
); );
}, },
_getInscriptionsWithoutMemberId: (eventId) => { _getInscriptionsWithoutMemberId: (eventId) => {
return models.EventInscription.scope(["includeEventAndVenue", "includeReservation", "defaultScope"]).findAll({ return models.EventInscription.scope(["includeEventAndVenue", "includeReservation", "defaultScope"]).findAll({
where: { where: {
eventId: eventId, eventId: eventId,
marketing_memberId: null marketing_memberId: null,
}, },
}); });
}, },
_getInscriptionsExcel: (user, eventId, callback) => { _getInscriptionsExcel: (user, eventId, callback) => {
console.log("DESCARGA EXCEL INSCRIPCIONES TOTALES>>>>>>>> "); console.log("DESCARGA EXCEL INSCRIPCIONES TOTALES>>>>>>>> ");
console.log(">>>>>>>>>>>>>>>>>>>><consulta con eventId:", eventId); console.log(">>>>>>>>>>>>>>>>>>>><consulta con eventId:", eventId);
models.EventInscription.findAll({ models.EventInscription.findAll({
where: { where: {
eventId: eventId, eventId: eventId,
@ -397,10 +390,6 @@ const extraMethods = {
); );
}); });
}, },
}; };
module.exports = generateService(models.EventInscription, extraMethods); module.exports = generateService(models.EventInscription, extraMethods);

View File

@ -1,7 +1,7 @@
"use strict"; "use strict";
const eventInscriptionService = require("./events_inscriptions.service"); const eventInscriptionService = require("./events_inscriptions.service");
const marketing = require("../../helpers/sendinblue.helper"); const marketing = require("../../helpers/hubspot.helper"); // <--- HUBSPOT
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// dataInscription {incription:{...}, event:{...}, reservation:{...}, user:{...}} // dataInscription {incription:{...}, event:{...}, reservation:{...}, user:{...}}
@ -16,24 +16,22 @@ const marketing = require("../../helpers/sendinblue.helper");
marketingListOfInscription = dataInscription.event.marketingList; marketingListOfInscription = dataInscription.event.marketingList;
*/ */
function _generateMarketingDTO(dataInscription) { function _generateMarketingDTO(dataInscription) {
console.log('entro _generateMarketingDTO >>> ', dataInscription); console.log("entro _generateMarketingDTO >>> ", dataInscription);
let { event, inscription, user, reservation } = dataInscription; let { event, inscription, user, reservation } = dataInscription;
let inscriptionDTO = {}; let inscriptionDTO = {};
//En el caso de generar el MarketingDTO para el ticket de la APP, fallaba porque el propio dataInscription, es la inscription y de el cuelgan user, event y reservation //En el caso de generar el MarketingDTO para el ticket de la APP, fallaba porque el propio dataInscription, es la inscription y de el cuelgan user, event y reservation
//Sin embargo cuando se llama desde addMarketingList la inscription cualga de dataInscripcion como el resto de elementos //Sin embargo cuando se llama desde addMarketingList la inscription cualga de dataInscripcion como el resto de elementos
if (dataInscription) if (dataInscription) if (!inscription) inscription = dataInscription;
if (!inscription)
inscription = dataInscription;
if (!event) { if (!event) {
throw new Error('Falta datos del evento en la inscripción (_generateMarketingDTO)'); throw new Error("Falta datos del evento en la inscripción (_generateMarketingDTO)");
} }
if (!event.marketing_list) { /*if (!event.marketing_list) { <-- YA NO HACE FALTA CON HUBSPOT
console.warn('Falta rellenar la lista de Sendinblue en el evento (_generateMarketingDTO)', event.name); console.warn("Falta rellenar la lista de Sendinblue en el evento (_generateMarketingDTO)", event.name);
} }*/
if (inscription) { if (inscription) {
inscriptionDTO.id = inscription.id; inscriptionDTO.id = inscription.id;
@ -41,6 +39,8 @@ function _generateMarketingDTO(dataInscription) {
inscriptionDTO.event_name = event.name ? event.name : "N/A"; inscriptionDTO.event_name = event.name ? event.name : "N/A";
inscriptionDTO.event_date = event.init_date ? event.init_date : "N/A"; inscriptionDTO.event_date = event.init_date ? event.init_date : "N/A";
inscriptionDTO.event_marketing_list = event ? event.marketing_list : null; inscriptionDTO.event_marketing_list = event ? event.marketing_list : null;
inscriptionDTO.event_country = event ? event.location.country : null;
inscriptionDTO.event_city = event ? event.location.city : null;
inscriptionDTO.date_inscription = inscription.date; inscriptionDTO.date_inscription = inscription.date;
inscriptionDTO.code_ticket = inscription.code_ticket; inscriptionDTO.code_ticket = inscription.code_ticket;
inscriptionDTO.validated = inscription.validated; inscriptionDTO.validated = inscription.validated;
@ -51,18 +51,24 @@ function _generateMarketingDTO(dataInscription) {
inscriptionDTO.qrConfig = null; inscriptionDTO.qrConfig = null;
inscriptionDTO.qrCode = null; inscriptionDTO.qrCode = null;
/** HUBSPOT */
// inscriptionDTO.event_city = event.venue ? event.venue.city : null;
// inscriptionDTO.event_country = event.venue ? event.venue.country : null;
if (user) { if (user) {
//Era para mailchimp //Era para mailchimp
/// inscriptionDTO.marketing_memberId = inscription.marketing_memberId ? inscription.marketing_memberId : null; /// inscriptionDTO.marketing_memberId = inscription.marketing_memberId ? inscription.marketing_memberId : null;
inscriptionDTO.email = user.email; inscriptionDTO.email = user.email;
inscriptionDTO.name = user.name; inscriptionDTO.name = user.name;
inscriptionDTO.surname = user.surname; inscriptionDTO.surname = user.surname;
inscriptionDTO.phone = user.phone; // <-- HUBSPOT
inscriptionDTO.profile = user.profile; // <-- HUBSPOT
inscriptionDTO.userId = user.id; inscriptionDTO.userId = user.id;
inscriptionDTO.entity = reservation && reservation.Entity ? reservation.Entity.name : (user.Entity ? user.Entity.name : user.entityId); inscriptionDTO.entity =
}; reservation && reservation.Entity ? reservation.Entity.name : user.Entity ? user.Entity.name : user.entityId;
} }
console.log('salgo>>>', inscriptionDTO); }
console.log("salgo>>>", inscriptionDTO);
return inscriptionDTO; return inscriptionDTO;
} }
@ -70,17 +76,20 @@ function sleep(time) {
return new Promise((resolve) => setTimeout(resolve, time)); return new Promise((resolve) => setTimeout(resolve, time));
} }
async function _addMember(inscriptionDTO) { async function _addMember(inscriptionDTO) {
console.debug('>>>> _addMember', inscriptionDTO.email); console.debug(">>>> _addMember", inscriptionDTO.email);
console.debug('>>>> event_marketing_list', inscriptionDTO.event_marketing_list); console.debug(">>>> event_marketing_list", inscriptionDTO.event_marketing_list);
// console.debug(member); // console.debug(member);
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
if (!inscriptionDTO.event_marketing_list) { //if (!inscriptionDTO.event_marketing_list) {
// || !member.validated) { // || !member.validated) {
resolve(inscriptionDTO); //resolve(inscriptionDTO);
} else { //} else {
/**
* HUBSPOT
*/
marketing marketing
.addMemberToList(inscriptionDTO.event_marketing_list, inscriptionDTO) .addMemberToList(inscriptionDTO.event_marketing_list, inscriptionDTO)
.then(function (result) { .then(function (result) {
@ -89,45 +98,31 @@ async function _addMember(inscriptionDTO) {
.catch(function (error) { .catch(function (error) {
reject(error); reject(error);
}); });
} //}
}); });
} }
async function _deleteMember(idLista, email) { async function _deleteMember(idLista, email, inscription = undefined) {
console.debug( console.debug("Elimino miembro de la lista de marketing>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<", email, idLista);
"Elimino miembro de la lista de marketing>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<",
email,
idLista,
);
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
if (!idLista || !email) { resolve(marketing.deleteMemberFromList(idLista, email, inscription));
resolve();
} else {
resolve(marketing.deleteMemberFromList(idLista, email));
}
}); });
} }
async function addMarketingList(dataUser, dataInscription) { async function addMarketingList(dataUser, dataInscription) {
dataInscription.user = dataUser.userResult.user; dataInscription.user = dataUser.userResult.user;
return _addMember(_generateMarketingDTO(dataInscription)); return _addMember(_generateMarketingDTO(dataInscription));
} }
async function syncronizeEventWithMarketingList(eventId) { async function syncronizeEventWithMarketingList(eventId) {
let result = false; let result = false;
try { try {
let inscriptionsToSync = await eventInscriptionService._getInscriptionsWithoutMemberId(eventId); let inscriptionsToSync = await eventInscriptionService._getInscriptionsWithoutMemberId(eventId);
for (var i = 0; i < inscriptionsToSync.length; i++) { for (var i = 0; i < inscriptionsToSync.length; i++) {
const item = inscriptionsToSync[i].get({ const item = inscriptionsToSync[i].get({
plain: true plain: true,
}); });
//Adaptamos el objeto a lo que espera _generateMarketingDTO //Adaptamos el objeto a lo que espera _generateMarketingDTO
// dataInscription {incription:{...}, event:{...}, reservation:{...}, user:{...}} // dataInscription {incription:{...}, event:{...}, reservation:{...}, user:{...}}
@ -139,8 +134,7 @@ async function syncronizeEventWithMarketingList(eventId) {
// console.log(marketingDTO) // console.log(marketingDTO)
// _deleteMember(marketingDTO.event_marketing_list, marketingDTO.email) // _deleteMember(marketingDTO.event_marketing_list, marketingDTO.email)
}); });
}
};
result = true; result = true;
return result; return result;
@ -149,24 +143,23 @@ async function syncronizeEventWithMarketingList(eventId) {
} }
} }
function userToMarketingDTO(user) { function userToMarketingDTO(user) {
const result = {}; const result = {};
result.email = user.email ? user.email : ''; result.email = user.email ? user.email : "";
result.name = user.name ? user.name : ''; result.name = user.name ? user.name : "";
result.surname = user.surname ? user.surname : ''; result.surname = user.surname ? user.surname : "";
result.userId = user.id ? user.id : ''; result.phone = user.phone ? user.phone : "";
result.entity = user.Entity ? user.Entity.name : ''; result.userId = user.id ? user.id : "";
result.profile = user.profile ? user.profile : "";
result.entity = user.Entity ? user.Entity.name : "";
return result; return result;
} }
module.exports = { module.exports = {
syncronizeEventWithMarketingList, syncronizeEventWithMarketingList,
addMarketingList, addMarketingList,
_deleteMember, _deleteMember,
_generateMarketingDTO, _generateMarketingDTO,
userToMarketingDTO, userToMarketingDTO,
}; };

View File

@ -6,7 +6,7 @@
"license": "ISC", "license": "ISC",
"main": "server.js", "main": "server.js",
"scripts": { "scripts": {
"start": "NODE_ENV=development nodemon server.js", "start": "NODE_ENV=development nodemon --inspect=0.0.0.0 server.js",
"start:prod": "NODE_ENV=production pm2 start server.js -n 'api3' -i 4 --node-args='--max_old_space_size=4096'", "start:prod": "NODE_ENV=production pm2 start server.js -n 'api3' -i 4 --node-args='--max_old_space_size=4096'",
"lint": "eslint **/*.js --quiet", "lint": "eslint **/*.js --quiet",
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1"
@ -20,6 +20,7 @@
"nodemon": "^1.18.9" "nodemon": "^1.18.9"
}, },
"dependencies": { "dependencies": {
"@hubspot/api-client": "^11.1.0",
"apicache": "^1.4.0", "apicache": "^1.4.0",
"args-list": "^0.3.3", "args-list": "^0.3.3",
"async": "^2.6.2", "async": "^2.6.2",