BACK TO DEISER.COM

EN | ES

Menu

EN | ES

¿Cómo administramos nuestro servicio especializado por horas en DEISER?

Leo Díaz
06-abr-2016 13:19:00

La gestión de los servicios especializados en Atlassian que ofrecemos en DEISER en paquetes de horas, puede abrumadora si no se gestiona con las herramientas adecuadas, en nuestro caso, utilizamos Jira con las apps Profields y Scriptrunner, de esta forma podremos sacarle el máximo provecho a la herramienta y por defecto al valor que entregadamos con nuestro servicio. Lee esta publicación para que te enteres cómo lo hacemos.

Desde Jira, una herramienta de seguimiento de proyectos, con la ayuda de Profields, una app de gestión de proyectos para Jira, podemos almacenar y administrar toda la información referente cualquier proyecto.

En nuestro caso, a este servicio por horas, lo llamamos "las bolsas de horas" que no es más que el total de horas contratadas por nuestros clientes, productos soportados en este servicio, comentarios de facturación, usuarios implicados por parte del cliente, fecha de finalización de la bolsa, etc., una importante capacidad de gestión prácticamente personalizada.

En esta publicación de blog, contaremos cómo logramos automatizar el control de las peticiones que han entrado en bolsas que no tienen horas o que bien se han caducado, y la evolución que ha llegado gracias a nuevas incorporaciones en el equipo y el proceso constante de transformación empresarial que llevamos a cabo en DEISER.

Conoce más sobre los servicios especializados y certificados por Atlassian que  ofrecemos en DEISER>

Antes de empezar

Para identificar las peticiones en bolsas caducadas o sin horas además de Profields y el propio Jira necesitamos hacer uso de Script Runner, actualmente las versiones que nosotros tenemos instaladas son las siguientes:

  • Jira v7.0.9
  • Profields v4.4.0
  • Script Runner v4.2.0.5

La configuración

Hasta ahora el control que hacíamos era muy manual con los campos y un gadget de Profields, los campos principales son:

  • Support Pack Size: Aquí guardamos el total de horas contratadas.
  • Support Pack Expiration Date: Aquí guardamos la fecha en la que finaliza el soporte.
En los campos de projecto podemos configurar la duración y tamaño del proyecto

 

Para el control de las horas restantes, disponemos de un dashboard donde se puede ver el cálculo automático de los días restantes mediante un gadget de Profields:

Listado de proyectos por horas en los servicios que ofrecemos en DEISER

 

Para el control de la expiración disponíamos de un campo de Profields de tipo Script en el que se podía ver en cada proyectos si está expirado o no:

Vista de expiración en proyectos

Para agilizar la gestión y que fuera mucho más fácil hemos creado un custom field de tipo Script llamado Support Pack Info.

Jira projects Support Pack Info

En la configuración de Script Runner el campo tiene el siguiente script:

import com.atlassian.jira.bc.issue.worklog.TimeTrackingConfiguration 
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.project.Project
import com.atlassian.jira.util.JiraDurationUtils
import com.deiser.jira.profields.api.field.DatetimeField
import com.deiser.jira.profields.api.field.FieldService
import com.deiser.jira.profields.api.field.OriginalEstimateField
import com.onresolve.scriptrunner.runner.customisers.PluginModule
import com.onresolve.scriptrunner.runner.customisers.WithPlugin
import java.text.SimpleDateFormat

@WithPlugin("com.deiser.jira.profields")
@PluginModule
FieldService fieldService

def SUPPORT_PACK_EXPIRATION_DATE_ID = 10
def SUPPORT_PACK_SIZE_ID = 1

Calendar getCalendarWithoutTime(Date date) {
Calendar calendar = new GregorianCalendar()
calendar.setTime(date)
calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), 0, 0, 0)
calendar.set(Calendar.MILLISECOND, 0)
return calendar;
}

String isExpired(Date expirationDate) {
if (expirationDate == null) {
return false
}
def expiration = getCalendarWithoutTime(expirationDate)
def actual = getCalendarWithoutTime(new Date())
if (actual.compareTo(expiration) > 0) {
def simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy")
return String.format('''
<p>Expired.</p>
<blockquote>Expiration date: %s</blockquote>
'''
, simpleDateFormat.format(expirationDate))
}
return null
}

