This commit is contained in:
Andrey Cunha 2026-05-22 02:11:03 -03:00
parent 9ec8d6e70b
commit 328de3abd2
53 changed files with 28306 additions and 1062 deletions

10213
.vscode/.advpl/_binary_class.prw vendored Normal file

File diff suppressed because it is too large Load Diff

9808
.vscode/.advpl/_binary_functions.prw vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,8 @@
{
"permissions": {
"allow": [
"PowerShell(head -40)",
"Read(//c/Python/Fluig Ginseng/fluig/**)"
]
}
}

View File

@ -0,0 +1,14 @@
{
"permissions": {
"allow": [
"PowerShell(New-Item -ItemType Directory -Force \"c:\\\\Python\\\\Fluig Ginseng\\\\fluig\\\\Desligamento\\\\wcm\\\\widget\\\\wddesligamentoranking\\\\src\\\\main\\\\resources\")",
"PowerShell(New-Item -ItemType Directory -Force \"c:\\\\Python\\\\Fluig Ginseng\\\\fluig\\\\Desligamento\\\\wcm\\\\widget\\\\wddesligamentoranking\\\\src\\\\main\\\\webapp\\\\resources\\\\css\")",
"PowerShell(New-Item -ItemType Directory -Force \"c:\\\\Python\\\\Fluig Ginseng\\\\fluig\\\\Desligamento\\\\wcm\\\\widget\\\\wddesligamentoranking\\\\src\\\\main\\\\webapp\\\\resources\\\\js\")",
"PowerShell(\"OK\")",
"PowerShell(New-Item -ItemType Directory -Force \"c:\\\\Python\\\\Fluig Ginseng\\\\fluig\\\\Desligamento\\\\wcm\\\\widget\\\\wddesligamentokpis\\\\src\\\\main\\\\resources\")",
"PowerShell(New-Item -ItemType Directory -Force \"c:\\\\Python\\\\Fluig Ginseng\\\\fluig\\\\Desligamento\\\\wcm\\\\widget\\\\wddesligamentokpis\\\\src\\\\main\\\\webapp\\\\resources\\\\css\")",
"PowerShell(New-Item -ItemType Directory -Force \"c:\\\\Python\\\\Fluig Ginseng\\\\fluig\\\\Desligamento\\\\wcm\\\\widget\\\\wddesligamentokpis\\\\src\\\\main\\\\webapp\\\\resources\\\\js\")",
"Bash(Get-ChildItem -Path \"c:\\\\Python\\\\Fluig Ginseng\\\\fluig\\\\Desligamento\\\\\" -Recurse -File | Select-Object FullName | head -30)"
]
}
}

View File

@ -0,0 +1,13 @@
eclipse.preferences.version=1
encoding//wcm/widget/wddesligamento/src/main/resources/application.info=utf8
encoding//wcm/widget/wddesligamento/src/main/resources/edit.ftl=utf8
encoding//wcm/widget/wddesligamento/src/main/resources/view.ftl=utf8
encoding//wcm/widget/wddesligamento/src/main/resources/wddesligamento.properties=utf8
encoding//wcm/widget/wddesligamento/src/main/resources/wddesligamento_en_US.properties=utf8
encoding//wcm/widget/wddesligamento/src/main/resources/wddesligamento_es.properties=utf8
encoding//wcm/widget/wddesligamento/src/main/resources/wddesligamento_pt_BR.properties=utf8
encoding//wcm/widget/wddesligamento/src/main/webapp/WEB-INF/jboss-web.xml=utf8
encoding//wcm/widget/wddesligamento/src/main/webapp/WEB-INF/web.xml=utf8
encoding//wcm/widget/wddesligamento/src/main/webapp/resources/css/wddesligamento.css=utf8
encoding//wcm/widget/wddesligamento/src/main/webapp/resources/images/icon.png=utf8
encoding//wcm/widget/wddesligamento/src/main/webapp/resources/js/wddesligamento.js=utf8

18
Desligamento/.vscode/servers.json vendored Normal file
View File

@ -0,0 +1,18 @@
{
"version": "1.0.0",
"configurations": [
{
"id": "61t70sum327mpg6yr6z93yvtvrgjmw",
"name": "Ginseng Produção",
"host": "comerciode188006.fluig.cloudtotvs.com.br",
"ssl": true,
"port": 443,
"username": "andrey.cunha",
"password": "eyJpdiI6ImYyNDVmMTM5YTUwNTQxY2UzOTJjMWI1MGUwNTk2Mzk5Iiwic2FsdCI6IjQ0MjY1MDk1OTczYzA1YTM3ZTU1M2VkOTk0YzAzZDg4IiwidGV4dCI6ImJkMmE4YWIwMjFhODQ5NmZjMGQ3ODg0NzI3N2JlNmJmIn0=",
"userCode": "andrey.cunha",
"confirmExporting": false,
"hasBrowser": false,
"companyId": 1
}
]
}

View File

