Как заполнить поле FromCustomer в шаблоне заявки?

Обсуждение вопросов и решений

Модератор: ykolesnikov

Ответить
ovolik
OTRS Новобранец
Сообщения: 13
Зарегистрирован: 02 окт 2015, 17:32

Как заполнить поле FromCustomer в шаблоне заявки?

Сообщение ovolik » 19 авг 2017, 16:19

Добрый день, коллеги.

Наш суппорт оказывает консультационную поддержку даже незарегистрированным пользователям. Для таких пользователей мы используем одну учетную запись кастомера: Anonimous и динамическое поле Phone Number. Поскольку при оказании такой услуги известно все: тип заявки, кастомер, очередь, сервис, SLA, приоритет и т.д, то мы сделали шаблон при выборе которого хотелось бы, чтобы все эти поля заполнились автоматически, а агенту осталось бы из динамического поля выбрать один из предопределенных видов консультации и закрыть заявку.

по инструкции из http://otrs.ru/forum/viewtopic.php?f=4& ... 0%BE%D0%BA сделали шаблон, который прекрасно работает при заполнении простых полей типа Dest, DynamicField_ITSMImpact, Subject, Body

Проблема возникает, когда мы пытаемся заполнить поле FromCustomer. Ничего не происходит. Есть предположение, что это связано с тем, что при выборе значения этого поля (а также таких как Service, SLA) форма перегружается. Аналогичная проблема и с полями Service и SLA, но она связана, думаю, как раз с тем, что не выбран кастомер, а именно к нему привязываются сервисы, поэтому пока хочу разобраться с полем FromCustomer.

Можете показать пример в котором бы поле FormCustomer (Customer user) заполнялось бы заранее определенным в шаблоне значением?
Что значит <input type="hidden" name="ExpandCustomerName" value="1"/>?


OTRS 5.0.22
ru_Custom.pm
$Self->{Translation}->{'Templates'} = 'Шаблоны заявок';
$Self->{Translation}->{'Consultation'} = 'Консультация';
$Self->{Translation}->{'Something else'} = 'Что-то еще...';

AgentTicketPhone.tt
# example template for customizations, see hidden form at the end of the file
<label>[% Translate("Templates") | html %]:</label>
<div class="Field">
<button type="button" onclick="$('#Template1').submit()" value=[% Translate("Consultation") | html %]>[% Translate("Consultation") | html %]</button>
<button type="button" onclick="$('#Template2').submit()" value=[% Translate("Something else") | html %]>[% Translate("Something else") | html %]</button>
</div>

# example template form for customizations
<form action="[% Env("CGIHandle") %]" method="post" enctype="multipart/form-data" id="Template1">
<input type="hidden" name="Action" value="[% Env("Action") %]"/>
<input type="hidden" name="Subaction" value="StoreNew"/>
<input type="hidden" name="FormID" value="[% Data.FormID | html %]"/>
<input type="hidden" name="ExpandCustomerName" value="0"/>
<input type="hidden" name="TypeID" value="5"/>
<input type="hidden" name="Dest" value="1st line support"/>
<input type="hidden" name="FromCustomer" value="Anonimous "/>
<input type="hidden" name="CustomerID" value="1"/>
<input type="hidden" name="ServiceID" value="9"/>
<input type="hidden" name="DynamicField_ITSMImpact" value="1 very low"/>
<input type="hidden" name="DynamicField_PhoneNumber" value="00000000000"/>
<input type="hidden" name="Subject" value="Консультирование пользователя"/>
<input type="hidden" name="Body" value="выполнили консультацию по теме {}"/>
<input type="hidden" name="Expand" value="1" />
</form>

