Най-накрая нещо по моята специалност
Сега да ти кажа това е по-голям проблем от колкото си мислиш. Ти че ще си имаш ID на документа, което да е от auto_increment поле - ще си имаш, това е задължително, но номера на документ е нещо което потребителите много обичат да променят и не става с auto increment.
Следващ номер за годината можеш да си вземеш така:
select MAX(DocNum)+1 WHERE year(DocDate)=$WantedYear and DocType=$WantedDocType
което е ОК ако системата ти не е натоварена и веднага след заявката insert-неш новия документ. Ако системата ти е натоварена обаче (повече от 100 едновременно работещи с един вид документ и от една фирма) и в зависимост от вида на базата данни и настройката на изолация на транзакциите може в един момент още някой да направи същата заявка и да получи същия следващ номер.
В моята система няколко пъти вече ми се случи. Аз се преборих така:
1. създадох си уникален индекс по искания от мен ключ (в твоя случай година и номер)
2. затворих заявката за вземане на номер в една транзакция със записа на документа
START TRANSACTION
select MAX(DocNum)+1 WHERE year(DocDate)=$WantedYear and DocType=$WantedDocType update .....
insert ....
COMMIT TRANSACTION
и завъртях в цикъл транзакцията докато не успее.
Тази схема обаче не позволява да покажеш предварително номера на документа, както най-вероятно ще ти искат, но това е положението - аз не им го показвам - нито на фактури, нито на касови ордери, нито на стокови разписки.
Естествено трябва да видиш в базата която използваш дали се поддържат транзакции - специално аз не съм на mySql, но мисля че InnoDB в mySql поддържа транзакции - не съм сигурен дали myISAM вече поддържа, едно време нямаше.
Съветвам те още от сега да се откажеш от auto_increment-а защото особеностите при номер на документ са толкова много, че няма да ти свърши работа. Ако базата ти не е mysql погледни дали се поддържат sequences, което би могло да ти влезне от полза.