From 21a0db6a9ca339b7456f0dd786897f162f4b8e9c Mon Sep 17 00:00:00 2001 From: sairajzero Date: Sat, 1 Aug 2020 05:03:26 +0530 Subject: [PATCH] v0.4 - adding fetch for realTime unitValue - fixed minor bugs --- floBank.html | 200 +++++++++++++++++++++++++++++---------------------- 1 file changed, 116 insertions(+), 84 deletions(-) diff --git a/floBank.html b/floBank.html index 9f940ba..7a52283 100644 --- a/floBank.html +++ b/floBank.html @@ -8853,7 +8853,52 @@ Bitcoin.Util = { } }); this.requests = requests; - } + }, + + refreshNetUnitValues() { + return new Promise((resolve, reject) => { + + if(typeof this.unitValues !== "object") + this.unitValues = {}; + + //fetch API call function + const fetchValue = function(type){ + return new Promise((res, rej) => { + let c = floGlobals.collaterals[c] + fetch(c.url).then(response => { + if(response.ok){ + response.json().then(data => { + let value; + if(!c.path) + value = data; + else if(Array.isArray(c.path)){ + value = data; + for(p of path) + value = value[p]; + } else + value = data[path]; + if(c.multiplier) + value *= c.multiplier; + this.unitValues[type] = value; + resolve({[type]: value}) + }); + } else + throw Error("Response Not Valid") + }).catch(error => { + this.unitValues[type] = NaN; + resolve({[type]: error}) + }) + }) + } + + let promises = []; + for(let c in floGlobals.collaterals) + promises.push(fetchValue(c)) + Promise.all(promises) + .then(results => resolve(Object.assign({}, ...results))) + .catch(error => reject(error)) + }) + }, }, refreshAppData() { @@ -8907,14 +8952,6 @@ Bitcoin.Util = { return Object.keys(floGlobals.collaterals) }, - getCollateralNetUnitValue(type) { - return new Promise((resolve, reject) => { - //fetch API calls - //resolve the net unit value - //reject if any error - }) - }, - viewRequests(processID = null) { if (!processID) return this.util.requests; @@ -9262,6 +9299,74 @@ Bitcoin.Util = { }) }, + checkCollateralEligibility(floID, collateralIndex, loanAmount) { + return new Promise((resolve, reject) => { + let col; + try { + col = floGlobals.appObjects["collaterals"][floID][collateralIndex]; + } catch (error) { + return reject("Account doesnot own any collateral") + } + if (!col) + return reject("Collateral Not Found!") + else if (col.status !== "ACTIVE") + return reject(`Collateral is not Active! (current status: ${col.status})`) + else if (col.loanRefs && col.loanRefs.length) { + let loans = col.loanRefs.map(i => floGlobals.appObjects.bank["loans"][floID][ + i + ]) + let totalLoanAmt = 0 + loans.forEach(l => totalLoanAmt += l.amount) + let netVal = this.util.unitValues[col.type]; + let loanThreshold = floGlobals.policy["loanRatio"] * col.units * netVal; + if (totalLoanAmt >= loanThreshold) + return reject("Collateral threshold already exceeded") + let tmpAmt = loanAmount + totalLoanAmt; + if (tmpAmt >= loanThreshold) + return reject("Collateral doesnot have enough NET value") + resolve("Collateral eligible for loan") + } else + resolve("Collateral eligible for loan") + }) + }, + + + isCollateralOverflow(floID, index) { + if (!col.loanRefs.length) + return false + let col = floGlobals.appObjects["collaterals"][floID][index]; + let loanThreshold = floGlobals.policy["loanRatio"] * col.units * this.util.unitValues[col.type]; + let loans = col.loanRefs.map(i => floGlobals.appObjects.bank["loans"][floID][i]) + let totalLoanAmt = 0; + loans.forEach(l => totalLoanAmt += l.amount) + if (totalLoanAmt >= loanThreshold) + return true; + else + return false; + }, + + viewCollateralOverflows(floIDs = null) { + if (!floIDs) + floIDs = Object.keys(floGlobals.appObjects["collaterals"]) + else if (floCrypto.validateAddr(floIDs)) + floIDs = [floIDs] + else if (!Array.isArray(floIDs)) + throw Error("Invalid parameters: Parameters must be floID or array of floIDs"); + let overflows = {} + floIDs.forEach(f => { + if (f in floGlobals.appObjects["collaterals"]) { + overflows[f] = [] + for (let i in floGlobals.appObjects["collaterals"][f]) { + if (this.isCollateralOverflow(f, i)) + overflows[f].push(floGlobals.appObjects["collaterals"][f][i]) + } + if (!overflows[f].length) + delete overflows[f] + } + }) + return overflows; + }, + //Banker only functions (subAdmins only) banker: { @@ -9307,38 +9412,7 @@ Bitcoin.Util = { floGlobals.appObjects.bank["deposits"][floID][index].status = "CLOSED"; return floCloudAPI.updateObjectData("bank") }, - - checkCollateralEligibility(floID, collateralIndex, loanAmount) { - return new Promise((resolve, reject) => { - let collateral; - try { - collateral = floGlobals.appObjects["collaterals"][floID][collateralIndex]; - } catch (error) { - return reject("Account doesnot own any collateral") - } - if (!collateral) - return reject("Collateral Not Found!") - else if (collateral.status !== "ACTIVE") - return reject(`Collateral is not Active! (current status: ${collateral.status})`) - else if (collateral.loanRefs && collateral.loanRefs.length) { - let loans = collateral.loanRefs.map(i => floGlobals.appObjects.bank["loans"][floID][ - i - ]) - let totalLoanAmt = 0 - loans.forEach(l => totalLoanAmt += l.amount) - let netVal = this.collateralNetUnitValues[collateral.type]; - let loanThreshold = floGlobals.policy["loanRatio"] * collateral.units * netVal; - if (totalLoanAmt >= loanThreshold) - return reject("Collateral threshold already exceeded") - let tmpAmt = loanAmount + totalLoanAmt; - if (tmpAmt >= loanThreshold) - return reject("Collateral doesnot have enough NET value") - resolve("Collateral eligible for loan") - } else - resolve("Collateral eligible for loan") - }) - }, - + openNewLoan(floID, amount, period, interest, collateralIndex, paymentRefID) { let loanDetails = { amount: amount, @@ -9402,49 +9476,7 @@ Bitcoin.Util = { floGlobals.appObjects.bank["collaterals"][floID][index].closing.timestamp = Date.now(); floGlobals.appObjects.bank["collaterals"][floID][index].status = "CLOSED"; return floCloudAPI.updateObjectData("bank") - }, - - isCollateralOverflow(floID, index, netUnitValues) { - if (!collateral.loanRefs.length) - return false - let collateral = floGlobals.appObjects["collaterals"][floID][index]; - let loanThreshold = floGlobals.policy["loanRatio"] * collateral.units * netUnitValues[collateral - .type]; - let loans = collateral.loanRefs.map(i => floGlobals.appObjects.bank["loans"][floID][i]) - let totalLoanAmt = 0 - loans.forEach(l => totalLoanAmt += l.amount) - if (totalLoanAmt >= loanThreshold) - return true; - else - return false; - }, - - viewCollateralOverflows(floIDs = null) { - return new Promise((resolve, reject) => { - if (!floIDs) - floIDs = Object.keys(floGlobals.appObjects["collaterals"]) - else if (floCrypto.validateAddr(floIDs)) - floIDs = [floIDs] - else if (!Array.isArray(floIDs)) - return reject( - "Invalid parameters: Parameters must be valid floID or array of floIDs") - let overflows = {} - floIDs.forEach(floID => { - if (floID in floGlobals.appObjects["collaterals"]) { - overflows[floID] = [] - for (let i in floGlobals.appObjects["collaterals"][floID].length) { - if (this.isCollateralOverflow(floID, i, netUnitValues)) - overflows[floID].push(floGlobals.appObjects["collaterals"][ - floID - ][i]) - } - if (!overflows[floID].length) - delete overflows[floID] - } - }) - resolve(overflows) - }) - } + } } }