Skip to content

Jury Release Notes: JuryFlex v5.3.7 - v6.1.2

This document contains release notes for JuryFlex versions 5.3.7 through v6.1.2.


Version 6.1.2

Release Date: October 6, 2026

Hotfix release on the 6.1.x line. The fix below is also included in v6.2.0.

Bug Fixes

  • JURYCLOUD-86 / JURYSVC-130 / JURYSVC-101 — Regression Failure - Add City State and Zip into JSON DTO for GL (35330078)
    • The city, state and zip columns were empty for juror rows in the GL export; GLFilePayableDTOMapper now populates them from the juror record
    • Ported from v5.6.8 (35e24208), which the 6.x line never received

Version 6.1.1

Release Date: October 1, 2026

Features

  • JURYCLOUD-113 / JURYSVC-115 — Juror Age on the Alpha Venire (cd93cfc5)

    • Added a juror age column to the alphabetical venire report
  • JURYCLOUD-121 / JURYSVC-97 — Report Image Library: Facebook and Handicap Icons on the Jury Summons (e94b0050)

    • New Admin → System Config → Report Images screen for uploading per-tenant PNG, JPEG and GIF images (2 MB max)
    • Report templates reference an image by name (e.g. "county-logo.png"); a JasperReports RepositoryService (DbReportImageRepositoryService) resolves it from the new sys_report_image table at fill time, so new report artwork no longer requires a release
    • Existing clerk seal, state seal and clerk signature handling is unchanged
    • Enables courts to add icons such as Facebook and handicap-accessibility symbols to the jury summons
    • User documentation: Administration → Report Images
  • JURYCLOUD-122 / JURYSVC-129 — Report Text Macros: Judge, Location, Pool and Juror Fields in Letter Text (2bfde31c)

    • Letter text edited in Admin → System Config → System Reports can now use field macros such as ${judge.name}, ${location.roomDesc1} and ${poolGroup.appearanceDt|MMMM d, yyyy}, resolved per juror from the letter's PoolMemberVM row
    • Enables second notices that print each juror's judge (the pool group's judge, falling back to the pool's judge)
    • Applies to the Second Notice, Thank You, Thank You (Donation), Call Off and Excusal/Reschedule Request reply letters; Second Notice, Thank You and Call Off now use PoolMemberVM rows instead of JurorMasterVM
    • Fields are limited to an allowlist in ReportMacroCatalog (no SSN, DL number, date of birth or system credentials); the System Reports editor refuses to save unknown macros
    • Existing ${clerkName}-style macros are unchanged
    • PoolMemberVM gained read-only pass-throughs to the juror (nameFirst, address1, dlNum, dateOfBirth, etc.) so customized letter templates written against JurorMasterVM rows keep filling; these are not reachable from text macros
    • User documentation: Administration → Report Text Macros

Tenants with customized letter templates: no action needed unless they want the new field macros. The stock templates are updated automatically at startup where system_default = true. Customized copies (system_default = false) are left as they are and keep working: every original macro (${clerkName}, ${appearanceDt}, …) is still substituted, and their existing fields still fill. The only difference is that new field macros such as ${judge.name} print as typed in those tenants' letters until the template is updated as below.

Find tenants with customized letter templates:

sql select tenant_id, search_key from sys_report_artifact where system_default = false and search_key in ('8L','16L','18L','19L','23L');

search_key Template
8L excusalRequestReply.jrxml
16L secondNotices.jrxml
18L thankYouLetter.jrxml
19L thankYouLetterDonation.jrxml
23L callOffLetter.jrxml

To enable field macros in a customized template, make both of these changes:

  1. Add this field after the last existing <field> declaration. It exposes the whole row bean to the report. _THIS is JRAbstractBeanDataSource.CURRENT_BEAN_MAPPING in JasperReports 7.0.6.

xml <field name="row" class="java.lang.Object"> <description><![CDATA[_THIS]]></description> </field>

  1. Switch every ReportUtil.replaceDynamicFields(...) call to the new method, inserting $F{row} as the third argument. Use resolveStyledMacros in text fields with markup="styled" and resolveMacros everywhere else. Any further arguments (dates, the juror Map.of(...)) stay as they are:

ReportUtil.replaceDynamicFields($P{secondNoticeBodyText1}, $P{sysApplicationProperties}, $F{reschedDt}, $P{appearanceDt}) ReportUtil.resolveStyledMacros($P{secondNoticeBodyText1}, $P{sysApplicationProperties}, $F{row}, $F{reschedDt}, $P{appearanceDt})

The field alone does not enable the new macros; the calls must also change.

Recommended check before deploying: review the <field> declarations of every customized secondNotices.jrxml, thankYouLetter.jrxml and callOffLetter.jrxml the query returns. These letters now fill from PoolMemberVM rows instead of JurorMasterVM. Every juror field still resolves, but a few names now carry the pool member's value:

Field Before (JurorMasterVM) Now (PoolMemberVM)
$F{id}, $F{version} Juror record Pool member record
$F{active}, $F{jurorState}, $F{sysExemptCode} Juror's status / excusal Status / excusal for this summons
$F{appearanceDt} Always empty The pool group's appearance date

Templates that only use name, address, fullName, fullAddress, fullNameFML, lastNameSentenceCase, sex or reschedDt need no review.

Deployment & Configuration

  • JURYCLOUD-112 / JURYSVC-116 — Font Packs Required (128176cf)
    • Bundled the OFL-licensed Liberation Sans font family (metric-compatible with Arial) and registered it with JasperReports programmatically at startup via JasperFontRegistrar
    • Opt-in per report element via fontName="Liberation Sans"; existing Arial elements are unchanged
    • New juryflex.report-fonts.required setting (default true in prod/cloud/docker) fails startup if the fonts cannot be registered

