|
|
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. озаботился темой начислений-удержаний. пока не задавался вопросом порядком расчета (зависимостью) начислений-удержаний. за ненадобностью. Надумал следующее. на каждый документ-основание, который меняет статус человека есть таблица, в которой проставялется дата начала действия и дата окончания действия. все это ведется на тригерах-процедурах. есть таблица самих документов. в ней колонка update_date. в этой колонке при добавлении документа проставляется реальная дата добавления документа. при каких либо изменениях в это поле проставляется дата изменения. можно сделать еще одно поле, которое указывает что что-то в документе менялось (changed) при создании начисления просматривается таблица статусов начала действия и окончания действия некого события. c join к таблице документов и фильтром change = 0 если дата начисления попала в диапазон, то расчитывается эта запись. далее. ввод-изменение задним числом. просмативается таблица статусов, где дата update_date в текущем диапазоне (месяц) с join к таблице документов с фильтром change = 1 т.е. измененные. и соответственно высчитывается начисление по ним с вычитанем уже начисленного. Получается коррекция. Покритикуйте. Направьте в нужное русло. Спасибо Модератор: Тема перенесена из форума "InterBase, Firebird, Yaffil". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2010, 21:27 |
|
||
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
AndrewVL, Никто не прокомментирует? :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2010, 09:49 |
|
||
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
AndrewVL, Вы бы привели примеры таблиц, а то всё на пальцах. Сейчас одна каша - что это за "дата добавления" в уже существующей (добавленной) дате? В целом идея связать начисления-удержания с документами правильная, но вот только один документ может поменять множество параметров, изменить саму логику расчёта или изменить воздействие другого документа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2010, 11:47 |
|
||
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
zenk, ДАТА ДОБАВЛЕНИЯ это дата когда реально был создан документ. Допустим ввели мы документ с датой 01.01.2010. и периодом действия с 01.01.2010 по 01.02.2010. Сам документ вводили например 03.01.2010. Вот ДАТА ДОБАВЛЕНИЯ и будет 03.01.2010. Допустим потом пользователь поправил период действия этого документа и установил дату окончания 02.02.2010. Но само это изменение он провизводил допустим в марте 2010 года. Вот дата ДОБАВЛЕНИЯ при этой манипуляции и поменяется автоматом на март 2010 года ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2010, 12:38 |
|
||
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
AndrewVL, ну есть эти поля (жалкое подобие таблиц аудита, потому что данные о предыдущих изменениях теряются, что именно поменялось, узнать нельзя). Дальше-то что? Это учебная задача? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2010, 14:48 |
|
||
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
zenk, Задача не учебная. Что смущает? И куда смотреть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2010, 19:21 |
|
||
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
AndrewVL, Сам подход к коррекции правильный. Только сумбурно очень написано. Кроме представленных с задержкой документов, могут быть изменены документы текущего месяца, по которым уже были выплачены деньги. Коррекция одного документа может привести к тому, что изменится сумма другого начисления или удержания. Могут поменяться параметры самого работника - число детей, льготы и т.п. У вас всё слишком просто пока получается. Кроме того, становится практически невозможно понять, почему была начислена та или иная сумма в прошлом месяце, ведь в базе хранящийся документ уже был изменён и содержит новую информацию, а не ту, по которой был в своё время сдела расчёт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2010, 20:49 |
|
||
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
Что-то типа того: секретарь забыл отдать отпускную записку. Реально сотрудник отгулял отпуск 2 месяца назад. Через 2 месяца записку принесли в бухгалтерию. Добавляем отпускные 2 месяца назад, пропорционально уменьшаем часть начислений, зависящих от числа отработанных дней (повремённая оплата, премии и т.п.). Как результат, у нас поплыла среднемесячная заработная плата (уменьшилась). А она была задействована 1 месяц назад, когда работник был на больничном. Корректируем размер пособия по больничному. Трудовым договором определено, что если больничный меньше фиксированного минимума, предприятие доплачивает работнику из фонда предприятия, так, чтобы совокупная оплата была не меньше этого самого зафиксированного трудовым договором минимума. Месяц назад работник не имел права на такую добавку (СМЗ был большой, больничный был большой), теперь получил - надо добавить начисление. Само собой разумеется, поплыли все налоги. Сможете это всё отобразить на вашей структуре? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 09:54 |
|
||
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
zenk, Вот набросал структурку. и приложено описание процедур. У меня не зарплата , а скорее стипендия:-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 14:47 |
|
||
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
AndrewVL, Насколько понял из распроса бухгалтерии в стипендии есть только периодические начисления, начисления суммой (матпомощь, книжные и т.д.) Из удержаний - профсоюз, исполнительный лист. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 16:06 |
|
||
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
AndrewVL, Приложенные файлы просмотрел по диагонали - комментарии вы писать не хотите, без них разбираться нет никакого желания. Что заметил: а что, понятие "расчётный месяц (период) у вас бухгалтерия не использует? Если это так, то очень странно... Вы полностью проигнорировали мой совет о необходимости вести таблицу аудита и хранить все изменения документов. Вы наверняка начали сразу программировать, а для таких задач сначала требуется провести обследование бухгалтерии, затем написать проект или техническое задание и согласовать его с заказчиком. А в этих документах должен быть раздел "Организационное обеспечение", описывающий, в частности, как изменятся должностные обязанности пользователей при внедрении системы. Программа не должна считать стипендию, она должна ОБРАБАТЫВАТЬ введённые пользователем документы, являющиеся основанием для расчёта. В общем случае изменений у документа-основания может быть несколько, не так ли? Поэтому не надо хранить признак изменения и особенно дату изменения у основного документа, храните ссылку на изменяемый документ у документа, служащего основанием для корректировки. Флаг того, что изначальный документ изменён, хранить на самом деле можно и даже нужно, но надо понимать, что это денормализация базы и обратить внимание на обеспечение целостности триггерами. Немножко пришлось погадать, поскольку названия полей в таблицах не прокомментированы. Для КАЖДОГО расчёта Вы должны показать, как он получился: на основании введённого приказа о зачислении и назначении о стипендии, введённого пользователем USER1 5 июня в 17:20:35, затем откоррекрированного им же 5 июня в 17:21:35 (показываете, что конкретно изменилось - добавили флаг учёта документа для расчёта), с учетом корректрирующего документа, ввёденного пользователем USER5 20 июня в 09:10:15 и затем изменённого им же в 09:11:40 (установлен флаг учёта документа для расчёта), с учётом ставки профсоюзных взносов, введённых пользователем BOSS 5 января 2010 г. в 17:20:41 в соответствии с алгоритмом расчёта, утвержденным в виде ТЗ деканом таким-то, мы получили следующее.... Пользователи обязательно что-нибудь забудут, перепутают, ошибутся, забудут о какой-то особой ситуации ("ах да, 31 декабря после обеда прибегал тут какой-то студент с бумажкой - забыла я его бумажку учесть в расчёте") - если не вести аудит, то "это программа глючит". А если раз-два им расследование, как показано абзацем выше, провести, то наезды прекратятся. Ещё: блокируйте от изменений суммы начислений и удержаний, если у вас появилась выплата по ним (на карточку, через кассу и т.п.). Для контроля случайных ошибок пользователей (лишний нолик в сумме), введите при вводе сумм начислений проверку на какой-то максимальный в среднем уровень начислений, который превышается в 5-10% случаев. А так задача начисления стипендии проще начисления зарплаты раз в 100, не меньше. Так что ничего страшного, ваши подходы сработают. Успехов! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2010, 10:33 |
|
||
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
zenk В общем случае изменений у документа-основания может быть несколько, не так ли? Поэтому не надо хранить признак изменения и особенно дату изменения у основного документа, храните ссылку на изменяемый документ у документа, служащего основанием для корректировки. Вы пишете про документ-основание для изменения. Я так понимаю, что в вашей модели изменять документы, уже участвовавшие в расчете запрешено? И для этого существует корректирующий документ? т.е. начислили чтото в январе. в фервале спохватились и создали документ, который удерживает ранее ошибочно начисленное? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2010, 22:35 |
|
||
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
Да, именно так. А то потом концы с концами не сойдутся. Если пользователям не хочется вводить "корректирующие документы" - а они на самом деле очень дисциплинируют исполнителей, даже если выполнены в виде "Справки бухгалтера", можно обозвать их версиями документа. В момент расчёта зарплаты блокируете документы-основания. Захотели изменить документ - отмените расчёт зарплаты. Если это сделать нельзя (закрыт месяц, сформированы проводки и т.д.), то надо вводить какие-то корректировки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2010, 09:14 |
|
||
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
zenk, После ввода расчета если пользователь хочет открыть документ на редактирование, то проверять участвовал ли он в расчете. и если нет то отказывать? Тогда мет возникнуть такая ситуация. Документ ввел какое-то начисление, которое будет начисляться целый год. в январе закрыли расчет. документ пометили как поучаствовавший. В марте пользователь одумался и захотел поставить период начисления не с 01.01.2010 по 31.12.2010, а с 01.01.2010 по 30.09.2010. Но документ то уже поучаствовал в расчете января, февраля. И пользователь получил отлуп. хотя мог бы и отредактировать. дата окончания еще не наступила. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2010, 17:24 |
|
||
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
AndrewVL, Пользователь не должен добавлять документы "от балды". Он вводить их с бумажного документа, подписанного руководителем. Просто даже в вашем примере, где, на первый взгляд, корректировка документа ни на что повлиять не может, можно придумать подводные камни. Информация об этом начислении могла использоваться планово-бюджетным отделом, включена в состав расходов на следующий квартал. Если речь идёт о стипендии, ни на что это влияния не окажет, а вот если это выплата "золотого парашюта" ген. директору, то там суммы другие. По большому счёту, это уже придирки. Но смотрите: вы хотите разрешить пользователю отредактировать дату окончания. Откроете документ на редактирование, а пользователь возьмёт, да и изменит не дату окончания, а другой параметр документа. И целостность базы рассыпается, как карточный домик. Для начисления можно отредактировать и сумму. Ничего страшного. А если это удержание с фиксированной суммой? Тогда надо проверять, сколько по этому документу (исполнительному листу) уже удержано, и не давать пользователю уменьшить этот предел. То есть или вам надо осуществлять сложную интеллектуальную проверку того, какой параметр в каждом конкретном случае редактировать можно, какой нельзя, либо просто приучить бухгалтерию аккуратно вводить документы. Ошиблись - введите исправленный документ. На мой взгляд, второй подход и правильней, и проще в реализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2010, 21:32 |
|
||
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
zenk, Описал примерную логику работы. период начисления месяц. в днях высчитывать не надо надо подучать о документах-корректироках приказов, которые меняют начисления. например если начальный документ был с датой 01.01.2010 по 31.03.2010. то ни начислении за январь все ок. начислняем. потом при начислении за феравль этот же документ является онованием если мы в феврале изменили документ на 01.02.2010 по 31.03.2010 то мы начисляем по основному документу. потом смотрим если ли для него корректирующие. дата начисления between from_date and to_date 1. 01.01.2010 по 20.05.2010 (увеличили период окончания) для фераля непритично. если начисляем за апрель, то по основному документу у нас 0. если апрель вошел в период действия корректирующего документа - начисляем 2. 01.01.2010 по 28.02.2010 (уменьшили период окончания) для февраля непритично если начисляем за март - по основному документу начислили. март не попадает в период действия корректирующего документа. значит начислим с минусом 3. 01.10.2009 по 31.03.2010 (уманьшили дату начала) февраль попадает в период начисления. начисляем. по идее тут надо начислить за те даты, которые добавились (01.10.2009 по 31.12.2009) берем дату начала корректирующего документа и дату начала основного документа. и записываем в текущий месяц начисления с указанием за какой месяц начисляем. т.е. в таблице начисления будет указано, что начисляем за 10.2009 в феврале 2010 и за 11.2009,12.2009 в феврале 2010. с указанием на основании какого докумена. 4. 20.02.2010 по 31.03.2010 (увеличили дату начала) если начисляем за февраль, то будет начислено по основному документу. в корректирующий смотрим. за февраль тоже начисление должно быть. значит ничего не делаем для февраля. но надо снять начисление за январь. берем дату начала корректирующего документа и дату начала основного документа. если дата начала корректирующего больше чем дата начала основного, то снимаем начисление за те месяца. в таблицу начисления записываем дата начисления = 28.02.2010 дата расчета = 31.01.2010 сумма с минусом 5. 20.02.2010 по 20.03.2010 (сузили период действия) начиляем за февраль. по основному документу есть начисления. смотрим корректирующий документ. если дата начала корректирующего документа больше чем дата начала основного документа, то надо снять начисления за этот период. в таблицу начисления записываем дата начисления = 28.02.2010 дата расчета = 31.01.2010 сумма с минусом 6. 01.09.2010 по 05.05.2010 (расширили все периоды) начисляем за февраль. по основному документу. смотрим корректирующий. дата начала корректирующего ддокумента меньше чам основного. в таблицу начисления записываем дата начисления = 28.02.2010 дата расчета = 31.09.2010 сумма с плюсом и т.д. до даты начала основного документа. тут еще такая сиутация. если нам надо начислить за апрель. по основному документу ничего нет. но у него есть корректирующий. смотрим его, и если дата начисления попадает в период действия корректирующего - начисляем Вроде ничего не забыл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2010, 13:11 |
|
||
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
вот сварганил модель базы. прокомментируйте :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2010, 17:01 |
|
||
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
Да вроде логика нормальная... Теперь надо её алгоритмизировать. Замечание: технически корректирующий документ в любом случае должен быть новой версией документа. Во-первых, таким путём устраняются разногласия "что именно изменено". Допустим, изменена дата приказа, сумма не задана. Что это означает? Новый приказ, отменяющий старое начисление (сумма=0) или все параметры приказа прежние, только номер подкорректировали? Рассматривать всю цепочку документов алгоритмически намного труднее. Второй вопрос - с начислениями алгоритмически разобраться можно, хотя и сложно. Что же делать с удержаниями? Профсоюзные взносы составляют определённый процент от начислений, их сумма тоже изменится. Мне кажется, при обнаружении корректирующего документа следует просто запускать расчёт стипендии за все периоды, начиная с минимальной даты начала действия из всех документов, зарегистрированных в текущем месяце. В случае несовпадения сумм из архива за определённый месяц с суммами текущего расчёта записываем в архив текущего месяца разницу. Алгоритмизировать это совсем просто. Задно такой механизм позволит отработать ситуации с изменением ставок удержаний, например, у вас профвзносы были 2%, группа студентов обратилась в суд, что это обдираловка, суд вынес решение - ставка не более 1%. Или вышел соответствующий ФЗ. Для перерасчёта вам надо будет запустить этот процесс или вручную, или заведя новый документ "Решение суда" с нулевой суммой. Такое уже было. В летом 1998 г Сергей Кириенко AKA "Киндер-сюрприз" для компенсации дефицита Пенсионного фонда издал РАСПОРЯЖЕНИЕ ПРАВИТЕЛЬСТВА о введении "дополнительной ставки взносов в ПФ". Потом ряд лиц обратились в Верховный суд, суд решил, что правительство превысило свои полномочия, ставки взносов могут изменяться только ЗАКОНОМ. За несколько месяцев надо было произвести возврат работникам этих излишне удержанных сумм взносов. Не раз бывало, что какие-то нормы вводились "задним числом", то ли в 1999, то ли в 2000, то ли в 2001 году ввели разделение подоходного налога по бюджетам, придумали это где-то в марте, ввели с января. Надо было перерассчитывать НДФЛ. В любой момент может появиться решение суда, объявляющий, что такая-то и такая-то практика, которой уже 100 лет в обед, не соответствует требованиям законодательства и является нарушением закона. Текстовички смотреть лень - можете сделать диаграмму сущностей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2010, 10:32 |
|
||
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
zenk, /Да собственно там всего 2 таблицы. приказы и таблица начислений. + одна процедура, которая делает начисление ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2010, 14:01 |
|
||
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
AndrewVL, Я посмотрел. Я предлагал более универсальное и проще программируемое решение. Вы же всё-таки стали работать с каждым начислением в отрыве от окружающего контекста. Я этот диалект SQL не знаю, но думаю, что даже если бы и знал, тестовый прогон 10 документов с разными вариациями дат начал и окончаний и их корректировок принёс бы больше езультатов, чем изучение кода :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2010, 11:00 |
|
||
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
zenk, столкнулся с такой ситуацией. Основной документ с датами 01.01.2010 по 31.03.2010. начислили за январь,февраль, март. потом внесли корректировку и сузили диапазон до 01.01.2010 по 28.01.2010. и этот документ корректирующий внесли в апреле. Начислил за апрель и по моей процедуре начислений за апрель онных неоказалось. а должно было быть начисление с минусом. Вы советовали при начислении сначала начислить по основным документам. а потом разобраться с корректирующими? Вот и вопрос - как в приведенном примере найти корректирующий документ. в предидущей своей процедуре начисления начислялось по основному документу . и потом смотрелось есть ли у него корректирующий и онный обрабатывался. корректирующий документ обрабатывался в цикле поиска основных документов. и вроде все было хорошо. но в приведеном выше примере при начислении за апрель оновных документов нет. И цикл его не обрабаывает. Как в данном случае найти корректирующий? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2010, 23:22 |
|
||
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
В апреле появился корректирующий документ. Значит требуется какой-то перерассчёт. Определяем дату начала перерасчёта как минимум из дат начала основного документа и хвоста его корректировок. Это 1.1.10 Перерасчитываем январь по последней версии документа. Изменений в суммах по сравнению с архивом января нет. Ничего не делаем. Перерасчитываем февраль. В архиве начисления (и удержания) есть, а по расчёту должны быть 0. В архив текущего месяца (апреля) пишем разницу (- стипендия) (+ профсоюзные) с указанием, что месяц фактический - 02-2010. Перерассчитываем март. Та же ситуация. Рассчитываем апрель. Кроме текущих начислений, у нас 2 строчки с минусами по стипендии, 2 строчки с плюсом по профвзносам. "Свёртывать" отдельные строчки ни в коем случае нельзя - они за разные периоды. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2010, 11:17 |
|
||
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
zenkВ апреле появился корректирующий документ. Значит требуется какой-то перерассчёт. Определяем дату начала перерасчёта как минимум из дат начала основного документа и хвоста его корректировок. Это 1.1.10 Перерасчитываем январь по последней версии документа. Изменений в суммах по сравнению с архивом января нет. Ничего не делаем. а как найти то корректирующий документ, который надо обрабатывать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2010, 21:03 |
|
||
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
zenkВ апреле появился корректирующий документ. Значит требуется какой-то перерассчёт. Если допустим основной документ с 01.01.2010 до 31.03.2010 есть корректирующий 01.01.2010 до 28.02.2010. дата добавления 04.04.2010 при начислении за апрель под условие (from_date <= :lastday and TO_date >= :firstday) не подпадает ни основной ни корректирующий документ. а надо найти корректирующий и обработать. можно корректирующий искать так where add_date between :firstdate and :todate and parent_id is not null тогда за апрель документ попадет в выборку. но если корректирующий будет 01.01.2010 до 28.10.2010. дата добавления 04.04.2010 то по такому условию он попадет в выборку. но при начислении за май не попадет. а должен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2010, 21:17 |
|
||
|
начисления-удержания
|
|||
|---|---|---|---|
|
#18+
собственно нарисовал такой вот запросик по поиску необходимых корректирующих документов select o1.c,o1.from_date,o1.to_date,o1.parent_id,o2.from_date,o2.to_date from orders o1 left join orders o2 on o2.c = o1.parent_id where o1.parent_id is not null and ((o1.reg_date between :firstday and :lastday) or (o1.from_date <= :lastday and o1.TO_date >= :firstday)) прокомментируйте ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2010, 21:44 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=36679231&tid=1542556]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
149ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
| others: | 206ms |
| total: | 456ms |

| 0 / 0 |