@ -14,23 +14,12 @@ function displayFields(form, customHTML) {
var fields = new Array("colleagueName", "mail");
var retorno = DatasetFactory.getDataset("colleague", fields, filter, null);
//requester
form.setValue("currentUserName", retorno.getValue(0, "colleagueName"));
form.setValue("currentUsermail", retorno.getValue(0, "mail"));
form.setValue("currentUserId", userId);
// Grava dados do solicitante apenas na abertura — preserva o valor nas etapas seguintes
if (activity == 0 || activity == 4) {
form.setValue("requesterName", retorno.getValue(0, "colleagueName"));
form.setValue("currentUsermail", retorno.getValue(0, "mail"));
form.setValue("currentUserId", userId);
} else {
form.setValue("currentUserName", retorno.getValue(0, "colleagueName"));
form.setValue("currentUsermail", retorno.getValue(0, "mail"));
form.setValue("currentUserId", userId);
}
//requester
if (activity == 5 || activity == 24) {
form.setValue("requesterName", retorno.getValue(0, "colleagueName"));
form.setValue("requesterMail", retorno.getValue(0, "mail"));
form.setValue("requesterId", userId);
} else {
form.setValue("requesterName", retorno.getValue(0, "colleagueName"));
form.setValue("requesterMail", retorno.getValue(0, "mail"));
form.setValue("requesterId", userId);

View File

@ -0,0 +1,19 @@
application.type=widget
application.code=wddesligamento
application.title=wddesligamento
application.description=wddesligamento
application.fluig.version=null
application.category=Desligamento
application.renderer=freemarker
developer.code=Andrey
developer.name=Andrey
developer.url=http://www.fluig.com
application.uiwidget=true
application.mobileapp=false
application.version=${build.version}-${build.revision}
view.file=view.ftl
edit.file=edit.ftl
locale.file.base.name=wddesligamento
application.resource.js.1=/resources/js/wddesligamento.js
application.resource.css.2=/resources/css/wddesligamento.css
hash=4a16315e9e66fa7d797b3f6b1fb365b69f9a4ce2

View File

@ -0,0 +1,4 @@
<div id="MyWidget_${instanceId}" class="super-widget wcm-widget-class fluig-style-guide" data-params="MyWidget.instance()">
</div>

View File

@ -0,0 +1,115 @@
<script src="/webdesk/vcXMLRPC.js"></script>
<div id="MyWidget_${instanceId}" class="super-widget wcm-widget-class fluig-style-guide wd-dashboard" data-params="MyWidget.instance({ instanceId: '${instanceId}' })">
<div class="wd-dashboard__shell">
<div class="wd-dashboard__header">
<div class="wd-dashboard__title-group">
<p class="wd-dashboard__eyebrow">Gestão do Desligamento</p>
<h2 class="wd-dashboard__title">Solicitações de Desligamento</h2>
</div>
<div class="wd-dashboard__actions">
<div class="wd-view-toggle" role="group" aria-label="Tipo de visualização">
<button type="button" class="wd-view-btn wd-view-btn--active" data-view="list" title="Lista">
<svg width="13" height="13" viewBox="0 0 13 13" fill="currentColor" aria-hidden="true"><rect y="0" width="13" height="2" rx="1"/><rect y="4" width="13" height="2" rx="1"/><rect y="8" width="13" height="2" rx="1"/><rect y="11" width="9" height="2" rx="1"/></svg>
Lista
</button>
<button type="button" class="wd-view-btn" data-view="kanban" title="Kanban">
<svg width="13" height="13" viewBox="0 0 13 13" fill="currentColor" aria-hidden="true"><rect x="0" y="0" width="3" height="13" rx="1"/><rect x="5" y="0" width="3" height="9" rx="1"/><rect x="10" y="0" width="3" height="11" rx="1"/></svg>
Kanban
</button>
</div>
<button type="button" class="btn btn-default wd-dashboard__button" data-refresh-dashboard>
<span class="fluigicon fluigicon-refresh icon-sm" aria-hidden="true"></span> Atualizar
</button>
</div>
</div>
<div class="wd-dashboard__metrics">
<div class="wd-metric" data-filter-status="all" title="Ver todos">
<div class="wd-metric__icon">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><rect x="4" y="2" width="12" height="16" rx="2"/><line x1="7" y1="7" x2="13" y2="7"/><line x1="7" y1="10" x2="13" y2="10"/><line x1="7" y1="13" x2="11" y2="13"/></svg>
</div>
<div class="wd-metric__body">
<span class="wd-metric__label">Total</span>
<strong class="wd-metric__value" data-metric-total>—</strong>
</div>
</div>
<div class="wd-metric wd-metric--progress" data-filter-status="progress" title="Filtrar: Em andamento">
<div class="wd-metric__icon">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><circle cx="10" cy="10" r="7"/><polyline points="10,6 10,10 13,12"/></svg>
</div>
<div class="wd-metric__body">
<span class="wd-metric__label">Em andamento</span>
<strong class="wd-metric__value" data-metric-progress>—</strong>
</div>
</div>
<div class="wd-metric wd-metric--attention" data-filter-status="attention" title="Filtrar: Atenção">
<div class="wd-metric__icon">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><path d="M10 3L2 17h16L10 3z"/><line x1="10" y1="9" x2="10" y2="13"/><circle cx="10" cy="15.5" r="0.6" fill="currentColor"/></svg>
</div>
<div class="wd-metric__body">
<span class="wd-metric__label">Atenção</span>
<strong class="wd-metric__value" data-metric-attention>—</strong>
</div>
</div>
<div class="wd-metric wd-metric--done" data-filter-status="done" title="Filtrar: Finalizadas">
<div class="wd-metric__icon">
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><circle cx="10" cy="10" r="7"/><polyline points="7,10 9,12 13,8"/></svg>
</div>
<div class="wd-metric__body">
<span class="wd-metric__label">Finalizadas</span>
<strong class="wd-metric__value" data-metric-done>—</strong>
</div>
</div>
</div>
<div class="wd-op-indicators" data-op-indicators style="display:none"></div>
<div class="wd-dashboard__filters">
<div class="wd-search">
<span class="fluigicon fluigicon-search icon-sm" aria-hidden="true"></span>
<input type="text" class="form-control" placeholder="Buscar por colaborador, gestor, nº da solicitação, etapa…" data-dashboard-search>
</div>
<select class="form-control wd-filter" data-dashboard-status>
<option value="all">Todos os status</option>
<option value="progress">Em andamento</option>
<option value="attention">Atenção</option>
<option value="done">Finalizadas</option>
<option value="canceled">Canceladas</option>
</select>
</div>
<div class="wd-dashboard__state wd-dashboard__state--loading" data-dashboard-loading>
<span class="wd-spinner" aria-hidden="true"></span>
Carregando solicitações…
</div>
<div class="wd-dashboard__state wd-dashboard__state--empty" data-dashboard-empty style="display:none">
Nenhuma solicitação encontrada para os filtros atuais.
</div>
<div class="wd-dashboard__state wd-dashboard__state--error" data-dashboard-error style="display:none"></div>
<div class="wd-dashboard__list" data-dashboard-list></div>
<div class="wd-pagination" data-dashboard-pagination></div>
<div class="wd-kanban" data-dashboard-kanban style="display:none"></div>
<div class="wd-pagination" data-dashboard-kanban-pagination style="display:none"></div>
</div>
</div>
<div id="WdDrawer_${instanceId}" class="wd-drawer" data-drawer>
<div class="wd-drawer__overlay" data-drawer-close></div>
<div class="wd-drawer__panel">
<div class="wd-drawer__header">
<div>
<span class="wd-drawer__num" data-drawer-num></span>
<h3 class="wd-drawer__name" data-drawer-name></h3>
<p class="wd-drawer__sub" data-drawer-role></p>
</div>
<button type="button" class="wd-drawer__close" data-drawer-close aria-label="Fechar painel">
<svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M4.293 4.293a1 1 0 011.414 0L8 6.586l2.293-2.293a1 1 0 111.414 1.414L9.414 8l2.293 2.293a1 1 0 01-1.414 1.414L8 9.414l-2.293 2.293a1 1 0 01-1.414-1.414L6.586 8 4.293 5.707a1 1 0 010-1.414z"/></svg>
</button>
</div>
<div class="wd-drawer__body" data-drawer-content></div>
</div>
</div>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
<context-root>/wddesligamento</context-root>
<disable-cross-context>false</disable-cross-context>
</jboss-web>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

@ -0,0 +1,17 @@
application.type=widget
application.code=wddesligamentokpis
application.title=wddesligamentokpis
application.description=wddesligamentokpis
application.fluig.version=null
application.category=Desligamento
application.renderer=freemarker
developer.code=Andrey
developer.name=Andrey
developer.url=http://www.fluig.com
application.uiwidget=true
application.mobileapp=false
application.version=${build.version}-${build.revision}
view.file=view.ftl
locale.file.base.name=wddesligamentokpis
application.resource.js.1=/resources/js/wddesligamentokpis.js
application.resource.css.2=/resources/css/wddesligamentokpis.css

View File

@ -0,0 +1,117 @@
<script src="/webdesk/vcXMLRPC.js"></script>
<div id="WdKpis_${instanceId}" class="super-widget wcm-widget-class fluig-style-guide wdk-widget" data-params="WdKpisWidget.instance({ instanceId: '${instanceId}' })">
<div class="wdk-shell">
<!-- Header -->
<div class="wdk-header">
<div>
<p class="wdk-eyebrow">Análise de Desligamentos</p>
<h2 class="wdk-title">KPIs por Tipo e Departamento</h2>
</div>
<div class="wdk-actions">
<div class="wdk-period-toggle" role="group">
<button type="button" class="wdk-period-btn wdk-period-btn--active" data-period="all">Todos</button>
<button type="button" class="wdk-period-btn" data-period="year">Este ano</button>
<button type="button" class="wdk-period-btn" data-period="month">Este mês</button>
</div>
<button type="button" class="btn btn-default wdk-refresh-btn" data-refresh>
<span class="fluigicon fluigicon-refresh icon-sm" aria-hidden="true"></span>
</button>
</div>
</div>
<!-- Summary KPIs -->
<div class="wdk-summary" data-summary>
<div class="wdk-summary__card">
<span class="wdk-summary__label">Total</span>
<strong class="wdk-summary__value" data-kpi-total>—</strong>
</div>
<div class="wdk-summary__card wdk-summary__card--blue">
<span class="wdk-summary__label">Exp. probatória</span>
<strong class="wdk-summary__value" data-kpi-tipo-experiencia>—</strong>
<span class="wdk-summary__pct" data-kpi-tipo-experiencia-pct></span>
</div>
<div class="wdk-summary__card wdk-summary__card--amber">
<span class="wdk-summary__label">Baixo desempenho</span>
<strong class="wdk-summary__value" data-kpi-tipo-desempenho>—</strong>
<span class="wdk-summary__pct" data-kpi-tipo-desempenho-pct></span>
</div>
<div class="wdk-summary__card wdk-summary__card--purple">
<span class="wdk-summary__label">Substituição</span>
<strong class="wdk-summary__value" data-kpi-tipo-substituicao>—</strong>
<span class="wdk-summary__pct" data-kpi-tipo-substituicao-pct></span>
</div>
<div class="wdk-summary__card wdk-summary__card--gray">
<span class="wdk-summary__label">Outros tipos</span>
<strong class="wdk-summary__value" data-kpi-tipo-outros>—</strong>
<span class="wdk-summary__pct" data-kpi-tipo-outros-pct></span>
</div>
</div>
<!-- States -->
<div class="wdk-state wdk-state--loading" data-loading>
<span class="wdk-spinner" aria-hidden="true"></span>
Carregando dados…
</div>
<div class="wdk-state wdk-state--empty" data-empty style="display:none">
Nenhum dado encontrado para o período selecionado.
</div>
<div class="wdk-state wdk-state--error" data-error style="display:none"></div>
<!-- Breakdowns -->
<div class="wdk-breakdowns" data-breakdowns style="display:none">
<div class="wdk-panel">
<div class="wdk-panel__header">
<span class="wdk-panel__title">Por Tipo de Desligamento</span>
<span class="wdk-panel__badge" data-tipo-total></span>
</div>
<div class="wdk-bars" data-tipo-bars></div>
</div>
<div class="wdk-panel">
<div class="wdk-panel__header">
<span class="wdk-panel__title">Por Departamento</span>
<span class="wdk-panel__badge" data-dept-total></span>
</div>
<div class="wdk-bars" data-dept-bars></div>
</div>
<div class="wdk-panel wdk-panel--full">
<div class="wdk-panel__header">
<span class="wdk-panel__title">Por Função do Colaborador</span>
<span class="wdk-panel__badge" data-cargo-total></span>
</div>
<div class="wdk-bars wdk-bars--grid" data-cargo-bars></div>
</div>
</div>
<!-- Drill-down panel -->
<div class="wdk-drilldown" data-drilldown style="display:none">
<div class="wdk-drilldown__header">
<button type="button" class="wdk-drilldown__back" data-drill-back>&#8592; Voltar</button>
<div class="wdk-drilldown__meta">
<span class="wdk-drilldown__title" data-drill-title></span>
<span class="wdk-panel__badge" data-drill-count></span>
</div>
</div>
<div class="wdk-drill-list" data-drill-list></div>
</div>
<!-- Detail card modal -->
<div class="wdk-detail-overlay" data-detail-modal style="display:none">
<div class="wdk-detail-card">
<div class="wdk-detail-card__header">
<strong data-detail-num></strong>
<button type="button" class="wdk-detail-card__close" data-detail-close>&#10005;</button>
</div>
<dl class="wdk-detail-dl">
<dt>Colaborador</dt> <dd data-detail-employee></dd>
<dt>Departamento</dt> <dd data-detail-dept></dd>
<dt>Tipo</dt> <dd data-detail-tipo></dd>
<dt>Abertura</dt> <dd data-detail-date></dd>
<dt>Gestor</dt> <dd data-detail-requester></dd>
</dl>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
<context-root>/wddesligamentokpis</context-root>
<disable-cross-context>false</disable-cross-context>
</jboss-web>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>

View File

@ -0,0 +1,494 @@
/* ================================================================
wddesligamentokpis.css KPIs por Tipo e Departamento
================================================================ */
.wdk-widget {
color: #0f172a;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
}
.wdk-widget * { box-sizing: border-box; }
.wdk-shell {
background: #f8fafc;
border: 1px solid #e2e8f0;
border-radius: 12px;
padding: 20px;
}
/* ── Header ───────────────────────────────────────────────────── */
.wdk-header {
align-items: center;
display: flex;
gap: 12px;
justify-content: space-between;
margin-bottom: 16px;
flex-wrap: wrap;
}
.wdk-eyebrow {
color: #64748b;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.06em;
margin: 0 0 2px;
text-transform: uppercase;
}
.wdk-title {
color: #0f172a;
font-size: 20px;
font-weight: 700;
line-height: 1.2;
margin: 0;
}
.wdk-actions {
align-items: center;
display: flex;
gap: 8px;
flex: 0 0 auto;
}
.wdk-refresh-btn {
align-items: center;
display: inline-flex;
padding: 6px 10px;
}
/* ── Period toggle ────────────────────────────────────────────── */
.wdk-period-toggle {
background: #e2e8f0;
border-radius: 8px;
display: inline-flex;
gap: 2px;
padding: 3px;
}
.wdk-period-btn {
background: transparent;
border: none;
border-radius: 6px;
color: #64748b;
cursor: pointer;
font-size: 12px;
font-weight: 600;
padding: 4px 10px;
transition: background 0.15s, color 0.15s;
}
.wdk-period-btn--active {
background: #ffffff;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
color: #1e40af;
}
/* ── Summary KPI cards ────────────────────────────────────────── */
.wdk-summary {
display: grid;
gap: 10px;
grid-template-columns: repeat(5, minmax(0, 1fr));
margin-bottom: 16px;
}
.wdk-summary__card {
background: #ffffff;
border: 1px solid #e2e8f0;
border-radius: 10px;
border-top: 3px solid #e2e8f0;
padding: 12px 14px;
transition: box-shadow 0.15s;
}
.wdk-summary__card--blue { border-top-color: #3b82f6; }
.wdk-summary__card--amber { border-top-color: #f59e0b; }
.wdk-summary__card--purple { border-top-color: #8b5cf6; }
.wdk-summary__card--gray { border-top-color: #94a3b8; }
.wdk-summary__label {
color: #64748b;
display: block;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.04em;
margin-bottom: 4px;
text-transform: uppercase;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.wdk-summary__value {
color: #0f172a;
display: block;
font-size: 32px;
font-weight: 800;
line-height: 1;
margin-bottom: 2px;
}
.wdk-summary__card--blue .wdk-summary__value { color: #2563eb; }
.wdk-summary__card--amber .wdk-summary__value { color: #d97706; }
.wdk-summary__card--purple .wdk-summary__value { color: #7c3aed; }
.wdk-summary__card--gray .wdk-summary__value { color: #64748b; }
.wdk-summary__pct {
color: #64748b;
display: block;
font-size: 12px;
font-weight: 600;
}
/* ── States ───────────────────────────────────────────────────── */
.wdk-state {
align-items: center;
background: #ffffff;
border: 1px solid #e2e8f0;
border-radius: 10px;
color: #64748b;
display: flex;
gap: 10px;
justify-content: center;
margin-bottom: 0;
padding: 28px;
}
.wdk-state--error {
background: #fff1f2;
border-color: #fecdd3;
color: #9f1239;
justify-content: flex-start;
}
@keyframes wdk-spin { to { transform: rotate(360deg); } }
.wdk-spinner {
animation: wdk-spin 0.75s linear infinite;
border: 2px solid #e2e8f0;
border-radius: 50%;
border-top-color: #2563eb;
display: inline-block;
flex: 0 0 auto;
height: 18px;
width: 18px;
}
/* ── Two-column breakdowns ────────────────────────────────────── */
.wdk-breakdowns {
display: grid;
gap: 12px;
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.wdk-panel {
background: #ffffff;
border: 1px solid #e2e8f0;
border-radius: 10px;
overflow: hidden;
}
/* cargo panel spans full width of the 2-column grid */
.wdk-panel--full {
grid-column: 1 / -1;
}
/* cargo bars in 2-column grid inside the panel */
.wdk-bars--grid {
column-count: 2;
column-gap: 0;
padding: 4px 0;
}
.wdk-bars--grid .wdk-bar-row {
break-inside: avoid;
}
.wdk-panel__header {
align-items: center;
border-bottom: 1px solid #f1f5f9;
display: flex;
gap: 8px;
justify-content: space-between;
padding: 12px 16px;
}
.wdk-panel__title {
color: #334155;
font-size: 13px;
font-weight: 700;
}
.wdk-panel__badge {
background: #f1f5f9;
border-radius: 999px;
color: #64748b;
font-size: 11px;
font-weight: 700;
padding: 2px 8px;
}
/* ── Bar rows ─────────────────────────────────────────────────── */
.wdk-bars {
padding: 8px 0;
}
.wdk-bar-row {
align-items: center;
display: flex;
gap: 10px;
padding: 7px 16px;
transition: background 0.12s;
}
.wdk-bar-row:hover {
background: #f8fafc;
}
.wdk-bar-row__label {
color: #334155;
flex: 0 0 auto;
font-size: 13px;
font-weight: 600;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 150px;
}
.wdk-bar-row__track {
background: #f1f5f9;
border-radius: 999px;
flex: 1 1 0;
height: 8px;
min-width: 0;
overflow: hidden;
}
.wdk-bar-row__fill {
border-radius: 999px;
height: 100%;
transition: width 0.5s ease;
}
.wdk-bar-row__count {
color: #0f172a;
flex: 0 0 auto;
font-size: 13px;
font-weight: 800;
min-width: 28px;
text-align: right;
}
.wdk-bar-row__pct {
color: #94a3b8;
flex: 0 0 auto;
font-size: 11px;
font-weight: 600;
min-width: 34px;
text-align: right;
}
/* Tipo colors */
.wdk-fill--0 { background: #3b82f6; }
.wdk-fill--1 { background: #f59e0b; }
.wdk-fill--2 { background: #8b5cf6; }
.wdk-fill--3 { background: #22c55e; }
.wdk-fill--4 { background: #ef4444; }
.wdk-fill--5 { background: #06b6d4; }
.wdk-fill--6 { background: #f97316; }
.wdk-fill--other { background: #94a3b8; }
/* Dept colors — gradient blue */
.wdk-fill-dept {
background: linear-gradient(90deg, #2563eb, #06b6d4);
}
/* ── Responsive ───────────────────────────────────────────────── */
@media (max-width: 900px) {
.wdk-summary { grid-template-columns: repeat(3, 1fr); }
.wdk-breakdowns { grid-template-columns: 1fr; }
}
@media (max-width: 600px) {
.wdk-summary { grid-template-columns: repeat(2, 1fr); }
.wdk-bar-row__label { width: 110px; }
}
@media (max-width: 420px) {
.wdk-summary { grid-template-columns: 1fr 1fr; }
}
/* ── Clickable bar rows ───────────────────────────────────────── */
.wdk-bar-row--drill { cursor: pointer; }
.wdk-bar-row--drill:hover { background: #eff6ff; }
.wdk-bar-row--drill .wdk-bar-row__label { color: #1d4ed8; }
/* ── Drilldown panel ──────────────────────────────────────────── */
.wdk-drilldown { padding: 4px 0; }
.wdk-drilldown__header {
align-items: center;
border-bottom: 1px solid #e2e8f0;
display: flex;
gap: 12px;
margin-bottom: 4px;
padding-bottom: 10px;
}
.wdk-drilldown__back {
background: #ffffff;
border: 1px solid #cbd5e1;
border-radius: 6px;
color: #475569;
cursor: pointer;
flex: 0 0 auto;
font-size: 12px;
font-weight: 600;
padding: 4px 12px;
transition: background 0.12s;
}
.wdk-drilldown__back:hover { background: #f8fafc; }
.wdk-drilldown__meta { align-items: center; display: flex; gap: 8px; }
.wdk-drilldown__title {
color: #0f172a;
font-size: 14px;
font-weight: 700;
}
.wdk-drill-list {
max-height: 340px;
overflow-y: auto;
}
.wdk-drill-row {
align-items: center;
border-bottom: 1px solid #f1f5f9;
cursor: pointer;
display: flex;
gap: 10px;
padding: 8px 12px;
transition: background 0.1s;
}
.wdk-drill-row:hover { background: #f8fafc; }
.wdk-drill-row__num {
color: #64748b;
flex: 0 0 68px;
font-size: 12px;
font-weight: 700;
}
.wdk-drill-row__info {
display: flex;
flex: 1 1 0;
flex-direction: column;
min-width: 0;
}
.wdk-drill-row__employee {
color: #0f172a;
font-size: 13px;
font-weight: 600;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.wdk-drill-row__dept {
color: #64748b;
font-size: 11px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.wdk-drill-row__date {
color: #94a3b8;
flex: 0 0 60px;
font-size: 11px;
text-align: right;
}
.wdk-drill-empty {
color: #94a3b8;
font-size: 13px;
padding: 20px;
text-align: center;
}
/* ── Detail overlay + card ────────────────────────────────────── */
.wdk-detail-overlay {
align-items: center;
background: rgba(15, 23, 42, 0.45);
bottom: 0;
display: flex;
justify-content: center;
left: 0;
position: fixed;
right: 0;
top: 0;
z-index: 9500;
}
.wdk-detail-card {
background: #ffffff;
border-radius: 12px;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.22);
max-width: 440px;
padding: 24px;
width: 90%;
}
.wdk-detail-card__header {
align-items: center;
display: flex;
justify-content: space-between;
margin-bottom: 16px;
}
.wdk-detail-card__header strong {
color: #0f172a;
font-size: 18px;
font-weight: 800;
}
.wdk-detail-card__close {
background: none;
border: none;
color: #94a3b8;
cursor: pointer;
font-size: 18px;
line-height: 1;
padding: 4px;
transition: color 0.12s;
}
.wdk-detail-card__close:hover { color: #475569; }
.wdk-detail-dl {
display: grid;
gap: 0 16px;
grid-template-columns: auto 1fr;
margin: 0;
}
.wdk-detail-dl dt {
color: #94a3b8;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.05em;
padding: 7px 0;
text-transform: uppercase;
white-space: nowrap;
}
.wdk-detail-dl dd {
border-bottom: 1px solid #f1f5f9;
color: #0f172a;
font-size: 13px;
font-weight: 600;
margin: 0;
padding: 7px 0;
}

View File

@ -0,0 +1,518 @@
var WdKpisWidget = SuperWidget.extend({
instanceId: null,
/* dataset names to try in order */
datasetCandidates: [
"desligamentoColaborador",
"Desligamento",
"desligamento"
],
/* fields to request from dataset (null = all) */
datasetFields: [
"tipodesligamento",
"departamento",
"dataAbertura",
"WKNumProces",
"colabDesliga",
"requesterName",
"cargoColaborador"
],
/* known tipo codes → display labels */
tipoLabels: {
"experiencia": "Exp. Probatória",
"desempenho": "Baixo Desempenho",
"substituicao": "Substituição",
"voluntario": "Pedido do colaborador",
"acordo": "Acordo",
"outros": "Outros"
},
/* summary card slot → tipo keys */
summarySlots: {
"experiencia": "[data-kpi-tipo-experiencia]",
"desempenho": "[data-kpi-tipo-desempenho]",
"substituicao": "[data-kpi-tipo-substituicao]"
},
currentPeriod: "all",
allRecords: [],
drillFilter: null,
init: function() {
this.$root = $("#WdKpis_" + this.instanceId);
this.$loading = this.$root.find("[data-loading]");
this.$empty = this.$root.find("[data-empty]");
this.$error = this.$root.find("[data-error]");
this.$breakdowns = this.$root.find("[data-breakdowns]");
this.$tipoBars = this.$root.find("[data-tipo-bars]");
this.$deptBars = this.$root.find("[data-dept-bars]");
this.$cargoBars = this.$root.find("[data-cargo-bars]");
this.$drilldown = this.$root.find("[data-drilldown]");
this.$drillList = this.$root.find("[data-drill-list]");
this.$detailModal = this.$root.find("[data-detail-modal]");
this.bindUi();
this.loadData();
},
bindings: { local: {}, global: {} },
bindUi: function() {
var self = this;
this.$root.find("[data-refresh]").on("click", function() {
self.loadData();
});
this.$root.on("click", "[data-period]", function() {
self.currentPeriod = $(this).data("period");
self.$root.find("[data-period]").removeClass("wdk-period-btn--active");
$(this).addClass("wdk-period-btn--active");
self.drillFilter = null;
self.render();
});
/* bar click → drill-down */
this.$root.on("click", "[data-drill]", function() {
var $el = $(this);
self.drillFilter = { field: $el.data("drill-field"), value: $el.data("drill-value") };
self.renderDrilldown();
});
/* back button */
this.$root.on("click", "[data-drill-back]", function() {
self.drillFilter = null;
self.render();
});
/* drill-list row → detail card */
this.$root.on("click", "[data-drill-row]", function() {
var idx = parseInt($(this).data("drill-row"), 10);
var recs = self.getDrillRecords();
if (recs[idx]) { self.showDetail(recs[idx]); }
});
/* close detail modal */
this.$root.on("click", "[data-detail-close]", function() {
self.$detailModal.hide();
});
$(document).on("keydown.wdKpisDetail_" + this.instanceId, function(e) {
if (e.which === 27) { self.$detailModal.hide(); }
});
},
/* ── Data loading ─────────────────────────────────────────── */
loadData: function() {
var self = this;
this.showLoading();
$.ajax({
url: "/api/public/ecm/dataset/search",
type: "POST",
contentType: "application/json",
data: JSON.stringify({
datasetId: "desligamento",
fields: self.datasetFields,
constraints: [],
order: [],
size: 2000
})
})
.done(function(res) {
var rows = self.deduplicateByProcess(res.content || []);
self.allRecords = rows.map(function(r) { return self.normalizeRecord(r); });
self.render();
})
.fail(function() {
/* fallback: process management API (sem campos do formulário) */
self.fetchFromApi();
});
},
deduplicateByProcess: function(rows) {
/* keep last row per WKNumProces — a versão mais recente tem os campos mais completos */
var map = {};
for (var i = 0; i < rows.length; i++) {
var proc = String(rows[i]["WKNumProces"] || rows[i]["processInstanceId"] || ("__idx_" + i));
map[proc] = rows[i]; /* sobrescreve: última linha ganha */
}
var deduped = [];
for (var k in map) {
if (map.hasOwnProperty(k)) { deduped.push(map[k]); }
}
return deduped;
},
normalizeRecord: function(row) {
var tipo = this.readField(row, ["tipodesligamento", "tipo", "tipoDemissao", "dismissalType"]);
var dept = this.readField(row, ["departamento", "department", "area", "setor"]);
var dateStr = this.readField(row, ["dataAbertura", "startDate", "createDate", "WKCreateDate"]);
var processNum = this.readField(row, ["WKNumProces", "processInstanceId"]);
var employee = this.readField(row, ["colabDesliga", "colaborador", "employeeName"]);
var requester = this.readField(row, ["requesterName", "solicitante", "requester"]);
var cargo = this.readField(row, ["cargoColaborador", "cargo", "role", "position"]);
return {
tipo: this.normalizeTipo(tipo),
tipoRaw: String(tipo || "").toLowerCase().trim(),
dept: String(dept || "Não informado").trim() || "Não informado",
date: this.parseDate(dateStr),
processNum: processNum,
employee: employee || "Não informado",
requester: requester || "—",
cargo: String(cargo || "Não informado").trim() || "Não informado"
};
},
normalizeTipo: function(value) {
if (!value) { return "Não informado"; }
var key = String(value).toLowerCase()
.replace(/[áàâã]/g, "a").replace(/[éèê]/g, "e")
.replace(/[íìî]/g, "i").replace(/[óòôõ]/g, "o")
.replace(/[úùû]/g, "u").replace(/ç/g, "c")
.trim();
return this.tipoLabels[key] || String(value).trim() || "Outros";
},
readField: function(row, keys) {
if (!row) { return ""; }
for (var i = 0; i < keys.length; i++) {
var v = row[keys[i]];
if (v !== undefined && v !== null && String(v).trim() !== "") { return String(v).trim(); }
}
return "";
},
parseDate: function(value) {
if (!value) { return null; }
var s = String(value);
/* DD/MM/YYYY */
var m1 = s.match(/^(\d{2})\/(\d{2})\/(\d{4})/);
if (m1) { return new Date(+m1[3], +m1[2] - 1, +m1[1]); }
/* YYYY-MM-DD or ISO */
var m2 = s.match(/^(\d{4})-(\d{2})-(\d{2})/);
if (m2) { return new Date(+m2[1], +m2[2] - 1, +m2[3]); }
var d = new Date(s);
return isNaN(d.getTime()) ? null : d;
},
fetchFromApi: function() {
var self = this;
$.ajax({
url: "/process-management/api/v2/processes/desligamentoColaborador/requests?page=1&pageSize=1000",
method: "GET",
dataType: "json",
headers: { Accept: "application/json" }
})
.done(function(response) {
var rows = [];
var data = response;
var keys = ["content", "items", "requests", "data", "values"];
for (var k = 0; k < keys.length; k++) {
if ($.isArray(data[keys[k]])) { rows = data[keys[k]]; break; }
}
if ($.isArray(data)) { rows = data; }
self.allRecords = rows.map(function(r) { return self.normalizeRecord(r); });
self.render();
})
.fail(function() {
self.showError("Não foi possível carregar os dados. Verifique se o dataset está publicado com um dos nomes: " + self.datasetCandidates.join(", ") + ".");
});
},
/* ── Period filter ────────────────────────────────────────── */
filterByPeriod: function(records) {
if (this.currentPeriod === "all") { return records; }
var now = new Date();
var year = now.getFullYear();
var month = now.getMonth();
var period = this.currentPeriod;
return records.filter(function(r) {
if (!r.date) { return true; }
if (period === "year") { return r.date.getFullYear() === year; }
if (period === "month") { return r.date.getFullYear() === year && r.date.getMonth() === month; }
return true;
});
},
/* ── Render ───────────────────────────────────────────────── */
render: function() {
this.$loading.hide();
this.$error.hide();
this.$drilldown.hide();
this.$detailModal.hide();
if (this.drillFilter) { this.renderDrilldown(); return; }
var records = this.filterByPeriod(this.allRecords);
var total = records.length;
if (!total) {
this.$breakdowns.hide();
this.$empty.show();
this.clearSummary();
return;
}
this.$empty.hide();
this.$breakdowns.show();
var tipoMap = this.groupBy(records, "tipo");
var deptMap = this.groupBy(records, "dept");
var cargoMap = this.groupBy(records, "cargo");
this.renderSummary(total, tipoMap);
this.renderTipoBars(tipoMap, total);
this.renderDeptBars(deptMap, total);
this.renderCargoBars(cargoMap, total);
},
groupBy: function(records, field) {
var map = {};
for (var i = 0; i < records.length; i++) {
var key = records[i][field] || "Não informado";
map[key] = (map[key] || 0) + 1;
}
/* sort desc */
var sorted = [];
for (var k in map) {
if (map.hasOwnProperty(k)) { sorted.push({ label: k, count: map[k] }); }
}
sorted.sort(function(a, b) { return b.count - a.count; });
return sorted;
},
/* ── Summary cards ────────────────────────────────────────── */
clearSummary: function() {
this.$root.find("[data-kpi-total]").text("—");
this.$root.find("[data-kpi-tipo-experiencia]").text("—");
this.$root.find("[data-kpi-tipo-desempenho]").text("—");
this.$root.find("[data-kpi-tipo-substituicao]").text("—");
this.$root.find("[data-kpi-tipo-outros]").text("—");
this.$root.find("[data-kpi-tipo-experiencia-pct], [data-kpi-tipo-desempenho-pct], [data-kpi-tipo-substituicao-pct], [data-kpi-tipo-outros-pct]").text("");
},
renderSummary: function(total, tipoArr) {
this.$root.find("[data-kpi-total]").text(total);
/* map label → count */
var byLabel = {};
for (var i = 0; i < tipoArr.length; i++) {
byLabel[tipoArr[i].label] = tipoArr[i].count;
}
var slots = {
"Exp. Probatória": { val: "[data-kpi-tipo-experiencia]", pct: "[data-kpi-tipo-experiencia-pct]" },
"Baixo Desempenho": { val: "[data-kpi-tipo-desempenho]", pct: "[data-kpi-tipo-desempenho-pct]" },
"Substituição": { val: "[data-kpi-tipo-substituicao]", pct: "[data-kpi-tipo-substituicao-pct]" }
};
var slotKeys = Object.keys ? Object.keys(slots) : (function() { var k = []; for (var x in slots) { if (slots.hasOwnProperty(x)) k.push(x); } return k; })();
var knownKeys = slotKeys.slice();
var outros = 0;
for (var k in byLabel) {
if (byLabel.hasOwnProperty(k)) {
var isKnown = false;
for (var j = 0; j < knownKeys.length; j++) { if (knownKeys[j] === k) { isKnown = true; break; } }
if (!isKnown) { outros += byLabel[k]; }
}
}
for (var label in slots) {
if (!slots.hasOwnProperty(label)) { continue; }
var count = byLabel[label] || 0;
var pct = total > 0 ? Math.round(count / total * 100) : 0;
this.$root.find(slots[label].val).text(count);
this.$root.find(slots[label].pct).text(count ? pct + "%" : "");
}
this.$root.find("[data-kpi-tipo-outros]").text(outros);
this.$root.find("[data-kpi-tipo-outros-pct]").text(outros && total ? Math.round(outros / total * 100) + "%" : "");
},
/* ── Tipo bar chart ───────────────────────────────────────── */
renderTipoBars: function(tipoArr, total) {
this.$root.find("[data-tipo-total]").text(tipoArr.length + " tipos");
if (!tipoArr.length) { this.$tipoBars.html(""); return; }
var maxCount = tipoArr[0].count;
var html = "";
for (var i = 0; i < tipoArr.length; i++) {
var item = tipoArr[i];
var barPct = Math.round(item.count / maxCount * 100);
var pct = Math.round(item.count / total * 100);
var colorClass = "wdk-fill--" + Math.min(i, 6);
html += '<div class="wdk-bar-row wdk-bar-row--drill" data-drill data-drill-field="tipo" data-drill-value="' + this.escapeHtml(item.label) + '">';
html += '<span class="wdk-bar-row__label" title="' + this.escapeHtml(item.label) + '">' + this.escapeHtml(item.label) + '</span>';
html += '<div class="wdk-bar-row__track"><div class="wdk-bar-row__fill ' + colorClass + '" style="width:' + barPct + '%"></div></div>';
html += '<span class="wdk-bar-row__count">' + item.count + '</span>';
html += '<span class="wdk-bar-row__pct">' + pct + '%</span>';
html += '</div>';
}
this.$tipoBars.html(html);
},
/* ── Dept bar chart ───────────────────────────────────────── */
renderDeptBars: function(deptArr, total) {
this.$root.find("[data-dept-total]").text(deptArr.length + " depto" + (deptArr.length !== 1 ? "s" : ""));
if (!deptArr.length) { this.$deptBars.html(""); return; }
var maxCount = deptArr[0].count;
/* show top 12 departments */
var visible = deptArr.slice(0, 12);
var html = "";
for (var i = 0; i < visible.length; i++) {
var item = visible[i];
var barPct = Math.round(item.count / maxCount * 100);
var pct = Math.round(item.count / total * 100);
html += '<div class="wdk-bar-row wdk-bar-row--drill" data-drill data-drill-field="dept" data-drill-value="' + this.escapeHtml(item.label) + '">';
html += '<span class="wdk-bar-row__label" title="' + this.escapeHtml(item.label) + '">' + this.escapeHtml(item.label) + '</span>';
html += '<div class="wdk-bar-row__track"><div class="wdk-bar-row__fill wdk-fill-dept" style="width:' + barPct + '%"></div></div>';
html += '<span class="wdk-bar-row__count">' + item.count + '</span>';
html += '<span class="wdk-bar-row__pct">' + pct + '%</span>';
html += '</div>';
}
if (deptArr.length > 12) {
var remaining = deptArr.length - 12;
html += '<div class="wdk-bar-row" style="opacity:0.6"><span class="wdk-bar-row__label">+ ' + remaining + ' outros</span></div>';
}
this.$deptBars.html(html);
},
/* ── Cargo bar chart ──────────────────────────────────────── */
renderCargoBars: function(cargoArr, total) {
this.$root.find("[data-cargo-total]").text(cargoArr.length + (cargoArr.length !== 1 ? " funções" : " função"));
if (!cargoArr.length) { this.$cargoBars.html(""); return; }
var maxCount = cargoArr[0].count;
/* show top 15 functions */
var visible = cargoArr.slice(0, 15);
var html = "";
for (var i = 0; i < visible.length; i++) {
var item = visible[i];
var barPct = Math.round(item.count / maxCount * 100);
var pct = Math.round(item.count / total * 100);
var colorClass = "wdk-fill--" + Math.min(i, 6);
html += '<div class="wdk-bar-row wdk-bar-row--drill" data-drill data-drill-field="cargo" data-drill-value="' + this.escapeHtml(item.label) + '">';
html += '<span class="wdk-bar-row__label" title="' + this.escapeHtml(item.label) + '">' + this.escapeHtml(item.label) + '</span>';
html += '<div class="wdk-bar-row__track"><div class="wdk-bar-row__fill ' + colorClass + '" style="width:' + barPct + '%"></div></div>';
html += '<span class="wdk-bar-row__count">' + item.count + '</span>';
html += '<span class="wdk-bar-row__pct">' + pct + '%</span>';
html += '</div>';
}
if (cargoArr.length > 15) {
var remaining = cargoArr.length - 15;
html += '<div class="wdk-bar-row" style="opacity:0.6"><span class="wdk-bar-row__label">+ ' + remaining + ' outras</span></div>';
}
this.$cargoBars.html(html);
},
/* ── Drill-down ──────────────────────────────────────────── */
getDrillRecords: function() {
var records = this.filterByPeriod(this.allRecords);
var f = this.drillFilter;
if (!f) { return records; }
return records.filter(function(r) {
return r[f.field] === f.value;
});
},
renderDrilldown: function() {
this.$breakdowns.hide();
this.$empty.hide();
this.$drilldown.show();
var records = this.getDrillRecords();
this.$root.find("[data-drill-title]").text(this.drillFilter.value);
this.$root.find("[data-drill-count]").text(records.length + " processo" + (records.length !== 1 ? "s" : ""));
var html = "";
for (var i = 0; i < records.length; i++) {
var r = records[i];
html += '<div class="wdk-drill-row" data-drill-row="' + i + '">';
html += '<span class="wdk-drill-row__num">' + this.escapeHtml(r.processNum ? "#" + r.processNum : "—") + '</span>';
html += '<div class="wdk-drill-row__info">';
html += '<span class="wdk-drill-row__employee">' + this.escapeHtml(r.employee) + '</span>';
html += '<span class="wdk-drill-row__dept">' + this.escapeHtml(r.dept) + '</span>';
html += '</div>';
html += '<span class="wdk-drill-row__date">' + (r.date ? this.formatDate(r.date) : "—") + '</span>';
html += '</div>';
}
if (!html) { html = '<div class="wdk-drill-empty">Nenhum registro.</div>'; }
this.$drillList.html(html);
},
showDetail: function(record) {
var m = this.$detailModal;
m.find("[data-detail-num]").text(record.processNum ? "#" + record.processNum : "—");
m.find("[data-detail-employee]").text(record.employee);
m.find("[data-detail-dept]").text(record.dept);
m.find("[data-detail-tipo]").text(record.tipo);
m.find("[data-detail-date]").text(record.date ? this.formatDate(record.date) : "—");
m.find("[data-detail-requester]").text(record.requester);
m.show();
},
formatDate: function(d) {
if (!d) { return "—"; }
return ("0" + d.getDate()).slice(-2) + "/" + ("0" + (d.getMonth() + 1)).slice(-2) + "/" + d.getFullYear();
},
/* ── State helpers ────────────────────────────────────────── */
showLoading: function() {
this.$error.hide();
this.$empty.hide();
this.$breakdowns.hide();
this.$loading.show();
},
showError: function(msg) {
this.$loading.hide();
this.$empty.hide();
this.$error.text(msg || "Erro ao carregar dados.").show();
},
escapeHtml: function(value) {
return String(value === undefined || value === null ? "" : value)
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
});

View File

@ -0,0 +1,17 @@
application.type=widget
application.code=wddesligamentoranking
application.title=wddesligamentoranking
application.description=wddesligamentoranking
application.fluig.version=null
application.category=Desligamento
application.renderer=freemarker
developer.code=Andrey
developer.name=Andrey
developer.url=http://www.fluig.com
application.uiwidget=true
application.mobileapp=false
application.version=${build.version}-${build.revision}
view.file=view.ftl
locale.file.base.name=wddesligamentoranking
application.resource.js.1=/resources/js/wddesligamentoranking.js
application.resource.css.2=/resources/css/wddesligamentoranking.css

View File

@ -0,0 +1,52 @@
<script src="/webdesk/vcXMLRPC.js"></script>
<div id="WdRanking_${instanceId}" class="super-widget wcm-widget-class fluig-style-guide wdr-widget" data-params="WdRankingWidget.instance({ instanceId: '${instanceId}' })">
<div class="wdr-shell">
<div class="wdr-header">
<div>
<p class="wdr-eyebrow">Gestão do Desligamento</p>
<h2 class="wdr-title">Ranking de Solicitações</h2>
</div>
<div class="wdr-actions">
<div class="wdr-period-toggle" role="group">
<button type="button" class="wdr-period-btn wdr-period-btn--active" data-period="all">Todos</button>
<button type="button" class="wdr-period-btn" data-period="year">Este ano</button>
<button type="button" class="wdr-period-btn" data-period="month">Este mês</button>
</div>
<button type="button" class="btn btn-default wdr-refresh-btn" data-refresh>
<span class="fluigicon fluigicon-refresh icon-sm" aria-hidden="true"></span>
</button>
</div>
</div>
<div class="wdr-kpis" data-kpis>
<div class="wdr-kpi">
<span class="wdr-kpi__label">Solicitantes únicos</span>
<strong class="wdr-kpi__value" data-kpi-requesters>—</strong>
</div>
<div class="wdr-kpi wdr-kpi--highlight">
<span class="wdr-kpi__label">Maior volume</span>
<strong class="wdr-kpi__value" data-kpi-top-name>—</strong>
<span class="wdr-kpi__sub" data-kpi-top-count></span>
</div>
<div class="wdr-kpi">
<span class="wdr-kpi__label">Total de processos</span>
<strong class="wdr-kpi__value" data-kpi-total>—</strong>
</div>
</div>
<div class="wdr-state wdr-state--loading" data-loading>
<span class="wdr-spinner" aria-hidden="true"></span>
Carregando dados…
</div>
<div class="wdr-state wdr-state--empty" data-empty style="display:none">
Nenhum dado encontrado.
</div>
<div class="wdr-state wdr-state--error" data-error style="display:none"></div>
<div class="wdr-ranking" data-ranking></div>
<div class="wdr-pagination" data-rank-pagination></div>
</div>
</div>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
<context-root>/wddesligamentoranking</context-root>
<disable-cross-context>false</disable-cross-context>
</jboss-web>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
</web-app>

View File

@ -0,0 +1,362 @@
/* ================================================================
wddesligamentoranking.css Ranking de Solicitantes
================================================================ */
.wdr-widget {
color: #0f172a;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
}
.wdr-widget * { box-sizing: border-box; }
.wdr-shell {
background: #f8fafc;
border: 1px solid #e2e8f0;
border-radius: 12px;
padding: 20px;
}
/* ── Header ───────────────────────────────────────────────────── */
.wdr-header {
align-items: center;
display: flex;
gap: 12px;
justify-content: space-between;
margin-bottom: 16px;
}
.wdr-eyebrow {
color: #64748b;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.06em;
margin: 0 0 2px;
text-transform: uppercase;
}
.wdr-title {
color: #0f172a;
font-size: 20px;
font-weight: 700;
line-height: 1.2;
margin: 0;
}
.wdr-actions {
align-items: center;
display: flex;
gap: 8px;
}
.wdr-refresh-btn {
align-items: center;
display: inline-flex;
padding: 6px 10px;
}
/* ── Period toggle ────────────────────────────────────────────── */
.wdr-period-toggle {
background: #e2e8f0;
border-radius: 8px;
display: inline-flex;
gap: 2px;
padding: 3px;
}
.wdr-period-btn {
background: transparent;
border: none;
border-radius: 6px;
color: #64748b;
cursor: pointer;
font-size: 12px;
font-weight: 600;
padding: 4px 10px;
transition: background 0.15s, color 0.15s;
}
.wdr-period-btn--active {
background: #ffffff;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
color: #1e40af;
}
/* ── KPIs ─────────────────────────────────────────────────────── */
.wdr-kpis {
display: grid;
gap: 10px;
grid-template-columns: repeat(3, minmax(0, 1fr));
margin-bottom: 16px;
}
.wdr-kpi {
background: #ffffff;
border: 1px solid #e2e8f0;
border-radius: 10px;
padding: 12px 16px;
}
.wdr-kpi--highlight {
background: #eff6ff;
border-color: #bfdbfe;
}
.wdr-kpi__label {
color: #64748b;
display: block;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.04em;
margin-bottom: 4px;
text-transform: uppercase;
}
.wdr-kpi__value {
color: #0f172a;
display: block;
font-size: 22px;
font-weight: 800;
line-height: 1.1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.wdr-kpi--highlight .wdr-kpi__value { color: #1d4ed8; font-size: 16px; }
.wdr-kpi__sub {
color: #64748b;
display: block;
font-size: 11px;
margin-top: 2px;
}
/* ── State ────────────────────────────────────────────────────── */
.wdr-state {
align-items: center;
background: #ffffff;
border: 1px solid #e2e8f0;
border-radius: 10px;
color: #64748b;
display: flex;
gap: 10px;
justify-content: center;
padding: 28px;
}
.wdr-state--error {
background: #fff1f2;
border-color: #fecdd3;
color: #9f1239;
justify-content: flex-start;
}
@keyframes wdr-spin { to { transform: rotate(360deg); } }
.wdr-spinner {
animation: wdr-spin 0.75s linear infinite;
border: 2px solid #e2e8f0;
border-radius: 50%;
border-top-color: #2563eb;
display: inline-block;
flex: 0 0 auto;
height: 18px;
width: 18px;
}
/* ── Ranking list ─────────────────────────────────────────────── */
.wdr-ranking {
display: grid;
gap: 6px;
}
.wdr-row {
align-items: center;
background: #ffffff;
border: 1px solid #e2e8f0;
border-radius: 8px;
display: flex;
gap: 12px;
padding: 10px 14px;
transition: box-shadow 0.15s;
}
.wdr-row:hover {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);
}
/* podium styling for top 3 */
.wdr-row:nth-child(1) { border-left: 4px solid #f59e0b; }
.wdr-row:nth-child(2) { border-left: 4px solid #94a3b8; }
.wdr-row:nth-child(3) { border-left: 4px solid #b45309; }
.wdr-rank {
align-items: center;
border-radius: 6px;
color: #64748b;
display: flex;
flex: 0 0 auto;
font-size: 13px;
font-weight: 800;
justify-content: center;
width: 28px;
}
.wdr-row:nth-child(1) .wdr-rank { color: #d97706; font-size: 16px; }
.wdr-row:nth-child(2) .wdr-rank { color: #64748b; font-size: 15px; }
.wdr-row:nth-child(3) .wdr-rank { color: #92400e; font-size: 14px; }
.wdr-avatar {
align-items: center;
background: #e2e8f0;
border-radius: 50%;
color: #475569;
display: flex;
flex: 0 0 auto;
font-size: 13px;
font-weight: 700;
height: 34px;
justify-content: center;
width: 34px;
text-transform: uppercase;
}
.wdr-row:nth-child(1) .wdr-avatar { background: #fef3c7; color: #b45309; }
.wdr-row:nth-child(2) .wdr-avatar { background: #f1f5f9; color: #334155; }
.wdr-row:nth-child(3) .wdr-avatar { background: #fef3c7; color: #78350f; }
.wdr-info {
flex: 1 1 0;
min-width: 0;
}
.wdr-name {
color: #0f172a;
display: block;
font-size: 14px;
font-weight: 700;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.wdr-dept {
color: #64748b;
display: block;
font-size: 12px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.wdr-bar-wrap {
flex: 0 0 160px;
}
.wdr-bar-track {
background: #f1f5f9;
border-radius: 999px;
height: 6px;
overflow: hidden;
}
.wdr-bar-fill {
background: linear-gradient(90deg, #3b82f6, #06b6d4);
border-radius: 999px;
height: 100%;
transition: width 0.5s ease;
}
.wdr-row:nth-child(1) .wdr-bar-fill { background: linear-gradient(90deg, #f59e0b, #ef4444); }
.wdr-count {
color: #0f172a;
flex: 0 0 auto;
font-size: 18px;
font-weight: 800;
min-width: 32px;
text-align: right;
}
.wdr-count small {
color: #64748b;
display: block;
font-size: 10px;
font-weight: 600;
text-align: right;
}
/* Breakdown badges */
.wdr-breakdown {
display: flex;
flex: 0 0 auto;
gap: 4px;
}
.wdr-badge {
border-radius: 5px;
font-size: 10px;
font-weight: 700;
padding: 2px 6px;
white-space: nowrap;
}
.wdr-badge--progress { background: #dbeafe; color: #1d4ed8; }
.wdr-badge--attention { background: #fef3c7; color: #92400e; }
.wdr-badge--done { background: #dcfce7; color: #15803d; }
.wdr-badge--canceled { background: #fee2e2; color: #991b1b; }
/* ── Responsive ───────────────────────────────────────────────── */
@media (max-width: 768px) {
.wdr-kpis { grid-template-columns: repeat(2, 1fr); }
.wdr-bar-wrap { display: none; }
.wdr-breakdown { display: none; }
}
@media (max-width: 480px) {
.wdr-kpis { grid-template-columns: 1fr; }
.wdr-header { flex-wrap: wrap; }
}
/* ── Pagination ───────────────────────────────────────────────── */
.wdr-pagination { margin-top: 4px; }
.wdr-pag {
align-items: center;
display: flex;
gap: 12px;
justify-content: center;
padding: 8px 0 2px;
}
.wdr-pag__info {
color: #94a3b8;
font-size: 12px;
}
.wdr-pag__pages {
display: flex;
gap: 4px;
}
.wdr-pag__btn {
background: #ffffff;
border: 1px solid #e2e8f0;
border-radius: 6px;
color: #475569;
cursor: pointer;
font-size: 12px;
font-weight: 600;
height: 28px;
min-width: 28px;
padding: 0 6px;
transition: background 0.12s, color 0.12s;
}
.wdr-pag__btn:hover { background: #f8fafc; border-color: #94a3b8; }
.wdr-pag__btn--active {
background: #2563eb;
border-color: #2563eb;
color: #ffffff;
}

View File

@ -0,0 +1,393 @@
var WdRankingWidget = SuperWidget.extend({
instanceId: null,
processId: "desligamentoColaborador",
requestPageSize: 1000,
formDatasetCandidates: ["desligamentoColaborador", "Desligamento", "desligamento"],
currentPeriod: "all",
pageSize: 5, currentPage: 1,
allRequests: [],
init: function() {
this.$root = $("#WdRanking_" + this.instanceId);
this.$ranking = this.$root.find("[data-ranking]");
this.$loading = this.$root.find("[data-loading]");
this.$empty = this.$root.find("[data-empty]");
this.$error = this.$root.find("[data-error]");
this.$pagination = this.$root.find("[data-rank-pagination]");
this.bindUi();
this.loadData();
},
bindings: { local: {}, global: {} },
bindUi: function() {
var self = this;
this.$root.find("[data-refresh]").on("click", function() {
self.loadData();
});
this.$root.on("click", "[data-period]", function() {
self.currentPeriod = $(this).data("period");
self.$root.find("[data-period]").removeClass("wdr-period-btn--active");
$(this).addClass("wdr-period-btn--active");
self.render();
});
this.$root.on("click", "[data-rank-page]", function() {
self.currentPage = parseInt($(this).data("rank-page"), 10) || 1;
self.render();
});
},
/* ── Data loading ─────────────────────────────────────────── */
loadData: function() {
this.showLoading();
this.loadFromProcessApi();
},
loadFromProcessApi: function() {
var self = this;
/* /requests/tasks returns one row per movement per process.
Each row has requester (who opened) + assignee (who owns this step).
We deduplicate by processInstanceId keeping the best representative task. */
$.ajax({
url: "/process-management/api/v2/processes/" + encodeURIComponent(this.processId) +
"/requests/tasks?page=1&pageSize=2000",
method: "GET",
dataType: "json",
headers: { Accept: "application/json" }
})
.done(function(response) {
var tasks = self.extractRows(response);
if (!tasks.length) { self.loadFromDatasets(); return; }
/* deduplicate: prefer NOT_COMPLETED task; within same status, prefer highest movementSequence */
var byProcess = {};
for (var i = 0; i < tasks.length; i++) {
var t = tasks[i];
var pid = String(t.processInstanceId || "");
if (!pid) { continue; }
var existing = byProcess[pid];
var tSeq = t.movementSequence || 0;
var tPending = t.status === "NOT_COMPLETED";
if (!existing) {
byProcess[pid] = t;
} else {
var eSeq = existing.movementSequence || 0;
var ePending = existing.status === "NOT_COMPLETED";
if (tPending && !ePending) { byProcess[pid] = t; }
else if (!tPending && ePending) { /* keep existing */ }
else if (tSeq > eSeq) { byProcess[pid] = t; }
}
}
var rows = [];
for (var k in byProcess) {
if (byProcess.hasOwnProperty(k)) { rows.push(byProcess[k]); }
}
self.allRequests = rows.map(function(r) { return self.buildRequest(r); });
self.render();
})
.fail(function() { self.loadFromDatasets(); });
},
loadFromDatasets: function() {
var self = this;
this.ensureDatasetFactory(function() {
try {
var candidates = self.formDatasetCandidates;
var rows = [];
for (var i = 0; i < candidates.length; i++) {
try {
var ds = DatasetFactory.getDataset(candidates[i], null, null, null);
if (ds && ds.values && ds.values.length) {
rows = ds.values;
break;
}
} catch (e) { /* try next */ }
}
self.allRequests = rows.map(function(r) { return self.buildRequest(r); });
self.render();
} catch (e) {
self.showError("Não foi possível carregar os dados. " + e.message);
}
});
},
ensureDatasetFactory: function(callback) {
if (window.DatasetFactory) { callback(); return; }
$.getScript("/webdesk/vcXMLRPC.js")
.done(callback)
.fail(function() { /* DatasetFactory unavailable */ });
},
extractRows: function(response) {
if (!response) { return []; }
if ($.isArray(response)) { return response; }
var keys = ["content", "items", "requests", "data", "values", "records"];
for (var i = 0; i < keys.length; i++) {
var v = response[keys[i]];
if ($.isArray(v)) { return v; }
}
return [];
},
buildRequest: function(row) {
/* /requests/tasks structure:
row.requester = who OPENED the process (constant on every movement)
row.assignee = who owns THIS task step (changes each movement)
We always use requester for ranking attribution. */
var name = "";
if (row.requester) {
var rq = row.requester;
if (typeof rq === "string") {
name = rq;
} else if (rq && typeof rq === "object") {
name = rq.name || rq.colleagueName || rq.login || rq.code || "";
}
}
/* plain-field fallback (DatasetFactory / other API shapes) */
if (!name) {
name = this.readFirst(row, [
"requesterName", "requesterId", "colleagueName", "solicitante", "WKCreatedBy"
]);
}
/* last resort: assignee, but skip pool/group entries */
if (!name && row.assignee) {
var ag = row.assignee;
var agCode = String((ag && ag.code) || "");
if (agCode.indexOf("Pool:") < 0 && agCode.indexOf("Group:") < 0) {
name = (ag.name || ag.login || agCode) || "";
}
}
/* department: try form field, then requester.local */
var dept = this.readFirst(row, ["departamento", "department", "area"]);
if (!dept && row.requester && row.requester.local) { dept = row.requester.local; }
var status = this.resolveStatus(row);
var startDateRaw = this.readFirst(row, ["startDate", "dataAbertura", "createDate", "createdAt"]);
return {
requesterName: name || "Desconhecido",
department: dept || "-",
status: status,
startDate: this.parseDate(startDateRaw)
};
},
resolveStatus: function(row) {
/* /requests/tasks primary path */
var taskStatus = String(row.status || "").toUpperCase();
if (taskStatus === "NOT_COMPLETED") {
var sla = String(row.slaStatus || "").toUpperCase();
if (sla === "OVERDUE") { return "attention"; }
return "progress";
}
if (taskStatus === "COMPLETED") { return "done"; }
/* form-field fallback (DatasetFactory / ECM dataset shape) */
var approval = String(this.readFirst(row, ["DesligamentoAprov", "approval"]) || "").toLowerCase().trim();
if (approval === "nao") { return "canceled"; }
var activeRaw = this.readFirst(row, ["active", "processActive"]);
if (activeRaw === false || String(activeRaw === null ? "" : activeRaw).toLowerCase() === "false") {
return "done";
}
var hasImpediment = String(this.readFirst(row, ["impeditivosColab", "impediment"]) || "").toLowerCase();
if (approval === "maisinformacoes" || hasImpediment === "sim") { return "attention"; }
return "progress";
},
parseDate: function(value) {
if (!value) { return null; }
var s = String(value);
var m1 = s.match(/^(\d{2})\/(\d{2})\/(\d{4})/);
if (m1) { return new Date(+m1[3], +m1[2] - 1, +m1[1]); }
var m2 = s.match(/^(\d{4})-(\d{2})-(\d{2})/);
if (m2) { return new Date(+m2[1], +m2[2] - 1, +m2[3]); }
var d = new Date(s);
return isNaN(d.getTime()) ? null : d;
},
readFirst: function(row, keys) {
if (!row) { return ""; }
for (var i = 0; i < keys.length; i++) {
var v = row[keys[i]];
if (v !== undefined && v !== null && v !== "") { return v; }
}
return "";
},
/* ── Filtering by period ──────────────────────────────────── */
filterByPeriod: function(requests) {
if (this.currentPeriod === "all") { return requests; }
var now = new Date();
var year = now.getFullYear();
var month = now.getMonth();
return requests.filter(function(r) {
if (!r.startDate) { return true; }
if (this.currentPeriod === "year") { return r.startDate.getFullYear() === year; }
if (this.currentPeriod === "month") {
return r.startDate.getFullYear() === year && r.startDate.getMonth() === month;
}
return true;
}.bind(this));
},
/* ── Render ───────────────────────────────────────────────── */
render: function() {
this.$loading.hide();
this.$error.hide();
var requests = this.filterByPeriod(this.allRequests);
if (!requests.length) {
this.$ranking.empty();
this.$empty.show();
this.$pagination.html("");
this.updateKpis([], []);
return;
}
this.$empty.hide();
/* group by requester */
var map = {};
for (var i = 0; i < requests.length; i++) {
var req = requests[i];
var name = req.requesterName;
if (!map[name]) {
map[name] = {
name: name, department: req.department,
total: 0, progress: 0, attention: 0, done: 0, canceled: 0
};
}
map[name].total++;
map[name][req.status] = (map[name][req.status] || 0) + 1;
}
/* sort desc by total */
var ranked = [];
for (var k in map) {
if (map.hasOwnProperty(k)) { ranked.push(map[k]); }
}
ranked.sort(function(a, b) { return b.total - a.total; });
this.updateKpis(ranked, requests);
/* paginate: show pageSize entries per page */
var totalPages = Math.ceil(ranked.length / this.pageSize);
if (this.currentPage > totalPages) { this.currentPage = 1; }
var start = (this.currentPage - 1) * this.pageSize;
var paginated = ranked.slice(start, start + this.pageSize);
var maxCount = ranked[0] ? ranked[0].total : 1;
var html = "";
for (var j = 0; j < paginated.length; j++) {
html += this.renderRow(paginated[j], start + j + 1, maxCount);
}
this.$ranking.html(html);
this.renderPagination(ranked.length, totalPages);
},
renderPagination: function(total, totalPages) {
if (totalPages <= 1) { this.$pagination.html(""); return; }
var cur = this.currentPage;
var html = '<div class="wdr-pag">';
html += '<span class="wdr-pag__info">' + total + ' solicitantes</span>';
html += '<div class="wdr-pag__pages">';
for (var p = 1; p <= totalPages; p++) {
var cls = p === cur ? " wdr-pag__btn--active" : "";
html += '<button type="button" class="wdr-pag__btn' + cls + '" data-rank-page="' + p + '">' + p + '</button>';
}
html += '</div></div>';
this.$pagination.html(html);
},
updateKpis: function(ranked, requests) {
this.$root.find("[data-kpi-requesters]").text(ranked.length || "—");
this.$root.find("[data-kpi-total]").text(requests.length || "—");
if (ranked.length) {
this.$root.find("[data-kpi-top-name]").text(ranked[0].name);
this.$root.find("[data-kpi-top-count]").text(ranked[0].total + " solicitação(ões)");
} else {
this.$root.find("[data-kpi-top-name]").text("—");
this.$root.find("[data-kpi-top-count]").text("");
}
},
renderRow: function(entry, position, maxCount) {
var barPct = Math.round((entry.total / maxCount) * 100);
var initials = entry.name.split(" ").slice(0, 2).map(function(w) { return w[0]; }).join("");
var medal = position === 1 ? "🥇" : position === 2 ? "🥈" : position === 3 ? "🥉" : position;
var breakdown = "";
if (entry.progress) { breakdown += '<span class="wdr-badge wdr-badge--progress">' + entry.progress + ' andamento</span>'; }
if (entry.attention) { breakdown += '<span class="wdr-badge wdr-badge--attention">' + entry.attention + ' atenção</span>'; }
if (entry.done) { breakdown += '<span class="wdr-badge wdr-badge--done">' + entry.done + ' concluído</span>'; }
if (entry.canceled) { breakdown += '<span class="wdr-badge wdr-badge--canceled">' + entry.canceled + ' cancelado</span>'; }
return [
'<div class="wdr-row">',
'<span class="wdr-rank">' + medal + '</span>',
'<div class="wdr-avatar">' + this.escapeHtml(initials) + '</div>',
'<div class="wdr-info">',
'<strong class="wdr-name">' + this.escapeHtml(entry.name) + '</strong>',
'<span class="wdr-dept">' + this.escapeHtml(entry.department) + '</span>',
'</div>',
'<div class="wdr-breakdown">' + breakdown + '</div>',
'<div class="wdr-bar-wrap">',
'<div class="wdr-bar-track"><div class="wdr-bar-fill" style="width:' + barPct + '%"></div></div>',
'</div>',
'<div class="wdr-count">' + entry.total + '<small>solicit.</small></div>',
'</div>'
].join("");
},
/* ── State helpers ────────────────────────────────────────── */
showLoading: function() {
this.$error.hide();
this.$empty.hide();
this.$ranking.empty();
this.$loading.show();
},
showError: function(msg) {
this.$loading.hide();
this.$ranking.empty();
this.$error.text(msg || "Erro ao carregar dados.").show();
},
escapeHtml: function(value) {
return String(value === undefined || value === null ? "" : value)
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
});

View File

@ -3,7 +3,11 @@
<object class="java.util.HashMap">
<void method="put">
<string>volume</string>
<null/>
<array class="java.lang.String" length="1">
<void index="0">
<string>Default</string>
</void>
</array>
</void>
<void method="put">
<string>camposFormulario, documentoId = 12959</string>
@ -657,6 +661,56 @@
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.GroupDto">
<void property="groupDescription">
<string>Transferencia</string>
</void>
<void property="groupId">
<string>Transferencia</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.GroupDto">
<void property="groupDescription">
<string>Fiscal</string>
</void>
<void property="groupId">
<string>Fiscal</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.GroupDto">
<void property="groupDescription">
<string>motoristaAL</string>
</void>
<void property="groupId">
<string>motoristaAL</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.GroupDto">
<void property="groupDescription">
<string>motoristaBA</string>
</void>
<void property="groupId">
<string>motoristaBA</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.GroupDto">
<void property="groupDescription">
<string>motoristaSE</string>
</void>
<void property="groupId">
<string>motoristaSE</string>
</void>
</object>
</void>
</object>
</void>
<void method="put">
@ -676,167 +730,6 @@
</void>
</array>
</void>
<void method="put">
<string>camposFormulario, documentoId = 590</string>
<array class="java.lang.String" length="52">
<void index="0">
<string>activity</string>
</void>
<void index="1">
<string>centroCusto</string>
</void>
<void index="2">
<string>codigoItem</string>
</void>
<void index="3">
<string>consideracoesCompras</string>
</void>
<void index="4">
<string>consideracoesCotacao</string>
</void>
<void index="5">
<string>currentUserId</string>
</void>
<void index="6">
<string>currentUsermail</string>
</void>
<void index="7">
<string>currentUserName</string>
</void>
<void index="8">
<string>dataAbertura</string>
</void>
<void index="9">
<string>dataAprovCompras</string>
</void>
<void index="10">
<string>dataRealizacaoCompras</string>
</void>
<void index="11">
<string>dataValidacaoCompras</string>
</void>
<void index="12">
<string>dataValidacaoGestor</string>
</void>
<void index="13">
<string>dataValidacaoItens</string>
</void>
<void index="14">
<string>descricao</string>
</void>
<void index="15">
<string>emailSolicitante</string>
</void>
<void index="16">
<string>estabelecimento</string>
</void>
<void index="17">
<string>excelUpload</string>
</void>
<void index="18">
<string>fdAnexo_Coleta</string>
</void>
<void index="19">
<string>fdAnexo_embalar</string>
</void>
<void index="20">
<string>fdAnexo_Entrega</string>
</void>
<void index="21">
<string>fdAnexo_Nfe</string>
</void>
<void index="22">
<string>fdAnexo_recebimento</string>
</void>
<void index="23">
<string>fnAnexo_Coleta</string>
</void>
<void index="24">
<string>fnAnexo_embalar</string>
</void>
<void index="25">
<string>fnAnexo_Entrega</string>
</void>
<void index="26">
<string>fnAnexo_Nfe</string>
</void>
<void index="27">
<string>fnAnexo_recebimento</string>
</void>
<void index="28">
<string>formMode</string>
</void>
<void index="29">
<string>gestorEmail</string>
</void>
<void index="30">
<string>gestorEmailE</string>
</void>
<void index="31">
<string>gestorNome</string>
</void>
<void index="32">
<string>gestorNomeE</string>
</void>
<void index="33">
<string>gestor_cc</string>
</void>
<void index="34">
<string>gestor_cce</string>
</void>
<void index="35">
<string>justificativa</string>
</void>
<void index="36">
<string>justificativaDecisaoCompras</string>
</void>
<void index="37">
<string>justificativaDecisaoGestor</string>
</void>
<void index="38">
<string>justificativaDecisaoItens</string>
</void>
<void index="39">
<string>justificativaValidaProblema</string>
</void>
<void index="40">
<string>quantidadeItem</string>
</void>
<void index="41">
<string>requesterId</string>
</void>
<void index="42">
<string>requesterMail</string>
</void>
<void index="43">
<string>requesterName</string>
</void>
<void index="44">
<string>userCotacaoGestor</string>
</void>
<void index="45">
<string>userRealizacaoCompras</string>
</void>
<void index="46">
<string>userSolicitante</string>
</void>
<void index="47">
<string>userValidacaoCompras</string>
</void>
<void index="48">
<string>userValidacaoGestor</string>
</void>
<void index="49">
<string>userValidacaoItens</string>
</void>
<void index="50">
<string>validacaoItens</string>
</void>
<void index="51">
<string>WKNumProces</string>
</void>
</array>
</void>
<void method="put">
<string>mecanismo</string>
<array class="[Ljava.lang.Object;" length="12">
@ -962,6 +855,164 @@
</void>
</array>
</void>
<void method="put">
<string>camposFormulario, documentoId = 9305</string>
<array class="java.lang.String" length="51">
<void index="0">
<string>activity</string>
</void>
<void index="1">
<string>centro_custo</string>
</void>
<void index="2">
<string>codigocentroCusto</string>
</void>
<void index="3">
<string>Codproduto</string>
</void>
<void index="4">
<string>cotacaoSCProtheus</string>
</void>
<void index="5">
<string>currentUserId</string>
</void>
<void index="6">
<string>currentUsermail</string>
</void>
<void index="7">
<string>currentUserName</string>
</void>
<void index="8">
<string>dataCadastroSCProtheus</string>
</void>
<void index="9">
<string>dataNec</string>
</void>
<void index="10">
<string>dataValidacaoItens</string>
</void>
<void index="11">
<string>data_validacao_gestor</string>
</void>
<void index="12">
<string>descProduto</string>
</void>
<void index="13">
<string>emailSolicitante</string>
</void>
<void index="14">
<string>emissaoSCProtheus</string>
</void>
<void index="15">
<string>empresa</string>
</void>
<void index="16">
<string>estabelecimento</string>
</void>
<void index="17">
<string>fdComprovante</string>
</void>
<void index="18">
<string>filialdest</string>
</void>
<void index="19">
<string>filialest</string>
</void>
<void index="20">
<string>filialprotheus</string>
</void>
<void index="21">
<string>fnComprovante</string>
</void>
<void index="22">
<string>formMode</string>
</void>
<void index="23">
<string>gestor_cc</string>
</void>
<void index="24">
<string>horaCadastroSCProtheus</string>
</void>
<void index="25">
<string>justificativaDecisaoItens</string>
</void>
<void index="26">
<string>justificativaValidaProblema</string>
</void>
<void index="27">
<string>justi_decisao_gestor</string>
</void>
<void index="28">
<string>moreInfo</string>
</void>
<void index="29">
<string>numeroSCProtheus</string>
</void>
<void index="30">
<string>observacoes</string>
</void>
<void index="31">
<string>pedidoSCProtheus</string>
</void>
<void index="32">
<string>produtoCod</string>
</void>
<void index="33">
<string>produtoDesc</string>
</void>
<void index="34">
<string>produtoLink</string>
</void>
<void index="35">
<string>qtd</string>
</void>
<void index="36">
<string>qtdItensSCProtheus</string>
</void>
<void index="37">
<string>quantidade</string>
</void>
<void index="38">
<string>requesterId</string>
</void>
<void index="39">
<string>requesterMail</string>
</void>
<void index="40">
<string>solicitanteSCProtheus</string>
</void>
<void index="41">
<string>statusAtendimento</string>
</void>
<void index="42">
<string>statusSCProtheus</string>
</void>
<void index="43">
<string>tipoSolicitacao</string>
</void>
<void index="44">
<string>urgencia</string>
</void>
<void index="45">
<string>userValidacaoItens</string>
</void>
<void index="46">
<string>user_validacao_gestor</string>
</void>
<void index="47">
<string>usuarioSolicitante</string>
</void>
<void index="48">
<string>validacaoItens</string>
</void>
<void index="49">
<string>valorTotalCotacao</string>
</void>
<void index="50">
<string>WKNumProces</string>
</void>
</array>
</void>
<void method="put">
<string>forms</string>
<object class="java.util.LinkedList">
@ -1449,7 +1500,7 @@
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>desligamento</string>
<string>3</string>
</void>
<void property="documentDescription">
<string>desligamento</string>
@ -1459,6 +1510,58 @@
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>checklist</string>
</void>
<void property="documentDescription">
<string>checklist</string>
</void>
<void property="documentId">
<int>40213</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>totvsflow_lancamento_documento</string>
</void>
<void property="documentDescription">
<string>totvsflow_lancamento_documento</string>
</void>
<void property="documentId">
<int>41254</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>transferenciav2</string>
</void>
<void property="documentDescription">
<string>transferência</string>
</void>
<void property="documentId">
<int>43582</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>desligamentov2</string>
</void>
<void property="documentDescription">
<string>desligamentov2</string>
</void>
<void property="documentId">
<int>46963</int>
</void>
</object>
</void>
</object>
</void>
</object>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_461" class="java.beans.XMLDecoder">
<java version="1.8.0_481" class="java.beans.XMLDecoder">
<object class="java.util.HashMap">
<void method="put">
<string>volume</string>
@ -9,183 +9,6 @@
</void>
</array>
</void>
<void method="put">
<string>camposFormulario, documentoId = 12959</string>
<array class="java.lang.String" length="29">
<void index="0">
<string>activity</string>
</void>
<void index="1">
<string>analistaTecnico</string>
</void>
<void index="2">
<string>complemento</string>
</void>
<void index="3">
<string>consegueResolver</string>
</void>
<void index="4">
<string>consideracoes</string>
</void>
<void index="5">
<string>consideracoesTecnicas</string>
</void>
<void index="6">
<string>currentUserId</string>
</void>
<void index="7">
<string>currentUsermail</string>
</void>
<void index="8">
<string>currentUserName</string>
</void>
<void index="9">
<string>dataAbertura</string>
</void>
<void index="10">
<string>dataAnaliseTecnica</string>
</void>
<void index="11">
<string>dataUserValidacao</string>
</void>
<void index="12">
<string>detalheSolicitacao</string>
</void>
<void index="13">
<string>emailGestorArea</string>
</void>
<void index="14">
<string>emailSolicitante</string>
</void>
<void index="15">
<string>estabelecimento</string>
</void>
<void index="16">
<string>formMode</string>
</void>
<void index="17">
<string>nomeGestorArea</string>
</void>
<void index="18">
<string>possuiInconsistencia</string>
</void>
<void index="19">
<string>ratingValue</string>
</void>
<void index="20">
<string>requesterId</string>
</void>
<void index="21">
<string>requesterMail</string>
</void>
<void index="22">
<string>requesterName</string>
</void>
<void index="23">
<string>situacaoResolvida</string>
</void>
<void index="24">
<string>tipoOcorrencia</string>
</void>
<void index="25">
<string>tituloOcorrencia</string>
</void>
<void index="26">
<string>userSolicitante</string>
</void>
<void index="27">
<string>userValidacao</string>
</void>
<void index="28">
<string>WKNumProces</string>
</void>
</array>
</void>
<void method="put">
<string>mecanismoGrupo</string>
<object class="java.util.ArrayList">
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.GroupDto">
<void property="groupDescription">
<string>Tecnologia e Comunicação</string>
</void>
<void property="groupId">
<string>TIC</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.GroupDto">
<void property="groupDescription">
<string>Compras Indiretos</string>
</void>
<void property="groupId">
<string>ComprasIndiretos</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.GroupDto">
<void property="groupDescription">
<string>Obras e manutenção</string>
</void>
<void property="groupId">
<string>Manutencao</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.GroupDto">
<void property="groupDescription">
<string>Aprovadores Compras Nvl 3</string>
</void>
<void property="groupId">
<string>AprovadoresComprasNvl3</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.GroupDto">
<void property="groupDescription">
<string>Motoristas</string>
</void>
<void property="groupId">
<string>Motoristas</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.GroupDto">
<void property="groupDescription">
<string>Requisitantes de Vaga</string>
</void>
<void property="groupId">
<string>Requisitantesdevaga</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.GroupDto">
<void property="groupDescription">
<string>Recrutamento</string>
</void>
<void property="groupId">
<string>Recrutamento</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.GroupDto">
<void property="groupDescription">
<string>TODOS-TODOS-DIADMISSAO</string>
</void>
<void property="groupId">
<string>TODOS-TODOS-DIADMISSAO</string>
</void>
</object>
</void>
</object>
</void>
<void method="put">
<string>expediente</string>
<array class="java.lang.String" length="4">
@ -203,167 +26,6 @@
</void>
</array>
</void>
<void method="put">
<string>processosServidor</string>
<object class="java.util.ArrayList">
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.ProcessDefinitionDto">
<void property="companyId">
<int>1</int>
</void>
<void property="processDescription">
<string>Abertura de Chamado</string>
</void>
<void property="processId">
<string>Abertura de chamado Manutenção</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.ProcessDefinitionDto">
<void property="companyId">
<int>1</int>
</void>
<void property="processDescription">
<string>desligamentoColaborador</string>
</void>
<void property="processId">
<string>desligamentoColaborador</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.ProcessDefinitionDto">
<void property="companyId">
<int>1</int>
</void>
<void property="processDescription">
<string>TOTVS RH - Admissão Digital</string>
</void>
<void property="processId">
<string>dpf_digte_di_processo_admissao</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.ProcessDefinitionDto">
<void property="companyId">
<int>1</int>
</void>
<void property="processDescription">
<string>Abertura de Chamado</string>
</void>
<void property="processId">
<string>FlowEssentials_AberturaDeChamado</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.ProcessDefinitionDto">
<void property="companyId">
<int>1</int>
</void>
<void property="processDescription">
<string>Solicitação de compra - Totvs</string>
</void>
<void property="processId">
<string>FlowEssentials_SolicitacaoDeCompras</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.ProcessDefinitionDto">
<void property="companyId">
<int>1</int>
</void>
<void property="processDescription">
<string>Flowservico_terceirizado</string>
</void>
<void property="processId">
<string>Flowservico_terceirizado</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.ProcessDefinitionDto">
<void property="companyId">
<int>1</int>
</void>
<void property="processDescription">
<string>Listar Tarefas</string>
</void>
<void property="processId">
<string>FLUIGADHOC</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.ProcessDefinitionDto">
<void property="companyId">
<int>1</int>
</void>
<void property="processDescription">
<string>Recrutamento e seleção</string>
</void>
<void property="processId">
<string>Recrutamento e Seleção</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.ProcessDefinitionDto">
<void property="companyId">
<int>1</int>
</void>
<void property="processDescription">
<string>Solicitação de compra - Ginseng</string>
</void>
<void property="processId">
<string>Solicitação de compras </string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.ProcessDefinitionDto">
<void property="companyId">
<int>1</int>
</void>
<void property="processDescription">
<string>Solicitação de compra - Ginseng</string>
</void>
<void property="processId">
<string>Solicitação de compras - Integração teste</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.ProcessDefinitionDto">
<void property="companyId">
<int>1</int>
</void>
<void property="processDescription">
<string>Solicitação de compra - Ginseng</string>
</void>
<void property="processId">
<string>Solicitação de compras v2</string>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.tds.ecm.foundation.ws.ProcessDefinitionDto">
<void property="companyId">
<int>1</int>
</void>
<void property="processDescription">
<string>Transferência Ginseng</string>
</void>
<void property="processId">
<string>Transferência Ginseng</string>
</void>
</object>
</void>
</object>
</void>
<void method="put">
<string>mecanismo</string>
<array class="[Ljava.lang.Object;" length="12">
@ -489,504 +151,5 @@
</void>
</array>
</void>
<void method="put">
<string>forms</string>
<object class="java.util.LinkedList">
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>FLUIGADHOC</string>
</void>
<void property="documentDescription">
<string>FLUIGADHOC</string>
</void>
<void property="documentId">
<int>3</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>FLUIGADHOCPROCESS</string>
</void>
<void property="documentDescription">
<string>FLUIGADHOCPROCESS</string>
</void>
<void property="documentId">
<int>4</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>totvsflow_dataset_tipo_ocorrencia</string>
</void>
<void property="documentDescription">
<string>totvsflow_dataset_tipo_ocorrencia</string>
</void>
<void property="documentId">
<int>14</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>totvsflow_abertura_chamado</string>
</void>
<void property="documentDescription">
<string>totvsflow_abertura_chamado</string>
</void>
<void property="documentId">
<int>15</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>DSFormulariodeAberturadechamado</string>
</void>
<void property="documentDescription">
<string>Formulário de Abertura de chamado</string>
</void>
<void property="documentId">
<int>20</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>Abertura_de_chamados</string>
</void>
<void property="documentDescription">
<string>Solicitação de abertura de chamados</string>
</void>
<void property="documentId">
<int>21</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>DSvistoriadeServico</string>
</void>
<void property="documentDescription">
<string>vistoriadeServico</string>
</void>
<void property="documentId">
<int>24</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>DSFormulariodeReservadesala</string>
</void>
<void property="documentDescription">
<string>Formulário de Reserva de sala</string>
</void>
<void property="documentId">
<int>34</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>totvsflow_dataset_centrocusto</string>
</void>
<void property="documentDescription">
<string>totvsflow_dataset_centrocusto</string>
</void>
<void property="documentId">
<int>103</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>totvsflow_dataset_cadastro_item</string>
</void>
<void property="documentDescription">
<string>totvsflow_dataset_cadastro_item</string>
</void>
<void property="documentId">
<int>104</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>totvsflow_dataset_estabelecimento</string>
</void>
<void property="documentDescription">
<string>totvsflow_dataset_estabelecimento</string>
</void>
<void property="documentId">
<int>105</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>totvsflow_solicitacao_compras</string>
</void>
<void property="documentDescription">
<string>totvsflow_solicitacao_compras</string>
</void>
<void property="documentId">
<int>165</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>aberturadechamado_manutencao</string>
</void>
<void property="documentDescription">
<string>aberturadechamado_manutencao</string>
</void>
<void property="documentId">
<int>400</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>Solicitacao_transferencia</string>
</void>
<void property="documentDescription">
<string>Solicitacao_transferencia</string>
</void>
<void property="documentId">
<int>590</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>recrutamento</string>
</void>
<void property="documentDescription">
<string>recrutamento</string>
</void>
<void property="documentId">
<int>823</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>kit_aniversariantes</string>
</void>
<void property="documentDescription">
<string>Aniversariantes</string>
</void>
<void property="documentId">
<int>7690</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>kit_cardapio</string>
</void>
<void property="documentDescription">
<string>Cardápio do Dia</string>
</void>
<void property="documentId">
<int>7695</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>kit_convenios</string>
</void>
<void property="documentDescription">
<string>Convênios</string>
</void>
<void property="documentId">
<int>7703</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>kit_news</string>
</void>
<void property="documentDescription">
<string>Notícias</string>
</void>
<void property="documentId">
<int>7709</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>compras_digital</string>
</void>
<void property="documentDescription">
<string>compras_digital</string>
</void>
<void property="documentId">
<int>9305</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_di_formulario_processo_admissao</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Di_Formulario_Processo_Admissao_Protheus</string>
</void>
<void property="documentId">
<int>9626</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_cadastro_status</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Status</string>
</void>
<void property="documentId">
<int>9627</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_configuracoes</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Configuracoes</string>
</void>
<void property="documentId">
<int>9628</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_cadastro_jornada</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Jornada</string>
</void>
<void property="documentId">
<int>9629</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_tipo_documento</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Tipo_Documento</string>
</void>
<void property="documentId">
<int>9630</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_dataset</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Dataset</string>
</void>
<void property="documentId">
<int>9631</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_di_configuracao</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Di_Configuracoes</string>
</void>
<void property="documentId">
<int>9632</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_di_beneficio</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Di_Beneficios</string>
</void>
<void property="documentId">
<int>9633</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_di_compl_contrato</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Di_Comp_Contrato</string>
</void>
<void property="documentId">
<int>9634</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_di_funcao_jornada</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Di_Funcao_Jornada</string>
</void>
<void property="documentId">
<int>9635</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_dataset_estrutura</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Di_Dataset_Estrutura</string>
</void>
<void property="documentId">
<int>9636</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_grupo_tipo_contrato</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Grupo_Tipo_Contrato</string>
</void>
<void property="documentId">
<int>9637</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_tipo_contrato</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Tipo_Contrato</string>
</void>
<void property="documentId">
<int>9638</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_di_traducao_campo_valor</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Di_Traducao_Campo_Valor</string>
</void>
<void property="documentId">
<int>9639</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_di_restricoes_cpf</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Di_Formulario_Restricao_CPF</string>
</void>
<void property="documentId">
<int>9640</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_di_compl_vt</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Di_Compl_VT</string>
</void>
<void property="documentId">
<int>9641</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>dpf_di_traducao_campo</string>
</void>
<void property="documentDescription">
<string>Digte_Public_Form_Di_Traducao_Campo</string>
</void>
<void property="documentId">
<int>9995</int>
</void>
</object>
</void>
<void method="add">
<object class="com.totvs.technology.ecmrestclient.cardindexpublisher.FormVO">
<void property="datasetName">
<string>desligamento</string>
</void>
<void property="documentDescription">
<string>desligamento</string>
</void>
<void property="documentId">
<int>12959</int>
</void>
</object>
</void>
</object>
</void>
</object>
</java>

View File

@ -15,7 +15,7 @@
<snapshotFrequency>0</snapshotFrequency>
<baseDay>0</baseDay>
<baseMonth>0</baseMonth>
<periodId>Expediente BackOffice, Logística e Motorista</periodId>
<periodId>Default</periodId>
<uniqueCardVersion>false</uniqueCardVersion>
<keyWord></keyWord>
<complementsLevel>1</complementsLevel>
@ -29,7 +29,7 @@
<processDefinitionVersionPK>
<companyId>1</companyId>
<processId>desligamentoColaborador</processId>
<version>20</version>
<version>31</version>
</processDefinitionVersionPK>
<versionDescription></versionDescription>
<formId>12959</formId>
@ -600,13 +600,13 @@
<companyId>1</companyId>
<processId>desligamentoColaborador</processId>
<expressionOrder>1</expressionOrder>
<version>20</version>
<version>31</version>
<sequence>33</sequence>
</conditionProcessStatePK>
<condition>hAPI.getCardValue(&quot;impeditivosColab&quot;) == &quot;Não&quot;</condition>
<destinationSequenceId>5</destinationSequenceId>
<engineAllocationConfiguration>&lt;AssignmentController&gt;&lt;FormField&gt;requesterId&lt;/FormField&gt;&lt;/AssignmentController&gt;</engineAllocationConfiguration>
<engineAllocationId>Campo Formulário</engineAllocationId>
<engineAllocationConfiguration>&lt;AssignmentController&gt;&lt;BaseActivity&gt;4&lt;/BaseActivity&gt;&lt;Returns&gt;Last&lt;/Returns&gt;&lt;/AssignmentController&gt;</engineAllocationConfiguration>
<engineAllocationId>Executor Atividade</engineAllocationId>
<conditionType>0</conditionType>
</ConditionProcessState>
<ConditionProcessState>
@ -614,7 +614,7 @@
<companyId>1</companyId>
<processId>desligamentoColaborador</processId>
<expressionOrder>2</expressionOrder>
<version>20</version>
<version>31</version>
<sequence>33</sequence>
</conditionProcessStatePK>
<condition>hAPI.getCardValue(&quot;impeditivosColab&quot;) == &quot;Sim&quot;</condition>
@ -628,7 +628,7 @@
<companyId>1</companyId>
<processId>desligamentoColaborador</processId>
<expressionOrder>1</expressionOrder>
<version>20</version>
<version>31</version>
<sequence>43</sequence>
</conditionProcessStatePK>
<condition>hAPI.getCardValue(&quot;DesligamentoAprov&quot;) == &quot;Não&quot;</condition>
@ -640,7 +640,7 @@
<companyId>1</companyId>
<processId>desligamentoColaborador</processId>
<expressionOrder>2</expressionOrder>
<version>20</version>
<version>31</version>
<sequence>43</sequence>
</conditionProcessStatePK>
<condition>hAPI.getCardValue(&quot;DesligamentoAprov&quot;) == &quot;Sim&quot;</condition>
@ -654,7 +654,7 @@
<companyId>1</companyId>
<processId>desligamentoColaborador</processId>
<expressionOrder>3</expressionOrder>
<version>20</version>
<version>31</version>
<sequence>43</sequence>
</conditionProcessStatePK>
<condition>hAPI.getCardValue(&quot;DesligamentoAprov&quot;) == &quot;MaisInformacoes&quot;</condition>
@ -663,6 +663,20 @@
<engineAllocationId>Executor Atividade</engineAllocationId>
<conditionType>0</conditionType>
</ConditionProcessState>
<ConditionProcessState>
<conditionProcessStatePK>
<companyId>1</companyId>
<processId>desligamentoColaborador</processId>
<expressionOrder>4</expressionOrder>
<version>31</version>
<sequence>43</sequence>
</conditionProcessStatePK>
<condition>hAPI.getCardValue(&quot;aprovacaosim&quot;) == &quot;sim&quot;</condition>
<destinationSequenceId>22</destinationSequenceId>
<engineAllocationConfiguration>&lt;AssignmentController&gt;&lt;Group&gt;DEPARTAMENTO_PESSOAL&lt;/Group&gt;&lt;/AssignmentController&gt;</engineAllocationConfiguration>
<engineAllocationId>Pool Grupo</engineAllocationId>
<conditionType>0</conditionType>
</ConditionProcessState>
</list>
<list>
<ProcessLink>
@ -1059,7 +1073,7 @@ process.instructions=&#xd;
<processLinkBendPK>
<companyId>1</companyId>
<processId>desligamentoColaborador</processId>
<version>20</version>
<version>31</version>
<linkSequence>8</linkSequence>
<bendSequence>1</bendSequence>
</processLinkBendPK>
@ -1070,7 +1084,7 @@ process.instructions=&#xd;
<processLinkBendPK>
<companyId>1</companyId>
<processId>desligamentoColaborador</processId>
<version>20</version>
<version>31</version>
<linkSequence>21</linkSequence>
<bendSequence>1</bendSequence>
</processLinkBendPK>
@ -1081,7 +1095,7 @@ process.instructions=&#xd;
<processLinkBendPK>
<companyId>1</companyId>
<processId>desligamentoColaborador</processId>
<version>20</version>
<version>31</version>
<linkSequence>35</linkSequence>
<bendSequence>1</bendSequence>
</processLinkBendPK>
@ -1092,7 +1106,7 @@ process.instructions=&#xd;
<processLinkBendPK>
<companyId>1</companyId>
<processId>desligamentoColaborador</processId>
<version>20</version>
<version>31</version>
<linkSequence>36</linkSequence>
<bendSequence>1</bendSequence>
</processLinkBendPK>
@ -1103,7 +1117,7 @@ process.instructions=&#xd;
<processLinkBendPK>
<companyId>1</companyId>
<processId>desligamentoColaborador</processId>
<version>20</version>
<version>31</version>
<linkSequence>36</linkSequence>
<bendSequence>2</bendSequence>
</processLinkBendPK>
@ -1114,7 +1128,7 @@ process.instructions=&#xd;
<processLinkBendPK>
<companyId>1</companyId>
<processId>desligamentoColaborador</processId>
<version>20</version>
<version>31</version>
<linkSequence>37</linkSequence>
<bendSequence>1</bendSequence>
</processLinkBendPK>
@ -1125,7 +1139,7 @@ process.instructions=&#xd;
<processLinkBendPK>
<companyId>1</companyId>
<processId>desligamentoColaborador</processId>
<version>20</version>
<version>31</version>
<linkSequence>40</linkSequence>
<bendSequence>1</bendSequence>
</processLinkBendPK>
@ -1136,7 +1150,7 @@ process.instructions=&#xd;
<processLinkBendPK>
<companyId>1</companyId>
<processId>desligamentoColaborador</processId>
<version>20</version>
<version>31</version>
<linkSequence>46</linkSequence>
<bendSequence>1</bendSequence>
</processLinkBendPK>
@ -1154,7 +1168,7 @@ process.instructions=&#xd;
<id>0</id>
<tenantId>0</tenantId>
<processId>desligamentoColaborador</processId>
<processVersion>20</processVersion>
<processVersion>31</processVersion>
<stateSequence>20</stateSequence>
<appKey>approval</appKey>
<appField>title</appField>
@ -1164,7 +1178,7 @@ process.instructions=&#xd;
<id>0</id>
<tenantId>0</tenantId>
<processId>desligamentoColaborador</processId>
<processVersion>20</processVersion>
<processVersion>31</processVersion>
<stateSequence>20</stateSequence>
<appKey>approval</appKey>
<appField>description</appField>
@ -1174,7 +1188,7 @@ process.instructions=&#xd;
<id>0</id>
<tenantId>0</tenantId>
<processId>desligamentoColaborador</processId>
<processVersion>20</processVersion>
<processVersion>31</processVersion>
<stateSequence>20</stateSequence>
<appKey>approval</appKey>
<appField>highlight</appField>
@ -1184,7 +1198,7 @@ process.instructions=&#xd;
<id>0</id>
<tenantId>0</tenantId>
<processId>desligamentoColaborador</processId>
<processVersion>20</processVersion>
<processVersion>31</processVersion>
<stateSequence>20</stateSequence>
<appKey>approval</appKey>
<appField>approve</appField>
@ -1194,7 +1208,7 @@ process.instructions=&#xd;
<id>0</id>
<tenantId>0</tenantId>
<processId>desligamentoColaborador</processId>
<processVersion>20</processVersion>
<processVersion>31</processVersion>
<stateSequence>20</stateSequence>
<appKey>approval</appKey>
<appField>reject</appField>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 45 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -85,17 +85,17 @@
</anchors>
</children>
<children xsi:type="pi:ContainerShape" visible="true" active="true">
<graphicsAlgorithm xsi:type="al:Rectangle" lineWidth="1" filled="false" lineVisible="false" transparency="0.0" width="106" height="124" x="1160" y="26"/>
<graphicsAlgorithm xsi:type="al:Rectangle" lineWidth="1" filled="false" lineVisible="false" transparency="0.0" width="106" height="98" x="1160" y="26"/>
<link businessObjects="task5"/>
<anchors xsi:type="pi:ChopboxAnchor" outgoingConnections="/0/@connections.7 /0/@connections.12" incomingConnections="/0/@connections.4"/>
<anchors xsi:type="pi:BoxRelativeAnchor" visible="true" active="true" referencedGraphicsAlgorithm="/0/@children.2/@graphicsAlgorithm" relativeWidth="1.0" relativeHeight="0.51">
<graphicsAlgorithm xsi:type="al:Ellipse" filled="false" lineVisible="false"/>
</anchors>
<children visible="true">
<graphicsAlgorithm xsi:type="al:RoundedRectangle" lineWidth="1" transparency="0.0" width="106" height="124" style="/0/@styles.36" cornerHeight="5" cornerWidth="5"/>
<graphicsAlgorithm xsi:type="al:RoundedRectangle" lineWidth="1" transparency="0.0" width="106" height="98" style="/0/@styles.36" cornerHeight="5" cornerWidth="5"/>
</children>
<children visible="true">
<graphicsAlgorithm xsi:type="al:MultiText" lineWidth="1" filled="false" lineVisible="true" transparency="0.0" width="96" height="114" x="5" y="5" style="/0/@styles.37" font="/0/@fonts.1" horizontalAlignment="ALIGNMENT_CENTER" value="Gest&#xe3;o e Comunica&#xe7;&#xe3;o do Desligamento"/>
<graphicsAlgorithm xsi:type="al:MultiText" lineWidth="1" filled="false" lineVisible="true" transparency="0.0" width="96" height="88" x="5" y="5" style="/0/@styles.37" font="/0/@fonts.1" horizontalAlignment="ALIGNMENT_CENTER" value="Gest&#xe3;o e Comunica&#xe7;&#xe3;o do Desligamento"/>
</children>
</children>
<children xsi:type="pi:ContainerShape" visible="true" active="true">
@ -118,17 +118,17 @@
</children>
</children>
<children xsi:type="pi:ContainerShape" visible="true" active="true">
<graphicsAlgorithm xsi:type="al:Rectangle" lineWidth="1" filled="false" lineVisible="false" transparency="0.0" width="106" height="92" x="1310" y="640"/>
<graphicsAlgorithm xsi:type="al:Rectangle" lineWidth="1" filled="false" lineVisible="false" transparency="0.0" width="106" height="70" x="1310" y="640"/>
<link businessObjects="task15"/>
<anchors xsi:type="pi:ChopboxAnchor" outgoingConnections="/0/@connections.1" incomingConnections="/0/@connections.7"/>
<anchors xsi:type="pi:BoxRelativeAnchor" visible="true" active="true" referencedGraphicsAlgorithm="/0/@children.4/@graphicsAlgorithm" relativeWidth="1.0" relativeHeight="0.51">
<graphicsAlgorithm xsi:type="al:Ellipse" filled="false" lineVisible="false"/>
</anchors>
<children visible="true">
<graphicsAlgorithm xsi:type="al:RoundedRectangle" lineWidth="1" transparency="0.0" width="106" height="92" style="/0/@styles.50" cornerHeight="5" cornerWidth="5"/>
<graphicsAlgorithm xsi:type="al:RoundedRectangle" lineWidth="1" transparency="0.0" width="106" height="70" style="/0/@styles.50" cornerHeight="5" cornerWidth="5"/>
</children>
<children visible="true">
<graphicsAlgorithm xsi:type="al:MultiText" lineWidth="1" filled="false" lineVisible="true" transparency="0.0" width="96" height="82" x="5" y="5" style="/0/@styles.51" font="/0/@fonts.1" horizontalAlignment="ALIGNMENT_CENTER" value="Inativar Perfis em sistemas"/>
<graphicsAlgorithm xsi:type="al:MultiText" lineWidth="1" filled="false" lineVisible="true" transparency="0.0" width="96" height="60" x="5" y="5" style="/0/@styles.51" font="/0/@fonts.1" horizontalAlignment="ALIGNMENT_CENTER" value="Inativar Perfis em sistemas"/>
</children>
</children>
<children xsi:type="pi:ContainerShape" visible="true" active="true">
@ -142,49 +142,49 @@
</anchors>
</children>
<children xsi:type="pi:ContainerShape" visible="true" active="true">
<graphicsAlgorithm xsi:type="al:Rectangle" lineWidth="1" filled="false" lineVisible="false" transparency="0.0" width="106" height="92" x="370" y="200"/>
<graphicsAlgorithm xsi:type="al:Rectangle" lineWidth="1" filled="false" lineVisible="false" transparency="0.0" width="106" height="70" x="370" y="200"/>
<link businessObjects="task20"/>
<anchors xsi:type="pi:ChopboxAnchor" outgoingConnections="/0/@connections.9" incomingConnections="/0/@connections.2"/>
<anchors xsi:type="pi:BoxRelativeAnchor" visible="true" active="true" referencedGraphicsAlgorithm="/0/@children.6/@graphicsAlgorithm" relativeWidth="1.0" relativeHeight="0.51">
<graphicsAlgorithm xsi:type="al:Ellipse" filled="false" lineVisible="false"/>
</anchors>
<children visible="true">
<graphicsAlgorithm xsi:type="al:RoundedRectangle" lineWidth="1" transparency="0.0" width="106" height="92" style="/0/@styles.60" cornerHeight="5" cornerWidth="5"/>
<graphicsAlgorithm xsi:type="al:RoundedRectangle" lineWidth="1" transparency="0.0" width="106" height="70" style="/0/@styles.60" cornerHeight="5" cornerWidth="5"/>
</children>
<children visible="true">
<graphicsAlgorithm xsi:type="al:MultiText" lineWidth="1" filled="false" lineVisible="true" transparency="0.0" width="96" height="82" x="5" y="5" style="/0/@styles.61" font="/0/@fonts.1" horizontalAlignment="ALIGNMENT_CENTER" value="Aprovar Desligamento"/>
<graphicsAlgorithm xsi:type="al:MultiText" lineWidth="1" filled="false" lineVisible="true" transparency="0.0" width="96" height="60" x="5" y="5" style="/0/@styles.61" font="/0/@fonts.1" horizontalAlignment="ALIGNMENT_CENTER" value="Aprovar Desligamento"/>
</children>
</children>
<children xsi:type="pi:ContainerShape" visible="true" active="true">
<graphicsAlgorithm xsi:type="al:Rectangle" lineWidth="1" filled="false" lineVisible="false" transparency="0.0" width="106" height="92" x="650" y="350"/>
<graphicsAlgorithm xsi:type="al:Rectangle" lineWidth="1" filled="false" lineVisible="false" transparency="0.0" width="106" height="84" x="650" y="350"/>
<link businessObjects="task22"/>
<anchors xsi:type="pi:ChopboxAnchor" outgoingConnections="/0/@connections.6 /0/@connections.8" incomingConnections="/0/@connections.5 /0/@connections.10"/>
<anchors xsi:type="pi:BoxRelativeAnchor" visible="true" active="true" referencedGraphicsAlgorithm="/0/@children.7/@graphicsAlgorithm" relativeWidth="1.0" relativeHeight="0.51">
<graphicsAlgorithm xsi:type="al:Ellipse" filled="false" lineVisible="false"/>
</anchors>
<children visible="true">
<graphicsAlgorithm xsi:type="al:RoundedRectangle" lineWidth="1" transparency="0.0" width="106" height="92" style="/0/@styles.63" cornerHeight="5" cornerWidth="5"/>
<graphicsAlgorithm xsi:type="al:RoundedRectangle" lineWidth="1" transparency="0.0" width="106" height="84" style="/0/@styles.63" cornerHeight="5" cornerWidth="5"/>
</children>
<children visible="true">
<graphicsAlgorithm xsi:type="al:MultiText" lineWidth="1" filled="false" lineVisible="true" transparency="0.0" width="96" height="82" x="5" y="5" style="/0/@styles.64" font="/0/@fonts.1" horizontalAlignment="ALIGNMENT_CENTER" value="Informar Previs&#xe3;o e Impeditivos"/>
<graphicsAlgorithm xsi:type="al:MultiText" lineWidth="1" filled="false" lineVisible="true" transparency="0.0" width="96" height="74" x="5" y="5" style="/0/@styles.64" font="/0/@fonts.1" horizontalAlignment="ALIGNMENT_CENTER" value="Informar Previs&#xe3;o e Impeditivos"/>
</children>
</children>
<children xsi:type="pi:ContainerShape" visible="true" active="true">
<graphicsAlgorithm xsi:type="al:Rectangle" lineWidth="1" filled="false" lineVisible="false" transparency="0.0" width="106" height="92" x="900" y="498"/>
<graphicsAlgorithm xsi:type="al:Rectangle" lineWidth="1" filled="false" lineVisible="false" transparency="0.0" width="106" height="70" x="900" y="498"/>
<link businessObjects="task24"/>
<anchors xsi:type="pi:ChopboxAnchor" outgoingConnections="/0/@connections.3" incomingConnections="/0/@connections.6"/>
<anchors xsi:type="pi:BoxRelativeAnchor" visible="true" active="true" referencedGraphicsAlgorithm="/0/@children.8/@graphicsAlgorithm" relativeWidth="1.0" relativeHeight="0.51">
<graphicsAlgorithm xsi:type="al:Ellipse" filled="false" lineVisible="false"/>
</anchors>
<children visible="true">
<graphicsAlgorithm xsi:type="al:RoundedRectangle" lineWidth="1" transparency="0.0" width="106" height="92" style="/0/@styles.67" cornerHeight="5" cornerWidth="5"/>
<graphicsAlgorithm xsi:type="al:RoundedRectangle" lineWidth="1" transparency="0.0" width="106" height="70" style="/0/@styles.67" cornerHeight="5" cornerWidth="5"/>
</children>
<children visible="true">
<graphicsAlgorithm xsi:type="al:MultiText" lineWidth="1" filled="false" lineVisible="true" transparency="0.0" width="96" height="82" x="5" y="5" style="/0/@styles.68" font="/0/@fonts.1" horizontalAlignment="ALIGNMENT_CENTER" value="Verificar Conformidade"/>
<graphicsAlgorithm xsi:type="al:MultiText" lineWidth="1" filled="false" lineVisible="true" transparency="0.0" width="96" height="60" x="5" y="5" style="/0/@styles.68" font="/0/@fonts.1" horizontalAlignment="ALIGNMENT_CENTER" value="Verificar Conformidade"/>
</children>
</children>
<children xsi:type="pi:ContainerShape" visible="true" active="true">
<graphicsAlgorithm xsi:type="al:Rectangle" lineWidth="1" filled="false" lineVisible="false" transparency="0.0" width="60" height="108" x="1090" y="490">
<graphicsAlgorithm xsi:type="al:Rectangle" lineWidth="1" filled="false" lineVisible="false" transparency="0.0" width="60" height="102" x="1090" y="490">
<graphicsAlgorithmChildren xsi:type="al:Polygon" lineWidth="1" filled="true" transparency="0.0" width="60" height="60" style="/0/@styles.85">
<points y="30"/>
<points x="30"/>
@ -204,7 +204,7 @@
<graphicsAlgorithm xsi:type="al:Ellipse" filled="false" lineVisible="false"/>
</anchors>
<children visible="true">
<graphicsAlgorithm xsi:type="al:MultiText" lineWidth="1" filled="false" lineVisible="true" transparency="0.0" width="60" height="48" y="60" style="/0/@styles.86" font="/0/@fonts.1" horizontalAlignment="ALIGNMENT_CENTER" value="Confor&#xA;midade&#xA;"/>
<graphicsAlgorithm xsi:type="al:MultiText" lineWidth="1" filled="false" lineVisible="true" transparency="0.0" width="60" height="42" y="60" style="/0/@styles.86" font="/0/@fonts.1" horizontalAlignment="ALIGNMENT_CENTER" value="Conformi&#xA;dade&#xA;"/>
</children>
</children>
<children xsi:type="pi:ContainerShape" visible="true" active="true">
@ -218,7 +218,7 @@
</anchors>
</children>
<children xsi:type="pi:ContainerShape" visible="true" active="true">
<graphicsAlgorithm xsi:type="al:Rectangle" lineWidth="1" filled="false" lineVisible="false" transparency="0.0" width="60" height="108" x="670" y="190">
<graphicsAlgorithm xsi:type="al:Rectangle" lineWidth="1" filled="false" lineVisible="false" transparency="0.0" width="60" height="88" x="670" y="190">
<graphicsAlgorithmChildren xsi:type="al:Polygon" lineWidth="1" filled="true" transparency="0.0" width="60" height="60" style="/0/@styles.98">
<points y="30"/>
<points x="30"/>
@ -238,7 +238,7 @@
<graphicsAlgorithm xsi:type="al:Ellipse" filled="false" lineVisible="false"/>
</anchors>
<children visible="true">
<graphicsAlgorithm xsi:type="al:MultiText" lineWidth="1" filled="false" lineVisible="true" transparency="0.0" width="60" height="48" y="60" style="/0/@styles.99" font="/0/@fonts.1" horizontalAlignment="ALIGNMENT_CENTER" value="Aprova&#xA;?&#xA;"/>
<graphicsAlgorithm xsi:type="al:MultiText" lineWidth="1" filled="false" lineVisible="true" transparency="0.0" width="60" height="28" y="60" style="/0/@styles.99" font="/0/@fonts.1" horizontalAlignment="ALIGNMENT_CENTER" value="Aprova?&#xA;"/>
</children>
</children>
<children xsi:type="pi:ContainerShape" visible="true" active="true">
@ -3102,7 +3102,7 @@
<fonts name="Arial" size="8"/>
<fonts name="Arial" size="8" bold="true"/>
</pi:Diagram>
<bpmn2:BpmnProcess id="desligamentoColaborador" name="desligamentoColaborador" serverId="Ginseng Produ&#xe7;&#xe3;o" version="20" author="" extendedFields="&lt;list/>" cardIndex="12959" formSource="server" managerMechanism="Grupo" managerAssignmentController="&lt;org.eclipse.bpmn2.impl.AssignmentControllerGroup>&#xA; &lt;groupId>ResponsavelDesligamento&lt;/groupId>&#xA; &lt;mechanismName>Grupo&lt;/mechanismName>&#xA;&lt;/org.eclipse.bpmn2.impl.AssignmentControllerGroup>" category="Desligamento" volume="Default" expedient="Expediente BackOffice, Log&#xed;stica e Motorista" instruction="" keyWord="" complementsLevel="1" notifyResponsibleComplements="true" notifyRequisitionerComplements="true"/>
<bpmn2:BpmnProcess id="desligamentoColaborador" name="desligamentoColaborador" serverId="Ginseng Produ&#xe7;&#xe3;o" version="31" author="" extendedFields="&lt;list/>" cardIndex="12959" formSource="server" managerMechanism="Grupo" managerAssignmentController="&lt;org.eclipse.bpmn2.impl.AssignmentControllerGroup>&#xA; &lt;groupId>ResponsavelDesligamento&lt;/groupId>&#xA; &lt;mechanismName>Grupo&lt;/mechanismName>&#xA;&lt;/org.eclipse.bpmn2.impl.AssignmentControllerGroup>" category="Desligamento" volume="Default" expedient="Default" instruction="" keyWord="" complementsLevel="1" notifyResponsibleComplements="true" notifyRequisitionerComplements="true"/>
<bpmn2:BpmnPool id="pool1" name="Desligamento" cores="FFFFFF"/>
<bpmn2:BpmnSwimLane id="swimlane2" name="Gestor" cores="C0C0C0"/>
<bpmn2:BpmnSwimLane id="swimlane3" name="Gente e Cultura" cores="FFFFFF"/>
@ -3122,7 +3122,7 @@
<bpmn2:SequenceFlow id="flow21" name="Enviar para Aprova&#xe7;&#xe3;o" sourceRef="startevent4" targetRef="task20" atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/>"/>
<bpmn2:BpmnTask id="task22" name="Informar Previs&#xe3;o e Impeditivos" incoming="flow36 flow45" outgoing="flow37 flow42" type="80" managerMechanism="" loopType="0" authNotify="true" expediente="" selecionaColaboradores="1" esforcoCalculo="0" executionAttempts="0" frequency="0"/>
<bpmn2:BpmnTask id="task24" name="Verificar Conformidade" incoming="flow37" outgoing="flow34" type="80" managerMechanism="Pool Grupo" managerAssignmentControllerString="&lt;org.eclipse.bpmn2.impl.AssignmentControllerPoolGroup>&#xA; &lt;groupId>COMPLIANCE&lt;/groupId>&#xA; &lt;mechanismName>Pool Grupo&lt;/mechanismName>&#xA;&lt;/org.eclipse.bpmn2.impl.AssignmentControllerPoolGroup>" loopType="0" authNotify="true" expediente="" selecionaColaboradores="1" esforcoCalculo="0" executionAttempts="0" frequency="0"/>
<bpmn2:BpmnGateway id="exclusivegateway33" name="Conformidade" incoming="flow34" outgoing="flow35 flow36" type="120" condition="&lt;list>&#xA; &lt;org.eclipse.bpmn2.impl.ConditionImpl>&#xA; &lt;order>1&lt;/order>&#xA; &lt;expression>hAPI.getCardValue(&amp;quot;impeditivosColab&amp;quot;) == &amp;quot;N&#xe3;o&amp;quot;&lt;/expression>&#xA; &lt;targetTask>task5&lt;/targetTask>&#xA; &lt;mechanism>Campo Formul&#xe1;rio&lt;/mechanism>&#xA; &lt;conditionType>0&lt;/conditionType>&#xA; &lt;mecanismoAtribuicaoConfiguracao class=&quot;org.eclipse.bpmn2.impl.AssignmentControllerFormField&quot;>&#xA; &lt;formField>requesterId&lt;/formField>&#xA; &lt;mechanismName>Campo Formul&#xe1;rio&lt;/mechanismName>&#xA; &lt;/mecanismoAtribuicaoConfiguracao>&#xA; &lt;/org.eclipse.bpmn2.impl.ConditionImpl>&#xA; &lt;org.eclipse.bpmn2.impl.ConditionImpl>&#xA; &lt;order>2&lt;/order>&#xA; &lt;expression>hAPI.getCardValue(&amp;quot;impeditivosColab&amp;quot;) == &amp;quot;Sim&amp;quot;&lt;/expression>&#xA; &lt;targetTask>task22&lt;/targetTask>&#xA; &lt;mechanism>Executor Atividade&lt;/mechanism>&#xA; &lt;conditionType>0&lt;/conditionType>&#xA; &lt;mecanismoAtribuicaoConfiguracao class=&quot;org.eclipse.bpmn2.impl.AssignmentControllerExecutorMechanism&quot;>&#xA; &lt;idNode>task22&lt;/idNode>&#xA; &lt;returns>1&lt;/returns>&#xA; &lt;mechanismName>Executor Atividade&lt;/mechanismName>&#xA; &lt;/mecanismoAtribuicaoConfiguracao>&#xA; &lt;/org.eclipse.bpmn2.impl.ConditionImpl>&#xA;&lt;/list>"/>
<bpmn2:BpmnGateway id="exclusivegateway33" name="Conformidade" incoming="flow34" outgoing="flow35 flow36" type="120" condition="&lt;list>&#xA; &lt;org.eclipse.bpmn2.impl.ConditionImpl>&#xA; &lt;order>1&lt;/order>&#xA; &lt;expression>hAPI.getCardValue(&amp;quot;impeditivosColab&amp;quot;) == &amp;quot;N&#xe3;o&amp;quot;&lt;/expression>&#xA; &lt;targetTask>task5&lt;/targetTask>&#xA; &lt;mechanism>Executor Atividade&lt;/mechanism>&#xA; &lt;conditionType>0&lt;/conditionType>&#xA; &lt;mecanismoAtribuicaoConfiguracao class=&quot;org.eclipse.bpmn2.impl.AssignmentControllerExecutorMechanism&quot;>&#xA; &lt;idNode>startevent4&lt;/idNode>&#xA; &lt;returns>1&lt;/returns>&#xA; &lt;mechanismName>Executor Atividade&lt;/mechanismName>&#xA; &lt;/mecanismoAtribuicaoConfiguracao>&#xA; &lt;/org.eclipse.bpmn2.impl.ConditionImpl>&#xA; &lt;org.eclipse.bpmn2.impl.ConditionImpl>&#xA; &lt;order>2&lt;/order>&#xA; &lt;expression>hAPI.getCardValue(&amp;quot;impeditivosColab&amp;quot;) == &amp;quot;Sim&amp;quot;&lt;/expression>&#xA; &lt;targetTask>task22&lt;/targetTask>&#xA; &lt;mechanism>Executor Atividade&lt;/mechanism>&#xA; &lt;conditionType>0&lt;/conditionType>&#xA; &lt;mecanismoAtribuicaoConfiguracao class=&quot;org.eclipse.bpmn2.impl.AssignmentControllerExecutorMechanism&quot;>&#xA; &lt;idNode>task22&lt;/idNode>&#xA; &lt;returns>1&lt;/returns>&#xA; &lt;mechanismName>Executor Atividade&lt;/mechanismName>&#xA; &lt;/mecanismoAtribuicaoConfiguracao>&#xA; &lt;/org.eclipse.bpmn2.impl.ConditionImpl>&#xA;&lt;/list>"/>
<bpmn2:SequenceFlow id="flow34" name="" sourceRef="task24" targetRef="exclusivegateway33" atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/>"/>
<bpmn2:SequenceFlow id="flow35" name="Conforme" sourceRef="exclusivegateway33" targetRef="task5" atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/>"/>
<bpmn2:SequenceFlow id="flow36" name="N&#xe3;o conforme e Notificar Departamento Pessoal " sourceRef="exclusivegateway33" targetRef="task22" atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/>"/>
@ -3130,7 +3130,7 @@
<bpmn2:SequenceFlow id="flow40" name="" sourceRef="task5" targetRef="task15" atividadeFluxo="Conclu&#xed;do" atividadeRetorno="" extendedFields="&lt;list/>"/>
<bpmn2:BpmnEndEvent id="endevent41" name="Fim" incoming="flow42" type="60" signalId="0"/>
<bpmn2:SequenceFlow id="flow42" name="Cancelar Desligamento" sourceRef="task22" targetRef="endevent41" atividadeFluxo="Cancelar processo de Desligamento" atividadeRetorno="" extendedFields="&lt;list/>"/>
<bpmn2:BpmnGateway id="exclusivegateway43" name="Aprova?" incoming="flow44" outgoing="flow45 flow46 flow50" type="120" condition="&lt;list>&#xA; &lt;org.eclipse.bpmn2.impl.ConditionImpl>&#xA; &lt;order>1&lt;/order>&#xA; &lt;expression>hAPI.getCardValue(&amp;quot;DesligamentoAprov&amp;quot;) == &amp;quot;N&#xe3;o&amp;quot;&lt;/expression>&#xA; &lt;targetTask>endevent49&lt;/targetTask>&#xA; &lt;conditionType>0&lt;/conditionType>&#xA; &lt;/org.eclipse.bpmn2.impl.ConditionImpl>&#xA; &lt;org.eclipse.bpmn2.impl.ConditionImpl>&#xA; &lt;order>2&lt;/order>&#xA; &lt;expression>hAPI.getCardValue(&amp;quot;DesligamentoAprov&amp;quot;) == &amp;quot;Sim&amp;quot;&lt;/expression>&#xA; &lt;targetTask>task22&lt;/targetTask>&#xA; &lt;mechanism>Pool Grupo&lt;/mechanism>&#xA; &lt;conditionType>0&lt;/conditionType>&#xA; &lt;mecanismoAtribuicaoConfiguracao class=&quot;org.eclipse.bpmn2.impl.AssignmentControllerPoolGroup&quot;>&#xA; &lt;groupId>DEPARTAMENTO_PESSOAL&lt;/groupId>&#xA; &lt;mechanismName>Pool Grupo&lt;/mechanismName>&#xA; &lt;/mecanismoAtribuicaoConfiguracao>&#xA; &lt;/org.eclipse.bpmn2.impl.ConditionImpl>&#xA; &lt;org.eclipse.bpmn2.impl.ConditionImpl>&#xA; &lt;order>3&lt;/order>&#xA; &lt;expression>hAPI.getCardValue(&amp;quot;DesligamentoAprov&amp;quot;) == &amp;quot;MaisInformacoes&amp;quot;&lt;/expression>&#xA; &lt;targetTask>startevent4&lt;/targetTask>&#xA; &lt;mechanism>Executor Atividade&lt;/mechanism>&#xA; &lt;conditionType>0&lt;/conditionType>&#xA; &lt;mecanismoAtribuicaoConfiguracao class=&quot;org.eclipse.bpmn2.impl.AssignmentControllerExecutorMechanism&quot;>&#xA; &lt;idNode>startevent4&lt;/idNode>&#xA; &lt;returns>1&lt;/returns>&#xA; &lt;mechanismName>Executor Atividade&lt;/mechanismName>&#xA; &lt;/mecanismoAtribuicaoConfiguracao>&#xA; &lt;/org.eclipse.bpmn2.impl.ConditionImpl>&#xA;&lt;/list>"/>
<bpmn2:BpmnGateway id="exclusivegateway43" name="Aprova?" incoming="flow44" outgoing="flow45 flow46 flow50" type="120" condition="&lt;list>&#xA; &lt;org.eclipse.bpmn2.impl.ConditionImpl>&#xA; &lt;order>1&lt;/order>&#xA; &lt;expression>hAPI.getCardValue(&amp;quot;DesligamentoAprov&amp;quot;) == &amp;quot;N&#xe3;o&amp;quot;&lt;/expression>&#xA; &lt;targetTask>endevent49&lt;/targetTask>&#xA; &lt;conditionType>0&lt;/conditionType>&#xA; &lt;/org.eclipse.bpmn2.impl.ConditionImpl>&#xA; &lt;org.eclipse.bpmn2.impl.ConditionImpl>&#xA; &lt;order>2&lt;/order>&#xA; &lt;expression>hAPI.getCardValue(&amp;quot;DesligamentoAprov&amp;quot;) == &amp;quot;Sim&amp;quot;&lt;/expression>&#xA; &lt;targetTask>task22&lt;/targetTask>&#xA; &lt;mechanism>Pool Grupo&lt;/mechanism>&#xA; &lt;conditionType>0&lt;/conditionType>&#xA; &lt;mecanismoAtribuicaoConfiguracao class=&quot;org.eclipse.bpmn2.impl.AssignmentControllerPoolGroup&quot;>&#xA; &lt;groupId>DEPARTAMENTO_PESSOAL&lt;/groupId>&#xA; &lt;mechanismName>Pool Grupo&lt;/mechanismName>&#xA; &lt;/mecanismoAtribuicaoConfiguracao>&#xA; &lt;/org.eclipse.bpmn2.impl.ConditionImpl>&#xA; &lt;org.eclipse.bpmn2.impl.ConditionImpl>&#xA; &lt;order>3&lt;/order>&#xA; &lt;expression>hAPI.getCardValue(&amp;quot;DesligamentoAprov&amp;quot;) == &amp;quot;MaisInformacoes&amp;quot;&lt;/expression>&#xA; &lt;targetTask>startevent4&lt;/targetTask>&#xA; &lt;mechanism>Executor Atividade&lt;/mechanism>&#xA; &lt;conditionType>0&lt;/conditionType>&#xA; &lt;mecanismoAtribuicaoConfiguracao class=&quot;org.eclipse.bpmn2.impl.AssignmentControllerExecutorMechanism&quot;>&#xA; &lt;idNode>startevent4&lt;/idNode>&#xA; &lt;returns>1&lt;/returns>&#xA; &lt;mechanismName>Executor Atividade&lt;/mechanismName>&#xA; &lt;/mecanismoAtribuicaoConfiguracao>&#xA; &lt;/org.eclipse.bpmn2.impl.ConditionImpl>&#xA; &lt;org.eclipse.bpmn2.impl.ConditionImpl>&#xA; &lt;order>4&lt;/order>&#xA; &lt;expression>hAPI.getCardValue(&amp;quot;aprovacaosim&amp;quot;) == &amp;quot;sim&amp;quot;&lt;/expression>&#xA; &lt;targetTask>task22&lt;/targetTask>&#xA; &lt;mechanism>Pool Grupo&lt;/mechanism>&#xA; &lt;conditionType>0&lt;/conditionType>&#xA; &lt;mecanismoAtribuicaoConfiguracao class=&quot;org.eclipse.bpmn2.impl.AssignmentControllerPoolGroup&quot;>&#xA; &lt;groupId>DEPARTAMENTO_PESSOAL&lt;/groupId>&#xA; &lt;mechanismName>Pool Grupo&lt;/mechanismName>&#xA; &lt;/mecanismoAtribuicaoConfiguracao>&#xA; &lt;/org.eclipse.bpmn2.impl.ConditionImpl>&#xA;&lt;/list>"/>
<bpmn2:SequenceFlow id="flow44" name="" sourceRef="task20" targetRef="exclusivegateway43" atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/>"/>
<bpmn2:SequenceFlow id="flow45" name="" sourceRef="exclusivegateway43" targetRef="task22" atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/>"/>
<bpmn2:SequenceFlow id="flow46" name="Mais informa&#xe7;&#xf5;es" sourceRef="exclusivegateway43" targetRef="startevent4" atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/>"/>

1
checklist/fluig Submodule

@ -0,0 +1 @@
Subproject commit 4e278481a1fabe9695fd0397faf7fa067b4a2074

Binary file not shown.

View File

@ -0,0 +1,160 @@
<!-- ✅ IMPORTANTE: o link do estilo sempre fora das divs -->
<link rel="stylesheet" type="text/css" href="/style-guide/css/fluig-style-guide.min.css">
<div id="cardsProcessos" class="fluig-style-guide">
<h3 style="color:#04506b; font-weight:600; margin-bottom:15px;">
Iniciar Solicitações
</h3>
<!-- 🔍 Campo de Pesquisa -->
<div class="form-group" style="max-width: 300px; margin-bottom: 20px;">
<div class="input-group">
<span class="input-group-addon">
<i class="fluigicon fluigicon-search"></i>
</span>
<input id="filtroProcessos" type="text" class="form-control" placeholder="Pesquisar processo...">
</div>
</div>
<!-- 🔹 Lista de Cards -->
<div class="cards-container">
<div class="card-process" data-proc="Solicitação de compras - Integração teste">
<i class="flaticon flaticon-product"></i>
<span>Solicitação de Compras</span>
</div>
<div class="card-process" data-proc="FlowEssentials_AberturaDeChamado">
<i class="flaticon flaticon-message-broker"></i>
<span>Tecnologia</span>
</div>
<div class="card-process" data-proc="Transferência Ginseng">
<i class="flaticon flaticon-transfer"></i>
<span>Transferência de Mercadorias</span>
</div>
<div class="card-process" data-proc="Recrutamento e Seleção">
<i class="flaticon flaticon-file-person"></i>
<span>Solicitação de Vaga</span>
</div>
<div class="card-process" data-proc="desligamentoColaborador">
<i class="flaticon flaticon-blocked"></i>
<span>Desligamento de Colaborador</span>
</div>
<div class="card-process" data-proc="checklist">
<i class="flaticon flaticon-check-square"></i>
<span>Auditoria de Lojas</span>
</div>
<div class="card-process" data-proc="Abertura de chamado Manutenção">
<i class="flaticon flaticon-build"></i>
<span>Obras e Manutenção</span>
</div>
</div>
</div>
<script>
$(document).ready(function() {
// 🔍 Filtro de pesquisa
$("#filtroProcessos").on("keyup", function() {
const termo = $(this).val().toLowerCase().trim();
$(".card-process").each(function() {
const nome = $(this).find("span").text().toLowerCase();
$(this).toggle(nome.includes(termo));
});
});
// 🔹 Clique em card → abre o processo
$(".card-process").on("click", function() {
const processId = $(this).data("proc");
const nome = $(this).find("span").text();
FLUIGC.toast({
title: "Abrindo formulário: ",
message: nome,
type: "info"
});
const url = `/portal/p/1/pageworkflowview?processID=${processId}`;
window.location.href = url;
});
});
</script>
<style>
/* 🔹 Garante que os ícones usem a fonte certa */
.fluigicon:before {
font-family: Fluigicon !important;
}
/* 🔹 Layout geral */
.cards-container {
display: flex;
flex-wrap: wrap;
gap: 15px;
justify-content: flex-start;
}
/* 🔹 Card menor */
.card-process {
background-color: #f8f9fa;
border: 1px solid #04506b33;
border-radius: 12px;
padding: 15px 10px;
text-align: center;
width: 125px; /* 🔹 ligeiramente menor */
height: 115px; /* 🔹 reduzido para equilíbrio */
cursor: pointer;
box-shadow: 0 3px 6px rgba(0, 0, 0, 0.06);
transition: all 0.25s ease;
color: #04506b;
font-family: "Segoe UI", Arial, sans-serif;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
margin: 3px; /* 🔹 pequeno respiro entre eles */
}
.card-process:hover {
background-color: #04506b;
color: white;
transform: scale(1.03); /* 🔹 efeito mais suave */
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15);
z-index: 2; /* 🔹 evita sobreposição visual */
}
/* 🔹 Ícones menores */
.card-process i {
font-size: 28px;
margin-bottom: 8px;
}
.card-process span {
font-weight: 600;
font-size: 12px;
display: block;
line-height: 1.2em;
text-align: center;
}
/* 🔹 Campo de busca */
#filtroProcessos {
border-radius: 4px;
}
.input-group-addon {
background-color: #04506b;
color: white;
border: none;
}
.icon-process{
width:32px;
height:32px;
margin-bottom:8px;
object-fit:contain;
}
</style>

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2025 Bruno Gasparetto
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,212 @@
# Fluig Form Attachment
Plugin JQuery para auxiliar no tratamento de anexos em formulários
de processo.
A gestão dos anexos de processo no Fluig não é uma tarefa fácil. Além da aba anexos não
permitir ordenação, o Fluig não permite, de maneira simples, vincular os anexos a campos
do formulário do processo, assim devemos confiar que os usuários vão colocar os anexos
corretamente na aba anexos e depois gastar tempo identificando cada anexo, pois usuários
dificilmente respeitarão alguma regra de nomenclatura.
Para permitir esse vínculo entre os campos do formulário e os anexos, o
[Sérgio Machado](https://www.linkedin.com/in/sergio-machado-analista-fluig/)
criou o [ComponenteAnexos](https://github.com/sergiomachadosilva/fluig-utils/tree/main/projetos/ComponenteAnexos),
que é uma biblioteca JS/CSS/HTML, permitindo um maior controle dos
anexos. Esse projeto do Sérgio serviu como base para a construção desse Plugin JQuery.
A intenção desse plugin é simplificar ainda mais o tratamento dos anexos em formulários
que estão abertos em um Processo.
## Atenção
Esse plugin não funciona na versão mobile dentro do aplicativo My Fluig.
Testado no Fluig 1.8.1 e 1.8.2. Quando lançar o Fluig 2.0 teremos que
rever o funcionamento do plugin.
Esse plugin está usando somente a "descrição" do anexo como vínculo entre
formulário e anexo. Ainda está em testes se isso é o suficiente ou se
o ideal seria ter o nome físico do arquivo salvo em algum lugar, assim
como o ComponenteAnexos do Sérgio Machado.
No Fluig 1.8.1 identifiquei um bug quando insere um anexo por vez e então remove
algum anexo. Nessa situação a tabela de anexos é esvaziada. Porém esse bug ocorre
mesmo quando usando a Aba de Anexos, sendo um bug do próprio Fluig e não do Plugin.
Esse bug ocorre somente na primeira atividade do processo, quando ainda não há ID
da Solicitação.
## Instalação
Basta adicionar o script `fluigFormAttachment.js` ou `fluigformAttachment.min.js` ao
seu formulário.
## Modo de usar
Ao carregar o plugin no seu formulário ele ocultará a Aba Anexos do Fluig, evitando que
insiram documentos não solicitados e, mais importante, removam anexos que já estão
vinculados a um campo do formulário.
### Básico
Basta ter um campo do tipo texto e instanciar o plugin para esse campo.
```html
<div class="form-group">
<label for="cnh">Teste 001</label>
<input type="text" class="form-control" readonly
name="cnh" id="cnh" data-filename="CNH" data-accept="image/*,.pdf"
>
</div>
```
É recomendável deixar o campo como `readonly`. O plugin fará isso automaticamente quando
instanciado no elemento, mas pode ser que algum usuário consiga editar o formulário fora
do processo e nesse caso o plugin não funcionará.
O atributo `data-filename` indica a "descrição" do anexo, que é o valor que aparece na Aba
Anexos. Esse nome será utilizado para vincular o campo do formulário ao anexo.
O atributo `data-accept` indica o tipo de arquivo permitido. Funciona exatamente como
o atributo `accept` do campo input file ([documentação](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/accept)).
Então no JavaScript basta executar:
```javascript
$("#cnh").fluigFormAttachment();
```
### Parâmetros
Ao instanciar o plugin para os elementos é possível passar um objeto com as seguintes
propriedades de configuração:
| Parâmetro | Tipo | Padrão | Descrição |
| --- | --- | --- | --- |
| **showActionButton** | boolean | `true` | Indica se deve exibir os botões de Ação (Upload ou Delete) |
| **filename** | string | `"Anexo"` | Nome/Descrição do Anexo. Caso exista o atributo `data-filename` no campo do formulário ele terá preferência. **Cuidado**: Não pode ter mais de um anexo com o mesmo Nome/Descrição. |
| **prefixName** | boolean\|string | `false` | Adiciona prefixo à descrição do anexo. Caso `true` criará um prefixo aleatório usando parte de um UUID. No caso de `string` a usará como prefixo fixo, adicionando `-` como separador. |
| **accept** | string | `"*"` | Funciona igual ao atributo accept do input file ([documentação](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/accept)). Caso exista o atributo `data-accept` no campo do formulário ele terá preferência. |
Se ao instanciar o Plugin o campo estiver **Desabilitado** ou o usuário não possuir permissão
de complemento no processo, o botão de Upload/Delete não será exibido, mesmo se o parâmetro
`showActionButton` estiver como `true`. Caso deseje exibir/ocultar o botão de ação dinamicamente
utilize os métodos `showActionButton` e `hideActionButton`.
A intenção da configuração `prefixName` é auxiliar nos casos de Tabela Pai Filho.
Lembre-se de tratar as situações nas quais o processo estiver somente em modo de
visualização e nos casos que os campos não devem permitir upload/delete dos
anexos.
Exemplos:
```javascript
$("#cnh").fluigFormAttachment({
showActionButton: false,
});
// Exibe os botões de visualização em todos os filhos já existentes da Pai Filho
// Pulamos a primeira TR por ser a base para gerar as demais filhas
$("#tabelaPaiFilho tbody tr:not(:first-child) .anexo")
.fluigFormAttachment({ showActionButton: false })
;
// Tabela Pai Filho - adiciona com prefixo automático para cada arquivo
$("#adicionar").on("click", function () {
const index = wdkAddChild("tabelaPaiFilho");
$(`#cnh___${index}`).fluigFormAttachment({
prefixName: true,
});
});
// Tabela Pai Filho com vários campos de anexo
$("#adicionar").on("click", function () {
const index = wdkAddChild("tabelaPaiFilho");
const tr = $(`#cnh___${index}`).closest("tr");
// A cada upload será criado um prefixo aleatório pra cada anexo
$(".anexos", tr).fluigFormAttachment({
prefixName: true,
});
});
// Tabela Pai Filho com vários campos de anexo e prefixo único pra linha
$("#adicionar").on("click", function () {
const index = wdkAddChild("tabelaPaiFilho");
const tr = $(`#cnh___${index}`).closest("tr");
// A cada upload usará o mesmo prefixo para todos os anexos da linha
$(".anexos", tr).fluigFormAttachment({
prefixName: FLUIGC.utilities.randomUUID().substring(0, 8),
});
});
```
### Métodos
É possível executar alguns métodos do Plugin para manipular os anexos. Para
executar um método basta chamar o plugin no campo indicando passando o nome
do método ao invés do objeto de parâmetros.
Os seguintes métodos estão disponíveis:
| Método | Executa em | Parâmetros | Retorno | Descrição |
| --- | --- | --- | --- | --- |
| **hasAttachment** | Primeiro Elemento | - | `boolean` | Indica se o campo possuí anexo (tem descrição e o anexo está na tabela de anexos) |
| **isValid** | Primeiro Elemento | - | `boolean` | Indica se o campo está válido. Caso ele possua um valor (foi feito upload do anexo), mas o anexo não está na tabela de anexos, indicará campo inválido. Este método é executado em um único campo |
| **deleteAttachment** | Todos Elementos | - | `JQuery` | Remove o anexo do campo. Útil para quando excluir uma linha de uma tabela Pai Filho |
| **showActionButton** | Todos Elementos | - | `JQuery` | Exibe o botão de ação |
| **hideActionButton** | Todos Elementos | - | `JQuery` | Oculta o botão de ação |
| **prefixName** | Todos Elementos | string\|boolean | `JQuery` | Altera o prefixName para os elementos |
| **filename** | Todos Elementos | string, string\|boolean | `JQuery` | Altera o filename configurado para os elementos. Pode passar, como segundo parâmetro, o prefixName |
Exemplos:
```javascript
if ($("#cnh").fluigFormAttachment("hasAttachment")) {
// Exemplo: habilitar outro campo de preenchimento
}
function beforeSendValidate(numState, nextState) {
if (!$("#cnh").fluigFormAttachment("isValid")) {
throw "O Anexo da CNH não foi enviado corretamente. Remova-o e envie novamente";
}
}
// Removendo anexos da Pai Filho ao excluir linha
$("#tabelaPaiFilho").on("click", ".removeItem", function() {
$(".anexos", $(this).closest("tr")).fluigFormAttachment("deleteAttachment");
fnWdkRemoveChild(this);
});
// Habilitando/Desabilitando a ação de acordo com o preenchimento de um campo
$("#descricao").on("change", function () {
this.value = this.value.trim();
if (!this.value.length) {
$("#anexo").fluigFormAttachment("hideActionButton");
return;
}
// Trocando o filename pra ser dinâmico com a descrição
// Caso exista uma descrição igual nos anexos exibirá erro
// no momento de selecionar o arquivo.
$("#anexo")
.data("filename", this.value)
.fluigFormAttachment("showActionButton")
;
// Altera o filename igual ao exemplo anterior
$("#anexo").fluigFormAttachment("filename", this.value).fluigFormAttachment("showActionButton");
// Altera prefixName no componente
$("#anexo").fluigFormAttachment("prefixName", true);
// ou
$("#anexo").fluigFormAttachment("prefixName", "novoprefixo");
});
```
## Contribuições
Sinta-se à vontade para indicar bugs e sugestões abrindo issues.

View File

@ -0,0 +1,138 @@
<html>
<head>
<link type="text/css" rel="stylesheet" href="/style-guide/css/fluig-style-guide.min.css" />
<script type="text/javascript" src="/portal/resources/js/jquery/jquery.js"></script>
<script type="text/javascript" src="/portal/resources/js/jquery/jquery-ui.min.js"></script>
<script type="text/javascript" src="/portal/resources/js/mustache/mustache-min.js"></script>
<script type="text/javascript" src="/style-guide/js/fluig-style-guide.min.js" charset="utf-8"></script>
<script type="text/javascript" src="./fluigFormAttachment.js"></script>
<link type="text/css" rel="stylesheet" href="./assets/css/checklist.css" />
</head>
<body>
<div class="fluig-style-guide">
<form name="form" role="form">
<div class="container-fluid audit-shell">
<div class="audit-status">
<span class="status-pill" id="profileBadge">Perfil: Loja</span>
<span class="status-pill" id="progressBadge">Evidências: 0/0</span>
</div>
<h1 class="audit-main-title">Checklist de Auditoria dos Pilares</h1>
<section class="audit-section intro-data-section">
<div class="instruction-section">
<div class="instruction-copy">
<div class="instruction-head">
<div class="instruction-icon">i</div>
<div class="instruction-title">Envie as fotos dos pilares</div>
</div>
<div class="instruction-steps">
<span>1. Clique em um <strong>PILAR</strong></span>
<span>3. Clique em <strong>ANEXAR</strong> para enviar a foto solicitada</span>
<span>5. Envie para concluir</span>
<span>2. Verifique as <strong>INSTRUÇÕES</strong></span>
<span>4. Confira em <strong>VISUALIZAR</strong></span>
</div>
</div>
</div>
<div class="intro-divider"></div>
<div class="audit-context-card">
<div class="section-title">Dados da Auditoria</div>
<div class="row audit-context-row">
<div class="col-md-3 col-sm-6">
<label class="audit-label" for="loja">Loja</label>
<input type="text" class="form-control audit-input" name="loja" id="loja" />
</div>
<div class="col-md-3 col-sm-6">
<label class="audit-label" for="auditor">Analista</label>
<input type="text" class="form-control audit-input" name="auditor" id="auditor" />
</div>
<div class="col-md-2 col-sm-4">
<label class="audit-label" for="dataAuditoria">Data</label>
<input type="date" class="form-control audit-input" name="dataAuditoria" id="dataAuditoria" />
</div>
<div class="col-md-2 col-sm-4">
<label class="audit-label" for="ciclo">Ciclo</label>
<input type="text" class="form-control audit-input" name="ciclo" id="ciclo" placeholder="Ex: 2026-03" />
</div>
<div class="col-md-2 col-sm-4">
<label class="audit-label" for="regional">Regional</label>
<input type="text" class="form-control audit-input" name="regional" id="regional" />
</div>
</div>
</div>
</section>
<div class="nc-box" id="naoConformeBox" style="display:none;">
<div class="nc-title">Pendências para correção</div>
<div class="nc-list" id="naoConformeList"></div>
</div>
<section class="audit-section progress-section">
<h2 class="section-title">Progresso da Auditoria</h2>
<div class="progress-inline">
<div class="progress-track">
<div class="progress-fill" id="globalProgressFill"></div>
</div>
<div class="progress-percent" id="globalProgressPercent">0%</div>
</div>
<div class="progress-meta" id="globalProgressMeta">0 de 0 fotos enviadas</div>
</section>
<div class="row audit-card">
<div class="col-md-3">
<div class="panel panel-default">
<div class="panel-body">
<div class="audit-score" id="scoreFinal">0%</div>
<small>Score final</small>
</div>
</div>
</div>
<div class="col-md-3">
<div class="panel panel-default">
<div class="panel-body">
<div class="audit-score" id="pontosObtidos">0</div>
<small>Pontos obtidos</small>
</div>
</div>
</div>
<div class="col-md-3">
<div class="panel panel-default">
<div class="panel-body">
<div class="audit-score" id="pontosPossiveis">0</div>
<small>Pontos possíveis</small>
</div>
</div>
</div>
<div class="col-md-3">
<div class="panel panel-default">
<div class="panel-body">
<div class="audit-score" id="classificacao">-</div>
<small>Classificação</small>
</div>
</div>
</div>
</div>
<h2 class="section-title pilares-title">Pilares Analisados</h2>
<div class="row">
<div class="col-md-12" id="pilaresContainer"></div>
</div>
<div class="audit-send-wrap">
<button type="button" class="btn btn-primary audit-send-btn" id="btnEnviarForm">Finalizar</button>
</div>
<input type="hidden" name="auditoriaPayload" id="auditoriaPayload" />
<input type="hidden" name="temNaoConforme" id="temNaoConforme" value="false" />
<input type="hidden" name="qtdNaoConforme" id="qtdNaoConforme" value="0" />
<input type="hidden" name="listaNaoConforme" id="listaNaoConforme" value="" />
<input type="hidden" name="saidaAnalise" id="saidaAnalise" value="CONFORME" />
<input type="hidden" name="usuarioRetorno" id="usuarioRetorno" value="" />
</div>
</form>
</div>
<script type="text/javascript" src="./assets/js/checklist.js"></script>
</body>
</html>

View File

@ -0,0 +1,585 @@
body { background: #ffffff; }
.audit-shell {
background: #f4f8fd;
border: 1px solid #dbe4ee;
border-radius: 14px;
box-shadow: 0 4px 14px rgba(15, 23, 42, 0.06);
padding: 10px 10px 14px 10px;
margin: 14px auto 0 auto;
max-width: 1140px;
}
.audit-section {
border: 1px solid #e2e8f0;
border-radius: 14px;
background: #ffffff;
padding: 12px;
margin-bottom: 10px;
box-shadow: 0 2px 6px rgba(15, 23, 42, 0.05);
}
h1.audit-main-title {
margin: 2px 0 10px 0;
font-size: 18px !important;
line-height: 1.2;
font-weight: 700 !important;
color: #ffffff !important;
background: #0b556b;
border-radius: 10px;
padding: 8px 12px;
}
.section-title {
margin: 0 0 10px 0;
font-size: 20px;
font-weight: 700;
color: #1e293b;
}
.audit-status {
display: none;
}
.progress-section {
padding: 5px 10px 5px 10px;
margin-top: 2px;
}
.progress-section .section-title {
font-size: 16px;
margin-bottom: 6px;
}
.audit-context-card .section-title {
font-size: 17px;
}
.progress-inline {
display: grid;
grid-template-columns: 1fr auto;
gap: 16px;
align-items: center;
}
.progress-track {
width: 100%;
height: 5px;
border-radius: 999px;
background: #e6ebf2;
overflow: hidden;
}
.progress-fill {
width: 0%;
height: 100%;
background: linear-gradient(90deg, #3ea9c8 0%, #3ea9c8 100%);
transition: width .18s ease-in-out;
}
.progress-percent {
font-size: 14px;
line-height: 1;
color: #0f172a;
font-weight: 700;
min-width: 42px;
text-align: right;
}
.progress-meta {
margin-top: 3px;
font-size: 9px;
color: #52637b;
font-weight: 600;
}
.instruction-section {
display: block;
background: #ffffff;
}
.intro-data-section {
padding: 0;
overflow: hidden;
background: linear-gradient(90deg, #f4f8fd 0%, #edf3fa 100%);
}
.intro-data-section .instruction-section {
padding: 12px;
border-radius: 14px 14px 0 0;
background: #ffffff;
}
.intro-divider {
height: 1px;
background: #dfe7f0;
}
.instruction-head {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 6px;
}
.instruction-icon {
width: 34px;
height: 34px;
border-radius: 999px;
background: #3ea9c8;
color: #fff;
font-size: 22px;
font-weight: 700;
line-height: 34px;
text-align: center;
}
.instruction-title {
font-size: 16px;
color: #1f2f46;
font-weight: 700;
margin-bottom: 0;
}
.instruction-steps {
display: grid;
grid-template-columns: repeat(3, minmax(160px, 1fr));
gap: 6px 16px;
font-size: 10px;
color: #334155;
line-height: 1.3;
}
.instruction-steps span {
display: inline-block;
border: 1px solid #b9d4ea;
background: #f4f9ff;
color: #0f3f66;
border-radius: 999px;
padding: 4px 9px;
width: fit-content;
}
.status-pill {
background: #eef5fb;
border: 1px solid #d9e8f6;
color: #0b556b;
border-radius: 999px;
padding: 6px 10px;
font-size: 12px;
font-weight: 600;
}
.audit-context-card {
background: #ffffff;
padding: 12px;
border-radius: 0 0 14px 14px;
}
.audit-context-row > div {
margin-bottom: 8px;
}
.audit-label {
font-size: 12px;
letter-spacing: 0.3px;
color: #16486a;
margin-bottom: 4px;
font-weight: 700;
}
.label-icon { opacity: 0.8; margin-right: 4px; }
.audit-input {
height: 32px;
font-size: 12px;
border-color: #c9d7e7;
border-radius: 7px;
padding: 5px 9px;
}
.audit-input:focus {
border-color: #74a5d3;
box-shadow: 0 0 0 2px rgba(34, 93, 143, 0.12);
}
.audit-card { margin-top: 12px; }
.audit-score { font-size: 22px; font-weight: 700; }
.audit-score small { font-size: 12px; font-weight: 400; color: #7f8c8d; display: block; }
#pilaresContainer {
display: grid;
grid-template-columns: repeat(4, minmax(220px, 1fr));
gap: 14px;
background: #f4f8fd;
border: 0;
border-radius: 10px;
padding: 8px 12px 10px 12px;
}
h2.section-title.pilares-title {
margin-top: 4px;
margin-bottom: 10px;
font-size: 17px !important;
}
.audit-send-wrap {
margin-top: 10px;
text-align: right;
padding: 10px 12px 2px 12px;
border-top: 1px solid #dbe5f0;
}
.audit-send-btn {
min-width: 120px;
height: 38px;
border-radius: 8px;
font-size: 14px;
font-weight: 700;
background: #0b556b;
border-color: #0b556b;
}
.audit-send-btn:hover,
.audit-send-btn:focus {
background: #0a4b5f;
border-color: #0a4b5f;
}
.pilar-panel {
border: 1px solid #d6e1ee;
border-radius: 12px;
background: #ffffff;
padding: 8px;
min-height: 108px;
box-shadow: 0 6px 14px rgba(15, 23, 42, 0.08);
transition: box-shadow .18s ease, transform .18s ease;
}
.pilar-panel:hover {
box-shadow: 0 10px 20px rgba(15, 23, 42, 0.12);
transform: translateY(-1px);
}
.pilar-panel.is-open {
grid-column: 1 / -1;
box-shadow: 0 12px 24px rgba(15, 23, 42, 0.14);
}
.pilar-summary-card {
grid-column: span 3;
border: 1px solid #d6e1ee;
border-radius: 12px;
background: #ffffff;
padding: 10px 12px;
box-shadow: 0 6px 14px rgba(15, 23, 42, 0.08);
}
.summary-title {
font-size: 13px;
font-weight: 700;
color: #000000;
margin-bottom: 8px;
}
.summary-item {
font-size: 12px;
line-height: 1.45;
color: #000000;
margin-bottom: 6px;
}
.summary-item:last-child {
margin-bottom: 0;
}
.summary-name {
color: #000000;
font-weight: 700;
}
.pilar-head {
background: #ffffff;
border: 0;
padding: 6px;
display: grid;
gap: 6px;
cursor: pointer;
border-radius: 10px;
transition: background .15s ease, border-color .15s ease, box-shadow .15s ease, transform .15s ease;
}
.pilar-head:hover {
background: #f8fbff;
box-shadow: none;
transform: none;
}
.pilar-head.is-open {
background: #f4f8fd;
box-shadow: none;
}
.pilar-title-row {
display: flex;
align-items: center;
gap: 10px;
}
.pilar-state-dot {
width: 18px;
height: 18px;
border-radius: 999px;
background: #94a3b8;
border: 1px solid rgba(148, 163, 184, 0.25);
display: inline-flex;
align-items: center;
justify-content: center;
color: #ffffff;
font-size: 11px;
font-weight: 700;
line-height: 1;
}
.pilar-state-dot.state-pending { background: #dc2626; border-color: rgba(220, 38, 38, 0.4); }
.pilar-state-dot.state-progress { background: #d18a2f; border-color: rgba(209, 138, 47, 0.35); }
.pilar-state-dot.state-done { background: #2f9d78; border-color: rgba(47, 157, 120, 0.35); }
.pilar-title {
font-size: 13px;
font-weight: 700;
color: #000000;
letter-spacing: 0.2px;
}
.pilar-photo-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
color: #243549;
}
.pilar-photo-count {
font-size: 10px;
font-weight: 700;
color: #000000;
}
.pilar-missing {
font-size: 10px;
color: #000000;
font-weight: 600;
}
.pilar-mini-track {
height: 5px;
border-radius: 999px;
background: #e4eaf1;
overflow: hidden;
}
.pilar-mini-fill {
display: block;
width: 0%;
height: 100%;
border-radius: inherit;
background: #5d8fbe;
transition: width .18s ease;
}
.pilar-foot {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.pilar-count {
font-size: 10px;
color: #000000;
font-weight: 600;
}
.pilar-open-cta {
font-size: 10px;
color: #000000;
font-weight: 700;
}
.pilar-body { padding: 8px 0 0 0; }
.audit-row {
border: 1px solid #d4e0ee;
border-radius: 12px;
padding: 10px;
margin-bottom: 8px;
background: #f9fcff;
}
.audit-row-main {
display: flex;
flex-direction: column;
gap: 8px;
}
.audit-row-top {
display: grid;
grid-template-columns: 1fr 1.3fr;
gap: 10px;
align-items: start;
}
.audit-row[data-max-fotos="1"] .audit-row-top,
.audit-row[data-max-fotos="2"] .audit-row-top {
grid-template-columns: 1fr;
}
.audit-info {
min-width: 0;
}
.indicador-cell { font-weight: 700; color: #143653; font-size: 15px; line-height: 1.25; }
.indicador-help {
margin-top: 5px;
font-size: 12px;
color: #5c6f82;
line-height: 1.35;
background: #f7fbff;
border: 1px solid #dce8f5;
border-radius: 8px;
padding: 7px 9px;
}
.indicador-help ul {
margin: 0;
padding-left: 18px;
}
.indicador-help li {
margin: 2px 0;
}
.indicador-help .indicador-group {
list-style: none;
margin-top: 6px;
margin-left: -18px;
font-weight: 700;
color: #36597b;
}
.meta-grid {
display: grid;
grid-template-columns: repeat(5, minmax(100px, 1fr));
gap: 10px;
}
.meta-box {
border: 1px solid #d7e2ef;
border-radius: 10px;
background: #fff;
padding: 8px 10px;
min-height: 62px;
}
.meta-label { font-size: 11px; color: #64748b; text-transform: uppercase; }
.meta-value { font-size: 20px; color: #1f2937; margin-top: 4px; font-weight: 600; }
.meta-value .form-control {
font-size: 14px;
height: 34px;
padding: 4px 10px;
}
.anexo-wrap, .resultado-wrap, .just-wrap { margin-top: 0; }
.penalidade-badge {
font-size: 10px !important;
font-weight: 700;
padding: 2px 8px !important;
border-radius: 999px;
letter-spacing: 0.2px;
text-transform: uppercase;
}
.penalidade-badge.label-danger { background: #f7dada; color: #9f2d2d; }
.penalidade-badge.label-warning { background: #fff0c7; color: #8a5a00; }
.penalidade-badge.label-info { background: #dceefe; color: #1f5f9b; }
.penalidade-badge.label-success { background: #dff5e4; color: #1f7a3d; }
.penalidade-badge.label-default { background: #eceff3; color: #5f6b7a; }
.anexos-cell {
background: #edf4fb;
border: 1px solid #cfe0f3;
border-radius: 10px;
padding: 8px;
}
.anexo-auto-hint { font-size: 11px; color: #5f7d9a; margin-top: 5px; }
.anexo-progress {
margin-top: 7px;
font-size: 12px;
color: #2d4f70;
font-weight: 600;
}
.anexo-progress-count {
display: inline-block;
min-width: 40px;
text-align: center;
border-radius: 999px;
background: #d9e9fa;
color: #1d4f7c;
padding: 1px 8px;
margin-right: 4px;
}
.anexo-multi-list {
display: grid;
grid-template-columns: repeat(2, minmax(220px, 1fr));
gap: 7px;
}
.audit-row[data-max-fotos="1"] .anexo-multi-list,
.audit-row[data-max-fotos="2"] .anexo-multi-list {
grid-template-columns: 1fr;
}
.anexo-slot {
background: #ffffff;
border: 1px solid #c9dbef;
border-radius: 8px;
padding: 5px;
}
.audit-row[data-max-fotos="1"] .anexo-slot,
.audit-row[data-max-fotos="2"] .anexo-slot {
max-width: 100%;
}
.anexo-slot.slot-filled {
border-color: #8fc1a3;
box-shadow: inset 0 0 0 1px rgba(79, 161, 109, 0.2);
}
.anexo-slot.extra-slot { display: none; }
.anexo-multi-list.expanded .anexo-slot.extra-slot { display: block; }
.anexo-slot-label {
font-size: 11px;
color: #4b5f74;
margin-bottom: 3px;
font-weight: 600;
text-transform: uppercase;
}
.anexo-toggle-wrap {
margin-top: 8px;
text-align: right;
}
.anexo-toggle {
font-size: 12px;
font-weight: 600;
color: #24557d !important;
border-color: #b5cbe3;
background: #f4f8fd;
padding: 3px 10px;
}
.anexos-cell .fluigFormAttachmentComponent {
width: 100%;
}
.anexos-cell .fluigFormAttachmentComponent input {
height: 34px;
border-color: #c7d8ec;
background: #fff;
}
.anexos-cell .fluigFormAttachmentComponent .btn {
height: 34px !important;
min-width: 40px;
}
.just-wrap input {
border-radius: 10px;
}
.audit-row-target { background: #fff8e6 !important; }
.nc-box {
border: 1px solid #f5d0d0;
background: #fff6f6;
border-radius: 10px;
padding: 10px 12px;
margin-top: 10px;
}
.nc-title {
font-weight: 700;
color: #9f2d2d;
margin-bottom: 6px;
}
.nc-list {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.nc-item {
background: #fff;
border: 1px solid #f1b7b7;
color: #7f1d1d;
border-radius: 999px;
padding: 4px 10px;
font-size: 12px;
cursor: pointer;
}
.anexo-view { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.anexo-thumb-inline {
width: 34px;
height: 34px;
object-fit: cover;
border: 1px solid #ddd;
border-radius: 4px;
background: #fff;
}
.anexo-file {
font-size: 11px;
max-width: 170px;
display: inline-block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
border: 1px solid #e0e0e0;
border-radius: 4px;
padding: 4px 6px;
background: #fafafa;
}
.anexo-text {
background: #fff;
font-size: 12px;
}
@media (max-width: 900px) {
.section-title { font-size: 22px; }
.progress-percent { font-size: 14px; min-width: 38px; }
.progress-meta { font-size: 14px; }
.instruction-title { font-size: 16px; }
.instruction-steps { grid-template-columns: 1fr; font-size: 14px; }
.audit-label { font-size: 13px; }
.audit-input { height: 40px; font-size: 15px; }
.audit-row-top { grid-template-columns: 1fr; }
.meta-grid { grid-template-columns: repeat(2, minmax(100px, 1fr)); }
.anexo-multi-list { grid-template-columns: 1fr; }
#pilaresContainer { grid-template-columns: repeat(2, minmax(180px, 1fr)); }
.pilar-panel.is-open { grid-column: auto; }
.pilar-summary-card { grid-column: span 2; }
.audit-send-wrap { padding: 8px 0 0 0; border-top: 0; }
.audit-send-btn { width: 100%; }
}

View File

@ -0,0 +1,859 @@
var INDICADORES = [
{ pilar: "PILAR ARQUITETURA", indicador: "Fotos da Fachada (letreiro luminoso com acessibilidade)", penalidade: "GRAVISSIMA", peso: 4, maxFotos: 1 },
{ pilar: "PILAR ARQUITETURA", indicador: "Fotos de todos equipamentos", detalhe: "Mobiliario, gondolas, tela digital, caixa, mesas, cavalete, baianas e coringa.", penalidade: "GRAVE", peso: 3, maxFotos: 8 },
{ pilar: "PILAR ARQUITETURA", indicador: "Fotos da iluminacao (luzes da vitrine e interior da loja)", penalidade: "GRAVE", peso: 3, maxFotos: 2 },
{ pilar: "PILAR ARQUITETURA", indicador: "Foto do coletor de embalagem (Botirecicla)", penalidade: "MEDIA", peso: 2, maxFotos: 1 },
{ pilar: "PILAR ARQUITETURA", indicador: "Fotos dos mobshops da loja", penalidade: "MEDIA", peso: 2, maxFotos: 2 },
{ pilar: "PILAR VISUAL MERCHANDISING", indicador: "Foto da vitrine (identificando todas comunicacoes)", penalidade: "GRAVE", peso: 3, maxFotos: 1 },
{ pilar: "PILAR VISUAL MERCHANDISING", indicador: "Fotos enquadrando cada sessao", detalhe: "Feminina, masculina, infantil, cuidados, cabelos, presentes e maquiagem.", penalidade: "GRAVE", peso: 3, maxFotos: 7 },
{ pilar: "PILAR VISUAL MERCHANDISING", indicador: "Fotos das comunicacoes destaques e storytelling", detalhe: "Feminina, masculina e cuidados.", penalidade: "GRAVE", peso: 3, maxFotos: 3 },
{ pilar: "PILAR VISUAL MERCHANDISING", indicador: "Foto das embalagens", penalidade: "MEDIA", peso: 2, maxFotos: 1 },
{ pilar: "PILAR VISUAL MERCHANDISING", indicador: "Foto do QR-Code de politica de privacidade", penalidade: "GRAVISSIMA", peso: 4, maxFotos: 1 },
{ pilar: "PILAR VISUAL MERCHANDISING", indicador: "Foto do codigo de defesa do consumidor", penalidade: "GRAVISSIMA", peso: 4, maxFotos: 1 },
{ pilar: "PILAR VISUAL MERCHANDISING", indicador: "Foto do verso da tela digital", penalidade: "GRAVE", peso: 3, maxFotos: 1 },
{ pilar: "PILAR EXPOSIÇÃO", indicador: "Fotos das datas de validade dos produtos", detalheBullets: [
"# Produtos O Boticario",
"Cooffe Woman",
"Linha Casa 214",
"5 itens da linha Botik",
"Dr. Botica",
"Portinari",
"Celebre",
"Floratta",
"Arbo",
"Shampoo e Condicionador - Linha Match",
"5 provadores de Make B",
"5 provadores da linha Intense",
"# Produtos QDB?",
"2 itens da linha Instamatte",
"Protetor solar facial",
"Corretivo liquido",
"Mascara para cilios",
"10 batons hidratantes",
"Shampoo e Condicionador Au.migos"
], penalidade: "GRAVISSIMA", peso: 4, maxFotos: 22 },
{ pilar: "PILAR EXPOSIÇÃO", indicador: "Foto dos aplicadores descartaveis", penalidade: "MEDIA", peso: 2, maxFotos: 1 },
{ pilar: "PILAR EXPOSIÇÃO", indicador: "Foto da exposição da sessão Make.B", penalidade: "GRAVE", peso: 3, maxFotos: 1 },
{ pilar: "PILAR EXPOSIÇÃO", indicador: "Foto da exposição da sessão Intense", penalidade: "GRAVE", peso: 3, maxFotos: 1 },
{ pilar: "PILAR UNIFORME", indicador: "Fotos dos uniformes (do pescoco para baixo)", penalidade: "GRAVE", peso: 3, maxFotos: 2 },
{ pilar: "PILAR INFORMATIVA", indicador: "Foto do espaco onde ficam os produtos destinados a logistica", penalidade: "NAO PONTUA", peso: 0, maxFotos: 1 }
];
var FATORES = {
"CONFORME": 1,
"NAO_CONFORME": 0
};
var ALLOWED_EXT = { "pdf": true, "jpg": true, "jpeg": true, "png": true };
var REQUIRE_ATTACHMENT = false; // mude para true para voltar a exigir anexo
var CURRENT_PROFILE = "LOJA";
var KNOWN_ATTACHMENT_KEYS = {};
// Ajuste os codigos de atividade do seu processo aqui.
var FLOW_CONFIG = {
lojaStates: [0, 4],
analistaStates: [5]
};
function badgeClass(penalidade) {
if (penalidade === "GRAVISSIMA") return "danger";
if (penalidade === "GRAVE") return "warning";
if (penalidade === "MEDIA") return "info";
if (penalidade === "LEVE") return "default";
return "primary";
}
function getClassificacao(score) {
if (score >= 90) return "Excelente";
if (score >= 80) return "Bom";
if (score >= 70) return "Regular";
return "Critico";
}
function toTitleCase(text) {
var s = String(text || "").toLowerCase().trim();
if (!s) return "";
var words = s.split(/\s+/);
for (var i = 0; i < words.length; i++) {
var w = words[i];
if (!w) continue;
words[i] = w.charAt(0).toUpperCase() + w.slice(1);
}
return words.join(" ");
}
function indicadorCountLabel(n) {
return n === 1 ? "1 indicador" : (n + " indicadores");
}
function renderDetalhe(item) {
if (Array.isArray(item.detalheBullets) && item.detalheBullets.length) {
var html = "<div class='indicador-help'><ul>";
for (var i = 0; i < item.detalheBullets.length; i++) {
var txt = String(item.detalheBullets[i] || "");
if (txt.indexOf("# ") === 0) {
html += "<li class='indicador-group'>" + escapeHtml(txt.substring(2)) + "</li>";
} else {
html += "<li>" + escapeHtml(txt) + "</li>";
}
}
html += "</ul></div>";
return html;
}
if (item.detalhe) {
return "<div class='indicador-help'>" + escapeHtml(item.detalhe) + "</div>";
}
return "";
}
function getResumoPilaresHtml() {
var rows = [
{ nome: "Arquitetura", texto: "Fachada da loja e estrutura física, evidenciando marca, iluminação, acessibilidade, equipamentos e estado geral do ambiente." },
{ nome: "Visual Merchandising", texto: "Vitrine e área interna com comunicação vigente, padrão visual, organização, embalagens corretas e bom estado dos materiais." },
{ nome: "Exposição", texto: "Exposição de produtos em vitrine e interior, com precificação, validade visível, testes, preenchimento de prateleiras e uso de aplicadores." },
{ nome: "Uniforme", texto: "Equipe em atendimento com uso correto de uniforme, calçados e acessórios conforme padrão estabelecido." },
{ nome: "Informativa", texto: "Ambiente com foco em informações operacionais, logística reversa, armazenamento de materiais e comunicação de serviços." }
];
var html = "<div class='pilar-summary-card'><div class='summary-title'>Guia dos Pilares</div>";
for (var i = 0; i < rows.length; i++) {
html += "<div class='summary-item'><span class='summary-name'>" + escapeHtml(rows[i].nome) + ":</span> " + escapeHtml(rows[i].texto) + "</div>";
}
html += "</div>";
return html;
}
function buildAnexoInputs(index, maxFotos) {
var total = parseInt(maxFotos, 10);
if (isNaN(total) || total < 1) total = 1;
var html = "<div class='anexo-multi-list'>";
for (var i = 1; i <= total; i++) {
var anexoId = "anexo_" + index + "_" + i;
var anexoFileName = "EVID_" + index + "_F" + i;
var extraClass = i > 2 ? " extra-slot" : "";
html += ""
+ "<div class='anexo-slot" + extraClass + "'>"
+ "<div class='anexo-slot-label'>Foto " + i + " de " + total + "</div>"
+ "<input type='text' class='form-control anexo-plugin' readonly id='" + anexoId + "' name='" + anexoId + "' data-filename='" + anexoFileName + "' data-accept='image/*,.pdf' data-required='true' />"
+ "</div>";
}
html += "</div>";
if (total > 2) {
html += "<div class='anexo-toggle-wrap'><button type='button' class='btn btn-default btn-sm anexo-toggle' data-expanded='false' data-total='" + total + "'>Mostrar todas (" + total + ")</button></div>";
}
return html;
}
function buildAuditRow(item, index) {
var selectResultado = ""
+ "<select class='form-control resultado'>"
+ "<option value=''>Selecione</option>"
+ "<option value='CONFORME'>Conforme</option>"
+ "<option value='NAO_CONFORME'>Nao Conforme</option>"
+ "</select>";
var maxFotos = parseInt(item.maxFotos, 10);
if (isNaN(maxFotos) || maxFotos < 1) maxFotos = 1;
var anexosHtml = buildAnexoInputs(index, maxFotos);
return ""
+ "<div class='audit-row' data-pilar='" + escapeHtml(item.pilar) + "' data-indicador='" + escapeHtml(item.indicador) + "' data-penalidade='" + escapeHtml(item.penalidade) + "' data-max-fotos='" + maxFotos + "'>"
+ "<div class='audit-row-main'>"
+ "<div class='audit-row-top'>"
+ "<div class='audit-info'>"
+ "<div class='indicador-cell'>" + escapeHtml(item.indicador) + "</div>"
+ renderDetalhe(item)
+ "</div>"
+ "<div class='anexos-cell anexo-wrap'>"
+ anexosHtml
+ "<div class='anexo-progress'><span class='anexo-progress-count'>0/" + maxFotos + "</span> fotos enviadas</div>"
+ "<div class='anexo-auto-hint'>Use os botoes de upload/visualizar em cada foto.</div>"
+ "</div>"
+ "</div>"
+ "<div class='meta-grid col-analista'>"
+ "<div class='meta-box'><div class='meta-label'>Penalidade</div><div class='meta-value'><span class='label label-default penalidade-badge penalidade-status'>Aguardando</span></div></div>"
+ "<div class='meta-box'><div class='meta-label'>Peso</div><div class='meta-value'><span class='peso'>" + item.peso + "</span></div></div>"
+ "<div class='meta-box'><div class='meta-label'>Fator</div><div class='meta-value fator'>-</div></div>"
+ "<div class='meta-box'><div class='meta-label'>Pontuacao</div><div class='meta-value pontuacao'>0</div></div>"
+ "<div class='meta-box resultado-wrap'><div class='meta-label'>Resultado</div><div class='meta-value'>" + selectResultado + "</div></div>"
+ "</div>"
+ "<div class='just-wrap col-analista'><input type='text' class='form-control justificativa' placeholder='Obrigatoria se Nao Conforme' /></div>"
+ "</div>"
+ "</div>";
}
function montaTabela() {
var grupos = {};
for (var i = 0; i < INDICADORES.length; i++) {
var item = INDICADORES[i];
if (!grupos[item.pilar]) grupos[item.pilar] = [];
grupos[item.pilar].push(item);
}
var pilares = Object.keys(grupos);
var html = "";
var rowIndex = 1;
for (var p = 0; p < pilares.length; p++) {
var nomePilar = pilares[p];
var linhas = grupos[nomePilar];
var openStyle = " style='display:none;'";
var totalFotosPilar = 0;
for (var t = 0; t < linhas.length; t++) {
totalFotosPilar += parseInt(linhas[t].maxFotos, 10) || 0;
}
html += "<div class='pilar-panel'>";
html += "<div class='pilar-head' data-target='pilarBody" + p + "' data-total-fotos='" + totalFotosPilar + "'>";
html += "<div class='pilar-title-row'><span class='pilar-state-dot state-pending' title='Nao iniciado'>✕</span><span class='pilar-title'>" + escapeHtml(toTitleCase(nomePilar.replace("PILAR ", ""))) + "</span></div>";
html += "<div class='pilar-photo-row'><span class='pilar-photo-count'>0/" + totalFotosPilar + " fotos</span><span class='pilar-missing'>" + totalFotosPilar + " faltando</span></div>";
html += "<div class='pilar-mini-track'><span class='pilar-mini-fill'></span></div>";
html += "<div class='pilar-foot'><span class='pilar-count'>" + indicadorCountLabel(linhas.length) + "</span><span class='pilar-open-cta'>Abrir Pilar →</span></div>";
html += "</div>";
html += "<div class='pilar-body' id='pilarBody" + p + "'" + openStyle + ">";
for (var r = 0; r < linhas.length; r++) {
html += buildAuditRow(linhas[r], rowIndex);
rowIndex++;
}
html += "</div></div>";
}
html += getResumoPilaresHtml();
$("#pilaresContainer").html(html);
}
function getExt(fileName) {
var n = (fileName || "").toLowerCase();
var pos = n.lastIndexOf(".");
return pos > -1 ? n.substring(pos + 1) : "";
}
function escapeHtml(text) {
return String(text || "")
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#39;");
}
function isImageExt(fileName) {
var ext = getExt(fileName);
return ext === "jpg" || ext === "jpeg" || ext === "png";
}
function getStateFromUrl(url) {
var u = String(url || "");
if (!u) return "";
var patterns = [
/(?:\?|&)WKNumState=(\d+)/i,
/(?:\?|&)state=(\d+)/i,
/(?:\?|&)stateSequence=(\d+)/i,
/(?:\?|&)choosedState=(\d+)/i,
/(?:\?|&)numState=(\d+)/i
];
for (var i = 0; i < patterns.length; i++) {
var m = u.match(patterns[i]);
if (m && m[1]) return m[1];
}
return "";
}
function getCurrentState() {
var candidates = [];
try {
candidates.push(window.WKNumState);
candidates.push(window.WKCurrentState);
candidates.push($("input[name='WKNumState']").val());
candidates.push($("input[name='WKCurrentState']").val());
candidates.push($("#WKNumState").val());
candidates.push($("#WKCurrentState").val());
candidates.push(getStateFromUrl(window.location && window.location.href));
} catch (e) {}
try {
if (window.parent) {
candidates.push(window.parent.WKNumState);
candidates.push(window.parent.WKCurrentState);
if (window.parent.$) {
candidates.push(window.parent.$("input[name='WKNumState']").val());
candidates.push(window.parent.$("input[name='WKCurrentState']").val());
candidates.push(window.parent.$("#WKNumState").val());
candidates.push(window.parent.$("#WKCurrentState").val());
}
candidates.push(getStateFromUrl(window.parent.location && window.parent.location.href));
}
} catch (e2) {}
for (var j = 0; j < candidates.length; j++) {
var parsed = parseInt(String(candidates[j] || "").trim(), 10);
if (!isNaN(parsed) && parsed > 0) return parsed;
}
return 0;
}
function resolveProfileByState(state) {
for (var i = 0; i < FLOW_CONFIG.analistaStates.length; i++) {
if (FLOW_CONFIG.analistaStates[i] === state) return "ANALISTA";
}
for (var j = 0; j < FLOW_CONFIG.lojaStates.length; j++) {
if (FLOW_CONFIG.lojaStates[j] === state) return "LOJA";
}
try {
var pageText = (
$("h1").first().text()
|| $(".page-header h1").first().text()
|| (window.parent && window.parent.$ ? window.parent.$("h1").first().text() : "")
|| ""
).toLowerCase();
if (pageText.indexOf("validar planograma") > -1) return "ANALISTA";
} catch (e) {}
return "LOJA";
}
function getCurrentUserCode() {
try {
if (window.WCMAPI && window.WCMAPI.userCode) return String(window.WCMAPI.userCode);
} catch (e) {}
try {
if (window.parent && window.parent.WCMAPI && window.parent.WCMAPI.userCode) {
return String(window.parent.WCMAPI.userCode);
}
} catch (e2) {}
return "";
}
function getNaoConformes() {
var list = [];
$(".audit-row").each(function () {
var $tr = $(this);
if ($tr.find(".resultado").val() === "NAO_CONFORME") {
list.push({
pilar: $tr.attr("data-pilar") || "",
indicador: $tr.attr("data-indicador") || ""
});
}
});
return list;
}
function renderNaoConformeResumo() {
var list = getNaoConformes();
var $box = $("#naoConformeBox");
var $list = $("#naoConformeList");
$list.empty();
if (!list.length) {
$box.hide();
return;
}
for (var i = 0; i < list.length; i++) {
var item = list[i] || {};
var pilar = item.pilar || "";
var indicador = item.indicador || "";
var texto = pilar ? (pilar + " - " + indicador) : indicador;
$list.append(
"<button type='button' class='nc-item' data-pilar='" + escapeHtml(pilar) + "' data-indicador='" + escapeHtml(indicador) + "'>"
+ escapeHtml(texto)
+ "</button>"
);
}
$box.show();
}
function applyProfileUI() {
var isAnalista = CURRENT_PROFILE === "ANALISTA";
$(".col-analista").toggle(isAnalista);
$(".audit-card").toggle(isAnalista);
$(".resultado").prop("disabled", !isAnalista);
$(".justificativa").prop("disabled", !isAnalista);
if (isAnalista) {
$(".anexo-auto-hint").hide();
} else {
$(".anexo-auto-hint").show();
}
applyAttachmentActionVisibility();
$("#profileBadge").text("Perfil: " + (isAnalista ? "Analista" : "Loja") + " (atividade " + getCurrentState() + ")");
}
function updateCompletionStatus() {
var total = 0;
var preenchidos = 0;
$(".anexo-plugin").each(function () {
total++;
var nome = ($(this).val() || "").trim();
if (nome) preenchidos++;
});
$("#progressBadge").text("Evidencias: " + preenchidos + "/" + total);
var perc = total > 0 ? Math.round((preenchidos / total) * 100) : 0;
$("#globalProgressFill").css("width", perc + "%");
$("#globalProgressPercent").text(perc + "%");
$("#globalProgressMeta").text(preenchidos + " de " + total + " fotos enviadas");
updatePilarProgress();
}
function updateRowAttachmentProgress($row) {
if (!$row || !$row.length) return;
var total = 0;
var preenchidos = 0;
$row.find(".anexo-slot").each(function () {
var $slot = $(this);
var nome = ($slot.find(".anexo-plugin").val() || "").trim();
total++;
var temAnexo = !!nome;
if (temAnexo) preenchidos++;
$slot.toggleClass("slot-filled", temAnexo);
});
$row.find(".anexo-progress-count").text(preenchidos + "/" + total);
}
function updatePilarProgress() {
$(".pilar-panel").each(function () {
var $panel = $(this);
var total = 0;
var preenchidos = 0;
$panel.find(".anexo-plugin").each(function () {
total++;
if (($(this).val() || "").trim()) preenchidos++;
});
var perc = total > 0 ? Math.round((preenchidos / total) * 100) : 0;
var faltantes = Math.max(0, total - preenchidos);
$panel.find(".pilar-photo-count").text(preenchidos + "/" + total + " fotos");
$panel.find(".pilar-missing").text(faltantes > 0 ? (faltantes + " faltando") : "100% concluido");
$panel.find(".pilar-mini-fill").css("width", perc + "%");
var $dot = $panel.find(".pilar-state-dot");
var cls = "state-pending";
var fillColor = "#9fb2c6";
var icon = "✕";
var dotTitle = "Nao iniciado";
if (total > 0 && preenchidos === total) {
cls = "state-done";
fillColor = "#2f9d78";
icon = "✓";
dotTitle = "Concluido";
} else if (preenchidos > 0) {
cls = "state-progress";
fillColor = "#d18a2f";
icon = "⚠";
dotTitle = "Em andamento";
}
$dot.removeClass("state-pending state-progress state-done").addClass(cls).text(icon).attr("title", dotTitle);
$panel.find(".pilar-mini-fill").css("background", fillColor);
});
}
function initAttachmentPlugin() {
if (typeof $.fn.fluigFormAttachment !== "function") {
FLUIGC.toast({
title: "Plugin:",
message: "fluigFormAttachment.js nao foi carregado.",
type: "warning"
});
return;
}
$(".anexo-plugin").each(function () {
var $f = $(this);
if ($f.data("ffaInit")) return;
$f.fluigFormAttachment();
$f.data("ffaInit", true);
});
}
function applyAttachmentActionVisibility() {
if (typeof $.fn.fluigFormAttachment !== "function") return;
var isAnalista = CURRENT_PROFILE === "ANALISTA";
$(".anexo-plugin").each(function () {
var $f = $(this);
if (!$f.data("ffaInit")) return;
if (isAnalista) {
$f.fluigFormAttachment("hideActionButton");
} else {
$f.fluigFormAttachment("showActionButton");
}
});
}
function findNativeSendButtons($root) {
var $all = $root.find("button, input[type='button'], input[type='submit'], a");
return $all.filter(function () {
var $el = $(this);
var txt = ($el.is("input") ? ($el.val() || "") : ($el.text() || "")).trim().toLowerCase();
if (!txt) return false;
return txt === "enviar" || txt.indexOf(" enviar") > -1 || txt.indexOf("enviar ") > -1;
});
}
function hideNativeSendButtons() {
try {
var $local = findNativeSendButtons($(document));
$local.not("#btnEnviarForm").css("display", "none");
$local.each(function () {
var $group = $(this).closest(".btn-group, .btn-toolbar, .btn-group-vertical, .dropup, .dropdown");
if ($group.length) {
$group.find(".dropdown-toggle, .btn.dropdown-toggle").css("display", "none");
}
});
} catch (e) {}
try {
if (window.parent && window.parent.document) {
var $parentDoc = $(window.parent.document);
var $parentBtns = findNativeSendButtons($parentDoc);
$parentBtns.css("display", "none");
$parentBtns.each(function () {
var $group = $(this).closest(".btn-group, .btn-toolbar, .btn-group-vertical, .dropup, .dropdown");
if ($group.length) {
$group.find(".dropdown-toggle, .btn.dropdown-toggle").css("display", "none");
}
});
// Fallback: oculta toggles "soltos" que sobram no split button.
$parentDoc.find(".dropdown-toggle, .btn.dropdown-toggle").filter(function () {
var txt = ($(this).text() || "").trim();
return txt === "" || txt === "▼" || txt === "▾" || txt === "v";
}).each(function () {
var $toggle = $(this);
var $group = $toggle.closest(".btn-group, .btn-toolbar, .btn-group-vertical, .dropup, .dropdown");
if (!$group.length) return;
var hasSendRef = findNativeSendButtons($group).length > 0;
if (hasSendRef) {
$toggle.css("display", "none");
}
});
}
} catch (e2) {}
}
function clickNativeSendButton() {
try {
var $parentDoc = window.parent && window.parent.document ? $(window.parent.document) : $();
var $native = findNativeSendButtons($parentDoc).first();
if ($native.length) {
$native.trigger("click");
return true;
}
} catch (e) {}
try {
var $local = findNativeSendButtons($(document)).not("#btnEnviarForm").first();
if ($local.length) {
$local.trigger("click");
return true;
}
} catch (e2) {}
return false;
}
function syncPayload() {
var rows = [];
var naoConformeList = [];
$(".audit-row").each(function () {
var $tr = $(this);
var peso = parseFloat($tr.find(".peso").text()) || 0;
var resultado = $tr.find(".resultado").val();
var fator = FATORES[resultado];
var pontuacao = (typeof fator === "number") ? (peso * fator) : null;
var anexos = [];
$tr.find(".anexo-plugin").each(function () {
var nome = ($(this).val() || "").trim();
anexos.push(nome);
});
var anexosPreenchidos = [];
for (var a = 0; a < anexos.length; a++) {
if (anexos[a]) anexosPreenchidos.push(anexos[a]);
}
var indicador = $tr.attr("data-indicador") || "";
if (resultado === "NAO_CONFORME") {
naoConformeList.push(indicador);
}
rows.push({
pilar: $tr.attr("data-pilar") || "",
indicador: indicador,
penalidade: $tr.attr("data-penalidade") || "",
peso: peso,
resultado: resultado || "",
fator: (typeof fator === "number") ? fator : null,
pontuacao: pontuacao,
justificativa: ($tr.find(".justificativa").val() || "").trim(),
anexoSequence: "",
anexoKey: "",
anexoNome: anexosPreenchidos.length ? anexosPreenchidos[0] : "",
anexos: anexos,
qtdAnexosPreenchidos: anexosPreenchidos.length
});
updateRowAttachmentProgress($tr);
});
$("#qtdNaoConforme").val(String(naoConformeList.length));
$("#temNaoConforme").val(naoConformeList.length > 0 ? "true" : "false");
$("#listaNaoConforme").val(naoConformeList.join(" | "));
$("#saidaAnalise").val(naoConformeList.length > 0 ? "NAO_CONFORME" : "CONFORME");
$("#auditoriaPayload").val(JSON.stringify(rows));
updateCompletionStatus();
renderNaoConformeResumo();
}
function findRowByIndicador(indicador) {
var $found = $();
$(".audit-row").each(function () {
if ($(this).attr("data-indicador") === indicador) {
$found = $(this);
return false;
}
});
return $found;
}
function updatePenalidadeVisual($tr) {
var resultado = $tr.find(".resultado").val();
var penalidadeBase = ($tr.attr("data-penalidade") || "").trim();
var $badge = $tr.find(".penalidade-status");
var $justWrap = $tr.find(".just-wrap");
if (resultado === "CONFORME") {
$badge
.removeClass("label-danger label-warning label-info label-primary label-default")
.addClass("label-success")
.text("Conforme");
$justWrap.hide();
return;
}
if (resultado === "NAO_CONFORME") {
$badge
.removeClass("label-success label-danger label-warning label-info label-primary label-default")
.addClass("label-" + badgeClass(penalidadeBase))
.text(penalidadeBase || "Nao Conforme");
$justWrap.show();
return;
}
$badge
.removeClass("label-success label-danger label-warning label-info label-primary")
.addClass("label-default")
.text("Aguardando");
$justWrap.hide();
}
function restorePayload() {
var raw = ($("#auditoriaPayload").val() || "").trim();
if (!raw) return;
var data = [];
try {
data = JSON.parse(raw);
if (!Array.isArray(data)) return;
} catch (e) {
return;
}
for (var i = 0; i < data.length; i++) {
var saved = data[i];
var $tr = findRowByIndicador(saved.indicador);
if (!$tr.length) continue;
if (saved.resultado) $tr.find(".resultado").val(saved.resultado);
if (saved.justificativa) $tr.find(".justificativa").val(saved.justificativa);
if (Array.isArray(saved.anexos)) {
var $inputs = $tr.find(".anexo-plugin");
for (var k = 0; k < saved.anexos.length; k++) {
if (k >= $inputs.length) break;
if (saved.anexos[k]) {
$($inputs.get(k)).val(saved.anexos[k]).trigger("change");
}
}
} else if (saved.anexoNome) {
$tr.find(".anexo-plugin").first().val(saved.anexoNome).trigger("change");
}
updatePenalidadeVisual($tr);
}
}
function recalc() {
var pontosObtidos = 0;
var pontosPossiveis = 0;
$(".audit-row").each(function () {
var $tr = $(this);
var peso = parseFloat($tr.find(".peso").text()) || 0;
var resultado = $tr.find(".resultado").val();
var fator = FATORES[resultado];
var pontuacao = 0;
updatePenalidadeVisual($tr);
if (typeof fator === "number") {
pontuacao = peso * fator;
$tr.find(".fator").text(fator.toFixed(2));
$tr.find(".pontuacao").text(pontuacao.toFixed(2));
if (peso > 0) {
pontosPossiveis += peso;
pontosObtidos += pontuacao;
}
} else {
$tr.find(".fator").text("-");
$tr.find(".pontuacao").text("0");
}
});
var score = pontosPossiveis > 0 ? (pontosObtidos / pontosPossiveis) * 100 : 0;
$("#pontosObtidos").text(pontosObtidos.toFixed(2));
$("#pontosPossiveis").text(pontosPossiveis.toFixed(2));
$("#scoreFinal").text(score.toFixed(2) + "%");
$("#classificacao").text(getClassificacao(score));
}
function validarFormulario() {
var erros = [];
$(".audit-row").each(function (idx) {
var $tr = $(this);
var resultado = $tr.find(".resultado").val();
var justificativa = ($tr.find(".justificativa").val() || "").trim();
var $anexoInputs = $tr.find(".anexo-plugin");
var indicador = $tr.attr("data-indicador") || "";
var $resultadoCell = $tr.find(".resultado-wrap");
var $anexoCell = $tr.find(".anexo-wrap");
if (resultado === "NAO_CONFORME" && justificativa.length === 0) {
erros.push("Linha " + (idx + 1) + " (" + indicador + "): justificativa obrigatoria.");
$tr.find(".just-wrap").addClass("has-error");
} else {
$tr.find(".just-wrap").removeClass("has-error");
}
if (CURRENT_PROFILE === "ANALISTA") {
if (!resultado) {
erros.push("Linha " + (idx + 1) + " (" + indicador + "): selecione o resultado.");
$resultadoCell.addClass("has-error");
} else {
$resultadoCell.removeClass("has-error");
}
}
if (REQUIRE_ATTACHMENT) {
var hasErrorAnexo = false;
$anexoInputs.each(function () {
var $anexoInput = $(this);
var anexoNome = ($anexoInput.val() || "").trim();
var hasAttachment = anexoNome.length > 0;
var isValidAttachment = true;
if (typeof $.fn.fluigFormAttachment === "function" && $anexoInput.data("ffaInit")) {
try {
hasAttachment = $anexoInput.fluigFormAttachment("hasAttachment");
isValidAttachment = $anexoInput.fluigFormAttachment("isValid");
} catch (e) {}
}
if (!hasAttachment) {
hasErrorAnexo = true;
return false;
}
if (!isValidAttachment) {
hasErrorAnexo = true;
return false;
}
if (!ALLOWED_EXT[getExt(anexoNome)]) {
hasErrorAnexo = true;
return false;
}
});
if (hasErrorAnexo) {
erros.push("Linha " + (idx + 1) + " (" + indicador + "): revise os anexos obrigatorios (PDF/JPG/PNG).");
$anexoCell.addClass("has-error");
} else {
$anexoCell.removeClass("has-error");
}
} else {
$anexoCell.removeClass("has-error");
}
});
syncPayload();
if (erros.length > 0) {
FLUIGC.toast({
title: "Validacao:",
message: erros[0],
type: "warning"
});
return false;
}
return true;
}
$(document).ready(function () {
var wkState = getCurrentState();
CURRENT_PROFILE = resolveProfileByState(wkState);
if (!($("#usuarioRetorno").val() || "").trim()) {
$("#usuarioRetorno").val(getCurrentUserCode());
}
montaTabela();
initAttachmentPlugin();
restorePayload();
applyProfileUI();
recalc();
syncPayload();
$(".audit-row").each(function () {
updatePenalidadeVisual($(this));
});
$("#pilaresContainer").on("click", ".pilar-head", function () {
var target = $(this).attr("data-target");
var $head = $(this);
var $panel = $head.closest(".pilar-panel");
$("#" + target).stop(true, true).slideToggle(120, function () {
var isOpen = $(this).is(":visible");
$head.toggleClass("is-open", isOpen);
$panel.toggleClass("is-open", isOpen);
$head.find(".pilar-open-cta").text(isOpen ? "Fechar Pilar ↑" : "Abrir Pilar →");
});
});
$("#pilaresContainer").on("change", ".resultado", function () {
recalc();
syncPayload();
});
$("#pilaresContainer").on("change keyup", ".justificativa", function () {
syncPayload();
});
$("#pilaresContainer").on("change", ".anexo-plugin", function () {
syncPayload();
});
$("#pilaresContainer").on("click", ".anexo-toggle", function () {
var $btn = $(this);
var expanded = $btn.attr("data-expanded") === "true";
var total = parseInt($btn.attr("data-total"), 10) || 0;
var $wrap = $btn.closest(".anexos-cell");
var $list = $wrap.find(".anexo-multi-list").first();
if (expanded) {
$list.removeClass("expanded");
$btn.attr("data-expanded", "false").text("Mostrar todas (" + total + ")");
} else {
$list.addClass("expanded");
$btn.attr("data-expanded", "true").text("Mostrar menos");
}
});
$(document).on("click", ".nc-item", function () {
var pilar = $(this).attr("data-pilar") || "";
var indicador = $(this).attr("data-indicador") || "";
var $tr = $(".audit-row[data-pilar='" + pilar.replace(/'/g, "\\'") + "'][data-indicador='" + indicador.replace(/'/g, "\\'") + "']").first();
if (!$tr.length) {
$tr = findRowByIndicador(indicador);
}
if (!$tr.length) return;
$tr.addClass("audit-row-target");
setTimeout(function () { $tr.removeClass("audit-row-target"); }, 1600);
$("html, body").animate({ scrollTop: $tr.offset().top - 120 }, 250);
});
hideNativeSendButtons();
setTimeout(hideNativeSendButtons, 600);
$("#btnEnviarForm").on("click", function () {
if (!validarFormulario()) return;
var clicked = clickNativeSendButton();
if (!clicked) {
FLUIGC.toast({
title: "Envio:",
message: "Nao foi possivel acionar o botao nativo de Enviar.",
type: "warning"
});
}
});
window.beforeSendValidate = function () {
return validarFormulario();
};
});

View File

@ -0,0 +1,423 @@
/**
* Plugin JQuery para trabalhar com anexos nos formulários dentro do processo
*
* @author Bruno Gasparetto
* @see https://github.com/brunogasparetto/fluig-form-attachment
*/
/**
* Configurações
*
* @typedef AttachmentSettings
* @property {boolean} showActionButton Exibe o botão de upload/delete. True por padrão.
* @property {boolean} filename Nome que será salvo como descrição do Anexo.
* @property {boolean|string} prefixName Adiciona prefixo ao anexo. False por padrão, True para prefixo aleatório, String para prefixo fixo.
* @property {string} accept Tipos de arquivos aceitos. Segue a regra do accept do input tipo file.
*/
;(function ($) {
"use strict";
const pluginName = "fluigFormAttachment";
const deleteFileClassName = "BtnDeleteFile";
const uploadFileClassname = "BtnUploadFile";
const viewerFileClassname = "BtnViewerFile";
const compressedExtensions = [
'.7z', '.zip', '.rar', '.gz', '.tar', '.tbz2', '.tgz', '.bz2', '.lz', '.lz4','.txz',
'.xz', '.z', '.zst', '.zstd', '.war', '.ear', '.jar','.apk', '.arj', '.ace', '.cab',
];
const isString = item => typeof item === "string";
/**
* Procura o índice do anexo de acordo com sua descrição
*
* @param {string} filename
* @returns {number} -1 se não encontrar
*/
const attachmentFindIndex = (filename) => parent.ECM.attachmentTable.getData().findIndex(attachment => attachment.description === filename);
/**
* Configuração padrão
*
* @type {AttachmentSettings}
*/
const defaults = {
showActionButton: true,
filename: "Anexo",
prefixName: false,
accept: "*",
};
class Plugin {
/**
* @type {AttachmentSettings}
*/
#settings;
/**
* Elemento do arquivo. Pode ser um input ou span (no modo leitura).
*
* @type {JQuery<HTMLElement>}
*/
#input;
/**
* @type {JQuery<HTMLElement>}
*/
#container;
/**
* @type {string}
*/
#attachmentFilename;
/**
* @param {HTMLElement} element
* @param {AttachmentSettings} options
*/
constructor(element, options) {
// Garantir um ID para o Input
if (!element.id && element.nodeName.toLowerCase() === "input") {
element.id = FLUIGC.utilities.randomUUID();
}
this.#settings = $.extend({}, defaults, options);
this.#input = $(element);
this.#attachmentFilename = this.#input.val() || this.#input.text().trim();
this.#input
.prop("readonly", true)
.on("change", () => {
this.#attachmentFilename = this.#input.val();
this.#changeButtonsState();
})
.wrap(`<div class="${pluginName}Component"></div>`)
.after(`<div class="${pluginName}Component_buttons">${this.#getButtonsTemplate()}</div>`);
this.#container = this.#input.closest(`.${pluginName}Component`);
this.#container
.on("click", `.${pluginName}${deleteFileClassName}`, () => this.#confirmDeleteAttachment())
.on("click", `.${pluginName}${uploadFileClassname}`, () => this.#uploadAttachment())
.on("click", `.${pluginName}${viewerFileClassname}`, () => this.#viewAttachment())
;
}
/**
* Indica que o campo está válido
*
* Caso o campo possua algum valor é obrigatório que o anexo
* esteja na tabela de anexos.
*
* @returns {boolean}
*/
isValid() {
return this.#attachmentFilename.length
? this.hasAttachment()
: true
;
}
/**
* Indica se o anexo está na tabela de anexos
*
* @returns {boolean}
*/
hasAttachment() {
const filename = this.#attachmentFilename || this.#input.val() || this.#input.text().trim();
return filename.length > 0 && attachmentFindIndex(filename) !== -1;
}
/**
* Remove o anexo
*
* Método útil para excluir anexos em tabela Pai x Filho.
*/
deleteAttachment() {
const attachmentIndex = parent.ECM.attachmentTable.getData().findIndex(
attachment => attachment.description === this.#attachmentFilename
);
setTimeout(() => this.#input.val("").trigger("change"), 500);
if (attachmentIndex === -1) {
return;
}
parent.WKFViewAttachment.removeAttach([attachmentIndex]);
}
showActionButton() {
this.#settings.showActionButton = true;
this.#input.trigger("change");
}
hideActionButton() {
this.#settings.showActionButton = false;
this.#input.trigger("change");
}
filename(fileName, prefixName) {
if (fileName === undefined) {
return this.#input.data("filename") || this.#settings.filename;
}
this.#settings.filename = fileName;
this.#input.data("filename", fileName);
if (prefixName !== undefined) {
this.prefixName(prefixName);
}
}
prefixName(prefixName) {
if (prefixName === undefined) {
return this.#settings.prefixName;
}
this.#settings.prefixName = prefixName;
}
#getButtonsTemplate() {
const hasFileSelected = this.#attachmentFilename.length !== 0;
const canShowActionButton = this.#canDisplayActionButton();
return `<button type="button" class="${pluginName}BtnAction ${pluginName}${deleteFileClassName} btn btn-danger btn-sm ${(canShowActionButton && hasFileSelected) ? '' : 'hide'}" title="Remover Anexo"><i class="flaticon flaticon-trash icon-sm"></i></button>`
+ `<button type="button" class="${pluginName}BtnAction ${pluginName}${uploadFileClassname} btn btn-success btn-sm ${(canShowActionButton && !hasFileSelected) ? '' : 'hide'}" title="Enviar Anexo"><i class="flaticon flaticon-upload icon-sm"></i></button>`
+ `<button type="button" class="${pluginName}${viewerFileClassname} btn btn-info btn-sm ${hasFileSelected ? '' : 'hide'}" title="Visualizar Anexo"><i class="flaticon flaticon-view icon-sm"></i></button>`
;
}
#canDisplayActionButton() {
const element = this.#input.get(0);
return this.#settings.showActionButton
&& parent.ECM.workflowView.userPermissions.indexOf("P") >= 0
&& location.href.includes('ManagerMode')
&& !location.href.includes('token')
&& element.nodeName.toLowerCase() === "input"
&& !element.disabled
;
}
#changeButtonsState() {
const hasFileSelected = this.#attachmentFilename.length !== 0;
if (this.#canDisplayActionButton()) {
if (hasFileSelected) {
this.#container.find(`.${pluginName}${uploadFileClassname}`).addClass("hide");
this.#container.find(`.${pluginName}${deleteFileClassName}`).removeClass("hide");
} else {
this.#container.find(`.${pluginName}${deleteFileClassName}`).addClass("hide");
this.#container.find(`.${pluginName}${uploadFileClassname}`).removeClass("hide");
}
} else {
this.#container.find(`.${pluginName}BtnAction`).addClass("hide");
}
if (hasFileSelected) {
this.#container.find(`.${pluginName}${viewerFileClassname}`).removeClass("hide");
} else {
this.#container.find(`.${pluginName}${viewerFileClassname}`).addClass("hide");
}
}
#confirmDeleteAttachment() {
if (!this.#canDisplayActionButton()) {
return;
}
FLUIGC.message.confirm({
message: `Deseja remover o anexo <b>${this.#attachmentFilename}</b>?`,
title: 'Confirmação',
labelYes: 'Sim, quero remover',
labelNo: 'Não, quero cancelar',
}, result => {
if (!result) {
return;
}
this.deleteAttachment();
});
}
#uploadAttachment() {
if (!this.#canDisplayActionButton()) {
return;
}
let filename = this.#input.data("filename") || this.#settings.filename;
if (this.#settings.prefixName === true) {
filename = FLUIGC.utilities.randomUUID().substring(0, 9) + filename;
} else if (this.#settings.prefixName !== false && isString(this.#settings.prefixName)) {
filename = `${this.#settings.prefixName}-${filename}`;
}
// Evitar conflito de descrição do anexo
if (attachmentFindIndex(filename) !== -1) {
FLUIGC.toast({
title: "Atenção",
message: "Já existe um anexo com essa descrição",
type: "warning",
})
return;
}
parent.$("#ecm-navigation-inputFile-clone")
.attr({
"data-on-camera": "true",
"data-file-name-camera": filename,
"data-inputid": this.#input.attr("id"),
"data-filename": filename,
"multiple": false,
"accept": this.#input.data("accept") || this.#settings.accept,
})
.trigger("click")
;
}
#viewAttachment() {
const attachmentIndex = parent.ECM.attachmentTable.getData().findIndex(
attachment => attachment.description === this.#attachmentFilename
);
if (attachmentIndex === -1) {
FLUIGC.toast({
title: "Atenção",
message: "Anexo não encontrado",
type: "warning"
});
return;
}
const attachment = parent.ECM.attachmentTable.getRow(attachmentIndex);
const physicalFileName = String(
attachment.physicalFileName || attachment.fileName || attachment.name || ""
).toLowerCase();
const isCompressedFile = compressedExtensions.some(extension => physicalFileName.endsWith(extension));
if (attachment.documentId && !isCompressedFile) {
parent.WKFViewAttachment.openAttachmentView(parent.WCMAPI.userCode, attachment.documentId, attachment.version);
} else {
parent.WKFViewAttachment.downloadAttach([attachmentIndex]);
}
}
}
/**
* Instancia o Plugin ou executa algum método do plugin
*
* @param {AttachmentSettings|string} options
* @returns {undefined|boolean|void}
*/
$.fn[pluginName] = function (options) {
if (!parent.WKFViewAttachment || !parent.ECM || !parent.ECM.attachmentTable) {
console.error(`Plugin ${pluginName} executado fora de um processo.`)
return this;
}
// Executa o Método
if (isString(options)) {
const methodName = options;
const methodArgs = Array.prototype.slice.call(arguments, 1);
let returnedValue = undefined;
this.each(function () {
let pluginData = $.data(this, pluginName);
if (!pluginData) {
pluginData = new Plugin(this, {});
$.data(this, pluginName, pluginData);
}
if (!pluginData[methodName]) {
return;
}
returnedValue = pluginData[methodName](...methodArgs);
if (returnedValue !== undefined) {
return false;
}
});
return returnedValue !== undefined
? returnedValue
: this
;
}
return this.each(function () {
if (!$.data(this, pluginName)) {
$.data(this, pluginName, new Plugin(this, options));
}
});
};
if (!parent.WKFViewAttachment || !parent.ECM || !parent.ECM.attachmentTable) {
return;
}
const loading = FLUIGC.loading(window, {
title: "Aguarde",
textMessage: "Enviando arquivo",
})
$(() => {
// Oculta aba anexos
$("#tab-attachments", parent.document).hide();
parent.$("#ecm_navigation_fileupload")
.on(`fileuploadadd.${pluginName}`, function(e, data) {
// Impede abrir o Loading caso tenha erro no arquivo
const file = data.files[0];
if (parent.ECM.maxUploadSize > 0 && file.size >= (parent.ECM.maxUploadSize * 1024 * 1024)) {
return;
}
if (parent.ECM.newAttachmentsDocs.length
&& parent.ECM.newAttachmentsDocs.findIndex(attachment => attachment.name === file.name) !== -1
) {
return;
}
loading.show();
})
.on(`fileuploadfail.${pluginName}`, () => loading.hide())
.on(`fileuploaddone.${pluginName}`, function() {
// Atualiza o campo do arquivo caso o upload tenha ocorrido
loading.hide();
const btnUpload = parent.document.getElementById("ecm-navigation-inputFile-clone");
const filename = btnUpload.getAttribute("data-filename");
if (attachmentFindIndex(filename) === -1) {
return;
}
$(`#${btnUpload.getAttribute("data-inputid")}`).val(filename).trigger("change");
});
parent.$(document).on(`fileuploadstop.${pluginName}`, () => loading.hide());
});
$("head").append(`<style>
.${pluginName}Component { display: flex; align-items: center; flex-wrap: nowrap; }
.${pluginName}Component input { border-top-right-radius: 0 !important; border-bottom-right-radius: 0 !important; }
.${pluginName}Component_buttons { display: flex; align-items: center; justify-content: flex-end; }
.${pluginName}Component_buttons .btn { outline: none !important; outline-offset: unset !important; border-radius: 0 !important; height: 32px; }
</style>`);
}(jQuery));

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,155 @@
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_481" class="java.beans.XMLDecoder">
<object class="java.util.HashMap">
<void method="put">
<string>volume</string>
<array class="java.lang.String" length="1">
<void index="0">
<string>Default</string>
</void>
</array>
</void>
<void method="put">
<string>expediente</string>
<array class="java.lang.String" length="4">
<void index="0">
<string>Default</string>
</void>
<void index="1">
<string>Expediente BackOffice, Logística e Motorista</string>
</void>
<void index="2">
<string>Expediente Escritório Matriz</string>
</void>
<void index="3">
<string>Expediente Lojas</string>
</void>
</array>
</void>
<void method="put">
<string>mecanismo</string>
<array class="[Ljava.lang.Object;" length="12">
<void index="0">
<array class="java.lang.Object" length="2">
<void index="0">
<string>Atribuição por Associação</string>
</void>
<void index="1">
<string>Associado</string>
</void>
</array>
</void>
<void index="1">
<array class="java.lang.Object" length="2">
<void index="0">
<string>Atribuição por Campo de Formulário</string>
</void>
<void index="1">
<string>Campo Formulário</string>
</void>
</array>
</void>
<void index="2">
<array class="java.lang.Object" length="2">
<void index="0">
<string>dpf_di_emp_filial_filtro</string>
</void>
<void index="1">
<string>dpf_di_emp_filial_filtro</string>
</void>
</array>
</void>
<void index="3">
<array class="java.lang.Object" length="2">
<void index="0">
<string>dpf_di_inicio_diadmissao</string>
</void>
<void index="1">
<string>dpf_di_inicio_diadmissao</string>
</void>
</array>
</void>
<void index="4">
<array class="java.lang.Object" length="2">
<void index="0">
<string>Atribuição por Executor de Atividade</string>
</void>
<void index="1">
<string>Executor Atividade</string>
</void>
</array>
</void>
<void index="5">
<array class="java.lang.Object" length="2">
<void index="0">
<string>Atribuição por Grupo</string>
</void>
<void index="1">
<string>Grupo</string>
</void>
</array>
</void>
<void index="6">
<array class="java.lang.Object" length="2">
<void index="0">
<string>Atribuição por Grupos do Colaborador</string>
</void>
<void index="1">
<string>Grupos Colaborador</string>
</void>
</array>
</void>
<void index="7">
<array class="java.lang.Object" length="2">
<void index="0">
<string>mecCustomAprov</string>
</void>
<void index="1">
<string>mecCustomAprov</string>
</void>
</array>
</void>
<void index="8">
<array class="java.lang.Object" length="2">
<void index="0">
<string>Atribuição por Papel</string>
</void>
<void index="1">
<string>Papel</string>
</void>
</array>
</void>
<void index="9">
<array class="java.lang.Object" length="2">
<void index="0">
<string>Atribuição para um Grupo</string>
</void>
<void index="1">
<string>Pool Grupo</string>
</void>
</array>
</void>
<void index="10">
<array class="java.lang.Object" length="2">
<void index="0">
<string>Atribuição para um Papel</string>
</void>
<void index="1">
<string>Pool Papel</string>
</void>
</array>
</void>
<void index="11">
<array class="java.lang.Object" length="2">
<void index="0">
<string>Atribuição por Usuário</string>
</void>
<void index="1">
<string>Usuário</string>
</void>
</array>
</void>
</array>
</void>
</object>
</java>

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -0,0 +1,956 @@
<?xml version="1.0" encoding="ASCII"?>
<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:al="http://eclipse.org/graphiti/mm/algorithms" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL-XMI" xmlns:pi="http://eclipse.org/graphiti/mm/pictograms">
<pi:Diagram visible="true" gridUnit="10" diagramTypeId="BPMNdiagram" name="checklist" snapToGrid="true" pictogramLinks="/0/@children.0/@link /0/@children.0/@children.1/@link /0/@children.0/@children.0/@link /0/@children.1/@link /0/@children.2/@link /0/@children.3/@link /0/@children.4/@link /0/@children.5/@link /0/@children.6/@link /0/@connections.0/@link /0/@connections.1/@link /0/@connections.2/@link /0/@connections.3/@link /0/@connections.4/@link /0/@connections.5/@link" version="0.16.0">
<graphicsAlgorithm xsi:type="al:Rectangle" background="/0/@styles.7/@renderingStyle/@adaptedGradientColoredAreas/@adaptedGradientColoredAreas.0/@gradientColor.2/@end/@color" foreground="/0/@colors.0" lineWidth="1" transparency="0.0" width="1000" height="1000"/>
<children xsi:type="pi:ContainerShape" visible="true" active="true">
<graphicsAlgorithm xsi:type="al:Rectangle" background="/0/@styles.7/@renderingStyle/@adaptedGradientColoredAreas/@adaptedGradientColoredAreas.0/@gradientColor.2/@end/@color" foreground="/0/@colors.3" lineWidth="1" transparency="0.0" width="1521" height="571" x="10" y="100" style="/0/@styles.0"/>
<link businessObjects="bpmnpool1"/>
<anchors xsi:type="pi:ChopboxAnchor"/>
<anchors xsi:type="pi:ChopboxAnchor"/>
<anchors xsi:type="pi:BoxRelativeAnchor" visible="true" active="true" referencedGraphicsAlgorithm="/0/@children.0/@graphicsAlgorithm" relativeWidth="1.0" relativeHeight="0.51">
<graphicsAlgorithm xsi:type="al:Ellipse" filled="false" lineVisible="false"/>
</anchors>
<children xsi:type="pi:ContainerShape" visible="true" active="true">
<graphicsAlgorithm xsi:type="al:Rectangle" background="/0/@colors.5" foreground="/0/@colors.3" lineWidth="1" transparency="0.0" width="1491" height="286" x="30" y="285" style="/0/@styles.5"/>
<link businessObjects="bpmnswimlane3"/>
<anchors xsi:type="pi:ChopboxAnchor"/>
<anchors xsi:type="pi:ChopboxAnchor"/>
<anchors xsi:type="pi:BoxRelativeAnchor" visible="true" active="true" referencedGraphicsAlgorithm="/0/@children.0/@children.0/@graphicsAlgorithm" relativeWidth="1.0" relativeHeight="0.51">
<graphicsAlgorithm xsi:type="al:Ellipse" filled="false" lineVisible="false"/>
</anchors>
<children visible="true">
<graphicsAlgorithm xsi:type="al:Text" lineWidth="1" filled="false" lineVisible="true" transparency="0.0" width="30" height="286" style="/0/@styles.6" font="/0/@fonts.1" horizontalAlignment="ALIGNMENT_CENTER" verticalAlignment="ALIGNMENT_MIDDLE" angle="270" value="Analista" rotation="270.0"/>
</children>
</children>
<children xsi:type="pi:ContainerShape" visible="true" active="true">
<graphicsAlgorithm xsi:type="al:Rectangle" background="/0/@styles.7/@renderingStyle/@adaptedGradientColoredAreas/@adaptedGradientColoredAreas.0/@gradientColor.2/@end/@color" foreground="/0/@colors.3" lineWidth="1" transparency="0.0" width="1491" height="285" x="30" style="/0/@styles.3"/>
<link businessObjects="bpmnswimlane2"/>
<anchors xsi:type="pi:ChopboxAnchor"/>
<anchors xsi:type="pi:ChopboxAnchor"/>
<anchors xsi:type="pi:BoxRelativeAnchor" visible="true" active="true" referencedGraphicsAlgorithm="/0/@children.0/@children.1/@graphicsAlgorithm" relativeWidth="1.0" relativeHeight="0.51">
<graphicsAlgorithm xsi:type="al:Ellipse" filled="false" lineVisible="false"/>
</anchors>
<children visible="true">
<graphicsAlgorithm xsi:type="al:Text" lineWidth="1" filled="false" lineVisible="true" transparency="0.0" width="30" height="285" style="/0/@styles.4" font="/0/@fonts.1" horizontalAlignment="ALIGNMENT_CENTER" verticalAlignment="ALIGNMENT_MIDDLE" angle="270" value="Lojas" rotation="270.0"/>
</children>
</children>
<children visible="true">
<graphicsAlgorithm xsi:type="al:Text" lineWidth="1" filled="false" lineVisible="true" transparency="0.0" width="30" height="571" style="/0/@styles.2" font="/0/@fonts.1" horizontalAlignment="ALIGNMENT_CENTER" verticalAlignment="ALIGNMENT_MIDDLE" angle="270" value="Compliance" rotation="270.0"/>
</children>
</children>
<children xsi:type="pi:ContainerShape" visible="true" active="true">
<graphicsAlgorithm xsi:type="al:Ellipse" lineWidth="1" filled="false" lineVisible="false" transparency="0.0" width="35" height="35" x="130" y="570">
<graphicsAlgorithmChildren xsi:type="al:Ellipse" lineWidth="1" transparency="0.0" width="35" height="35" style="/0/@styles.7"/>
</graphicsAlgorithm>
<link businessObjects="startevent4"/>
<anchors xsi:type="pi:ChopboxAnchor" outgoingConnections="/0/@connections.0"/>
<anchors xsi:type="pi:BoxRelativeAnchor" visible="true" active="true" referencedGraphicsAlgorithm="/0/@children.1/@graphicsAlgorithm/@graphicsAlgorithmChildren.0" relativeWidth="1.0" relativeHeight="0.51">
<graphicsAlgorithm xsi:type="al:Ellipse" filled="false" lineVisible="false"/>
</anchors>
</children>
<children xsi:type="pi:ContainerShape" visible="true" active="true">
<graphicsAlgorithm xsi:type="al:Rectangle" lineWidth="1" filled="false" lineVisible="false" transparency="0.0" width="106" height="70" x="320" y="550"/>
<link businessObjects="task5"/>
<anchors xsi:type="pi:ChopboxAnchor" outgoingConnections="/0/@connections.3" incomingConnections="/0/@connections.0 /0/@connections.2"/>
<anchors xsi:type="pi:BoxRelativeAnchor" visible="true" active="true" referencedGraphicsAlgorithm="/0/@children.2/@graphicsAlgorithm" relativeWidth="1.0" relativeHeight="0.51">
<graphicsAlgorithm xsi:type="al:Ellipse" filled="false" lineVisible="false"/>
</anchors>
<children visible="true">
<graphicsAlgorithm xsi:type="al:RoundedRectangle" lineWidth="1" transparency="0.0" width="106" height="70" style="/0/@styles.8" cornerHeight="5" cornerWidth="5"/>
</children>
<children visible="true">
<graphicsAlgorithm xsi:type="al:MultiText" lineWidth="1" filled="false" lineVisible="true" transparency="0.0" width="96" height="60" x="5" y="5" style="/0/@styles.9" font="/0/@fonts.1" horizontalAlignment="ALIGNMENT_CENTER" value="Validar Planograma"/>
</children>
</children>
<children xsi:type="pi:ContainerShape" visible="true" active="true">
<graphicsAlgorithm xsi:type="al:Rectangle" lineWidth="1" filled="false" lineVisible="false" transparency="0.0" width="60" height="88" x="700" y="540">
<graphicsAlgorithmChildren xsi:type="al:Polygon" lineWidth="1" filled="true" transparency="0.0" width="60" height="60" style="/0/@styles.10">
<points y="30"/>
<points x="30"/>
<points x="60" y="30"/>
<points x="30" y="60"/>
<points y="30"/>
</graphicsAlgorithmChildren>
</graphicsAlgorithm>
<link businessObjects="exclusivegateway7"/>
<anchors xsi:type="pi:ChopboxAnchor" outgoingConnections="/0/@connections.1 /0/@connections.5" incomingConnections="/0/@connections.3"/>
<anchors xsi:type="pi:ChopboxAnchor"/>
<anchors xsi:type="pi:BoxRelativeAnchor" visible="true" active="true" referencedGraphicsAlgorithm="/0/@children.3/@graphicsAlgorithm/@graphicsAlgorithmChildren.0" relativeWidth="0.51" relativeHeight="0.1">
<graphicsAlgorithm xsi:type="al:Ellipse" filled="false" lineVisible="false"/>
</anchors>
<anchors xsi:type="pi:ChopboxAnchor"/>
<anchors xsi:type="pi:BoxRelativeAnchor" visible="true" active="true" referencedGraphicsAlgorithm="/0/@children.3/@graphicsAlgorithm/@graphicsAlgorithmChildren.0" relativeWidth="0.51" relativeHeight="0.93">
<graphicsAlgorithm xsi:type="al:Ellipse" filled="false" lineVisible="false"/>
</anchors>
<children visible="true">
<graphicsAlgorithm xsi:type="al:MultiText" lineWidth="1" filled="false" lineVisible="true" transparency="0.0" width="60" height="28" y="60" style="/0/@styles.11" font="/0/@fonts.1" horizontalAlignment="ALIGNMENT_CENTER" value="An&#xe1;lise&#xA;"/>
</children>
</children>
<children xsi:type="pi:ContainerShape" visible="true" active="true">
<graphicsAlgorithm xsi:type="al:Rectangle" lineWidth="1" filled="false" lineVisible="false" transparency="0.0" width="106" height="70" x="670" y="169"/>
<link businessObjects="task9"/>
<anchors xsi:type="pi:ChopboxAnchor" outgoingConnections="/0/@connections.2" incomingConnections="/0/@connections.5"/>
<anchors xsi:type="pi:BoxRelativeAnchor" visible="true" active="true" referencedGraphicsAlgorithm="/0/@children.4/@graphicsAlgorithm" relativeWidth="1.0" relativeHeight="0.51">
<graphicsAlgorithm xsi:type="al:Ellipse" filled="false" lineVisible="false"/>
</anchors>
<children visible="true">
<graphicsAlgorithm xsi:type="al:RoundedRectangle" lineWidth="1" transparency="0.0" width="106" height="70" style="/0/@styles.12" cornerHeight="5" cornerWidth="5"/>
</children>
<children visible="true">
<graphicsAlgorithm xsi:type="al:MultiText" lineWidth="1" filled="false" lineVisible="true" transparency="0.0" width="96" height="60" x="5" y="5" style="/0/@styles.13" font="/0/@fonts.1" horizontalAlignment="ALIGNMENT_CENTER" value="Refazer Planograma"/>
</children>
</children>
<children xsi:type="pi:ContainerShape" visible="true" active="true">
<graphicsAlgorithm xsi:type="al:Rectangle" lineWidth="1" filled="false" lineVisible="false" transparency="0.0" width="106" height="70" x="1000" y="550"/>
<link businessObjects="task11"/>
<anchors xsi:type="pi:ChopboxAnchor" outgoingConnections="/0/@connections.4" incomingConnections="/0/@connections.1"/>
<anchors xsi:type="pi:BoxRelativeAnchor" visible="true" active="true" referencedGraphicsAlgorithm="/0/@children.5/@graphicsAlgorithm" relativeWidth="1.0" relativeHeight="0.51">
<graphicsAlgorithm xsi:type="al:Ellipse" filled="false" lineVisible="false"/>
</anchors>
<children visible="true">
<graphicsAlgorithm xsi:type="al:RoundedRectangle" lineWidth="1" transparency="0.0" width="106" height="70" style="/0/@styles.14" cornerHeight="5" cornerWidth="5"/>
</children>
<children visible="true">
<graphicsAlgorithm xsi:type="al:MultiText" lineWidth="1" filled="false" lineVisible="true" transparency="0.0" width="96" height="60" x="5" y="5" style="/0/@styles.15" font="/0/@fonts.1" horizontalAlignment="ALIGNMENT_CENTER" value="Enviar Email e PDF"/>
</children>
</children>
<children xsi:type="pi:ContainerShape" visible="true" active="true">
<graphicsAlgorithm xsi:type="al:Ellipse" lineWidth="1" filled="false" lineVisible="false" transparency="0.0" width="35" height="35" x="1320" y="570">
<graphicsAlgorithmChildren xsi:type="al:Ellipse" lineWidth="3" transparency="0.0" width="35" height="35" style="/0/@styles.16"/>
</graphicsAlgorithm>
<link businessObjects="endterminate21"/>
<anchors xsi:type="pi:ChopboxAnchor" incomingConnections="/0/@connections.4"/>
<anchors xsi:type="pi:BoxRelativeAnchor" visible="true" active="true" referencedGraphicsAlgorithm="/0/@children.6/@graphicsAlgorithm/@graphicsAlgorithmChildren.0" relativeWidth="1.0" relativeHeight="0.51">
<graphicsAlgorithm xsi:type="al:Ellipse" filled="false" lineVisible="false"/>
</anchors>
<children visible="true">
<graphicsAlgorithm xsi:type="al:Ellipse" lineWidth="1" filled="false" lineVisible="false" transparency="0.0" width="24" height="25" x="5" y="5">
<graphicsAlgorithmChildren xsi:type="al:Ellipse" background="/0/@colors.8" lineWidth="1" filled="true" lineVisible="false" transparency="0.0" width="24" height="25"/>
</graphicsAlgorithm>
</children>
</children>
<styles background="/0/@colors.2" foreground="/0/@colors.1" id="BPMN-SWIM_LANE-NOSTYLE"/>
<styles foreground="/0/@colors.1" id="BPMN-CLASS">
<renderingStyle>
<adaptedGradientColoredAreas definedStyleId="blue-white-gloss" gradientType="0">
<adaptedGradientColoredAreas styleAdaption="0">
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="0">
<color red="248" green="251" blue="254"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="1">
<color red="248" green="251" blue="254"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="1">
<color red="237" green="245" blue="252"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="2">
<color red="237" green="245" blue="252"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="2">
<color red="222" green="237" blue="250"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="3">
<color red="222" green="237" blue="250"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="3">
<color red="212" green="231" blue="248"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="2">
<color red="250" green="251" blue="252"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="2">
<color red="226" green="229" blue="233"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="0">
<color red="226" green="229" blue="233"/>
</end>
</gradientColor>
</adaptedGradientColoredAreas>
<adaptedGradientColoredAreas styleAdaption="1">
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="0">
<color red="238" green="246" blue="253"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="1">
<color red="238" green="246" blue="253"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="1">
<color red="208" green="230" blue="249"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="2">
<color red="208" green="230" blue="249"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="2">
<color red="172" green="210" blue="244"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="3">
<color red="172" green="210" blue="244"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="3">
<color red="129" green="185" blue="234"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="2">
<color red="170" green="208" blue="242"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="2">
<color red="154" green="191" blue="224"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="0">
<color red="154" green="191" blue="224"/>
</end>
</gradientColor>
</adaptedGradientColoredAreas>
<adaptedGradientColoredAreas styleAdaption="2">
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="0">
<color red="245" green="249" blue="254"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="1">
<color red="245" green="249" blue="254"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="1">
<color red="226" green="239" blue="252"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="2">
<color red="226" green="239" blue="252"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="2">
<color red="203" green="227" blue="249"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="3">
<color red="203" green="227" blue="249"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="3">
<color red="187" green="218" blue="247"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="2">
<color red="197" green="224" blue="247"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="2">
<color red="178" green="205" blue="229"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="0">
<color red="178" green="205" blue="229"/>
</end>
</gradientColor>
</adaptedGradientColoredAreas>
<adaptedGradientColoredAreas styleAdaption="3">
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="0">
<color red="153" green="204"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="0">
<color red="51" green="153" blue="102"/>
</end>
</gradientColor>
</adaptedGradientColoredAreas>
<adaptedGradientColoredAreas styleAdaption="4">
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="0">
<color red="255" green="204"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="0">
<color red="255" green="102"/>
</end>
</gradientColor>
</adaptedGradientColoredAreas>
</adaptedGradientColoredAreas>
</renderingStyle>
</styles>
<styles foreground="/0/@colors.4" id="BPMNCLASS-TEXT-67-67-67"/>
<styles background="/0/@colors.2" foreground="/0/@colors.1" id="BPMN-SWIM_LANE-NOSTYLE"/>
<styles foreground="/0/@colors.4" id="BPMNCLASS-TEXT-67-67-67"/>
<styles background="/0/@colors.2" foreground="/0/@colors.1" id="BPMN-SWIM_LANE-NOSTYLE"/>
<styles foreground="/0/@colors.4" id="BPMNCLASS-TEXT-67-67-67"/>
<styles foreground="/0/@colors.6" id="START-EVENT">
<renderingStyle>
<adaptedGradientColoredAreas definedStyleId="START-EVENT" gradientType="0">
<adaptedGradientColoredAreas styleAdaption="0">
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="0">
<color red="102" green="255" blue="102"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="10">
<color red="150" green="255" blue="150"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="10">
<color red="150" green="255" blue="150"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="20">
<color red="182" green="255" blue="182"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="20">
<color red="182" green="255" blue="182"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="50">
<color red="255" green="255" blue="255"/>
</end>
</gradientColor>
</adaptedGradientColoredAreas>
</adaptedGradientColoredAreas>
</renderingStyle>
</styles>
<styles foreground="/0/@colors.1" id="TASK">
<renderingStyle>
<adaptedGradientColoredAreas definedStyleId="blue-white-gloss" gradientType="0">
<adaptedGradientColoredAreas styleAdaption="0">
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="0">
<color red="248" green="251" blue="254"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="1">
<color red="248" green="251" blue="254"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="1">
<color red="237" green="245" blue="252"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="2">
<color red="237" green="245" blue="252"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="2">
<color red="222" green="237" blue="250"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="3">
<color red="222" green="237" blue="250"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="3">
<color red="212" green="231" blue="248"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="2">
<color red="250" green="251" blue="252"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="2">
<color red="226" green="229" blue="233"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="0">
<color red="226" green="229" blue="233"/>
</end>
</gradientColor>
</adaptedGradientColoredAreas>
<adaptedGradientColoredAreas styleAdaption="1">
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="0">
<color red="238" green="246" blue="253"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="1">
<color red="238" green="246" blue="253"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="1">
<color red="208" green="230" blue="249"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="2">
<color red="208" green="230" blue="249"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="2">
<color red="172" green="210" blue="244"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="3">
<color red="172" green="210" blue="244"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="3">
<color red="129" green="185" blue="234"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="2">
<color red="170" green="208" blue="242"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="2">
<color red="154" green="191" blue="224"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="0">
<color red="154" green="191" blue="224"/>
</end>
</gradientColor>
</adaptedGradientColoredAreas>
<adaptedGradientColoredAreas styleAdaption="2">
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="0">
<color red="245" green="249" blue="254"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="1">
<color red="245" green="249" blue="254"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="1">
<color red="226" green="239" blue="252"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="2">
<color red="226" green="239" blue="252"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="2">
<color red="203" green="227" blue="249"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="3">
<color red="203" green="227" blue="249"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="3">
<color red="187" green="218" blue="247"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="2">
<color red="197" green="224" blue="247"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="2">
<color red="178" green="205" blue="229"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="0">
<color red="178" green="205" blue="229"/>
</end>
</gradientColor>
</adaptedGradientColoredAreas>
<adaptedGradientColoredAreas styleAdaption="3">
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="0">
<color red="153" green="204"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="0">
<color red="51" green="153" blue="102"/>
</end>
</gradientColor>
</adaptedGradientColoredAreas>
<adaptedGradientColoredAreas styleAdaption="4">
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="0">
<color red="255" green="204"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="0">
<color red="255" green="102"/>
</end>
</gradientColor>
</adaptedGradientColoredAreas>
</adaptedGradientColoredAreas>
</renderingStyle>
</styles>
<styles foreground="/0/@colors.7" id="BPMNCLASS-TEXT"/>
<styles foreground="/0/@colors.3" id="GATEWAY">
<renderingStyle>
<adaptedGradientColoredAreas definedStyleId="GATEWAY" gradientType="0">
<adaptedGradientColoredAreas styleAdaption="0">
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="0">
<color red="250" green="251" blue="252"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="0">
<color red="255" green="255" blue="204"/>
</end>
</gradientColor>
</adaptedGradientColoredAreas>
</adaptedGradientColoredAreas>
</renderingStyle>
</styles>
<styles foreground="/0/@colors.7" id="BPMNCLASS-TEXT"/>
<styles foreground="/0/@colors.1" id="TASK">
<renderingStyle>
<adaptedGradientColoredAreas definedStyleId="blue-white-gloss" gradientType="0">
<adaptedGradientColoredAreas styleAdaption="0">
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="0">
<color red="248" green="251" blue="254"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="1">
<color red="248" green="251" blue="254"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="1">
<color red="237" green="245" blue="252"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="2">
<color red="237" green="245" blue="252"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="2">
<color red="222" green="237" blue="250"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="3">
<color red="222" green="237" blue="250"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="3">
<color red="212" green="231" blue="248"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="2">
<color red="250" green="251" blue="252"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="2">
<color red="226" green="229" blue="233"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="0">
<color red="226" green="229" blue="233"/>
</end>
</gradientColor>
</adaptedGradientColoredAreas>
<adaptedGradientColoredAreas styleAdaption="1">
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="0">
<color red="238" green="246" blue="253"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="1">
<color red="238" green="246" blue="253"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="1">
<color red="208" green="230" blue="249"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="2">
<color red="208" green="230" blue="249"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="2">
<color red="172" green="210" blue="244"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="3">
<color red="172" green="210" blue="244"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="3">
<color red="129" green="185" blue="234"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="2">
<color red="170" green="208" blue="242"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="2">
<color red="154" green="191" blue="224"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="0">
<color red="154" green="191" blue="224"/>
</end>
</gradientColor>
</adaptedGradientColoredAreas>
<adaptedGradientColoredAreas styleAdaption="2">
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="0">
<color red="245" green="249" blue="254"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="1">
<color red="245" green="249" blue="254"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="1">
<color red="226" green="239" blue="252"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="2">
<color red="226" green="239" blue="252"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="2">
<color red="203" green="227" blue="249"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="3">
<color red="203" green="227" blue="249"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="3">
<color red="187" green="218" blue="247"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="2">
<color red="197" green="224" blue="247"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="2">
<color red="178" green="205" blue="229"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="0">
<color red="178" green="205" blue="229"/>
</end>
</gradientColor>
</adaptedGradientColoredAreas>
<adaptedGradientColoredAreas styleAdaption="3">
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="0">
<color red="153" green="204"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="0">
<color red="51" green="153" blue="102"/>
</end>
</gradientColor>
</adaptedGradientColoredAreas>
<adaptedGradientColoredAreas styleAdaption="4">
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="0">
<color red="255" green="204"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="0">
<color red="255" green="102"/>
</end>
</gradientColor>
</adaptedGradientColoredAreas>
</adaptedGradientColoredAreas>
</renderingStyle>
</styles>
<styles foreground="/0/@colors.7" id="BPMNCLASS-TEXT"/>
<styles foreground="/0/@colors.1" id="TASK">
<renderingStyle>
<adaptedGradientColoredAreas definedStyleId="blue-white-gloss" gradientType="0">
<adaptedGradientColoredAreas styleAdaption="0">
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="0">
<color red="248" green="251" blue="254"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="1">
<color red="248" green="251" blue="254"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="1">
<color red="237" green="245" blue="252"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="2">
<color red="237" green="245" blue="252"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="2">
<color red="222" green="237" blue="250"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="3">
<color red="222" green="237" blue="250"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="3">
<color red="212" green="231" blue="248"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="2">
<color red="250" green="251" blue="252"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="2">
<color red="226" green="229" blue="233"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="0">
<color red="226" green="229" blue="233"/>
</end>
</gradientColor>
</adaptedGradientColoredAreas>
<adaptedGradientColoredAreas styleAdaption="1">
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="0">
<color red="238" green="246" blue="253"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="1">
<color red="238" green="246" blue="253"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="1">
<color red="208" green="230" blue="249"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="2">
<color red="208" green="230" blue="249"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="2">
<color red="172" green="210" blue="244"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="3">
<color red="172" green="210" blue="244"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="3">
<color red="129" green="185" blue="234"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="2">
<color red="170" green="208" blue="242"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="2">
<color red="154" green="191" blue="224"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="0">
<color red="154" green="191" blue="224"/>
</end>
</gradientColor>
</adaptedGradientColoredAreas>
<adaptedGradientColoredAreas styleAdaption="2">
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="0">
<color red="245" green="249" blue="254"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="1">
<color red="245" green="249" blue="254"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="1">
<color red="226" green="239" blue="252"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="2">
<color red="226" green="239" blue="252"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="2">
<color red="203" green="227" blue="249"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="3">
<color red="203" green="227" blue="249"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="3">
<color red="187" green="218" blue="247"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="2">
<color red="197" green="224" blue="247"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="2">
<color red="178" green="205" blue="229"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="0">
<color red="178" green="205" blue="229"/>
</end>
</gradientColor>
</adaptedGradientColoredAreas>
<adaptedGradientColoredAreas styleAdaption="3">
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="0">
<color red="153" green="204"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="0">
<color red="51" green="153" blue="102"/>
</end>
</gradientColor>
</adaptedGradientColoredAreas>
<adaptedGradientColoredAreas styleAdaption="4">
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="0">
<color red="255" green="204"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_END" locationValue="0">
<color red="255" green="102"/>
</end>
</gradientColor>
</adaptedGradientColoredAreas>
</adaptedGradientColoredAreas>
</renderingStyle>
</styles>
<styles foreground="/0/@colors.7" id="BPMNCLASS-TEXT"/>
<styles foreground="/0/@colors.8" id="END-EVENT">
<renderingStyle>
<adaptedGradientColoredAreas definedStyleId="END-EVENT" gradientType="0">
<adaptedGradientColoredAreas styleAdaption="0">
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="0">
<color red="255" green="102" blue="102"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="10">
<color red="255" green="150" blue="150"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="10">
<color red="255" green="150" blue="150"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="20">
<color red="255" green="182" blue="182"/>
</end>
</gradientColor>
<gradientColor>
<start locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="20">
<color red="255" green="182" blue="182"/>
</start>
<end locationType="LOCATION_TYPE_ABSOLUTE_START" locationValue="50">
<color red="255" green="255" blue="255"/>
</end>
</gradientColor>
</adaptedGradientColoredAreas>
</adaptedGradientColoredAreas>
</renderingStyle>
</styles>
<styles foreground="/0/@colors.7" id="BPMNCLASS-TEXT"/>
<styles background="/0/@colors.3" foreground="/0/@colors.3" lineWidth="1" id="BPMN-POLYGON-ARROW"/>
<styles foreground="/0/@colors.7" id="BPMNCLASS-TEXT"/>
<styles foreground="/0/@colors.7" id="BPMNCLASS-TEXT"/>
<styles foreground="/0/@colors.7" id="BPMNCLASS-TEXT"/>
<styles foreground="/0/@colors.7" id="BPMNCLASS-TEXT"/>
<styles foreground="/0/@colors.7" id="BPMNCLASS-TEXT"/>
<connections xsi:type="pi:FreeFormConnection" visible="true" active="true" start="/0/@children.1/@anchors.0" end="/0/@children.2/@anchors.0">
<graphicsAlgorithm xsi:type="al:Polyline" foreground="/0/@colors.3" lineWidth="1" filled="false" transparency="0.0"/>
<link businessObjects="flow6"/>
<connectionDecorators visible="true" active="true" locationRelative="true" location="0.5">
<graphicsAlgorithm xsi:type="al:Text" lineWidth="1" filled="false" transparency="0.0" x="10" style="/0/@styles.17" font="/0/@fonts.0" value=""/>
</connectionDecorators>
<connectionDecorators visible="true" locationRelative="true" location="1.0">
<graphicsAlgorithm xsi:type="al:Polygon" background="/0/@colors.3" foreground="/0/@colors.3" lineWidth="1" filled="true" transparency="0.0" style="/0/@styles.18">
<points x="-10" y="-5" before="3" after="3"/>
<points/>
<points x="-10" y="5" before="3" after="3"/>
<points x="-8" before="3" after="3"/>
</graphicsAlgorithm>
</connectionDecorators>
</connections>
<connections xsi:type="pi:FreeFormConnection" visible="true" active="true" start="/0/@children.3/@anchors.0" end="/0/@children.5/@anchors.0">
<graphicsAlgorithm xsi:type="al:Polyline" foreground="/0/@colors.3" lineWidth="1" filled="false" transparency="0.0"/>
<link businessObjects="flow12"/>
<connectionDecorators visible="true" active="true" locationRelative="true" location="0.5">
<graphicsAlgorithm xsi:type="al:Text" lineWidth="1" filled="false" transparency="0.0" x="10" style="/0/@styles.19" font="/0/@fonts.0" value="Conforme"/>
</connectionDecorators>
<connectionDecorators visible="true" locationRelative="true" location="1.0">
<graphicsAlgorithm xsi:type="al:Polygon" background="/0/@colors.3" foreground="/0/@colors.3" lineWidth="1" filled="true" transparency="0.0" style="/0/@styles.18">
<points x="-10" y="-5" before="3" after="3"/>
<points/>
<points x="-10" y="5" before="3" after="3"/>
<points x="-8" before="3" after="3"/>
</graphicsAlgorithm>
</connectionDecorators>
</connections>
<connections xsi:type="pi:FreeFormConnection" visible="true" active="true" start="/0/@children.4/@anchors.0" end="/0/@children.2/@anchors.0">
<graphicsAlgorithm xsi:type="al:Polyline" foreground="/0/@colors.3" lineWidth="1" filled="false" transparency="0.0"/>
<link businessObjects="flow15"/>
<connectionDecorators visible="true" active="true" locationRelative="true" location="0.5">
<graphicsAlgorithm xsi:type="al:Text" lineWidth="1" filled="false" transparency="0.0" x="10" style="/0/@styles.20" font="/0/@fonts.0" value="Enviar corre&#xe7;&#xe3;o do planograma"/>
</connectionDecorators>
<connectionDecorators visible="true" locationRelative="true" location="1.0">
<graphicsAlgorithm xsi:type="al:Polygon" background="/0/@colors.3" foreground="/0/@colors.3" lineWidth="1" filled="true" transparency="0.0" style="/0/@styles.18">
<points x="-10" y="-5" before="3" after="3"/>
<points/>
<points x="-10" y="5" before="3" after="3"/>
<points x="-8" before="3" after="3"/>
</graphicsAlgorithm>
</connectionDecorators>
<bendpoints x="372" y="208"/>
</connections>
<connections xsi:type="pi:FreeFormConnection" visible="true" active="true" start="/0/@children.2/@anchors.0" end="/0/@children.3/@anchors.0">
<graphicsAlgorithm xsi:type="al:Polyline" foreground="/0/@colors.3" lineWidth="1" filled="false" transparency="0.0"/>
<link businessObjects="flow19"/>
<connectionDecorators visible="true" active="true" locationRelative="true" location="0.5">
<graphicsAlgorithm xsi:type="al:Text" lineWidth="1" filled="false" transparency="0.0" x="10" style="/0/@styles.21" font="/0/@fonts.0" value=""/>
</connectionDecorators>
<connectionDecorators visible="true" locationRelative="true" location="1.0">
<graphicsAlgorithm xsi:type="al:Polygon" background="/0/@colors.3" foreground="/0/@colors.3" lineWidth="1" filled="true" transparency="0.0" style="/0/@styles.18">
<points x="-10" y="-5" before="3" after="3"/>
<points/>
<points x="-10" y="5" before="3" after="3"/>
<points x="-8" before="3" after="3"/>
</graphicsAlgorithm>
</connectionDecorators>
</connections>
<connections xsi:type="pi:FreeFormConnection" visible="true" active="true" start="/0/@children.5/@anchors.0" end="/0/@children.6/@anchors.0">
<graphicsAlgorithm xsi:type="al:Polyline" foreground="/0/@colors.3" lineWidth="1" filled="false" transparency="0.0"/>
<link businessObjects="flow22"/>
<connectionDecorators visible="true" active="true" locationRelative="true" location="0.5">
<graphicsAlgorithm xsi:type="al:Text" lineWidth="1" filled="false" transparency="0.0" x="10" style="/0/@styles.22" font="/0/@fonts.0" value=""/>
</connectionDecorators>
<connectionDecorators visible="true" locationRelative="true" location="1.0">
<graphicsAlgorithm xsi:type="al:Polygon" background="/0/@colors.3" foreground="/0/@colors.3" lineWidth="1" filled="true" transparency="0.0" style="/0/@styles.18">
<points x="-10" y="-5" before="3" after="3"/>
<points/>
<points x="-10" y="5" before="3" after="3"/>
<points x="-8" before="3" after="3"/>
</graphicsAlgorithm>
</connectionDecorators>
</connections>
<connections xsi:type="pi:FreeFormConnection" visible="true" active="true" start="/0/@children.3/@anchors.0" end="/0/@children.4/@anchors.0">
<graphicsAlgorithm xsi:type="al:Polyline" foreground="/0/@colors.3" lineWidth="1" filled="false" transparency="0.0"/>
<link businessObjects="flow23"/>
<connectionDecorators visible="true" active="true" locationRelative="true" location="0.5">
<graphicsAlgorithm xsi:type="al:Text" lineWidth="1" filled="false" transparency="0.0" x="10" style="/0/@styles.23" font="/0/@fonts.0" value=""/>
</connectionDecorators>
<connectionDecorators visible="true" locationRelative="true" location="1.0">
<graphicsAlgorithm xsi:type="al:Polygon" background="/0/@colors.3" foreground="/0/@colors.3" lineWidth="1" filled="true" transparency="0.0" style="/0/@styles.18">
<points x="-10" y="-5" before="3" after="3"/>
<points/>
<points x="-10" y="5" before="3" after="3"/>
<points x="-8" before="3" after="3"/>
</graphicsAlgorithm>
</connectionDecorators>
</connections>
<colors red="227" green="238" blue="249"/>
<colors red="25" green="25" blue="112"/>
<colors red="159" green="193" blue="198"/>
<colors/>
<colors red="67" green="67" blue="67"/>
<colors red="192" green="192" blue="192"/>
<colors red="51" green="102" blue="51"/>
<colors red="51" green="51" blue="153"/>
<colors red="153" green="51" blue="51"/>
<fonts name="Arial" size="8"/>
<fonts name="Arial" size="8" bold="true"/>
</pi:Diagram>
<bpmn2:BpmnPool id="bpmnpool1" name="Compliance" cores="FFFFFF"/>
<bpmn2:BpmnSwimLane id="bpmnswimlane2" name="Lojas" cores="FFFFFF"/>
<bpmn2:BpmnSwimLane id="bpmnswimlane3" name="Analista" cores="C0C0C0"/>
<bpmn2:BpmnStartEvent id="startevent4" name="In&#xed;cio" outgoing="flow6" type="10" extendedFields="&lt;list/>" signalId="0" expediente="Expediente BackOffice, Log&#xed;stica e Motorista" selecionaColaboradores="1" esforcoCalculo="0"/>
<bpmn2:BpmnTask id="task5" name="Validar Planograma" incoming="flow6 flow15" outgoing="flow19" type="80" extendedFields="&lt;list/>" managerMechanism="Usu&#xe1;rio" managerAssignmentControllerString="&lt;org.eclipse.bpmn2.impl.AssignmentControllerColleague>&#xA; &lt;colleagueId>andrey.cunha&lt;/colleagueId>&#xA; &lt;mechanismName>Usu&#xe1;rio&lt;/mechanismName>&#xA;&lt;/org.eclipse.bpmn2.impl.AssignmentControllerColleague>" loopType="0" authNotify="true" expediente="Expediente BackOffice, Log&#xed;stica e Motorista" selecionaColaboradores="1" esforcoCalculo="0" executionAttempts="0" frequency="0"/>
<bpmn2:BpmnGateway id="exclusivegateway7" name="An&#xe1;lise" incoming="flow19" outgoing="flow12 flow23" type="120" extendedFields="&lt;list/>" condition="&lt;list>&#xA; &lt;org.eclipse.bpmn2.impl.ConditionImpl>&#xA; &lt;order>1&lt;/order>&#xA; &lt;expression>hAPI.getCardValue(&amp;quot;saidaAnalise&amp;quot;) == &amp;quot;NAO_CONFORME&amp;quot;&lt;/expression>&#xA; &lt;targetTask>task9&lt;/targetTask>&#xA; &lt;mechanism>Executor Atividade&lt;/mechanism>&#xA; &lt;conditionType>0&lt;/conditionType>&#xA; &lt;mecanismoAtribuicaoConfiguracao class=&quot;org.eclipse.bpmn2.impl.AssignmentControllerExecutorMechanism&quot;>&#xA; &lt;idNode>startevent4&lt;/idNode>&#xA; &lt;returns>1&lt;/returns>&#xA; &lt;mechanismName>Executor Atividade&lt;/mechanismName>&#xA; &lt;/mecanismoAtribuicaoConfiguracao>&#xA; &lt;/org.eclipse.bpmn2.impl.ConditionImpl>&#xA; &lt;org.eclipse.bpmn2.impl.ConditionImpl>&#xA; &lt;order>2&lt;/order>&#xA; &lt;expression>hAPI.getCardValue(&amp;quot;saidaAnalise&amp;quot;) == &amp;quot;CONFORME&amp;quot;&lt;/expression>&#xA; &lt;targetTask>task11&lt;/targetTask>&#xA; &lt;conditionType>0&lt;/conditionType>&#xA; &lt;/org.eclipse.bpmn2.impl.ConditionImpl>&#xA;&lt;/list>"/>
<bpmn2:BpmnTask id="task9" name="Refazer Planograma" incoming="flow23" outgoing="flow15" type="80" extendedFields="&lt;list/>" loopType="0" authNotify="true" expediente="" selecionaColaboradores="1" esforcoCalculo="0" executionAttempts="0" frequency="0"/>
<bpmn2:BpmnTask id="task11" name="Enviar Email e PDF" incoming="flow12" outgoing="flow22" type="80" extendedFields="&lt;list/>" managerMechanism="" loopType="0" authNotify="true" expediente="" prazoConclusao="10.0" selecionaColaboradores="1" esforcoCalculo="0" executionAttempts="0" frequency="0"/>
<bpmn2:BpmnEndEvent id="endterminate21" name="Conclu&#xed;do" incoming="flow22" type="68" extendedFields="&lt;list/>" signalId="0" notificaRequisitante="true"/>
<bpmn2:BpmnProcess id="checklist" name="checklist" serverId="Ginseng Produ&#xe7;&#xe3;o" version="6" author="" extendedFields="&lt;list/>" cardIndex="40213" formSource="server" category="" volume="Default" expedient="Default" instruction="" complementsLevel="1" notifyResponsibleComplements="true" notifyRequisitionerComplements="true" formType="ECM_FORM_BUILDER"/>
<bpmn2:SequenceFlow id="flow6" name="" sourceRef="startevent4" targetRef="task5" atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/>"/>
<bpmn2:SequenceFlow id="flow12" name="Conforme" sourceRef="exclusivegateway7" targetRef="task11" atividadeFluxo="Conforme" atividadeRetorno="" extendedFields="&lt;list/>"/>
<bpmn2:SequenceFlow id="flow15" name="Enviar corre&#xe7;&#xe3;o do planograma" sourceRef="task9" targetRef="task5" atividadeFluxo="Enviar corre&#xe7;&#xe3;o" atividadeRetorno="" extendedFields="&lt;list/>"/>
<bpmn2:SequenceFlow id="flow19" name="" sourceRef="task5" targetRef="exclusivegateway7" atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/>"/>
<bpmn2:SequenceFlow id="flow22" name="" sourceRef="task11" targetRef="endterminate21" atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/>"/>
<bpmn2:SequenceFlow id="flow23" name="" sourceRef="exclusivegateway7" targetRef="task9" atividadeFluxo="" atividadeRetorno="" extendedFields="&lt;list/>"/>
</xmi:XMI>