Action required for Windows Service deployments (juryflex-service.xml): review before starting 6.1.1. The bundled report fonts are required by default in the prod, cloud and docker profiles (juryflex.report-fonts.required=true). If the fonts cannot be extracted and registered at startup, the service will refuse to start — a new failure mode in this release.

Two new environment variables control this. Both are present, commented out, in the updated src/main/resources/deployment/juryflex-service.xml (and in northflank-env.template):

Variable Default Purpose
REPORT_FONTS_REQUIRED true Set to false to log a warning instead of failing startup
REPORT_FONTS_CACHE_DIRECTORY (JVM temp directory) Directory where the TrueType files are staged for JasperReports/OpenPDF to read, e.g. C:/Java/report-fonts. Set this if the service account cannot write to the OS temp directory.

xml <env name="REPORT_FONTS_REQUIRED" value="true"/> <env name="REPORT_FONTS_CACHE_DIRECTORY" value="C:/Java/report-fonts"/>

Recommended for on-prem Windows: uncomment REPORT_FONTS_CACHE_DIRECTORY and point it at a location the service account can write to (the directory is created on startup if missing). If the service fails to start after the upgrade, look for JasperFontRegistrar / BundledFonts in the log and either fix the directory permissions or set REPORT_FONTS_REQUIRED to false to bring the service up while investigating.

Bug Fixes

  • Carries forward all v6.0.9 hotfixes — JURYCLOUD-115, 117, 118, 119, and 120 (see Version 6.0.9 below)

Version 6.1.0

Release Date: September 5, 2026

Features

  • JURYCLOUD-84 / JURYSVC-100 — API-Based DMV/BVS Load Processing (d117f21b)

    • New JobsResource REST API to trigger the DMV (JurorFileBatchJob) and BVS deceased-file (DeceasedBatchJob) processes on demand, previously runnable only via the cron schedule
    • Added a job-status endpoint, SysJobRun run-history entity, ManagedJob/TenantBatchProcessor abstractions, JobAlreadyRunningException, and a dedicated ROLE_JOB_API authority
    • User documentation updated with a REST API usage guide (9f53adf0)
  • JURYCLOUD-101 / JURYSVC-78 — Additional Seating Charts (625acc2c, 1ae0d7a2, 74991c1b)

    • Added new seating chart layouts for 8, 14, 20, 21, 21A, and 24-person configurations to SeatingLayout, seating-layouts/layouts.json, and new Jasper templates
    • Seeded via Liquibase for multi-tenant rollout

Bug Fixes

  • JURYCLOUD-98 — Multi-Tenancy Isolation Bug (8d9384d2)

    • Added TenantResolutionFilter to fix non-deterministic tenant scoping on the login POST request, which previously bypassed TenantInterceptor entirely
  • JURYCLOUD-94 / JURYSVC-81 — Review Report Logic for Jury Management Report (JMR) (6c7f7efc)

    • Payroll data in the JMR is now fetched by pool/panel member service date instead of check date in PaymentMemberRepository and PaymentMemberService
  • JURYCLOUD-93 / JURYSVC-63 — Juror Search: Inconsistent Search Behavior (0e06c159)

    • Standardized grid filtering on "starts with" comparisons via a new GridFilterUtils utility, replacing inconsistent "contains" logic across roughly 14 grid classes
  • JURYCLOUD-102 / JURYSVC-112 — Seating Chart: 11-Person Layout Seat Overwrite (b1debda7)

    • Fixed the 11-person right-to-left layout where Seat 6 was overwriting Seat 3
  • JURYCLOUD-106 / JURYSVC-44 — User Deactivation (e153cc5a)

    • Restored the Activated checkbox/column in User Administration (previously commented out) so admins can actually toggle it
    • Deactivating a user now broadcasts a UserDeactivatedEvent and force-logs-out any already-open Vaadin session, closing the gap where deactivation only blocked future logins
    • Added JwtActivatedUserFilter to enforce the same activation check for JWT/API access

Improvements

  • JURYCLOUD-90 — CourtFunds Export Mapping (b2e6d14e)

    • Added a CourtFunds download to the system export mapping, with a new CourtFundsPayableDTO/mapper and CsvExporter enhancements, giving admins editable, sortable output
  • JURYCLOUD-91 — Check-In Workflow: Employer-Paid Selection (a5f8c1c3)

    • CheckInJurorsDialog now persists the last-selected employer-paid value for the session
    • Payment-card focus moves to the check button automatically after a card is scanned
  • JURYCLOUD-99 / JURYSVC-104 — JDBC Driver Update (5e3e8e91)

    • Upgraded the SQL Server JDBC driver to 13.4.0.jre11
  • JURYCLOUD-100 / JURYSVC-108 — Database Indexes (38943ddb)

    • Added performance indexes for the pool_member and juror_history tables
  • JURYCLOUD-104 / JURYSVC-103 — Trial Panel Reports Access from Panel Details (324b2fbf)

    • Added a new ReportGroupDTO and refactored TrialPanelReportsView/PanelDetailView so Trial Panel Reports are reachable directly from the Trial Panel Details screen

Version 6.0.9

Release Date: September 17, 2026

Hotfix release on the 6.0.x line. All fixes below are also included in v6.1.1.

