Skip to content

Commit e6660fe

Browse files
committed
fix regression (due date missing in form) by refactoring
1 parent d32c6ff commit e6660fe

File tree

2 files changed

+105
-71
lines changed

2 files changed

+105
-71
lines changed

src/Item_Ola.php

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,4 +185,103 @@ private static function ticketHasAnAssigneeOfOlaGroup(Ticket $ticket, OLA $ola):
185185
$users_of_dedicated_group
186186
));
187187
}
188+
189+
/**
190+
* Get data from Item_Ola + linked OLA for a Ticket
191+
*
192+
* @param \Ticket $ticket
193+
*
194+
* @return array<array{olas_id: int, items_olas_id: int, name: string, entities_id: int, is_recursive: bool, type: int, comment: string, number_time: int, use_ticket_calendar: bool, calendars_id: int, date_mod: string, definition_time: string, end_of_working_day: string, date_creation: string, slms_id: int, due_time: string, class: string, item: Ticket, nextaction: false|OlaLevel_Ticket|SlaLevel_Ticket, level: false|\LevelAgreementLevel}>
195+
*/
196+
public function getDataFromDBForTicket(Ticket $ticket): array
197+
{
198+
/** array ola + item_ola datas */
199+
$merged_data = [];
200+
// each $item_ola_data row contains linked OLA fields + items_olas_id in 'linkid' field
201+
$olas_data = iterator_to_array(self::getListForItem($ticket));
202+
203+
// merge data from ola dans items_ola
204+
foreach ($olas_data as $ola_data) {
205+
$merged_data[] = $this->fillItemOlaData($ola_data, $ticket);
206+
}
207+
208+
return $merged_data;
209+
}
210+
211+
212+
/**
213+
* @param \Ticket $ticket
214+
* @param array<int> $olas_ids
215+
* @return array
216+
*/
217+
public function getDataFromOlasIdsForTicket(Ticket $ticket, array $olas_ids): array
218+
{
219+
/** array ola + item_ola datas */
220+
$merged_data = [];
221+
$ola = new OLA();
222+
223+
// get ola data from DB - each $item_ola_data row contains linked OLA fields + items_olas_id in 'linkid' field
224+
$olas_in_db_data = array_values(iterator_to_array(self::getListForItem($ticket)));
225+
226+
// complete with olas not associated to ticket - not yet in items_ola
227+
$fetched_olas_ids = array_column($olas_in_db_data, 'id');
228+
$olas_not_yet_fetched = array_diff(array_values($olas_ids), $fetched_olas_ids);
229+
$olas_missing_data = empty($olas_not_yet_fetched) ? [] : $ola->find(['id' => $olas_not_yet_fetched]);
230+
231+
$olas_data = array_merge($olas_in_db_data, $olas_missing_data);
232+
233+
// merge data from ola dans items_ola
234+
foreach ($olas_data as $ola_data) {
235+
$merged_data[] = $this->fillItemOlaData($ola_data, $ticket);
236+
}
237+
238+
return $merged_data;
239+
}
240+
241+
/**
242+
* @param array $ola_data fields from ola + possibly 'linkid' field representing items_olas_id
243+
* @param \Ticket $ticket
244+
*
245+
* If 'linkid' is set, it will be used to populate the data from Item_Ola otherwise it will be filled with default values.
246+
*
247+
* @return array{olas_id: int, items_olas_id: int, name: string, entities_id: int, is_recursive: bool, type: int, comment: string, number_time: int, use_ticket_calendar: bool, calendars_id: int, date_mod: string, definition_time: string, end_of_working_day: string, date_creation: string, slms_id: int, due_time: string, class: string, item: Ticket, nextaction: false|OlaLevel_Ticket|SlaLevel_Ticket, level: false|\LevelAgreementLevel}
248+
*/
249+
private function fillItemOlaData(array $ola_data, Ticket $ticket): array
250+
{
251+
$_ola = new OLA();
252+
// start with the ola data
253+
$_merged_data = $ola_data;
254+
255+
// data defaults for item_ola
256+
$_merged_data['itemtype'] = $ticket::class;
257+
$_merged_data['items_id'] = $ticket->getID();
258+
$_merged_data['olas_id'] = $_merged_data['id'];
259+
$_merged_data['start_time'] = 0;
260+
$_merged_data['due_time'] = 0;
261+
$_merged_data['end_time'] = 0;
262+
$_merged_data['waiting_time'] = 0;
263+
$_merged_data['items_olas_id'] = 0;
264+
$_merged_data['olalevel_date'] = 0; // @todoseb va dégager possiblement
265+
// add data for template
266+
$_merged_data['class'] = OLA::class;
267+
$_merged_data['item'] = $ticket; // object, not just fields, functions used in template
268+
$_merged_data['nextaction'] = $_ola->getNextActionForTicket($ticket, $_merged_data['type']);
269+
$_merged_data['level'] = $_ola->getLevelFromAction($_merged_data['nextaction']);
270+
271+
// if linkid is set (items_olas exists), use it to populate the data
272+
if (isset($ola_data['linkid'])) {
273+
$instance = new static();
274+
$instance->getFromDB($_merged_data['linkid']); // @todoseb lever exception si pas trouvé
275+
$_merged_data = array_merge($_merged_data, $instance->fields);
276+
$_merged_data['items_olas_id'] = $ola_data['linkid'];
277+
$_merged_data['olas_id'] = $ola_data['id'];
278+
}
279+
280+
if (isset($_merged_data['id'])) {
281+
unset($_merged_data['id']); // removed to avoid confusion with items_olas_id in template, both olas_id and items_olas_id are defined above
282+
}
283+
284+
return $_merged_data;
285+
}
286+
188287
}

