Как программировать бизнес процессы?
======================================

 Очень долго волновал вопрос про "программирование бизнес процессов".  

Как правильно подойти к этому вопросу......  

  

Ирония судьбы.  

Я столкнулся с такой задачей на практике.   

Нужно было запрограммировать БП:  

Есть проект, который попадает на утверждение в главное подразделение, которое направляет этот проект уже в дополнительные службы (5 штук). Каждая служба выставляет статус (утвержден, на доработку, отказать). Так же по проекту должны быть логи. Кто и когда выставил какой статус проекту. И отставлять комментарии к проекту.  

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

В итоге проект либо утверждают, либо отправляют на доработку автору, либо снова отправляют в службы(то есть зацикливание процесса).  

  

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

  

Я понимаю, что есть паттерны проектирования, но я не нашел применение этих паттернов для этой задачи .... Скорее всего из-за отсутствия опыта программирование самих БП. Поэтому кроме как условий у меня ничего и не получилось. И все эти условия были запрограммированы внутри контроллера.  

  

В моем представлении, это я уже сейчас провожу работу над ошибками, либо надо было использовать какой-то поведенческий паттерн, либо вынести все эти условия в отдельный класс или компонент.  

  

Как вы программируете БП? И как программировать, когда эти БП более сложные чем мой пример?  

  

К тому же моя реализация очень хрупкая. Если потребуется внести еще какой-то процесс внутри текущего БП, условий будет еще больше.  

  

п.с. тег php, потому делал этот БП на php. 

 Я помню что для похожих ситуаций можно было использовать шаблон [Состояние](https://refactoring.guru/ru/design-patterns/state). Его фишка в том, что можно задать валидную цепочку состояний, а само состояние инкапсулируется в классах 

 Для этого придуман BPM.  

Вот, например: <https://camunda.com/> 

 Указанную задачу можно достаточно удобно реализовать с помощью компонента Symfony Workflow <https://symfony.com/doc/current/workflow.html>