Page tree
Skip to end of metadata
Go to start of metadata


In this example, we'll get assets of asset custom field and list its fields.


Issue


Assets



Script

Notice the "PLEASE READ HERE" part please.

import com.atlassian.jira.component.ComponentAccessor
import com.onresolve.scriptrunner.runner.customisers.PluginModule
import com.onresolve.scriptrunner.runner.customisers.WithPlugin
import groovy.json.JsonSlurper
import groovy.transform.Field
import inventoryplugin.constant.StatusEnum
import inventoryplugin.constant.SubstatusEnum
import inventoryplugin.dto.portable.FormWithRelationsDto
import inventoryplugin.dto.portable.InventoryDto
import inventoryplugin.dto.portable.InventoryItemDto
import inventoryplugin.dto.portable.InventoryRefDto
import inventoryplugin.service.controller.InventoryController
import inventoryplugin.service.rest.dto.SystemFieldDto
import org.apache.commons.lang3.StringUtils
import org.apache.log4j.Level
import org.apache.log4j.Logger

@Field Logger logger = Logger.getLogger("snapbytes.inventoryplugin.groovy.script")
logger.setLevel(Level.DEBUG)

@WithPlugin("plugin.jip")

@PluginModule
InventoryController inventoryController;
@Field customFieldManager = ComponentAccessor.getCustomFieldManager();
@Field issueManager = ComponentAccessor.getIssueManager();

// FIXME: PLEASE READ HERE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//     delete this line if the "issue" object is already injected with ScriptRunner
def issue = issueManager.getIssueObject("ISD-10")

// update asset id according to your setup
@Field assetCustomFieldId = 10227
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Integer stringToInteger(String s) {
    try {
        return Integer.parseInt(s);
    } catch (def e) {
        logger.debug("Can not convert asset id to INTEGER" + e.getMessage())
        return null;
    }
}

List<FormWithRelationsDto> getCustomFieldAssets(inventoryController, theIssue, customFieldId) {
    List<FormWithRelationsDto> assetObjects = new ArrayList<>();
    def remoteUser = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser()

    def cField = customFieldManager.getCustomFieldObject(customFieldId)
    // for assets custom field, asset cf value will be delimited with commas with additional leading and trailing commas, i.e: ,1,2,3,
    def cfValue = theIssue.getCustomFieldValue(cField)
    def assetIds = StringUtils.split(cfValue, ",");
    for (String assetIdAsStr : assetIds) {
        if (StringUtils.isNotBlank(assetIdAsStr)) {
            Integer assetId = stringToInteger(assetIdAsStr);
            if (assetId != null && assetId > 0) {
                logger.debug("Parsed assetId: " + assetId);
                FormWithRelationsDto formWithRelationsDto = inventoryController.getFormWithRelationsAndOneInventoryDto(remoteUser, assetId);
                assetObjects.add(formWithRelationsDto);
            }
        }
    }
    return assetObjects;
}

static List<InventoryDto> getAssetsOfObject(FormWithRelationsDto oneFormWithRelationsDto) {
    if (oneFormWithRelationsDto != null) {
        List<InventoryDto> inventoryDtos = oneFormWithRelationsDto.getInventories();
        return inventoryDtos;
    }
    return null
}

static InventoryItemDto getInventoryItemDto(InventoryDto inventoryDto, String attributeName) {
    List<InventoryItemDto> inventoryItems = inventoryDto.getInventoryItems();
    if (inventoryItems != null && inventoryItems.size() > 0) {
        for (InventoryItemDto inventoryItemDto : inventoryItems) {
            if (StringUtils.equalsIgnoreCase(attributeName, inventoryItemDto.attributeName)) {
                return inventoryItemDto
            }
        }
    }
    return null
}

static String getSingleAttributeValue(InventoryDto inventoryDto, String attributeName) {
    InventoryItemDto inventoryItemDto = getInventoryItemDto(inventoryDto, attributeName);
    return inventoryItemDto != null ? inventoryItemDto.getValue() : null
}

static List<String> getMultiAttributeValue(InventoryDto inventoryDto, String attributeName) {
    InventoryItemDto inventoryItemDto = getInventoryItemDto(inventoryDto, attributeName);
    return inventoryItemDto != null ? inventoryItemDto.getMultiListValues() : null
}

