{"id":14896,"date":"2026-10-13T13:24:35","date_gmt":"2026-10-13T11:24:35","guid":{"rendered":"https:\/\/actonic.de\/?p=14896"},"modified":"2026-10-13T13:36:23","modified_gmt":"2026-10-13T11:36:23","slug":"jira-financial-year-report","status":"publish","type":"post","link":"https:\/\/actonic.de\/en\/jira-financial-year-report\/","title":{"rendered":"Australian financial year in Jira: tickets per quarter from 1 July to 30 June"},"content":{"rendered":"<div class=\"wpb-content-wrapper\" id=\"wpb-content-root\"><p>[vc_row][vc_column][vc_column_text css=&#8221;&#8221;]<\/p>\n<p>The same question comes up again and again in different forms. A service desk lead in Australia wants one bar chart on a Jira dashboard: <strong>customer requests per quarter of the Australian financial year<\/strong>, 1 July 2026 to 30 June 2027. What she gets from the built-in gadget is a rolling &#8220;last 365 days&#8221; window, with <strong>five partial calendar quarters<\/strong> on the x-axis instead of four financial ones.<\/p>\n<p>The honest answer is that Jira can&#8217;t do it natively. This post shows why, what the usual workarounds cost, and a Report Builder report that solves it for any financial year, with the full source code at the end.<\/p>\n<p>[\/vc_column_text][vc_single_image image=&#8221;14886&#8243; img_size=&#8221;full&#8221; alignment=&#8221;center&#8221; onclick=&#8221;link_image&#8221; css=&#8221;&#8221;][vc_column_text css=&#8221;&#8221;]<\/p>\n<h2>Why Jira dashboards can&#8217;t show financial quarters<\/h2>\n<p>Three things get in the way, and none of them is a setting you missed.<\/p>\n<ul>\n<li><strong>Gadgets use calendar quarters.<\/strong> The &#8220;Quarterly&#8221; period in gadgets such as Created vs Resolved means January\u2013March, April\u2013June and so on. The other choice, &#8220;days previously&#8221;, is a rolling window that can&#8217;t be anchored to 1 July.<\/li>\n<li><strong>JQL has no quarter functions.<\/strong> Jira Cloud has <code>startOfYear()<\/code>, <code>startOfMonth()<\/code> and <code>startOfWeek()<\/code>, and <code>startOfYear(\"+6M\")<\/code> does give you 1 July. But there is no <code>startOfQuarter()<\/code>, and a <a href=\"https:\/\/jira.atlassian.com\/browse\/JRASERVER-79145\">request to add one<\/a> is still gathering interest.<\/li>\n<li><strong>The financial year setting lives elsewhere.<\/strong> Jira Premium lets you <a href=\"https:\/\/support.atlassian.com\/jira-software-cloud\/docs\/change-financial-year-dates-in-your-plans\/\">change the financial year in Plans<\/a>, and Jira Product Discovery has its own fiscal year setting. Both shape roadmap timelines, not dashboard charts.<\/li>\n<\/ul>\n<p>If your company has Atlassian Analytics, a custom SQL date bucket can group by financial year. Most Jira teams don&#8217;t, and it still needs SQL.<\/p>\n<h2>The workarounds, and what they cost<\/h2>\n<p>The community answers suggest three native workarounds. They work, but each one needs ongoing care.<\/p>\n<table>\n<tbody>\n<tr>\n<td><strong>Workaround<\/strong><\/td>\n<td><strong>How it works<\/strong><\/td>\n<td><strong>The catch<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Labels from automation<\/td>\n<td>A rule adds FYQ1\u2013FYQ4 to each new ticket; an Issue Statistics gadget counts by label<\/td>\n<td>Old tickets need a backfill, labels must be reset every year, and the labels clutter tickets<\/td>\n<\/tr>\n<tr>\n<td>Four saved filters<\/td>\n<td>One filter per financial quarter, one Filter Results gadget each<\/td>\n<td>Four numbers, no bar chart; every filter needs new dates every year<\/td>\n<\/tr>\n<tr>\n<td>Export to Google Sheets<\/td>\n<td>A full-year filter pulled into Sheets with Jira Cloud for Sheets, charted there<\/td>\n<td>The chart lives outside Jira and is only as fresh as the last refresh<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>None of them compares this year with last year, and none tells you whether a half-finished quarter is ahead or behind.<\/p>\n<h2>The solution: a financial year report in Report Builder<\/h2>\n<p><a href=\"https:\/\/marketplace.atlassian.com\/apps\/1216997\/report-builder-custom-charts-dashboards-for-jira\">Report Builder<\/a> has a pivot builder for everyday reports, but its quarter grouping has no financial-year setting either. So we wrote a small <strong>scripted report<\/strong>: a report with its own code that runs inside Report Builder on live Jira data. You set the month your financial year starts in, and every chart and table follows it.<\/p>\n<p>Here is what it shows for one of our demo service projects, financial year 2024\u201325:<\/p>\n<ul>\n<li><strong>One bar per financial quarter<\/strong>, Q1 = July\u2013September, with the previous financial year next to it.<\/li>\n<li><strong>Tiles on top<\/strong>: the year&#8217;s total (1,916), the change against the previous year (\u221223%), the busiest quarter (Q1, 645) and the monthly average.<\/li>\n<li><strong>A table with every number clickable.<\/strong> Each count opens exactly those tickets in Jira, so the chart and the issue search always agree.<\/li>\n<\/ul>\n<p>[\/vc_column_text][vc_single_image image=&#8221;14888&#8243; img_size=&#8221;full&#8221; alignment=&#8221;center&#8221; onclick=&#8221;link_image&#8221; css=&#8221;&#8221;][vc_column_text css=&#8221;&#8221;]<\/p>\n<h3>Settings<\/h3>\n<p>Everything is set in the report&#8217;s settings panel and saved with the report, so the dashboard shows the same view for everyone.<\/p>\n<table>\n<tbody>\n<tr>\n<td><strong>Setting<\/strong><\/td>\n<td><strong>Options<\/strong><\/td>\n<td><strong>Default<\/strong><\/td>\n<\/tr>\n<tr>\n<td>Issues to count<\/td>\n<td>Projects, saved filters or JQL<\/td>\n<td>All issues you can see<\/td>\n<\/tr>\n<tr>\n<td>Financial year starts in<\/td>\n<td>Any month (July for Australia, April for the UK, India and Japan, October for the US federal government)<\/td>\n<td>July<\/td>\n<\/tr>\n<tr>\n<td>Financial year<\/td>\n<td>The year it ends in: 2027 means 1 July 2026 \u2013 30 June 2027<\/td>\n<td>Current<\/td>\n<\/tr>\n<tr>\n<td>Compare with<\/td>\n<td>Nothing, previous year, previous 2 years<\/td>\n<td>Previous year<\/td>\n<\/tr>\n<tr>\n<td>Count issues by<\/td>\n<td>Created date or Resolved date<\/td>\n<td>Created<\/td>\n<\/tr>\n<tr>\n<td>One bar per<\/td>\n<td>Quarter or month<\/td>\n<td>Quarter<\/td>\n<\/tr>\n<tr>\n<td>Split bars by<\/td>\n<td>Request type, issue type, priority, status category, assignee<\/td>\n<td>Nothing<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>[\/vc_column_text][vc_single_image image=&#8221;14890&#8243; img_size=&#8221;full&#8221; alignment=&#8221;center&#8221; onclick=&#8221;link_image&#8221; css=&#8221;&#8221;][vc_column_text css=&#8221;&#8221;]<\/p>\n<h3>Split by request type<\/h3>\n<p>For a service desk, the next question after &#8220;how many&#8221; is &#8220;what kind&#8221;. Split the bars by request type and you also get a table with request types as rows and financial quarters as columns. In our demo project, &#8220;Report a system issue&#8221; accounts for 1,572 of the 1,916 tickets in FY 2024\u201325.<\/p>\n<p>[\/vc_column_text][vc_single_image image=&#8221;14892&#8243; img_size=&#8221;full&#8221; alignment=&#8221;center&#8221; onclick=&#8221;link_image&#8221; css=&#8221;&#8221;][vc_column_text css=&#8221;&#8221;]<\/p>\n<h3>Monthly view<\/h3>\n<p>Switch to one bar per month to see the financial year from July to June, with the same comparison.<\/p>\n<p>[\/vc_column_text][vc_single_image image=&#8221;14894&#8243; img_size=&#8221;full&#8221; alignment=&#8221;center&#8221; onclick=&#8221;link_image&#8221; css=&#8221;&#8221;][vc_column_text css=&#8221;&#8221;]<\/p>\n<h3>The current year, compared fairly<\/h3>\n<p>When the selected year is still running, comparing it with a full previous year would always look like a drop. The report compares it with the previous year <strong>up to the same day<\/strong> instead, and marks the running quarter as &#8220;so far&#8221;. Quarters that haven&#8217;t started are greyed out.<\/p>\n<h2>How to add it to your Jira<\/h2>\n<p>You can get this report in three ways.<\/p>\n<ol>\n<li><strong>Ask the AI assistant.<\/strong> In Report Builder, open the assistant in Rovo, or connect your own AI client through MCP, and ask for &#8220;a bar chart of tickets per quarter of the Australian financial year, 1 July to 30 June, compared with last year&#8221;. It builds a draft for you to review and save.<\/li>\n<li><strong>Paste the code.<\/strong> Create a new scripted report, then paste the script, the template and the input fields from the end of this post. Adding or editing a scripted report needs the <strong>Scripted Reports Creator<\/strong> permission.<\/li>\n<li><strong>Ask us.<\/strong> We build custom reports for Report Builder customers for free: <a href=\"https:\/\/actonic.atlassian.net\/servicedesk\/customer\/portal\/8\/create\/119\">request a custom report<\/a>.<\/li>\n<\/ol>\n<p>Once it&#8217;s saved, you can add the report to a Jira dashboard like any other Report Builder report.<\/p>\n<h2>How the report counts<\/h2>\n<p>The whole trick is one function. A date belongs to the financial year that <strong>ends<\/strong> in the following calendar year if its month is on or after the start month:<\/p>\n<p>[\/vc_column_text][vc_column_text css=&#8221;&#8221;]<\/p>\n<pre><code>\/\/ startMonth: 7 for July. Returns the financial year (by the year it ends in)\n\n\/\/ and the month index 0\u201311 inside that year.\n\nfunction bucket(dateStr, startMonth) {\n\n  var y = +dateStr.slice(0, 4), m = +dateStr.slice(5, 7);\n\n  var fy = startMonth === 1 ? y : (m &gt;= startMonth ? y + 1 : y);\n\n  return { fy: fy, k: (m - startMonth + 12) % 12 };   \/\/ quarter = Math.floor(k \/ 3) + 1\n\n}\n\n<\/code><\/pre>\n<p>[\/vc_column_text][vc_column_text css=&#8221;&#8221;]<\/p>\n<p>A few choices make the numbers trustworthy:<\/p>\n<ul>\n<li><strong>Dates are bucketed by the calendar date Jira returns<\/strong>, not converted through the browser&#8217;s time zone. A ticket created at 23:30 on 30 June stays in Q4, exactly as JQL <code>created &lt; \"2025-07-01\"<\/code> sees it.<\/li>\n<li><strong>One query per report.<\/strong> The report fetches every ticket in the selected years once and counts them in the browser, so it stays quick on a few thousand tickets.<\/li>\n<li><strong>Every number links to its JQL.<\/strong> If someone doubts a bar, one click shows the tickets behind it.<\/li>\n<\/ul>\n<p>We tested the date logic for July, January, April and October starts, including tickets on the last and first day of a financial year. Then we checked the report in Jira against plain JQL counts, for a July and an April start: every quarter matched.<\/p>\n<h2>Full source code<\/h2>\n<p>The report has three parts: the input fields, the script and the template. Paste them into a new scripted report in Report Builder.<\/p>\n<h3>Input fields (<code>code\/fields.json<\/code>)<\/h3>\n<p>[\/vc_column_text][vc_column_text css=&#8221;&#8221;]<\/p>\n<pre><code>[\n\n  {\n\n    \"type\": \"14\",\n\n    \"name\": \"scope\",\n\n    \"title\": \"Issues to count: projects, saved filters or JQL (empty = all issues)\",\n\n    \"order\": 1,\n\n    \"defaultValue\": {\n\n      \"scopePickerMode\": \"basicView\",\n\n      \"projects\": [],\n\n      \"epics\": [],\n\n      \"issues\": [],\n\n      \"filters\": [],\n\n      \"jql\": \"\"\n\n    }\n\n  },\n\n  {\n\n    \"type\": \"13\",\n\n    \"name\": \"fy-start\",\n\n    \"title\": \"Financial year starts in\",\n\n    \"optionsList\": [\n\n      \"January\",\n\n      \"February\",\n\n      \"March\",\n\n      \"April (e.g. UK, India, Japan)\",\n\n      \"May\",\n\n      \"June\",\n\n      \"July (e.g. Australia)\",\n\n      \"August\",\n\n      \"September\",\n\n      \"October (e.g. US federal government)\",\n\n      \"November\",\n\n      \"December\"\n\n    ],\n\n    \"isMulti\": false,\n\n    \"order\": 2,\n\n    \"defaultValue\": \"July (e.g. Australia)\"\n\n  },\n\n  {\n\n    \"type\": \"1\",\n\n    \"name\": \"fy-year\",\n\n    \"title\": \"Financial year, by the year it ends in (empty = current)\",\n\n    \"order\": 3,\n\n    \"defaultValue\": \"\"\n\n  },\n\n  {\n\n    \"type\": \"13\",\n\n    \"name\": \"compare\",\n\n    \"title\": \"Compare with\",\n\n    \"optionsList\": [\n\n      \"Nothing\",\n\n      \"Previous financial year\",\n\n      \"Previous 2 financial years\"\n\n    ],\n\n    \"isMulti\": false,\n\n    \"order\": 4,\n\n    \"defaultValue\": \"Previous financial year\"\n\n  },\n\n  {\n\n    \"type\": \"13\",\n\n    \"name\": \"date-field\",\n\n    \"title\": \"Count issues by\",\n\n    \"optionsList\": [\n\n      \"Created date\",\n\n      \"Resolved date\"\n\n    ],\n\n    \"isMulti\": false,\n\n    \"order\": 5,\n\n    \"defaultValue\": \"Created date\"\n\n  },\n\n  {\n\n    \"type\": \"13\",\n\n    \"name\": \"period\",\n\n    \"title\": \"One bar per\",\n\n    \"optionsList\": [\n\n      \"Quarter\",\n\n      \"Month\"\n\n    ],\n\n    \"isMulti\": false,\n\n    \"order\": 6,\n\n    \"defaultValue\": \"Quarter\"\n\n  },\n\n  {\n\n    \"type\": \"13\",\n\n    \"name\": \"split\",\n\n    \"title\": \"Split bars by\",\n\n    \"optionsList\": [\n\n      \"Nothing\",\n\n      \"Request type\",\n\n      \"Issue type\",\n\n      \"Priority\",\n\n      \"Status category\",\n\n      \"Assignee\"\n\n    ],\n\n    \"isMulti\": false,\n\n    \"order\": 7,\n\n    \"defaultValue\": \"Nothing\"\n\n  }\n\n]\n\n<\/code><\/pre>\n<p>[\/vc_column_text][vc_column_text css=&#8221;&#8221;]<\/p>\n<h3>Script (<code>code\/script.js<\/code>)<\/h3>\n<p>[\/vc_column_text][vc_column_text css=&#8221;&#8221;]<\/p>\n<pre><code>\/**\n\n * Financial year report: issues per financial quarter (or month) for any financial year,\n\n * for example the Australian financial year (1 July to 30 June).\n\n *\n\n * Settings:\n\n *   scope       Which issues to count: projects, saved filters or JQL (empty = all issues you can see)\n\n *   fy-start    The month the financial year starts in (July for Australia)\n\n *   fy-year     The financial year to show, by the year it ENDS in (2027 = 1 Jul 2026 \u2013 30 Jun 2027). Empty = current\n\n *   compare     Also show the previous one or two financial years\n\n *   date-field  Count issues by Created or by Resolved date\n\n *   period      One bar per financial quarter or per month\n\n *   split       Split the bars of the selected year by request type, issue type, priority, status category or assignee\n\n *\n\n * Dates are bucketed by the calendar date Jira returns (YYYY-MM-DD in your Jira time zone),\n\n * the same way JQL compares dates, so the numbers match the \"Open in Jira\" links.\n\n *\/\n\nvar U = {};\n\nU.esc = function (s) {\n\n  return String(s == null ? '' : s).replace(\/&amp;\/g, '&amp;amp;').replace(\/&lt;\/g, '&amp;lt;').replace(\/&gt;\/g, '&amp;gt;')\n\n    .replace(\/\"\/g, '&amp;quot;').replace(\/'\/g, '&amp;#39;');\n\n};\n\nU.text = function (raw) {\n\n  var s = String(raw == null ? '' : raw).trim();\n\n  if (\/^\".*\"$\/.test(s)) { try { s = String(JSON.parse(s)).trim(); } catch (e) { s = s.slice(1, -1).trim(); } }\n\n  return s;\n\n};\n\nU.getJson = async function (path) {\n\n  if (!SR.request) return null;\n\n  try {\n\n    var r = await SR.request(path, { method: 'GET' });\n\n    if (!r || r.ok === false) return null;\n\n    return typeof r.json === 'function' ? await r.json() : r;\n\n  } catch (e) { return null; }\n\n};\n\n\/\/ Select values may come back slugified (\"request-type\"): compare them in a normalised form.\n\nU.norm = function (raw) { return U.text(raw).toLowerCase().replace(\/[-_]+\/g, ' ').replace(\/\\s+\/g, ' ').trim(); };\n\n\/\/ Type 14 \"Filter by\" usually returns a ready JQL string, sometimes the stored picker object.\n\nU.scopeJql = function (raw) {\n\n  var jql = '';\n\n  if (typeof raw === 'string') jql = raw.trim();\n\n  else if (raw &amp;&amp; typeof raw === 'object') {\n\n    if (raw.jql &amp;&amp; String(raw.jql).trim()) jql = String(raw.jql).trim();\n\n    else {\n\n      var parts = [];\n\n      if (Array.isArray(raw.projects) &amp;&amp; raw.projects.length)\n\n        parts.push('project in (' + raw.projects.map(function (p) { return '\"' + (p.value != null ? p.value : p) + '\"'; }).join(',') + ')');\n\n      if (Array.isArray(raw.filters) &amp;&amp; raw.filters.length)\n\n        parts.push(raw.filters.map(function (f) { return f.type === 'predefinedFilter' ? '(' + f.value + ')' : 'filter = ' + f.value; }).join(' AND '));\n\n      if (Array.isArray(raw.issues) &amp;&amp; raw.issues.length)\n\n        parts.push('issue in (' + raw.issues.map(function (i) { return i.value; }).join(',') + ')');\n\n      jql = parts.join(' AND ');\n\n    }\n\n  }\n\n  return jql.replace(\/\\s+order\\s+by\\s+[\\s\\S]*$\/i, '').trim();\n\n};\n\nU.scopeLabel = function (data, jql) {\n\n  if (data &amp;&amp; typeof data === 'object' &amp;&amp; data.scopePickerMode !== 'jql') {\n\n    var bits = [];\n\n    ['projects', 'epics', 'issues', 'filters'].forEach(function (k) {\n\n      (Array.isArray(data[k]) ? data[k] : []).forEach(function (x) { if (x &amp;&amp; x.label) bits.push(x.label); });\n\n    });\n\n    if (bits.length) return bits.join(', ');\n\n  }\n\n  if (!jql) return 'All issues you can see';\n\n  return jql.length &gt; 120 ? jql.slice(0, 117) + '\u2026' : jql;\n\n};\n\n\n\n\/\/ ---------------------------------------------------------------- financial year maths\n\nvar MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\nvar MONTHS_LONG = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n\nvar pad = function (n) { return (n &lt; 10 ? '0' : '') + n; };\n\nvar FY = {};\n\nFY.init = function (startMonth) { FY.m0 = startMonth; };          \/\/ 1..12\n\n\/\/ The financial year a calendar date belongs to, named by the year it ends in.\n\nFY.endYearOf = function (y, m) { return FY.m0 === 1 ? y : (m &gt;= FY.m0 ? y + 1 : y); };\n\nFY.startOf = function (endYear) { return FY.m0 === 1 ? endYear + '-01-01' : (endYear - 1) + '-' + pad(FY.m0) + '-01'; };\n\nFY.endOf = function (endYear) { return FY.m0 === 1 ? (endYear + 1) + '-01-01' : endYear + '-' + pad(FY.m0) + '-01'; }; \/\/ exclusive\n\nFY.label = function (endYear) { return FY.m0 === 1 ? 'FY ' + endYear : 'FY ' + (endYear - 1) + '\u2013' + String(endYear).slice(2); };\n\n\/\/ k-th month of the financial year (0..11) -&gt; {y, m}\n\nFY.monthAt = function (endYear, k) {\n\n  var y = FY.m0 === 1 ? endYear : endYear - 1;\n\n  var m = FY.m0 + k;\n\n  if (m &gt; 12) { m -= 12; y += 1; }\n\n  return { y: y, m: m };\n\n};\n\nFY.monthStart = function (endYear, k) { var a = FY.monthAt(endYear, k); return a.y + '-' + pad(a.m) + '-01'; };\n\nFY.monthEnd = function (endYear, k) {   \/\/ exclusive\n\n  if (k === 11) return FY.endOf(endYear);\n\n  return FY.monthStart(endYear, k + 1);\n\n};\n\n\/\/ Bucket of a 'YYYY-MM-DD\u2026' string: { fy, k } where k is the month index in the financial year\n\nFY.bucket = function (dateStr) {\n\n  var y = +dateStr.slice(0, 4), m = +dateStr.slice(5, 7);\n\n  return { fy: FY.endYearOf(y, m), k: (m - FY.m0 + 12) % 12 };\n\n};\n\nFY.dayLabel = function (iso) { return (+iso.slice(8, 10)) + ' ' + MONTHS[+iso.slice(5, 7) - 1] + ' ' + iso.slice(0, 4); };\n\nFY.lastDay = function (exclusiveIso) {   \/\/ the day before an exclusive end date\n\n  var p = exclusiveIso.split('-');\n\n  var d = new Date(Date.UTC(+p[0], +p[1] - 1, +p[2]) - 86400000);\n\n  return d.getUTCFullYear() + '-' + pad(d.getUTCMonth() + 1) + '-' + pad(d.getUTCDate());\n\n};\n\n\n\n\/\/ ---------------------------------------------------------------- settings\n\nvar scopeRaw = await SR.fields.getValueByFieldName('scope');\n\nvar scopeData = null;\n\ntry { scopeData = SR.fields.getDataByFieldName ? await SR.fields.getDataByFieldName('scope') : null; } catch (e) { scopeData = null; }\n\nvar scopeJql = U.scopeJql(scopeRaw);\n\nif (!scopeData &amp;&amp; scopeRaw &amp;&amp; typeof scopeRaw === 'object') scopeData = scopeRaw;\n\n\n\nvar startText = U.norm(await SR.fields.getValueByFieldName('fy-start')) || 'july';\n\nvar startMonth = 0;\n\nMONTHS_LONG.forEach(function (m, x) { if (startText.indexOf(m.toLowerCase()) === 0) startMonth = x + 1; });\n\nif (startMonth &lt; 1) startMonth = 7;\n\nFY.init(startMonth);\n\n\n\nvar yearRaw = U.text(await SR.fields.getValueByFieldName('fy-year'));\n\nvar compareText = U.norm(await SR.fields.getValueByFieldName('compare'));\n\nvar dateText = U.norm(await SR.fields.getValueByFieldName('date-field'));\n\nvar periodText = U.norm(await SR.fields.getValueByFieldName('period'));\n\nvar splitText = U.norm(await SR.fields.getValueByFieldName('split'));\n\n\n\nvar byResolved = dateText.indexOf('resolved') &gt;= 0;\n\nvar dateField = byResolved ? 'resolutiondate' : 'created';\n\nvar dateJql = byResolved ? 'resolved' : 'created';\n\nvar monthly = periodText.indexOf('month') &gt;= 0;\n\nvar compareN = compareText.indexOf('2') &gt;= 0 ? 2 : (compareText.indexOf('previous') &gt;= 0 ? 1 : 0);\n\nvar split = \/request\/.test(splitText) ? 'requestType' : \/issue type\/.test(splitText) ? 'issuetype'\n\n  : \/priority\/.test(splitText) ? 'priority' : \/status\/.test(splitText) ? 'statusCategory'\n\n  : \/assignee\/.test(splitText) ? 'assignee' : '';\n\n\n\nvar now = new Date();\n\nvar todayIso = now.getFullYear() + '-' + pad(now.getMonth() + 1) + '-' + pad(now.getDate());\n\nvar currentFy = FY.endYearOf(now.getFullYear(), now.getMonth() + 1);\n\nvar fyYear = parseInt(String(yearRaw).replace(\/[^0-9]\/g, ''), 10);\n\nif (!fyYear || fyYear &lt; 1990 || fyYear &gt; 2100) fyYear = currentFy;\n\nif (fyYear &gt; currentFy) throw { srError: 'The financial year ending in ' + fyYear + ' has not started yet. Leave the year empty to show the current financial year.' };\n\n\n\nvar years = [];\n\nfor (var i = compareN; i &gt;= 0; i--) years.push(fyYear - i);   \/\/ oldest first\n\nvar rangeStart = FY.startOf(years[0]);\n\nvar rangeEnd = FY.endOf(fyYear);\n\n\n\n\/\/ ---------------------------------------------------------------- request type field (Jira Service Management)\n\nvar rtField = null;\n\nif (split === 'requestType') {\n\n  var fieldList = null;\n\n  try { fieldList = SR.jira.getIssueFields ? await SR.jira.getIssueFields() : null; } catch (e) { fieldList = null; }\n\n  if (!Array.isArray(fieldList)) fieldList = await U.getJson('\/rest\/api\/3\/field');\n\n  (Array.isArray(fieldList) ? fieldList : []).some(function (f) {\n\n    if (f &amp;&amp; f.schema &amp;&amp; f.schema.custom === 'com.atlassian.servicedesk:vp-origin') { rtField = f.id; return true; }\n\n    return false;\n\n  });\n\n  if (!rtField) split = 'issuetype';   \/\/ not a service desk site: fall back to issue type\n\n}\n\nvar splitLabel = { requestType: 'request type', issuetype: 'issue type', priority: 'priority', statusCategory: 'status category', assignee: 'assignee' }[split] || '';\n\n\n\n\/\/ ---------------------------------------------------------------- fetch\n\nvar inScope = function (jql) { return scopeJql ? '(' + scopeJql + ') AND ' + jql : jql; };\n\nvar rangeJql = function (from, to) { return dateJql + ' &gt;= \"' + from + '\" AND ' + dateJql + ' &lt; \"' + to + '\"'; };\n\nvar fields = [dateField];\n\nif (split === 'requestType') fields.push(rtField);\n\nif (split === 'issuetype') fields.push('issuetype');\n\nif (split === 'priority') fields.push('priority');\n\nif (split === 'statusCategory') fields.push('status');\n\nif (split === 'assignee') fields.push('assignee');\n\n\n\nvar issues = await SR.jira.getIssuesByJQL(inScope(rangeJql(rangeStart, rangeEnd)), fields.join(','), '');\n\nif (!Array.isArray(issues)) issues = [];\n\n\n\nvar splitOf = function (f) {\n\n  if (split === 'requestType') { var v = f[rtField]; return { name: v &amp;&amp; v.requestType &amp;&amp; v.requestType.name ? v.requestType.name : 'No request type', jql: null }; }\n\n  if (split === 'issuetype') return f.issuetype ? { name: f.issuetype.name, jql: 'issuetype = \"' + f.issuetype.name.replace(\/\"\/g, '\\\\\"') + '\"' } : { name: 'Unknown', jql: null };\n\n  if (split === 'priority') return f.priority ? { name: f.priority.name, jql: 'priority = \"' + f.priority.name.replace(\/\"\/g, '\\\\\"') + '\"' } : { name: 'No priority', jql: 'priority is EMPTY' };\n\n  if (split === 'statusCategory') {\n\n    var c = f.status &amp;&amp; f.status.statusCategory;\n\n    return c ? { name: c.name, jql: 'statusCategory = ' + c.id } : { name: 'Unknown', jql: null };\n\n  }\n\n  if (split === 'assignee') return f.assignee ? { name: f.assignee.displayName, jql: 'assignee = \"' + f.assignee.accountId + '\"' } : { name: 'Unassigned', jql: 'assignee is EMPTY' };\n\n  return null;\n\n};\n\n\n\n\/\/ ---------------------------------------------------------------- count\n\nvar nB = monthly ? 12 : 4;\n\nvar bucketOfK = function (k) { return monthly ? k : Math.floor(k \/ 3); };\n\nvar counts = {};                      \/\/ fy -&gt; [nB]\n\nyears.forEach(function (y) { counts[y] = []; for (var b = 0; b &lt; nB; b++) counts[y].push(0); });\n\nvar splitCounts = {};                 \/\/ name -&gt; { jql, cells[nB], total }\n\nvar sameDayLastYear = {};             \/\/ fy -&gt; count up to the same day of the year as today\n\nvar skipped = 0;\n\n\n\n\/\/ \"Same point last year\" for an in-progress year: today's month\/day one, two\u2026 years back.\n\nvar shiftIso = function (iso, back) {\n\n  var y = +iso.slice(0, 4) - back, md = iso.slice(5, 10);\n\n  if (md === '02-29') md = '02-28';\n\n  return y + '-' + md;\n\n};\n\nvar inProgress = fyYear === currentFy;\n\n\n\nissues.forEach(function (it) {\n\n  var f = it.fields || {};\n\n  var d = f[dateField];\n\n  if (!d || typeof d !== 'string') { skipped++; return; }\n\n  var b = FY.bucket(d);\n\n  if (!counts[b.fy]) { skipped++; return; }\n\n  var bi = bucketOfK(b.k);\n\n  counts[b.fy][bi]++;\n\n  if (inProgress) {\n\n    var back = fyYear - b.fy;\n\n    if (d.slice(0, 10) &lt;= shiftIso(todayIso, back)) sameDayLastYear[b.fy] = (sameDayLastYear[b.fy] || 0) + 1;\n\n  }\n\n  if (split &amp;&amp; b.fy === fyYear) {\n\n    var s = splitOf(f);\n\n    if (!splitCounts[s.name]) { splitCounts[s.name] = { name: s.name, jql: s.jql, cells: [], total: 0 }; for (var z = 0; z &lt; nB; z++) splitCounts[s.name].cells.push(0); }\n\n    splitCounts[s.name].cells[bi]++;\n\n    splitCounts[s.name].total++;\n\n  }\n\n});\n\n\n\n\/\/ ---------------------------------------------------------------- buckets and labels\n\nvar buckets = [];\n\nfor (var bb = 0; bb &lt; nB; bb++) {\n\n  var k0 = monthly ? bb : bb * 3, k1 = monthly ? bb : bb * 3 + 2;\n\n  var from = FY.monthStart(fyYear, k0), to = FY.monthEnd(fyYear, k1);\n\n  var a0 = FY.monthAt(fyYear, k0), a1 = FY.monthAt(fyYear, k1);\n\n  var state = to &lt;= todayIso ? 'done' : (from &lt;= todayIso ? 'running' : 'future');\n\n  buckets.push({\n\n    i: bb,\n\n    short: monthly ? MONTHS[a0.m - 1] : 'Q' + (bb + 1),\n\n    \/\/ Months need no range in rows and on the axis: the columns are financial years.\n\n    range: monthly ? '' : MONTHS[a0.m - 1] + '\u2013' + MONTHS[a1.m - 1],\n\n    full: monthly ? MONTHS[a0.m - 1] + ' ' + a0.y : MONTHS[a0.m - 1] + '\u2013' + MONTHS[a1.m - 1],\n\n    state: state,\n\n    k0: k0, k1: k1\n\n  });\n\n}\n\nvar bucketRange = function (fy, b) { return { from: FY.monthStart(fy, b.k0), to: FY.monthEnd(fy, b.k1) }; };\n\n\n\nvar totals = {};\n\nyears.forEach(function (y) { totals[y] = counts[y].reduce(function (s, n) { return s + n; }, 0); });\n\n\n\n\/\/ Split rows: biggest first, top 8 + \"Other\"\n\nvar splitRows = Object.keys(splitCounts).map(function (k) { return splitCounts[k]; })\n\n  .sort(function (a, b) { return b.total - a.total; });\n\nif (splitRows.length &gt; 9) {\n\n  var other = { name: 'Other', jql: null, cells: [], total: 0, other: true };\n\n  for (var o = 0; o &lt; nB; o++) other.cells.push(0);\n\n  splitRows.slice(8).forEach(function (r) { r.cells.forEach(function (n, x) { other.cells[x] += n; }); other.total += r.total; });\n\n  splitRows = splitRows.slice(0, 8).concat([other]);\n\n}\n\n\n\nvar baseUrl = '';\n\ntry { baseUrl = await SR.jira.getHostBaseUrl(); } catch (e) { baseUrl = ''; }\n\nvar jiraLink = function (jql) { return baseUrl + '\/issues\/?jql=' + encodeURIComponent(inScope(jql) + ' ORDER BY ' + dateJql + ' ASC'); };\n\n\n\nvar cur = counts[fyYear];\n\nvar elapsed = buckets.filter(function (b) { return b.state !== 'future'; });\n\nvar busiest = elapsed.slice().sort(function (a, b) { return cur[b.i] - cur[a.i]; })[0];\n\nvar monthsElapsed = 0;\n\nfor (var mk = 0; mk &lt; 12; mk++) if (FY.monthStart(fyYear, mk) &lt;= todayIso) monthsElapsed++;\n\nvar prevY = fyYear - 1;\n\nvar prevTotal = compareN ? (inProgress ? (sameDayLastYear[prevY] || 0) : totals[prevY]) : null;\n\nvar curTotal = totals[fyYear];\n\nvar change = prevTotal ? Math.round((curTotal - prevTotal) \/ prevTotal * 100) : null;\n\n\n\nvar startIso = FY.startOf(fyYear);\n\nvar lastIso = FY.lastDay(FY.endOf(fyYear));\n\nvar fyText = FY.label(fyYear) + ': ' + FY.dayLabel(startIso) + ' \u2013 ' + FY.dayLabel(lastIso);\n\n\n\n\/\/ ---------------------------------------------------------------- render\n\nSR.render({\n\n  title: 'Issues ' + (byResolved ? 'resolved' : 'created') + ' per financial ' + (monthly ? 'month' : 'quarter'),\n\n  fyText: fyText,\n\n  scopeText: U.scopeLabel(scopeData, scopeJql),\n\n  startMonthName: MONTHS_LONG[startMonth - 1]\n\n}, function () {\n\n  var root = document.getElementById('fyr');\n\n  if (!root) return;\n\n  var css = getComputedStyle(root);\n\n  var cv = function (name, fb) { var v = css.getPropertyValue(name).trim(); return v || fb; };\n\n  var num = function (n) { return Number(n).toLocaleString('en-AU'); };\n\n  var pct = function (c, p) { var v = Math.round((c - p) \/ p * 100); return (v &gt; 0 ? '+' + v : v &lt; 0 ? '\u2212' + (-v) : '0') + '%'; };\n\n  var link = function (n, jql, title) {\n\n    return '&lt;a href=\"' + U.esc(jiraLink(jql)) + '\" target=\"_blank\" rel=\"noopener\" title=\"' + U.esc(title) + '\"&gt;' + num(n) + '&lt;\/a&gt;';\n\n  };\n\n\n\n  \/\/ KPI tiles\n\n  var tiles = [];\n\n  tiles.push('&lt;div class=\"fyr-card fyr-main\"&gt;&lt;b&gt;' + num(curTotal) + '&lt;\/b&gt;&lt;span&gt;' + U.esc(FY.label(fyYear)) + (inProgress ? ' so far' : ' total') + '&lt;\/span&gt;&lt;\/div&gt;');\n\n  if (compareN) {\n\n    var cls = change == null ? '' : change &gt; 0 ? ' fyr-up' : change &lt; 0 ? ' fyr-down' : '';\n\n    var ch = change == null ? '\u2013' : (change &gt; 0 ? '\u25b2 +' + change : change &lt; 0 ? '\u25bc \u2212' + (-change) : '0') + '%';\n\n    tiles.push('&lt;div class=\"fyr-card' + cls + '\"&gt;&lt;b&gt;' + ch + '&lt;\/b&gt;&lt;span&gt;vs ' + U.esc(FY.label(prevY)) + (inProgress ? ' at the same point (' + num(prevTotal) + ')' : ' (' + num(prevTotal) + ')') + '&lt;\/span&gt;&lt;\/div&gt;');\n\n  }\n\n  if (busiest &amp;&amp; cur[busiest.i] &gt; 0)\n\n    tiles.push('&lt;div class=\"fyr-card\"&gt;&lt;b&gt;' + U.esc(busiest.short) + '&lt;\/b&gt;&lt;span&gt;busiest ' + (monthly ? 'month' : 'quarter') + ' \u00b7 ' + U.esc(busiest.full) + ' \u00b7 ' + num(cur[busiest.i]) + '&lt;\/span&gt;&lt;\/div&gt;');\n\n  var avg = monthsElapsed ? curTotal \/ monthsElapsed : 0;\n\n  tiles.push('&lt;div class=\"fyr-card\"&gt;&lt;b&gt;' + (avg &amp;&amp; avg &lt; 10 ? avg.toFixed(1) : num(Math.round(avg))) + '&lt;\/b&gt;&lt;span&gt;per month on average' + (inProgress ? ' (' + monthsElapsed + ' months so far)' : '') + '&lt;\/span&gt;&lt;\/div&gt;');\n\n  root.querySelector('.fyr-cards').innerHTML = tiles.join('');\n\n\n\n  \/\/ Chart\n\n  var palette = ['#0C66E4', '#1F845A', '#E56910', '#8F7EE7', '#2898BD', '#CA3521', '#B38600', '#AE4787', '#8590A2'];\n\n  var fyColors = { 0: cv('--fyr-bar-cur', '#0C66E4'), 1: cv('--fyr-bar-prev', '#85B8FF'), 2: cv('--fyr-bar-prev2', '#B3B9C4') };\n\n  var labels = buckets.map(function (b) { var l = b.short + (b.state === 'running' ? ' (so far)' : ''); return b.range ? [l, b.range] : l; });\n\n  var datasets;\n\n  if (split &amp;&amp; splitRows.length) {\n\n    datasets = splitRows.map(function (r, x) {\n\n      return { label: r.name, data: r.cells, backgroundColor: r.other ? '#8590A2' : palette[x % palette.length], stack: 'one', borderRadius: 2, maxBarThickness: 64 };\n\n    });\n\n  } else {\n\n    datasets = years.map(function (y) {\n\n      var back = fyYear - y;\n\n      return { label: FY.label(y), data: counts[y], backgroundColor: fyColors[back], borderRadius: 3, maxBarThickness: 56 };\n\n    });\n\n  }\n\n  var Chart = SR.lib &amp;&amp; SR.lib.Chart;\n\n  var canvas = root.querySelector('canvas');\n\n  if (Chart &amp;&amp; canvas) {\n\n    var text = cv('--fyr-text-subtle', '#44546F'), grid = cv('--fyr-border', '#DCDFE4');\n\n    var stacked = !!split;\n\n    var tooltipTitle = function (items) { var b = buckets[items[0].dataIndex != null ? items[0].dataIndex : items[0].index]; return monthly ? b.full : b.short + ' \u00b7 ' + b.range; };\n\n    \/\/ Report Builder may bundle Chart.js 2 or a newer major version; their axis options differ.\n\n    var legacy = typeof Chart.register !== 'function';\n\n    var options = legacy ? {\n\n      responsive: true, maintainAspectRatio: false, animation: false,\n\n      legend: { position: 'top', align: 'end', labels: { fontColor: text, boxWidth: 12 } },\n\n      tooltips: { callbacks: { title: tooltipTitle } },\n\n      scales: {\n\n        xAxes: [{ stacked: stacked, ticks: { fontColor: text, fontSize: 12 }, gridLines: { display: false } }],\n\n        yAxes: [{ stacked: stacked, ticks: { beginAtZero: true, min: 0, precision: 0, fontColor: text }, gridLines: { color: grid, zeroLineColor: grid } }]\n\n      }\n\n    } : {\n\n      responsive: true, maintainAspectRatio: false, animation: false,\n\n      plugins: {\n\n        legend: { position: 'top', align: 'end', labels: { color: text, boxWidth: 12, boxHeight: 12 } },\n\n        tooltip: { callbacks: { title: tooltipTitle } }\n\n      },\n\n      scales: {\n\n        x: { stacked: stacked, ticks: { color: text, font: { size: 12 } }, grid: { display: false } },\n\n        y: { stacked: stacked, beginAtZero: true, min: 0, ticks: { color: text, precision: 0 }, grid: { color: grid } }\n\n      }\n\n    };\n\n    new Chart(canvas.getContext('2d'), { type: 'bar', data: { labels: labels, datasets: datasets }, options: options });\n\n  } else if (canvas) {\n\n    canvas.parentNode.innerHTML = '&lt;p class=\"fyr-note\"&gt;Chart library not available.&lt;\/p&gt;';\n\n  }\n\n  var splitNote = root.querySelector('.fyr-split-note');\n\n  if (split &amp;&amp; compareN) splitNote.textContent = 'Bars show ' + FY.label(fyYear) + ' split by ' + splitLabel + '. The table below compares the years.';\n\n  else splitNote.style.display = 'none';\n\n\n\n  \/\/ Period table: one row per quarter\/month, one column per financial year (+ change)\n\n  var h = ['&lt;table class=\"fyr-table\"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;' + (monthly ? 'Month' : 'Quarter') + '&lt;\/th&gt;'];\n\n  years.forEach(function (y, x) {\n\n    h.push('&lt;th class=\"fyr-num\"&gt;' + U.esc(FY.label(y)) + '&lt;\/th&gt;');\n\n    if (x &gt; 0) h.push('&lt;th class=\"fyr-num fyr-chg\"&gt;Change&lt;\/th&gt;');\n\n  });\n\n  h.push('&lt;\/tr&gt;&lt;\/thead&gt;&lt;tbody&gt;');\n\n  buckets.forEach(function (b) {\n\n    h.push('&lt;tr' + (b.state === 'future' ? ' class=\"fyr-future\"' : '') + '&gt;&lt;td&gt;&lt;b&gt;' + U.esc(b.short) + '&lt;\/b&gt; &lt;span class=\"fyr-muted\"&gt;' + U.esc(b.range) + (b.state === 'running' ? (b.range ? ' \u00b7 ' : '') + 'so far' : '') + '&lt;\/span&gt;&lt;\/td&gt;');\n\n    years.forEach(function (y, x) {\n\n      var r = bucketRange(y, b);\n\n      var isFuture = y === fyYear &amp;&amp; b.state === 'future';\n\n      h.push('&lt;td class=\"fyr-num\"&gt;' + (isFuture ? '&lt;span class=\"fyr-muted\"&gt;\u2013&lt;\/span&gt;' : link(counts[y][b.i], rangeJql(r.from, r.to), FY.label(y) + ' ' + b.short + ': ' + FY.dayLabel(r.from) + ' \u2013 ' + FY.dayLabel(FY.lastDay(r.to)))) + '&lt;\/td&gt;');\n\n      if (x &gt; 0) {\n\n        var p = counts[years[x - 1]][b.i], c = counts[y][b.i];\n\n        var txt = isFuture || !p || (y === fyYear &amp;&amp; b.state === 'running') ? '' : pct(c, p);\n\n        var cl = !txt ? '' : c &gt; p ? ' fyr-up' : c &lt; p ? ' fyr-down' : '';\n\n        h.push('&lt;td class=\"fyr-num fyr-chg' + cl + '\"&gt;' + txt + '&lt;\/td&gt;');\n\n      }\n\n    });\n\n    h.push('&lt;\/tr&gt;');\n\n  });\n\n  h.push('&lt;\/tbody&gt;&lt;tfoot&gt;&lt;tr&gt;&lt;td&gt;Total&lt;\/td&gt;');\n\n  years.forEach(function (y, x) {\n\n    h.push('&lt;td class=\"fyr-num\"&gt;' + link(totals[y], rangeJql(FY.startOf(y), FY.endOf(y)), FY.label(y)) + '&lt;\/td&gt;');\n\n    if (x &gt; 0) {\n\n      var p = totals[years[x - 1]], c = totals[y];\n\n      var txt = !p || (y === fyYear &amp;&amp; inProgress) ? '' : pct(c, p);\n\n      h.push('&lt;td class=\"fyr-num fyr-chg\"&gt;' + txt + '&lt;\/td&gt;');\n\n    }\n\n  });\n\n  h.push('&lt;\/tr&gt;&lt;\/tfoot&gt;&lt;\/table&gt;');\n\n  root.querySelector('.fyr-period').innerHTML = h.join('');\n\n\n\n  \/\/ Split table for the selected year\n\n  var sp = root.querySelector('.fyr-split');\n\n  if (split &amp;&amp; splitRows.length) {\n\n    var t = ['&lt;h3&gt;' + U.esc(FY.label(fyYear)) + ' by ' + U.esc(splitLabel) + '&lt;\/h3&gt;&lt;div class=\"fyr-scroll\"&gt;&lt;table class=\"fyr-table\"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;\/th&gt;'];\n\n    buckets.forEach(function (b) { t.push('&lt;th class=\"fyr-num\"&gt;' + U.esc(b.short) + (b.range ? '&lt;br&gt;&lt;span class=\"fyr-muted\"&gt;' + U.esc(b.range) + '&lt;\/span&gt;' : '') + '&lt;\/th&gt;'); });\n\n    t.push('&lt;th class=\"fyr-num\"&gt;Total&lt;\/th&gt;&lt;\/tr&gt;&lt;\/thead&gt;&lt;tbody&gt;');\n\n    splitRows.forEach(function (r, x) {\n\n      t.push('&lt;tr&gt;&lt;td&gt;&lt;i class=\"fyr-dot\" style=\"background:' + (r.other ? '#8590A2' : palette[x % palette.length]) + '\"&gt;&lt;\/i&gt;' + U.esc(r.name) + '&lt;\/td&gt;');\n\n      r.cells.forEach(function (n, bi) {\n\n        var b = buckets[bi], rg = bucketRange(fyYear, b);\n\n        var cellJql = r.jql ? rangeJql(rg.from, rg.to) + ' AND ' + r.jql : null;\n\n        t.push('&lt;td class=\"fyr-num\"&gt;' + (b.state === 'future' ? '&lt;span class=\"fyr-muted\"&gt;\u2013&lt;\/span&gt;' : !n ? '&lt;span class=\"fyr-muted\"&gt;0&lt;\/span&gt;' : cellJql ? link(n, cellJql, r.name + ', ' + b.short) : num(n)) + '&lt;\/td&gt;');\n\n      });\n\n      t.push('&lt;td class=\"fyr-num\"&gt;&lt;b&gt;' + (r.jql ? link(r.total, rangeJql(FY.startOf(fyYear), FY.endOf(fyYear)) + ' AND ' + r.jql, r.name) : num(r.total)) + '&lt;\/b&gt;&lt;\/td&gt;&lt;\/tr&gt;');\n\n    });\n\n    t.push('&lt;\/tbody&gt;&lt;\/table&gt;&lt;\/div&gt;');\n\n    sp.innerHTML = t.join('');\n\n  } else sp.style.display = 'none';\n\n\n\n  var notes = [];\n\n  notes.push('Financial year starts on 1 ' + MONTHS_LONG[startMonth - 1] + '. Issues are counted by their ' + (byResolved ? 'resolved' : 'created') + ' date. Click any number to open those issues in Jira.');\n\n  if (inProgress &amp;&amp; compareN) notes.push('Because ' + FY.label(fyYear) + ' is still running, the change is measured against ' + FY.label(prevY) + ' up to the same day (' + FY.dayLabel(shiftIso(todayIso, 1)) + ').');\n\n  if (byResolved) notes.push('Unresolved issues have no resolved date and are not counted.');\n\n  if (skipped) notes.push(num(skipped) + ' issue(s) without a ' + (byResolved ? 'resolved' : 'created') + ' date were skipped.');\n\n  root.querySelector('.fyr-note').innerHTML = notes.map(U.esc).join(' ');\n\n});\n\n<\/code><\/pre>\n<p>[\/vc_column_text][vc_column_text css=&#8221;&#8221;]<\/p>\n<h3>Template (<code>code\/template.html<\/code>)<\/h3>\n<p>[\/vc_column_text][vc_column_text css=&#8221;&#8221;]<\/p>\n<pre><code>&lt;style&gt;\n\n#fyr { --fyr-text: var(--ds-text, #172B4D); --fyr-text-subtle: var(--ds-text-subtle, #44546F); --fyr-subtlest: var(--ds-text-subtlest, #626F86);\n\n       --fyr-raised: var(--ds-surface-raised, #FFFFFF); --fyr-sunken: var(--ds-surface-sunken, #F7F8F9);\n\n       --fyr-border: var(--ds-border, #DCDFE4); --fyr-link: var(--ds-link, #0C66E4);\n\n       --fyr-shadow: var(--ds-shadow-raised, 0 1px 1px #091E4240, 0 0 1px #091E424F);\n\n       --fyr-up: var(--ds-text, #172B4D); --fyr-down: var(--ds-text, #172B4D);\n\n       --fyr-bar-cur: var(--ds-background-brand-bold, #0C66E4); --fyr-bar-prev: #85B8FF; --fyr-bar-prev2: #B3B9C4;\n\n       font: 14px\/1.45 -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif; color: var(--fyr-text); }\n\n#fyr * { box-sizing: border-box; }\n\n#fyr table, #fyr button { font: inherit; color: inherit; }\n\n#fyr a { color: var(--fyr-link); text-decoration: none; }\n\n#fyr a:hover { text-decoration: underline; }\n\n#fyr h2 { font-size: 20px; font-weight: 653; margin: 0 0 4px; letter-spacing: -0.01em; }\n\n#fyr h3 { font-size: 16px; font-weight: 653; margin: 24px 0 8px; }\n\n#fyr .fyr-sub { color: var(--fyr-subtlest); margin: 0; }\n\n#fyr .fyr-fy { display: inline-block; margin: 8px 0 16px; padding: 4px 10px; border-radius: 999px; background: var(--ds-background-information, #E9F2FF);\n\n               color: var(--ds-text-information, #0055CC); font-size: 12px; font-weight: 600; }\n\n#fyr .fyr-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: 12px; margin: 0 0 20px; }\n\n#fyr .fyr-card { background: var(--fyr-raised); box-shadow: var(--fyr-shadow); border-radius: 8px; padding: 14px 16px; }\n\n#fyr .fyr-card b { display: block; font-size: 26px; line-height: 1.15; font-weight: 653; font-variant-numeric: tabular-nums; }\n\n#fyr .fyr-card span { color: var(--fyr-subtlest); font-size: 12px; }\n\n#fyr .fyr-card.fyr-main b { color: var(--fyr-link); }\n\n#fyr .fyr-card.fyr-up b, #fyr td.fyr-up { color: var(--fyr-up); }\n\n#fyr .fyr-card.fyr-down b, #fyr td.fyr-down { color: var(--fyr-down); }\n\n#fyr .fyr-chart { position: relative; height: 340px; background: var(--fyr-raised); box-shadow: var(--fyr-shadow); border-radius: 8px; padding: 12px 16px 8px; }\n\n#fyr .fyr-split-note { color: var(--fyr-subtlest); font-size: 12px; margin: 6px 0 0; }\n\n#fyr .fyr-scroll { overflow-x: auto; }\n\n#fyr .fyr-table { width: 100%; border-collapse: collapse; margin-top: 20px; font-variant-numeric: tabular-nums; }\n\n#fyr .fyr-split .fyr-table { margin-top: 0; }\n\n#fyr .fyr-table th { text-align: left; font-size: 12px; font-weight: 600; color: var(--fyr-subtlest); padding: 6px 10px; border-bottom: 2px solid var(--fyr-border); white-space: nowrap; }\n\n#fyr .fyr-table td { padding: 7px 10px; border-bottom: 1px solid var(--fyr-border); white-space: nowrap; }\n\n#fyr .fyr-table tfoot td { font-weight: 653; border-bottom: 0; border-top: 2px solid var(--fyr-border); }\n\n#fyr .fyr-num { text-align: right; }\n\n#fyr .fyr-chg { color: var(--fyr-subtlest); font-size: 12px; width: 70px; }\n\n#fyr .fyr-muted { color: var(--fyr-subtlest); font-weight: 400; }\n\n#fyr tr.fyr-future td { opacity: .55; }\n\n#fyr .fyr-dot { display: inline-block; width: 10px; height: 10px; border-radius: 2px; margin-right: 8px; vertical-align: -1px; }\n\n#fyr .fyr-note { color: var(--fyr-subtlest); font-size: 12px; margin: 16px 0 0; max-width: 820px; }\n\n&lt;\/style&gt;\n\n&lt;div id=\"fyr\"&gt;\n\n  &lt;h2&gt;{{title}}&lt;\/h2&gt;\n\n  &lt;p class=\"fyr-sub\"&gt;{{scopeText}}&lt;\/p&gt;\n\n  &lt;span class=\"fyr-fy\"&gt;{{fyText}}&lt;\/span&gt;\n\n  &lt;div class=\"fyr-cards\"&gt;&lt;\/div&gt;\n\n  &lt;div class=\"fyr-chart\"&gt;&lt;canvas&gt;&lt;\/canvas&gt;&lt;\/div&gt;\n\n  &lt;p class=\"fyr-split-note\"&gt;&lt;\/p&gt;\n\n  &lt;div class=\"fyr-period\"&gt;&lt;\/div&gt;\n\n  &lt;div class=\"fyr-split\"&gt;&lt;\/div&gt;\n\n  &lt;p class=\"fyr-note\"&gt;&lt;\/p&gt;\n\n&lt;\/div&gt;\n\n<\/code><\/pre>\n<p>[\/vc_column_text][vc_column_text css=&#8221;&#8221;]<\/p>\n<h2>Try it<\/h2>\n<ul>\n<li>New to Report Builder? <a href=\"https:\/\/marketplace.atlassian.com\/apps\/1216997\/report-builder-custom-charts-dashboards-for-jira\">Get it on the Atlassian Marketplace<\/a>.<\/li>\n<li>Read how to <a href=\"https:\/\/actonic.atlassian.net\/wiki\/spaces\/ARB\/pages\/9072082946\">build reports with the Report Builder assistant in Rovo<\/a> or <a href=\"https:\/\/actonic.atlassian.net\/wiki\/spaces\/ARB\/pages\/9072836611\">from your own AI client via MCP<\/a>.<\/li>\n<li>Need a different financial report? <a href=\"https:\/\/actonic.atlassian.net\/servicedesk\/customer\/portal\/8\/create\/119\">Request a custom report<\/a>; it&#8217;s free for Report Builder customers.<\/li>\n<\/ul>\n<p>[\/vc_column_text][\/vc_column][\/vc_row]<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Jira dashboards only know calendar quarters. Count tickets per quarter of the Australian (or any) financial year with a free Report Builder report and code.<\/p>\n","protected":false},"author":33,"featured_media":14884,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_yoast_wpseo_is_cornerstone":"","_yoast_wpseo_meta-robots-noindex":"","_yoast_wpseo_meta-robots-nofollow":"","_yoast_wpseo_meta-robots-adv":"","_yoast_wpseo_bctitle":"","_yoast_wpseo_canonical":"","_yoast_wpseo_opengraph-title":"","_yoast_wpseo_opengraph-description":"","_yoast_wpseo_opengraph-image":"","_yoast_wpseo_opengraph-image-id":0,"_yoast_wpseo_twitter-title":"","_yoast_wpseo_twitter-description":"","_yoast_wpseo_twitter-image":"","_yoast_wpseo_twitter-image-id":0,"_yoast_wpseo_schema_page_type":"","_yoast_wpseo_schema_article_type":"","footnotes":"","_yoast_wpseo_keywordsynonyms":"[\"australian financial year jira, jira fiscal quarter, jira fiscal year dashboard, jira custom quarters, jira quarterly report july to june\",\"\",\"\",\"\",\"\"]","_yoast_wpseo_focuskeywords":"","_yoast_wpseo_estimated-reading-time-minutes":"","_yoast_wpseo_primary_category":null},"categories":[242],"tags":[342,280,324,291],"class_list":["post-14896","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-articles-atlassian-best-practises","tag-atlassian-best-practises","tag-jira-en","tag-jira-reporting-en","tag-report-builder-en"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.9 (Yoast SEO v28.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Jira Financial Year Report: Quarters from 1 July \u2013 Report Builder<\/title>\n<meta name=\"description\" content=\"Jira dashboards only know calendar quarters. Count tickets per quarter of the Australian (or any) financial year with a free Report Builder report and code.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/actonic.de\/en\/jira-financial-year-report\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Australian financial year in Jira: tickets per quarter from 1 July to 30 June\" \/>\n<meta property=\"og:description\" content=\"Jira dashboards only know calendar quarters. Count tickets per quarter of the Australian (or any) financial year with a free Report Builder report and code.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/actonic.de\/en\/jira-financial-year-report\/\" \/>\n<meta property=\"og:site_name\" content=\"Actonic \u2013 Unfolding your potential\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-13T11:24:35+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-13T11:36:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/actonic.de\/wp-content\/uploads\/2026\/10\/00-featured-jira-financial-year-report.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"640\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Rustem Shiriiazdanov\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Rustem Shiriiazdanov\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"28 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/jira-financial-year-report\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/jira-financial-year-report\\\/\"},\"author\":{\"name\":\"Rustem Shiriiazdanov\",\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/#\\\/schema\\\/person\\\/daec1531f9f8c9783921cb7b4feff5e7\"},\"headline\":\"Australian financial year in Jira: tickets per quarter from 1 July to 30 June\",\"datePublished\":\"2026-10-13T11:24:35+00:00\",\"dateModified\":\"2026-10-13T11:36:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/jira-financial-year-report\\\/\"},\"wordCount\":1333,\"publisher\":{\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/jira-financial-year-report\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/actonic.de\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/00-featured-jira-financial-year-report.jpg\",\"keywords\":[\"Atlassian Best Practices\",\"Jira\",\"Jira reporting\",\"Report Builder\"],\"articleSection\":[\"Atlassian Best Practises\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/jira-financial-year-report\\\/\",\"url\":\"https:\\\/\\\/actonic.de\\\/en\\\/jira-financial-year-report\\\/\",\"name\":\"Jira Financial Year Report: Quarters from 1 July \u2013 Report Builder\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/jira-financial-year-report\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/jira-financial-year-report\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/actonic.de\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/00-featured-jira-financial-year-report.jpg\",\"datePublished\":\"2026-10-13T11:24:35+00:00\",\"dateModified\":\"2026-10-13T11:36:23+00:00\",\"description\":\"Jira dashboards only know calendar quarters. Count tickets per quarter of the Australian (or any) financial year with a free Report Builder report and code.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/jira-financial-year-report\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/actonic.de\\\/en\\\/jira-financial-year-report\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/jira-financial-year-report\\\/#primaryimage\",\"url\":\"https:\\\/\\\/actonic.de\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/00-featured-jira-financial-year-report.jpg\",\"contentUrl\":\"https:\\\/\\\/actonic.de\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/00-featured-jira-financial-year-report.jpg\",\"width\":1200,\"height\":640,\"caption\":\"Report Builder report in Jira with tickets per quarter of the Australian financial year\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/jira-financial-year-report\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/actonic.de\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Australian financial year in Jira: tickets per quarter from 1 July to 30 June\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/actonic.de\\\/en\\\/\",\"name\":\"Actonic \u2013 Unfolding your potential\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/actonic.de\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/#organization\",\"name\":\"Actonic GmbH\",\"alternateName\":\"Actonic\",\"url\":\"https:\\\/\\\/actonic.de\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/actonic.de\\\/wp-content\\\/uploads\\\/2020\\\/03\\\/actonic_logo_compact_rgb_800px_for-profiles_round.jpg\",\"contentUrl\":\"https:\\\/\\\/actonic.de\\\/wp-content\\\/uploads\\\/2020\\\/03\\\/actonic_logo_compact_rgb_800px_for-profiles_round.jpg\",\"width\":800,\"height\":800,\"caption\":\"Actonic GmbH\"},\"image\":{\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/marketplace.atlassian.com\\\/vendors\\\/1214306\\\/actonic-products-gmbh\",\"https:\\\/\\\/trust.actonic.de\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/actonic.de\\\/en\\\/#\\\/schema\\\/person\\\/daec1531f9f8c9783921cb7b4feff5e7\",\"name\":\"Rustem Shiriiazdanov\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/29c0c269fe1dd9f12ceb4fba71e920c8b71d0f6e2ab048efb0b9468914cef19e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/29c0c269fe1dd9f12ceb4fba71e920c8b71d0f6e2ab048efb0b9468914cef19e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/29c0c269fe1dd9f12ceb4fba71e920c8b71d0f6e2ab048efb0b9468914cef19e?s=96&d=mm&r=g\",\"caption\":\"Rustem Shiriiazdanov\"},\"url\":\"https:\\\/\\\/actonic.de\\\/en\\\/author\\\/rustem-shiriiazdanov\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Jira Financial Year Report: Quarters from 1 July \u2013 Report Builder","description":"Jira dashboards only know calendar quarters. Count tickets per quarter of the Australian (or any) financial year with a free Report Builder report and code.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/actonic.de\/en\/jira-financial-year-report\/","og_locale":"en_US","og_type":"article","og_title":"Australian financial year in Jira: tickets per quarter from 1 July to 30 June","og_description":"Jira dashboards only know calendar quarters. Count tickets per quarter of the Australian (or any) financial year with a free Report Builder report and code.","og_url":"https:\/\/actonic.de\/en\/jira-financial-year-report\/","og_site_name":"Actonic \u2013 Unfolding your potential","article_published_time":"2026-10-13T11:24:35+00:00","article_modified_time":"2026-10-13T11:36:23+00:00","og_image":[{"width":1200,"height":640,"url":"https:\/\/actonic.de\/wp-content\/uploads\/2026\/10\/00-featured-jira-financial-year-report.jpg","type":"image\/jpeg"}],"author":"Rustem Shiriiazdanov","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Rustem Shiriiazdanov","Est. reading time":"28 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/actonic.de\/en\/jira-financial-year-report\/#article","isPartOf":{"@id":"https:\/\/actonic.de\/en\/jira-financial-year-report\/"},"author":{"name":"Rustem Shiriiazdanov","@id":"https:\/\/actonic.de\/en\/#\/schema\/person\/daec1531f9f8c9783921cb7b4feff5e7"},"headline":"Australian financial year in Jira: tickets per quarter from 1 July to 30 June","datePublished":"2026-10-13T11:24:35+00:00","dateModified":"2026-10-13T11:36:23+00:00","mainEntityOfPage":{"@id":"https:\/\/actonic.de\/en\/jira-financial-year-report\/"},"wordCount":1333,"publisher":{"@id":"https:\/\/actonic.de\/en\/#organization"},"image":{"@id":"https:\/\/actonic.de\/en\/jira-financial-year-report\/#primaryimage"},"thumbnailUrl":"https:\/\/actonic.de\/wp-content\/uploads\/2026\/10\/00-featured-jira-financial-year-report.jpg","keywords":["Atlassian Best Practices","Jira","Jira reporting","Report Builder"],"articleSection":["Atlassian Best Practises"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/actonic.de\/en\/jira-financial-year-report\/","url":"https:\/\/actonic.de\/en\/jira-financial-year-report\/","name":"Jira Financial Year Report: Quarters from 1 July \u2013 Report Builder","isPartOf":{"@id":"https:\/\/actonic.de\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/actonic.de\/en\/jira-financial-year-report\/#primaryimage"},"image":{"@id":"https:\/\/actonic.de\/en\/jira-financial-year-report\/#primaryimage"},"thumbnailUrl":"https:\/\/actonic.de\/wp-content\/uploads\/2026\/10\/00-featured-jira-financial-year-report.jpg","datePublished":"2026-10-13T11:24:35+00:00","dateModified":"2026-10-13T11:36:23+00:00","description":"Jira dashboards only know calendar quarters. Count tickets per quarter of the Australian (or any) financial year with a free Report Builder report and code.","breadcrumb":{"@id":"https:\/\/actonic.de\/en\/jira-financial-year-report\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/actonic.de\/en\/jira-financial-year-report\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/actonic.de\/en\/jira-financial-year-report\/#primaryimage","url":"https:\/\/actonic.de\/wp-content\/uploads\/2026\/10\/00-featured-jira-financial-year-report.jpg","contentUrl":"https:\/\/actonic.de\/wp-content\/uploads\/2026\/10\/00-featured-jira-financial-year-report.jpg","width":1200,"height":640,"caption":"Report Builder report in Jira with tickets per quarter of the Australian financial year"},{"@type":"BreadcrumbList","@id":"https:\/\/actonic.de\/en\/jira-financial-year-report\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/actonic.de\/en\/"},{"@type":"ListItem","position":2,"name":"Australian financial year in Jira: tickets per quarter from 1 July to 30 June"}]},{"@type":"WebSite","@id":"https:\/\/actonic.de\/en\/#website","url":"https:\/\/actonic.de\/en\/","name":"Actonic \u2013 Unfolding your potential","description":"","publisher":{"@id":"https:\/\/actonic.de\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/actonic.de\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/actonic.de\/en\/#organization","name":"Actonic GmbH","alternateName":"Actonic","url":"https:\/\/actonic.de\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/actonic.de\/en\/#\/schema\/logo\/image\/","url":"https:\/\/actonic.de\/wp-content\/uploads\/2020\/03\/actonic_logo_compact_rgb_800px_for-profiles_round.jpg","contentUrl":"https:\/\/actonic.de\/wp-content\/uploads\/2020\/03\/actonic_logo_compact_rgb_800px_for-profiles_round.jpg","width":800,"height":800,"caption":"Actonic GmbH"},"image":{"@id":"https:\/\/actonic.de\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/marketplace.atlassian.com\/vendors\/1214306\/actonic-products-gmbh","https:\/\/trust.actonic.de\/"]},{"@type":"Person","@id":"https:\/\/actonic.de\/en\/#\/schema\/person\/daec1531f9f8c9783921cb7b4feff5e7","name":"Rustem Shiriiazdanov","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/29c0c269fe1dd9f12ceb4fba71e920c8b71d0f6e2ab048efb0b9468914cef19e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/29c0c269fe1dd9f12ceb4fba71e920c8b71d0f6e2ab048efb0b9468914cef19e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/29c0c269fe1dd9f12ceb4fba71e920c8b71d0f6e2ab048efb0b9468914cef19e?s=96&d=mm&r=g","caption":"Rustem Shiriiazdanov"},"url":"https:\/\/actonic.de\/en\/author\/rustem-shiriiazdanov\/"}]}},"jetpack_featured_media_url":"https:\/\/actonic.de\/wp-content\/uploads\/2026\/10\/00-featured-jira-financial-year-report.jpg","_links":{"self":[{"href":"https:\/\/actonic.de\/en\/wp-json\/wp\/v2\/posts\/14896","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/actonic.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/actonic.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/actonic.de\/en\/wp-json\/wp\/v2\/users\/33"}],"replies":[{"embeddable":true,"href":"https:\/\/actonic.de\/en\/wp-json\/wp\/v2\/comments?post=14896"}],"version-history":[{"count":3,"href":"https:\/\/actonic.de\/en\/wp-json\/wp\/v2\/posts\/14896\/revisions"}],"predecessor-version":[{"id":14902,"href":"https:\/\/actonic.de\/en\/wp-json\/wp\/v2\/posts\/14896\/revisions\/14902"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/actonic.de\/en\/wp-json\/wp\/v2\/media\/14884"}],"wp:attachment":[{"href":"https:\/\/actonic.de\/en\/wp-json\/wp\/v2\/media?parent=14896"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/actonic.de\/en\/wp-json\/wp\/v2\/categories?post=14896"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/actonic.de\/en\/wp-json\/wp\/v2\/tags?post=14896"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}