{
  "iface": "futoin.xfer.accounts",
  "version": "1.0",
  "ftn3rev": "1.7",
  "imports": [
    "futoin.ping:1.0",
    "futoin.xfer.types:1.0"
  ],
  "types": {
    "AccountType": {
      "type": "enum",
      "items": [
        "System",
        "Regular",
        "Transit",
        "External",
        "Bonus"
      ]
    },
    "RelatedAccountID": [
      "AccountID",
      "boolean"
    ],
    "AccountHolderData": {
      "type": "map"
    },
    "AccountHolderInternalData": {
      "type": "map"
    },
    "AccountHolderInfo": {
      "type": "map",
      "fields": {
        "id": "AccountHolderID",
        "ext_id": "AccountHolderExternalID",
        "group": "LimitGroup",
        "enabled": "boolean",
        "kyc": "boolean",
        "data": "AccountHolderData",
        "internal": "AccountHolderInternalData",
        "created": "XferTimestamp",
        "updated": "XferTimestamp"
      }
    },
    "AccountInfo": {
      "type": "map",
      "fields": {
        "id": "AccountID",
        "holder": "AccountHolderID",
        "type": "AccountType",
        "currency": "CurrencyCode",
        "alias": "AccountAlias",
        "enabled": "boolean",
        "balance": "Balance",
        "reserved": "Amount",
        "overdraft": "Amount",
        "ext_id": {
          "type": "AccountExternalID",
          "optional": true
        },
        "rel_id": {
          "type": "RelatedAccountID",
          "optional": true
        },
        "created": "XferTimestamp",
        "updated": "XferTimestamp"
      }
    },
    "AccountInfoList": {
      "type": "array",
      "elemtype": "AccountInfo"
    }
  },
  "funcs": {
    "addAccount": {
      "params": {
        "holder": "AccountID",
        "type": "AccountType",
        "currency": "CurrencyCode",
        "alias": "AccountAlias",
        "enabled": {
          "type": "boolean",
          "default": true
        },
        "ext_id": {
          "type": "AccountExternalID",
          "default": null
        },
        "rel_id": {
          "type": "RelatedAccountID",
          "default": null
        }
      },
      "result": "AccountExternalID",
      "throws": [
        "UnknownHolderID",
        "UnknownCurrency",
        "Duplicate"
      ]
    },
    "updateAccount": {
      "params": {
        "id": "AccountID",
        "alias": {
          "type": "AccountAlias",
          "default": null
        },
        "enabled": {
          "type": "boolean",
          "default": null
        }
      },
      "result": "boolean",
      "throws": [
        "UnknownAccountID",
        "Duplicate"
      ]
    },
    "setOverdraft": {
      "params": {
        "id": "AccountID",
        "currency": "CurrencyCode",
        "overdraft": "Amount"
      },
      "result": "boolean",
      "throws": [
        "UnknownAccountID",
        "CurrencyMismatch"
      ]
    },
    "getAccount": {
      "params": {
        "id": "AccountID"
      },
      "result": "AccountInfo",
      "throws": [
        "UnknownAccountID"
      ]
    },
    "getAccountExt": {
      "params": {
        "holder": "AccountID",
        "ext_id": "AccountExternalID"
      },
      "result": "AccountInfo",
      "throws": [
        "UnknownAccountID"
      ]
    },
    "listAccounts": {
      "params": {
        "holder": "AccountHolderID"
      },
      "result": "AccountInfoList",
      "throws": [
        "UnknownHolderID"
      ]
    },
    "convertAccount": {
      "params": {
        "id": "AccountID",
        "currency": "CurrencyCode"
      },
      "result": "boolean",
      "throws": [
        "UnknownHolderID",
        "UnknownCurrency"
      ],
      "desc": "For rare cases when some currency needs to be disabled"
    },
    "addAccountHolder": {
      "params": {
        "ext_id": "AccountHolderExternalID",
        "group": "LimitGroup",
        "enabled": "boolean",
        "kyc": "boolean",
        "data": "AccountHolderData",
        "internal": "AccountHolderInternalData"
      },
      "result": "AccountHolderID",
      "throws": [
        "UnknownLimitGroup",
        "DuplicateExtID"
      ]
    },
    "updateAccountHolder": {
      "params": {
        "id": "AccountHolderID",
        "group": {
          "type": "LimitGroup",
          "default": null
        },
        "enabled": {
          "type": "boolean",
          "default": null
        },
        "kyc": {
          "type": "boolean",
          "default": null
        },
        "data": {
          "type": "AccountHolderData",
          "default": null
        },
        "internal": {
          "type": "AccountHolderInternalData",
          "default": null
        }
      },
      "result": "boolean",
      "throws": [
        "UnknownHolderID",
        "UnknownLimitGroup"
      ]
    },
    "getAccountHolder": {
      "params": {
        "id": "AccountHolderID"
      },
      "result": "AccountHolderInfo",
      "throws": [
        "UnknownHolderID"
      ]
    },
    "getAccountHolderExt": {
      "params": {
        "ext_id": "AccountHolderExternalID"
      },
      "result": "AccountHolderInfo",
      "throws": [
        "UnknownHolderID"
      ]
    },
    "mergeAccountHolders": {
      "params": {
        "id": "AccountHolderID",
        "other_id": "AccountHolderID"
      },
      "result": "boolean",
      "throws": [
        "UnknownHolderID"
      ]
    },
    "getLimitStats": {
      "params": {
        "holder": "AccountHolderID",
        "domain": "LimitDomain"
      },
      "result": {
        "currency": "CurrencyCode",
        "stats": "LimitValues"
      },
      "throws": [
        "UnknownHolderID"
      ]
    }
  },
  "requires": [
    "SecureChannel"
  ]
}