All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ru.tinkoff.piapi.core.OperationsService Maven / Gradle / Ivy

There is a newer version: 1.25
Show newest version
package ru.tinkoff.piapi.core;

import ru.tinkoff.piapi.core.models.Portfolio;
import ru.tinkoff.piapi.core.models.Positions;
import ru.tinkoff.piapi.core.models.WithdrawLimits;
import ru.tinkoff.piapi.core.utils.DateUtils;
import ru.tinkoff.piapi.core.utils.Helpers;
import ru.tinkoff.piapi.core.utils.ValidationUtils;
import ru.tinkoff.piapi.contract.v1.*;
import ru.tinkoff.piapi.contract.v1.OperationsServiceGrpc.OperationsServiceBlockingStub;
import ru.tinkoff.piapi.contract.v1.OperationsServiceGrpc.OperationsServiceStub;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.time.Instant;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CompletableFuture;

/**
 * Сервис получения информации о портфеле по конкретному счёту.
 */
public class OperationsService {
  private final OperationsServiceBlockingStub operationsBlockingStub;
  private final OperationsServiceStub operationsStub;
  private final boolean sandboxMode;

  OperationsService(@Nonnull OperationsServiceBlockingStub operationsBlockingStub,
                    @Nonnull OperationsServiceStub operationsStub,
                    boolean sandboxMode) {
    this.sandboxMode = sandboxMode;
    this.operationsBlockingStub = operationsBlockingStub;
    this.operationsStub = operationsStub;
  }

  /**
   * Получение (синхронное) списка операций всех типов по счёту в заданном периоде времени.
   *
   * @param accountId Идентификатор счёта.
   * @param from      Начало периода (по UTC).
   * @param to        Окончание периода (по UTC).
   * @return Список операций.
   */
  @Nonnull
  public List getAllOperationsSync(@Nonnull String accountId,
                                              @Nonnull Instant from,
                                              @Nonnull Instant to) {
    ValidationUtils.checkFromTo(from, to);

    return Helpers.unaryCall(() -> operationsBlockingStub.getOperations(
        OperationsRequest.newBuilder()
          .setAccountId(accountId)
          .setFrom(DateUtils.instantToTimestamp(from))
          .setTo(DateUtils.instantToTimestamp(to))
          .build())
      .getOperationsList());
  }

  /**
   * Получение (синхронное) списка исполненных операций по счёту в заданном периоде времени.
   *
   * @param accountId Идентификатор счёта.
   * @param from      Начало периода (по UTC).
   * @param to        Окончание периода (по UTC).
   * @return Список операций.
   */
  @Nonnull
  public List getExecutedOperationsSync(@Nonnull String accountId,
                                                   @Nonnull Instant from,
                                                   @Nonnull Instant to) {
    ValidationUtils.checkFromTo(from, to);

    return Helpers.unaryCall(() -> operationsBlockingStub.getOperations(
        OperationsRequest.newBuilder()
          .setAccountId(accountId)
          .setFrom(DateUtils.instantToTimestamp(from))
          .setTo(DateUtils.instantToTimestamp(to))
          .setState(OperationState.OPERATION_STATE_EXECUTED)
          .build())
      .getOperationsList());
  }

  /**
   * Получение (синхронное) списка отменённых операций по счёту в заданном периоде времени.
   *
   * @param accountId Идентификатор счёта.
   * @param from      Начало периода (по UTC).
   * @param to        Окончание периода (по UTC).
   * @return Список операций.
   */
  @Nonnull
  public List getCancelledOperationsSync(@Nonnull String accountId,
                                                    @Nonnull Instant from,
                                                    @Nonnull Instant to) {
    ValidationUtils.checkFromTo(from, to);

    return Helpers.unaryCall(() -> operationsBlockingStub.getOperations(
        OperationsRequest.newBuilder()
          .setAccountId(accountId)
          .setFrom(DateUtils.instantToTimestamp(from))
          .setTo(DateUtils.instantToTimestamp(to))
          .setState(OperationState.OPERATION_STATE_CANCELED)
          .build())
      .getOperationsList());
  }

