﻿AG.Data.Bond = {
    GetBidingSchedule: function (startIndex, endIndex) {
        var order = [{ Field: 'AuctionDate', Direction: 'DESC'}];
        var filter = [];
//        filter.push({ Field: 'ParValue', Type: 'Static', Operator: '>', Value: ' 0' });
        var requestName = 'Schedule' + '_' + startIndex + '_' + endIndex;
        return AG.ClientAPI.createData(BondBiding, requestName, [{ StartIndex: startIndex }, { EndIndex: endIndex}], { static: ['Id', 'FullNameOfIssuer', 'ParValue', 'AuctionDate', 'Amount', 'Term', 'IssueDate', 'MaturityDate'] }, order, filter);
        order = null, requestName = null; filter = null;
    },
    GetCountBidingSchedule: function () {
        var filter = [];
//        filter.push({ Field: 'ParValue', Type: 'Static', Operator: '>', Value: ' 0' });
        return BondBiding.getCount([], undefined, undefined, filter);
        filter = null;
    },
    GetBidingResult: function (startDate, endDate, startIndex, endIndex, orderBy, orderType) {

        var order = [], data = [];
        if (typeof (orderBy) != "undefined")
            order = [{ Field: orderBy, Direction: 'ASC'}];
        else
            order = [{ Field: 'ID', Direction: 'ASC'}];
        if (typeof (orderType) != "undefined") {
            order[0].Direction = orderType;
        }
        if (orderBy != 'Code')
            order.push({ Field: 'Code', Direction: 'ASC' });
        var filter = [];
        filter.push({ Field: 'NoOfBidders', Type: 'Static', Operator: '>', Value: 0 });
	if (startDate!='')
		data.push({ StartDate: startDate });
	if (endDate!='')
		data.push({ EndDate: endDate });
	data.push({ StartIndex: startIndex }, { EndIndex: endIndex});
        var requestName = 'Result' + '_' + startDate + '_' + endDate + '_' + startIndex + '_' + endIndex + '_' + orderBy + '_' + orderType;
        return AG.ClientAPI.createData(BondBiding, requestName, data, { static: ['Id', 'Code', 'AuctionDate', 'FullNameOfIssuer', 'IssueDate', 'MaturityDate', 'Term', 'OfferBLNDONG', 'BidYieldPCT', 'AcceptBLNDONG', 'AcceptYieldPCT', 'NoOfBidders'] }, order,filter);
        order = null, requestName = null,filter= null;
    },
    GetCountBidingResult: function (startDate, endDate) {
        var filter = [];
        filter.push({ Field: 'NoOfBidders', Type: 'Static', Operator: '>', Value: 0 });
        return BondBiding.getCount([{ StartDate: startDate }, { EndDate: endDate}],null, null,filter);
    },
    GetBidingResultToExcel: function (startDate, endDate) {
        var filter = [];
        filter.push({ Field: 'NoOfBidders', Type: 'Static', Operator: '>', Value: 0 });
        return BondBiding.toExcel('BidingResult', [{ StartDate: startDate }, { EndDate: endDate}], { static: ['Id', 'AuctionDate', 'FullNameOfIssuer', 'IssueDate', 'MaturityDate', 'Term', 'OfferBLNDONG', 'BidYieldPCT', 'AcceptBLNDONG', 'AcceptYieldPCT', 'NoOfBidders'] },null,filter);
    },
    GetTradingResultTotalMarket: function (startDate, endDate, startIndex, endIndex, orderBy, orderType) {

        var order = [], data = [];
        if (typeof (orderBy) != "undefined")
            order = [{ Field: orderBy, Direction: 'ASC'}];
        else
            order = [{ Field: 'ID', Direction: 'ASC'}];
        if (typeof (orderType) != "undefined") {
            order[0].Direction = orderType;
        }
        if (orderBy != 'Code')
            order.push({ Field: 'Code', Direction: 'ASC' });
	if (startDate!='')
		data.push({ StartDate: startDate });
	if (endDate!='')
		data.push({ EndDate: endDate });
	data.push({ StartIndex: startIndex }, { EndIndex: endIndex});
        var requestName = 'TradingResultTotalMarket' + '_' + startDate + '_' + endDate + '_' + orderBy + '_' + orderType + '_' + startIndex + '_' + endIndex;
        return AG.ClientAPI.createData(BondExchangeDaily, requestName, data, { static: ['Id', 'Session', 'TradingDate', 'NumberOfConventionalOutrightTrades', 'TotalTradingVolumeOfConventionalOutrightTrades', 'TotalTradingValueOfConventionalOutrightTrades', 'NumberOfElectronicOutrightTrades', 'TotalTradingVolumeOfElectronicOutrightTrades', 'TotalTradingValueOfElectronicOutrightTrades', 'NumberOfReposTrades', 'TotalTradingVolumeOfReposTrades', 'TotalTradingValueOfReposTrades'] }, order);
        order = null, requestName = null;
    },
    GetCountTradingResultTotalMarket: function (startDate, endDate) {

        return BondExchangeDaily.getCount([{ StartDate: startDate }, { EndDate: endDate }]);
    },
    GetTradingResultTotalMarketToExcel: function (startDate, endDate) {

        return BondExchangeDaily.toExcel('TradingResultTotalMarket', [{ StartDate: startDate }, { EndDate: endDate}], { static: ['Id', 'Session', 'TradingDate', 'NumberOfConventionalOutrightTrades', 'TotalTradingVolumeOfConventionalOutrightTrades', 'TotalTradingValueOfConventionalOutrightTrades', 'NumberOfElectronicOutrightTrades', 'TotalTradingVolumeOfElectronicOutrightTrades', 'TotalTradingValueOfElectronicOutrightTrades', 'NumberOfReposTrades', 'TotalTradingVolumeOfReposTrades', 'TotalTradingValueOfReposTrades'] });
    },
    GetTradingResultOutright: function (startDate, endDate, startIndex, endIndex, orderBy, orderType) {

        var order = [], data = [];
        if (typeof (orderBy) != "undefined")
            order = [{ Field: orderBy, Direction: 'ASC'}];
        else
            order = [{ Field: 'ID', Direction: 'ASC'}];
        if (typeof (orderType) != "undefined") {
            order[0].Direction = orderType;
        }
        if (orderBy != 'Code')
            order.push({ Field: 'Code', Direction: 'ASC' });
	if (startDate!='')
		data.push({ StartDate: startDate });
	if (endDate!='')
		data.push({ EndDate: endDate });
	data.push({ StartIndex: startIndex }, { EndIndex: endIndex});
        var filter = [{ Field: 'TradingType', Type: 'Dynamic', Operator: '=', Value: AG.Config.TradingResultType.Outright }];
        var requestName = 'TradingResultOutright' + '_' + startDate + '_' + endDate + '_' + orderBy + '_' + orderType + '_' + startIndex + '_' + endIndex;
        return AG.ClientAPI.createData(BondDaily, requestName, data, { static: ['TradingDate', 'Code', 'Coupon', 'RemainingMaturity', 'OpenPrice', 'OpenInterest', 'ClosePrice', 'CloseInterest', 'HighestPrice', 'HighestInterest', 'LowestPrice', 'LowestInterest', 'TotalTradingVolume', 'TotalTradingValue'] }, order, filter);
        order = null, requestName = null;
    },
    GetCountTradingResultOutright: function (startDate, endDate) {
	var data=[];	
	if (startDate!='')
		data.push({ StartDate: startDate });
	if (endDate!='')
		data.push({ EndDate: endDate });
        var filter = [{ Field: 'TradingType', Type: 'Dynamic', Operator: '=', Value: AG.Config.TradingResultType.Outright }];
return BondDaily.getCount(data,null,null,filter );
    },
    GetTradingResultOutrightToExcel: function (startDate, endDate) {
	var data=[];	
	if (startDate!='')
		data.push({ StartDate: startDate });
	if (endDate!='')
		data.push({ EndDate: endDate });
	data.push({ StartIndex: startIndex }, { EndIndex: endIndex});
        var filter = [{ Field: 'TradingType', Type: 'Dynamic', Operator: '=', Value: AG.Config.TradingResultType.Outright }];
        return BondDaily.toExcel('TradingResultOutright', [{ StartDate: startDate }, { EndDate: endDate }, { TradingType: AG.Config.TradingResultType.Outright}], { static: ['TradingDate', 'Code', 'Coupon', 'RemainingMaturity', 'OpenPrice', 'OpenInterest', 'ClosePrice', 'CloseInterest', 'HighestPrice', 'HighestInterest', 'LowestPrice', 'LowestInterest', 'TotalTradingVolume', 'TotalTradingValue'] });
    },
    GetTradingResultRepos: function (startDate, endDate, startIndex, endIndex, orderBy, orderType) {
	var data=[];	
	if (startDate!='')
		data.push({ StartDate: startDate });
	if (endDate!='')
		data.push({ EndDate: endDate });
	data.push({ StartIndex: startIndex }, { EndIndex: endIndex});
        var filter = [{ Field: 'TradingType', Type: 'Dynamic', Operator: '=', Value: AG.Config.TradingResultType.Repos }];
        var order = [];
        if (typeof (orderBy) != "undefined")
            order = [{ Field: orderBy, Direction: 'ASC'}];
        else
            order = [{ Field: 'ID', Direction: 'ASC'}];
        if (typeof (orderType) != "undefined") {
            order[0].Direction = orderType;
        }
        if (orderBy != 'Code')
            order.push({ Field: 'Code', Direction: 'ASC' });
        var requestName = 'TradingResultRepos' + '_' + startDate + '_' + endDate + '_' + orderBy + '_' + orderType + '_' + startIndex + '_' + endIndex;
        return AG.ClientAPI.createData(BondDaily, requestName, data, { static: ['Id', 'Code', 'TradingDate', 'ReposTerm', 'HighestInterest', 'LowestInterest', 'OpenInterest', 'CloseInterest', 'TotalFirstTradingValue', 'TotalSecondTradingValue', 'HighestRiskPremium', 'LowestRiskPremium'] }, order, filter);
        order = null, requestName = null;
    },
    GetCountTradingResultRepos: function (startDate, endDate) {
	var data=[];	
	if (startDate!='')
		data.push({ StartDate: startDate });
	if (endDate!='')
		data.push({ EndDate: endDate });
        var filter = [{ Field: 'TradingType', Type: 'Dynamic', Operator: '=', Value: AG.Config.TradingResultType.Repos }];
        return BondDaily.getCount(data,null,null,filter);
    },
    GetTradingResultReposToExcel: function (startDate, endDate) {
	var data=[];	
	if (startDate!='')
		data.push({ StartDate: startDate });
	if (endDate!='')
		data.push({ EndDate: endDate });
	data.push({ StartIndex: startIndex }, { EndIndex: endIndex});
        var filter = [{ Field: 'TradingType', Type: 'Dynamic', Operator: '=', Value: AG.Config.TradingResultType.Repos }];
        return BondDaily.toExcel('TradingResultRepos', data, { static: ['Id', 'Code', 'TradingDate', 'ReposTerm', 'HighestInterest', 'LowestInterest', 'OpenInterest', 'CloseInterest', 'TotalFirstTradingValue', 'TotalSecondTradingValue', 'HighestRiskPremium', 'LowestRiskPremium'] }, filter);
    },
    GetListed: function (issuer, bondType, termStart, termEnd, yield, startDate, endDate, startIndex, endIndex, orderBy, orderType) {
        var order = [];
        if (typeof (orderBy) != "undefined")
            order = [{ Field: orderBy, Direction: 'ASC'}];
        else
            order = [{ Field: 'ID', Direction: 'ASC'}];
        if (typeof (orderType) != "undefined") {
            order[0].Direction = orderType;
        }
        if (orderBy != 'Code')
            order.push({ Field: 'Code', Direction: 'ASC' });
        var data = [];
//        if (issuer != '')
//            data.push({ IssuerName: issuer });
        if (bondType != '')
            data.push({ Type: bondType });
        data.push({ StartIndex: startIndex });
        data.push({ EndIndex: endIndex });
        var filter = [];
        if (issuer != '')
            filter.push({ Field: 'IssuerName', Type: 'Static', Operator: '=', Value: issuer });
        if (bondType != '')
            filter.push({ Field: 'Type', Type: 'Static', Operator: '=', Value: bondType });
        if (termStart != '')
            filter.push({ Field: 'Period', Type: 'Static', Operator: '>=', Value: termStart });
        if (termEnd != '')
            filter.push({ Field: 'Period', Type: 'Static', Operator: '<=', Value: termEnd });
        if (startDate != '')
            filter.push({ Field: 'ListingDate', Type: 'Static', Operator: '>=', Value: startDate, DataType: 'datetime2(7)' });
        if (endDate != '')
            filter.push({ Field: 'ListingDate', Type: 'Static', Operator: '<=', Value: endDate, DataType: 'datetime2(7)' });
        if (yield != '') {
            arrInterestRate = yield.split('-');
            filter.push({ Field: 'InterestRate', Type: 'Static', Operator: '>=', Value: arrInterestRate[0], DataType: 'decimal(32, 8)' });
            filter.push({ Field: 'InterestRate', Type: 'Static', Operator: '<=', Value: arrInterestRate[1], DataType: 'decimal(32, 8)' });
        }
        var requestName = 'Listed' + '_' + issuer + '_' + bondType + '_' + termStart + '_' + termEnd + '_' + yield + '_' + startDate + '_' + endDate + '_' + startIndex + '_' + endIndex + '_' + orderBy + '_' + orderType;
        return AG.ClientAPI.createData(BondRealtime, requestName, data, { static: ['Id', 'Code', 'ListingDate', 'OutstandingVolume', 'InterestPaymentMode', 'IssueDate', 'MaturityDate', 'Coupon', 'RemainingMaturity', 'Period', 'InterestRate'] }, order, filter, undefined);
        order = null, data = null, filter = null, requestName = null;
    },
    GetCountListed: function (issuer, bondType, termStart, termEnd, yield, startDate, endDate) {
        var data = [];
//        if (issuer != '')
//            data.push({ IssuerName: issuer });
//        if (bondType != '')
//            data.push({ Type: bondType });
        var filter = [];
        if (bondType != '')
            filter.push({ Field: 'Type', Type: 'Static', Operator: '=', Value: bondType });
        if (issuer != '')
            filter.push({ Field: 'IssuerName', Type: 'Static', Operator: '=', Value: issuer });
        if (termStart != '')
            filter.push({ Field: 'Period', Type: 'Static', Operator: '>=', Value: termStart });
        if (termEnd != '')
            filter.push({ Field: 'Period', Type: 'Static', Operator: '<=', Value: termEnd });
        if (startDate != '')
            filter.push({ Field: 'ListingDate', Type: 'Static', Operator: '>=', Value: startDate, DataType: 'datetime2(7)' });
        if (endDate != '')
            filter.push({ Field: 'ListingDate', Type: 'Static', Operator: '<=', Value: endDate, DataType: 'datetime2(7)' });
        if (yield != '') {
            arrInterestRate = yield.split('-');
            filter.push({ Field: 'InterestRate', Type: 'Static', Operator: '>=', Value: arrInterestRate[0], DataType: 'decimal(32, 8)' });
            filter.push({ Field: 'InterestRate', Type: 'Static', Operator: '<=', Value: arrInterestRate[1], DataType: 'decimal(32, 8)' });
        }
        return BondRealtime.getCount(data, undefined, undefined, filter);
    },
    GetListedToExcel: function (issuer, bondType, termStart, termEnd, yield, startDate, endDate) {
        var data = [];
//        if (issuer != '')
//            data.push({ IssuerName: issuer });
//        if (bondType != '')
//            data.push({ Type: bondType });
        var filter = [];
        if (issuer != '')
            filter.push({ Field: 'IssuerName', Type: 'Static', Operator: '=', Value: issuer });
        if (bondType != '')
            filter.push({ Field: 'Type', Type: 'Static', Operator: '=', Value: bondType });
        if (termStart != '')
            filter.push({ Field: 'Period', Type: 'Static', Operator: '>=', Value: termStart });
        if (termEnd != '')
            filter.push({ Field: 'Period', Type: 'Static', Operator: '<=', Value: termEnd });
        if (startDate != '')
            filter.push({ Field: 'ListingDate', Type: 'Static', Operator: '>=', Value: startDate });
        if (endDate != '')
            filter.push({ Field: 'ListingDate', Type: 'Static', Operator: '<=', Value: endDate });
        if (yield != '') {
            arrInterestRate = yield.split('-');
            filter.push({ Field: 'InterestRate', Type: 'Static', Operator: '>=', Value: arrInterestRate[0], DataType: 'decimal(32, 8)' });
            filter.push({ Field: 'InterestRate', Type: 'Static', Operator: '<=', Value: arrInterestRate[1], DataType: 'decimal(32, 8)' });
        }
        BondRealtime.toExcel('ListedBond', data, { static: ['Id', 'Code', 'ListingDate', 'OutstandingVolume', 'InterestPaymentMode', 'IssueDate', 'MaturityDate', 'Coupon', 'RemainingMaturity', 'Period', 'InterestRate'] }, filter);
        data = null, filter = null;
    },
    GetDetail: function (code) {
        var requestName = 'Detail' + '_' + code;
        return AG.ClientAPI.createData(BondRealtime, requestName, [{ Code: code}], { static: ['Id', 'IssuerName', 'IssuerHeadOffice', 'IssuerTel', 'IssuerFax', 'ParValue', 'OutstandingVolume', 'OutstandingValue', 'FormOfIssue', 'Period', 'InterestRate', 'InterestPaymentMode', 'IssueDate', 'MaturityDate', 'ListingDate', 'FirstTradingDate'] });
        requestName = null;
    },
    GetIssuingOrganization: function () {
        var objResult;
        objResult = [
        { Code: 'State Treasury', Name: 'State Treasury' },
        { Code: 'DAF', Name: 'DAF' },
        { Code: 'Hanoi Treasury', Name: 'Hanoi Treasury' },
        { Code: 'HoChiMinh City Investment Fund for Urban Development (HIFU)', Name: 'HoChiMinh City Investment Fund for Urban Development (HIFU)' },
        { Code: 'VBSP', Name: 'VBSP' },
        { Code: 'VDB', Name: 'VDB' },
        { Code: 'VEC', Name: 'VEC' },
        { Code: 'Vietnam Electricity (EVN)', Name: 'Vietnam Electricity (EVN)' }
        ];
        return objResult;
    },
    GetBondType: function () {
        return AG.ClientAPI.createData(Config, 'GetBondType', [{ Type: 'BECDD6F3-3075-4F8E-86CC-849107168FBE'}], { static: ['Id', 'Code', 'Name'] });
    },

    GetLastSessionDate: function () {
        var order = [{ Field: 'TradingDate', Direction: 'DESC'}];
        var result = AG.ClientAPI.createData(BondDaily, 'GetLastSessionDate', [{ StartIndex: 1 }, { EndIndex: 1}], { static: ['Id', 'TradingDate'] }, order);
        if (result.length > 0)
            return result[0].TradingDate;
        else
            return '2000-01-01T00:00:00+07:00';
    },
    GetListBond: function () {
        return AG.ClientAPI.createData(BondRealtime, 'GetListBond', [{}], { static: ['Id', 'Code', 'Name'] });
    }
}