Что значит <input type="hidden" name="ExpandCustomerName" value="1"/>? при изменении значения на 0, поведение меняется (см. скриншоты https://goo.gl/photos/84pg42pEiYRo52Bd9)?

Заранее признателен за помощь. Может есть другой вариант решить поставленную задачу?

MrIch
OTRS Новобранец
Сообщения: 97
Зарегистрирован: 30 ноя 2015, 10:37

Re: Как заполнить поле FromCustomer в шаблоне заявки?

Сообщение MrIch » 21 авг 2017, 15:20

Приветствую!

Я бы не парился с этим, а ввел просто динамическое поле, в котором бы выбирал определенное направление деятельности.
А в коде .pm этого модуля - после создания заявки обновлял бы на нужные сервисы\SLA или что там еще нужно.
OTRS ITSM 5.0.3
Ubuntu 14.04 + PostgreySQL 9.3.9 +Apache 2.4.7

ovolik
OTRS Новобранец
Сообщения: 13
Зарегистрирован: 02 окт 2015, 17:32

Re: Как заполнить поле FromCustomer в шаблоне заявки?

Сообщение ovolik » 25 авг 2017, 12:26

MrIch писал(а):Приветствую!

Я бы не парился с этим, а ввел просто динамическое поле, в котором бы выбирал определенное направление деятельности.
А в коде .pm этого модуля - после создания заявки обновлял бы на нужные сервисы\SLA или что там еще нужно.
Спасибо за ответ!

правильно ли я вас понимаю, что вы предлагаете сделать свой модуль, скажем AgentTicketConsultation.pm путем копировая того же AgentTicketPhone.pm? Далее в коде этого модуля мы правим все, что нужно.

Если это так, то у меня три вопроса:
1. смогу я в коде .pm решить свои задачи? Я вижу два варианта:
- или оставить все поля, как и в AgentTicketPhone.pm, но сделать их необязательными к заполнению и невидимыми, а заполнять их статическими значениями через GenericAgent при сохранении заявки.
- или заполнить их в самом коде (но тоже сделать невидимыми, чтобы не перегружать интерфейс)
2. смогу ли я открыть другой AgentTicketConsultation.pm путем нажатия созданной кнопки в форме AgentTicketPhone.pm?
3. Почему бы в таком случае не добавить IF в код AgentTicketPhone.pm? Т.е. в случае, если мы нажали на кнопку шаблона (или выбрали например предопределенный тип заявки) заполнять нужные нам поля в коде модуля.

Дополнительный вопрос - не смогли бы вы помочь с правкой модуля за разумное вознаграждение?

MrIch
OTRS Новобранец
Сообщения: 97
Зарегистрирован: 30 ноя 2015, 10:37

Re: Как заполнить поле FromCustomer в шаблоне заявки?

Сообщение MrIch » 25 авг 2017, 13:27

Я предлагаю вам напрямую менять AgentTicketPhone.pm, делать еще один модуль нет необходимости. Только если вы хотите повесить видоизмененный модуль на другую кнопку - то тогда имеет смысл с этим мучаться).
Его измененную версию необходимо будет закинуть в папку Custom - про это ищите в мануалах, я ибо не обновляю отрску меняю прямо системный код и не парюсь.


1. Да сможете, проще это будет делать напрямую в коде, чем через GA.
2. Если вы будете делать отдельный модуль - то лучше его завязать на отдельную кнопку в интерфейсе, и его открыть можно будет сколько угодно раз.
3. Ну я собственно это и имею ввиду, только делать это не через шаблоны, а просто сделать динамическое поле, которые будет выбирать пользователь, и от этого играться.

Например, у меня меняются заголовки тикетов в зависимости от динамического поля $Ticket12{'DynamicField_015'}

Код: Выделить всё

my $Path2 = $Path21 . '_' . $Ticket12{'TicketNumber'} . '_' . $Ticket12{'DynamicField_007'};
        unless ( $Ticket12{'DynamicField_015'} ) {
        my $Success10 = $TicketObject->TicketTitleUpdate(
            Title    => $Path2,
            TicketID => $TicketID,
            UserID   => 1,
        );
($Path21 - оффис,$Ticket12{'DynamicField_007'} - название дилера)
OTRS ITSM 5.0.3
Ubuntu 14.04 + PostgreySQL 9.3.9 +Apache 2.4.7

ovolik
OTRS Новобранец
Сообщения: 13
Зарегистрирован: 02 окт 2015, 17:32

Re: Как заполнить поле FromCustomer в шаблоне заявки?

Сообщение ovolik » 25 авг 2017, 18:50

Еще раз спасибо за помощь.

Для упрощения задачи предположим, что я буду править AgentTicketPhone.pm,

Подскажите, пожалуйста, для примера кусок кода, который бы установил бы тип заявки на ServiceRequest, в поле CustomerUser вбил бы "User1", выбрал бы очередь "1sl line support". Я с Perl-ом и веб- приложениями не знаком. У меня есть программист, который на PHP пишет, как вы думаете - он справится с нужной мне задачей по вашему примеру?

если это занимает достаточное количество времени - готов оплатить работу.

MrIch
OTRS Новобранец
Сообщения: 97
Зарегистрирован: 30 ноя 2015, 10:37

Re: Как заполнить поле FromCustomer в шаблоне заявки?

Сообщение MrIch » 28 авг 2017, 10:54

Код: Выделить всё

#получаем всю инфу о созданном тикете
my %Ticket12 = $TicketObject->TicketGet(
            TicketID      => $TicketID,
            DynamicFields => 1,         # Optional, default 0. To include the dynamic field values for this ticket$
            UserID        => 1,
        );
#устанавливаем новый тип заявки:
my $Success1 = $TicketObject->TicketTypeSet(
        Type     => 'ServiceRequest',
        TicketID => $Ticket12{TicketId}, #номер тикета, полученного из Get
        UserID   => 1, #id=1 root admin
    );
#устанавливаем нового кастомера:
my $Success2 = $TicketObject->TicketCustomerSet(
        User     => 'User1', #такой юзер должен быть в базе
        TicketID => $Ticket12{TicketId}, #номер тикета, полученного из Get
        UserID   => 1,#id=1 root admin
    );
#устанавливаем новую очередь:
my $Success3 = $TicketObject->TicketQueueSet(
        Queue    => '1sl line support',
        TicketID => $Ticket12{TicketId}, #номер тикета, полученного из Get
        UserID   => 1,#id=1 root admin
    );

а так вообще вам сюда: http://doc.otrs.com/doc/api/otrs/stable/Perl/index.html
полный набор функций отрски, есть все что душе угодно).
У меня есть программист, который на PHP пишет, как вы думаете - он справится с нужной мне задачей по вашему примеру?
вполне), я особо не напрягаясь вник в это, не зная перла вообще).