  /**
   * Получение (синхронное) списка операций всех типов по счёту в заданном периоде времени в рамках указанного
   * инструмента.
   *
   * @param accountId Идентификатор счёта.
   * @param from      Начало периода (по UTC).
   * @param to        Окончание периода (по UTC).
   * @param figi      FIGI-идентификатор инструмента.
   * @return Список операций.
   */
  @Nonnull
  public List getAllOperationsSync(@Nonnull String accountId,
                                              @Nonnull Instant from,
                                              @Nonnull Instant to,
                                              @Nonnull String figi) {
    ValidationUtils.checkFromTo(from, to);

    return Helpers.unaryCall(() -> operationsBlockingStub.getOperations(
        OperationsRequest.newBuilder()
          .setAccountId(accountId)
          .setFrom(DateUtils.instantToTimestamp(from))
          .setTo(DateUtils.instantToTimestamp(to))
          .setFigi(figi)
          .build())
      .getOperationsList());
  }

  /**
   * Получение (синхронное) списка исполненных операций по счёту в заданном периоде времени в рамках указанного
   * инструмента.
   *
   * @param accountId Идентификатор счёта.
   * @param from      Начало периода (по UTC).
   * @param to        Окончание периода (по UTC).
   * @param figi      FIGI-идентификатор инструмента.
   * @return Список операций.
   */
  @Nonnull
  public List getExecutedOperationsSync(@Nonnull String accountId,
                                                   @Nonnull Instant from,
                                                   @Nonnull Instant to,
                                                   @Nonnull String figi) {
    ValidationUtils.checkFromTo(from, to);

    return Helpers.unaryCall(() -> operationsBlockingStub.getOperations(
        OperationsRequest.newBuilder()
          .setAccountId(accountId)
          .setFrom(DateUtils.instantToTimestamp(from))
          .setTo(DateUtils.instantToTimestamp(to))
          .setState(OperationState.OPERATION_STATE_EXECUTED)
          .setFigi(figi)
          .build())
      .getOperationsList());
  }

  /**
   * Получение (синхронное) списка отменённых операций по счёту
   * в заданном периоде времени в рамках указанного инструмента.
   *
   * @param accountId Идентификатор счёта.
   * @param from      Начало периода (по UTC).
   * @param to        Окончание периода (по UTC).
   * @param figi      FIGI-идентификатор инструмента.
   * @return Список операций.
   */
  @Nonnull
  public List getCancelledOperationsSync(@Nonnull String accountId,
                                                    @Nonnull Instant from,
                                                    @Nonnull Instant to,
                                                    @Nonnull String figi) {
    ValidationUtils.checkFromTo(from, to);

    return Helpers.unaryCall(() -> operationsBlockingStub.getOperations(
        OperationsRequest.newBuilder()
          .setAccountId(accountId)
          .setFrom(DateUtils.instantToTimestamp(from))
          .setTo(DateUtils.instantToTimestamp(to))
          .setState(OperationState.OPERATION_STATE_CANCELED)
          .setFigi(figi)
          .build())
      .getOperationsList());
  }

  /**
   * Получение (синхронное) портфеля по счёту.
   *
   * @param accountId Идентификатор счёта.
   * @return Состояние портфеля.
   */
  @Nonnull
  public Portfolio getPortfolioSync(@Nonnull String accountId) {
    var request = PortfolioRequest.newBuilder().setAccountId(accountId).build();
    return Portfolio.fromResponse(Helpers.unaryCall(() -> operationsBlockingStub.getPortfolio(request)));
  }

  /**
   * Получение (синхронное) списка позиций по счёту.
   *
   * @param accountId Идентификатор счёта.
   * @return Список позиций.
   */
  @Nonnull
  public Positions getPositionsSync(@Nonnull String accountId) {
    var request = PositionsRequest.newBuilder().setAccountId(accountId).build();
    return Positions.fromResponse(Helpers.unaryCall(() -> operationsBlockingStub.getPositions(request)));
  }

  /**
   * Получение (синхронное) доступного остатка для вывода средств.
   *
   * @param accountId Идентификатор счёта.
   * @return Доступного остаток для вывода средств.
   */
  @Nonnull
  public WithdrawLimits getWithdrawLimitsSync(@Nonnull String accountId) {
    var request = WithdrawLimitsRequest.newBuilder().setAccountId(accountId).build();
    return WithdrawLimits.fromResponse(Helpers.unaryCall(() -> operationsBlockingStub.getWithdrawLimits(request)));
  }


