Предложу:
0) ИМХО, лучше делать слепки состояний склада на каждый день (или неделю или месяц). Состояние склада - список товаров (в виде id) и их количество. Если нужно узнать что было после какой-то накладной, пересчитываем все с начала дня до этой накладной включительно.
1) Накладная - просто список товаров (в виде уникальных id) и добавляемое количество. Можно ввести поле типа накладной, можно просто хранить отрицательное значение если это списание, положительное если это приход.
2) За период просто проходим все накладные и записываем все операции. Для одинаковых позиций операции применяем последовательно. В результате получаем движение материальных ценностей за период.
3) Просто добавляем в нужное место между накладными еще одну, потом все последующие пересчитываем.
4) Если мы закупаем товар партиями с разной себестоимостью - то так и храним их на складе, партиями. Как только вся партия выбрана, то меняется себестоимость отгрузки т.к. отгружаем из другой партии с другой себестоимостью. Тоесть, на складе может быть 30 стульев, в виде 3 записей по 10 стульев но с разным временем добавления и разной себестоимостью.
5) Акт инвентаризации просто сравниваем с состоянием склада на начало дня (смотри пункт 0).