skailan-crm
Version:
Servicio de CRM y gestión de ventas para Skailan
197 lines • 7.26 kB
JavaScript
import { CreateQuote } from "../../app/use-cases/CreateQuote";
import { GetQuoteById } from "../../app/use-cases/GetQuoteById";
import { ListQuotes } from "../../app/use-cases/ListQuotes";
import { UpdateQuote } from "../../app/use-cases/UpdateQuote";
import { DeleteQuote } from "../../app/use-cases/DeleteQuote";
import { IncrementQuoteVersion } from "../../app/use-cases/IncrementQuoteVersion";
import { QuotePrismaRepository } from "../../infra/database/prisma/QuotePrismaRepository";
import { OpportunityPrismaRepository } from "../../infra/database/prisma/OpportunityPrismaRepository";
export const createQuote = async (req, res) => {
try {
const { opportunityId, quoteNumber, totalAmount } = 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 quoteRepository = new QuotePrismaRepository(prisma);
const opportunityRepository = new OpportunityPrismaRepository(prisma);
const createQuoteUseCase = new CreateQuote(quoteRepository, opportunityRepository);
const newQuote = await createQuoteUseCase.execute({
organizationId,
opportunityId,
quoteNumber,
totalAmount,
});
res.status(201).json(newQuote);
}
catch (error) {
res.status(500).json({ error: error.message || "Error creating quote." });
}
};
export const getQuoteById = 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: "Quote ID is required." });
}
const prisma = req.tenantPrisma;
if (!prisma) {
return res
.status(500)
.json({ error: "Prisma client not initialized for tenant." });
}
const quoteRepository = new QuotePrismaRepository(prisma);
const getQuoteByIdUseCase = new GetQuoteById(quoteRepository);
const quote = await getQuoteByIdUseCase.execute({
id,
organizationId,
});
if (!quote) {
return res.status(404).json({ error: "Quote not found." });
}
res.status(200).json(quote);
}
catch (error) {
res.status(500).json({ error: error.message || "Error retrieving quote." });
}
};
export const listQuotes = async (req, res) => {
try {
const organizationId = req.organization?.id;
const opportunityId = req.query.opportunityId;
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 quoteRepository = new QuotePrismaRepository(prisma);
const listQuotesUseCase = new ListQuotes(quoteRepository);
const quotes = await listQuotesUseCase.execute({
organizationId,
opportunityId,
});
res.status(200).json(quotes);
}
catch (error) {
res.status(500).json({ error: error.message || "Error listing quotes." });
}
};
export const updateQuote = async (req, res) => {
try {
const { id } = req.params;
const { status, totalAmount, version, signedAt, signedBy } = 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: "Quote ID is required." });
}
const prisma = req.tenantPrisma;
if (!prisma) {
return res
.status(500)
.json({ error: "Prisma client not initialized for tenant." });
}
const quoteRepository = new QuotePrismaRepository(prisma);
const updateQuoteUseCase = new UpdateQuote(quoteRepository);
const updatedQuote = await updateQuoteUseCase.execute({
id,
organizationId,
status,
totalAmount,
version,
signedAt: signedAt ? new Date(signedAt) : undefined,
signedBy,
});
res.status(200).json(updatedQuote);
}
catch (error) {
res.status(500).json({ error: error.message || "Error updating quote." });
}
};
export const deleteQuote = 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: "Quote ID is required." });
}
const prisma = req.tenantPrisma;
if (!prisma) {
return res
.status(500)
.json({ error: "Prisma client not initialized for tenant." });
}
const quoteRepository = new QuotePrismaRepository(prisma);
const deleteQuoteUseCase = new DeleteQuote(quoteRepository);
await deleteQuoteUseCase.execute({
id,
organizationId,
});
res.status(204).send();
}
catch (error) {
res.status(500).json({ error: error.message || "Error deleting quote." });
}
};
export const incrementQuoteVersion = 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: "Quote ID is required." });
}
const prisma = req.tenantPrisma;
if (!prisma) {
return res
.status(500)
.json({ error: "Prisma client not initialized for tenant." });
}
const quoteRepository = new QuotePrismaRepository(prisma);
const incrementQuoteVersionUseCase = new IncrementQuoteVersion(quoteRepository);
const updatedQuote = await incrementQuoteVersionUseCase.execute({
id,
organizationId,
});
res.status(200).json(updatedQuote);
}
catch (error) {
res
.status(500)
.json({ error: error.message || "Error incrementing quote version." });
}
};
//# sourceMappingURL=quoteController.js.map