  /**
   * Получение (синхронное) данных их справки о доходах за пределами РФ на указанной странице.
   *
   * @param taskId Идентификатор задачи.
   * @param page   Номер страницы (начиная с 0).
   * @return Справка о доходах за пределами РФ.
   */
  public GetDividendsForeignIssuerReportResponse getDividendsForeignIssuerSync(@Nonnull String taskId, int page) {
    ValidationUtils.checkPage(page);
    ValidationUtils.checkSandbox(sandboxMode);

    var request = GetDividendsForeignIssuerRequest.newBuilder()
      .setGetDivForeignIssuerReport(GetDividendsForeignIssuerReportRequest.newBuilder().setTaskId(taskId).setPage(page).build())
      .build();
    return Helpers.unaryCall(() -> operationsBlockingStub.getDividendsForeignIssuer(request).getDivForeignIssuerReport());
  }

  /**
   * Получение (асинхронное) данных их справки о доходах за пределами РФ на указанной странице.
   *
   * @param taskId Идентификатор задачи.
   * @param page   Номер страницы (начиная с 0).
   * @return Справка о доходах за пределами РФ.
   */
  @Nonnull
  public CompletableFuture getDividendsForeignIssuer(@Nonnull String taskId,
                                                                                              int page) {
    ValidationUtils.checkPage(page);
    ValidationUtils.checkSandbox(sandboxMode);

    var request = GetDividendsForeignIssuerRequest.newBuilder()
      .setGetDivForeignIssuerReport(
        GetDividendsForeignIssuerReportRequest.newBuilder().setTaskId(taskId).setPage(page).build())
      .build();
    return Helpers.unaryAsyncCall(
        observer -> operationsStub.getDividendsForeignIssuer(request, observer))
      .thenApply(GetDividendsForeignIssuerResponse::getDivForeignIssuerReport);
  }

  /**
   * Заказ (синхронный) справки о доходах за пределами РФ.
   *
   * @param accountId Идентификатор счёта.
   * @param from      Начало периода (по UTC).
   * @param to        Окончание периода (по UTC).
   * @return Справка о доходах, либо task_id задачи на формирование отчета.
   */
  @Nonnull
  public GetDividendsForeignIssuerResponse getDividendsForeignIssuerSync(@Nonnull String accountId,
                                                                         @Nonnull Instant from,
                                                                         @Nonnull Instant to) {
    ValidationUtils.checkFromTo(from, to);
    ValidationUtils.checkSandbox(sandboxMode);

    var request = GetDividendsForeignIssuerRequest.newBuilder()
      .setGenerateDivForeignIssuerReport(
        GenerateDividendsForeignIssuerReportRequest.newBuilder()
          .setAccountId(accountId)
          .setFrom(DateUtils.instantToTimestamp(from))
          .setTo(DateUtils.instantToTimestamp(to))
          .build())
      .build();
    return Helpers.unaryCall(() -> operationsBlockingStub.getDividendsForeignIssuer(request));
  }

  /**
   * Заказ (асинхронный) справки о доходах за пределами РФ.
   *
   * @param accountId Идентификатор счёта.
   * @param from      Начало периода (по UTC).
   * @param to        Окончание периода (по UTC).
   * @return Справка о доходах, либо task_id задачи на формирование отчета.
   */

  @Nonnull
  public CompletableFuture getDividendsForeignIssuer(@Nonnull String accountId,
                                                                                        @Nonnull Instant from,
                                                                                        @Nonnull Instant to) {
    ValidationUtils.checkFromTo(from, to);
    ValidationUtils.checkSandbox(sandboxMode);

    return Helpers.unaryAsyncCall(
      observer ->
        operationsStub.getDividendsForeignIssuer(GetDividendsForeignIssuerRequest.newBuilder()
          .setGenerateDivForeignIssuerReport(
            GenerateDividendsForeignIssuerReportRequest.newBuilder()
              .setAccountId(accountId)
              .setFrom(DateUtils.instantToTimestamp(from))
              .setTo(DateUtils.instantToTimestamp(to))
              .build())
          .build(), observer));
  }

