68 lines
1.8 KiB
TypeScript
68 lines
1.8 KiB
TypeScript
"use server";
|
|
|
|
import { redirect } from "next/navigation";
|
|
import { getBriefingDoCliente } from "@/lib/briefing-service";
|
|
import { db } from "@/lib/db";
|
|
import { notificarBriefingEnviado } from "@/lib/notifications";
|
|
|
|
export type EnvioBriefingState = {
|
|
ok: boolean;
|
|
message?: string;
|
|
};
|
|
|
|
export async function enviarBriefing(
|
|
briefingId: string,
|
|
_state: EnvioBriefingState,
|
|
formData: FormData
|
|
): Promise<EnvioBriefingState> {
|
|
const briefing = await getBriefingDoCliente(briefingId);
|
|
|
|
if (briefing.status !== "RASCUNHO") {
|
|
return { ok: false, message: "Este briefing ja foi enviado." };
|
|
}
|
|
|
|
if (formData.get("confirmacaoCliente") !== "on") {
|
|
return { ok: false, message: "Confirme a declaracao do cliente para enviar." };
|
|
}
|
|
|
|
const totalPerguntas = await db.pergunta.count({
|
|
where: { ativo: true }
|
|
});
|
|
const respostas = await db.resposta.findMany({
|
|
where: { briefingId: briefing.id },
|
|
select: {
|
|
texto: true,
|
|
complemento: true,
|
|
selecionadas: true
|
|
}
|
|
});
|
|
const respondidas = respostas.filter((resposta) => {
|
|
const selecionadas = Array.isArray(resposta.selecionadas) ? resposta.selecionadas : [];
|
|
return Boolean(resposta.texto?.trim() || resposta.complemento?.trim() || selecionadas.length > 0);
|
|
}).length;
|
|
|
|
if (respondidas < totalPerguntas && formData.get("confirmarBrancos") !== "on") {
|
|
return {
|
|
ok: false,
|
|
message: "Confirme que deseja enviar mesmo com perguntas em branco."
|
|
};
|
|
}
|
|
|
|
await db.briefing.update({
|
|
where: { id: briefing.id },
|
|
data: {
|
|
status: "ENVIADO",
|
|
confirmadoEm: new Date(),
|
|
enviadoEm: new Date()
|
|
}
|
|
});
|
|
|
|
try {
|
|
await notificarBriefingEnviado(briefing.id);
|
|
} catch {
|
|
// Falha de notificacao nao pode impedir o envio do briefing.
|
|
}
|
|
|
|
redirect(`/briefings/${briefing.id}/revisao`);
|
|
}
|