Nothing out of the box that I've seen. In our organization Resolved = Resolved Date (as it functions out of the box) but anything Closed ≠ Resolved Date (again - the system is functioning properly in our opinion).
We have a custom Closed Date attribute that we capture the date an Issue or Risk was Closed (but not Resolved - conceptually and informationally different for all the right reasons).
Here is our Stamp Close Date GEL for an Issue. Risks are very simmilar.
<gel:script xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:core="jelly:core" xmlns:gel="jelly:com.niku.union.gel.GELTagLibrary"
xmlns:jxml="jelly:xml" xmlns:soap="jelly:com.niku.union.gel.SOAPTagLibrary" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:sql="jelly:sql" xmlns:util="jelly:util" xmlns:xog="http://www.niku.com/xog" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<gel:parameter default="your_xog_username" var="xogUsername"/>
<gel:parameter default="your_xog_password" secure="true" var="xogPassword"/>
<!-- Get issue data & date -->
<gel:setDataSource dbId="niku"/>
<sql:query escapeText="false" var="data">
SELECT I.NAME ISSUE_NAME
, I.RIM_RISK_ISSUE_CODE ISSUE_CODE
, P.CODE PROJECT_CODE
, R.UNIQUE_NAME AS ISSUE_ASSIGNED_TO
, CAST(GETDATE() AS DATE) AS DATE
, A.OSUWMC_WIP_DATE
FROM RIM_RISKS_AND_ISSUES I
JOIN INV_INVESTMENTS P ON P.ID = I.PK_ID
JOIN ODF_CA_ISSUE A ON A.ID = I.ID
JOIN SRM_RESOURCES R ON R.USER_ID = I.ASSIGNED_TO
WHERE I.TYPE_CODE = 'ISSUE'
AND I.ID = ${gel_objectInstanceId}
</sql:query>
<!-- Get xog URL from application by fpena -->
<core:invokeStatic className="com.niku.union.config.ConfigurationManager" method="getInstance" var="config"/>
<core:set var="v_IsLocal">0</core:set>
<core:set value="${config.getProperties().getWebServer().getWebServerInstance(0).getId()}" var="WebServerid"/>
<core:if test="${WebServerid == 'app'}">
<core:set value="${config.getProperties().getWebServer().getWebServerInstance(0).getAddress()}" var="AddressIp"/>
<core:set value="${config.getProperties().getWebServer().getWebServerInstance(0).getSslEntryUrl()}" var="EntryURL"/>
<core:set value="${config.getProperties().getWebServer().getWebServerInstance(0).getSslPort()}" var="Port"/>
<core:if test="${EntryURL == 'http://localhost' }">
<gel:log level="info" message="NULL ADDRESS IS LOCAL... "/>
<core:set var="v_IsLocal">1</core:set>
<core:set var="AddressIp">${EntryURL}</core:set>
</core:if>
</core:if>
<core:if test="${WebServerid == 'nsa'}">
<core:set value="${config.getProperties().getWebServer().getWebServerInstance(1).getAddress()}" var="AddressIp"/>
<core:set value="${config.getProperties().getWebServer().getWebServerInstance(1).getEntryUrl()}" var="EntryURL"/>
<core:set value="${config.getProperties().getWebServer().getWebServerInstance(1).getPort()}" var="Port"/>
<core:if test="${EntryURL == 'http://localhost' }">
<gel:log level="info" message="NULL ADDRESS IS LOCAL... "/>
<core:set var="v_IsLocal">1</core:set>
<core:set var="AddressIp">${EntryURL}</core:set>
</core:if>
</core:if>
<core:if test="${Port != null }">
<core:set value="${EntryURL}" var="EntryURL"/>
</core:if>
<core:if test="${v_IsLocal == 0 }">
<core:if test="${AddressIp != '' }">
<core:set value="http://${AddressIp}" var="EntryURL"/>
</core:if>
</core:if>
<core:set value="${config.getProperties().getDirectories().getInstallDir()}" var="NIKUHOME"/>
<core:set value="${EntryURL}/niku/xog" var="xogURL"/>
<!-- Log into xog and get a session ID -->
<soap:invoke endpoint="${xogURL}" var="auth">
<soap:message>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xog="http://www.niku.com/xog">
<soapenv:Header/>
<soapenv:Body>
<xog:Login>
<xog:Username>${xogUsername}</xog:Username>
<xog:Password>${xogPassword}</xog:Password>
</xog:Login>
</soapenv:Body>
</soapenv:Envelope>
</soap:message>
</soap:invoke>
<!-- Checking whether a sessionID is returned. If not, it means that login was unsuccessful -->
<gel:set asString="true" select="$auth/SOAP-ENV:Envelope/SOAP-ENV:Body/xog:SessionID/text()" var="sessionID"/>
<core:choose>
<core:when test="${sessionID == null}">
<gel:log>Couldn't log in. Please check the hostname/username/password.</gel:log>
</core:when>
<core:otherwise>
<gel:log>Login successful. Session ID is ${sessionID}</gel:log>
</core:otherwise>
</core:choose>
<!-- Xog current date onto WIP Date -->
<soap:invoke endpoint="${xogURL}" var="runresult">
<soap:message>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xog="http://www.niku.com/xog">
<soapenv:Header>
<xog:Auth>
<xog:SessionID>${sessionID}</xog:SessionID>
</xog:Auth>
</soapenv:Header>
<soapenv:Body>
<NikuDataBus xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/nikuxog_issue.xsd">
<Header action="write" externalSource="NIKU" objectType="issue" version="13.2.0.472"/>
<issues>
<issue code="${data.rows.0.issue_code}" name="${data.rows.0.issue_name}" ownerCode="${data.rows.0.issue_assigned_to}" projectCode="${data.rows.0.project_code}">
<CustomInformation>
<ColumnValue name="osuwmc_close_date">${data.rows.0.date}</ColumnValue>
</CustomInformation>
</issue>
</issues>
</NikuDataBus>
</soapenv:Body>
</soapenv:Envelope>
</soap:message>
</soap:invoke>
<!-- Log out of xog -->
<soap:invoke endpoint="${xogURL}" var="logoutresult">
<soap:message>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xog="http://www.niku.com/xog">
<soapenv:Header>
<xog:Auth>
<xog:SessionID>${sessionID}</xog:SessionID>
</xog:Auth>
</soapenv:Header>
<soapenv:Body>
<xog:Logout/>
</soapenv:Body>
</soapenv:Envelope>
</soap:message>
</soap:invoke>
<!-- comment out below log output once in production -->
<gel:log> ${xogURL}, ${xogUsername}, ${xogPassword}, ${sessionID}, ${gel_objectInstanceId}, ${data.rows.0.inv_name}, ${data.rows.0.inv_code}, ${data.rows.0.osuwmc_init_date}, ${data.rows.0.osuwmc_init_days}</gel:log>
</gel:script>