Bug Fixes

  • JURYCLOUD-115 — Optimistic Locking Failure When Saving a Juror Address Change (e90683f9)

    • JurorAddressHistory now uses its own dedicated sequence instead of the shared generator, and AddressHistoryMapper no longer copies the juror's id and version onto the history row, so saving an address change from Juror Details no longer fails with an optimistic lock error
    • History rows are stamped with the current time, and a genuine concurrent-edit conflict now shows a clear "updated by another user" message instead of a stack trace
  • JURYCLOUD-117 / JURYSVC-123 — Juror Payment Calculation Not Picking Up Panel Days Served (db60db1c)

    • Payment creation now loads panel attendance with a direct query instead of the second-level-cached poolMember.panelMembers collection, which could be served stale and silently drop panel days from the payment
    • Re-creating a payment for a juror already in the batch now disassociates the pool and panel attendance days and records the deletion in juror history before removing the old payment member
    • Removing a paid panel attendance day now checks the persisted row and shows which payment batch must be deleted first
    • Enabled hibernate.cache.auto_evict_collection_cache and added the tenant-aware task decorator to the Vaadin task executor
  • JURYCLOUD-118 / JURYSVC-122 — Exception When Adding Juror Attendance to an Existing Payment Batch (1f7c72f5)

    • Widened the PoolMemberExtendedRepository entity graph to fetch juror master, exempt code, pool master, and pool group up front, fixing the exception raised when creating a payment for a juror already in the batch
  • JURYCLOUD-119 / JURYSVC-120 — Trial Panel Details: Incorrect Status Shown in the Status Drop-Down (c3fe93ec)

    • The status drop-down on Trial Panel Details now lists PANEL_MASTER status codes (In Process, Finalized Panel, Closed Panel) instead of PANEL_DETAILS codes
  • JURYCLOUD-120 / JURYSVC-121 — Failed To Appear Print Summary Does Not Generate (3bfb8071)

    • Replaced the abandoned ar.com.fdvs:DynamicJasper library with the nostrum-dynamic-jasper fork built for JasperReports 7
    • Added JuryFlexDjScriptlet so DynamicJasper custom-expression columns receive field values under JasperReports 7; previously they rendered blank on every DynamicJasper-built report
    • Added UIReportUtilTest as a regression guard

Version 6.0.8

Release Date: July 27, 2026

Improvements

  • Appearance date filtering — additional null-safety checks added around appearanceDatePicker in PoolMasterGrid, and imports updated to use DateRange from EnhancedDateRangePicker; the fix was reapplied after a merge to ensure it landed on update-spring-vaadin (67fabc1a, ec2e926a)
  • Summons Ready grid — adjusted column and layout widths in SrMessageGrid for improved UI consistency (ca982047)

Version 6.0.7

Release Date: July 21, 2026

Bug Fixes

  • JURYSVC-64 / JURYCLOUD-87 — Juror Search, Juror Details: Cannot Undo Permanent Excusal (767a8307)

    • Removed stale Hibernate caching annotations and juror-related caches from JurorMasterService that were preventing permanent-excusal reversal from being reflected
    • Optimized cache configuration and added logging/robustness improvements to JurorMasterDetail and JurorMasterDetailView
  • JURYSVC-80 / JURYCLOUD-85 — Columbia JuryFlex Conversion Issue: Pool Master ID vs. Pool Number Mismatch (4a7063af)

    • Replaced DateTimePicker with EnhancedDateRangePicker for the appearance-date filter in PoolMasterGrid, with LumoUtility-based CSS overrides for alignment
    • Updated filtering logic to support proper date-range selection
  • JURYCLOUD-82 — Unable to Recycle Jurors (d7d3c21a)

    • Fixed checkIfJurorsAvail() in PoolGroupCheckinView to include recycled jurors in the availability count, not just checked-in-and-available ones — previously, jurors returned to the pool after a trial weren't counted, so the app could incorrectly report no jurors available and block creating a new trial panel; added debug logging around the check for diagnostics
    • Added @JsonIgnore to panel and pool master mappings in SysTrialCode and SysJudgeCode to prevent recycling failures caused by serialization issues
  • JURYSVC-94 / JURYCLOUD-80 — Trial Panel Numbers Shown in App Do Not Match On All Screens (d308209f)

    • PoolGroupMembersCheckedInGrid now displays the panel number instead of the internal panel ID
    • PanelDetailView panel references are now clickable links to the corresponding PanelDetail view

Improvements

  • JURYSVC-92 / JURYCLOUD-81 — Spring UI: Dev 6.0.5 vs. Test 5.6.7 (3193b740)

    • Standardized padding and spacing across the UI using LumoUtility
    • Refactored layout and component styles in JurorsSummoned, JurorNotifications, JurorRequests, and VoucherMainView for consistency
    • Introduced reusable grid constants for styling
  • JasperReports loader fallback refactor (f3b1b3eb)

    • Extracted installJacksonReportLoaderFallback for clearer fallback handling in nested JAR environments
    • Introduced JacksonReportLoaderFallbackRegistry for modular, consistent extension discovery
    • Added a loadJasperDesign method for direct JRXML loading via JacksonReportLoader, with clearer error diagnostics
  • Vaadin push tenant context recovery (ae8cd1c9)

    • Added session-based tenant ID resolution (resolveTenantId) with a fallback path in ConfigureUIServiceInitListener
    • TenantContext can now recover the tenant from the Vaadin session when push RPCs bypass the normal request path
  • JURYSVC-96 / JURYCLOUD-78 — "Juror Name Change" activity for new tenants (80ee6519)

    • Corrected the new-tenant Liquibase changelog so the JUROR_NAME_CHANGE activity code is seeded for newly provisioned tenants, not just existing ones
  • Documentation — added RELEASE_NOTES_JIRA.md and RELEASE_NOTES_JIRA.html as a support-facing, ticket-indexed companion to this document (fa341ec6, 972b55d1)


Version 6.0.6

Release Date: July 9, 2026

Bug Fixes

  • JURYSVC-99 / JURYCLOUD-79 — Unable to undo Call Offs in JuryFlex (ddf86999)
    • Adjusted PoolMemberExtendedService validation for exempt code comparison so a call-off can be undone correctly

