app2-api/modules/events/marketing_list.service.js

166 lines
6.4 KiB
JavaScript

"use strict";
const eventInscriptionService = require("./events_inscriptions.service");
const marketing = require("../../helpers/hubspot.helper"); // <--- HUBSPOT
////////////////////////////////////////////////////////////////////
// dataInscription {incription:{...}, event:{...}, reservation:{...}, user:{...}}
////////////////////////////////////////////////////////////////////
/*AHORA SE ALMACENA TODO EN UNA ÚNICA LISTA DE MAILCHIMP, QUE ES LA DEL EVENTO
(si en un futuro se quiere tener listas independientes, bastaría con tratarlo aqui los campos de marketinglist de la reserva ...)
if (dataInscription.inscription.reservationId)
marketingListOfInscription = dataInscription.reservation.marketingList
else if (dataInscription.inscription.overflowEventId)
marketingListOfInscription = (await _getEvent(dataInscription.inscription.overflowEventId)).marketingList;
else
marketingListOfInscription = dataInscription.event.marketingList;
*/
function _generateMarketingDTO(dataInscription) {
console.log("entro _generateMarketingDTO >>> ", dataInscription);
let { event, inscription, user, reservation } = dataInscription;
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
//Sin embargo cuando se llama desde addMarketingList la inscription cualga de dataInscripcion como el resto de elementos
if (dataInscription) if (!inscription) inscription = dataInscription;
if (!event) {
throw new Error("Falta datos del evento en la inscripción (_generateMarketingDTO)");
}
/*if (!event.marketing_list) { <-- YA NO HACE FALTA CON HUBSPOT
console.warn("Falta rellenar la lista de Sendinblue en el evento (_generateMarketingDTO)", event.name);
}*/
if (inscription) {
inscriptionDTO.id = inscription.id;
inscriptionDTO.source = inscription.source;
inscriptionDTO.event_name = event.name ? event.name : "N/A";
inscriptionDTO.event_date = event.init_date ? event.init_date : "N/A";
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.code_ticket = inscription.code_ticket;
inscriptionDTO.validated = inscription.validated;
inscriptionDTO.reservation_code = reservation ? reservation.reservation_code : null;
inscriptionDTO.color = reservation ? reservation.color : "darkgreen";
inscriptionDTO.description = (reservation ? reservation.description : "Entrada").toUpperCase();
inscriptionDTO.qrConfig = 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) {
//Era para mailchimp
/// inscriptionDTO.marketing_memberId = inscription.marketing_memberId ? inscription.marketing_memberId : null;
inscriptionDTO.email = user.email;
inscriptionDTO.name = user.name;
inscriptionDTO.surname = user.surname;
inscriptionDTO.phone = user.phone; // <-- HUBSPOT
inscriptionDTO.profile = user.profile; // <-- HUBSPOT
inscriptionDTO.userId = user.id;
inscriptionDTO.entity =
reservation && reservation.Entity ? reservation.Entity.name : user.Entity ? user.Entity.name : user.entityId;
}
}
console.log("salgo>>>", inscriptionDTO);
return inscriptionDTO;
}
function sleep(time) {
return new Promise((resolve) => setTimeout(resolve, time));
}
async function _addMember(inscriptionDTO) {
console.debug(">>>> _addMember", inscriptionDTO.email);
console.debug(">>>> event_marketing_list", inscriptionDTO.event_marketing_list);
// console.debug(member);
return new Promise(function (resolve, reject) {
//if (!inscriptionDTO.event_marketing_list) {
// || !member.validated) {
//resolve(inscriptionDTO);
//} else {
/**
* HUBSPOT
*/
marketing
.addMemberToList(inscriptionDTO.event_marketing_list, inscriptionDTO)
.then(function (result) {
resolve(result.ID);
})
.catch(function (error) {
reject(error);
});
//}
});
}
async function _deleteMember(idLista, email, inscription = undefined) {
console.debug("Elimino miembro de la lista de marketing>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<", email, idLista);
return new Promise(function (resolve, reject) {
resolve(marketing.deleteMemberFromList(idLista, email, inscription));
});
}
async function addMarketingList(dataUser, dataInscription) {
dataInscription.user = dataUser.userResult.user;
return _addMember(_generateMarketingDTO(dataInscription));
}
async function syncronizeEventWithMarketingList(eventId) {
let result = false;
try {
let inscriptionsToSync = await eventInscriptionService._getInscriptionsWithoutMemberId(eventId);
for (var i = 0; i < inscriptionsToSync.length; i++) {
const item = inscriptionsToSync[i].get({
plain: true,
});
//Adaptamos el objeto a lo que espera _generateMarketingDTO
// dataInscription {incription:{...}, event:{...}, reservation:{...}, user:{...}}
// en _getInscriptionsWithoutMemberId devuelve la inscripcion en el raiz
item.inscription = item;
sleep(1000 * i).then(function () {
let inscriptionDTO = _addMember(_generateMarketingDTO(item));
// let marketingDTO = _generateMarketingDTO(item);
// console.log(marketingDTO)
// _deleteMember(marketingDTO.event_marketing_list, marketingDTO.email)
});
}
result = true;
return result;
} catch (error) {
console.log("No se ha podido _syncronizeEventWithMarketingList", error);
}
}
function userToMarketingDTO(user) {
const result = {};
result.email = user.email ? user.email : "";
result.name = user.name ? user.name : "";
result.surname = user.surname ? user.surname : "";
result.phone = user.phone ? user.phone : "";
result.userId = user.id ? user.id : "";
result.profile = user.profile ? user.profile : "";
result.entity = user.Entity ? user.Entity.name : "";
return result;
}
module.exports = {
syncronizeEventWithMarketingList,
addMarketingList,
_deleteMember,
_generateMarketingDTO,
userToMarketingDTO,
};