  /**
   * Получение (асинхронное) списка операций всех типов по счёту в заданном периоде времени.
   *
   * @param accountId Идентификатор счёта.
   * @param from      Начало периода (по UTC).
   * @param to        Окончание периода (по UTC).
   * @return Список операций.
   */
  @Nonnull
  public CompletableFuture> getAllOperations(@Nonnull String accountId,
                                                             @Nonnull Instant from,
                                                             @Nonnull Instant to) {
    ValidationUtils.checkFromTo(from, to);
    var request = OperationsRequest.newBuilder()
      .setAccountId(accountId)
      .setFrom(DateUtils.instantToTimestamp(from))
      .setTo(DateUtils.instantToTimestamp(to))
      .build();
    return Helpers.unaryAsyncCall(
        observer -> operationsStub.getOperations(request, observer))
      .thenApply(OperationsResponse::getOperationsList);
  }

  /**
   * Получение (асинхронное) списка исполненных операций по счёту в заданном периоде времени.
   *
   * @param accountId Идентификатор счёта.
   * @param from      Начало периода (по UTC).
   * @param to        Окончание периода (по UTC).
   * @return Список операций.
   */
  @Nonnull
  public CompletableFuture> getExecutedOperations(@Nonnull String accountId,
                                                                  @Nonnull Instant from,
                                                                  @Nonnull Instant to) {
    ValidationUtils.checkFromTo(from, to);

    return Helpers.unaryAsyncCall(
        observer -> operationsStub.getOperations(
          OperationsRequest.newBuilder()
            .setAccountId(accountId)
            .setFrom(DateUtils.instantToTimestamp(from))
            .setTo(DateUtils.instantToTimestamp(to))
            .setState(OperationState.OPERATION_STATE_EXECUTED)
            .build(),
          observer))
      .thenApply(OperationsResponse::getOperationsList);
  }

  /**
   * Получение (асинхронное) списка отменённых операций по счёту в заданном периоде времени.
   *
   * @param accountId Идентификатор счёта.
   * @param from      Начало периода (по UTC).
   * @param to        Окончание периода (по UTC).
   * @return Список операций.
   */
  @Nonnull
  public CompletableFuture> getCancelledOperations(@Nonnull String accountId,
                                                                   @Nonnull Instant from,
                                                                   @Nonnull Instant to) {
    ValidationUtils.checkFromTo(from, to);

    return Helpers.unaryAsyncCall(
        observer -> operationsStub.getOperations(
          OperationsRequest.newBuilder()
            .setAccountId(accountId)
            .setFrom(DateUtils.instantToTimestamp(from))
            .setTo(DateUtils.instantToTimestamp(to))
            .setState(OperationState.OPERATION_STATE_CANCELED)
            .build(),
          observer))
      .thenApply(OperationsResponse::getOperationsList);
  }

  /**
   * Получение (асинхронное) списка операций всех типов по счёту
   * в заданном периоде времени в рамках указанного инструмента.
   *
   * @param accountId Идентификатор счёта.
   * @param from      Начало периода (по UTC).
   * @param to        Окончание периода (по UTC).
   * @param figi      FIGI-идентификатор инструмента.
   * @return Список операций.
   */
  @Nonnull
  public CompletableFuture> getAllOperations(@Nonnull String accountId,
                                                             @Nonnull Instant from,
                                                             @Nonnull Instant to,
                                                             @Nonnull String figi) {
    ValidationUtils.checkFromTo(from, to);

    return Helpers.unaryAsyncCall(
        observer -> operationsStub.getOperations(
          OperationsRequest.newBuilder()
            .setAccountId(accountId)
            .setFrom(DateUtils.instantToTimestamp(from))
            .setTo(DateUtils.instantToTimestamp(to))
            .setFigi(figi)
            .build(),
          observer))
      .thenApply(OperationsResponse::getOperationsList);
  }

  /**
   * Получение (асинхронное) списка исполненных операций по счёту
   * в заданном периоде времени в рамках указанного инструмента.
   *
   * @param accountId Идентификатор счёта.
   * @param from      Начало периода (по UTC).
   * @param to        Окончание периода (по UTC).
   * @param figi      FIGI-идентификатор инструмента.
   * @return Список операций.
   */
  @Nonnull
  public CompletableFuture> getExecutedOperations(@Nonnull String accountId,
                                                                  @Nonnull Instant from,
                                                                  @Nonnull Instant to,
                                                                  @Nonnull String figi) {
    ValidationUtils.checkFromTo(from, to);

    return Helpers.unaryAsyncCall(
        observer -> operationsStub.getOperations(
          OperationsRequest.newBuilder()
            .setAccountId(accountId)
            .setFrom(DateUtils.instantToTimestamp(from))
            .setTo(DateUtils.instantToTimestamp(to))
            .setState(OperationState.OPERATION_STATE_EXECUTED)
            .setFigi(figi)
            .build(),
          observer))
      .thenApply(OperationsResponse::getOperationsList);
  }

