/// <summary>
        /// [EARLY ACCESS] ReconcileHoldings: Reconcile portfolio holdings Reconcile the holdings of two portfolios.
        /// </summary>
        /// <exception cref="Lusid.Sdk.Client.ApiException">Thrown when fails to make API call</exception>
        /// <param name="sortBy">Optional. Order the results by these fields. Use use the &#39;-&#39; sign to denote descending order e.g. -MyFieldName (optional)</param>
        /// <param name="start">Optional. When paginating, skip this number of results (optional)</param>
        /// <param name="limit">Optional. When paginating, limit the number of returned results to this many. (optional)</param>
        /// <param name="filter">Optional. Expression to filter the result set.              For example, to filter on the left portfolio Code, use \&quot;left.portfolioId.code eq &#39;string&#39;\&quot;              Read more about filtering results from LUSID here https://support.lusid.com/filtering-results-from-lusid. (optional)</param>
        /// <param name="portfoliosReconciliationRequest">The specifications of the inputs to the reconciliation (optional)</param>
        /// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
        /// <returns>Task of ResourceListOfReconciliationBreak</returns>
        public async System.Threading.Tasks.Task <ResourceListOfReconciliationBreak> ReconcileHoldingsAsync(List <string> sortBy = default(List <string>), int?start = default(int?), int?limit = default(int?), string filter = default(string), PortfoliosReconciliationRequest portfoliosReconciliationRequest = default(PortfoliosReconciliationRequest), System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))
        {
            Lusid.Sdk.Client.ApiResponse <ResourceListOfReconciliationBreak> localVarResponse = await ReconcileHoldingsWithHttpInfoAsync(sortBy, start, limit, filter, portfoliosReconciliationRequest, cancellationToken).ConfigureAwait(false);

            return(localVarResponse.Data);
        }
        /// <summary>
        /// [EARLY ACCESS] ReconcileHoldings: Reconcile portfolio holdings Reconcile the holdings of two portfolios.
        /// </summary>
        /// <exception cref="Lusid.Sdk.Client.ApiException">Thrown when fails to make API call</exception>
        /// <param name="sortBy">Optional. Order the results by these fields. Use use the &#39;-&#39; sign to denote descending order e.g. -MyFieldName (optional)</param>
        /// <param name="start">Optional. When paginating, skip this number of results (optional)</param>
        /// <param name="limit">Optional. When paginating, limit the number of returned results to this many. (optional)</param>
        /// <param name="filter">Optional. Expression to filter the result set.              For example, to filter on the left portfolio Code, use \&quot;left.portfolioId.code eq &#39;string&#39;\&quot;              Read more about filtering results from LUSID here https://support.lusid.com/filtering-results-from-lusid. (optional)</param>
        /// <param name="portfoliosReconciliationRequest">The specifications of the inputs to the reconciliation (optional)</param>
        /// <param name="cancellationToken">Cancellation Token to cancel the request.</param>
        /// <returns>Task of ApiResponse (ResourceListOfReconciliationBreak)</returns>
        public async System.Threading.Tasks.Task <Lusid.Sdk.Client.ApiResponse <ResourceListOfReconciliationBreak> > ReconcileHoldingsWithHttpInfoAsync(List <string> sortBy = default(List <string>), int?start = default(int?), int?limit = default(int?), string filter = default(string), PortfoliosReconciliationRequest portfoliosReconciliationRequest = default(PortfoliosReconciliationRequest), System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))
        {
            Lusid.Sdk.Client.RequestOptions localVarRequestOptions = new Lusid.Sdk.Client.RequestOptions();

            String[] _contentTypes = new String[] {
                "application/json-patch+json",
                "application/json",
                "text/json",
                "application/_*+json"
            };

            // to determine the Accept header
            String[] _accepts = new String[] {
                "text/plain",
                "application/json",
                "text/json"
            };


            var localVarContentType = Lusid.Sdk.Client.ClientUtils.SelectHeaderContentType(_contentTypes);

            if (localVarContentType != null)
            {
                localVarRequestOptions.HeaderParameters.Add("Content-Type", localVarContentType);
            }

            var localVarAccept = Lusid.Sdk.Client.ClientUtils.SelectHeaderAccept(_accepts);

            if (localVarAccept != null)
            {
                localVarRequestOptions.HeaderParameters.Add("Accept", localVarAccept);
            }

            if (sortBy != null)
            {
                localVarRequestOptions.QueryParameters.Add(Lusid.Sdk.Client.ClientUtils.ParameterToMultiMap("multi", "sortBy", sortBy));
            }
            if (start != null)
            {
                localVarRequestOptions.QueryParameters.Add(Lusid.Sdk.Client.ClientUtils.ParameterToMultiMap("", "start", start));
            }
            if (limit != null)
            {
                localVarRequestOptions.QueryParameters.Add(Lusid.Sdk.Client.ClientUtils.ParameterToMultiMap("", "limit", limit));
            }
            if (filter != null)
            {
                localVarRequestOptions.QueryParameters.Add(Lusid.Sdk.Client.ClientUtils.ParameterToMultiMap("", "filter", filter));
            }
            localVarRequestOptions.Data = portfoliosReconciliationRequest;

            // authentication (oauth2) required
            // oauth required
            if (!String.IsNullOrEmpty(this.Configuration.AccessToken))
            {
                localVarRequestOptions.HeaderParameters.Add("Authorization", "Bearer " + this.Configuration.AccessToken);
            }

            //  set the LUSID header
            localVarRequestOptions.HeaderParameters.Add("X-LUSID-Sdk-Language", "C#");
            localVarRequestOptions.HeaderParameters.Add("X-LUSID-Sdk-Version", "0.11.4385");

            // make the HTTP request

            var localVarResponse = await this.AsynchronousClient.PostAsync <ResourceListOfReconciliationBreak>("/api/portfolios/$reconcileholdings", localVarRequestOptions, this.Configuration, cancellationToken).ConfigureAwait(false);

            if (this.ExceptionFactory != null)
            {
                Exception _exception = this.ExceptionFactory("ReconcileHoldings", localVarResponse);
                if (_exception != null)
                {
                    throw _exception;
                }
            }

            return(localVarResponse);
        }
 /// <summary>
 /// [EARLY ACCESS] ReconcileHoldings: Reconcile portfolio holdings Reconcile the holdings of two portfolios.
 /// </summary>
 /// <exception cref="Lusid.Sdk.Client.ApiException">Thrown when fails to make API call</exception>
 /// <param name="sortBy">Optional. Order the results by these fields. Use use the &#39;-&#39; sign to denote descending order e.g. -MyFieldName (optional)</param>
 /// <param name="start">Optional. When paginating, skip this number of results (optional)</param>
 /// <param name="limit">Optional. When paginating, limit the number of returned results to this many. (optional)</param>
 /// <param name="filter">Optional. Expression to filter the result set.              For example, to filter on the left portfolio Code, use \&quot;left.portfolioId.code eq &#39;string&#39;\&quot;              Read more about filtering results from LUSID here https://support.lusid.com/filtering-results-from-lusid. (optional)</param>
 /// <param name="portfoliosReconciliationRequest">The specifications of the inputs to the reconciliation (optional)</param>
 /// <returns>ResourceListOfReconciliationBreak</returns>
 public ResourceListOfReconciliationBreak ReconcileHoldings(List <string> sortBy = default(List <string>), int?start = default(int?), int?limit = default(int?), string filter = default(string), PortfoliosReconciliationRequest portfoliosReconciliationRequest = default(PortfoliosReconciliationRequest))
 {
     Lusid.Sdk.Client.ApiResponse <ResourceListOfReconciliationBreak> localVarResponse = ReconcileHoldingsWithHttpInfo(sortBy, start, limit, filter, portfoliosReconciliationRequest);
     return(localVarResponse.Data);
 }
        /// <summary>
        /// [EARLY ACCESS] Reconcile portfolio holdings Reconcile the holdings of two portfolios.
        /// </summary>
        /// <exception cref="Lusid.Sdk.Client.ApiException">Thrown when fails to make API call</exception>
        /// <param name="sortBy">Optional. Order the results by these fields. Use use the &#39;-&#39; sign to denote descending order e.g. -MyFieldName (optional)</param>
        /// <param name="start">Optional. When paginating, skip this number of results (optional)</param>
        /// <param name="limit">Optional. When paginating, limit the number of returned results to this many. (optional)</param>
        /// <param name="filter">Optional. Expression to filter the result set (optional)</param>
        /// <param name="request">The specifications of the inputs to the reconciliation (optional)</param>
        /// <returns>Task of ApiResponse (ResourceListOfReconciliationBreak)</returns>
        public async System.Threading.Tasks.Task <ApiResponse <ResourceListOfReconciliationBreak> > ReconcileHoldingsAsyncWithHttpInfo(List <string> sortBy = null, int?start = null, int?limit = null, string filter = null, PortfoliosReconciliationRequest request = null)
        {
            var    localVarPath         = "./api/portfolios/$reconcileholdings";
            var    localVarPathParams   = new Dictionary <String, String>();
            var    localVarQueryParams  = new List <KeyValuePair <String, String> >();
            var    localVarHeaderParams = new Dictionary <String, String>(this.Configuration.DefaultHeader);
            var    localVarFormParams   = new Dictionary <String, String>();
            var    localVarFileParams   = new Dictionary <String, FileParameter>();
            Object localVarPostBody     = null;

            // to determine the Content-Type header
            String[] localVarHttpContentTypes = new String[] {
            };
            String localVarHttpContentType    = this.Configuration.ApiClient.SelectHeaderContentType(localVarHttpContentTypes);

            // to determine the Accept header
            String[] localVarHttpHeaderAccepts = new String[] {
                "text/plain",
                "application/json",
                "text/json"
            };
            String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts);

            if (localVarHttpHeaderAccept != null)
            {
                localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept);
            }

            if (sortBy != null)
            {
                localVarQueryParams.AddRange(this.Configuration.ApiClient.ParameterToKeyValuePairs("multi", "sortBy", sortBy));                 // query parameter
            }
            if (start != null)
            {
                localVarQueryParams.AddRange(this.Configuration.ApiClient.ParameterToKeyValuePairs("", "start", start));                // query parameter
            }
            if (limit != null)
            {
                localVarQueryParams.AddRange(this.Configuration.ApiClient.ParameterToKeyValuePairs("", "limit", limit));                // query parameter
            }
            if (filter != null)
            {
                localVarQueryParams.AddRange(this.Configuration.ApiClient.ParameterToKeyValuePairs("", "filter", filter));                 // query parameter
            }
            if (request != null && request.GetType() != typeof(byte[]))
            {
                localVarPostBody = this.Configuration.ApiClient.Serialize(request); // http body (model) parameter
            }
            else
            {
                localVarPostBody = request; // byte array
            }

            // authentication (oauth2) required
            // oauth required
            if (!String.IsNullOrEmpty(this.Configuration.AccessToken))
            {
                localVarHeaderParams["Authorization"] = "Bearer " + this.Configuration.AccessToken;
            }

            //  set the LUSID header
            localVarHeaderParams["X-LUSID-Sdk-Language"] = "C#";
            localVarHeaderParams["X-LUSID-Sdk-Version"]  = "0.10.730";

            // make the HTTP request
            IRestResponse localVarResponse = (IRestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath,
                                                                                                            Method.POST, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams,
                                                                                                            localVarPathParams, localVarHttpContentType);

            int localVarStatusCode = (int)localVarResponse.StatusCode;

            if (ExceptionFactory != null)
            {
                Exception exception = ExceptionFactory("ReconcileHoldings", localVarResponse);
                if (exception != null)
                {
                    throw exception;
                }
            }

            return(new ApiResponse <ResourceListOfReconciliationBreak>(localVarStatusCode,
                                                                       localVarResponse.Headers.ToDictionary(x => x.Key, x => string.Join(",", x.Value)),
                                                                       (ResourceListOfReconciliationBreak)this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(ResourceListOfReconciliationBreak))));
        }
        /// <summary>
        /// [EARLY ACCESS] Reconcile portfolio holdings Reconcile the holdings of two portfolios.
        /// </summary>
        /// <exception cref="Lusid.Sdk.Client.ApiException">Thrown when fails to make API call</exception>
        /// <param name="sortBy">Optional. Order the results by these fields. Use use the &#39;-&#39; sign to denote descending order e.g. -MyFieldName (optional)</param>
        /// <param name="start">Optional. When paginating, skip this number of results (optional)</param>
        /// <param name="limit">Optional. When paginating, limit the number of returned results to this many. (optional)</param>
        /// <param name="filter">Optional. Expression to filter the result set (optional)</param>
        /// <param name="request">The specifications of the inputs to the reconciliation (optional)</param>
        /// <returns>Task of ResourceListOfReconciliationBreak</returns>
        public async System.Threading.Tasks.Task <ResourceListOfReconciliationBreak> ReconcileHoldingsAsync(List <string> sortBy = null, int?start = null, int?limit = null, string filter = null, PortfoliosReconciliationRequest request = null)
        {
            ApiResponse <ResourceListOfReconciliationBreak> localVarResponse = await ReconcileHoldingsAsyncWithHttpInfo(sortBy, start, limit, filter, request);

            return(localVarResponse.Data);
        }
        /// <summary>
        /// [EARLY ACCESS] Reconcile portfolio holdings Reconcile the holdings of two portfolios.
        /// </summary>
        /// <exception cref="Lusid.Sdk.Client.ApiException">Thrown when fails to make API call</exception>
        /// <param name="sortBy">Optional. Order the results by these fields. Use use the &#39;-&#39; sign to denote descending order e.g. -MyFieldName (optional)</param>
        /// <param name="start">Optional. When paginating, skip this number of results (optional)</param>
        /// <param name="limit">Optional. When paginating, limit the number of returned results to this many. (optional)</param>
        /// <param name="filter">Optional. Expression to filter the result set (optional)</param>
        /// <param name="request">The specifications of the inputs to the reconciliation (optional)</param>
        /// <returns>ResourceListOfReconciliationBreak</returns>
        public ResourceListOfReconciliationBreak ReconcileHoldings(List <string> sortBy = null, int?start = null, int?limit = null, string filter = null, PortfoliosReconciliationRequest request = null)
        {
            ApiResponse <ResourceListOfReconciliationBreak> localVarResponse = ReconcileHoldingsWithHttpInfo(sortBy, start, limit, filter, request);

            return(localVarResponse.Data);
        }
