Hi Kapil

I might suggest looking at this as an opportunity to remove the collection
sheet entirely from the Fineract namespace.  It’s a legacy concept I and
others designed a long time ago, originally in 2002 based on collection
sheets we gathered from a dozen countries. It is strongly tied to concepts
in microfinance field operations, and especially when there was no data
connectivity.

It belongs perhaps as a sort of external microservice - data loading via a
bulk import could still be enabled.

The API versioning is a good idea but needs to be more holistic across the
platform I think.



On Mon, Aug 11, 2025 at 4:43 AM Ádám Sághy <adamsa...@gmail.com> wrote:

> Hi Kapil,
>
> Thank you for raising the concerns below. I’ll need some additional
> details to fully understand your points:
>
>    1.
>
>    *Collection Sheet API* – You mentioned it appears non-functional and
>    contains several logical errors.
>    -
>
>       If it’s indeed not working, that’s a separate, high-priority
>       discussion.
>       -
>
>       Could you clarify which logical errors you were referring to, and
>       what specifically makes you think it’s non-functional?
>       2.
>
>    *Service annotations* – You noted that service methods are not
>    annotated with @Service and that beans are defined manually.
>    -
>
>       Are you referring to the
>       CollectionSheetWritePlatformServiceJpaRepositoryImpl bean being
>       defined via configuration?
>       3.
>
>    *Repository wrappers annotated with @Service* – You mentioned that
>    this mandates full unit test coverage but that they should ideally be
>    annotated with @Component.
>    -
>
>       Could you point out the exact classes you had in mind?
>
> As for the other points, I agree we can refactor and remove redundant
> logic—please feel free to suggest specific improvements or start work on
> them immediately!
>
> However, be careful by moving anything into the fineract-core… We are
> aiming to keep it as small as possible as everything is built on top of
> this module! If collection sheet are used for loans and savings - for
> example - than the recommended move is NOT to move this logic into core!
>
> Either:
>
> - we split the logic into fineract-loan and fineract-savings
>
> - Move the logic into a new module
>
> - Leave it in fineract-provider for now
>
>
> Shall you have any questions, please let us know!
>
> Regards,
> Adam
>
>
> On 2025. Aug 11., at 12:09, Kapil Panchal <
> kapil.panchal.developm...@gmail.com> wrote:
>
> Hi Adam,
>
> I’m currently working on *FINERACT-2290* and have a few questions before
> I submit a pull request.
>
> The *Collection Sheet API* in its current state appears non-functional
> and contains several logical errors. It seems there was an earlier attempt
> to convert from a JSON string request parameter to a class-based request
> object, but:
>
> Certain fields are missing.
>
> The serializer is not correctly populating the objects, which causes the
> conditional checks to be bypassed and results in incorrect (false)
> responses.
>
> This change set is *high risk* because it touches most of the loan and
> savings product logic. I’ve had to refactor almost all major methods.
> Extensive integration and end-to-end testing will be required to ensure
> there are no regressions, especially in edge cases. At present, there are
> no unit or integration tests for this functionality, and test creation is
> outside the current ticket scope. I’ve been iterating on this for a while,
> and only today have I reached a stable state after several experimental and
> build-breaking attempts.
>
> *Key Observations:*
>
> Service methods are not annotated with @Service; instead, beans are
> defined manually.
>
> Repository wrappers are annotated with @Service. This mandates full unit
> test coverage for these methods, but they should ideally be annotated with
> @Component.
>
> I agree with prior discussions on separating bean validation — having a
> dedicated @Component validation class allows the request object to handle
> checks independent of database queries.
>
> Validation components can also perform database-related validations; these
> can be injected into service classes for cleaner architecture.
>
> Such validation components should be placed in *Fineract-Core* so they
> are reusable across modules, reducing future refactoring needs.
>
> The current design of having commands in *Fineract-Core* and
> handlers/services/repositories in respective modules is good — it cleanly
> decouples command definition from execution.
>
> There is extensive use of this. in singleton contexts (API, Service,
> Repository). While not harmful, it’s unnecessary boilerplate.
>
> Multiple redundant intermediate DTOs exist where the request DTO itself
> could be reused for data transfer.
>
> I found redundant logic — e.g., a for loop with a break statement that
> effectively executes only once; this can be simplified.
>
> Some JDBC template queries use reserved SQL keywords, causing exceptions.
> Refactoring these queries resolves the issue and returns proper response
> objects.
>
> *Suggestions:*
>
> *Where appropriate, large tickets should be broken into subtasks to manage
> complexity and reviewability.*
>
> It may help to have a dedicated *developer-only Slack channel *for
> technical discussions. This could complement other community spaces if
> there’s a need to keep certain conversations more focused.
>
> What are your thoughts on the above?
>
> Thanks,
> Kapil
>
>
>

Reply via email to