skailan-crm
Version:
Servicio de CRM y gestión de ventas para Skailan
206 lines • 7.69 kB
JavaScript
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