{"id":20645011,"url":"https://github.com/romanow/camunda-state-machine","last_synced_at":"2026-05-17T09:34:28.653Z","repository":{"id":146005500,"uuid":"571933721","full_name":"Romanow/camunda-state-machine","owner":"Romanow","description":"Camunda as an engine for calculation","archived":false,"fork":false,"pushed_at":"2023-01-17T17:20:51.000Z","size":4418,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-24T15:56:55.608Z","etag":null,"topics":["bpmn","camunda","spring-boot"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Romanow.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-11-29T07:45:27.000Z","updated_at":"2023-07-12T08:51:49.000Z","dependencies_parsed_at":"2023-06-09T12:15:53.429Z","dependency_job_id":null,"html_url":"https://github.com/Romanow/camunda-state-machine","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Romanow/camunda-state-machine","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Romanow%2Fcamunda-state-machine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Romanow%2Fcamunda-state-machine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Romanow%2Fcamunda-state-machine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Romanow%2Fcamunda-state-machine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Romanow","download_url":"https://codeload.github.com/Romanow/camunda-state-machine/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Romanow%2Fcamunda-state-machine/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":281355386,"owners_count":26486904,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-27T02:00:05.855Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bpmn","camunda","spring-boot"],"created_at":"2024-11-16T16:18:23.684Z","updated_at":"2025-10-27T23:05:33.274Z","avatar_url":"https://github.com/Romanow.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# State Machine using Camunda\n\n[![Build project](https://github.com/Romanow/camunda-state-machine/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/Romanow/camunda-state-machine/actions/workflows/build.yml)\n\n### Разработка\n\n1. Camunda не предоставляет возможности получить ответ об успешном завершении action, отправка события всегда\n   возвращает `200 ОК`, а статус расчета возвращается в body.\n2. Идентификатор расчета `calculationUid` связывается с расчетом как `businessKey`.\n   ```kotlin\n   val instance = processEngine\n       .runtimeService\n       .createProcessInstanceQuery()\n       .processInstanceBusinessKey(calculationUid.toString())\n       .active()\n       .singleResult()\n       .processInstanceId\n   ```\n3. Для изменения статуса расчета в событиях и действиях явным образом\n   прописан [Execution Listener](src/main/java/ru/romanow/camunda/service/ProcessListener.kt), который принимает как\n   параметр новый статус расчета.\n4. Так же там передается маркировочный параметр `needOperationUid`, он нужен, чтобы для определенных действий записывать\n   в статус `opearionUid`, само значение параметра `operationUid` берется из переменных. Так было реализовано потому что\n   переменные принадлежит всему процессу, следовательно, если в одном состоянии задать переменную, то она будет видна\n   для всех последующих состояний. Локальные переменные видны внутри процесса (subprocess).\n5. Для мокирования внешних запросов используется [WireMock](https://wiremock.org/) и [stubs](stubs/mappings/stubs.json).\n\nBPMN схема [Cash Flow](src/main/resources/bpmn/CashFlowProcess.bpmn).\n\nПолучить последний статус расчета.\n\n```sql\nSELECT c.uid           AS uid\n     , c.name          AS name\n     , cs.status       AS status\n     , cs.created_date AS status_date\nFROM calculation c\n    JOIN LATERAL (SELECT *\n                  FROM calculation_status cs\n                  WHERE cs.calculation_id = c.id\n                  ORDER BY cs.created_date DESC\n                  LIMIT 1) cs\n         ON TRUE;\n```\n\n### Правила именования объектов\n\nДля именования заданий нужно применять объектно-ориентированный шаблон _глагол_ + _объект_. Правильное название\nзадания _приобрести продукты_, а не _сначала позаботиться о покупке продуктов_.\n\nСобытия относятся к чему-то, что уже случилось независимо от процесса (если перехыватываем события) или как результат\nвыполнения процесса (если он генерирует события). Поэтому в именовании объектов используется шаблон _объект_ + _глагол в\nпассиве_, например, _почувствовать голод_.\n\n## Локальная установка и запуск\n\n```shell\n$ ./gradlew clean build\n\n$ docker compose up postgres wiremock -d\n\n$ ./gradlew bootRun --args='--spring.profiles.active=local'  \n```\n\nЗапускаем end-to-end тесты (папка [`tests/postman`](tests/postman)):\n\n```shell\n$ newman run -e local-environment.json collection.json\n```\n\nАдминка доступна по\nадресу [http://localhost:8080/camunda/app/cockpit/default/#/](http://localhost:8080/camunda/app/cockpit/default/#/),\nпользователь `admin`:`admin`.\n\nДля управления расчетом через REST API можно использовать [коллекцию](tests/postman/collection.json) postman\nи [переменные](tests/postman/local-environment.json).\n\n## Нагрузочное тестирование\n\n[Описание нагрузочного тестирования](load-testing.md)\n\n### Технические вопросы\n\n* [ ] Админка и управление расчетом (Observability, Grafana).\n\n## Ссылки\n\n1. [Camunda User Guide](https://docs.camunda.org/manual/latest/user-guide/)\n2. [BPMN overview](https://camunda.com/bpmn/reference/)\n3. [Process Variables](https://docs.camunda.org/manual/7.16/user-guide/process-engine/variables/)\n4. [Delegation Code](https://docs.camunda.org/manual/7.16/user-guide/process-engine/delegation-code/)\n5. [Error Handling](https://docs.camunda.org/manual/7.16/user-guide/process-engine/error-handling/)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fromanow%2Fcamunda-state-machine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fromanow%2Fcamunda-state-machine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fromanow%2Fcamunda-state-machine/lists"}