А чем вызвана такая сложность в введении лимитов? Нельзя просто использовать лимиты год в год, без всяких остатков прошлых лет и отрицательных использований?
Лимиты ведутся следующим образом
Code:
1. 15.01.2010-14.01.2011 15.01.2010-31.12.9999 28 28
2. 15.01.2011-14.01.2012 15.01.2011-31.12.9999 28 21
3. 15.01.2012-14.01.2013 15.01.2012-31.12.9999 28 0
Первая пара дат - период лимита, вторая пар - период использования, далее размер лимита и его использования.
Если период лимита закончился, а он еще не израсходован, то он продолжает использоваться (конец использовании 31.12.9999). Никаких переносов остатков не требуется, при этом каждый период представляет сам себя (всегда можно понять, за какой период предоставлен отпуск).
Если требуется предоставить отпуск авансом, то заводится соответствующий лимит, при этом дата начала использования ставится раньше начала лимита. Например, если в описаном выше примере, на 15.12.2012 будет использован весь лимит, и потребуется предоставить отпуск авансом, заводим запись
Code:
4. 15.01.2013-14.01.2014 15.12.2012-31.12.9999 28 0
Опять же будет видно за какой период предоставлен отпуск.
По моему, это самое простое и стройное решение.