String hasRemaining(Project project, Long total) {
def issueManager = ComponentAccessor.issueManager
def timeTrackingConfiguration = ComponentAccessor.getOSGiComponentInstanceOfType(TimeTrackingConfiguration.class)
def jiraAuthenticationContext = ComponentAccessor.jiraAuthenticationContext
def prettyDurationFormatter = new JiraDurationUtils.PrettyDurationFormatter(
timeTrackingConfiguration.hoursPerDay,
timeTrackingConfiguration.daysPerWeek,
jiraAuthenticationContext.i18nHelper)
Long timeSpent = (Long)issueManager.getIssueIdsForProject(project.id).sum { issueManager.getIssueObject((Long)it).timeSpent ?: 0L }
total = total ? (Long)(total / 1000L) : 0L
timeSpent = timeSpent ?: 0L
if (total <= timeSpent) {
return String.format('''
<p>No available hours</p>
<blockquote>
Total hours: %s</br>
Time spent: %s
</blockquote>
'''
, prettyDurationFormatter.format(total, jiraAuthenticationContext.locale)
, prettyDurationFormatter.format(timeSpent, jiraAuthenticationContext.locale))
}
return null
}

try{
Issue currentIssue = issue

def supportPackExpirationDateField = (DatetimeField) fieldService.get(SUPPORT_PACK_EXPIRATION_DATE_ID)
def supportPackSizeField = (OriginalEstimateField) fieldService.get(SUPPORT_PACK_SIZE_ID)
def supportPackExpirationDate = supportPackExpirationDateField.getValueInProject(currentIssue.projectObject)
def supportPackSize = supportPackSizeField.getValueInProject(currentIssue.projectObject)

def expired = isExpired(supportPackExpirationDate)
def hasHours = hasRemaining(currentIssue.projectObject, supportPackSize)
def message = '''
<div class="aui-message aui-message-warning">
<p class="title"><strong>%s!</strong></p>
%s
</div>
'''

if (expired && !hasHours) {
return String.format(message, "Warning!", expired)
} else if (!expired && hasHours) {
return String.format(message, "Warning!", hasHours)
} else if (expired && hasHours) {
return String.format(message, "Warning!", expired + hasHours)
} else {
return null
}
} catch(def e){
log.error("Error while calculating support pack info: " + e.getClass().getName())
}

Las variables SUPPORT_PACK_EXPIRATION_DATE_ID y SUPPORT_PACK_SIZE_ID tienen el ID de los campos de control.

Para extraer los IDs de los campos de Profields al igual que con JIRA verificar la URL en la edición del campo

URL de Profields para la gestión de proyectos en Jira


¿Y qué es lo que hemos ganado?

Pues aquí está el quid de la cuestión, con esta nueva configuración cada vez que un cliente nos hace una petición en una bolsa de horas si bien está caducada o no tiene horas el sistema automáticamente nos devolverá un mensaje:

1. En caso de que esté caducada:

¿Cómo hacer con un proyecto de servicio caducado?
 

2. En caso de que no queden horas:

Proyecto de servicio en Jira que no tiene horas disponibles

Con esto evitamos tener que monitorizar manualmente las bolsas, saber si ha caducado o si no le quedan horas está al alcance no sólo del equipo si no también del cliente!

Éste es sólo un ejemplo de cómo Jira nos hace más fácil nuestro día a día. Si en tu caso tienes claro todo que te gustaría hacer con tu instancia de Jira pero no tienes el tiempo suficiente para hacerlo por ti mismo, puedes contar con nosotros siempre que lo necesites, somos Atlassian Platinum Solution Partner Enterprise y podemos adaptar Jira o cualquier producto Atlassian a las necesidades específicas de tu empresa.

Reserva una reunión con nuestro equipo e infórmate.


¿Cómo gestionar proyectos en Jira?

En DEISER tenemos nuestra propia forma e gestionar proyectos, y en esta publicación te ofrecemos cinco consejos que debes tener en cuenta al momento de gestionar proyectos en Jira.

LEER ARTÍCULO

You May Also Like

These Stories on Jira Software

No Comments Yet

Let us know what you think

Subscribe by Email