  /**
   * Получение (асинхронное) списка отменённых операций по счёту
   * в заданном периоде времени в рамках указанного инструмента.
   *
   * @param accountId Идентификатор счёта.
   * @param from      Начало периода (по UTC).
   * @param to        Окончание периода (по UTC).
   * @param figi      FIGI-идентификатор инструмента.
   * @return Список операций.
   */
  @Nonnull
  public CompletableFuture> getCancelledOperations(@Nonnull String accountId,
                                                                   @Nonnull Instant from,
                                                                   @Nonnull Instant to,
                                                                   @Nonnull String figi) {
    ValidationUtils.checkFromTo(from, to);

    return Helpers.unaryAsyncCall(
        observer -> operationsStub.getOperations(
          OperationsRequest.newBuilder()
            .setAccountId(accountId)
            .setFrom(DateUtils.instantToTimestamp(from))
            .setTo(DateUtils.instantToTimestamp(to))
            .setState(OperationState.OPERATION_STATE_CANCELED)
            .setFigi(figi)
            .build(),
          observer))
      .thenApply(OperationsResponse::getOperationsList);
  }

  /**
   * Получение (асинхронное) портфеля по счёту.
   *
   * @param accountId Идентификатор счёта.
   * @return Состояние портфеля.
   */
  @Nonnull
  public CompletableFuture getPortfolio(@Nonnull String accountId) {
    var request = PortfolioRequest.newBuilder().setAccountId(accountId).build();
    return Helpers.unaryAsyncCall(
        observer -> operationsStub.getPortfolio(request, observer))
      .thenApply(Portfolio::fromResponse);
  }

  /**
   * Получение (асинхронное) списка позиций по счёту.
   *
   * @param accountId Идентификатор счёта.
   * @return Список позиций.
   */
  @Nonnull
  public CompletableFuture getPositions(@Nonnull String accountId) {
    var request = PositionsRequest.newBuilder().setAccountId(accountId).build();
    return Helpers.unaryAsyncCall(
        observer -> operationsStub.getPositions(request, observer))
      .thenApply(Positions::fromResponse);
  }

  /**
   * Получение (синхронное) доступного остатка для вывода средств.
   *
   * @param accountId Идентификатор счёта.
   * @return Доступного остаток для вывода средств.
   */
  @Nonnull
  public CompletableFuture getWithdrawLimits(@Nonnull String accountId) {
    var request = WithdrawLimitsRequest.newBuilder().setAccountId(accountId).build();
    return Helpers.unaryAsyncCall(
        observer -> operationsStub.getWithdrawLimits(request, observer))
      .thenApply(WithdrawLimits::fromResponse);
  }

  /**
   * Заказ (синхронный) брокерского отчёта.
   *
   * @param accountId Идентификатор счёта.
   * @param from      Начало периода (по UTC).
   * @param to        Окончание периода (по UTC).
   * @return Брокерский отчет, либо task_id задачи на формирование отчета.
   */
  @Nonnull
  public BrokerReportResponse getBrokerReportSync(@Nonnull String accountId,
                                                  @Nonnull Instant from,
                                                  @Nonnull Instant to) {
    ValidationUtils.checkFromTo(from, to);
    ValidationUtils.checkSandbox(sandboxMode);

    var request = BrokerReportRequest.newBuilder()
      .setGenerateBrokerReportRequest(
        GenerateBrokerReportRequest.newBuilder()
          .setAccountId(accountId)
          .setFrom(DateUtils.instantToTimestamp(from))
          .setTo(DateUtils.instantToTimestamp(to))
          .build())
      .build();
    return Helpers.unaryCall(() -> operationsBlockingStub.getBrokerReport(request));
  }

