> For the complete documentation index, see [llms.txt](https://docs.verifone.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.verifone.com/psdk-latest/psdk-user-guide-and-training/psdk-user-guide/reports.md).

# Reports

The [ReportManager](https://docs.verifone.com/psdk-api-latest/android-java/index/reportmanager) provides the APIs for reports as well as searching for transactions using a [TransactionQuery](https://docs.verifone.com/psdk-api-latest/android-java/index/transactionquery). Not all regions and host integrations support all of the APIs, so it is critical to check the capability before calling the APIs, or handling the matching error event properly. Unless noted specifically, the methods only require the current state to be [TransactionManager.STATE\_LOGGED\_IN ](https://docs.verifone.com/psdk-api-latest/android-java/index/transactionmanager)(see [PSDK State Transitions](/psdk-latest/reference-material/code-labs/getting-started.md#payment-device-state)).

## Is Capable? <a href="#id2" id="id2"></a>

The [ReportManager.isCapable(String) ](https://docs.verifone.com/psdk-api-latest/android-java/index/reportmanager#iscapable-string)method allows the calling application to check if the current Payment App or Payment Host are able to perform a specific operation. This call is one of the few that returns synchronously (see[ All calls are asynchronous (except a few)](/psdk-latest/psdk-user-guide-and-training/psdk-user-guide/pos_guide.md#all-calls-are-asynchronous-except-a-few)), and it can be sent in any state (see [PSDK State Transitions](/psdk-latest/reference-material/code-labs/getting-started.md#payment-device-state)).

See also

* [ReportManager.GET\_ACTIVE\_TOTALS\_CAPABILITY](https://docs.verifone.com/psdk-api-latest/android-java/index/reportmanager)
* [ReportManager.GET\_GROUP\_TOTALS\_CAPABILITY](https://docs.verifone.com/psdk-api-latest/android-java/index/reportmanager)
* [ReportManager.CLOSE\_PERIOD\_CAPABILITY](https://docs.verifone.com/psdk-api-latest/android-java/index/reportmanager)
* [ReportManager.TERMINAL\_RECONCILIATION\_CAPABILITY](https://docs.verifone.com/psdk-api-latest/android-java/index/reportmanager)
* [ReportManager.ACQUIRER\_RECONCILIATION\_CAPABILITY](https://docs.verifone.com/psdk-api-latest/android-java/index/reportmanager)
* [ReportManager.PREVIOUS\_RECONCILIATION\_CAPABILITY](https://docs.verifone.com/psdk-api-latest/android-java/index/reportmanager)
* [ReportManager.TRANSACTION\_QUERY\_CAPABILITY](https://docs.verifone.com/psdk-api-latest/android-java/index/reportmanager)
* [ReportManager.TOTALS\_GROUP\_ID\_CAPABILITY](https://docs.verifone.com/psdk-api-latest/android-java/index/reportmanager)
* [ReportManager.CLOSE\_PERIOD\_AND\_RECONCILE\_CAPABILITY](https://docs.verifone.com/psdk-api-latest/android-java/index/reportmanager)
* [ReportManager.GET\_PREVIOUS\_RECONCILIATION\_CAPABILITY](https://docs.verifone.com/psdk-api-latest/android-java/index/reportmanager)
* [ReportManager.RECONCILIATION\_LIST\_CAPABILITY](https://docs.verifone.com/psdk-api-latest/android-java/index/reportmanager)
* [ReportManager.RECONCILIATION\_REPORT\_CAPABILITY](https://docs.verifone.com/psdk-api-latest/android-java/index/reportmanager)
* [TransactionQuery.TRANSACTION\_QUERY\_FILTER\_FIELDS\_CAPABILITY](https://docs.verifone.com/psdk-api-latest/android-java/index/transactionquery)
* [TransactionQuery.TRANSACTION\_QUERY\_PAYMENT\_ID\_BOUNDS\_CAPABILITY](https://docs.verifone.com/psdk-api-latest/android-java/index/transactionquery)
* [TransactionQuery.TRANSACTION\_QUERY\_BY\_PAYMENT\_CAPABILITY](https://docs.verifone.com/psdk-api-latest/android-java/index/transactionquery)

### The Reconciliation Event

The [ReconciliationEvent](https://docs.verifone.com/psdk-api-latest/android-java/index/reconciliationevent) is the most important component to the reports. It contains list of [ReconciliationTotal](https://docs.verifone.com/psdk-api-latest/android-java/index/reconciliationtotal) objects, providing a summary report grouped by the transaction type (such as PAYMENT, REFUND, etc.), payment type (such as Credit, Cash, etc.), and the status (success or failed). Similar to other status objects, if the status is non-zero, an error occurred for that group, and a message is available that can be displayed to the cashier or included on a printed report to provide more details.

In some cases, this event also contains an ID (ReconciliationTotal.getReconciliationId()), useful for retrieving the result again later (ReconciliationTotal.getPreviousReconciliation(String)), and a [Receipt](https://docs.verifone.com/psdk-api-latest/android-java/index/receipt) that is directly printable (see [Print Receipt](/psdk-latest/psdk-user-guide-and-training/psdk-user-guide/payment_functions/semi-integrated-payments/performing-a-sale.md#print-receipt)).

{% hint style="info" %}
**Note:** It is possible to receive a successful reconciliation event without totals, ID, or Report. In this case, another call will be necessary to print the settlement report if capable, otherwise the current payment app / host integration simply does not support generating reports for settlement/end-of-day.
{% endhint %}

### Querying Transactions

To perform [ReportManager.queryTransactions(query)](https://docs.verifone.com/psdk-api-latest/android-java/index/reportmanager#querytransactions-transactionquery), a [TransactionQuery](https://docs.verifone.com/psdk-api-latest/android-java/index/transactionquery) must be created. There are many different options to search and filter the results, most of which are covered in the documentation of the class itself, but a couple of which ought to be described further here.

By default, the query will only return transactions for the POS making the query. To return transactions performed by all POS systems connecting to the payment terminal, use [TransactionQuery.setAllPos(bool)](https://docs.verifone.com/psdk-api-latest/android-java/index/transactionquery#setallpos-boolean).

#### Query Pending Store and Forward (SAF) Transactions

To query pending Store and Forward (SAF) transactions, the transaction query must be marked as offline via [TransactionQuery.setOffline(bool).](https://docs.verifone.com/psdk-api-latest/android-java/index/transactionquery#setoffline-boolean) This setting solicits the reporting of all transactions which were ever offline, not just those that are currently offline. It is typically useful to specify a starting time for which the offline transactions are reported via [TransactionQuery.setStartTime(…)](https://docs.verifone.com/psdk-api-latest/android-java/index/transactionquery#setstarttime-long). A command is also available to specify the ending time for the report via [TransactionQuery.setEndTime(…)](https://docs.verifone.com/psdk-api-latest/android-java/index/transactionquery#setendtime-long), however this is rarely used, in order to report transactions up until the present.

{% tabs fullWidth="false" %}
{% tab title="Java" %}
{% code lineNumbers="true" fullWidth="true" %}

```java
TransactionQuery query = TransactionQuery.create();
query.setOffline(true);
query.setStartTime(1589302704000);
transactionManager.getReportManager().queryTransactions(query);
// Listener receives the TransactionQueryEvent.
```

{% endcode %}
{% endtab %}

{% tab title="Kotlin" %}
{% code lineNumbers="true" %}

```kotlin
 val query = TransactionQuery.create().apply {
    offline = true
    startTime = 1589302704000
}
transactionManager?.reportManager?.queryTransactions(query) ?: // handle error
// Listener receives the TransactionQueryEvent.
```

{% endcode %}
{% endtab %}

{% tab title="Swift" %}
{% code lineNumbers="true" %}

```swift
var query = VFITransactionQuery.create()
query?.setOffline(true)
query?.setStartTime(1589302704000)
sdk.getTransactionManager()?.getReport()?.queryTransactions(query)
// Listener receives the TransactionQueryEvent.
```

{% endcode %}
{% endtab %}

{% tab title="C#" %}

<pre class="language-csharp" data-line-numbers data-full-width="true"><code class="lang-csharp"><strong> var query = new TransactionQuery();
</strong>query.Offline = true;
query.StartTime = 1589302704000;
payment_sdk_.TransactionManager.ReportManager.QueryTransactions(query);
// Listener receives the TransactionQueryEvent.
</code></pre>

{% endtab %}

{% tab title="C++" %}
{% code lineNumbers="true" %}

```cpp
auto query = verifone_sdk::Query::create();
query->setOffLine(true);
query->setStartTime(1589302704000);
psdk->getTransactionManager()->getReportManager()->queryTransactions(query);
// Listener receives the TransactionQueryEvent.
```

{% endcode %}
{% endtab %}

{% tab title=".NET" %}
{% code lineNumbers="true" %}

```aspnet
var query = TransactionQuery.Create();
query.IsOffline = true;
query.StartTime = 1589302704000;
payment_sdk_.TransactionManager.ReportManager.QueryTransactions(query);
// Listener receives the TransactionQueryEvent.
```

{% endcode %}
{% endtab %}
{% endtabs %}

#### Searching using Payments

This is primarily useful when [Payment.getAuthResult() ](https://docs.verifone.com/psdk-api-latest/android-java/index/payment#getauthresult)returns [AuthorizationResult.AUTHORIZED\_OFFLINE,](https://docs.verifone.com/psdk-api-latest/android-java/index/authorizationresult) but can be helpful for other scenarios as well. These payment objects only need to contain the App Specific Data from the original payment, none of the other fields need to be populated. See linking-payments for more information on creating new payments that include this information.

#### Pagination/Range

The transaction query supports setting a [TransactionQuery.setLimit(int) ](https://docs.verifone.com/psdk-api-latest/android-java/index/transactionquery#setlimit-integer)and an [TransactionQuery.setOffset(int)](https://docs.verifone.com/psdk-api-latest/android-java/index/transactionquery#setoffset-integer). The ordering is determined by the Payment App or the Host, and is not configurable. The other way to paginate is to [TransactionQuery.setStartTime(…)](https://docs.verifone.com/psdk-api-latest/android-java/index/transactionquery#setstarttime-long) and [TransactionQuery.setEndTime(…)](https://docs.verifone.com/psdk-api-latest/android-java/index/transactionquery#setendtime-long), or the other similar start/end fields, and then send multiple queries. The limit and offset are not always supported by the Host, but it is globally supported to specify the time range and the payment ID range.

***

{% columns %}
{% column width="25%" %}

<figure><img src="/files/9ezXRridnCaI1awLr3X9" alt="" width="150"><figcaption></figcaption></figure>
{% endcolumn %}

{% column width="25%" %}

{% endcolumn %}

{% column width="16.66666666666666%" %}
**Version:**\
**Date:**
{% endcolumn %}

{% column width="33.333333333333336%" %} <code class="expression">space.vars.psdk\_version</code>\ <code class="expression">space.vars.psdk\_date</code>
{% endcolumn %}
{% endcolumns %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.verifone.com/psdk-latest/psdk-user-guide-and-training/psdk-user-guide/reports.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
