4 апр. 2014 г.

Пролог

Аналогов в Беларуси просто нет. Ниже приведен фрагмент кода программы расчета заработной платы на языке Prolog . Работает в режиме промышленной эксплуатации на двух крупных предприятиях (более 1000 работников на каждом).

% среднедневной заработок по сотруднику (по среднечасовому)
% - для отпусков
calc_avg_wage(Scope, PK, AvgWage, Rule) :-
Rule = by_avg_houre,
% правило действительно
is_valid_rule(Scope, PK, _, Rule),
% подготовка временных данных для расчета
prep_avg_wage(Scope, PK, Periods),
% взять заработок
findall( Wage,
% за каждый период проверки
( member(Y1-M1, Periods),
% взять данные по заработку
get_month_wage(Scope, PK, Y1, M1, _, Wage) ),
% в список заработков
Wages ),
% итоговый заработок
sum_list(Wages, Amount),
% взять часы
findall( THoures,
% за период проверки
( member(Y2-M2, Periods),
% взять данные по часам за месяц
get_month_norm_tab(Scope, PK, Y2-M2, _, _, _, THoures)
),
% в список часов
Durations),
% всего часов по табелю
sum_list(Durations, TotalTab),
% среднечасовой заработок
catch( AvgHoureWage is Amount / TotalTab, _, fail ),
% разложить первичный ключ
PK = [pEmplKey-EmplKey, pFirstMoveKey-FirstMoveKey],
% всего часов по графику за расчетный год
get_data(Scope, in, usr_wg_TblYearNorm, [
fEmplKey-EmplKey, fFirstMoveKey-FirstMoveKey,
fWHoures-TotalNorm]),
% среднемесячное количество расчетных рабочих часов
AvgMonthNorm is TotalNorm / 12,
% среднемесячное количество календарных дней
get_param(Scope, in, pAvgDays-AvgDays),
% среднедневной заработок
catch( AvgWage0 is AvgHoureWage * AvgMonthNorm / AvgDays, _, fail ),
AvgWage is round(AvgWage0),
!.

Комментариев нет:

Отправить комментарий