Improvements

  • JURYCLOUD-78 / JURYSVC-96 — Juror Name Change activity (c758149e)

    • Added the "Juror Name Change" activity to sys_activity_code for all non-default tenants via Liquibase changeset 202603080000001_add_name_change_sys_activity.xml
    • Increased retry max attempts to 75 and decreased juror file processor parallelism to 1 in production config
  • Security scan documentation (f0071b3b)

    • Documented known Vaadin Flow scanner false positives in CLAUDE.md
    • Added a form-action directive to the Content Security Policy
  • Security headers (517ccb93)

    • Integrated JHipsterProperties for dynamic CSP configuration
    • Added Strict-Transport-Security, Referrer-Policy, and X-Content-Type-Options headers in VaadinSecurityConfiguration
    • Updated the frame-ancestors CSP directive
  • .gitignore — excluded the security-scans/ directory from version control (60b33580)


Version 6.0.5

Release Date: June 15, 2026

Bug Fixes

  • JasperReports in nested JAR environments (fcad846c)
    • Installed JacksonReportLoader so report compilation works correctly when the application is packaged as a nested (Spring Boot fat) JAR
    • Added a default password placeholder in the production config template

Version 6.0.4

Release Date: June 15, 2026

Changes

  • Removed a deprecated HTTP cache configuration property from application-prod.yml (ac714350)

Version 6.0.3

Release Date: June 15, 2026

Deployment & Configuration

  • Unified prod/cloud configuration (53cf6e67)

    • Consolidated application-prod.yml and application-cloud.yml, externalizing all remaining environment variables
    • Hardened security defaults and added deployment templates: northflank-env.template and juryflex-service.xml (Windows Service definition)
  • Docker support (9c30916c, 3a853b43)

    • Added application-docker.yml for streamlined Docker deployments behind a reverse proxy
    • Updated Docker Compose logging profile and .env.example for the new docker profile
    • Removed Hibernate dialect and UUID JDBC type overrides that were unnecessary for the Docker profile
  • Build workflow (e90ebd05, 80c395c1, e5f578c3)

    • Enabled Gradle caching in the multi-arch build workflow and removed a redundant clean task from the Buildpacks image build
    • CORS filter now supports allowedOriginPatterns alongside allowedOrigins
    • Externalized server port configuration and removed redundant conditional checks from the workflow

Version 6.0.2

Release Date: June 12, 2026

Features

  • JURYCLOUD-75 — SrApplicationProperties admin UI (a8dace82)
    • New SrApplicationProperties entity with a dedicated sequence, seeded with default data and tenant-specific initialization via Liquibase
    • Read/write service and extended service implementation
    • New admin view (sr-application-properties-admin) under the "Summons Ready" navigation section

Improvements

  • JURYCLOUD-76 — Indexing (8942e5d4)
    • Added indexes for the juror_history and pool_member tables via Liquibase changeset 202606110000002_added_indexes_for_sr.xml

