UNPKG

skailan-crm

Version:

Servicio de CRM y gestión de ventas para Skailan

120 lines 5.39 kB
import { Contact } from "@skailan/contacts/dist/domain/entities/Contact"; export class ContactIntegrationServiceImpl { contactsServiceUrl; constructor(contactsServiceUrl = process.env.CONTACTS_SERVICE_URL || "http://localhost:3009") { this.contactsServiceUrl = contactsServiceUrl; } async syncLeadWithContact(lead) { try { // Buscar si ya existe un contacto con el mismo email const existingContact = await this.findContactByLeadEmail(lead.email, lead.organizationId); if (existingContact) { // Actualizar contacto existente con información del lead const updatedContact = this.updateContactFromLead(existingContact, lead); return await this.updateContact(updatedContact); } else { // Crear nuevo contacto const newContact = this.convertLeadToContact(lead); return await this.createContact(newContact); } } catch (error) { console.error("Error syncing lead with contact:", error); throw new Error(`Failed to sync lead with contact: ${error}`); } } async findContactByLeadEmail(email, organizationId) { try { const response = await fetch(`${this.contactsServiceUrl}/contacts/search?email=${email}&organizationId=${organizationId}`, { method: "GET", headers: { "Content-Type": "application/json", "x-tenant-id": organizationId, }, }); if (response.ok) { const contactData = (await response.json()); return contactData ? new Contact(contactData.id, contactData.organizationId, contactData.externalId, contactData.name, contactData.email, contactData.phone, contactData.profilePictureUrl, contactData.metadata, new Date(contactData.createdAt), new Date(contactData.updatedAt)) : null; } return null; } catch (error) { console.error("Error finding contact by email:", error); return null; } } convertLeadToContact(lead) { return new Contact(lead.id, // Usar el mismo ID para mantener consistencia lead.organizationId, lead.email || lead.phone || lead.id, // externalId lead.name, lead.email, lead.phone, null, // profilePictureUrl { source: lead.source, company: lead.company, title: lead.title, industry: lead.industry, score: lead.score, status: lead.status, notes: lead.notes, leadId: lead.id, }, // metadata lead.createdAt, lead.updatedAt); } updateLeadFromContact(lead, contact) { // Actualizar información del lead con datos del contacto lead.updateContactInfo(contact.email, contact.phone); // Actualizar metadata si es necesario if (contact.metadata) { lead.enrichData(contact.metadata.company || null, contact.metadata.title || null, contact.metadata.industry || null); } return lead; } updateContactFromLead(contact, lead) { contact.updateInfo(lead.name, lead.email, lead.phone, contact.profilePictureUrl, { ...contact.metadata, source: lead.source, company: lead.company, title: lead.title, industry: lead.industry, score: lead.score, status: lead.status, notes: lead.notes, leadId: lead.id, }); return contact; } async createContact(contact) { const response = await fetch(`${this.contactsServiceUrl}/contacts`, { method: "POST", headers: { "Content-Type": "application/json", "x-tenant-id": contact.organizationId, }, body: JSON.stringify(contact.toJSON()), }); if (!response.ok) { throw new Error(`Failed to create contact: ${response.statusText}`); } const contactData = (await response.json()); return new Contact(contactData.id, contactData.organizationId, contactData.externalId, contactData.name, contactData.email, contactData.phone, contactData.profilePictureUrl, contactData.metadata, new Date(contactData.createdAt), new Date(contactData.updatedAt)); } async updateContact(contact) { const response = await fetch(`${this.contactsServiceUrl}/contacts/${contact.id}`, { method: "PUT", headers: { "Content-Type": "application/json", "x-tenant-id": contact.organizationId, }, body: JSON.stringify(contact.toJSON()), }); if (!response.ok) { throw new Error(`Failed to update contact: ${response.statusText}`); } const contactData = (await response.json()); return new Contact(contactData.id, contactData.organizationId, contactData.externalId, contactData.name, contactData.email, contactData.phone, contactData.profilePictureUrl, contactData.metadata, new Date(contactData.createdAt), new Date(contactData.updatedAt)); } } //# sourceMappingURL=ContactIntegrationService.js.map