Загрузка данных
Логика для всех документов у кого есть запись в ПартииТоваров(нужен регистр сведений (например название ДокументыДляУчетаОстатков) в котором есть сведения о каждом типе документа. То есть если документ есть в этом регистре, то значит мы посчитали что он обладает функционалом записи в ПартииТоваров и он может делать резервы. Документ либо одиночный, либо составной. Если одиночный, то ставится флаг, если составной то флаг не ставится. Если документ составной то в регистре флаг не стоит (на примере ОказаниеУслуг + ЧекККТ).
Для одиночных:
Пример РозничнаяПродажа. Он же при записи делает резерв в РН ТоварыВРезерве, при его же проведении резерв снимается. Так как он же делает списание с ПартииТоваров.
Для составных(типа ОказаниеУслуг + ЧекККТ):
ОказаниеУслуг при записи делает резерв в РН ТоварыВРезерве. А при проведении ЧекККТ резерв снимается. Потому что именно ЧекККТ делает списание с ПартииТоваров.
В каждом типе документа должен быть реквизит статуса есть ли сейчас резерв или нет. он явно отображается в документе и в колонке формы списка документа. и всегда должен быть обновленным и актуальным(не зависшим). Также нужно чтобы этот реквизит на форме документа и колонка в форме списка выдавала актуальные данные и чтобы отображалась только в случае если в регистре сведений СведенияПоДокументамДляУчетаОстатков есть информация о том, что документ участвует в системе резервирования.
При записи:
если резерва нет
новый документ без ссылки
ищем остатки на текущую дату и время. Дата документа на время записи.
Создаем резерв, если для резерва нет остатка - сообщаем пользователю, документ сохраняем время записи, резерв не создаем, так как не из чего.
не новый документ с ссылкой
используем Алгоритм подбора партий с динамическим сдвигом даты записи.
В Алгоритме:
Если остатков нет даже на текущий момент, сообщаем клиенту и просто записываем на дату документа(так как табл часть могла измениться) без создания резерва.
Если остаток есть на дату документа, то записываем на дату документа и создаем резерв.
Если остаток есть на дату позже даты документа, сообщаем клиенту
если он согласен то записываем на новую дату и создаем резерв.
если не согласен то записываем на дату документа(так как табл часть могла измениться) без создания резерва.
если резерв есть (везде где сохранили без изменения резерва статус должен измениться на то, что резерв есть но он не полный)
не новый документ с ссылкой
используем Алгоритм подбора партий с динамическим сдвигом даты записи. при этом учитываем что у нас есть зарезервированные партии и используем их, а остальные добираем.
В Алгоритме:
ВСЕГДА УЧИТЫВАЕМ ЧТО ЧАСТЬ ЕСТЬ В РЕЗЕРВЕ
ищем дополнительную часть
Если остатков нет даже на текущий момент, сообщаем клиенту и просто записываем на дату документа(так как табл часть могла измениться), оставляя старый резерв не создавая новый.
Если остаток есть на дату документа, то записываем на дату документа и создаем новый резерв(старый конечно удаляем).
Если остаток есть на дату позже даты документ, сообщаем клиенту
если он согласен то записываем на новую дату и создаем новый резерв(старый конечно удаляем).
если не согласен то записываем на дату документа(так как табл часть могла измениться) без создания резерва, оставляя предыдущий резерв.
При проведении:
если резерва нет
новый документ без ссылки
ищем остатки на текущую дату и время. Дата документа на время проведения.
не новый документ с ссылкой
используем Алгоритм подбора партий с динамическим сдвигом даты записи.
В Алгоритме:
Если остатков нет даже на текущий момент, сообщаем клиенту. Ничего не записываем.
Если остаток есть на дату документа, то проводим на дату документа.
Если остаток есть на дату позже даты документа, сообщаем клиенту
если он согласен то проводим на новую дату.
если не согласен то не проводим. Ничего не записываем.
если резерв есть
не новый документ с ссылкой
используем Алгоритм подбора партий с динамическим сдвигом даты записи. при этом учитываем что у нас есть зарезервированные партии и используем их, а остальные добираем.
В Алгоритме:
Если остатков нет даже на текущий момент, сообщаем клиенту. Ничего не записываем. Резерв оставляем.
Если остаток есть на дату документа, то проводим на дату документа. Резерв снимаем.
Если остаток есть на дату позже даты документа, сообщаем клиенту
если он согласен то проводим на новую дату. Резерв снимаем.
если не согласен то не проводим. Ничего не записываем. Резерв оставляем.
После проведения снимаем резерв.
Проведенный пометить на удаление
отменяем проведение
помечаем на удаление
Проведенный распровести
отменяем проведение
Непроведенный пометить на удаление
если резерва нет
помечаем на удаление
если резерв есть
снять резерв
помечаем на удаление
При создании резерва создается документ РезервированиеТоваров, как сейчас уже и происходит.
У этого документа должны быть статусы.
-Завершено успешно проведением документа. В форме списка документа РезервированиеТовара должна быть колонка со статусом. Этот статус должен быть зеленым фоном.
-Завершено фоновым заданием. Подсвечивается в форме списка красным фоном. Это когда резерв просрочен.
-Другие статусы по логике.
-Отмена резерва (допустим ОказаниеУслуг пометили на удаление или еще как-то продумать случаи...)
Алгоритм подбора партий с динамическим сдвигом даты записи
Шаг 1
1. Берем ВСЕ партии по отдельной номенклатуре, которые есть в наличии на текущий момент времени.
Если количества уже не хватает даже на текущую дату, то сообщаем пользователю, что на остатках не хватает товара.
2. Если количества достаточно, то Проверяем остатки всех этих партий на дату и время документа.
3. Если количества хватает уже на дату документа, то учитываем эти партии для резерва.
Шаг 2
Если на дату документа этих партий не хватает, то включаем механику добора.
Нужно добрать из списка доступных на настоящий момент партий тот набор, который суммарно закроет всю потребность по количеству номенклатуры.
Чтобы дата переноса получилась максимально ранней (ближе всего к дате документа), партии берутся по принципу: в первую очередь выбираем те партии из доступных сейчас, которые появились в системе раньше остальных.
1. Определяем дату появления самой "свежей" партии из этого добранного набора.
И так для каждой номенклатуры из списка товаров.
Из всех полученных дат готовностей выбираем самую позднюю.
Именно в это время в системе впервые одновременно существуют самые ранние доступные комплекты для всех номенклатур документа. Предлагаем пользователю перенести документ на эту дату.