Merge pull request #282 from w3nder/FarewellMessage

Add Feat. Farewell Message
This commit is contained in:
Cassio Santos
2021-10-19 06:28:15 -03:00
committed by GitHub
9 changed files with 93 additions and 23 deletions

View File

@@ -6,6 +6,8 @@ import DeleteTicketService from "../services/TicketServices/DeleteTicketService"
import ListTicketsService from "../services/TicketServices/ListTicketsService"; import ListTicketsService from "../services/TicketServices/ListTicketsService";
import ShowTicketService from "../services/TicketServices/ShowTicketService"; import ShowTicketService from "../services/TicketServices/ShowTicketService";
import UpdateTicketService from "../services/TicketServices/UpdateTicketService"; import UpdateTicketService from "../services/TicketServices/UpdateTicketService";
import SendWhatsAppMessage from "../services/WbotServices/SendWhatsAppMessage";
import ShowWhatsAppService from "../services/WhatsappService/ShowWhatsAppService";
type IndexQuery = { type IndexQuery = {
searchParam: string; searchParam: string;
@@ -91,6 +93,20 @@ export const update = async (
ticketId ticketId
}); });
if (ticket.status === "closed") {
const whatsapp = await ShowWhatsAppService(ticket.whatsappId);
const { farewellMessage } = whatsapp;
if (farewellMessage) {
await SendWhatsAppMessage({
body: farewellMessage,
ticket
});
}
}
return res.status(200).json(ticket); return res.status(200).json(ticket);
}; };

View File

@@ -0,0 +1,13 @@
import { QueryInterface, DataTypes } from "sequelize";
module.exports = {
up: (queryInterface: QueryInterface) => {
return queryInterface.addColumn("Whatsapps", "farewellMessage", {
type: DataTypes.TEXT
});
},
down: (queryInterface: QueryInterface) => {
return queryInterface.removeColumn("Whatsapps", "farewellMessage");
}
};

View File

@@ -50,6 +50,9 @@ class Whatsapp extends Model<Whatsapp> {
@Column(DataType.TEXT) @Column(DataType.TEXT)
greetingMessage: string; greetingMessage: string;
@Column(DataType.TEXT)
farewellMessage: string;
@Default(false) @Default(false)
@AllowNull @AllowNull
@Column @Column

View File

@@ -2,6 +2,8 @@ import CheckContactOpenTickets from "../../helpers/CheckContactOpenTickets";
import SetTicketMessagesAsRead from "../../helpers/SetTicketMessagesAsRead"; import SetTicketMessagesAsRead from "../../helpers/SetTicketMessagesAsRead";
import { getIO } from "../../libs/socket"; import { getIO } from "../../libs/socket";
import Ticket from "../../models/Ticket"; import Ticket from "../../models/Ticket";
import SendWhatsAppMessage from "../WbotServices/SendWhatsAppMessage";
import ShowWhatsAppService from "../WhatsappService/ShowWhatsAppService";
import ShowTicketService from "./ShowTicketService"; import ShowTicketService from "./ShowTicketService";
interface TicketData { interface TicketData {
@@ -28,7 +30,6 @@ const UpdateTicketService = async ({
const { status, userId, queueId } = ticketData; const { status, userId, queueId } = ticketData;
const ticket = await ShowTicketService(ticketId); const ticket = await ShowTicketService(ticketId);
await SetTicketMessagesAsRead(ticket); await SetTicketMessagesAsRead(ticket);
const oldStatus = ticket.status; const oldStatus = ticket.status;
@@ -44,6 +45,8 @@ const UpdateTicketService = async ({
userId userId
}); });
await ticket.reload(); await ticket.reload();
const io = getIO(); const io = getIO();
@@ -55,6 +58,8 @@ const UpdateTicketService = async ({
}); });
} }
io.to(ticket.status) io.to(ticket.status)
.to("notification") .to("notification")
.to(ticketId.toString()) .to(ticketId.toString())

View File

