Skip to content

Instantly share code, notes, and snippets.

@mllvzeth
Created January 19, 2023 19:52
Show Gist options
  • Save mllvzeth/4d494faff93261510b5f5aaeddf9924d to your computer and use it in GitHub Desktop.
Save mllvzeth/4d494faff93261510b5f5aaeddf9924d to your computer and use it in GitHub Desktop.
(async function (workflow, context) {
const { get } = context.libs;
const PRODUCT_LINE_FIELDS = {
lineProductBucket: "product_field12", // Product Bucket
lineLineTotal: "product_field1", // Line Total
lineOwner: "product_field1027", // Owner
parentId: "parent_entity_reference_id", // Parent ID
parentMonth: "product_field1022", // Month
parentYear: "product_field1023", // Year
parentOrderDate: "product_field1009", // Order date
parentTeam: "product_field1012", // Team
};
const COMMISSION_FIELDS = {
year: "commission_field11",
month: "commission_field18",
team: "commission_field20",
relatedSalesTarget: "commission_field9",
employee: "commission_field19",
};
const SALES_TARGET_FIELDS = {
targetYear: "sales_target_field5",
team: "subteam_id",
};
const codyEmailSyncAccountId = "862aff15-5edb-448e-a1e0-3cb4538a416d";
const codyAgentId = '7fe91561-75e4-4008-b1ba-223700ee73eb';
const EMAIL_FIELDS = {
SOURCE_APP: "email_fa_field0",
SOURCE_RECORD: "email_fa_field1",
FROM: "email_fa_field2",
TO: "email_fa_field3",
CC: "email_fa_field4",
BCC: "email_fa_field5",
TEMPLATE: "email_fa_field6",
SUBJECT: "email_fa_field7",
BODY: "email_fa_field8",
ATTACHMENTS: "email_fa_field9",
STATUS: "email_fa_field17",
SENT_FROM_FA: "email_fa_field21",
FROM_AGENT: "email_fa_field30",
};
const EMAIL_STATUS = {
SEND: "bb9c8be7-3c34-41d0-a82f-bc8cd1d9f6c4",
};
const sendEmail = async (syncEmailId, to, cc, attachment, subject, body) => {
const { entity_value } = await context.freeagent.createEntity({
entity: "email_fa",
field_values: {
[EMAIL_FIELDS.SOURCE_APP]: context.appConfiguration.faEntityId,
[EMAIL_FIELDS.SOURCE_RECORD]: workflow.entityInstance.instanceId,
[EMAIL_FIELDS.FROM]: syncEmailId,
[EMAIL_FIELDS.FROM_AGENT]: codyAgentId,
[EMAIL_FIELDS.TO]: to,
[EMAIL_FIELDS.CC]: cc,
[EMAIL_FIELDS.BCC]: [],
[EMAIL_FIELDS.ATTACHMENTS]: attachment,
[EMAIL_FIELDS.SUBJECT]: subject,
[EMAIL_FIELDS.BODY]: body,
// [EMAIL_FIELDS.TEMPLATE]: tempId,
[EMAIL_FIELDS.STATUS]: EMAIL_STATUS.SEND,
[EMAIL_FIELDS.SENT_FROM_FA]: true,
},
});
return entity_value || {};
};
const recipients = [
{
name: "Cody Jorgensen",
email: "[email protected]", // [email protected]
},
];
let emailsSent = [];
const orderProductLines = await context.freeagent.listEntityValues({
entity: "product",
fields: [
PRODUCT_LINE_FIELDS.lineProductBucket,
PRODUCT_LINE_FIELDS.lineLineTotal,
PRODUCT_LINE_FIELDS.lineOwner,
PRODUCT_LINE_FIELDS.parentId,
PRODUCT_LINE_FIELDS.parentMonth,
PRODUCT_LINE_FIELDS.parentYear,
PRODUCT_LINE_FIELDS.parentOrderDate,
],
filters: [
{
field_name: PRODUCT_LINE_FIELDS.parentMonth,
operator: "includes",
values: [workflow.entityInstance.month],
},
{
field_name: PRODUCT_LINE_FIELDS.parentTeam,
operator: "includes",
values: [workflow.entityInstance.team],
},
],
});
const nimbusLines = orderProductLines.entity_values.filter(
(line) => line.field_values[PRODUCT_LINE_FIELDS.lineProductBucket].value === "Nimbus"
);
const probeLines = orderProductLines.entity_values.filter(
(line) => line.field_values[PRODUCT_LINE_FIELDS.lineProductBucket].value === "Probe"
);
const nimbusTotalSales = nimbusLines.reduce(
(total, line) => total + line.field_values[PRODUCT_LINE_FIELDS.lineLineTotal].value,
0
);
const probeTotalSales = probeLines.reduce(
(total, line) => total + line.field_values[PRODUCT_LINE_FIELDS.lineLineTotal].value,
0
);
const salesTargetQuery = await context.freeagent.listEntityValues({
entity: "sales_target",
filters: [
{
field_name: SALES_TARGET_FIELDS.targetYear,
operator: "includes",
values: [workflow.entityInstance.year],
},
{
field_name: SALES_TARGET_FIELDS.team,
operator: "includes",
values: [workflow.entityInstance.team],
},
],
});
const salesTargetId = get(salesTargetQuery, "entity_values[0].id", null);
if (salesTargetQuery.count === 0) {
for (const recipient of recipients) {
const email = await sendEmail(
codyEmailSyncAccountId,
[recipient],
[],
[],
"FreeAgent Alert: Missing Sales Target",
`Please create a new ${workflow.entityInstance.year} Sales Target for ${workflow.entityInstance.team}`
);
emailsSent.push(email);
}
}
const employeeQuery = await context.freeagent.listEntityValues({
entity: "employee",
filters: [
{
field_name: "subteam_id",
operator: "includes",
values: [workflow.entityInstance.team],
},
],
limit: 1,
});
const employeeId = get(employeeQuery, "entity_values[0].id", null);
const ownerId = get(
employeeQuery,
"entity_values[0].field_values.owner_id.value",
null
);
const monthlyCommissionQuery = await context.freeagent.listEntityValues({
entity: "commission",
filters: [
{
field_name: COMMISSION_FIELDS.year,
operator: "includes",
values: [workflow.entityInstance.year],
},
{
field_name: COMMISSION_FIELDS.month,
operator: "includes",
values: [workflow.entityInstance.month],
},
{
field_name: COMMISSION_FIELDS.team,
operator: "includes",
values: [workflow.entityInstance.team],
},
],
});
let monthlyCommission = {};
if (monthlyCommissionQuery.count === 0) {
monthlyCommission = await context.freeagent.createEntity({
entity: "commission",
field_values: {
[COMMISSION_FIELDS.year]: workflow.entityInstance.year,
[COMMISSION_FIELDS.month]: workflow.entityInstance.month,
[COMMISSION_FIELDS.team]: workflow.entityInstance.team,
[COMMISSION_FIELDS.salesTarget]: salesTargetId,
[COMMISSION_FIELDS.nimbusSales]: nimbusTotalSales,
[COMMISSION_FIELDS.probeSales]: probeTotalSales,
[COMMISSION_FIELDS.employee]: employeeId,
owner_id: ownerId,
},
});
} else {
monthlyCommission = await context.freeagent.updateEntity({
entity: "commission",
id: monthlyCommissionQuery.entity_values[0].id,
field_values: {
[COMMISSION_FIELDS.salesTarget]: salesTargetId,
[COMMISSION_FIELDS.nimbusSales]: nimbusTotalSales,
[COMMISSION_FIELDS.probeSales]: probeTotalSales,
},
});
}
const quarterlyCommissionQuery = await context.freeagent.listEntityValues({
entity: "commission",
fields: [
{
field_name: COMMISSION_FIELDS.year,
operator: "includes",
values: [workflow.entityInstance.year],
},
{
field_name: COMMISSION_FIELDS.quarter,
operator: "includes",
values: [workflow.entityInstance.quarter],
},
{
field_name: COMMISSION_FIELDS.team,
operator: "includes",
values: [workflow.entityInstance.team],
},
],
});
let quarterlyCommission = {};
if (quarterlyCommissionQuery.count === 0) {
quarterlyCommission = await context.freeagent.createEntity({
entity: "commission",
field_values: {
[COMMISSION_FIELDS.year]: workflow.entityInstance.year,
[COMMISSION_FIELDS.quarter]: workflow.entityInstance.quarter,
[COMMISSION_FIELDS.team]: workflow.entityInstance.team,
[COMMISSION_FIELDS.salesTarget]: salesTargetId,
[COMMISSION_FIELDS.nimbusSales]: nimbusTotalSales,
[COMMISSION_FIELDS.probeSales]: probeTotalSales,
[COMMISSION_FIELDS.employee]: employeeId,
owner_id: ownerId,
},
});
} else {
quarterlyCommission = await context.freeagent.updateEntity({
entity: "commission",
id: quarterlyCommissionQuery.entity_values[0].id,
field_values: {
[COMMISSION_FIELDS.salesTarget]: salesTargetId,
[COMMISSION_FIELDS.nimbusSales]: nimbusTotalSales,
[COMMISSION_FIELDS.probeSales]: probeTotalSales,
},
});
}
return {
response: {
salesTargetQuery,
monthlyCommissionQuery,
quarterlyCommissionQuery,
},
};
})(workflow, context);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment