Стек/очередь будущих тарифов

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


А.А.Бабайлов (C)2003..2022