{
    "functionList": [
        {
            "name": "ifThenElse",
            "insertText": "ifThenElse(CONDITION, CONSEQUENT, ALTERNATIVE)"
        },
        {
            "name": "ifThen",
            "insertText": "ifThen(CONDITION, CONSEQUENT)"
        },
        {
            "name": "list",
            "insertText": "list(ITEM_1, ITEM_2)",
            "returnType": "array"
        },
        {
            "name": "string\\concatenate",
            "insertText": "string\\concatenate(STRING_1, STRING_2)",
            "returnType": "string"
        },
        {
            "name": "string\\substring",
            "insertText": "string\\substring(STRING, START, LENGTH)",
            "returnType": "string"
        },
        {
            "name": "string\\contains",
            "insertText": "string\\contains(STRING, NEEDLE)",
            "returnType": "bool"
        },
        {
            "name": "string\\pos",
            "insertText": "string\\pos(STRING, NEEDLE)",
            "returnType": "int"
        },
        {
            "name": "string\\pad",
            "insertText": "string\\pad(STRING, LENGTH, PAD_STRING)",
            "returnType": "string"
        },
        {
            "name": "string\\test",
            "insertText": "string\\test(STRING, REGULAR_EXPRESSION)",
            "returnType": "bool"
        },
        {
            "name": "string\\length",
            "insertText": "string\\length(STRING)",
            "returnType": "int"
        },
        {
            "name": "string\\trim",
            "insertText": "string\\trim(STRING)",
            "returnType": "string"
        },
        {
            "name": "string\\lowerCase",
            "insertText": "string\\lowerCase(STRING)",
            "returnType": "string"
        },
        {
            "name": "string\\upperCase",
            "insertText": "string\\upperCase(STRING)",
            "returnType": "string"
        },
        {
            "name": "string\\match",
            "insertText": "string\\match(STRING, REGULAR_EXPRESSION)",
            "returnType": "string|null"
        },
        {
            "name": "string\\matchAll",
            "insertText": "string\\matchAll(STRING, REGULAR_EXPRESSION)",
            "returnType": "string[]|null"
        },
        {
            "name": "string\\matchExtract",
            "insertText": "string\\matchExtract(STRING, REGULAR_EXPRESSION)",
            "returnType": "string[]|null"
        },
        {
            "name": "string\\replace",
            "insertText": "string\\replace(STRING, SEARCH, REPLACE)",
            "returnType": "string"
        },
        {
            "name": "string\\split",
            "insertText": "string\\split(STRING, SEPARATOR)",
            "returnType": "string[]"
        },
        {
            "name": "datetime\\today",
            "insertText": "datetime\\today()",
            "returnType": "string"
        },
        {
            "name": "datetime\\now",
            "insertText": "datetime\\now()",
            "returnType": "string"
        },
        {
            "name": "datetime\\format",
            "insertText": "datetime\\format(VALUE)",
            "returnType": "string"
        },
        {
            "name": "datetime\\date",
            "insertText": "datetime\\date(VALUE)",
            "returnType": "int"
        },
        {
            "name": "datetime\\month",
            "insertText": "datetime\\month(VALUE)",
            "returnType": "int"
        },
        {
            "name": "datetime\\year",
            "insertText": "datetime\\year(VALUE)",
            "returnType": "int"
        },
        {
            "name": "datetime\\hour",
            "insertText": "datetime\\hour(VALUE)",
            "returnType": "int"
        },
        {
            "name": "datetime\\minute",
            "insertText": "datetime\\minute(VALUE)",
            "returnType": "int"
        },
        {
            "name": "datetime\\dayOfWeek",
            "insertText": "datetime\\dayOfWeek(VALUE)",
            "returnType": "int"
        },
        {
            "name": "datetime\\addMinutes",
            "insertText": "datetime\\addMinutes(VALUE, MINUTES)",
            "returnType": "string"
        },
        {
            "name": "datetime\\addHours",
            "insertText": "datetime\\addHours(VALUE, HOURS)",
            "returnType": "string"
        },
        {
            "name": "datetime\\addDays",
            "insertText": "datetime\\addDays(VALUE, DAYS)",
            "returnType": "string"
        },
        {
            "name": "datetime\\addWeeks",
            "insertText": "datetime\\addWeeks(VALUE, WEEKS)",
            "returnType": "string"
        },
        {
            "name": "datetime\\addMonths",
            "insertText": "datetime\\addMonths(VALUE, MONTHS)",
            "returnType": "string"
        },
        {
            "name": "datetime\\addYears",
            "insertText": "datetime\\addYears(VALUE, YEARS)",
            "returnType": "string"
        },
        {
            "name": "datetime\\diff",
            "insertText": "datetime\\diff(VALUE_1, VALUE_2, INTERVAL_TYPE)",
            "returnType": "int"
        },
        {
            "name": "datetime\\closest",
            "insertText": "datetime\\closest(VALUE, TYPE, TARGET, IS_PAST, TIMEZONE)",
            "returnType": "string"
        },
        {
            "name": "number\\format",
            "insertText": "number\\format(VALUE)",
            "returnType": "string"
        },
        {
            "name": "number\\abs",
            "insertText": "number\\abs(VALUE)"
        },
        {
            "name": "number\\power",
            "insertText": "number\\power(VALUE, EXP)",
            "returnType": "int|float"
        },
        {
            "name": "number\\round",
            "insertText": "number\\round(VALUE, PRECISION)",
            "returnType": "int|float"
        },
        {
            "name": "number\\floor",
            "insertText": "number\\floor(VALUE)",
            "returnType": "int"
        },
        {
            "name": "number\\ceil",
            "insertText": "number\\ceil(VALUE)",
            "returnType": "int"
        },
        {
            "name": "number\\randomInt",
            "insertText": "number\\randomInt(MIN, MAX)",
            "returnType": "int"
        },
        {
            "name": "number\\parseInt",
            "insertText": "number\\parseInt(STRING)",
            "returnType": "int"
        },
        {
            "name": "number\\parseFloat",
            "insertText": "number\\parseFloat(STRING)",
            "returnType": "float"
        },
        {
            "name": "entity\\isNew",
            "insertText": "entity\\isNew()",
            "returnType": "bool"
        },
        {
            "name": "entity\\isAttributeChanged",
            "insertText": "entity\\isAttributeChanged(ATTRIBUTE)",
            "returnType": "bool"
        },
        {
            "name": "entity\\isAttributeNotChanged",
            "insertText": "entity\\isAttributeNotChanged(ATTRIBUTE)",
            "returnType": "bool"
        },
        {
            "name": "entity\\attribute",
            "insertText": "entity\\attribute(ATTRIBUTE)",
            "returnType": "mixed",
            "unsafe": true
        },
        {
            "name": "entity\\attributeFetched",
            "insertText": "entity\\attributeFetched(ATTRIBUTE)",
            "returnType": "mixed",
            "unsafe": true
        },
        {
            "name": "entity\\setAttribute",
            "insertText": "entity\\setAttribute(ATTRIBUTE, VALUE)",
            "unsafe": true
        },
        {
            "name": "entity\\clearAttribute",
            "insertText": "entity\\clearAttribute(ATTRIBUTE)",
            "unsafe": true
        },
        {
            "name": "entity\\addLinkMultipleId",
            "insertText": "entity\\addLinkMultipleId(LINK, ID)",
            "unsafe": true
        },
        {
            "name": "entity\\hasLinkMultipleId",
            "insertText": "entity\\hasLinkMultipleId(LINK, ID)",
            "returnType": "bool",
            "unsafe": true
        },
        {
            "name": "entity\\removeLinkMultipleId",
            "insertText": "entity\\removeLinkMultipleId(LINK, ID)",
            "unsafe": true
        },
        {
            "name": "entity\\getLinkColumn",
            "insertText": "entity\\getLinkColumn(LINK, ID, COLUMN)",
            "returnType": "mixed",
            "unsafe": true
        },
        {
            "name": "entity\\setLinkMultipleColumn",
            "insertText": "entity\\setLinkMultipleColumn(LINK, ID, COLUMN, VALUE)",
            "unsafe": true
        },
        {
            "name": "entity\\isRelated",
            "insertText": "entity\\isRelated(LINK, ID)",
            "returnType": "bool",
            "unsafe": true
        },
        {
            "name": "entity\\sumRelated",
            "insertText": "entity\\sumRelated(LINK, FIELD, FILTER)",
            "returnType": "int|float",
            "unsafe": true
        },
        {
            "name": "entity\\countRelated",
            "insertText": "entity\\countRelated(LINK, FILTER)",
            "returnType": "int",
            "unsafe": true
        },
        {
            "name": "record\\exists",
            "insertText": "record\\exists(ENTITY_TYPE, KEY, VALUE)",
            "returnType": "bool",
            "unsafe": true
        },
        {
            "name": "record\\count",
            "insertText": "record\\count(ENTITY_TYPE, KEY, VALUE)",
            "returnType": "int",
            "unsafe": true
        },
        {
            "name": "record\\attribute",
            "insertText": "record\\attribute(ENTITY_TYPE, ID, ATTRIBUTE)",
            "returnType": "mixed",
            "unsafe": true
        },
        {
            "name": "record\\findOne",
            "insertText": "record\\findOne(ENTITY_TYPE, ORDER_BY, ORDER, KEY1, VALUE1, KEY2, VALUE2)",
            "returnType": "string",
            "unsafe": true
        },
        {
            "name": "record\\findMany",
            "insertText": "record\\findMany(ENTITY_TYPE, LIMIT, ORDER_BY, ORDER, KEY1, VALUE1, KEY2, VALUE2)",
            "returnType": "string",
            "unsafe": true
        },
        {
            "name": "record\\findRelatedOne",
            "insertText": "record\\findRelatedOne(ENTITY_TYPE, ID, LINK, ORDER_BY, ORDER, KEY1, VALUE1, KEY2, VALUE2)",
            "returnType": "string",
            "unsafe": true
        },
        {
            "name": "record\\findRelatedMany",
            "insertText": "record\\findRelatedMany(ENTITY_TYPE, ID, LINK, LIMIT, ORDER_BY, ORDER, KEY1, VALUE1, KEY2, VALUE2)",
            "returnType": "string[]",
            "unsafe": true
        },
        {
            "name": "record\\fetch",
            "insertText": "record\\fetch(ENTITY_TYPE, ID)",
            "returnType": "?object",
            "unsafe": true
        },
        {
            "name": "record\\relate",
            "insertText": "record\\relate(ENTITY_TYPE, ID, LINK, FOREIGN_ID)",
            "unsafe": true
        },
        {
            "name": "record\\unrelate",
            "insertText": "record\\unrelate(ENTITY_TYPE, ID, LINK, FOREIGN_ID)",
            "unsafe": true
        },
        {
            "name": "record\\create",
            "insertText": "record\\create(ENTITY_TYPE, ATTRIBUTE1, VALUE1, ATTRIBUTE2, VALUE2)",
            "returnType": "string",
            "unsafe": true
        },
        {
            "name": "record\\update",
            "insertText": "record\\update(ENTITY_TYPE, ID, ATTRIBUTE1, VALUE1, ATTRIBUTE2, VALUE2)",
            "unsafe": true
        },
        {
            "name": "record\\delete",
            "insertText": "record\\delete(ENTITY_TYPE, ID)",
            "unsafe": true
        },
        {
            "name": "record\\relationColumn",
            "insertText": "record\\relationColumn(ENTITY_TYPE, ID, LINK, FOREIGN_ID, COLUMN)",
            "returnType": "mixed",
            "unsafe": true
        },
        {
            "name": "record\\updateRelationColumn",
            "insertText": "record\\updateRelationColumn(ENTITY_TYPE, ID, LINK, FOREIGN_ID, COLUMN, VALUE)",
            "unsafe": true
        },
        {
            "name": "env\\userAttribute",
            "insertText": "env\\userAttribute(ATTRIBUTE)",
            "returnType": "mixed",
            "unsafe": true
        },
        {
            "name": "util\\generateId",
            "insertText": "util\\generateId()",
            "returnType": "string"
        },
        {
            "name": "util\\generateRecordId",
            "insertText": "util\\generateRecordId()",
            "returnType": "string"
        },
        {
            "name": "util\\base64Encode",
            "insertText": "util\\base64Encode(STRING)",
            "returnType": "string"
        },
        {
            "name": "util\\base64Decode",
            "insertText": "util\\base64Decode(STRING)",
            "returnType": "string"
        },
        {
            "name": "object\\create",
            "insertText": "object\\create()",
            "returnType": "object"
        },
        {
            "name": "object\\get",
            "insertText": "object\\get(OBJECT, KEY)",
            "returnType": "mixed"
        },
        {
            "name": "object\\has",
            "insertText": "object\\has(OBJECT, KEY)",
            "returnType": "bool"
        },
        {
            "name": "object\\set",
            "insertText": "object\\set(OBJECT, KEY, VALUE)"
        },
        {
            "name": "object\\clear",
            "insertText": "object\\clear(OBJECT, KEY)",
            "returnType": "object"
        },
        {
            "name": "object\\cloneDeep",
            "insertText": "object\\cloneDeep(OBJECT)",
            "returnType": "object"
        },
        {
            "name": "password\\generate",
            "insertText": "password\\generate()",
            "returnType": "string"
        },
        {
            "name": "password\\hash",
            "insertText": "password\\hash(PASSWORD)",
            "returnType": "string"
        },
        {
            "name": "array\\includes",
            "insertText": "array\\includes(LIST, VALUE)",
            "returnType": "bool"
        },
        {
            "name": "array\\push",
            "insertText": "array\\push(LIST, VALUE)"
        },
        {
            "name": "array\\length",
            "insertText": "array\\length(LIST)",
            "returnType": "int"
        },
        {
            "name": "array\\at",
            "insertText": "array\\at(LIST, INDEX)",
            "returnType": "mixed"
        },
        {
            "name": "array\\join",
            "insertText": "array\\join(LIST, SEPARATOR)",
            "returnType": "string"
        },
        {
            "name": "array\\indexOf",
            "insertText": "array\\indexOf(LIST, ELEMENT)",
            "returnType": "?int"
        },
        {
            "name": "array\\removeAt",
            "insertText": "array\\removeAt(LIST, INDEX)",
            "returnType": "array"
        },
        {
            "name": "array\\unique",
            "insertText": "array\\unique(LIST)",
            "returnType": "array"
        },
        {
            "name": "language\\translate",
            "insertText": "language\\translate(LABEL, CATEGORY, SCOPE)",
            "returnType": "string"
        },
        {
            "name": "language\\translateOption",
            "insertText": "language\\translateOption(OPTION, FIELD, SCOPE)",
            "returnType": "string"
        },
        {
            "name": "log\\info",
            "insertText": "log\\info(MESSAGE)",
            "unsafe": true
        },
        {
            "name": "log\\notice",
            "insertText": "log\\notice(MESSAGE)",
            "unsafe": true
        },
        {
            "name": "log\\warning",
            "insertText": "log\\warning(MESSAGE)",
            "unsafe": true
        },
        {
            "name": "log\\error",
            "insertText": "log\\error(MESSAGE)",
            "unsafe": true
        },
        {
            "name": "json\\retrieve",
            "insertText": "json\\retrieve(JSON, PATH)",
            "returnType": "mixed"
        },
        {
            "name": "json\\encode",
            "insertText": "json\\encode(VALUE)",
            "returnType": "string"
        },
        {
            "name": "ext\\email\\send",
            "insertText": "ext\\email\\send(EMAIL_ID)",
            "returnType": "bool",
            "unsafe": true
        },
        {
            "name": "ext\\sms\\send",
            "insertText": "ext\\sms\\send(SMS_ID)",
            "returnType": "bool",
            "unsafe": true
        },
        {
            "name": "ext\\email\\applyTemplate",
            "insertText": "ext\\email\\applyTemplate(EMAIL_ID, EMAIL_TEMPLATE_ID)",
            "unsafe": true
        },
        {
            "name": "ext\\pdf\\generate",
            "insertText": "ext\\pdf\\generate(ENTITY_TYPE, ENTITY_ID, TEMPLATE_ID, FILENAME)",
            "returnType": "string",
            "unsafe": true
        },
        {
            "name": "ext\\workingTime\\addWorkingDays",
            "insertText": "ext\\workingTime\\addWorkingDays(DATE, DAYS)",
            "returnType": "string|null"
        },
        {
            "name": "ext\\workingTime\\findClosestWorkingTime",
            "insertText": "ext\\workingTime\\findClosestWorkingTime(DATE)",
            "returnType": "string|null"
        },
        {
            "name": "ext\\workingTime\\getSummedWorkingHours",
            "insertText": "ext\\workingTime\\getSummedWorkingHours(FROM, TO)",
            "returnType": "float"
        },
        {
            "name": "ext\\workingTime\\getWorkingDays",
            "insertText": "ext\\workingTime\\getWorkingDays(FROM, TO)",
            "returnType": "int"
        },
        {
            "name": "ext\\workingTime\\hasWorkingTime",
            "insertText": "ext\\workingTime\\hasWorkingTime(FROM, TO)",
            "returnType": "bool"
        },
        {
            "name": "ext\\workingTime\\isWorkingDay",
            "insertText": "ext\\workingTime\\isWorkingDay(DATE)",
            "returnType": "bool"
        },
        {
            "name": "ext\\user\\sendAccessInfo",
            "insertText": "ext\\user\\sendAccessInfo(USER_ID)",
            "unsafe": true
        },
        {
            "name": "ext\\email\\send",
            "insertText": "ext\\email\\send(EMAIL_ID)",
            "returnType": "bool",
            "unsafe": true
        },
        {
            "name": "ext\\currency\\convert",
            "insertText": "ext\\currency\\convert(AMOUNT, FROM_CODE)",
            "returnType": "string"
        },
        {
            "name": "ext\\acl\\checkEntity",
            "insertText": "ext\\acl\\checkEntity(USER_ID, ENTITY_TYPE, ID, ACTION)",
            "returnType": "bool",
            "unsafe": true
        },
        {
            "name": "ext\\acl\\checkScope",
            "insertText": "ext\\acl\\checkScope(USER_ID, SCOPE, ACTION)",
            "returnType": "bool",
            "unsafe": true
        },
        {
            "name": "ext\\acl\\getLevel",
            "insertText": "ext\\acl\\getLevel(USER_ID, SCOPE, ACTION)",
            "returnType": "string",
            "unsafe": true
        },
        {
            "name": "ext\\acl\\getPermissionLevel",
            "insertText": "ext\\acl\\getPermissionLevel(USER_ID, PERMISSION)",
            "returnType": "string",
            "unsafe": true
        }
    ],
    "functionClassNameMap": {
        "log\\info": "Espo\\Core\\Formula\\Functions\\LogGroup\\InfoType",
        "log\\notice": "Espo\\Core\\Formula\\Functions\\LogGroup\\NoticeType",
        "log\\warning": "Espo\\Core\\Formula\\Functions\\LogGroup\\WarningType",
        "log\\error": "Espo\\Core\\Formula\\Functions\\LogGroup\\ErrorType",
        "ext\\acl\\checkEntity": "Espo\\Core\\Formula\\Functions\\ExtGroup\\AclGroup\\CheckEntityType",
        "ext\\acl\\checkScope": "Espo\\Core\\Formula\\Functions\\ExtGroup\\AclGroup\\CheckScopeType",
        "ext\\acl\\getLevel": "Espo\\Core\\Formula\\Functions\\ExtGroup\\AclGroup\\GetLevelType",
        "ext\\acl\\getPermissionLevel": "Espo\\Core\\Formula\\Functions\\ExtGroup\\AclGroup\\GetPermissionLevelType",
        "util\\base64Encode": "Espo\\Core\\Formula\\Functions\\UtilGroup\\Base64EncodeType",
        "util\\base64Decode": "Espo\\Core\\Formula\\Functions\\UtilGroup\\Base64DecodeType"
    }
}
