Страница 1 из 1

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

Добавлено: 19 авг 2017, 16:19
ovolik
Добрый день, коллеги.

Наш суппорт оказывает консультационную поддержку даже незарегистрированным пользователям. Для таких пользователей мы используем одну учетную запись кастомера: 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)?

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

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

Добавлено: 21 авг 2017, 15:20
MrIch
Приветствую!

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

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

Добавлено: 25 авг 2017, 12:26
ovolik
MrIch писал(а):Приветствую!

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

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

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

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

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

Добавлено: 25 авг 2017, 13:27
MrIch
Я предлагаю вам напрямую менять 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'} - название дилера)

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

Добавлено: 25 авг 2017, 18:50
ovolik
Еще раз спасибо за помощь.

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

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

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

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

Добавлено: 28 авг 2017, 10:54
MrIch

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

#получаем всю инфу о созданном тикете
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 пишет, как вы думаете - он справится с нужной мне задачей по вашему примеру?
вполне), я особо не напрягаясь вник в это, не зная перла вообще).

если это занимает достаточное количество времени - готов оплатить работу.
это к вам к гуру этого форума). я тут так, чисто почерпнуть новые мысли\помочь кому-то разобраться)

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

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

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

Добавлено: 29 авг 2017, 08:10
ovolik
Какая-то странная постановка задачи. Я ещё понимаю связь Тип->Очередь. Это легко решается через 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

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

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

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

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

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

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

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

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

Добавлено: 19 сен 2017, 10:49
ovolik
для тех, кому будет интересно, мы пошли следующим путем:
в событии 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 ни к чему не приводят.