@@ -113,7 +113,6 @@ const verifyMessage = async (
contact: Contact contact: Contact
) => { ) => {
const quotedMsg = await verifyQuotedMessage(msg); const quotedMsg = await verifyQuotedMessage(msg);
const messageData = { const messageData = {
id: msg.id.id, id: msg.id.id,
ticketId: ticket.id, ticketId: ticket.id,
@@ -126,6 +125,7 @@ const verifyMessage = async (
}; };
await ticket.update({ lastMessage: msg.body }); await ticket.update({ lastMessage: msg.body });
await CreateMessageService({ messageData }); await CreateMessageService({ messageData });
}; };
@@ -231,6 +231,7 @@ const handleMessage = async (
const chat = await msg.getChat(); const chat = await msg.getChat();
if (chat.isGroup) { if (chat.isGroup) {
let msgGroupContact; let msgGroupContact;
@@ -242,34 +243,39 @@ const handleMessage = async (
groupContact = await verifyContact(msgGroupContact); groupContact = await verifyContact(msgGroupContact);
} }
const whatsapp = await ShowWhatsAppService(wbot.id!);
const unreadMessages = msg.fromMe ? 0 : chat.unreadCount; const unreadMessages = msg.fromMe ? 0 : chat.unreadCount;
const contact = await verifyContact(msgContact); const contact = await verifyContact(msgContact);
const ticket = await FindOrCreateTicketService(
contact,
wbot.id!,
unreadMessages,
groupContact
);
if (msg.hasMedia) { if(unreadMessages === 0 && whatsapp.farewellMessage === msg.body) return;
await verifyMediaMessage(msg, ticket, contact);
} else { const ticket = await FindOrCreateTicketService(
await verifyMessage(msg, ticket, contact); contact,
} wbot.id!,
unreadMessages,
groupContact
);
if (msg.hasMedia) {
await verifyMediaMessage(msg, ticket, contact);
} else {
await verifyMessage(msg, ticket, contact);
}
if (
!ticket.queue &&
!chat.isGroup &&
!msg.fromMe &&
!ticket.userId &&
whatsapp.queues.length >= 1
) {
await verifyQueue(wbot, msg, ticket, contact);
}
const whatsapp = await ShowWhatsAppService(wbot.id!);
if (
!ticket.queue &&
!chat.isGroup &&
!msg.fromMe &&
!ticket.userId &&
whatsapp.queues.length >= 1
) {
await verifyQueue(wbot, msg, ticket, contact);
}
} catch (err) { } catch (err) {
Sentry.captureException(err); Sentry.captureException(err);
logger.error(`Error handling whatsapp message: Err: ${err}`); logger.error(`Error handling whatsapp message: Err: ${err}`);

View File

@@ -8,6 +8,7 @@ interface Request {
name: string; name: string;
queueIds?: number[]; queueIds?: number[];
greetingMessage?: string; greetingMessage?: string;
farewellMessage?: string;
status?: string; status?: string;
isDefault?: boolean; isDefault?: boolean;
} }
@@ -22,6 +23,7 @@ const CreateWhatsAppService = async ({
status = "OPENING", status = "OPENING",
queueIds = [], queueIds = [],
greetingMessage, greetingMessage,
farewellMessage,
isDefault = false isDefault = false
}: Request): Promise<Response> => { }: Request): Promise<Response> => {
const schema = Yup.object().shape({ const schema = Yup.object().shape({
@@ -72,6 +74,7 @@ const CreateWhatsAppService = async ({
name, name,
status, status,
greetingMessage, greetingMessage,
farewellMessage,
isDefault isDefault
}, },
{ include: ["queues"] } { include: ["queues"] }

View File

@@ -12,6 +12,7 @@ interface WhatsappData {
session?: string; session?: string;
isDefault?: boolean; isDefault?: boolean;
greetingMessage?: string; greetingMessage?: string;
farewellMessage?: string;
queueIds?: number[]; queueIds?: number[];
} }
@@ -41,6 +42,7 @@ const UpdateWhatsAppService = async ({
isDefault, isDefault,
session, session,
greetingMessage, greetingMessage,
farewellMessage,
queueIds = [] queueIds = []
} = whatsappData; } = whatsappData;
@@ -72,6 +74,7 @@ const UpdateWhatsAppService = async ({
status, status,
session, session,
greetingMessage, greetingMessage,
farewellMessage,
isDefault isDefault
}); });

View File

@@ -62,6 +62,7 @@ const WhatsAppModal = ({ open, onClose, whatsAppId }) => {
const initialState = { const initialState = {
name: "", name: "",
greetingMessage: "", greetingMessage: "",
farewellMessage: "",
isDefault: false, isDefault: false,
}; };
const [whatsApp, setWhatsApp] = useState(initialState); const [whatsApp, setWhatsApp] = useState(initialState);
@@ -176,6 +177,25 @@ const WhatsAppModal = ({ open, onClose, whatsAppId }) => {
margin="dense" margin="dense"
/> />
</div> </div>
<div>
<Field
as={TextField}
label={i18n.t("whatsappModal.form.farewellMessage")}
type="farewellMessage"
multiline
rows={5}
fullWidth
name="farewellMessage"
error={
touched.farewellMessage && Boolean(errors.farewellMessage)
}
helperText={
touched.farewellMessage && errors.farewellMessage
}
variant="outlined"
margin="dense"
/>
</div>
<QueueSelect <QueueSelect
selectedQueueIds={selectedQueueIds} selectedQueueIds={selectedQueueIds}
onChange={selectedIds => setSelectedQueueIds(selectedIds)} onChange={selectedIds => setSelectedQueueIds(selectedIds)}

View File

@@ -97,6 +97,7 @@ const messages = {
form: { form: {
name: "Nome", name: "Nome",
default: "Padrão", default: "Padrão",
farewellMessage: "Mensagem de despedida"
}, },
buttons: { buttons: {
okAdd: "Adicionar", okAdd: "Adicionar",