|
обновлено 07.04.2012
Алгоритмы расчета
Данная страничка адресована администратору или продвинутому пользователю.
Табельные данные + данные из карточки сотрудника, а также операторы и функции встроенного интерпретатора FoxPro + зарплатные функции используются для описания алгоритмов расчета начислений и удержаний по сотруднику. Бухгалтер заполняет табельные данные, а далее запускает на выполнение необходимый алгоритм расчета.Алгоритмы расчета рассположены в выпадающем списке головного меню "Расчет". Эти начисления и удержания могут расчитываться массово, по списку сотрудников (аванс, табель...) или индивидуально (отпускные, больничные...). В качестве примеров алгоритмов расчета рассмотрим некоторые из них. * Строка, которая начинается символом "*" - это комментарий, который делает алгоритм более понятным.
Количество алгоритмов может быть любым, но всегда существуют два обязательных алгоритма. Это Основной расчет зарплаты - это с одной стороны обычный алгоритм, такой же как расчет табеля, премии, больничных, отпускных и т.д. С другой стороны, это алгоритм не совсем обычный и необычность его заключается в том, что он автоматически выполняется всякий раз, когда Вы вносите какие-либо изменения по табельному номеру. Причем это могут быть изменения, связанные с начислениями-удержаниями по конкретному табельному номеру, или связанные с изменениями в личной карточке Работника. Причем программа "не знает" может или нет повлиять конкретное изменение в личной карточке на основной расчет зарплаты. Скорей всего, какие-то изменения влияют ( например, дата непрерывного стажа, количество иждивенцев и т.д.), какие-то нет, но программа в любом случае делает пересчет по алгоритму Основной расчет зарплаты. В основной расчет зарплаты, как правило, вынесены те виды оплат, которые автоматически должны пересчитываться при любых изменениях ( пояс, надбавка, подоходный налог и т.д.). Завершение месяца - это алгоритм, который выполняется в момент выполнение процедуры Завершение месяца. Пример алгоритма "Завершение месяца"
* Совсем простой алгоритм, из одной строки, причем этот алгоритм выполняется в цикле по всем сотрудникам, заданным при выполнении * Формировать - функция, которая формирует начисление или удержание * SR.AVANS - реквизит "аванс" из справочника сотрудников * 349 - это вид оплаты "аванс через кассу" из справочника видов оплат =Формировать(SR.AVANS,349)
* Подсчитываем количество часов и дней по рабочему календарю ЧасКал=РабЧасы(1) ДниКал=РабДни(1) * Расчитываем повременную оплату, для этого оклад (SR.OKL) * отработанные часы (SR.T1) делим на часы по календарю и записываем в переменную Повременно и далее формируем 102 видом оплаты "повременно" Повременно=(SR.OKL*SR.T1)/ЧасКал =Формировать(Повременно,102,SR.T1,SR.T1/8) * К сумме повременной оплаты прибавляем сумму сдельной оплаты (СумВОП(101)-сумма 101 вида оплаты) и заносим результат в переменную ПоврСдел ПоврСдел=Повременно+СумВоп(101) * Формируем надбавку за условия труда (SR.UT - % за условия труда) 118 видом оплаты =Формировать(ПоврСдел*SR.UT/100,118) * Формируем надбавку за вредность (SR.VREDN - % за вредность) 139 видом оплаты =Формировать(ПоврСдел*SR.VREDN/100,139) * Формируем надбавку за напряженный график (SR.NAPR - % за напряженный график) 117 видом оплаты =Формировать(ПоврСдел*SR.NAPR/100,117) * Формируем стимулирующую надбавку (SR.STIMULN - % надбавки) 150 видом оплаты, где 113 вид оплаты - это премия из ФМП =Формировать((Повременно+СумВоп(113))*SR.STIMULN/100,150) * Формируем надбавку за бригадирство (SR.BRG - % бригадирских) 126 видом оплаты =Формировать(ПоврСдел*SR.BRG/100,126) * Формируем за ночные часы (SR.NOHN - кол-во ночных часов) 119 видом оплаты =Формировать((SR.OKL*SR.NOHN/ЧасКал)*0.5,119,SR.NOHN) * Формируем за праздничные часы (SR.PRAZD - кол-во праздничных часов) 114 видом оплаты =Формировать(SR.OKL*SR.PRAZD/ЧасКал,114,SR.PRAZD)
* Расчитываем сумму премии, для этого подсчитываем начисления, которые идут в расчет премии (признак "Расчитывать премию" из справочника видов оплат, умножаем на % премии (SR.T2 - % премии) делим на 100) * Полученный результат записывает 104 видом оплаты "текущая премия" Премия=Сумма('Прем')*SR.T2/100 =Формировать(Премия,104)
* Почти тоже самое, что в предыдущем алгоритме, но перед расчетом суммы, от которой считаем премию, устанавливаем дату предудущего месяца с помощью функции УстДат, где переменная Дата - текущая дата * Полученный результат записывает 105 видом оплаты "премия" =УстДат(gomonth(Дата,-1)) Премия=Сумма('Прем')*SR.T2/100 =Формировать(Премия,105)
* Это более сложный алгоритм, разберем его подробно. Заметим, что этот алгоритм имеет два параметра: * ДатНачОтп - дата начала отпуска * КолДнейОтп - количество дней отпуска * Сначала определяем дату выхода на работу, если она приходится на выходные, то отодвигаем ее до понедельника ДатаВыхода=ДатНачОтп+КолДнейОтп if Dow(ДатаВыхода)>5 ДатаВыхода=ДатаВыхода+(8-Dow(ДатаВыхода)) endif * Инициализируем переменные Заработок='' ДнейОтраб='' ДнейРабоч='' ДнейДляОтп='' КолОтрДней=0 ЗарплИтого=0 ОтрДниИтого=0 РабДниИтого=0 * За предыдущие 12 месяцев подсчитываем: * заработок, количество отработанных дней, * рабочих дней по графику, дней по календарю отпуска * Необходимо это для того, чтобы получить красивый результат, на самом деле, достаточно расчитать средне-дневной заработок за 12 месяцев от даты начала отпуска и умножить его на количество дней отпуска for i=1 to 12 * Устанавливаем расчетную дату, все суммы ниже будут расчитаны за эту дату ДатаМес=gomonth(ДатНачОтп,-13+i) =УстДат(ДатаМес) * Подсчитываем количество отработанных дней по видам оплат 101 (сдельная) и 102 (повременная) ОтрДни=ИнфОтрДни(101, 102) ОтрДниИтого=ОтрДниИтого+ОтрДни ДнейОтраб=ДнейОтраб+str(ОтрДни,3)+',' * Заработок по признаку "отпускные" за установленный месяц ЗарпМес=Сумма('Отп') ЗарплИтого=ЗарплИтого+ЗарпМес Заработок=Заработок+str(ЗарпМес,12,2)+',' * Количество рабочих дней по календарю РабДней=РабДни() ДнейРабоч=ДнейРабоч+str(РабДней,3)+',' РабДниИтого=РабДниИтого+РабДней * Подсчитываем количество дней по календарю отпуска if ОтрДни=РабДней ДниДляОтп=29.4 else КолДнМес=DayMonthCount(ДатаМес) ДниКал=ДниКал(ДатаМес,ОтрДни,1,1) ДниДляОтп=(29.4/КолДнМес)*ДниКал endif ДнейДляОтп=ДнейДляОтп+str(ДниДляОтп,6,2)+',' КолОтрДней=КолОтрДней+ДниДляОтп endfor * Сумма по признаку "отпускные" за весь период - 12 месяцев =УстДат(gomonth(ДатНачОтп,-12),gomonth(ДатНачОтп,-1)) СумИтого=Сумма('Отп') * Расчет средне-дневной суммы: сумму всего делим на количество дней по календарю отпуска СреднеДневной=round(СумИтого/КолОтрДней,2) * Полученный результат записывает 226 видом оплаты "отпускные" =ФОРМИРОВАТЬ(СреднеДневной*КолДнейОтп,226,КолДнейОтп*8,КолДнейОтп) * ---------------------------- конец расчета отпускных ---------------------------- В итоге получаем результат расчета в виде таблицы:
******************************************************************* * Расчитываем поясной коэфициент (PARM.POIS - % поясного из параметров) ******************************************************************* Пояс=Сумма('Пояс')*PARM.POIS/100 =ФОРМИРОВАТЬ(Пояс,239) ******************************************************************* * Расчитываем надбавку за стаж ******************************************************************* СтажЛет=КолЛет(SR.NEPR,Дата) do case case СтажЛет<1 Коэф=0 case СтажЛет>=1 and СтажЛет<3 Коэф=10 case СтажЛет>3 and СтажЛет<=5 Коэф=20 case СтажЛет>5 Коэф=30 endcase Надбавка=Сумма('Надб')*Коэф/100 =ФОРМИРОВАТЬ(Надбавка,iif(Коэф=10,271,iif(Коэф=20,272,273))) ******************************************************************* * Расчитываем подоходный налог ******************************************************************* ТекМес=Month(Дата) =УстДат(gomonth(Дата,-ТекМес+1),Дата) * Сумма, облагаемая НДФЛ с начала года по расчетный месяц СумОблНал=Сумма('Подох') * Расчитываем скидку на себя и на иждивенцев в зависимости от дохода do case case СумОблНал<=40000 ВидНалС=iif(SR.SKIDSVO>4,SR.SKIDSVO,SR.SKIDSVO*4) ВидНалИ=SR.KOLIJD*10+SR.KOLIJDINV*10 case СумОблНал>40000 and СумОблНал<=280000 ВидНалС=iif(SR.SKIDSVO>4,SR.SKIDSVO,0) ВидНалИ=SR.KOLIJD*10+SR.KOLIJDINV*10 case СумОблНал>280000 ВидНалС=iif(SR.SKIDSVO>4,SR.SKIDSVO,0) ВидНалИ=0 endcase * Если одинокий родитель - удваиваем скидку на иждивенцев if SR.ONEPAR ВидНалИ=ВидНалИ*2 endif ВидНал=ВидНалС+ВидНалИ replace SR.SHN with ВидНал replace SR.NALSVOY with ВидНалС replace SR.NALIJD with ВидНалИ * Необлагаемый минимум по материальной помощи и подаркам (берем из параметром организации) МатНеоблМин=PARM.NSMAT ПодНеоблМин=PARM.NSPOD * Материальная помощь СумМатер=Сумма('SPRVOP.MAT') * Подарки СумПодар=Сумма('SPRVOP.POD') * Сумма, облагаемая для материальной помощи и подарков СумОблМатер=max(СумМатер-МатНеоблМин,0) СумОблПодар=max(СумПодар-ПодНеоблМин,0) * Сумма уже удержанного НДФЛ =УстДат(gomonth(Дата,-ТекМес+1),gomonth(Дата,-1)) СумУдерНал=СумВоп(302,251) * Расчитываем сумму скидок на себя и на иждивенцев с начала года по расчетный месяц СумУменНал=Архив('ARCHIV.SHN*PARM.BAZSKID')+SR.SHN*PARM.BAZSKID * Сумма, облагаемая НДФЛ с начала года с учетом всех вычетов и скидок СумОблНал=СумОблНал-СумМатер-СумПодар-СумУменНал+СумОблМатер+СумОблПодар * НДФЛ за год (PARM.PODPROC - % НДФЛ из параметров) НалогГод=СумОблНал*PARM.PODPROC/100 * НДФЛ за месяц, за минусом уже удержанного НДФЛ НалогМес=round(max(НалогГод,0)+СумУдерНал,0) if НалогМес<>0 =ФОРМИРОВАТЬ(НалогМес,302) endif ******************************************************************* * Расчитываем алименты, SR.ALIM - % алиментов из карточки сотрудника ******************************************************************* =УстДат(Дата) if SR.ALIM>0 Алименты=Round(Сумма('АлимП')*SR.ALIM/100,0) =ФОРМИРОВАТЬ(Алименты,306) endif ******************************************************************* * Расчитываем профсоюзный взнос, SR.PRF - признак "член профсоюза" из карточки сотрудника ******************************************************************* if SR.PRF =ФОРМИРОВАТЬ(Сумма('ПрофП')*0.01,318) endif ******************************************************************* * Остаток за конторой (кто-то это использует, кто-то нет) PARM.KOP - признак "переносить копейки на следующий месяц" из параметров ******************************************************************* if PARM.KOP=.t. СуммаНаРуки=max(0,СумНач()-СумУдер()) СумОст=СуммаНаРуки-int(СуммаНаРуки) if СумОст>0 =ФОРМИРОВАТЬ(СумОст,375) endif endif
* Формируем копейки, переходящие на следующий месяц (кто-то это делает, кто-то нет) =Формировать(СумУдер(375),280) * Формируем долги (это делают все) =Формировать(СумДолг(),325) * Формируем сумму на руки, как сальдо с прошлого месяца (кто-то это делает, кто-то нет) =Формировать(СуммаНаРуки(),299) * Обнуляем административные дни) replace SR.ADMDNI with 0 * ---------------------------- конец завершения месяца ---------------------------- |
|||||||||




Табельные данные + данные из карточки сотрудника, а также операторы и функции встроенного