Автоматизация работы лодочных портов от A до Z

Система управления маринами

Компания, являющаяся ведущим поставщиков программных решений для марин в США, обратилась к нам для разработки SaaS системы комплексного управления яхтенными портами и расположенными в них розничными торговыми точками.

Созданное нами решение уже несколько лет используется американскими компаниями, владеющими маринами и являющимися клиентами нашего заказчика. А мы непрерывно модернизируем систему под актуальные запросы рынка и отдельных пользователей.

Цель проекта

Перед нами стояла задача автоматизации управления портами, которая позволила бы администраторам марины и арендаторам причалов совершать практически все операции, связанные с выбором и оплатой услуг, с помощью нашей системы.

Ключевая особенность

Система позволяет не только управлять бронированием причальных мест, но и сдавать в аренду домики, парковки, гаражи для лодок. Яхтсмены могут самостоятельно бронировать места и заправлять свои суда без помощи работников порта.

Решение

Мы разработали облачное веб-приложение с дополнительными модулями управления магазинами, заправками и другой инфраструктурой марины. Гибкость и удобство настроек системы позволили нашему клиенту распространить это решение по всему побережью США. Конечные клиенты становятся подписчиками сервиса для того, чтобы эффективно управлять своими маринами.

Компоненты системы

Back-end Web API + Front-end SPA для управления основным функционалом системы

Дополнительное Front-end SPA для клиентов портов

Web API и десктопное приложение для интеграции с бухгалтерскими системами

Web API для внешних интеграций с нашей системой со стороны агрегаторов

Web API для чековых принтеров

Web API и десктопное приложение для интеграции с системами заправки

Azure Web Jobs для обработки тяжелых задач

Сервисы взаимодействуют между собой по протоколу HTTP или с использованием общей сервисной шины на основе Azure Queues и Azure Service Bus

Технологии реализации

C#, TypeScript, SQL

Язык программирования

.NET Framework - ASP.NET MVC. .NET Core + Autofac, FluentMigrator, FluentValidation, Serilog, NUnit

Back-end

Angular + DevExpress DevExtreme, Bootstrap, Moment.js, rxjs

Front-end

MSSQL, CosmosDB, Azure Storage, Redis

СУБД и хранение

OData, SignalR, REST

Сервисы и протоколы

Entity Framework

Доступ к данным

Azure Queues, Azure Service Bus

Обмен сообщениями и брокеры

Google Maps, Twilio, SendGrid, QuickBooks Desktop, QuickBooks Online, Sage Intacct, Global Payments (OpenEdge), Payment Innovators, FuelDirect, Star Micronics CloudPRNT

Интеграции

Azure App Services, Azure WebJobs, Azure Functions

Другие технологии и сервисы

Стандартный функционал

Управление стоянками

Планирование и оформление въезда и выезда для каждого стояночного места. Редактирование параметров занимаемого места, дат пребывания, цены, дополнительных услуг, вплоть до полного перерасчета стоимости и оформления возврата денежных средств при необходимости. Стоимость стоянки, размеры платежей и возвратов рассчитываются автоматически.

Интеграции с бухгалтерскими системами

ПО интегрировано с несколькими бухгалтерскими системами и провайдерами обработки безналичных платежей, что позволяет клиентам использовать их привычные инструменты совместно с нашей системой.

Гибкая ролевая модель

Реализован удобный механизм настройки доступов ко всем частям пользовательского интерфейса системы.

Специальный функционал

Карты из Google Maps с возможностью добавления мест

Мы интегрировали в систему Google Maps, предоставив пользователям возможность редактирования и бронирования причальных мест прямо на карте.

Отслеживание загрузки мест

Система позволяет настроить автоматическое окрашивание мест стоянки на карте порта по типу бронирования и занятости. С помощью нашего решения сотрудник порта быстро находит свободные места и предлагает их яхтсмену. Общий отчёт об эффективности заполнения позволяет сравнить выручку при текущей занятости с максимально возможной.

