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