chinmaya samantara created FINERACT-2917:
--------------------------------------------
Summary: Updating meeting attendance changes the wrong meeting and
does not save new attendees
Key: FINERACT-2917
URL: https://issues.apache.org/jira/browse/FINERACT-2917
Project: Apache Fineract
Issue Type: Bug
Reporter: chinmaya samantara
Assignee: chinmaya samantara
Since FINERACT-2548, updating attendance on an existing meeting (POST
/\{entityType}/\{entityId}/meetings/\{meetingId}?command=saveOrUpdateAttendance)
has three problems in MeetingAttendanceWriteServiceImpl. The first one
silently changes attendance on a different meeting.
*1. The wrong meeting is updated*
{code:java}
var meeting = meetingRepository.findById(request.getEntityId())
{code}
{{request.getEntityId()}} is the group or center id from the URL, not the
meeting id ({{{}request.getId(){}}}, set from \{meetingId}). So the update is
applied to whichever meeting has the same id as the group. The legacy code
loaded the meeting by the command's entity id, which was the meeting id.
Steps to reproduce: group 2 has client 5 and three meetings: id 1 (14 Sep), id
2 (07 Sep, client 5 present), id 3 (21 Sep, no attendance). Mark client 5
absent on meeting 3:
{code:json}
POST
/fineract-provider/api/v1/groups/2/meetings/3?command=saveOrUpdateAttendance
{ "meetingAttendance": [ { "clientId": 5, "attendanceType": { "id": 2 } } ] }
{code}
Actual result: HTTP 200 with "entityId": 2. In m_client_attendance, meeting 2
(07 Sep) now has client 5 absent; meeting 3 is unchanged. A meeting id that
doesn't exist (e.g. /groups/2/meetings/999) is also accepted. When no meeting
has the group's id, the error names the wrong id ("Meeting with identifier 10
does not exist" for a request to meeting 4 of group 10).
Expected result: meeting 3 is updated; an unknown meeting id gives 404.
*2. Newly added attendees are not saved*
In updateAttendance(), clients who have no attendance on the meeting yet are
collected in {{result}} and then added with
{{{}clientsAttendance.addAll(result){}}}. That is the local set built from the
request, not the meeting's own set ({{{}meeting.getClientsAttendance(){}}}), so
they are never persisted. The legacy Meeting.updateAttendance() added them to
the meeting's set.
Steps to reproduce: meeting 3 above has no attendance. Because of problem 1, a
URL whose entity id is 3 loads meeting 3:
{code:json}
POST
/fineract-provider/api/v1/centers/3/meetings/999?command=saveOrUpdateAttendance
{ "meetingAttendance": [ { "clientId": 5, "attendanceType": { "id": 1 } } ] }
{code}
Actual result: HTTP 200, and the response reports the change
(changes.clientsAttendance contains client 5), but m_client_attendance has no
row for meeting 3.
Expected result: the attendance row is saved.
*3. The request field was renamed*
The list in MeetingAttendanceUpdateRequest is called meetingAttendance (and is
@Hidden in Swagger). The legacy API, the create request and the response all
use clientsAttendance. A request with clientsAttendance gives HTTP 500 on
develop.
*Possible fix:* load the meeting with request.getId() (404 if not found, and
check it belongs to the entity in the URL); add new attendees to
meeting.getClientsAttendance(); accept clientsAttendance as the field name (or
document meetingAttendance); add tests for updating attendance.
Related: FINERACT-2911 (creating attendance; its fix lets center attendance
updates reach problem 1, so these should be fixed together or close together).
Found on: Fineract develop (7ac7801, local Docker).
MeetingAttendanceWriteServiceImpl is unchanged on develop 8bdbff9 (2026-10-09);
its last change is 912eaf1 (FINERACT-2548).
--
This message was sent by Atlassian Jira
(v8.20.10#820010)