ИНЖЕНЕРНЫЙ ПРАКТИКУМP0L4

Financial EDWH Lab - проверяемый финансовый контур

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

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

Что реализовано#

Financial EDWH Lab - самостоятельный небольшой стенд на Python и SQLite. Он показывает предметную и алгоритмическую логику финансового хранилища без зависимости от внешней базы, секретов или закрытых данных.

Вход - синтетические финансовые события, каждое с учётной датой business_date и моментом известности observed_at. Загрузка создаёт строки журнала по соглашению debit = +amount, credit = −amount.

Ограничение модели: одно событие порождает ровно две строки проводки; суммы хранятся в копейках (целые числа), валюта в первом примере только RUB. Для промышленной финансовой системы нужно расширять контракт документов, валют, учётных книг, синтетических/аналитических счетов и многолинейных проводок.

Схема обработки#

Синтетические JSON-события
          │
          ▼
  Проверка контракта
  ID + SHA-256 содержимого
          │
          ▼
    source_events
          │
          ▼
     journal_lines
    debit / credit
          │
       ┌──┴───┐
       ▼      ▼
     Срезы   Контроли
     суммы   и сверки

Исходники#

Скачать учебный проект с тестами - Python-скрипты, исходные данные, README и unittest.

Запуск после распаковки:

cd financial-edwh-lab
python demo.py
python -m unittest discover -s tests -v

Используется стандартная библиотека Python 3.10+. Сервер PostgreSQL для запуска не требуется.

Проверяемый сценарий#

Сначала загружается расход 200,00 RUB, учтённый в январе. В феврале поступают два события с январской учётной датой: сторно первоначального расхода и исправленный расход 180,00 RUB.

Это вымышленный расход учебной организации. Исправление добавляет сторно −200,00 RUB и новую запись +180,00 RUB. Пересчитанный итог: 200 − 200 + 180 = 180,00 RUB. Исходная запись остаётся в истории.

Замена не может иметь момент известности раньше сторно. Между отдельно поступившими сторно и заменой возможен промежуточный срез с отменённым расходом; это следует отличать от завершённого исправления.

Оба среза считаются по одной истории с разными границами observed_at:

Срез знаний Чистый расход по счёту
31 января 2026 200,00 RUB
4 февраля 2026 180,00 RUB

Эти значения специально заложены в синтетический тестовый сценарий. Они не являются реальными финансовыми данными.

Какие проверки реализованы#

  1. Идемпотентная загрузка идентичного входного пакета.
  2. Запрет другого содержимого под уже загруженным event_id.
  3. Баланс двухстрочной бухгалтерской записи по каждому событию.
  4. Полнота и численность загруженных строк относительно входных событий.
  5. Корректность пересчитанного исторического среза после позднего сторно.
  6. Отклонение невалидных сумм, валют и ссылок на исправляемое событие.

Что ещё не реализовано#

  • Реальная загрузка в PostgreSQL/Greenplum или производственный ETL-оркестратор.
  • CDC из внешней системы, обработка большого потока и распределённая оптимизация.
  • Курсовые разницы, валютная переоценка, многолинейные документы, полноценная главная книга.
  • Промышленная наблюдаемость и эксплуатационные SLA.

Таким образом, стенд демонстрирует проверяемое владение определёнными идеями в коде, но не заменяет описание реального DWH-проекта.

Связанные знания#

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

Полный разбор сценария от входного события до поздней корректировки: сквозной финансовый кейс.

Источники и документация

  1. Python - sqlite3 ↗

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