UNPKG

skailan-crm

Version:

Servicio de CRM y gestión de ventas para Skailan

206 lines 7.69 kB
import { CreateOpportunity } from "../../app/use-cases/CreateOpportunity"; import { GetOpportunityById } from "../../app/use-cases/GetOpportunityById"; import { ListOpportunities } from "../../app/use-cases/ListOpportunities"; import { UpdateOpportunity } from "../../app/use-cases/UpdateOpportunity"; import { DeleteOpportunity } from "../../app/use-cases/DeleteOpportunity"; import { GetSalesForecast } from "../../app/use-cases/GetSalesForecast"; import { OpportunityPrismaRepository } from "../../infra/database/prisma/OpportunityPrismaRepository"; import { LeadPrismaRepository } from "../../infra/database/prisma/LeadPrismaRepository"; export const createOpportunity = async (req, res) => { try { const { leadId, name, amount, probability, closeDate, notes } = req.body; const organizationId = req.organization?.id; if (!organizationId) { return res .status(400) .json({ error: "Organization ID not found in request." }); } const prisma = req.tenantPrisma; if (!prisma) { return res .status(500) .json({ error: "Prisma client not initialized for tenant." }); } const opportunityRepository = new OpportunityPrismaRepository(prisma); const leadRepository = new LeadPrismaRepository(prisma); const createOpportunityUseCase = new CreateOpportunity(opportunityRepository, leadRepository); const newOpportunity = await createOpportunityUseCase.execute({ organizationId, leadId, name, amount, probability, closeDate: closeDate ? new Date(closeDate) : undefined, notes, }); res.status(201).json(newOpportunity); } catch (error) { res .status(500) .json({ error: error.message || "Error creating opportunity." }); } }; export const getOpportunityById = async (req, res) => { try { const { id } = req.params; const organizationId = req.organization?.id; if (!organizationId) { return res .status(400) .json({ error: "Organization ID not found in request." }); } if (!id) { return res.status(400).json({ error: "Opportunity ID is required." }); } const prisma = req.tenantPrisma; if (!prisma) { return res .status(500) .json({ error: "Prisma client not initialized for tenant." }); } const opportunityRepository = new OpportunityPrismaRepository(prisma); const getOpportunityByIdUseCase = new GetOpportunityById(opportunityRepository); const opportunity = await getOpportunityByIdUseCase.execute({ id, organizationId, }); if (!opportunity) { return res.status(404).json({ error: "Opportunity not found." }); } res.status(200).json(opportunity); } catch (error) { res .status(500) .json({ error: error.message || "Error retrieving opportunity." }); } }; export const listOpportunities = async (req, res) => { try { const organizationId = req.organization?.id; const leadId = req.query.leadId; if (!organizationId) { return res .status(400) .json({ error: "Organization ID not found in request." }); } const prisma = req.tenantPrisma; if (!prisma) { return res .status(500) .json({ error: "Prisma client not initialized for tenant." }); } const opportunityRepository = new OpportunityPrismaRepository(prisma); const listOpportunitiesUseCase = new ListOpportunities(opportunityRepository); const opportunities = await listOpportunitiesUseCase.execute({ organizationId, leadId, }); res.status(200).json(opportunities); } catch (error) { res .status(500) .json({ error: error.message || "Error listing opportunities." }); } }; export const updateOpportunity = async (req, res) => { try { const { id } = req.params; const { name, stage, amount, probability, closeDate, notes } = req.body; const organizationId = req.organization?.id; if (!organizationId) { return res .status(400) .json({ error: "Organization ID not found in request." }); } if (!id) { return res.status(400).json({ error: "Opportunity ID is required." }); } const prisma = req.tenantPrisma; if (!prisma) { return res .status(500) .json({ error: "Prisma client not initialized for tenant." }); } const opportunityRepository = new OpportunityPrismaRepository(prisma); const updateOpportunityUseCase = new UpdateOpportunity(opportunityRepository); const updatedOpportunity = await updateOpportunityUseCase.execute({ id, organizationId, name, stage, amount, probability, closeDate: closeDate ? new Date(closeDate) : undefined, notes, }); res.status(200).json(updatedOpportunity); } catch (error) { res .status(500) .json({ error: error.message || "Error updating opportunity." }); } }; export const deleteOpportunity = async (req, res) => { try { const { id } = req.params; const organizationId = req.organization?.id; if (!organizationId) { return res .status(400) .json({ error: "Organization ID not found in request." }); } if (!id) { return res.status(400).json({ error: "Opportunity ID is required." }); } const prisma = req.tenantPrisma; if (!prisma) { return res .status(500) .json({ error: "Prisma client not initialized for tenant." }); } const opportunityRepository = new OpportunityPrismaRepository(prisma); const deleteOpportunityUseCase = new DeleteOpportunity(opportunityRepository); await deleteOpportunityUseCase.execute({ id, organizationId, }); res.status(204).send(); } catch (error) { res .status(500) .json({ error: error.message || "Error deleting opportunity." }); } }; export const getSalesForecast = async (req, res) => { try { const organizationId = req.organization?.id; if (!organizationId) { return res .status(400) .json({ error: "Organization ID not found in request." }); } const prisma = req.tenantPrisma; if (!prisma) { return res .status(500) .json({ error: "Prisma client not initialized for tenant." }); } const opportunityRepository = new OpportunityPrismaRepository(prisma); const getSalesForecastUseCase = new GetSalesForecast(opportunityRepository); const forecast = await getSalesForecastUseCase.execute({ organizationId, }); res.status(200).json(forecast); } catch (error) { res .status(500) .json({ error: error.message || "Error getting sales forecast." }); } }; //# sourceMappingURL=opportunityController.js.map