static List<InventoryRefDto> getRefAttributeValue(InventoryDto inventoryDto, String attributeName) {
    InventoryItemDto inventoryItemDto = getInventoryItemDto(inventoryDto, attributeName);
    return inventoryItemDto != null ? inventoryItemDto.getInventoryRefs() : null
}

static String getDateAttributeValue(InventoryDto inventoryDto, String attributeName) {
    InventoryItemDto inventoryItemDto = getInventoryItemDto(inventoryDto, attributeName);
    return inventoryItemDto != null ? inventoryItemDto.getIsoDateValue() : null
}

static SystemFieldDto getSystemFieldDto(InventoryDto inventoryDto, String fieldName) {
    List<SystemFieldDto> systemFields = inventoryDto.getSystemFields();
    if (systemFields != null && systemFields.size() > 0) {
        for (SystemFieldDto systemFieldDto : systemFields) {
            if (StringUtils.equalsIgnoreCase(fieldName, systemFieldDto.getFieldName())) {
                return systemFieldDto
            }
        }
    }
    return null
}

static String getSystemFieldRawValue(InventoryDto inventoryDto, attributeName) {
    SystemFieldDto systemFieldDto = getSystemFieldDto(inventoryDto, attributeName);
    return systemFieldDto != null ? systemFieldDto.getValue() : null
}

static String getSystemFieldDisplayValue(InventoryDto inventoryDto, attributeName) {
    SystemFieldDto systemFieldDto = getSystemFieldDto(inventoryDto, attributeName);
    return systemFieldDto != null ? systemFieldDto.getDisplayValue() : null
}


// get all selected assets of custom field 10232 ()
List<FormWithRelationsDto> assetsWithFields = getCustomFieldAssets(inventoryController, issue, assetCustomFieldId)


def logUserFields(def appUserDto) {
    // you can use this code to access user fields
    logger.debug("      - Display name: " + appUserDto.getDisplayName())
    logger.debug("      - Email address: " + appUserDto.getEmailAddress())
    logger.debug("      - User name: " + appUserDto.getUsername())
    logger.debug("      - User key: " + appUserDto.getKey())
}