Личный кабинет пользователя

Сервис предоставляет единую точку входа для арендатора причала. Будущие и прошлые стоянки, счета с возможностью оплаты онлайн, все ранее совершенные платежи, а также возможность самостоятельно забронировать причальное место — все это доступно яхтсмену в личном кабинете.

Решение для розничной торговли

Модуль для розничной торговли позволяет вести учет товара, принимать платежи на кассе и учитывать их в единой бухгалтерии с портом. Система находит отсканированные штрих-коды и автоматически добавляет соответствующий товар в чек. Владелец яхты может произвести наличный или безналичный расчёт в порту, записать расходы на счёт своего стояночного места и оплатить его при выезде.

Отчет по смене при ее закрытии

ПО готовит полный финансовый отчет по наличным в кассе, безналичным операциям и возвратам по завершению смены работником. В системе можно просмотреть и экспортировать историю смен.

Функционал для самостоятельной заправки топливом

Клиент может заправиться даже в нерабочие часы станции. Отсканировав QR-код колонки, яхтсмен переходит к интерфейсу системы, позволяющему выбрать тип и объем топлива. После проведения оплаты колонка будет готова к заправке.

Проектные практики

Заказчик всегда видит текущий статус разработки

Так как нашим заказчиком является компания, занимающаяся разработкой программного обеспечения, с их стороны сразу было выдвинуто требование совместно работать в их системе управления задачами Jira. Таким образом наш клиент мог активно участвовать в процессе разработки, имея доступ к общему плану работ, а также к индивидуальным задачам и их статусам.

Обсуждение задач проводится непосредственно в комментариях в Jira, благодаря чему все решения сохраняются в задачах, и к ним можно обратиться в дальнейшем для уточнения требований.

На пайплайне присутствует особый статус для финальной приемки. Попадая в этот статус, каждая задача проверяется командой заказчика и может считаться завершенной только после подтверждения полной и корректной реализации с их стороны.

Прорабатываем требования по базовому видению заказчика

Благодаря тому, что наша команда работает над проектом более 6 лет и разбирается во всех тонкостях системы, мы способны самостоятельно прорабатывать требования для нового функционала или даже целых новых модулей по верхнеуровневому запросу заказчика. Мы самостоятельно анализируем существующие аналоги, прописываем наше видение реализации и обсуждаем его на регулярных созвонах с командой клиента, чтобы итоговый результат в точности соответствовал их ожиданиям. Такая практика позволяет добавлять функционал, не дожидаясь его детальной проработки со стороны клиента.

Все прототипы интерфейса и финальные дизайны согласовываются на еженедельных встречах, чтобы внешний вид системы в точности соответствовал пожеланиям клиента.

Возникающие проблемы анализирует архитектор системы

Все обращения в поддержку в первую очередь анализируются тим-лидом команды, который является архитектором системы. Благодаря глубокому пониманию технической части системы и интегрированных сервисов он может быстро выявить причины необычного поведения.

Ответы по обращениям даются в тот же день. В них добавляются причины описанного в обращении поведения системы и возможные решения, а также ссылка на задачу в Jira, в рамках которой будет обработан запрос.

Такие задачи реализуются в первую очередь и не задерживают разработку нового функционала, так как для работы над ними не привлекаются остальные члены команды.

Основная техническая сложность проекта

Разработка идет уже около семи лет. За это время было решено множество совершенно разных проблем в реализации системы. В разработке проекта с таким количеством функционала и интеграций на первый план выходит планирование архитектуры.

Помимо основного веб-сервиса, в системе присутствуют отдельные приложения для взаимодействия с облачными и десктопными бухгалтерскими программами, чековыми принтерами, топливозаправочными установками. Нужно было организовать интерфейс между компонентами таким образом, чтобы внезапный рост нагрузки на одни сервисы не отразился на производительности остальных.

Статиcтика работы и использования системы