feat(election): committee meeting module — schedule, online/offline mode, soft delete, audit logging

- CommitteeMeeting entity, enums (ONLINE/OFFLINE mode, SCHEDULED/COMPLETED/CANCELLED status), repository with soft delete filter
- CommitteeMeetingService + Impl: schedule, update, patchStatus, soft delete, retrieveByCommittee
- CommitteeMeetingApiResource: REST endpoints at /v1/election/committee-meetings with full audit logging
- ElectionAuditAction: add SCHEDULE_MEETING, UPDATE_MEETING, CANCEL_MEETING, COMPLETE_MEETING, DELETE_MEETING + FAILED variants
- CommitteeService: expose getElectionIdForCommittee() for audit context
- Liquibase 0351: create m_election_committee_meeting table with is_deleted soft delete column
- Liquibase 0352: rename created_date/last_modified_date → created_on_utc/last_modified_on_utc to match EclipseLink base class mapping

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Jaanu423
2026-07-06 10:16:20 +05:30
co-authored by Claude Sonnet 4.6
parent a1a31aff25
commit e72b9359c1
15 changed files with 579 additions and 1 deletions
@@ -378,4 +378,6 @@
<include file="parts/0348_election_config_duration_years.xml" relativeToChangelogFile="true"/>
<include file="parts/0349_election_committee.xml" relativeToChangelogFile="true"/>
<include file="parts/0350_committee_image.xml" relativeToChangelogFile="true"/>
<include file="parts/0351_committee_meeting.xml" relativeToChangelogFile="true"/>
<include file="parts/0352_committee_meeting_rename_audit_cols.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>
@@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.1.xsd">
<changeSet id="0351-committee-meeting" author="CBS">
<preConditions onFail="MARK_RAN">
<not><tableExists tableName="m_election_committee_meeting"/></not>
</preConditions>
<createTable tableName="m_election_committee_meeting">
<column name="id" type="BIGSERIAL">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="committee_id" type="BIGINT">
<constraints nullable="false"/>
</column>
<column name="title" type="VARCHAR(200)">
<constraints nullable="false"/>
</column>
<column name="meeting_date" type="DATE">
<constraints nullable="false"/>
</column>
<column name="meeting_time" type="VARCHAR(10)"/>
<column name="mode" type="VARCHAR(20)">
<constraints nullable="false"/>
</column>
<column name="status" type="VARCHAR(20)" defaultValue="SCHEDULED">
<constraints nullable="false"/>
</column>
<column name="agenda" type="TEXT"/>
<!-- Online fields -->
<column name="platform" type="VARCHAR(50)"/>
<column name="meeting_link" type="VARCHAR(500)"/>
<column name="meeting_id_ref" type="VARCHAR(100)"/>
<column name="meeting_password" type="VARCHAR(100)"/>
<!-- Offline fields -->
<column name="venue" type="VARCHAR(200)"/>
<column name="address" type="TEXT"/>
<column name="city" type="VARCHAR(100)"/>
<!-- Soft delete -->
<column name="is_deleted" type="BOOLEAN" defaultValueBoolean="false">
<constraints nullable="false"/>
</column>
<!-- Audit -->
<column name="created_by" type="BIGINT"/>
<column name="created_date" type="TIMESTAMP"/>
<column name="last_modified_by" type="BIGINT"/>
<column name="last_modified_date" type="TIMESTAMP"/>
</createTable>
<addForeignKeyConstraint
baseTableName="m_election_committee_meeting"
baseColumnNames="committee_id"
referencedTableName="m_election_committee"
referencedColumnNames="id"
constraintName="fk_committee_meeting_committee"/>
<createIndex tableName="m_election_committee_meeting" indexName="idx_committee_meeting_committee_date">
<column name="committee_id"/>
<column name="meeting_date" descending="true"/>
</createIndex>
</changeSet>
</databaseChangeLog>
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.1.xsd">
<changeSet id="0352-committee-meeting-rename-created-date" author="CBS">
<preConditions onFail="MARK_RAN">
<columnExists tableName="m_election_committee_meeting" columnName="created_date"/>
</preConditions>
<renameColumn tableName="m_election_committee_meeting"
oldColumnName="created_date"
newColumnName="created_on_utc"
columnDataType="TIMESTAMP"/>
</changeSet>
<changeSet id="0352-committee-meeting-rename-modified-date" author="CBS">
<preConditions onFail="MARK_RAN">
<columnExists tableName="m_election_committee_meeting" columnName="last_modified_date"/>
</preConditions>
<renameColumn tableName="m_election_committee_meeting"
oldColumnName="last_modified_date"
newColumnName="last_modified_on_utc"
columnDataType="TIMESTAMP"/>
</changeSet>
</databaseChangeLog>