если это занимает достаточное количество времени - готов оплатить работу.
это к вам к гуру этого форума). я тут так, чисто почерпнуть новые мысли\помочь кому-то разобраться)
OTRS ITSM 5.0.3
Ubuntu 14.04 + PostgreySQL 9.3.9 +Apache 2.4.7

alexus
OTRS Гуру
Сообщения: 5192
Зарегистрирован: 20 сен 2010, 18:17
Откуда: Москва
Благодарил (а): 92 раза
Поблагодарили: 82 раза

Re: Как заполнить поле FromCustomer в шаблоне заявки?

Сообщение alexus » 28 авг 2017, 20:13

ovolik писал(а):Подскажите, пожалуйста, для примера кусок кода, который бы установил бы тип заявки на ServiceRequest, в поле CustomerUser вбил бы "User1", выбрал бы очередь "1sl line support"
Какая-то странная постановка задачи. Я ещё понимаю связь Тип->Очередь. Это легко решается через ACL, кодить тут нечего. Но клиента-то как автоматом определять :? :?:
Минимальный набор атрибутов тикета, который надо в любом случае выбирать вручную - Тип, Клиент и Сервис (если сервисы используются)
С уважением,
Алексей Юсов

Prod: OTRS CE ITSM 6.0.28 on CentOS 7 Apache 2.4 MariaDB 10.4.13 + Radiant Customer Portal

Radiant System OTRS Intergrator RU
Группа OTRS Community в Teleram
Хотите внедрить OTRS? Спросите меня как!

ovolik
OTRS Новобранец
Сообщения: 13
Зарегистрирован: 02 окт 2015, 17:32

Re: Как заполнить поле FromCustomer в шаблоне заявки?

Сообщение ovolik » 29 авг 2017, 08:10

Какая-то странная постановка задачи. Я ещё понимаю связь Тип->Очередь. Это легко решается через ACL, кодить тут нечего. Но клиента-то как автоматом определять :? :?:
Минимальный набор атрибутов тикета, который надо в любом случае выбирать вручную - Тип, Клиент и Сервис (если сервисы используются)
Нам звонит много людей, часть из которых является нашими клиентами, часть - нет. У них возникают разные, но достаточно типовые вопросы по использованию сервиса. Регистрировать каждого как кастомер юзера мы не видим смысла, т.к. оператор потратит больше времени на регистрацию, чем на оказание поддержки. Для таких клиентов я завел одного кастомер юзера user, которому доступны сервисы по консультации. Чтобы упростить задачу оператора, я сделал шаблон заявки для таких случаев, при выборе которого хотелось бы, чтобы заполнилось максимальное количество известных полей, а именно:
Type: Service Request
Customer User: user
To queue: 1st line support
Service: выбирается оператором из нескольких доступных
SLA: SLA5-very low
Owner: агент, который регистрирует заявку
Subject: Консультация пользователя
Text: заполняется агентом по необходимости
Impact: 1 very low

в этом случае агент будет избавлен лишней работы по заполнению статических полей.

ovolik
OTRS Новобранец
Сообщения: 13
Зарегистрирован: 02 окт 2015, 17:32

Re: Как заполнить поле FromCustomer в шаблоне заявки?

Сообщение ovolik » 29 авг 2017, 08:14

MrIch писал(а):кусок кода
Большое спасибо за пример!!! Дам его программисту, и думаю, мы решим свой вопрос.

