Search code examples
muledataweavemule-esbmulesoftmule4

dataweave2.0 transformation in mule 4 based on conditions


I've to write some transformation and calculation based on condition like count of cash/dd/cheque receipt and sum of cash/dd/cheque in the summary array. I've defined my input array and based on that i'm expecting the output that I've defined. Help me to complete the dataweave for that.\

Code:

    %dw 2.0
    output application/json
    ---
    {
      receipt: payload map ( payload01 , indexOfPayload01 ) -> {
      receiptId: payload01.receiptId,
      amountCollected: payload01.amountCollected,
      paymentMode: payload01.paymentMode,
    },
      summary: {
      TotalamountCollected: payload.*amountCollected reduce ((val, acc=0) -> acc + val)
      }
   }

input:

[{
    "receiptId": 11000134453,
    "amountCollected": 11,
    "paymentMode": "Cash"
}, {
    "receiptId": 1105444723,
    "amountCollected": 12,
    "paymentMode": "Cheque"
}, {
    "receiptId": 1143434763,
    "amountCollected": 13,
    "paymentMode": "DD"
},{
    "receiptId": 11000134457,
    "amountCollected": 14,
    "paymentMode": "Cash"
}, {
    "receiptId": 1105444728,
    "amountCollected": 15,
    "paymentMode": "Cheque"
}, {
    "receiptId": 1143434769,
    "amountCollected": 16,
    "paymentMode": "DD"
}]

output:

{
    "summary": {
        "TotalamountCollected": 81,
        "cashRecepit": 2,
        "cashRecepitAmount": 25,
        "chequeRecepit": 2,
        "chequeRecepitAmount": 27,
        "ddRecepit": 2,
        "ddRecepitAmount": 29
    },
    "receipt": [{
        "receiptId": 11000134453,
        "amountCollected": 11,
        "paymentMode": "Cash"
    }, {
        "receiptId": 1105444723,
        "amountCollected": 12,
        "paymentMode": "Cheque"
    }, {
        "receiptId": 1143434763,
        "amountCollected": 13,
        "paymentMode": "DD"
    },{
        "receiptId": 11000134457,
        "amountCollected": 14,
        "paymentMode": "Cash"
    }, {
        "receiptId": 1105444728,
        "amountCollected": 15,
        "paymentMode": "Cheque"
    }, {
        "receiptId": 1143434769,
        "amountCollected": 16,
        "paymentMode": "DD"
    }]
}

Help me to complete the dataweave for that.


Solution

  • Here is a solution that involves one iteration over the input. I'm curious if anyone has any cleaner solutions.

    %dw 2.0
    output application/json
    
    var inputVar =
        [{
            "receiptId": 11000134453,
            "amountCollected": 11,
            "paymentMode": "Cash"
        }, {
            "receiptId": 1105444723,
            "amountCollected": 12,
            "paymentMode": "Cheque"
        }, {
            "receiptId": 1143434763,
            "amountCollected": 13,
            "paymentMode": "DD"
        },{
            "receiptId": 11000134457,
            "amountCollected": 14,
            "paymentMode": "Cash"
        }, {
            "receiptId": 1105444728,
            "amountCollected": 15,
            "paymentMode": "Cheque"
        }, {
            "receiptId": 1143434769,
            "amountCollected": 16,
            "paymentMode": "DD"
        }]
    
    var init =     
        {
            "TotalamountCollected": 0,
            "cashRecepit": 0,
            "cashRecepitAmount": 0,
            "chequeRecepit": 0,
            "chequeRecepitAmount": 0,
            "ddRecepit": 0,
            "ddRecepitAmount": 0
        }
    
    fun calcModeAmmount(acc, isTargetedMode, addend) = acc + if(isTargetedMode) addend else 0
    
    fun summary() = inputVar reduce(item, acc=init) ->
        {
            "TotalamountCollected": acc.TotalamountCollected + item.amountCollected,
            "cashRecepit": calcModeAmmount(acc.cashRecepit, item.paymentMode == "Cash", 1),
            "cashRecepitAmount": calcModeAmmount(acc.cashRecepitAmount, item.paymentMode == "Cash", item.amountCollected),
            "chequeRecepit": calcModeAmmount(acc.chequeRecepit, item.paymentMode == "Cheque", 1),
            "chequeRecepitAmount": calcModeAmmount(acc.chequeRecepitAmount, item.paymentMode == "Cheque", item.amountCollected),
            "ddRecepit": calcModeAmmount(acc.ddRecepit, item.paymentMode == "DD", 1),
            "ddRecepitAmount": calcModeAmmount(acc.ddRecepitAmount, item.paymentMode == "DD", item.amountCollected)
        }
    ---
    {
        summary:summary(),
        receipt:inputVar
    }