Следующий тарифный план - это первый в очереди тарифный план, если очередь не пуста,
иначе тарифный план из стека, если он не пуст, иначе следующий тарифный
план по умолчанию.
Колонка tarifn
таблицы cs_accnt
- массив
целых с индексами от 0
(!).
Этот массив является стеком и очередью тарифных плантов.
Если tarifn[0] > 0
, то
tarifn[0]
- это указатель очереди
тарифных планов, а tarifn[tarifn[0]]
- это тарифный
план, который примет клиента, как только текущий тарифный план сдаст своего клиента.
Когда новый тарифный план принимает клиента, то он удаляется из стека/очереди,
и хвост очереди продвигается к началу.
После исчерпания очереди указатель следующего тарифного плана
указывает за пределы массива, в этом случае
если tarifn[0] > 1
, то
следующий тарифный план
tarifn[tarifn[0] - 1]
извлекается из стека после уменьшения указателя.
После использования последний тарифный план из стека удаляется.
Если tarifn[0] == 2
, то
состояние стека после извлечения следующего тарифа из стека
не меняется, т.е. tarifn[1]
- это
постоянный тариф.
Если очередь и стек пусты, то у каждого тарифа в таблице
tarifcompl
колонкой xtari
может
быть задан следующий тарифный план по умолчанию.
Если новый тарифный план имеет в колонке t_rpt
TRUE,
то он вписывается (заменяет) в tarifn[1]
.
Этот элемент имеет особое значение - неизвлекаемое дно стека, тариф
повторяется до тех пор, пока в очереди не появится что-то новое.
Логика извлечения из стека/очереди реализована в функции usd_tarif(int4[])
,
процедура добавления плана в стек/очередь реализована в функции
add_tarif(int4[], int4)
.
При постановке в очередь учитывается приоритет тарифного плана - колонка t_pri
,
чем выше приоритет, тем ближе к началу очереди будет расположен новый тарифный план.