Логика простая на словах: всего мест минус количество подтверждённых записей равно остатку, который выводится в виджете. Значение должно обновляться при заходе на страницу и периодически, пока человек её просматривает, без перезагрузки всей страницы. Если запись отменяется, место освобождается и остаток увеличивается обратно — этого не нужно бояться, скрывать возврат места нечестно по отношению к следующему посетителю.
Отдельно важно продумать ситуацию, когда несколько человек одновременно пытаются занять последнее свободное место: система должна корректно определить, кто успел первым, а не позволить двум записям пройти на одно место. Также нужно предусмотреть, что виджет будет делать, если запрос к базе не удался — он не должен показывать нулевые или произвольные значения, лучше скрыть блок временно.
Из чего должна состоять работа:
— запрос или эндпоинт, отдающий актуальный остаток мест;
— фронтенд-часть виджета с автообновлением без перезагрузки;
— обработка гонки при одновременных записях на последнее место;
— запасное поведение виджета при сбое запроса к базе.