  /**
   * Заказ (асинхронный) брокерского отчёта.
   *
   * @param accountId Идентификатор счёта.
   * @param from      Начало периода (по UTC).
   * @param to        Окончание периода (по UTC).
   * @return Брокерский отчет, либо task_id задачи на формирование отчета.
   */
  @Nonnull
  public CompletableFuture getBrokerReport(@Nonnull String accountId,
                                                                 @Nonnull Instant from,
                                                                 @Nonnull Instant to) {
    ValidationUtils.checkFromTo(from, to);
    ValidationUtils.checkSandbox(sandboxMode);

    var request = BrokerReportRequest.newBuilder()
      .setGenerateBrokerReportRequest(
        GenerateBrokerReportRequest.newBuilder()
          .setAccountId(accountId)
          .setFrom(DateUtils.instantToTimestamp(from))
          .setTo(DateUtils.instantToTimestamp(to))
          .build())
      .build();
    return Helpers.unaryAsyncCall(observer -> operationsStub.getBrokerReport(request, observer));
  }

  /**
   * Получение (асинхронное) данных их брокерского отчёта на указанной странице.
   *
   * @param taskId Идентификатор задачи.
   * @param page   Номер страницы (начиная с 0).
   * @return Брокерский отчёт.
   */
  @Nonnull
  public CompletableFuture getBrokerReport(@Nonnull String taskId, int page) {
    ValidationUtils.checkPage(page);
    ValidationUtils.checkSandbox(sandboxMode);

    var request = BrokerReportRequest.newBuilder()
      .setGetBrokerReportRequest(GetBrokerReportRequest.newBuilder().setTaskId(taskId).setPage(page).build())
      .build();
    return Helpers.unaryAsyncCall(
        observer -> operationsStub.getBrokerReport(request, observer))
      .thenApply(BrokerReportResponse::getGetBrokerReportResponse);
  }


  /**
   * Получение (синхронное) данных их брокерского отчёта на указанной странице.
   *
   * @param taskId Идентификатор задачи.
   * @param page   Номер страницы (начиная с 0).
   * @return Брокерский отчёт.
   */
  @Nonnull
  public GetBrokerReportResponse getBrokerReportSync(@Nonnull String taskId, int page) {
    ValidationUtils.checkPage(page);
    ValidationUtils.checkSandbox(sandboxMode);

    var request = BrokerReportRequest.newBuilder()
      .setGetBrokerReportRequest(GetBrokerReportRequest.newBuilder().setTaskId(taskId).setPage(page).build())
      .build();
    return Helpers.unaryCall(() -> operationsBlockingStub.getBrokerReport(request).getGetBrokerReportResponse());
  }

  /** Получение (синхронное) списка операций по счёту с пагинацией.
   *
   * @param accountId Идентификатор счёта клиента
   * @param from Начало периода (по UTC)
   * @param to Окончание периода (по UTC)
   * @param cursor Идентификатор элемента, с которого начать формировать ответ
   * @param limit Лимит количества операций
   * @param operationState Статус запрашиваемых операций, возможные значения
   * @param instrumentId Идентификатор инструмента (Figi инструмента или uid инструмента)
   * @param withoutCommission Флаг возвращать ли комиссии, по умолчанию false
   * @param withoutTrades Флаг ответ без сделок, по умолчанию false
   * @param withoutOvernights Флаг не показывать overnight операций, по умолчанию false
   * @param operationTypes Тип операции. Принимает значение из списка
   * @return Список операций по счёту с пагинацией
   */
  @Nonnull
  public GetOperationsByCursorResponse getOperationByCursorSync(@Nonnull String accountId,
                                                                @Nonnull Instant from,
                                                                @Nonnull Instant to,
                                                                @Nullable String cursor,
                                                                @Nullable Integer limit,
                                                                @Nullable OperationState operationState,
                                                                @Nullable String instrumentId,
                                                                @Nullable Boolean withoutCommission,
                                                                @Nullable Boolean withoutTrades,
                                                                @Nullable Boolean withoutOvernights,
                                                                @Nullable List operationTypes
                                                          ) {
    ValidationUtils.checkSandbox(sandboxMode);

    var request = GetOperationsByCursorRequest.newBuilder()
      .setAccountId(accountId)
      .setFrom(DateUtils.instantToTimestamp(from))
      .setTo(DateUtils.instantToTimestamp(to))
      .setCursor(cursor == null ? "" : cursor)
      .setLimit(limit == null ? 0 : limit)
      .setState(operationState == null ? OperationState.OPERATION_STATE_UNSPECIFIED : operationState)
      .setInstrumentId(instrumentId == null ? "" : instrumentId)
      .setWithoutCommissions(withoutCommission != null && withoutCommission)
      .setWithoutOvernights(withoutOvernights != null && withoutOvernights)
      .setWithoutTrades(withoutTrades != null && withoutTrades)
      .addAllOperationTypes(operationTypes == null ? Collections.emptyList() : operationTypes)
      .build();
    return Helpers.unaryCall(() -> operationsBlockingStub.getOperationsByCursor(request));
  }