Exemplo n.º 7
0
        public void Reconcile_Portfolio()
        {
            var portfolioCode = _testDataUtilities.CreateTransactionPortfolio(TestDataUtilities.TutorialScope);

            var today     = new DateTimeOffset(DateTimeOffset.UtcNow.Date).ToUniversalTime();
            var yesterday = today.AddDays(-1).ToUniversalTime();

            //    Create transactions for yesterday
            var yesterdaysTransactions = new List <TransactionRequest>
            {
                _testDataUtilities.BuildTransactionRequest(_instrumentIds[0], 1000, 100, "GBP", yesterday.AddHours(8), "StockIn"),
                _testDataUtilities.BuildTransactionRequest(_instrumentIds[0], 2300, 101, "GBP", yesterday.AddHours(12), "StockIn"),
                _testDataUtilities.BuildTransactionRequest(_instrumentIds[1], -1000, 102, "GBP", yesterday.AddHours(9), "StockIn"),
                _testDataUtilities.BuildTransactionRequest(_instrumentIds[2], 1200, 103, "GBP", yesterday.AddHours(16), "StockIn"),
                _testDataUtilities.BuildTransactionRequest(_instrumentIds[3], 2000, 103, "GBP", yesterday.AddHours(9), "StockIn")
            };

            //    Add transactions
            _apiFactory.Api <ITransactionPortfoliosApi>().UpsertTransactions(TestDataUtilities.TutorialScope, portfolioCode, yesterdaysTransactions);

            var todaysTransactions = new List <TransactionRequest>
            {
                _testDataUtilities.BuildTransactionRequest(_instrumentIds[0], -3000, 101.78M, "GBP", today.AddHours(8), "StockIn"),   // net long 300
                _testDataUtilities.BuildTransactionRequest(_instrumentIds[0], 1500, 101.78M, "GBP", today.AddHours(12), "StockIn"),   // net long 1800
                _testDataUtilities.BuildTransactionRequest(_instrumentIds[1], 1000, 102, "GBP", today.AddHours(12), "StockIn"),       // flat
                _testDataUtilities.BuildTransactionRequest(_instrumentIds[2], 1200, 103, "GBP", today.AddHours(16), "StockIn"),       // long 2400
                _testDataUtilities.BuildTransactionRequest(_instrumentIds[3], 1000, 103, "GBP", today.AddHours(9), "StockIn"),        // long 3000
                _testDataUtilities.BuildTransactionRequest(_instrumentIds[3], 2000, 103, "GBP", today.AddHours(20), "StockIn")        // long 5000 but outside recon window
            };

            //    add transactions
            var finalResult = _apiFactory.Api <ITransactionPortfoliosApi>().UpsertTransactions(TestDataUtilities.TutorialScope, portfolioCode, todaysTransactions);

            //Using the last result find out its AsAtDate (based on the servers clock at the time of the test)
            var finalAsAtTime = finalResult.Version.AsAtDate;

            //So now we have the portfolio with 2 days worth of transactions, going to reconcile from T-1 20:00 to now,
            //this should reflect breaks for each instrument equal to the transactions from yesterday till 20 today.

            var reconcileRequest =
                new PortfoliosReconciliationRequest(
                    new PortfolioReconciliationRequest(
                        new ResourceId(TestDataUtilities.TutorialScope, portfolioCode),
                        yesterday.AddHours(20).ToString("o"),
                        finalAsAtTime),
                    new PortfolioReconciliationRequest(
                        new ResourceId(TestDataUtilities.TutorialScope, portfolioCode),
                        today.AddHours(16).ToString("o"),
                        finalAsAtTime),
                    new List <string>());

            var listOfBreaks = _apiFactory.Api <IReconciliationsApi>().ReconcileHoldings(portfoliosReconciliationRequest: reconcileRequest);

            Console.WriteLine($"Breaks at {yesterday.AddHours(20)}");
            PrintBreaks(listOfBreaks.Values);

            /*
             *  Expecting
             *      _instrumentIds[0]       -1500	-8094.73
             *      _instrumentIds[3]       1000	10300
             *      _instrumentIds[2]       1200	10300
             *      _instrumentIds[1]       1000	-10200
             */

            Assert.AreEqual(listOfBreaks.Values.Count, 4);

            var map = listOfBreaks.Values.ToDictionary(abreak => abreak.InstrumentUid);

            Assert.AreEqual(map[_instrumentIds[0]].DifferenceUnits, -1500);
            Assert.AreEqual(map[_instrumentIds[3]].DifferenceUnits, 1000);
            Assert.AreEqual(map[_instrumentIds[2]].DifferenceUnits, 1200);
            Assert.AreEqual(map[_instrumentIds[1]].DifferenceUnits, 1000);

            void PrintBreaks(IEnumerable <ReconciliationBreak> breaks)
            {
                foreach (var abreak in breaks)
                {
                    Console.WriteLine($"{abreak.InstrumentUid}\t{abreak.DifferenceUnits}\t{abreak.DifferenceCost.Amount}");
                }

                Console.WriteLine();
            }
        }