src/Ticket.php

Lines changed: 6 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -6357,92 +6357,27 @@ private static function getListForItemSearchOptionsCriteria(CommonDBTM $item): a
63576357
* Get currently associated Ola from database
63586358
* Data from ola + item_ola + custom data
63596359
*
6360-
* @return array<array{olas_id: int, items_olas_id: int, name: string, entities_id: int, is_recursive: bool, type: int, comment: string, number_time: int, use_ticket_calendar: bool, calendars_id: int, date_mod: string, definition_time: string, end_of_working_day: string, date_creation: string, slms_id: int, due_time: string, class: string, item: Ticket, nextaction: false|OlaLevel_Ticket|SlaLevel_Ticket, level: false|\LevelAgreementLevel}>
6360+
* @return array
63616361
*/
63626362
public function getOlasData(): array
63636363
{
6364-
// @todoseb fix cache invalidation ($this->associatedOlas) before using it
6365-
// if (!isset($this->associatedOlas)) {
6366-
if ($this->isNewItem()) {
6367-
// $this->associatedOlas = [];
6368-
return [];
6369-
} else {
6370-
$ola_data = [];
6371-
$items_ola = new Item_Ola();
6372-
// $items_ola->getFromDBByCrit(['itemtype' => static::class, 'items_id' => $this->getID()]
6373-
$item_olas = iterator_to_array(Item_Ola::getListForItem($this));
6374-
6375-
// merge data from ola dans items_ola
6376-
foreach ($item_olas as $item_ola) {
6377-
$_ola = new OLA();
6378-
$_data = $item_ola;
6379-
// Ola must exist
6380-
if (!$items_ola->getFromDB($_data['linkid'])) {
6381-
throw new LogicException('Associated referenced OLA not found'); // probably never happend
6382-
}
6383-
6384-
$_data += $items_ola->fields;
6385-
$_data['items_olas_id'] = $_data['linkid'];
6386-
$_data['olas_id'] = $_data['id'];
6387-
unset($_data['id']);
6388-
6389-
// additionnal datas
6390-
$_data['class'] = OLA::class; // SLA::class
6391-
$_data['item'] = $this; // object, not just fields, functions used in template
6392-
$_data['nextaction'] = $_ola->getNextActionForTicket($this, $_data['type']);
6393-
$_data['level'] = $_ola->getLevelFromAction($_data['nextaction']);
6394-
6395-
$ola_data[] = $_data;
6396-
}
6397-
6398-
return $ola_data;
6399-
}
6364+
return $this->isNewItem()
6365+
? []
6366+
: (new Item_Ola())->getDataFromDBForTicket($this);
64006367
}
64016368

64026369
/**
64036370
* Olas data from form input
64046371
*
6405-
* Function rely on $this->fields['_olas_id'] field
6372+
* Unlike getOlasData(), it rely on $this->fields['_olas_id'] field because the field could be filled by a template.
64066373
*
64076374
* @return array
64086375
*
64096376
* @used-by templates/components/itilobject/service_levels.html.twig
64106377
*/
64116378
public function getOlasDataFromField()
64126379
{
6413-
$data = [];
6414-
$olas_ids = $this->fields['_olas_id'] ?? [];
6415-
6416-
$_ola = new OLA();
6417-
foreach ($olas_ids as $olas_id) {
6418-
6419-
if (!$_ola->getFromDB($olas_id)) {
6420-
throw new \LogicException("OLA #$olas_id not found");
6421-
}
6422-
6423-
$_data = $_ola->fields;
6424-
// item_ola empty data
6425-
$_data['itemtype'] = self::class;
6426-
$_data['items_id'] = $this->getID();
6427-
$_data['olas_id'] = $_data['id'];
6428-
$_data['start_time'] = 0;
6429-
$_data['due_time'] = 0;
6430-
$_data['end_time'] = 0;
6431-
$_data['waiting_time'] = 0;
6432-
$_data['items_olas_id'] = 0;
6433-
$_data['olalevel_date'] = 0; // @todoseb va dégager
6434-
unset($_data['id']);
6435-
6436-
// additionnal datas
6437-
$_data['class'] = OLA::class; // SLA::class
6438-
$_data['item'] = $this; // object, not just fields, functions used in template
6439-
$_data['nextaction'] = $_ola->getNextActionForTicket($this, $_data['type']);
6440-
$_data['level'] = $_ola->getLevelFromAction($_data['nextaction']);
6441-
6442-
$data[] = $_data;
6443-
}
6444-
6445-
return $data;
6380+
return (new Item_Ola())->getDataFromOlasIdsForTicket($this, $this->fields['_olas_id'] ?? []);
64466381
}
64476382

64486383
public function getOlasTTOData(): array

0 commit comments

Comments
 (0)