[ 
https://issues.apache.org/jira/browse/FINERACT-2712?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Adam Saghy reassigned FINERACT-2712:
------------------------------------

    Assignee: Farooq Ayoade

> Bulk-import loan and savings account-opening download templates throw HTTP 
> 500 (IllegalArgumentException: The workbook already contains this name) when 
> two products or two charges share a name
> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: FINERACT-2712
>                 URL: https://issues.apache.org/jira/browse/FINERACT-2712
>             Project: Apache Fineract
>          Issue Type: Bug
>          Components: DataImportTool
>            Reporter: Farooq Ayoade
>            Assignee: Farooq Ayoade
>            Priority: Minor
>
> ---Observed behavior
>   GET /v1/loans/downloadtemplate and GET /v1/savingsaccounts/downloadtemplate 
> return HTTP 500 on a tenant that has two
>   products (or, for loans, two charges) sharing a name:
>   {noformat}
>   java.lang.IllegalArgumentException: The workbook already contains this 
> name: CHARGE_NAME_Processing_fee
>       at org.apache.poi.hssf.usermodel.HSSFName.setNameName(...)
>       at 
> ...populator.loan.LoanWorkbookPopulator.setNames(LoanWorkbookPopulator.java)
>   java.lang.IllegalArgumentException: The workbook already contains this 
> name: Interest_Rate_TARGET_SAVINGS
>       at 
> ...populator.savings.SavingsWorkbookPopulator.setNames(SavingsWorkbookPopulator.java)
>   {noformat}
>   Expected behavior
>   The template downloads successfully (HTTP 200). Each distinct 
> product/charge name contributes its per-product/per-charge
>   defined names once; a repeated name does not add a second, colliding 
> defined name.
>   
>   Steps to reproduce
>   1. Create two loan (or savings) products with the same name, e.g. two 
> products named "TARGET SAVINGS"; or two loan
>   charges named "Processing fee".
>   2. GET 
> /fineract-provider/api/v1/savingsaccounts/downloadtemplate?dateFormat=dd%20MMMM%20yyyy
>  (or /loans/...).
>   3. Observe HTTP 500 with The workbook already contains this name: 
> <PREFIX>_<name>.
>   Root cause
>   
>   LoanWorkbookPopulator.setNames() and SavingsWorkbookPopulator.setNames() 
> build per-product (and, for loans,
>   per-charge) Excel defined names keyed by the product/charge name, without 
> de-duplication:
>   {code:java}
>   for (int i = 0; i < products.size(); i++) {
>       ...
>       String productName = products.get(i).getName()...;
>       setSanitized(interestRateName, "Interest_Rate_" + productName);   // 
> second product with same name -> collision
>       ...
>   }
>   {code}
>   
>   When two products (or charges) resolve to the same defined name, 
> createName().setNameName(...) is called twice with the
>   same name and POI throws IllegalArgumentException: The workbook already 
> contains this name, 500-ing the template. Note
>   that Excel defined names are case-insensitive, so two products whose names 
> differ only in case and/or surrounding
>   whitespace (e.g. Target Savings and TARGET SAVINGS ) also collide. The 
> loan-repayment / transaction templates already
>   got an analogous guard for the per-client account names; the product/charge 
> loops in the opening templates were missed.
>   Proposed fix
>   Track the product/charge names already emitted in a Set<String> and skip a 
> repeated name, so each name's defined-name
>   block is created once (mirrors the existing per-client dedup guard). Key on 
> the sanitised, case-folded name, because
>   Excel defined names are case-insensitive and the raw values may differ only 
> in punctuation/case/whitespace:
>   {code:java}
>   Set<String> seenProductNames = new HashSet<>();
>   for (int i = 0; i < products.size(); i++) {
>       String productName = products.get(i).getName()...;
>       if 
> (!seenProductNames.add(sanitizeName(productName).toUpperCase(Locale.ROOT))) { 
> continue; }
>       ...
>   }
>   {code}



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

Reply via email to