[ 
https://issues.apache.org/jira/browse/FINERACT-1684?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17783540#comment-17783540
 ] 

John Ruhiu commented on FINERACT-1684:
--------------------------------------

[~adamsaghy] this is incredible. Is there functional documentation(user manual) 
for this feature I can use to test this feature?

> Introduce Business date concept
> -------------------------------
>
>                 Key: FINERACT-1684
>                 URL: https://issues.apache.org/jira/browse/FINERACT-1684
>             Project: Apache Fineract
>          Issue Type: Improvement
>            Reporter: Adam Saghy
>            Assignee: Adam Saghy
>            Priority: Major
>             Fix For: 1.8.0
>
>         Attachments: image-2022-08-09-10-53-39-750.png
>
>
> h1. Introducing Business Date into Fineract - Community version
> Business date as a concept does not exist as of now in Fineract. It would be 
> business critical to add such a functionality to support various banking 
> functionalities like “Closing of Business day”, “Having Closing of Business 
> day relevant jobs”, “Supporting logical date management”.
> h2. Glossary
> |*COB|Close of Business; concept of closing a business day|
> |*Business day|Timeframe that logically group together actions on a 
> particular business date|
> |*Business date|Logical date; its value is not tied to the physical calendar. 
> Represents a business day|
> |*Cob date|Logical date; Represents the business date for actions during COB 
> job execution|
> |*Created date|When the transaction was created (audit purposes). Date + time|
> |*Last modified date|When the transaction was last modified (audit purposes). 
> Date + time|
> |*Submitted on date / Posting date|When the transaction was posted. Tenant 
> date or business date (depends on whether the logical date concept was 
> introduced or not)|
> |*Transaction date / Value date|The date on which the transaction occurred or 
> to be accounted for|
> h2. Current behaviour
>  * Fineract support 3 types of dates:
>  ** System date
>  *** Physical/System date of the running environment
>  * 
>  ** Tenant date
>  *** Timezoned version of the above system date
>  * 
>  ** User-provided date
>  *** Based on the provided date (as string) and the provided date format
>  * There is no support of logical date concept
>  ** Independent from the system / tenant date
>  * Jobs are scheduled against system date (CRON), but aligned with the tenant 
> timezone.
>  * During the job execution all the data and transactions are using the 
> actual tenant date
>  ** It could happen some transactions are written for 17th of May and other 
> for 18th of May, if the job was executed around midnight
>  * There is no support of COB
>  ** No backdated transactions by jobs
>  * 
>  ** There is no support to logically group together transactions and store 
> them with the same transaction date which is independent of the physical 
> calendar of the tenant
> All the transactions and business logic are tied to a physical calendar
> h2. Business date
> !image-2022-08-09-10-53-39-750.png!
> h3. Design
> By introducing the business day concept we are not tied anymore to the 
> physical calendar of the system or the tenant. We got the ability to define 
> our own business day boundaries which might end 15 minutes before midnight 
> and any incoming transactions after the cutoff will be accounted for the 
> following business day.
> It is a logical date which makes it possible to separate the business day 
> from the physical calendar:
>  * Close a business day before midnight
>  * Close a business day at midnight
>  * Close a business day after midnight
> Closing a Business Day could be a longer process (see COB jobs) meanwhile 
> some processes shall still be able to create transactions for that business 
> day (COB jobs), but others are meant to create the transactions for the next 
> (incoming transactions): Business date concept is there to sort that out.
> Business date concept is essential when:
>  * Having COB jobs:
>  ** When the COB was triggered:
>  *** All the jobs which processing the data must still accounted for actual 
> business day
>  * 
>  ** 
>  *** All the incoming transactions must be accounted to the next business day
>  * Business day is ending before / after midnight (tenant date / system date)
>  * Testing purposes:
>  ** Since the transactions and job execution is not tied anymore to a 
> physical calendar, we can easily test a whole loan lifecycle by altering the 
> business date
>  * Handling disruption of service: For any unseen reason the system goes down 
> or there are any disruption in the workflow, the “missed days” can easily be 
> processed one by one as nothing happened
>  ** There is a disruption at 2022-06-02
>  * 
>  ** The issue is fixed by 2022-06-05
>  * 
>  ** The COB flow can be executed for 2022-06-03 and when it is finished for 
> 2022-06-04 and after when the time arrives for 2022-06-05
>  * This logical date is manageable via:
>  ** Job
>  * 
>  ** API
> To maintain such separation from physical calendar we need to introduce the 
> following new dates:
>  * Business date
>  * COB date
>  ** Can be calculated based on the actual business date
>  *** Depend on COB date strategy (see below)
> h3.  
> h3. Business date
> The - logical - date of the actual business day, eg: 2022-05-06
>  * It does not support time parts
>  * It can be managed manually (via API call) or automatically (via scheduled 
> job)
>  * All business actions during the business day shall use this date:
>  ** Posting / submitted on date of transactions
>  * 
>  ** Submitted on date of actions
>  * 
>  ** (Regular) jobs
>  * It will be used in every situation where the transaction date / value date 
> is not provided by the user or the user provided date shall be validated.
>  ** Opening date
>  * 
>  ** Closing date
>  * 
>  ** Disbursal date
>  * 
>  ** Transaction/Value date
>  * 
>  ** Posting/Submitted date
>  * 
>  ** Reversal date
>  * Will not be use for audit purposes:
>  ** Created on date
>  * 
>  ** Updated on date
> *COB date*
> The - logical - date of the business day for job execution, eg: 2022-05-05
>  * It can be calculated based on the the business date
>  ** COB date = business date - 1 day
>  * 
>  ** Automatically modified alongside with the business date change
>  * It does not support time parts
>  * It is automatically managed by business date change
>  ** Configurable
>  * It is used only via COB job execution
>  ** When we create / modify any business data during the COB job execution, 
> the COB date is to be used:
>  *** Posting date of transactions
>  * 
>  ** 
>  *** Submitted on date of actions
>  * 
>  ** 
>  *** Transaction / value date of any actions
> *Some basic example*
> h4. Apply for a loan
> h5. #1
> Tenant date: 2022-05-23 14:22:12
> Business date: 2022-05-22
> Submitted on date: 2022-05-23
> Outcome: *FAIL*
> Message: *The date on which a loan is submitted cannot be in the future.*
> Reason: Even the tenant date is 2022-05-23, but the business date was 
> 2022-05-22 which means anything further that date must be considered as a 
> future date.
> h5. #2
> Tenant date: 2022-05-23 14:22:12
> Business date: 2022-05-22
> Submitted on date: 2022-05-22
> Outcome: *SUCCESS*
> Loan application details:
>  * Submitted on date: 2022-05-22
> *Repayment for a loan*
> h5. #1
> Tenant date: 2022-05-25 11:22:12
> Business date: 2022-05-24
> Transaction date: 2022-05-25
> Outcome: *FAIL*
> Message: *The transaction date cannot be in the future.*
> Reason: Even the physical date is 2022-05-25, but the business date was 
> 2022-05-24 which means anything further that date must be considered as a 
> future date.
> h5. #2
> Tenant date: 2022-05-25 11:22:12
> Business date: 2022-05-24
> Transaction date: 2022-05-23
> Outcome: *SUCCESS*
> Loan transaction details:
>  * Submitted on date: 2022-05-24
>  * Transaction date: 2022-05-23
>  * Created on date: 2022-05-25 11:22:12
> *Changes in Fineract*
> We shall modify at all the relevant places where the tenant date was used:
>  * With very limited exceptions all places where the tenant date is used we 
> need to modify to use the business date.
>  * Replace system date with tenant date or business date (exceptions may 
> apply)
>  * Add missing Value dates and Posting dates to entities
>  * Having a generic naming conventions for JPA fields and DB fields
>  * Renaming the fields accordingly
>  * Evaluate value date (transaction date) and posting date (submitted on 
> date), created on date usages
>  * Jobs to be checked and modified accordingly
>  * Native queries to be checked and modified accordingly
>  * Reports to be checked and modified accordingly
>  * Every table where update is supported the AbstractAuditableCustom should 
> be implemented
>  * Amend Transactions and Journal entries date handling to fit for business 
> date concept
>  * For audit fields we shall introduce timezoned datetimes and store them in 
> database accordingly
>  ** Storing DATETIME fields without Timezone is potential problem due to the 
> daylight savings
>  * 
>  ** Also some external libs (like Quartz) are using system timezone and 
> Fineract will using Tenant timezone for audit fields. To be able to distinct 
> them in DB we shall use DATETIME with TIMESTAMP column types and use 
> timezoned java time objects in the application



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to