//
for (FormWithRelationsDto formWithRelationsDto : assetsWithFields) {
    List<InventoryDto> inventoryDtos = getAssetsOfObject(formWithRelationsDto);
    if (inventoryDtos != null && inventoryDtos.size() > 0) {
        // in this case, this list will have one object at most
        for (InventoryDto inventoryDto : inventoryDtos) {
            if (inventoryDto != null) {
                logger.debug("---------------------------------------------------------------------")
                logger.debug("---------------------------------------------------------------------")
                logger.debug("Asset id: " + inventoryDto.getId())
                logger.debug("Asset name: " + inventoryDto.getName())
                logger.debug("Asset type id: " + inventoryDto.getFormId())
                logger.debug("Asset type name: " + inventoryDto.getFormName())
                logger.debug("Asset type scheme id: " + inventoryDto.getObjectSchemaId())
                logger.debug("Asset type scheme name: " + inventoryDto.getObjectSchemaName())
                logger.debug("Update by: " + inventoryDto.getUpdatedBy())

                if (inventoryDto.getCreatorUser() != null) {
                    logger.debug("Updated by user details: ")
                    logUserFields(inventoryDto.getUpdatedByUser());
                }

                logger.debug("Created by: " + inventoryDto.getCreator())
                if (inventoryDto.getCreatorUser() != null) {
                    logger.debug("Created by user details: ")
                    logUserFields(inventoryDto.getCreatorUser());
                }

                logger.debug("Attachments (as json string): " + inventoryDto.getAttachments())


                // Attributes: -----------------

                // single select text based attribute
                String operationSystem = getSingleAttributeValue(inventoryDto, "Operating System")
                logger.debug("Operation System: " + operationSystem)

                String vendor = getSingleAttributeValue(inventoryDto, "Vendor")
                logger.debug("Vendor: " + vendor)


                // single user type attributes
                String singleUser = getSingleAttributeValue(inventoryDto, "all - jira single user")
                logger.debug("singleUser key: " + singleUser)

                // Some user fields are already populated. Alternatively you can use userKey to getUser with Jira services.
                InventoryItemDto userItem = getInventoryItemDto(inventoryDto, "all - jira single user");
                if (userItem != null && userItem.getUser() != null) {
                    logUserFields(userItem.getUser());
                }


                // date type attrbiutes
                String datePicker = getDateAttributeValue(inventoryDto, "all - date picker")
                logger.debug("datePicker: " + datePicker)
                String dateTimePicker = getDateAttributeValue(inventoryDto, "all - date time picker")
                logger.debug("dateTimePicker: " + dateTimePicker)

                // reference type attribute
                List<InventoryRefDto> inventoryRefs = getRefAttributeValue(inventoryDto, "all - Asset list")
                logger.debug("attribute name 'all - Asset list':") // reference asset
                if (inventoryRefs != null && inventoryRefs.size() > 0) {
                    for (InventoryRefDto inventoryRefDto : inventoryRefs) {
                        if (inventoryRefDto != null) {
                            logger.debug("      - asset id: " + inventoryRefDto.getId() + ", name: " + inventoryRefDto.getName())
                        }
                    }
                }

                // multi-select- type attributes
                List<String> multiUser = getMultiAttributeValue(inventoryDto, "all - jira multiple users")
                logger.debug("Multi user select - 'all - jira multiple users':")
                for (String userKey : multiUser) {
                    logger.debug("      - user key: " + userKey)
                }

                List<String> multiSelectCombobox = getMultiAttributeValue(inventoryDto, "all - listbox multiple")
                logger.debug("Mult-select combo attribute, field name 'all - listbox multiple': ")
                for (String oneValue : multiSelectCombobox) {
                    logger.debug("      - one value: " + oneValue)
                }


                // system fields
                // status
                def statusFieldKey = getSystemFieldRawValue(inventoryDto, "asset.status");
                logger.debug("Status Field key: " + statusFieldKey);
                def statusObject = StatusEnum.getByKey(statusFieldKey);
                logger.debug("Status Field display value: " + (statusObject != null ? statusObject.displayName : ""));

                // substatus
                def substatusFieldKey = getSystemFieldRawValue(inventoryDto, "asset.substatus");
                logger.debug("Substatus Field key: " + substatusFieldKey);
                def substatusObject = SubstatusEnum.getByKey(substatusFieldKey);
                logger.debug("Substatus Field display value: " + (substatusObject != null ? substatusObject.displayName : ""));

                // assignee system field
                def assetAssignee = getSystemFieldRawValue(inventoryDto, "asset.assignee");
                logger.debug("assetAssignee user key: " + assetAssignee);

                // owner system field
                def assetOwner = getSystemFieldRawValue(inventoryDto, "asset.owner");
                logger.debug("assetOwner user key: " + assetOwner);

                // managedBy system field
                def assetManagedBy = getSystemFieldRawValue(inventoryDto, "asset.managedBy");
                logger.debug("assetManagedBy user key: " + assetManagedBy);

                // reservedFor system field
                def assetReservedFor = getSystemFieldRawValue(inventoryDto, "asset.reservedFor");
                logger.debug("assetReservedFor user key: " + assetReservedFor);

                // belongsToGroup system field
                def assetBelongsToGroup = getSystemFieldRawValue(inventoryDto, "asset.belongsToGroup");
                logger.debug("assetBelongsToGroup: " + assetBelongsToGroup);
                if (StringUtils.isNotBlank(assetBelongsToGroup)) {
                    def jsonSlurper = new JsonSlurper()
                    def groups = jsonSlurper.parseText(assetBelongsToGroup);
                    for (def group : groups) {
                        logger.debug("   - " + group);
                    }
                }

                // quantity system field
                def assetQuantity = getSystemFieldRawValue(inventoryDto, "asset.quantity");
                logger.debug("assetQuantity: " + assetQuantity);

                // asset tag system field
                def assetTag = getSystemFieldRawValue(inventoryDto, "asset.assetTag");
                logger.debug("assetTag: " + assetTag);

                // install date system field
                def assetInstallDate = getSystemFieldRawValue(inventoryDto, "asset.installDate");
                logger.debug("assetInstallDate: " + assetInstallDate);

                // location system field
                def assetLocationId = getSystemFieldRawValue(inventoryDto, "asset.location");
                def assetLocationDisplayValue = getSystemFieldDisplayValue(inventoryDto, "asset.location");
                logger.debug("location id: " + assetLocationId + ", display value: " + assetLocationDisplayValue);

                // cost system field
                def assetCost = getSystemFieldRawValue(inventoryDto, "asset.cost");
                logger.debug("assetCost: " + assetCost);

                // currency system field
                def assetCostCurrency = getSystemFieldRawValue(inventoryDto, "asset.costCurrency");
                logger.debug("assetCostCurrency: " + assetCostCurrency);

                // invoiceNumber system field
                def assetInvoiceNumber = getSystemFieldRawValue(inventoryDto, "asset.invoiceNumber");
                logger.debug("assetInvoiceNumber: " + assetInvoiceNumber);

            }
        }
    }
}

