function shouldHadBalance(address who) constant returns (uint256){
        if (isPool(who)) return 0;

        address apAddress = getAssetPoolAddress(who);
        uint256 baseAmount  = getBaseAmount(who);

        
        if( (apAddress == address(0)) || (baseAmount == 0) ) return 0;

        
        AssetPool ap = AssetPool(apAddress);

        uint startLockTime = ap.getStartLockTime();
        uint stopLockTime = ap.getStopLockTime();

        if (block.timestamp > stopLockTime) {
            return 0;
        }

        if (ap.getBaseLockPercent() == 0) {
            return 0;
        }

        
        uint256 baseLockAmount = safeDiv(safeMul(baseAmount, ap.getBaseLockPercent()),100);
        if (block.timestamp < startLockTime) {
            return baseLockAmount;
        }
        
        
        if (ap.getLinearRelease() == 0) {
            if (block.timestamp < stopLockTime) {
                return baseLockAmount;
            } else {
                return 0;
            }
        }
        

        
        if (block.timestamp < startLockTime + perMonthSecond) {
            return baseLockAmount;
        }
        
        uint lockMonth = safeDiv(safeSub(stopLockTime,startLockTime),perMonthSecond);
        if (lockMonth <= 0) {
            if (block.timestamp >= stopLockTime) {
                return 0;
            } else {
                return baseLockAmount;
            }
        }

        
        uint256 monthUnlockAmount = safeDiv(baseLockAmount,lockMonth);

        
        uint hadPassMonth = safeDiv(safeSub(block.timestamp,startLockTime),perMonthSecond);

        return safeSub(baseLockAmount,safeMul(hadPassMonth,monthUnlockAmount));
    }