alexus
OTRS Гуру
Сообщения: 5192
Зарегистрирован: 20 сен 2010, 18:17
Откуда: Москва
Благодарил (а): 92 раза
Поблагодарили: 82 раза

Re: Как заполнить поле FromCustomer в шаблоне заявки?

Сообщение alexus » 29 авг 2017, 11:03

ovolik писал(а):в этом случае агент будет избавлен лишней работы по заполнению статических полей.
Если это готовый шаблон под конкретный кейс, тогда согласен, так можно сделать.
Совет - называйте SLA иначе, чтобы имена лучше "считывались". Что такое просто "very low" - непонятно. А вот SLA5-very low_9x5_4-24 - более понятен. 9х5 - это с 9 до 18 пон-пт, а 4-24 - 4 рабочих часа на первый ответ и 24 рабочих часа на решение.
С уважением,
Алексей Юсов

Prod: OTRS CE ITSM 6.0.28 on CentOS 7 Apache 2.4 MariaDB 10.4.13 + Radiant Customer Portal

Radiant System OTRS Intergrator RU
Группа OTRS Community в Teleram
Хотите внедрить OTRS? Спросите меня как!

ovolik
OTRS Новобранец
Сообщения: 13
Зарегистрирован: 02 окт 2015, 17:32

Re: Как заполнить поле FromCustomer в шаблоне заявки?

Сообщение ovolik » 30 авг 2017, 08:33

alexus писал(а):
ovolik писал(а):в этом случае агент будет избавлен лишней работы по заполнению статических полей.
А вот SLA5-very low_9x5_4-24 - более понятен. 9х5 - это с 9 до 18 пон-пт, а 4-24 - 4 рабочих часа на первый ответ и 24 рабочих часа на решение.
согласен с вами, когда заводил их - думал об одном, когда начал пользоваться, то понял, что в названии SLA должна быть другая информация.

ovolik
OTRS Новобранец
Сообщения: 13
Зарегистрирован: 02 окт 2015, 17:32

Re: Как заполнить поле FromCustomer в шаблоне заявки?

Сообщение ovolik » 19 сен 2017, 10:49

для тех, кому будет интересно, мы пошли следующим путем:
в событии onclick кастомной кнопки .tt-файла сослались на свою функцию template1OnClick()
# example template for customizations, see hidden form at the end of the file
<label>[% Translate("Templates") | html %]:</label>
<div class="Field">
<button type="button" onclick="template1OnClick()" value=[% Translate("Consultation") | html %]>[% Translate("Consultation") | html %]</button>
<button type="button" onclick="template2OnClick()" value=[% Translate("Incident") | html %]>[% Translate("Incident") | html %]</button>
</div>
<div class="Clear"></div>

функцию написали следующую (привожу для одной кнопки). Наличие нескольких функций, вызываемых с задержкой нужно потому, что события при изменении некоторых полей (которые генерируют Ajax запрос) вызываются асинхронно, а нам надо обязательно вызывать каждое событие только после выполнения предыдущего.

function template1OnClick(){//for service request button
$('#TypeID').val('5'); //set ticket type to service request
$('#TypeID').trigger('change'); //raise onchange event for ticket type field
$('#FromCustomer').autocomplete("search", 'question'); //autocomlete customer user
setTimeout(myFunc1, 1000); //call other action after 1s timeout. Remember, that events are fired asyncronyously!!!
$('#Subject').val('Консультация пользователя'); //set Subject
$('iframe.cke_reset').contents().find('body').text('Проконсультировали пользователя')//set Body
$('#DynamicField_PhoneNumber').val('000000000'); //set Dynamic Field PhoneNumber
setTimeout(myFunc3, 1000);
}

function myFunc1(){
$('#ui-id-2').trigger('click'); //select autocompleted user by clicking on it
setTimeout(myFunc3, 500);
}

function myFunc3(){
$('#Dest').val('5||1st line support'); //set destination queue
$('#Dest').trigger('change'); //raise onchange event for destination queue field
if ($('#TypeID').val() == '5') {setTimeout(myFunc4, 500);} //for service request we set NextState value to closed sucessefully
}

function myFunc4(){
$('#NextStateID').val('2'); //set NextState value to closed sucessefully
$('#NextStateID').trigger('change'); //raise onchange event for Next State field
}

Этот код программно эмулирует действия пользователя и нам кажется потому более удобным. Сразу предупрежу, что вызвать событие onchange для поля FromCustomer не получается, потому как оно еще где-то переопределено и изменения в файле tt ни к чему не приводят.

Ответить