Merged in bugfix/PMCORE-2847 (pull request #7843)
PMCORE-2847 Approved-by: Julio Cesar Laura Avendaño Approved-by: Rodrigo Quelca
This commit is contained in:
@@ -13,7 +13,7 @@
|
||||
:key="item.title"
|
||||
class="v-attached-block"
|
||||
>
|
||||
<span> {{ item.label }} </span>:<span class="font-weight-bold">
|
||||
<span> {{ item.label }} </span><span class="font-weight-bold">
|
||||
{{ item.value }}</span
|
||||
>
|
||||
</div>
|
||||
@@ -26,7 +26,7 @@
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: "CaseSummary",
|
||||
name: "CaseStatus",
|
||||
props: {
|
||||
data: Array,
|
||||
},
|
||||
@@ -3,13 +3,6 @@
|
||||
<div class="card-body">
|
||||
<h6 class="card-subtitle mb-2 text-muted">{{ data.title }}</h6>
|
||||
<div class="card-text v-case-summary-card-body">
|
||||
<div>
|
||||
<span> {{ data.label.numberCase }} </span>:<span
|
||||
class="font-weight-bold"
|
||||
>
|
||||
{{ data.text.numberCase }}</span
|
||||
>
|
||||
</div>
|
||||
<div>
|
||||
<span> {{ data.label.process }} </span>:<span
|
||||
class="font-weight-bold"
|
||||
@@ -18,8 +11,15 @@
|
||||
>
|
||||
</div>
|
||||
<div>
|
||||
<span> {{ data.label.status }} </span>:<span class="font-weight-bold">
|
||||
{{ data.text.status }}</span
|
||||
<span> {{ data.label.processDescription }} </span>:<span
|
||||
class="font-weight-bold"
|
||||
>
|
||||
{{ data.text.processDescription }}</span
|
||||
>
|
||||
</div>
|
||||
<div>
|
||||
<span> {{ data.label.caseNumber }} </span>:<span class="font-weight-bold">
|
||||
{{ data.text.caseNumber }}</span
|
||||
>
|
||||
</div>
|
||||
<div>
|
||||
@@ -30,10 +30,17 @@
|
||||
>
|
||||
</div>
|
||||
<div>
|
||||
<span> {{ data.label.created }} </span>:<span
|
||||
<span> {{ data.label.status }} </span>:<span
|
||||
class="font-weight-bold"
|
||||
>
|
||||
{{ data.text.created }}</span
|
||||
{{ data.text.status }}</span
|
||||
>
|
||||
</div>
|
||||
<div>
|
||||
<span> {{ data.label.create }} </span>:<span
|
||||
class="font-weight-bold"
|
||||
>
|
||||
{{ data.text.create }}</span
|
||||
>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
@@ -45,12 +45,17 @@
|
||||
{{ props.row.DUE_DATE }}
|
||||
</div>
|
||||
<div slot="actions" slot-scope="props">
|
||||
<b-button v-if="props.row.STATUS === 'OPEN'" @click="onClick(props)" variant="outline-primary">{{$t("ID_CONTINUE")}}</b-button>
|
||||
<b-button
|
||||
v-if="props.row.STATUS === 'OPEN'"
|
||||
@click="onClick(props)"
|
||||
variant="outline-primary"
|
||||
>{{ $t("ID_CONTINUE") }}</b-button
|
||||
>
|
||||
</div>
|
||||
</v-server-table>
|
||||
</div>
|
||||
<TabsCaseDetail
|
||||
:dataCaseSummary="dataCaseSummaryTab"
|
||||
:dataCaseStatus="dataCaseStatusTab"
|
||||
:dataCase="dataCase"
|
||||
></TabsCaseDetail>
|
||||
<ModalCancelCase ref="modal-cancel-case"></ModalCancelCase>
|
||||
@@ -126,7 +131,7 @@ export default {
|
||||
ButtonFleft,
|
||||
ModalNewRequest,
|
||||
ModalClaimCase,
|
||||
TaskCell,
|
||||
TaskCell
|
||||
},
|
||||
props: {},
|
||||
data() {
|
||||
@@ -135,7 +140,7 @@ export default {
|
||||
dismissSecs: 5,
|
||||
dismissCountDown: 0,
|
||||
message: "",
|
||||
variant: "info",
|
||||
variant: "info"
|
||||
},
|
||||
dataCase: null,
|
||||
newCase: {
|
||||
@@ -151,7 +156,7 @@ export default {
|
||||
"assignee",
|
||||
"status",
|
||||
"due_date",
|
||||
"actions",
|
||||
"actions"
|
||||
],
|
||||
showTable: true,
|
||||
tableData: [],
|
||||
@@ -162,7 +167,7 @@ export default {
|
||||
assignee: this.$i18n.t("ID_CURRENT_USER"),
|
||||
status: this.$i18n.t("ID_STATUS"),
|
||||
due_date: this.$i18n.t("ID_DUE_DATE"),
|
||||
actions: this.$i18n.t("ID_ACTIONS"),
|
||||
actions: this.$i18n.t("ID_ACTIONS")
|
||||
},
|
||||
selectable: {
|
||||
mode: "single", // or 'multiple'
|
||||
@@ -178,22 +183,22 @@ export default {
|
||||
},
|
||||
},
|
||||
dataCaseSummary: null,
|
||||
dataCaseSummaryTab: null,
|
||||
dataCaseStatusTab: null,
|
||||
dataIoDocuments: {
|
||||
titleInput: this.$i18n.t("ID_REQUEST_DOCUMENTS"),
|
||||
titleOutput: this.$i18n.t("ID_OUTPUT_DOCUMENTS"),
|
||||
inputDocuments: [],
|
||||
outputDocuments: [],
|
||||
outputDocuments: []
|
||||
},
|
||||
dataAttachedDocuments: {
|
||||
title: "Attached Documents",
|
||||
items: [],
|
||||
items: []
|
||||
},
|
||||
attachDocuments: false,
|
||||
dataComments: {
|
||||
title: "Comments",
|
||||
items: [],
|
||||
},
|
||||
items: []
|
||||
}
|
||||
};
|
||||
},
|
||||
|
||||
@@ -215,7 +220,7 @@ export default {
|
||||
_.extend({}, this.dataCase, {
|
||||
COMMENT: comment,
|
||||
SEND_MAIL: send,
|
||||
FILES: files,
|
||||
FILES: files
|
||||
})
|
||||
)
|
||||
.then((response) => {
|
||||
@@ -252,8 +257,20 @@ export default {
|
||||
Api.cases
|
||||
.casesummary(this.dataCase)
|
||||
.then((response) => {
|
||||
var data = response.data;
|
||||
this.formatCaseSummary(response.data);
|
||||
var data = response.data.summary;
|
||||
this.dataCaseStatusTab = [];
|
||||
this.dataCaseStatusTab.push({
|
||||
title: null,
|
||||
items: response.data.caseProperties
|
||||
});
|
||||
|
||||
_.each(response.data.taskProperties, (o) => {
|
||||
this.dataCaseStatusTab.push({
|
||||
title: null,
|
||||
items: _.isArray(o) ? o : [o]
|
||||
});
|
||||
});
|
||||
|
||||
this.dataCaseSummary = {
|
||||
title: this.$i18n.t("ID_SUMMARY"),
|
||||
titleActions: this.$i18n.t("ID_ACTIONS"),
|
||||
@@ -261,30 +278,35 @@ export default {
|
||||
btnType: false,
|
||||
onClick: null,
|
||||
label: {
|
||||
numberCase: data[2].label,
|
||||
process: data[0].label,
|
||||
status: data[3].label,
|
||||
caseTitle: data[1].label,
|
||||
created: data[6].label,
|
||||
delegationDate: response.data[11].label,
|
||||
duration: this.$i18n.t("ID_DURATION"),
|
||||
process: data[1].label,
|
||||
processDescription: data[2].label,
|
||||
caseNumber: data[3].label,
|
||||
caseTitle: data[4].label,
|
||||
status: data[5].label,
|
||||
create: data[6].label,
|
||||
delegationDate: this.$i18n.t("ID_TASK_DELEGATE_DATE"),
|
||||
duration: this.$i18n.t("ID_DURATION")
|
||||
},
|
||||
text: {
|
||||
numberCase: data[2].value,
|
||||
process: data[0].value,
|
||||
status: data[3].value,
|
||||
caseTitle: data[1].value,
|
||||
created: data[6].value,
|
||||
delegationDate: response.data[11].value.split(" ")[0],
|
||||
duration: response.data[11].value.split(" ")[1],
|
||||
},
|
||||
process: data[1].value,
|
||||
processDescription: data[2].value,
|
||||
caseNumber: data[3].value,
|
||||
caseTitle: data[4].value,
|
||||
status: data[5].value,
|
||||
create: data[6].value,
|
||||
delegationDate: data[7] ? data[7].value : "",
|
||||
duration: data[8] ? data[8].value : ""
|
||||
}
|
||||
};
|
||||
// Hack for identify the cancel case button
|
||||
Api.cases
|
||||
.actions(this.dataCase).then((response)=>{
|
||||
action = _.find(response.data, function(o) { return o.id == "ACTIONS"; });
|
||||
Api.cases.actions(this.dataCase).then((response) => {
|
||||
action = _.find(response.data, function (o) {
|
||||
return o.id === "ACTIONS";
|
||||
});
|
||||
if (action) {
|
||||
option = _.find(action.options, function(o) { return o.fn == "cancelCase"; });
|
||||
option = _.find(action.options, function (o) {
|
||||
return o.fn === "cancelCase";
|
||||
});
|
||||
if (option && !option.hide) {
|
||||
that.dataCaseSummary.onClick = () => {
|
||||
that.$refs["modal-cancel-case"].show();
|
||||
@@ -313,7 +335,7 @@ export default {
|
||||
title: document[i].TITLE,
|
||||
extension: document[i].TITLE.split(".")[1],
|
||||
onClick: () => {},
|
||||
data: document[i],
|
||||
data: document[i]
|
||||
};
|
||||
this.dataIoDocuments.inputDocuments.push(info);
|
||||
}
|
||||
@@ -339,7 +361,7 @@ export default {
|
||||
title: document[i].TITLE,
|
||||
extension: document[i].TITLE.split(".")[1],
|
||||
onClick: () => {},
|
||||
data: document[i],
|
||||
data: document[i]
|
||||
};
|
||||
this.dataIoDocuments.outputDocuments.push(info);
|
||||
}
|
||||
@@ -414,16 +436,16 @@ export default {
|
||||
),
|
||||
date: n.NOTE_DATE,
|
||||
comment: n.NOTE_CONTENT,
|
||||
data: n,
|
||||
data: n
|
||||
});
|
||||
});
|
||||
|
||||
this.dataComments.items = notesArray;
|
||||
},
|
||||
formatCaseSummary(data) {
|
||||
formatCaseProperties(data) {
|
||||
let index,
|
||||
sections = [];
|
||||
this.dataCaseSummaryTab = [];
|
||||
this.dataCaseStatusTab = [];
|
||||
_.each(data, (o) => {
|
||||
if (
|
||||
(index = _.findIndex(sections, (s) => {
|
||||
@@ -432,14 +454,14 @@ export default {
|
||||
) {
|
||||
sections.push({
|
||||
title: o.section,
|
||||
items: [],
|
||||
items: []
|
||||
});
|
||||
index = 0;
|
||||
}
|
||||
sections[index].items.push(o);
|
||||
});
|
||||
|
||||
this.dataCaseSummaryTab = sections;
|
||||
this.dataCaseStatusTab = sections;
|
||||
},
|
||||
getCasesForVueTable() {
|
||||
let that = this,
|
||||
@@ -464,19 +486,23 @@ export default {
|
||||
let data = [];
|
||||
_.forEach(response, (v) => {
|
||||
data.push({
|
||||
TASK: [{
|
||||
TASK: [
|
||||
{
|
||||
TITLE: v.TAS_TITLE,
|
||||
CODE_COLOR: v.TAS_COLOR,
|
||||
COLOR: v.TAS_COLOR_LABEL,
|
||||
}],
|
||||
COLOR: v.TAS_COLOR_LABEL
|
||||
},
|
||||
],
|
||||
CASE_TITLE: v.DEL_TITLE,
|
||||
ASSIGNEE: v.USR_ID !== 0 ?
|
||||
utils.userNameDisplayFormat({
|
||||
ASSIGNEE:
|
||||
v.USR_ID !== 0
|
||||
? utils.userNameDisplayFormat({
|
||||
userName: v.USR_USERNAME,
|
||||
firstName: v.USR_LASTNAME,
|
||||
lastName: v.USR_LASTNAME,
|
||||
format: window.config.FORMATS.format || null
|
||||
}) : this.$i18n.t("ID_UNASSIGNED"),
|
||||
})
|
||||
: this.$i18n.t("ID_UNASSIGNED"),
|
||||
STATUS: v.DEL_THREAD_STATUS,
|
||||
DUE_DATE: v.DEL_TASK_DUE_DATE,
|
||||
TASK_COLOR: v.TAS_COLOR_LABEL,
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<template>
|
||||
<div>
|
||||
<tabs @changed="changed">
|
||||
<tab :name="$t('ID_SUMMARY')">
|
||||
<PmCaseSummary :data="dataCaseSummary"> </PmCaseSummary>
|
||||
<tab :name="$t('ID_STATUS')">
|
||||
<CaseStatus :data="dataCaseStatus"> </CaseStatus>
|
||||
</tab>
|
||||
<tab :name="$t('ID_MORE_INFORMATION')">
|
||||
<MoreInformation :data="dataCase" v-if="currentTab == $t('ID_MORE_INFORMATION')">
|
||||
<tab :name="$t('ID_CUSTOM_INFORMATION')">
|
||||
<MoreInformation :data="dataCase" v-if="currentTab == $t('ID_CUSTOM_INFORMATION')">
|
||||
</MoreInformation>
|
||||
</tab>
|
||||
<tab :name="$t('ID_PROCESS_MAP')">
|
||||
@@ -25,7 +25,7 @@
|
||||
<script>
|
||||
import Tabs from "./../components/tabs/Tabs.vue";
|
||||
import Tab from "./../components/tabs/Tab.vue";
|
||||
import PmCaseSummary from "./../components/home/caseDetail/PmCaseSummary.vue";
|
||||
import CaseStatus from "./../components/home/caseDetail/CaseStatus.vue";
|
||||
import ProcessMap from "./../components/home/caseDetail/ProcessMap.vue";
|
||||
import CaseHistory from "./../components/home/caseDetail/CaseHistory.vue";
|
||||
import ChangeLog from "./../components/home/caseDetail/ChangeLog.vue";
|
||||
@@ -38,14 +38,14 @@ export default {
|
||||
Tabs,
|
||||
Tab,
|
||||
ProcessMap,
|
||||
PmCaseSummary,
|
||||
CaseStatus,
|
||||
CaseHistory,
|
||||
ChangeLog,
|
||||
MoreInformation
|
||||
},
|
||||
props: {
|
||||
dataCase: Object,
|
||||
dataCaseSummary: Array,
|
||||
dataCaseStatus: Array
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
||||
@@ -643,20 +643,23 @@ class Cases
|
||||
* @param int $delIndex
|
||||
* @param array $caseData
|
||||
*
|
||||
* @return void
|
||||
* @return array
|
||||
*
|
||||
* @see Cases::updateCase()
|
||||
*/
|
||||
public function updateThreadTitle(string $appUid, int $appNumber, int $delIndex, $caseData = [])
|
||||
{
|
||||
$threadTitle = $this->getCaseTitle();
|
||||
if (empty($threadTitle) && !empty($appNumber) && !empty($delIndex)) {
|
||||
$threadTitle = '';
|
||||
$threadDescription = '';
|
||||
if (!empty($appNumber) && !empty($delIndex)) {
|
||||
$thread = Delegation::getThreadInfo($appNumber, $delIndex);
|
||||
$previous = $thread['DEL_PREVIOUS'];
|
||||
$appNumber = $thread['APP_NUMBER'];
|
||||
$tasUid = $thread['TAS_UID'];
|
||||
if (!empty($tasUid)) {
|
||||
$threadTitle = Delegation::getThreadTitle($tasUid, $appNumber, $previous, $caseData);
|
||||
$response = Delegation::getThreadTitle($tasUid, $appNumber, $previous, $caseData);
|
||||
$threadTitle = $response['title'];
|
||||
$threadDescription = $response['description'];
|
||||
}
|
||||
}
|
||||
// Update thread title
|
||||
@@ -666,6 +669,11 @@ class Cases
|
||||
$rows['DEL_TITLE'] = $threadTitle;
|
||||
$delegation = new AppDelegation();
|
||||
$delegation->update($rows);
|
||||
|
||||
return [
|
||||
'title' => $threadTitle,
|
||||
'description' => $threadDescription
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -803,7 +811,9 @@ class Cases
|
||||
|
||||
// Update case title
|
||||
if (!empty($appUid) && !empty($appFields['APP_NUMBER']) && $appFields['APP_NUMBER'] > 0 && !empty($appFields['DEL_INDEX'])) {
|
||||
$this->updateThreadTitle($appUid, $appFields['APP_NUMBER'], $appFields['DEL_INDEX'], $appFields['APP_DATA']);
|
||||
$threadInfo = $this->updateThreadTitle($appUid, $appFields['APP_NUMBER'], $appFields['DEL_INDEX'], $appFields['APP_DATA']);
|
||||
$Fields['APP_TITLE'] = $threadInfo['title'];
|
||||
$Fields['APP_DESCRIPTION'] = $threadInfo['description'];
|
||||
}
|
||||
|
||||
// Start: Save History --By JHL
|
||||
@@ -857,14 +867,6 @@ class Cases
|
||||
}
|
||||
}
|
||||
// End Save History
|
||||
|
||||
//We are removing the app_title and app_description because they already be updated in newRefreshCaseTitleAndDescription function
|
||||
if (isset($Fields['APP_TITLE'])) {
|
||||
unset($Fields['APP_TITLE']);
|
||||
}
|
||||
if (isset($Fields['APP_DESCRIPTION'])) {
|
||||
unset($Fields['APP_DESCRIPTION']);
|
||||
}
|
||||
if (isset($Fields["APP_STATUS"]) && $Fields["APP_STATUS"] == "COMPLETED") {
|
||||
if (isset($Fields['CURRENT_USER_UID'])) {
|
||||
$Fields['USR_UID'] = $Fields['CURRENT_USER_UID'];
|
||||
@@ -923,7 +925,6 @@ class Cases
|
||||
$inbox->update($Fields);
|
||||
/*----------------------------------********---------------------------------*/
|
||||
|
||||
//Return
|
||||
return $Fields;
|
||||
} catch (Exception $e) {
|
||||
throw ($e);
|
||||
@@ -1648,7 +1649,8 @@ class Cases
|
||||
// Get case title
|
||||
$threadTitle = $this->getCaseTitle();
|
||||
if (empty($threadTitle)) {
|
||||
$threadTitle = Delegation::getThreadTitle($tasUid, $appNumber, $previous, $caseData);
|
||||
$response = Delegation::getThreadTitle($tasUid, $appNumber, $previous, $caseData);
|
||||
$threadTitle = $response['title'];
|
||||
}
|
||||
|
||||
$user = UsersPeer::retrieveByPK($usrUid);
|
||||
|
||||
@@ -4127,6 +4127,12 @@ msgstr "The case was paused due to:"
|
||||
msgid "Reason to pause the case"
|
||||
msgstr "Reason to pause the case"
|
||||
|
||||
# TRANSLATION
|
||||
# LABEL/ID_CASE_PROPERTIES
|
||||
#: LABEL/ID_CASE_PROPERTIES
|
||||
msgid "Case Properties"
|
||||
msgstr "Case Properties"
|
||||
|
||||
# TRANSLATION
|
||||
# LABEL/ID_CASE_PROPERTIES_SAVE
|
||||
#: LABEL/ID_CASE_PROPERTIES_SAVE
|
||||
@@ -5243,6 +5249,12 @@ msgstr "Creating table, please wait..."
|
||||
msgid "Creating workspace {0}"
|
||||
msgstr "Creating workspace {0}"
|
||||
|
||||
# TRANSLATION
|
||||
# LABEL/ID_CREATOR
|
||||
#: LABEL/ID_CREATOR
|
||||
msgid "Creator"
|
||||
msgstr "Creator"
|
||||
|
||||
# TRANSLATION
|
||||
# LABEL/ID_CREDENTIAL_ERROR
|
||||
#: LABEL/ID_CREDENTIAL_ERROR
|
||||
@@ -5327,10 +5339,16 @@ msgstr "Your browser is not supported. See the list of supported browsers. List
|
||||
msgid "Current license"
|
||||
msgstr "Current license"
|
||||
|
||||
# TRANSLATION
|
||||
# LABEL/ID_CURRENT_TASKS
|
||||
#: LABEL/ID_CURRENT_TASKS
|
||||
msgid "Current Task(s) Properties"
|
||||
msgstr "Current Task(s) Properties"
|
||||
|
||||
# TRANSLATION
|
||||
# LABEL/ID_CURRENT_USER
|
||||
#: LABEL/ID_CURRENT_USER
|
||||
msgid "[LABEL/ID_CURRENT_USER] Current User"
|
||||
msgid "Current User"
|
||||
msgstr "Current User"
|
||||
|
||||
# TRANSLATION
|
||||
@@ -5363,6 +5381,12 @@ msgstr "Current Workspace"
|
||||
msgid "Custom Case List"
|
||||
msgstr "Custom Case List"
|
||||
|
||||
# TRANSLATION
|
||||
# LABEL/ID_CUSTOM_INFORMATION
|
||||
#: LABEL/ID_CUSTOM_INFORMATION
|
||||
msgid "Custom Information"
|
||||
msgstr "Custom Information"
|
||||
|
||||
# TRANSLATION
|
||||
# LABEL/ID_CUSTOM_TRIGGER
|
||||
#: LABEL/ID_CUSTOM_TRIGGER
|
||||
@@ -25298,7 +25322,7 @@ msgstr "Static Partial Join for Multiple Instance"
|
||||
# TRANSLATION
|
||||
# LABEL/ID_STATUS
|
||||
#: LABEL/ID_STATUS
|
||||
msgid "[LABEL/ID_STATUS] Status"
|
||||
msgid "Status"
|
||||
msgstr "Status"
|
||||
|
||||
# TRANSLATION
|
||||
@@ -25751,6 +25775,12 @@ msgstr "Tasks"
|
||||
msgid "You can't delete the task \"{0}\" because it has {1} cases."
|
||||
msgstr "You can't delete the task \"{0}\" because it has {1} cases."
|
||||
|
||||
# TRANSLATION
|
||||
# LABEL/ID_TASK_DELEGATE_DATE
|
||||
#: LABEL/ID_TASK_DELEGATE_DATE
|
||||
msgid "Task Delegate Date"
|
||||
msgstr "Task Delegate Date"
|
||||
|
||||
# TRANSLATION
|
||||
# LABEL/ID_TASK_DEFINED_MANUAL_ASSIGNMENT
|
||||
#: LABEL/ID_TASK_DEFINED_MANUAL_ASSIGNMENT
|
||||
@@ -25769,6 +25799,12 @@ msgstr "Task does not have a routing rule. Please, check the process definition.
|
||||
msgid "Task Duration"
|
||||
msgstr "Task Duration"
|
||||
|
||||
# TRANSLATION
|
||||
# LABEL/ID_TASK_DUE_DATE
|
||||
#: LABEL/ID_TASK_DUE_DATE
|
||||
msgid "Task Due Date"
|
||||
msgstr "Task Due Date"
|
||||
|
||||
# TRANSLATION
|
||||
# LABEL/ID_TASK_ID
|
||||
#: LABEL/ID_TASK_ID
|
||||
@@ -25781,6 +25817,12 @@ msgstr "Task ID"
|
||||
msgid "[LABEL/ID_TASK_INFORMATION] Task Information"
|
||||
msgstr "Task Information"
|
||||
|
||||
# TRANSLATION
|
||||
# LABEL/ID_TASK_INIT_DATE
|
||||
#: LABEL/ID_TASK_INIT_DATE
|
||||
msgid "Task Init Date"
|
||||
msgstr "Task Init Date"
|
||||
|
||||
# TRANSLATION
|
||||
# LABEL/ID_TASK_INVALID_USER_NOT_ASSIGNED_TASK
|
||||
#: LABEL/ID_TASK_INVALID_USER_NOT_ASSIGNED_TASK
|
||||
|
||||
@@ -12,7 +12,9 @@
|
||||
use ProcessMaker\BusinessModel\Cases as BmCases;
|
||||
use ProcessMaker\Exception\CaseNoteUploadFile;
|
||||
use ProcessMaker\Model\AppNotes as Notes;
|
||||
use ProcessMaker\Model\Delegation;
|
||||
use ProcessMaker\Model\Documents;
|
||||
use ProcessMaker\Model\User;
|
||||
use ProcessMaker\Util\DateTime;
|
||||
|
||||
if (!isset($_SESSION['USER_LOGGED'])) {
|
||||
@@ -256,90 +258,165 @@ class AppProxy extends HttpProxyController
|
||||
}
|
||||
|
||||
/**
|
||||
* get the case summary data
|
||||
* Get the case summary data
|
||||
*
|
||||
* @param string $httpData->appUid
|
||||
* @param string $httpData->delIndex
|
||||
* @return array containg the case summary data
|
||||
* @param object $httpData
|
||||
*
|
||||
* @return array contain the case summary data
|
||||
*/
|
||||
function getSummary ($httpData)
|
||||
{
|
||||
$labelsCaseProperties = array ();
|
||||
$labelsCurrentTaskProperties = array ();
|
||||
$labelTitleCurrentTasks = array ();
|
||||
|
||||
$formCaseProperties = new Form( 'cases/cases_Resume', PATH_XMLFORM, SYS_LANG );
|
||||
$formCaseTitle = new Form( 'cases/cases_Resume_Current_Task_Title', PATH_XMLFORM, SYS_LANG );
|
||||
$formCurrentTaskProperties = new Form( 'cases/cases_Resume_Current_Task', PATH_XMLFORM, SYS_LANG );
|
||||
|
||||
$case = new Cases();
|
||||
|
||||
foreach ($formCaseProperties->fields as $fieldName => $field) {
|
||||
$labelsCaseProperties[$fieldName] = $field->label;
|
||||
}
|
||||
|
||||
foreach ($formCaseTitle->fields as $fieldName => $field) {
|
||||
$labelTitleCurrentTasks[$fieldName] = $field->label;
|
||||
}
|
||||
|
||||
foreach ($formCurrentTaskProperties->fields as $fieldName => $field) {
|
||||
$labelsCurrentTaskProperties[$fieldName] = $field->label;
|
||||
}
|
||||
|
||||
if (isset( $_SESSION['_applicationFields'] ) && $_SESSION['_processData']) {
|
||||
$applicationFields = $_SESSION['_applicationFields'];
|
||||
unset( $_SESSION['_applicationFields'] );
|
||||
$processData = $_SESSION['_processData'];
|
||||
unset( $_SESSION['_processData'] );
|
||||
} else {
|
||||
if ($httpData->action == 'sent') { // Get the last valid delegation for participated list
|
||||
$criteria = new Criteria();
|
||||
$criteria->addSelectColumn(AppDelegationPeer::DEL_INDEX);
|
||||
$criteria->add(AppDelegationPeer::APP_UID, $httpData->appUid);
|
||||
$criteria->add(AppDelegationPeer::DEL_FINISH_DATE, null, Criteria::ISNULL);
|
||||
$criteria->addDescendingOrderByColumn(AppDelegationPeer::DEL_INDEX);
|
||||
if (AppDelegationPeer::doCount($criteria) > 0) {
|
||||
$dataset = AppDelegationPeer::doSelectRS($criteria, Propel::getDbConnection('workflow_ro') );
|
||||
$dataset->setFetchmode(ResultSet::FETCHMODE_ASSOC);
|
||||
$dataset->next();
|
||||
$row = $dataset->getRow();
|
||||
$httpData->delIndex = $row['DEL_INDEX'];
|
||||
}
|
||||
}
|
||||
$applicationFields = $case->loadCase( $httpData->appUid, $httpData->delIndex );
|
||||
$appFields = $case->loadCase($httpData->appUid, $httpData->delIndex);
|
||||
// Get the process
|
||||
$process = new Process();
|
||||
$processData = $process->load( $applicationFields['PRO_UID'] );
|
||||
$processInfo = $process->load($appFields['PRO_UID']);
|
||||
// Apply mask
|
||||
$createDateLabel = applyMaskDateEnvironment($appFields['CREATE_DATE'],'', false);
|
||||
$updateDateLabel = applyMaskDateEnvironment($appFields['UPDATE_DATE'],'', false);
|
||||
// Get summary
|
||||
$i = 0;
|
||||
$summary = [
|
||||
$i++ => [
|
||||
'id' => 'TITLE',
|
||||
'label' => G::LoadTranslation('ID_SUMMARY'),
|
||||
'value' => '',
|
||||
],
|
||||
$i++ => [ // Process
|
||||
'id' => 'PRO_TITLE',
|
||||
'label' => G::LoadTranslation('ID_PROCESS_NAME') . ': ',
|
||||
'value' => $processInfo['PRO_TITLE'],
|
||||
],
|
||||
$i++ => [ // Process description
|
||||
'id' => 'PRO_DESCRIPTION',
|
||||
'label' => G::LoadTranslation('ID_PRO_DESCRIPTION') . ': ',
|
||||
'value' => $processInfo['PRO_DESCRIPTION'],
|
||||
],
|
||||
$i++ => [ // Case Number
|
||||
'id' => 'APP_NUMBER',
|
||||
'label' => G::LoadTranslation('ID_CASE_NUMBER') . ': ',
|
||||
'value' => $appFields['APP_NUMBER'],
|
||||
],
|
||||
$i++ => [ // Case Title
|
||||
'id' => 'CASE_TITLE',
|
||||
'label' => G::LoadTranslation('ID_CASE_TITLE') . ': ',
|
||||
'value' => $appFields['TITLE'],
|
||||
],
|
||||
$i++ => [ // Case Status
|
||||
'id' => 'CASE_STATUS',
|
||||
'label' => G::LoadTranslation('ID_CASE_STATUS') . ': ',
|
||||
'value' => $appFields['STATUS'],
|
||||
],
|
||||
$i++ => [ // Create Date
|
||||
'id' => 'CREATE_DATE',
|
||||
'label' => G::LoadTranslation('ID_CREATE_DATE') . ': ',
|
||||
'value' => DateTime::convertUtcToTimeZone($createDateLabel),
|
||||
],
|
||||
];
|
||||
// Get case properties
|
||||
$i = 0;
|
||||
$caseProperties = [
|
||||
$i++ => [
|
||||
'id' => 'TITLE',
|
||||
'label' => G::LoadTranslation('ID_CASE_PROPERTIES'),
|
||||
'value' => '',
|
||||
],
|
||||
$i++ => [ // Case Number
|
||||
'id' => 'APP_NUMBER',
|
||||
'label' => G::LoadTranslation('ID_CASE_NUMBER') . ': ',
|
||||
'value' => $appFields['APP_NUMBER'],
|
||||
],
|
||||
$i++ => [ // Case Title
|
||||
'id' => 'CASE_TITLE',
|
||||
'label' => G::LoadTranslation('ID_CASE_TITLE') . ': ',
|
||||
'value' => $appFields['TITLE'],
|
||||
],
|
||||
$i++ => [ // Case Description
|
||||
'id' => 'CASE_DESCRIPTION',
|
||||
'label' => G::LoadTranslation('ID_CASE_DESCRIPTION') . ': ',
|
||||
'value' => $appFields["DESCRIPTION"],
|
||||
],
|
||||
$i++ => [ // Case Status
|
||||
'id' => 'CASE_STATUS',
|
||||
'label' => G::LoadTranslation('ID_CASE_STATUS') . ': ',
|
||||
'value' => $appFields['STATUS'],
|
||||
],
|
||||
$i++ => [ // Case Uid
|
||||
'id' => 'APP_UID',
|
||||
'label' => G::LoadTranslation('ID_CASE_UID') . ': ',
|
||||
'value' => $appFields['APP_UID'],
|
||||
],
|
||||
$i++ => [ // Creator
|
||||
'id' => 'CREATOR',
|
||||
'label' => G::LoadTranslation('ID_CREATOR') . ': ',
|
||||
'value' => $appFields['CREATOR'],
|
||||
],
|
||||
$i++ => [ // Create Date
|
||||
'id' => 'CREATE_DATE',
|
||||
'label' => G::LoadTranslation('ID_CREATE_DATE') . ': ',
|
||||
'value' => DateTime::convertUtcToTimeZone($createDateLabel),
|
||||
],
|
||||
$i++ => [ // Last Update
|
||||
'id' => 'UPDATE_DATE',
|
||||
'label' => G::LoadTranslation('ID_LAST_DATE') . ': ',
|
||||
'value' => DateTime::convertUtcToTimeZone($updateDateLabel),
|
||||
],
|
||||
];
|
||||
// Get the pending threads
|
||||
$delegation = new Delegation();
|
||||
$threads = $delegation::getPendingThreads($appFields['APP_NUMBER']);
|
||||
$i = 0;
|
||||
$taskProperties[$i] = [
|
||||
'id' => 'TITLE',
|
||||
'label' => G::LoadTranslation('ID_CURRENT_TASKS'),
|
||||
'value' => '',
|
||||
];
|
||||
foreach ($threads as $row) {
|
||||
$j = 0;
|
||||
$delegateDateLabel = applyMaskDateEnvironment($appFields['DEL_DELEGATE_DATE'],'', false);
|
||||
$initDateLabel = applyMaskDateEnvironment($appFields['DEL_INIT_DATE'],'', false);
|
||||
$dueDateLabel = applyMaskDateEnvironment($appFields['DEL_TASK_DUE_DATE'],'', false);
|
||||
if (!empty($row['USR_ID'])) {
|
||||
$userInfo = User::getInformation($row['USR_ID']);
|
||||
$currentUser = $userInfo['usr_lastname'] .' '. $userInfo['usr_firstname'];
|
||||
} else {
|
||||
$currentUser = G::LoadTranslation('ID_UNASSIGNED');
|
||||
}
|
||||
$threadProperties = [
|
||||
$j++ => [ // Task
|
||||
'id' => 'TASK_TITLE',
|
||||
'label' => G::LoadTranslation('ID_TASK') . ': ',
|
||||
'value' => $row['TAS_TITLE'],
|
||||
],
|
||||
$j++ => [ // Current User
|
||||
'id' => 'CURRENT_USER',
|
||||
'label' => G::LoadTranslation('ID_CURRENT_USER') . ': ',
|
||||
'value' => $currentUser,
|
||||
],
|
||||
$j++ => [ // Task Delegate Date
|
||||
'id' => 'DEL_DELEGATE_DATE',
|
||||
'label' => G::LoadTranslation('ID_TASK_DELEGATE_DATE') . ': ',
|
||||
'value' => DateTime::convertUtcToTimeZone($delegateDateLabel),
|
||||
],
|
||||
$j++ => [ // Task Init Date
|
||||
'id' => 'DEL_INIT_DATE',
|
||||
'label' => G::LoadTranslation('ID_TASK_INIT_DATE') . ': ',
|
||||
'value' => DateTime::convertUtcToTimeZone($initDateLabel),
|
||||
],
|
||||
$j++ => [ // Task Due Date
|
||||
'id' => 'DEL_TASK_DUE_DATE',
|
||||
'label' => G::LoadTranslation('ID_TASK_DUE_DATE') . ': ',
|
||||
'value' => DateTime::convertUtcToTimeZone($dueDateLabel),
|
||||
],
|
||||
];
|
||||
$taskProperties[++$i] = $threadProperties;
|
||||
}
|
||||
// Prepare the result
|
||||
$data = [];
|
||||
$data['summary'] = $summary;
|
||||
$data['caseProperties'] = $caseProperties;
|
||||
$data['taskProperties'] = $taskProperties;
|
||||
|
||||
$data = array ();
|
||||
$task = new Task();
|
||||
$taskData = $task->load( $applicationFields['TAS_UID'] );
|
||||
$currentUser = $applicationFields['CURRENT_USER'] != '' ? $applicationFields['CURRENT_USER'] : '[' . G::LoadTranslation( 'ID_UNASSIGNED' ) . ']';
|
||||
|
||||
$data[] = array ('label' => $labelsCaseProperties['PRO_TITLE'],'value' => $processData['PRO_TITLE'],'section' => $labelsCaseProperties['TITLE1']);
|
||||
$data[] = array ("label" => $labelsCaseProperties["TITLE"], "value" => htmlentities($applicationFields["TITLE"], ENT_QUOTES, "UTF-8"), "section" => $labelsCaseProperties["TITLE1"]);
|
||||
$data[] = array ('label' => $labelsCaseProperties['APP_NUMBER'],'value' => $applicationFields['APP_NUMBER'],'section' => $labelsCaseProperties['TITLE1']);
|
||||
$data[] = array ('label' => $labelsCaseProperties['STATUS'],'value' => $applicationFields['STATUS'],'section' => $labelsCaseProperties['TITLE1']);
|
||||
$data[] = array ('label' => $labelsCaseProperties['APP_UID'],'value' => $applicationFields['APP_UID'],'section' => $labelsCaseProperties['TITLE1']);
|
||||
$data[] = array ('label' => $labelsCaseProperties['CREATOR'],'value' => $applicationFields['CREATOR'],'section' => $labelsCaseProperties['TITLE1']);
|
||||
$data[] = array ('label' => $labelsCaseProperties['CREATE_DATE'],'value' => $applicationFields['CREATE_DATE'],'section' => $labelsCaseProperties['TITLE1']);
|
||||
$data[] = array ('label' => $labelsCaseProperties['UPDATE_DATE'],'value' => $applicationFields['UPDATE_DATE'],'section' => $labelsCaseProperties['TITLE1']);
|
||||
$data[] = array ("label" => $labelsCaseProperties["DESCRIPTION"], "value" => htmlentities($applicationFields["DESCRIPTION"], ENT_QUOTES, "UTF-8"), "section" => $labelsCaseProperties["TITLE1"]);
|
||||
|
||||
// note added by krlos pacha carlos[at]colosa[dot]com
|
||||
//getting this field if it doesn't exist. Related 7994 bug
|
||||
$oTask = new \Task();
|
||||
$aTasks = $oTask->load($applicationFields['TAS_UID']);
|
||||
$taskData['TAS_TITLE'] = (array_key_exists( 'TAS_TITLE', $taskData )) ? $taskData['TAS_TITLE'] : $aTasks["TAS_TITLE"];
|
||||
$data[] = array ("label" => $labelsCurrentTaskProperties["TAS_TITLE"], "value" => htmlentities($taskData["TAS_TITLE"], ENT_QUOTES, "UTF-8"), "section" => $labelTitleCurrentTasks["TITLE2"]);
|
||||
$data[] = array ('label' => $labelsCurrentTaskProperties['CURRENT_USER'],'value' => $currentUser,'section' => $labelTitleCurrentTasks['TITLE2']);
|
||||
$data[] = array ('label' => $labelsCurrentTaskProperties['DEL_DELEGATE_DATE'],'value' => $applicationFields['DEL_DELEGATE_DATE'],'section' => $labelTitleCurrentTasks['TITLE2']);
|
||||
$data[] = array ('label' => $labelsCurrentTaskProperties['DEL_INIT_DATE'],'value' => $applicationFields['DEL_INIT_DATE'],'section' => $labelTitleCurrentTasks['TITLE2']);
|
||||
$data[] = array ('label' => $labelsCurrentTaskProperties['DEL_TASK_DUE_DATE'],'value' => $applicationFields['DEL_TASK_DUE_DATE'],'section' => $labelTitleCurrentTasks['TITLE2']);
|
||||
$data[] = array ('label' => $labelsCurrentTaskProperties['DEL_FINISH_DATE'],'value' => $applicationFields['DEL_FINISH_DATE'],'section' => $labelTitleCurrentTasks['TITLE2']);
|
||||
//$data[] = array('label'=>$labelsCurrentTaskProperties['DYN_UID'] , 'value' => $processData['PRO_DYNAFORMS']['PROCESS'];, 'section'=>$labelsCurrentTaskProperties['DYN_UID']);
|
||||
|
||||
$data = \ProcessMaker\Util\DateTime::convertUtcToTimeZone($data);
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57499,6 +57499,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE
|
||||
( 'LABEL','ID_CASE_PAUSED_SUCCESSFULLY','en','The Case {APP_NUMBER} was paused successfully and it will be unpaused on date {UNPAUSE_DATE}','2014-01-15') ,
|
||||
( 'LABEL','ID_CASE_PAUSE_LABEL_NOTE','en','The case was paused due to:','2014-10-21') ,
|
||||
( 'LABEL','ID_CASE_PAUSE_REASON','en','Reason to pause the case','2014-10-21') ,
|
||||
( 'LABEL','ID_CASE_PROPERTIES','en','Case Properties','2021-03-20') ,
|
||||
( 'LABEL','ID_CASE_PROPERTIES_SAVE','en','Case Tracker Properties Saved Successfully','2014-01-15') ,
|
||||
( 'LABEL','ID_CASE_REACTIVATED_SUCCESSFULLY','en','The case {APP_NUMBER} was reactivated successfully!','2014-01-15') ,
|
||||
( 'LABEL','ID_CASE_RESPONSE_NOT_AVAILABLE','en','No response available, please review the case information','2018-03-02') ,
|
||||
@@ -57694,6 +57695,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE
|
||||
( 'LABEL','ID_CREATING','en','Creating : {0}','2014-01-15') ,
|
||||
( 'LABEL','ID_CREATING_TABLE','en','Creating table, please wait...','2014-01-15') ,
|
||||
( 'LABEL','ID_CREATING_WORKSPACE','en','Creating workspace {0}','2014-01-15') ,
|
||||
( 'LABEL','ID_CREATOR','en','Creator','2021-03-20') ,
|
||||
( 'LABEL','ID_CREDENTIAL_ERROR','en','Credentials Error','2014-01-15') ,
|
||||
( 'LABEL','ID_CRON_ACTIONS','en','Cron','2014-01-15') ,
|
||||
( 'LABEL','ID_CRON_ACTIONS_LOG','en','Cron Actions Log','2014-01-15') ,
|
||||
@@ -57708,12 +57710,14 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE
|
||||
( 'LABEL','ID_CURRENT_ASSING_TYPE_WITH_CASES','en','The current activity has cases and cannot be deleted','2015-12-10') ,
|
||||
( 'LABEL','ID_CURRENT_BROWSER_NOT_SUPPORTED','en','Your browser is not supported. See the list of supported browsers. List of supported browsers is a link to the wiki page: http://wiki.processmaker.com/3.0/Supported_Browsers','2014-10-22') ,
|
||||
( 'LABEL','ID_CURRENT_LICENSE','en','Current license','2014-09-18') ,
|
||||
( 'LABEL','ID_CURRENT_TASKS','en','Current Task(s) Properties','2021-03-20') ,
|
||||
( 'LABEL','ID_CURRENT_USER','en','Current User','2014-01-15') ,
|
||||
( 'LABEL','ID_CURRENT_USERS','en','Current Users','2014-01-15') ,
|
||||
( 'LABEL','ID_CURRENT_VALUES','en','Current Values','2014-01-15') ,
|
||||
( 'LABEL','ID_CURRENT_VERSION','en','Current version','2014-09-18') ,
|
||||
( 'LABEL','ID_CURRENT_WORKSPACE','en','Current Workspace','2014-01-15') ,
|
||||
( 'LABEL','ID_CUSTOM_CASES_LISTS','en','Custom Case List','2017-02-21') ,
|
||||
( 'LABEL','ID_CUSTOM_INFORMATION','en','Custom Case List','2021-03-20') ,
|
||||
( 'LABEL','ID_CUSTOM_TRIGGER','en','Custom Trigger','2014-01-15') ,
|
||||
( 'LABEL','ID_CUSTOM_TRIGGER_DESCRIPTION','en','Custom Trigger','2014-01-15') ,
|
||||
( 'LABEL','ID_CUSTOM_SCHEDULE_SETTINGS','en','Custom schedule settings','2014-01-15') ,
|
||||
@@ -61211,11 +61215,14 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE
|
||||
( 'LABEL','ID_TASK','en','Task','2014-01-15') ,
|
||||
( 'LABEL','ID_TASKS','en','Tasks','2014-01-15') ,
|
||||
( 'LABEL','ID_TASK_CANT_DELETE','en','You can''t delete the task "{0}" because it has {1} cases.','2014-01-15') ,
|
||||
( 'LABEL','ID_TASK_DELEGATE_DATE','en','Task Delegate Date','2021-03-20') ,
|
||||
( 'LABEL','ID_TASK_DEFINED_MANUAL_ASSIGNMENT','en','The task is defined for Manual assignment','2014-01-15') ,
|
||||
( 'LABEL','ID_TASK_DOES_NOT_HAVE_ROUTING_RULE','en','Task does not have a routing rule. Please, check the process definition.','2015-01-16') ,
|
||||
( 'LABEL','ID_TASK_DURATION','en','Task Duration','2014-01-15') ,
|
||||
( 'LABEL','ID_TASK_DUE_DATE','en','Task Due Date','2021-03-20') ,
|
||||
( 'LABEL','ID_TASK_ID','en','Task ID','2014-01-15') ,
|
||||
( 'LABEL','ID_TASK_INFORMATION','en','Task Information','2014-01-15') ,
|
||||
( 'LABEL','ID_TASK_INIT_DATE','en','Task Init Date','2021-03-20') ,
|
||||
( 'LABEL','ID_TASK_INVALID_USER_NOT_ASSIGNED_TASK','en','Task invalid or the user is not assigned to the task','2014-01-15') ;
|
||||
INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE ) VALUES
|
||||
|
||||
|
||||
@@ -1807,6 +1807,9 @@ class Delegation extends Model
|
||||
'TASK.TAS_TITLE',
|
||||
'TASK.TAS_ASSIGN_TYPE',
|
||||
'APP_DELEGATION.USR_ID',
|
||||
'APP_DELEGATION.DEL_DELEGATE_DATE',
|
||||
'APP_DELEGATION.DEL_FINISH_DATE',
|
||||
'APP_DELEGATION.DEL_INIT_DATE',
|
||||
'APP_DELEGATION.DEL_TASK_DUE_DATE'
|
||||
]);
|
||||
// Join with task
|
||||
@@ -1867,9 +1870,12 @@ class Delegation extends Model
|
||||
$caseData = $r;
|
||||
}
|
||||
}
|
||||
// Get task title defined
|
||||
//
|
||||
$task = new Task();
|
||||
// Get case title defined
|
||||
$taskTitle = $task->taskCaseTitle($tasUid);
|
||||
// Get case description defined
|
||||
$taskDescription = $task->taskCaseDescription($tasUid);
|
||||
// If exist we will to replace the variables data
|
||||
if (!empty($taskTitle)) {
|
||||
$threadTitle = G::replaceDataField($taskTitle, $caseData, 'mysql', false);
|
||||
@@ -1886,8 +1892,16 @@ class Delegation extends Model
|
||||
$threadTitle = '# ' . $appNumber;
|
||||
}
|
||||
}
|
||||
// If exist we will to replace the variables data
|
||||
$threadDescription = '';
|
||||
if (!empty($taskDescription)) {
|
||||
$threadDescription = G::replaceDataField($taskDescription, $caseData, 'mysql', false);
|
||||
}
|
||||
|
||||
return $threadTitle;
|
||||
return [
|
||||
'title' => $threadTitle,
|
||||
'description' => $threadDescription
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -158,6 +158,27 @@ class Task extends Model
|
||||
return $title;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the description of the task
|
||||
*
|
||||
* @param string $tasUid
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function taskCaseDescription(string $tasUid)
|
||||
{
|
||||
$query = Task::query()->select(['TAS_DEF_DESCRIPTION']);
|
||||
$query->where('TAS_UID', $tasUid);
|
||||
$query->limit(1);
|
||||
$results = $query->get();
|
||||
$title = '';
|
||||
$results->each(function ($item) use (&$title) {
|
||||
$title = $item->TAS_DEF_DESCRIPTION;
|
||||
});
|
||||
|
||||
return $title;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get task data
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user