  /** Получение (синхронное) списка операций по счёту с пагинацией.
   *
   * @param accountId Идентификатор счёта клиента
   * @param from Начало периода (по UTC)
   * @param to Окончание периода (по UTC)
   * @return Список операций по счёту с пагинацией
   */
  @Nonnull
  public GetOperationsByCursorResponse getOperationByCursorSync(@Nonnull String accountId,
                                                                @Nonnull Instant from,
                                                                @Nonnull Instant to
  ) {
    return getOperationByCursorSync(accountId, from, to, null, null, null, null,
      false, false, false, null);
  }

  /** Получение (асинхронное) списка операций по счёту с пагинацией.
   *
   * @param accountId Идентификатор счёта клиента
   * @param from Начало периода (по UTC)
   * @param to Окончание периода (по UTC)
   * @param cursor Идентификатор элемента, с которого начать формировать ответ
   * @param limit Лимит количества операций
   * @param operationState Статус запрашиваемых операций, возможные значения
   * @param instrumentId Идентификатор инструмента (Figi инструмента или uid инструмента)
   * @param withoutCommission Флаг возвращать ли комиссии, по умолчанию false
   * @param withoutTrades Флаг ответ без сделок, по умолчанию false
   * @param withoutOvernights Флаг не показывать overnight операций, по умолчанию false
   * @param operationTypes Тип операции. Принимает значение из списка
   * @return Список операций по счёту с пагинацией
   */
  @Nonnull
  public CompletableFuture getOperationByCursor (@Nonnull String accountId,
                                                                                @Nonnull Instant from,
                                                                                @Nonnull Instant to,
                                                                                @Nullable String cursor,
                                                                                @Nullable Integer limit,
                                                                                @Nullable OperationState operationState,
                                                                                @Nullable String instrumentId,
                                                                                @Nullable Boolean withoutCommission,
                                                                                @Nullable Boolean withoutTrades,
                                                                                @Nullable Boolean withoutOvernights,
                                                                                @Nullable List operationTypes) {
    ValidationUtils.checkSandbox(sandboxMode);

    var request = GetOperationsByCursorRequest.newBuilder()
      .setAccountId(accountId)
      .setFrom(DateUtils.instantToTimestamp(from))
      .setTo(DateUtils.instantToTimestamp(to))
      .setCursor(cursor == null ? "" : cursor)
      .setLimit(limit == null ? 0 : limit)
      .setState(operationState == null ? OperationState.OPERATION_STATE_UNSPECIFIED : operationState)
      .setInstrumentId(instrumentId == null ? "" : instrumentId)
      .setWithoutCommissions(withoutCommission != null && withoutCommission)
      .setWithoutOvernights(withoutOvernights != null && withoutOvernights)
      .setWithoutTrades(withoutTrades != null && withoutTrades)
      .addAllOperationTypes(operationTypes == null ? Collections.emptyList() : operationTypes)
      .build();
    return Helpers.unaryAsyncCall(
        observer -> operationsStub.getOperationsByCursor(request, observer));
  }

  /** Получение (асинхронное) списка операций по счёту с пагинацией.
   *
   * @param accountId Идентификатор счёта клиента
   * @param from Начало периода (по UTC)
   * @param to Окончание периода (по UTC)
   * @return Список операций по счёту с пагинацией
   */
  @Nonnull
  public CompletableFuture getOperationByCursor(@Nonnull String accountId,
                                                                               @Nonnull Instant from,
                                                                               @Nonnull Instant to
  ) {
    return getOperationByCursor(accountId, from, to, null, null, null, null,
      false, false, false, null);
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy