Created
January 19, 2023 19:52
-
-
Save mllvzeth/4d494faff93261510b5f5aaeddf9924d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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