Security

  • JURYCLOUD-77 — Security scan findings (a722844f)
    • Enabled CORS handling on the Vaadin security filter chain and documented why /api/** and /VAADIN/push are exempted from CSRF protection
    • Hardened application.yml, application-prod.yml, and application-cloud.yml security settings
    • Added the v6.0.0 Burp Suite scan report and markdown summary under security-scans/JuryFlex_v6/ for audit traceability

Version 6.0.1

Release Date: June 10, 2026

Changes

  • Added Content-Disposition headers to StreamResource instances in TrialPanelReportsView, DownloadStatewideFileHelper, and SrMessageGrid for consistent file-download behavior across browsers (002f7507)

Version 6.0.0

Release Date: June 2026

Major Infrastructure Upgrades

This release marks a significant platform upgrade across all core framework dependencies. The major version bump reflects breaking changes at the framework level that require coordinated migration steps (see Configuration Changes and JasperReports sections below).

Component Previous Current
Spring Boot 3.5.x 4.0.6
Vaadin 24.x 25.1.5
Hibernate 6.x 7.2.12.Final
Spring Cloud — 2025.1.1
Liquibase Schema Version 3.9 4.6

Additional framework-level changes:

  • VaadinTaskExecutor — new bean introduced in AsyncConfiguration for Vaadin-managed async tasks (f4e2f87c)
  • Lit Templates removed — all Lit/TypeScript frontend component templates converted to pure Java Vaadin Flow views (9628f6fa)
  • Lumo theme — no longer loaded automatically; replaced with explicit CSS imports via vaadin-theme (b6b84e4a)
  • JHipster BOM removed — replaced with standalone utility classes: ApplicationConstants, DefaultProfileUtil, ExceptionHandlingAsyncTaskExecutor, HeaderUtil, JHipsterProperties, LoggingUtils, PaginationUtil, RandomUtil, ResponseUtil, SpringLiquibaseUtil (520ed84a)

JasperReports 7 Migration

Action required for all environments. All 30 report templates have been migrated to JasperReports 7 format. Ensure the extension modules listed below are on the classpath before building.

Template migration (ba49236a): Every .jrxml file in src/main/resources/jasper/ updated to the JR7 XML schema. This affects all 30 templates: summons letters, payroll reports, seating charts, quarterly performance measures, panel records, and more.

Barcode element syntax change (9617b939): The barcode component namespace changed in JR7. Any custom templates maintained outside this repository must be updated:

<!-- Before (JR6 / short form — no longer valid) -->
<jr:Code39 .../>

<!-- After (JR7 — fully qualified barcode4j namespace required) -->
<barcode4j:Code39 .../>

New Gradle extension modules (b9aa615c, 6bf75840) — required for barcode rendering:

implementation 'net.sf.jasperreports:jasperreports-barcode4j:...'   // barcode4j integration
implementation 'net.sf.jasperreports:jasperreports-barbecue:...'    // additional barcode/layout support

Template cleanup (9cf1dad2): removed unused static text elements from several templates to reduce rendering overhead.

Compiled .jasper files are automatically deleted before compileJava by the deleteJasperFiles Gradle task. Never commit .jasper files.


Database

  • PostgreSQL support (e12710b2) — PostgreSQL is now a supported cloud database.
  • Juror file bulk loading via PostgreSQL COPY (e6e0ff78) — native bulk insert for juror_master_stage eliminates entity lifecycle overhead during large DHSMV file loads.

Features

  • JURYCLOUD-70 — Notification System & API Key Authentication (827fefb1, 12a1bfcc, 46c5992c, 10a3843d)

    • SysApiKey entity and admin view for managing API keys per tenant
    • API key authentication resolves to real UserDetails authorities from DomainUserDetailsService
    • Real-time Summons Ready notification bell in the app bar via Vaadin Push
    • SrMessageGrid filter panel; "Include Replied Requests" renamed to "Show Processed Requests"
  • JURYCLOUD-71 — Deny Excusal/Reschedule (a6b473ba)

    • Administrators can now deny a juror's request for excusal or reschedule from the SR message grid
    • Denial reason is stored and surfaced in the reply letter
  • sendSummoned Bulk Messaging (66bb7844)

    • SrMessageService.sendSummoned() sends notifications to all jurors on Summons Ready for a pool
    • Pool creation now automatically triggers summons notifications
    • New summoned.html email template and i18n messages added
  • JurorFileBatchCompleteEvent (3368f2ec)

    • Fires after each DHSMV load completes; triggers automatic non-in-county zip cleanup
  • Juror Notification UI Improvements (74276b16)

    • JurorNotifications: dynamic send-button state and field-level change listeners
    • NotificationBell: tenant context correctly restored on dismissal
    • JurorRequests: fallback to hostname-based tenant resolution when session context is unavailable

Security

  • OAuth2 removed — the Azure AD / OAuth2 client configuration block is removed from application.yml. (050c8545)
  • VaadinSecurityConfiguration refactored — migrated from deprecated WebSecurity configurers to the VaadinSecurityConfigurer API (e646fa4f, 050c8545)
  • API key strict validation — ApiKeyAuthenticationFilter loads real authorities from DomainUserDetailsService and enforces stricter key-owner validation (46c5992c)
  • Circular serialization fixes — @JsonIgnore added to jurorMasters in SysCountyCode and relationships in PaymentMember to prevent serialization stack overflows (88f1ec16, 6d27d234)

UI & Quality Improvements

  • Layout refactoring — pool, panel, and payment views updated with addSeparator() in submenus and consistent flex-based height distribution (c90b7c5a, 18f9e536, a1cf1bb3)
  • Home Page — query performance optimized; layout configuration cleaned up (f92e4e91)
  • SysApplicationPropertiesFormView — missing seal/signature images replaced with placeholder icons; error handling added for save operations (3dcf9c18, 1344723f)
  • Payment card — cleared automatically when employer-paid status changes (639a369f)
  • CheckInJurorsDialog — focus handling improved (917a6cce)
  • Panel Attendance view — refactored and caching corrected (d3554cd3)
  • Pool detail view — responsiveness improvements (cdfe4ae4)
  • Payment creation — optimized to reduce redundant service calls (1a3c00fc)
  • SysStatusType removed — entity, repository, service, and all references deleted (f194324c)
  • RandomMaster — dependencies on PanelMaster and PoolMaster removed to eliminate circular load ordering (6eef55a1)
  • Optional.get() eliminated — replaced throughout with Optional.orElseThrow() for safer null handling (43d161ec)
  • Data Generation Utility — __pycache__/ added to .gitignore for generate_juror_file_stage.py (f064395b)

Configuration Changes

Action required for production deployments. Several properties changed package names or were removed as part of the Spring Boot 4 migration. Review each table below and update application-prod.yml accordingly.

src/main/resources/config/application.yml

Property Before After Notes
spring.jpa.properties.hibernate.batch_versioned_data (absent) true Enables batch updates for versioned entities
spring.jpa.hibernate.naming.implicit-strategy org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy org.springframework.boot.hibernate.SpringImplicitNamingStrategy Package moved in Spring Boot 4
spring.task.scheduling.thread-name-prefix juryflex-scheduling- juryflex-sched- Shortened for log readability
spring.servlet.multipart.max-file-size 65MB 250MB Supports larger juror file uploads
spring.servlet.multipart.max-request-size 65MB 250MB Matches above
jhipster.mail.from jgulisano@gmail.com (hardcoded) ${MAIL_FROM:jgulisano@gmail.com} Now environment-variable driven
spring.security.oauth2.* Azure AD OIDC client block Removed entirely OAuth2 authentication dropped
jhipster.security.oauth2.audience present Removed entirely No longer needed

src/main/resources/config/application-dev.yml

Property Before After Notes
logging.level.ROOT INFO WARN Reduce framework noise in dev logs
logging.level.com.corrus.juryflex INFO DEBUG Full application debug output in dev
spring.datasource.url jdbc:postgresql://rocky-db.corrus.local:5432/devjuryflex jdbc:sqlserver://rocky-db.corrus.local:1433;database=devjuryflex;encrypt=false Switched back to SQL Server for local dev
spring.datasource.username postgres corrus Matches SQL Server credential
server.servlet.session.cookie.* (absent) Added as commented-out block Template for future cookie tuning (same-site, secure, domain)
jobs.deceased-process.cron 0 0/15 * * * * 0 0/59 * * * * Runs less frequently in dev
jobs.juror-file-process.enabled true false Disabled by default in dev
jobs.juror-file-process.cron 0 0/2 * * * * 0 0/59 * * * * Slowed for dev when manually enabled

src/test/resources/config/application.yml

No changes since v5.6.7. Settings remain stable.


Version 5.6.7

Release Date: June 4, 2026

Bug Fixes

  • SrMessageService: Replace orElseThrow() with orElseGet(SysExemptCode::new) on SysExemptCode lookup to prevent NPE when an exempt code does not exist (55054a7)

  • SrMessageGrid: Remove invalid in-memory comparator on the "Excusal Reason" column that caused sort failures when exempt codes were null or empty (55054a7)


Version 5.6.6

Release Date: June 4, 2026

Improvements

  • PoolMemberConversionService – Preload & Deduplication Refactor (55dafda4)
    • Moved excusal data loading to a single upfront query (loadExcusalsForPool()) instead of one database query per juror, significantly reducing database round-trips during conversion
    • Added ROW_NUMBER() OVER (PARTITION BY a.juror_id ORDER BY a.juror_pool_id) to handle duplicate jurors in the same pool (addresses the DeSoto County scenario), ensuring only the first occurrence is processed
    • Moved SysActivityCode lookups into processExcusal() for better encapsulation and reduced unnecessary service calls
    • Replaced raw boolean comparisons with Boolean.TRUE.equals() for null-safe evaluation
    • Reload JurorMaster from the database before updating reschedule dates to prevent stale-data overwrites when a juror is already rescheduled in an earlier pool

Version 5.6.5

Release Date: June 3, 2026

Bug Fixes

  • PoolMemberConversionService – Regression Fix (7733fd63)
    • Fixed operator-precedence bug in the excusal-denied log message where a null check on reason_description was never evaluated due to string concatenation precedence; pre-evaluate the value before embedding it in the message
    • Improved error logging to include jurorId and sourcePool context when excusal processing fails, making failures easier to diagnose

Improvements

  • PoolMemberConversionService: Move SysActivityCode lookups into processExcusal() (from the outer pool loop) to reduce unnecessary service calls (d13f48f0)

Version 5.6.4

Release Date: May 22, 2026

Improvements

  • JURYCLOUD-74: Update pool master conversion query ordering and reduce dev logging verbosity (e6f585b)
    • Updated query in PoolMasterConversionService to order results by reporting_dte_tme ASC, ensuring pools are converted in chronological reporting order

Version 5.6.3

Release Date: May 4, 2026

Improvements

  • JURYCLOUD-72: Optimize database queries and caching for juror and pool member conversions (3f9c02e)
    • Introduced pre-loading of juror and pool member data into in-memory maps to reduce per-record database queries during conversion
    • Added caching for frequently accessed entities in SourceConvertService, PoolMemberConversionService, PanelMemberConversionService, and CivitekSourceConversionService
    • Updated JurorMasterExtendedService with new utility methods for bulk data retrieval and mapping

Version 5.6.2

Release Date: April 22, 2026

Changes

  • JURYCLOUD-68: Show excusal reason in SR message grid (b8d00cd)

    • Added excusal reason column to the SR message grid in SrMessageGrid
    • Updated SrMessageService and SrMessageDTOMapper to populate and map the excusal reason field
    • Adds Liquibase migration 202604150000001_sr_excuse_code.xml
  • PaymentMember: Extend @JsonIgnoreProperties on PaymentMember entity to prevent serialization issues (c3c4a70)


Version 5.6.1

Release Date: April 12, 2026

Major Features

  • JURYCLOUD-61: DHSMV Load Optimization – CRC32-based change detection and batch processing performance improvements

    • Introduces JurorHashUtil to compute CRC32 hashes for juror records; stores juror_hash on both JurorMaster and JurorMasterStage entities
    • Implements hash-based filtering in JurorFileUpdateExtendedService to skip unchanged records during batch updates
    • Adds lightweight ID-only keyset pagination (findTopNIdsAfterId) to advance the batch cursor without loading full entities
    • Adds hash-filtered fetch (findChangedInIdRange) to retrieve only new, changed, or inactive jurors per batch window
    • Introduces deferred batch mode in JurorHistoryExtendedService to buffer history writes and flush at chunk boundaries
    • Implements JurorMasterStageBatchInserter for bulk JDBC inserts into the stage table, eliminating entity lifecycle overhead
    • Pre-fetches juror records to improve DL number change handling and retries deceased processing logic (ae3c4c5)
    • Re-enables juror file stage deletion after hash testing completion (8fc2471)
  • JURYCLOUD-59: Juror Name Change Tracking and Multi-Tenant Admin Views

    • Adds JUROR_NAME_CHANGE (60L) activity constant for auditing juror name changes
    • Updates juror update process to detect name changes, prioritize update actions, and log related history entries
    • Adds "tenant-zero" admin views to monitor juror update history across all tenants
    • Switches data normalization to use nulls for empty fields and refactors code for readability (3b841d0, 1791a119)
  • JURYCLOUD-60: Fix appearance date not passed into ReportRequest for Call-Off Letter (2ed4564)

    • Bumps version from 5.5.10 → 5.5.11

Improvements

  • GL Payment Exports: Migrates GL export mappings from inline JSON to a dedicated database table (a21d3f6)

    • Removes the inline JSON editor from SysApplicationPropertiesFormView
    • Adds Liquibase migration 202603310000001_default_export_donation_mapping.xml
    • Adds row numbering and juror address details to GL export output
    • Fixes donation GL account assignment and vendor mapping in PaymentMemberService
  • Juror Check-In: Renames check-in confirmation properties and introduces an optional second confirmation dialog (0d4b777)

  • Logging – Grafana/Loki Monitoring: Adds Docker Compose stack for log monitoring with Grafana and Loki (aca38bb)

    • Includes Promtail, Loki, and Grafana provisioning configs
    • Adds multi-tenant SQL performance and batch processing dashboards
    • Includes setup scripts and architecture documentation under docker/
  • Bug Fix: Fix juror first name mapping in JurorMasterExtendedService to use VM-provided value instead of incorrect field (f743d80)

Configuration Changes

Note: The following changes apply to application.yml and application-dev.yml. Production environments (application-prod.yml) are unaffected unless otherwise noted.

application.yml

  • Scheduling thread name prefix shortened: juryflex-scheduling- → juryflex-sched- (ce3860e) yaml spring: task: scheduling: thread-name-prefix: juryflex-sched- # was: juryflex-scheduling-
  • Tenant context added to MDC: TenantInterceptor, TenantContext, and TenantAwareTaskDecorator now set/clear a tenant MDC key so the tenant identifier is included in all log output for multi-tenancy traceability (ce3860e)

application-dev.yml

  • Deceased processor retry settings added (ce3860e) yaml deceased: retry: max-attempts: 50 retry-delay: 200 retry-multiplier: 2.0 retry-max-delay: 45000

Version 5.5.10

Release Date: March 4, 2026

Changes

  • Tenant Creation: Add default location to new tenant provisioning
    • Adds a default "Jury Assembly Room" record to the system location codes template used for new tenant provisioning (8db2b2b)
  • Bump version to 5.5.10

Version 5.5.9

Release Date: February 25, 2026

Major Features

  • JURYCLOUD-56: Implements the ability to void one or more panel members from a panel (9ed0131)
    • Introduces priorLastSummonsDt, priorLastServeDt, and priorReschedDt fields to PoolMember to store original juror master dates
    • These fields are set upon pool member creation and during check-in to facilitate state restoration
    • Enhances the undoCheckIn process to accurately restore juror master service dates using the newly introduced prior dates
    • Integrates a dedicated confirmation dialog in the UI to guide users through the voiding process
    • Ensures comprehensive cleanup of related entities, including:
      • Nullifying panel member references in juror history
      • Deleting associated panel member days
      • Updating pool member status
      • Decrementing panel juror counts
    • Adds a new activity constant (JUROR_VOIDED_FROM_PANEL) for auditing this operation
    • Refines the juror history grid to prevent null pointer exceptions when a panel member reference is no longer present
    • Introduces a saveWithoutChecks method in PoolMemberExtendedService for specific transactional requirements

Bug Fixes

  • JURYCLOUD-57: Unable to undo panel removal (25e662a)
    • Fixed issue in PanelMemberExtendedService

Version 5.5.8

Release Date: January 24, 2026

Changes

  • JURYCLOUD-55: Prevent duplicate pool members for DeSoto County in the conversion
  • Bump version to 5.5.8
  • Build v5.5.8

Version 5.5.7

Release Date: January 20, 2026

Changes

  • JURYCLOUD-54: DeSoto County Summons: QR Code
  • Add QR Code support via Barcode4J and ZXing libraries, and bump version to 5.5.7
  • Build v5.5.7

Version 5.5.6

Release Date: January 11, 2026

Changes

  • JURYCLOUD-53: Fixed juror's suffix not being converted in automated load (fe23d3c, 7395b27)
  • Build v5.5.6 (260f1e8)

Version 5.5.5

Release Date: January 6, 2026

Changes

  • JURYCLOUD-53: Fixed juror's suffix not being converted in automated load (7395b27)

Version 5.5.4

Release Date: January 2, 2026

Changes

  • JURYCLOUD-52: Added bvsId field to SysCountyCode, updated bindings and references, and introduced Liquibase migration (f8e90d2)

Version 5.5.3

Release Date: January 2, 2026

Changes

  • JURYCLOUD-51: Fixed DMV Load duplicate history entries (834be01)
  • JURYCLOUD-34: Fixed tenant leak and added payment breakdown (304c0c3)

Version 5.5.2

Release Date: December 22, 2025

Changes

  • JURYCLOUD-50: Update tenant reports on application startup
    • Refactored: Renamed is_system_default to system_default throughout project and updated related references (0e53d50)

Version 5.5.1

Release Date: December 22, 2025

Changes

  • JURYCLOUD-50: Update tenant reports on application startup (4680bb0)

Version 5.5.0

Release Date: December 19, 2025

Major Changes

  • JURYCLOUD-40: Jury Quarterly Report – Quarterly Update

    • Refactored PerformanceMeasuresReport and PerformanceMeasuresMetricRow to QuarterlyPerformanceReport and QuarterlyPerformanceMetricRow
    • Enhanced data model with additional fields for detailed reporting
    • Adjusted Jasper report template for updated metrics
    • Incremented project version to 5.5.0 (5799b3f)
  • JURYCLOUD-41: Article V Performance Measures Report (45eaf1f)

  • JURYCLOUD-43: Adjusted text field width and alignment to prevent DL number truncation in Venire Facias template (eaea73e)

  • JURYCLOUD-46: Pool ID Display Inconsistency

    • Print Juror Summons Refactor: Renamed id to poolNumber in Juror Summons View and updated related bindings and log messages (de0995b)
  • JURYSVC-33: JuryFlex Statewide Grand Jury Export

    • Enhanced EntityGraph in PoolMemberExtendedRepository to include jurorMaster.sysCountyCode
    • Updated StatewideGrandJuryDTOMapper with corrected county and ZIP code assignment logic
    • Renamed execDownload to executeStatewideFileDownload for clarity in DownloadStatewideFileHelper
    • Cleaned up unused imports and redundant logic in PoolReportsFlowView (de9ee98)

Improvements

  • Updated sys_report_artifact insert query to set is_system_default to 1 for new tenant migrations (f602aad)
  • WIP - Concurrent Load (8839a6a)

Version 5.4.3

Release Date: December 2, 2025

Changes

  • Build v5.4.3 (36b8636)

Version 5.4.2

Release Date: December 2, 2025

Changes

  • Removed db/schema name from query (2ed6a03)

Version 5.4.1

Release Date: December 2, 2025

Changes

  • Fixed GitHub Action (621fa0f)

Version 5.4.0

Release Date: November 2025

Required Configuration Changes

Updates are required for two configuration files. These modifications have already been applied to the Development and Test environment.

1. File: application-prod.yml

Action: Add the following properties after the section labeled:

# ===================================================================
# Application specific properties
# Add your own application properties here, see the ApplicationProperties class
# to have type-safe configuration, like in the JHipsterProperties above
#
# More documentation is available at:
# https://www.jhipster.tech/common-application-properties/
# ===================================================================

Action: Add the following section:

# The following properties are used by the DeceasedProcess to determine how often to run.
jobs:
  deceased-process:
    enabled: false
    cron: 0 45 * * * *
    zone: UTC
  juror-file-process:
    enabled: false
    cron: 0 0 * * * *
    zone: UTC

#The following properties are used by the DeceasedProcessor to determine how many tenants to process at a time.
deceased:
  processor:
    parallelism: 1
    queueCapacity: 200
    lock-at-most-for: PT10H
    lock-at-least-for: PT10S

#The following properties are used by the JurorFileProcessor to determine how many tenants to process at a time.
juror-file:
  processor:
    parallelism: 3
    queueCapacity: 200
    lock-at-most-for: PT10H
    lock-at-least-for: PT10S
    update-batch-size: 250 #match with hibernate.jdbc.fetch_size
  retry:
    max-attempts: 50
    retry-delay: 200
    retry-multiplier: 2.0
    retry-max-delay: 45000

2. File: application.yml

Action: Modify the existing properties after the section labeled:

# ===================================================================
# Application specific properties
# Add your own application properties here, see the ApplicationProperties class
# to have type-safe configuration, like in the JHipsterProperties above
#
# More documentation is available at:
# https://www.jhipster.tech/common-application-properties/
# ===================================================================

# application:
juryflex:
  show-test-banner: true
  brand-expression-logo: juryflex_logo_full_color_rgb_247px@72ppi.png
  brand-expression-logo-min: brand-expression-logo-300px.png
  brand-expression-title: JuryFlex
  brand-expression-use-title: false
  brand-expression-appbar-test-logo: testEnvLogoV2.png
  brand-expression-appbar-logo: prodEnvLogo.png
  master-tenant: tenant-zero

Major Features

  • JURYCLOUD-18: Process BVS file (WIP) (cc468cf)
  • JURYCLOUD-10: Automate DHSMV loads (ce0dd6f)
    • Added county_id to tenant master (ce0dd6f)
    • Renamed county if to dhsmv id in staging table (09e1c51)
    • Added additional address lines for future imports (b5c57fa)
    • Fixed dropped city column by mistake (ded37a4)
    • Added debugging output (7c7a7c4)
    • Don't allow duplicate dl_num in file stage (2b4d9d9)
    • Fixed bug in repo delete statement (22f03b5)
    • Removed debug filtering of tenants (81ef70d)
    • Reduced info logging (5f15b05)
    • Cleanup and use param properties (fa13ad4)
    • Final changes to feature (de62682)

GitHub Actions & CI/CD

  • GitHub Action - Create Release (5f8e093)
  • Multiple GitHub Action improvements and fixes (e5cc306, 3c6a0822, 213031b, 18909a9, f5f380d, 1188861, 5724b36, 3027673)
  • Fixed GitHub Action (8552c93)
  • Cleaned up gradle build file (db9b467)
  • Added action comment (68ce933)
  • Renamed action file (d88af10)
  • Allowed action to run on branches (61f5a99)
  • Provided Vaadin License (5853b66)
  • Fixed action script (d262be4)
  • Allowed manual workflow trigger (97b1ee4)
  • Added diagnostic step (6e0fab1)
  • Renamed Vaadin offlinekey (eda6262)
  • Added access token to GH Secrets (2cb607d)
  • Removed arm64 from GitHub Action (d5a6ff2)

Improvements

  • Updated the header logo and cleanup (57da9c2)
  • Added activity code to track BVS excusals (da3c7ea)
  • Configured job to run every 20 minutes (e829da8)
  • Allowed access to management endpoints (2cb607d)

Summary Statistics

Total Releases: 33 releases (5.4.0 through 6.1.1) Release Period: December 2025 - October 2026 Major Features: Spring Boot 4 / Vaadin 25 / Hibernate 7 platform upgrade, JasperReports 7 migration, PostgreSQL support, DHSMV automation, BVS file processing, Quarterly reports, Statewide Grand Jury export, Void Panel Member functionality, CRC32 hash-based juror change detection, GL export mapping migration, Grafana/Loki log monitoring, API key authentication, real-time push notifications, sendSummoned bulk messaging, conversion query optimization and caching, pool member conversion preload and deduplication, SrApplicationProperties admin UI, unified prod/cloud deployment configuration with Docker support, CORS and CSP security hardening, API-based DMV/BVS load processing, additional seating chart layouts, automated MkDocs release-notes site, bundled Liberation Sans report fonts, per-tenant report image library, report text field macros Bug Fixes: 22 major bug fixes (JURYCLOUD-34, 43, 46, 51, 52, 53, 55, 60, 78, 79, 80, 82, 85, 87, 93, 94, 98, 102, 106, panel removal fix, SrMessageService NPE, PoolMemberConversionService regression)