Offline Transactions {#pax-aio-pymnt-txn-offline-intro}
=======================================================

Use this information to process offline sale or refund transactions when internet connectivity is unavailable.
Using offline transaction functionality involves risk. Because these transactions are not authorized in real time, you assume responsibility for potential issues such as failed transactions, increased fraud, and higher chargeback rates. Only use offline transactions when necessary such as during temporary internet outages. Whenever possible, it is recommended to process online sale transactions to ensure secure and immediate authorization. For more information, see [Sale](/docs/cybs/en-us/pax-all-in-one/integration/all/na/pax-all-in-one/pax-aio-payment-txn-intro/pax-aio-payment-txn-sale-task.md "").  
Review these considerations before performing offline transactions:

* Contactless transactions are not supported for offline sales.
* A terminal must have successfully processed at least one online transaction before it can perform offline transactions.
* Offline transactions must be submitted for authorization once internet connectivity is restored. For more information, see [Submit an Offline Transactions Batch for Authorization](/docs/cybs/en-us/pax-all-in-one/integration/all/na/pax-all-in-one/pax-aio-payment-txn-intro/pax-aio-pymnt-txn-offline-intro/pax-aio-pymnt-txn-offline-submit-batch-auth.md "").
  {#pax-aio-pymnt-txn-offline-intro_ul_vs4_5q3_1bc}

Process an Offline Sale {#pax-aio-pymnt-txn-offline-sale}
=========================================================

Use this information to process an offline sale. This transaction is also called a *deferred authorization* or *store-and-forward* transaction.
Offline sales can be performed only on terminals that have successfully processed at least one online transaction.  
When internet connectivity is unavailable, an offline sale enables you to capture transaction details locally. These stored transactions must be submitted for authorization when connectivity is restored. For more information, see [Submit an Offline Transactions Batch for Authorization](/docs/cybs/en-us/pax-all-in-one/integration/all/na/pax-all-in-one/pax-aio-payment-txn-intro/pax-aio-pymnt-txn-offline-intro/pax-aio-pymnt-txn-offline-submit-batch-auth.md "").
Only process offline sales when required. The recommendation is to process online sale transactions whenever possible. For more information, see [Sale](/docs/cybs/en-us/pax-all-in-one/integration/all/na/pax-all-in-one/pax-aio-payment-txn-intro/pax-aio-payment-txn-sale-task.md "").  
Follow these steps to process an offline sale.

1. Create a `TransactionParameters` object and provide the required information for the payment.

2. Retrieve the `transactionIntent` variable from the `mposUi` object and use the `startActivity` method to initiate the transaction flow.

   ```
   // Use this to configure the maximum amount per offline transaction and maximum amount for an offline batch.
   // MposUI.offlineModule.offlineTransactionConfiguration = OfflineTransactionConfiguration(
   //            maximumAmountPerTransaction = BigDecimal("100.00"),
   //            maximumTotalAmountForBatch = BigDecimal("1000.00")
   //        )


   val transactionParameters = TransactionParameters.Builder()
               .charge(BigDecimal("1.00"), Currency.EUR)    
               .customIdentifier("yourReferenceForTheTransaction")
               .build()

   val transactionIntent = mposUi.offlineModule.createTransactionIntent(transactionParameters)
   startActivityForResult(transactionIntent, MposUi.REQUEST_CODE_PAYMENT)
   ```
3. After the transaction is complete and the Summary screen is dismissed, the `onActivityResult` method is triggered. This action returns information about the last transaction.

   ```
   override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) 
   {
       super.onActivityResult(requestCode, resultCode, data)
    
       if (requestCode == MposUi.REQUEST_CODE_PAYMENT) {
           when (resultCode) {
               // Result code from a successful transaction
               MposUi.RESULT_CODE_APPROVED -&gt; {
                  val transactionIdentifier = data?.getStringExtra(MposUi.RESULT_EXTRA_TRANSACTION_IDENTIFIER)
                  Toast.makeText(findViewById(android.R.id.content),"Transaction approved!\nIdentifier: $transactionIdentifier", Toast.LENGTH_LONG).show()
               }
               // Result code from a declined, aborted or failed transaction
               MposUi.RESULT_CODE_FAILED -&gt; {
                  Toast.makeText(findViewById(android.R.id.content), "Transaction was declined, aborted, or failed", Toast.LENGTH_LONG).show()
               }
           }
       }
   }
   ```

Refund an Offline Sale Pending Submission {#pax-aio-pymnt-txn-offline-sale-refund-pend}
=======================================================================================

Use this information to process a refund for an offline sale before it is submitted for authorization.  
Follow these steps to refund an offline sale pending submission.

1. Create a `TransactionParameters` object and provide the required information for the payment.

2. Retrieve the `transactionIntent` variable from the `mposUi` object and use the `startActivity` method to initiate the transaction flow.

   ```
   val transactionParameters = TransactionParameters.Builder() 
               .refund("transactionIdentifier") 
               .build() 

   val transactionIntent = mposUi.offlineModule.createTransactionIntent(transactionParameters) 
   startActivityForResult(transactionIntent, MposUi.REQUEST_CODE_PAYMENT)
   ```
3. After the transaction is complete and the Summary screen is dismissed, the `onActivityResult` method is triggered. This action returns information about the last transaction.

   ```
   override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) 
   {
       super.onActivityResult(requestCode, resultCode, data)
    
       if (requestCode == MposUi.REQUEST_CODE_PAYMENT) {
           when (resultCode) {
               // Result code from a successful transaction
               MposUi.RESULT_CODE_APPROVED -&gt; {
                  val transactionIdentifier = data?.getStringExtra(MposUi.RESULT_EXTRA_TRANSACTION_IDENTIFIER)
                  Toast.makeText(findViewById(android.R.id.content),"Transaction approved!\nIdentifier: $transactionIdentifier", Toast.LENGTH_LONG).show()
               }
               // Result code from a declined, aborted or failed transaction
               MposUi.RESULT_CODE_FAILED -&gt; {
                  Toast.makeText(findViewById(android.R.id.content), "Transaction was declined, aborted, or failed", Toast.LENGTH_LONG).show()
               }
           }
       }
   }
   ```

Request a Check Transaction Status for an Offline Sale Pending Submission {#pax-aio-pymnt-txn-offline-check-status-sale-pend}
=============================================================================================================================

Use this information to request a check transaction status for a single offline sale transaction before it is submitted for authorization. The transaction status shows on the Summary screen.  
Follow these steps to request a check transaction status for an offline sale pending submission.

1. Access the `transactionIdentifier` value in the `onActivityResult` method of the original transaction.

2. Retrieve the transaction `summaryIntent` value from the `mposUi` object.

3. Use the `startActivity` method to initiate the Summary screen.

   ```
   val summaryIntent = mposUi.offlineModule.createTransactionSummaryIntent(transactionIdentifier = "transactionIdentifier")
   startActivityForResult(summaryIntent, MposUi.REQUEST_CODE_SHOW_SUMMARY)
   ```
4. After the Summary screen is dismissed, the `onActivityResult` is triggered. This action returns information about the previous transaction.

   ```
   override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) 
   {
       super.onActivityResult(requestCode, resultCode, data)
       if (requestCode == MposUi.REQUEST_CODE_SHOW_SUMMARY) {
           when (resultCode) {
               // Result code from a successful transaction
               MposUi.RESULT_CODE_APPROVED -&gt; {
                  val transactionIdentifier = data?.getStringExtra(MposUi.RESULT_EXTRA_TRANSACTION_IDENTIFIER)
                  Toast.makeText(findViewById(android.R.id.content),"Transaction approved!\nIdentifier: $transactionIdentifier", Toast.LENGTH_LONG).show()
               }
               // Result code from a declined, aborted or failed transaction
               MposUi.RESULT_CODE_FAILED -&gt; {
                  Toast.makeText(findViewById(android.R.id.content), "Transaction was declined, aborted, or failed", Toast.LENGTH_LONG).show()
               }
           }
       }
   }
   ```

Retrieve a List of Offline Transactions Pending Submission {#pax-aio-pymnt-txn-offline-retrieve-txns-pend}
==========================================================================================================

Use this information to retrieve a list of stored offline transactions before they are submitted for authorization.  
Follow this step to retrieve a list of offline transactions pending submission:

1. Use the `queryTransactions` function from the `mposUi` object to retrieve the list.

   ```
   mposUi.offlineModule.queryTransactions(
                       filterParameters = FilterParameters.Builder().build(),
                       includeReceipts = false,
                       offset = 0,
                       limit = 20
                   ) { _, _, _, _, transactions, mposError -&gt;
                       if (transactions != null && transactions.isNotEmpty()) {
                           // Handle Success scenario
                       } else {
                           // Handle Error Scenario
                       }
                   }
   ```

Submit an Offline Transactions Batch for Authorization {#pax-aio-pymnt-txn-offline-submit-batch-auth}
=====================================================================================================

Use this information to submit an offline transactions batch for authorization. After processing offline sale transactions, you must submit these transactions for authorization. The recommendation is to submit the batch as soon as internet connectivity is available.  
Follow these steps to submit an offline transactions batch for authorization.

1. Retrieve the `batchSubmissionIntent` from the `mposUi` object.

2. Use the `startActivity` method to initiate the offline transactions batch submission.

   ```
   val batchSubmissionIntent = mposUi.offlineModule.submitOfflineTransactionBatchIntent()
   startActivityForResult(batchSubmissionIntent, MposUi.REQUEST_CODE_SUBMIT_BATCH)
   ```
3. After the batch submission result is dismissed, the `onActivityResult` is triggered. This action returns information about the last batch submission.

   ```
   override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
   {
       super.onActivityResult(requestCode, resultCode, data)
     
       if (requestCode == MposUi.REQUEST_CODE_SUBMIT_BATCH) {
           when (resultCode) {
               // Result code from a successful batch submission
               MposUi.RESULT_CODE_SUBMIT_BATCH_SUCCESS -&gt; {
                  Toast.makeText(findViewById(android.R.id.content),"Batch submission successful", Toast.LENGTH_LONG).show()
               }
               // Result code from a failed batch submission
               MposUi.RESULT_CODE_SUBMIT_BATCH_FAILED -&gt; {
                  Toast.makeText(findViewById(android.R.id.content),"Batch submission failed", Toast.LENGTH_LONG).show()
               }
           }
       }
   }
   ```