Output:

2020-06-22 17:12:45,726 DEBUG [groovy.script]: Parsed assetId: 10495
2020-06-22 17:12:45,857 DEBUG [groovy.script]: Parsed assetId: 10417
2020-06-22 17:12:45,930 DEBUG [groovy.script]: ---------------------------------------------------------------------
2020-06-22 17:12:45,930 DEBUG [groovy.script]: ---------------------------------------------------------------------
2020-06-22 17:12:45,931 DEBUG [groovy.script]: Asset id: 10495
2020-06-22 17:12:45,931 DEBUG [groovy.script]: Asset name: all two - clone 4
2020-06-22 17:12:45,931 DEBUG [groovy.script]: Asset type id: 36
2020-06-22 17:12:45,931 DEBUG [groovy.script]: Asset type name: all types
2020-06-22 17:12:45,931 DEBUG [groovy.script]: Asset type scheme id: 2
2020-06-22 17:12:45,931 DEBUG [groovy.script]: Asset type scheme name: HR Assets
2020-06-22 17:12:45,931 DEBUG [groovy.script]: Update by: admin
2020-06-22 17:12:45,931 DEBUG [groovy.script]: Updated by user details: 
2020-06-22 17:12:45,931 DEBUG [groovy.script]:       - Display name: admin
2020-06-22 17:12:45,931 DEBUG [groovy.script]:       - Email address: admin@snapbytes.com
2020-06-22 17:12:45,931 DEBUG [groovy.script]:       - User name: admin
2020-06-22 17:12:45,931 DEBUG [groovy.script]:       - User key: admin
2020-06-22 17:12:45,931 DEBUG [groovy.script]: Created by: admin
2020-06-22 17:12:45,931 DEBUG [groovy.script]: Created by user details: 
2020-06-22 17:12:45,932 DEBUG [groovy.script]:       - Display name: admin
2020-06-22 17:12:45,932 DEBUG [groovy.script]:       - Email address: admin@snapbytes.com
2020-06-22 17:12:45,932 DEBUG [groovy.script]:       - User name: admin
2020-06-22 17:12:45,932 DEBUG [groovy.script]:       - User key: admin
2020-06-22 17:12:45,932 DEBUG [groovy.script]: Attachments (as json string): [ {
  "originalFileName" : "Marla_Singer_2.jpg",
  "serverFileName" : "10163_48190_1591789628314.jpg",
  "fileSize" : "27 KB",
  "created" : "10/Jun/20 2:47 PM",
  "creator" : "admin"
}, {
  "originalFileName" : "xps13-2.jpg",
  "serverFileName" : "23815_70783_1591870901186.jpg",
  "fileSize" : "42 KB",
  "created" : "11/Jun/20 1:21 PM",
  "creator" : "admin"
}, {
  "originalFileName" : "bobswift example2.groovy",
  "serverFileName" : "06040_73967_1592483691399.groovy",
  "fileSize" : "3 KB",
  "created" : "18/Jun/20 3:34 PM",
  "creator" : "admin"
} ]
2020-06-22 17:12:45,932 DEBUG [groovy.script]: Operation System: null
2020-06-22 17:12:45,932 DEBUG [groovy.script]: Vendor: null
2020-06-22 17:12:45,932 DEBUG [groovy.script]: singleUser key: agrant-sd-demo
2020-06-22 17:12:45,932 DEBUG [groovy.script]:       - Display name: Alana Grant
2020-06-22 17:12:45,932 DEBUG [groovy.script]:       - Email address: agrant-sd-demo@example.com
2020-06-22 17:12:45,932 DEBUG [groovy.script]:       - User name: agrant-sd-demo
2020-06-22 17:12:45,932 DEBUG [groovy.script]:       - User key: agrant-sd-demo
2020-06-22 17:12:45,932 DEBUG [groovy.script]: datePicker: 2019-12-26
2020-06-22 17:12:45,932 DEBUG [groovy.script]: dateTimePicker: 2019-12-31T14:39
2020-06-22 17:12:45,932 DEBUG [groovy.script]: attribute name 'all - Asset list':
2020-06-22 17:12:45,932 DEBUG [groovy.script]:       - asset id: 183, name: admin çalışanı
2020-06-22 17:12:45,933 DEBUG [groovy.script]:       - asset id: 221, name: Asset Name 0001
2020-06-22 17:12:45,933 DEBUG [groovy.script]: Multi user select - 'all - jira multiple users':
2020-06-22 17:12:45,933 DEBUG [groovy.script]:       - user key: mdavis-sd-demo
2020-06-22 17:12:45,933 DEBUG [groovy.script]:       - user key: assetuser
2020-06-22 17:12:45,933 DEBUG [groovy.script]: Mult-select combo attribute, field name 'all - listbox multiple': 
2020-06-22 17:12:45,933 DEBUG [groovy.script]:       - one value: mavi
2020-06-22 17:12:45,933 DEBUG [groovy.script]:       - one value: kırmızı
2020-06-22 17:12:45,933 DEBUG [groovy.script]: Status Field key: 1
2020-06-22 17:12:45,933 DEBUG [groovy.script]: Status Field display value: In stock
2020-06-22 17:12:45,933 DEBUG [groovy.script]: Substatus Field key: 2
2020-06-22 17:12:45,933 DEBUG [groovy.script]: Substatus Field display value: Reserved
2020-06-22 17:12:45,933 DEBUG [groovy.script]: assetAssignee user key: JIRAUSER10303
2020-06-22 17:12:45,933 DEBUG [groovy.script]: assetOwner user key: agrant-sd-demo
2020-06-22 17:12:45,933 DEBUG [groovy.script]: assetManagedBy user key: mdavis-sd-demo
2020-06-22 17:12:45,933 DEBUG [groovy.script]: assetReservedFor user key: tyler
2020-06-22 17:12:45,933 DEBUG [groovy.script]: assetBelongsToGroup: [ "jira-servicedesk-users", "jira-software-users" ]
2020-06-22 17:12:45,934 DEBUG [groovy.script]:    - jira-servicedesk-users
2020-06-22 17:12:45,934 DEBUG [groovy.script]:    - jira-software-users
2020-06-22 17:12:45,934 DEBUG [groovy.script]: assetQuantity: 100
2020-06-22 17:12:45,934 DEBUG [groovy.script]: assetTag: asset tag
2020-06-22 17:12:45,934 DEBUG [groovy.script]: assetInstallDate: 2020-06-10
2020-06-22 17:12:45,934 DEBUG [groovy.script]: location id: 2, display value: Cambridge Office
2020-06-22 17:12:45,934 DEBUG [groovy.script]: assetCost: 1200
2020-06-22 17:12:45,934 DEBUG [groovy.script]: assetCostCurrency: USD
2020-06-22 17:12:45,934 DEBUG [groovy.script]: assetInvoiceNumber: my invoice 10387
2020-06-22 17:12:45,934 DEBUG [groovy.script]: ---------------------------------------------------------------------
2020-06-22 17:12:45,934 DEBUG [groovy.script]: ---------------------------------------------------------------------
2020-06-22 17:12:45,934 DEBUG [groovy.script]: Asset id: 10417
2020-06-22 17:12:45,934 DEBUG [groovy.script]: Asset name: Alpha Database Server
2020-06-22 17:12:45,934 DEBUG [groovy.script]: Asset type id: 46
2020-06-22 17:12:45,934 DEBUG [groovy.script]: Asset type name: Server 3
2020-06-22 17:12:45,934 DEBUG [groovy.script]: Asset type scheme id: 9
2020-06-22 17:12:45,934 DEBUG [groovy.script]: Asset type scheme name: Sample Assets
2020-06-22 17:12:45,935 DEBUG [groovy.script]: Update by: admin
2020-06-22 17:12:45,935 DEBUG [groovy.script]: Updated by user details: 
2020-06-22 17:12:45,935 DEBUG [groovy.script]:       - Display name: admin
2020-06-22 17:12:45,935 DEBUG [groovy.script]:       - Email address: admin@snapbytes.com
2020-06-22 17:12:45,935 DEBUG [groovy.script]:       - User name: admin
2020-06-22 17:12:45,935 DEBUG [groovy.script]:       - User key: admin
2020-06-22 17:12:45,935 DEBUG [groovy.script]: Created by: admin
2020-06-22 17:12:45,935 DEBUG [groovy.script]: Created by user details: 
2020-06-22 17:12:45,935 DEBUG [groovy.script]:       - Display name: admin
2020-06-22 17:12:45,935 DEBUG [groovy.script]:       - Email address: admin@snapbytes.com
2020-06-22 17:12:45,935 DEBUG [groovy.script]:       - User name: admin
2020-06-22 17:12:45,935 DEBUG [groovy.script]:       - User key: admin
2020-06-22 17:12:45,935 DEBUG [groovy.script]: Attachments (as json string): [ {
  "originalFileName" : "HkOK6xWq38k.jpg",
  "serverFileName" : "58639_34101_1590059524448.jpg",
  "fileSize" : "102 KB",
  "created" : "21/May/20 2:12 PM",
  "creator" : "admin"
}, {
  "originalFileName" : "9vPGTB7Fyuc.jpg",
  "serverFileName" : "22804_10326_1590059524540.jpg",
  "fileSize" : "315 KB",
  "created" : "21/May/20 2:12 PM",
  "creator" : "admin"
}, {
  "originalFileName" : "dyr4-I8r6z0.jpg",
  "serverFileName" : "74440_47514_1590059524554.jpg",
  "fileSize" : "202 KB",
  "created" : "21/May/20 2:12 PM",
  "creator" : "admin"
} ]
2020-06-22 17:12:45,935 DEBUG [groovy.script]: Operation System: Windows 10
2020-06-22 17:12:45,935 DEBUG [groovy.script]: Vendor: Apple
2020-06-22 17:12:45,935 DEBUG [groovy.script]: singleUser key: null
2020-06-22 17:12:45,935 DEBUG [groovy.script]: datePicker: null
2020-06-22 17:12:45,935 DEBUG [groovy.script]: dateTimePicker: null
2020-06-22 17:12:45,936 DEBUG [groovy.script]: attribute name 'all - Asset list':
2020-06-22 17:12:45,936 DEBUG [groovy.script]: Multi user select - 'all - jira multiple users':
2020-06-22 17:12:45,936 DEBUG [groovy.script]: Mult-select combo attribute, field name 'all - listbox multiple': 
2020-06-22 17:12:45,936 DEBUG [groovy.script]: Status Field key: 1
2020-06-22 17:12:45,936 DEBUG [groovy.script]: Status Field display value: In stock
2020-06-22 17:12:45,936 DEBUG [groovy.script]: Substatus Field key: 2
2020-06-22 17:12:45,936 DEBUG [groovy.script]: Substatus Field display value: Reserved
2020-06-22 17:12:45,936 DEBUG [groovy.script]: assetAssignee user key: 
2020-06-22 17:12:45,936 DEBUG [groovy.script]: assetOwner user key: null
2020-06-22 17:12:45,936 DEBUG [groovy.script]: assetManagedBy user key: mdavis-sd-demo
2020-06-22 17:12:45,936 DEBUG [groovy.script]: assetReservedFor user key: null
2020-06-22 17:12:45,936 DEBUG [groovy.script]: assetBelongsToGroup: null
2020-06-22 17:12:45,967 DEBUG [groovy.script]: assetQuantity: null
2020-06-22 17:12:45,967 DEBUG [groovy.script]: assetTag: tttt
2020-06-22 17:12:45,967 DEBUG [groovy.script]: assetInstallDate: null
2020-06-22 17:12:45,967 DEBUG [groovy.script]: location id: null, display value: null
2020-06-22 17:12:45,967 DEBUG [groovy.script]: assetCost: null
2020-06-22 17:12:45,967 DEBUG [groovy.script]: assetCostCurrency: 
2020-06-22 17:12:45,967 DEBUG [groovy.script]: assetInvoiceNumber: null


  • No labels