#785: Buchungssatz.java
projectforge-business/src/main/java/org/projectforge/reporting/Buchungssatz.java Интерфейс Java — контракт бухгалтерской записи (учётной проводки) для слоя отчётности. Исходник: projectforge-business/src/main/java/org/projectforge/reporting/Buchungssatz.java 86 строк · 23 кода · 43 комментария · 20 пустых
Определяет контракт «только для чтения» для отдельной бухгалтерской записи (Buchungssatz) в финансовых отчётах. Реализуется BuchungssatzDO (JPA-сущность) и BuchungssatzImpl (адаптер отчётности). Интерфейс представляет собой шаблон «Адаптер» между слоем персистентности (DO) и слоем отчётности (BWA, отчёты Kost): он извлекает только поля, необходимые для отчётности, скрывая внутренности JPA от потребителей отчётов.
Поля
| Метод | Тип | Назначение |
getId() | Long | Суррогатный ключ базы данных |
getYear() | Integer | Год проводки |
getMonth() | Integer | Месяц проводки (1–12) |
getFormattedMonth() | String | Месяц с ведущим нулём (01–12) |
getSatznr() | Integer | Порядковый номер в пределах месяца |
getDatum() | LocalDate | Дата проводки |
getBetrag() | BigDecimal | Денежная сумма |
getSh() | SHType | Флаг дебета/кредита (Soll/Haben) |
Шаблон «Адаптер»
Интерфейс находится между BuchungssatzDO (JPA-сущность с аннотациями Hibernate, ленивой загрузкой и проблемами персистентности) и механизмами отчётности (ReportBwa, KostReportSenior). Определяя чистый интерфейс «только для чтения», слой отчётности никогда не взаимодействует напрямую с JPA-сущностями — он видит только этот контракт. Это предотвращает случайную ленивую загрузку при генерации отчётов (которая вызвала бы LazyInitializationException вне транзакции) и отделяет логику отчётности от особенностей ORM.
Ключевой коммит: 4c04cfd65 — миграция int→Long
Тип возвращаемого значения getId() был изменён с Integer на Long в рамках МАЖОРНОЙ миграции идентификаторов. Это потребовало обновления всех реализаций (BuchungssatzDO, BuchungssatzImpl) и всех генераторов отчётов, вызывавших getId(). Интерфейс выступил в роли границы контракта: изменение типа возвращаемого значения здесь принудительно (через компилятор) обновило все вызывающие места, предотвратив скрытые поломки.
История Git
868d6abb7 2025→2026 | 63081666f 2024→2025 | 4c04cfd65 MAJOR: миграция int→Long | b6092df09 2023→2024 | a6a7aece4 Оптимизация импортов | 57761f2a2 Удаление лишних ключевых слов public | 9456bbb6c Month→Integer с основанием 1 | 8c31eba2a Массовая миграция Calendar/DateHolder | 9ebb88522 Первоначальный коммит
Ключевой коммит: 9456bbb6c — месяц с основанием 1
Изменено представление месяца с 0-основного (стиль Calendar) на 1-основной (человекочитаемый). Был добавлен метод getFormattedMonth() для предоставления строк с ведущим нулём («01»–«12») для единообразного отображения и сортировки. Это было частью более широкой работы по устранению путаницы с 0-основными месяцами во всей кодовой базе (затронуты EmployeeSalary, VacationServiceImpl, AccountingRecord и MonthlyEmployeeFilter).