From ef374eeb378b0b5302fee749eab83da32e4fcf11 Mon Sep 17 00:00:00 2001 From: hgaldino Date: Mon, 12 Aug 2024 13:52:05 -0300 Subject: [PATCH 01/34] 1 --- guides/mp-point-main-apps/distribution.en.md | 6 +++++- guides/mp-point-main-apps/distribution.es.md | 6 +++++- guides/mp-point-main-apps/distribution.pt.md | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/guides/mp-point-main-apps/distribution.en.md b/guides/mp-point-main-apps/distribution.en.md index 8409467b9f..182570ce52 100644 --- a/guides/mp-point-main-apps/distribution.en.md +++ b/guides/mp-point-main-apps/distribution.en.md @@ -7,9 +7,13 @@ For the distribution phase of your solution, follow these steps: 3. To upload your solution to the Mercado Pago ecosystem, guaranteeing the security of the application and its subsequent versions, digitally sign the certificate. This document must be the same for both the initial package and each update. Android provides a [step-by-step guide on how to digitally sign your app](https://developer.android.com/studio/publish/app-signing#generate-key) with the certificate generated by the developer. 4. Share the **.apk** package with the Mercado Pago support team. They will carry out a series of validations and notify the integrator company of the result. +> NOTE +> +> Note +> > **The Mercado Pago support team is responsible for facilitating the following operations:** >

> - Delivery of new versions.
> - Pre-configuration of devices.
> - UX and security validations.
-> - Distribution of native APKs.
\ No newline at end of file +> - Distribution of native APKs.
\ No newline at end of file diff --git a/guides/mp-point-main-apps/distribution.es.md b/guides/mp-point-main-apps/distribution.es.md index d77b537dfd..fb12775e46 100644 --- a/guides/mp-point-main-apps/distribution.es.md +++ b/guides/mp-point-main-apps/distribution.es.md @@ -7,9 +7,13 @@ Para la fase de distribución de tu solución, sigue estas etapas: 3. Para subir tu solución al ecosistema de Mercado Pago, garantizando la seguridad de la app y de tus posteriores versiones, suscribe al certificado de manera digital. Este documento debe ser el mismo tanto para el paquete inicial, como para cada una de las actualizaciones. Android disponibiliza [un paso a paso de cómo suscribir digitalmente la app](https://developer.android.com/studio/publish/app-signing?hl=es-419#generate-key), con el certificado generado por la persona desarrolladora. 4. Comparte el paquete **.apk**` com el equipo de soporte de Mercado Pago, que hará una serie de validaciones y avisará a la empresa integradora del resultado. +> NOTE +> +> Nota +> > **El equipo de soporte de Mercado Pago es responsable de facilitar las siguientes operaciones:** >

> - Entrega de nuevas versiones.
> - Pre-configuración de los dispositivos.
> - Validaciones de UX y Seguridad.
-> - Distribución de los APKs nativos. \ No newline at end of file +> - Distribución de los APKs nativos. \ No newline at end of file diff --git a/guides/mp-point-main-apps/distribution.pt.md b/guides/mp-point-main-apps/distribution.pt.md index 92b325199e..02546a2038 100644 --- a/guides/mp-point-main-apps/distribution.pt.md +++ b/guides/mp-point-main-apps/distribution.pt.md @@ -7,9 +7,13 @@ Para a fase de distribuição da sua solução, siga estas etapas: 3. Para subir sua solução ao ecossistema do Mercado Pago, garantindo a segurança do aplicativo e de suas posteriores versões, faça a assinatura digital do certificado. Este documento deve ser o mesmo tanto para o pacote inicial, como para cada uma das atualizações. O Android disponibiliza [um passo a passo de como assinar o app digitalmente](https://developer.android.com/studio/publish/app-signing?hl=pt-br#generate-key), com o certificado gerado pela pessoa desenvolvedora. 4. Compartilhe o pacote **.apk** com a equipe de suporte do Mercado Pago. Ela fará uma série de validações e notificará a empresa integradora sobre o resultado. +> NOTE +> +> Nota +> > **A equipe de suporte do Mercado Pago é responsável por facilitar as seguintes operações:** >

> - Entrega de novas versões.
> - Pré-configuração dos dispositivos.
> - Validações de UX e segurança.
-> - Distribuição dos APKs nativos.
\ No newline at end of file +> - Distribuição dos APKs nativos.
\ No newline at end of file From 687f004221b819f237907395e9547880368652e8 Mon Sep 17 00:00:00 2001 From: hgaldino Date: Mon, 12 Aug 2024 14:30:37 -0300 Subject: [PATCH 02/34] 2 --- guides/mp-point-main-apps/get-list-installments.en.md | 0 guides/mp-point-main-apps/get-list-installments.es.md | 0 guides/mp-point-main-apps/get-list-installments.pt.md | 0 guides/mp-point-main-apps/get-payment-methods.en.md | 0 guides/mp-point-main-apps/get-payment-methods.es.md | 0 guides/mp-point-main-apps/get-payment-methods.pt.md | 0 guides/mp-point-main-apps/start-payment-flow.en.md | 0 guides/mp-point-main-apps/start-payment-flow.es.md | 0 guides/mp-point-main-apps/start-payment-flow.pt.md | 0 9 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 guides/mp-point-main-apps/get-list-installments.en.md create mode 100644 guides/mp-point-main-apps/get-list-installments.es.md create mode 100644 guides/mp-point-main-apps/get-list-installments.pt.md create mode 100644 guides/mp-point-main-apps/get-payment-methods.en.md create mode 100644 guides/mp-point-main-apps/get-payment-methods.es.md create mode 100644 guides/mp-point-main-apps/get-payment-methods.pt.md create mode 100644 guides/mp-point-main-apps/start-payment-flow.en.md create mode 100644 guides/mp-point-main-apps/start-payment-flow.es.md create mode 100644 guides/mp-point-main-apps/start-payment-flow.pt.md diff --git a/guides/mp-point-main-apps/get-list-installments.en.md b/guides/mp-point-main-apps/get-list-installments.en.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/guides/mp-point-main-apps/get-list-installments.es.md b/guides/mp-point-main-apps/get-list-installments.es.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/guides/mp-point-main-apps/get-list-installments.pt.md b/guides/mp-point-main-apps/get-list-installments.pt.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/guides/mp-point-main-apps/get-payment-methods.en.md b/guides/mp-point-main-apps/get-payment-methods.en.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/guides/mp-point-main-apps/get-payment-methods.es.md b/guides/mp-point-main-apps/get-payment-methods.es.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/guides/mp-point-main-apps/get-payment-methods.pt.md b/guides/mp-point-main-apps/get-payment-methods.pt.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/guides/mp-point-main-apps/start-payment-flow.en.md b/guides/mp-point-main-apps/start-payment-flow.en.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/guides/mp-point-main-apps/start-payment-flow.es.md b/guides/mp-point-main-apps/start-payment-flow.es.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/guides/mp-point-main-apps/start-payment-flow.pt.md b/guides/mp-point-main-apps/start-payment-flow.pt.md new file mode 100644 index 0000000000..e69de29bb2 From a7e6d013f7d5cbff3d15c0cf91af87dc1403a8b7 Mon Sep 17 00:00:00 2001 From: hgaldino Date: Sat, 17 Aug 2024 05:41:39 -0300 Subject: [PATCH 03/34] 5 --- .../get-list-installments.en.md | 54 +++++ .../get-list-installments.es.md | 105 +++++++++ .../get-list-installments.pt.md | 54 +++++ .../get-payment-methods.en.md | 27 +++ .../get-payment-methods.es.md | 27 +++ .../get-payment-methods.pt.md | 27 +++ .../start-payment-flow.en.md | 207 ++++++++++++++++++ .../start-payment-flow.es.md | 207 ++++++++++++++++++ .../start-payment-flow.pt.md | 207 ++++++++++++++++++ 9 files changed, 915 insertions(+) diff --git a/guides/mp-point-main-apps/get-list-installments.en.md b/guides/mp-point-main-apps/get-list-installments.en.md index e69de29bb2..20de60e6c8 100644 --- a/guides/mp-point-main-apps/get-list-installments.en.md +++ b/guides/mp-point-main-apps/get-list-installments.en.md @@ -0,0 +1,54 @@ +# Get list of installments + +To get the list of installments linked to a specific amount, use the feature `getInstallmentsAmount`. Its accessible in the `PaymentInstallmentTools` instance, through the `MPManager` object. + +> WARNING +> +> Attention +> +> Currently this option will only be available for solutions implemented within Brazil. + +To use this feature, you have to: + +1. Select the **CREDIT-CARD** payment method. +2. Use an amount greater than R$10,00. + +Like this: + +[[[ +```kotlin +MPManager.paymentInstallmentTools.getInstallmentsAmount( +   callback = { mpResponse -> +       mpResponse.doIfSuccess { installments -> +           // Successfully manage the list of installments +       }.doIfError { +           // Manage the error in the installment request +       } +   }, +   amount = "11.0" +) +``` +```java +final PaymentInstallmentTools paymentInstallmentTools = MPManager.INSTANCE.getPaymentInstallmentTools(); + +final Function1>, Unit> callback = (final MPResponse> response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   // Successfully manage the list of installments + } else { +   // Manage the error in the installment request + } + return Unit.INSTANCE; +}; +final String amount = "11.0"; + +paymentInstallmentTools.getInstallmentsAmount(callback, amount); +``` +]]] + +|Field|Description| +|---|---| +|callback ((MPResponse>) -> Unit)|Response feature with the result of the request of the list of installments.| +|amount (String)|Amount with which the list of installments is determined.| +|installment (Int)|Number of installments.| +|amount (Double)|Amount of each installment.| +|financialAmount (Double)|Interest rate for each installment.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/get-list-installments.es.md b/guides/mp-point-main-apps/get-list-installments.es.md index e69de29bb2..fb5b962b1e 100644 --- a/guides/mp-point-main-apps/get-list-installments.es.md +++ b/guides/mp-point-main-apps/get-list-installments.es.md @@ -0,0 +1,105 @@ + +----[mla, mlb]---- +# Obtener lista de cuotas + +------------ +----[mlm]---- +# Obtener lista de mensualidades + +------------ + +Para obtener la lista de cuotas asociadas a un monto específico, usa la función `getInstallmentsAmount`. Puedes acceder a ella a través de la `PaymentInstallmentTools`, a través del objeto `MPManager`. + +> WARNING +> +> Attention +> +> Por el momento, esta opción solo está disponible para soluciones implementadas en Brasil. + +Para usar la función, debes: + +1. Seleccionar el medio de pago **CREDIT-CARD**. +2. Usar un monto mayor que $ 10,00. + +De esta manera: + +----[mla, mlb]---- +[[[ +```kotlin +MPManager.paymentInstallmentTools.getInstallmentsAmount( +   callback = { mpResponse -> +       mpResponse.doIfSuccess { installments -> +           // Manejar la lista de cuotas exitosamente +       }.doIfError { +           // Manejar el error en la solicitud de cuotas +       } +   }, +   amount = "11.0" +) +``` +```java +final PaymentInstallmentTools paymentInstallmentTools = MPManager.INSTANCE.getPaymentInstallmentTools(); + +final Function1>, Unit> callback = (final MPResponse> response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   // Manejar la lista de cuotas exitosamente + } else { +   // Manejar el error en la solicitud de cuotas + } + return Unit.INSTANCE; +}; +final String amount = "11.0"; + +paymentInstallmentTools.getInstallmentsAmount(callback, amount); +``` +]]] + +|Campo|Descripción| +|---|---| +|callback ((MPResponse>) -> Unit)|Función de respuesta con el resultado de la solicitud de la lista de cuotas.| +|amount (String)|Monto con el cual se determina la lista de cuotas.| +|installment (Int)|Número de cuotas.| +|amount (Double)|Monto de cada cuota.| +|financialAmount (Double)|Porcentaje de interés de cada cuota.| + +------------ +----[mlm]---- +[[[ +```kotlin +MPManager.paymentInstallmentTools.getInstallmentsAmount( +   callback = { mpResponse -> +       mpResponse.doIfSuccess { installments -> +           // Manejar la lista de mensualidades exitosamente +       }.doIfError { +           // Manejar el error en la solicitud de mensualidades +       } +   }, +   amount = "11.0" +) +``` +```java +final PaymentInstallmentTools paymentInstallmentTools = MPManager.INSTANCE.getPaymentInstallmentTools(); + +final Function1>, Unit> callback = (final MPResponse> response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   // Manejar la lista de mensualidades exitosamente + } else { +   // Manejar el error en la solicitud de mensualidades + } + return Unit.INSTANCE; +}; +final String amount = "11.0"; + +paymentInstallmentTools.getInstallmentsAmount(callback, amount); +``` +]]] + +|Campo|Descripción| +|---|---| +|callback ((MPResponse>) -> Unit)|Función de respuesta con el resultado de la solicitud de la lista de mensualidades.| +|amount (String)|Monto con el cual se determina la lista de mensualidades.| +|installment (Int)|Número de mensualidades.| +|amount (Double)|Monto de cada mensualidade.| +|financialAmount (Double)|Porcentaje de interés de cada mensualidade.| + +------------ \ No newline at end of file diff --git a/guides/mp-point-main-apps/get-list-installments.pt.md b/guides/mp-point-main-apps/get-list-installments.pt.md index e69de29bb2..654be034f9 100644 --- a/guides/mp-point-main-apps/get-list-installments.pt.md +++ b/guides/mp-point-main-apps/get-list-installments.pt.md @@ -0,0 +1,54 @@ +# Obter lista de parcelas + +Para obter a lista de parcelas associadas a um valor específico, utilize a função `getInstallmentsAmount`. Ela está acessível pela instância `PaymentInstallmentTools`, por meio do objeto `MPManager`. + +> WARNING +> +> Atenção +> +> Atualmente, essa opção só está disponível para soluções implementadas no Brasil. + +Para usar a função, você deve: + +1. Selecionar o método de pagamento **CREDIT-CARD**. +2. Usar um valor maior que R$ 10,00. + +Dessa forma: + +[[[ +```kotlin +MPManager.paymentInstallmentTools.getInstallmentsAmount( +   callback = { mpResponse -> +       mpResponse.doIfSuccess { installments -> +           // Gerencie com sucesso a lista de parcelas +       }.doIfError { +           // Gerencie o erro na solicitação de parcelas +       } +   }, +   amount = "11.0" +) +``` +```java +final PaymentInstallmentTools paymentInstallmentTools = MPManager.INSTANCE.getPaymentInstallmentTools(); + +final Function1>, Unit> callback = (final MPResponse> response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   // Gerencie com sucesso a lista de parcelas + } else { +   // Gerencie o erro na solicitação de parcelas + } + return Unit.INSTANCE; +}; +final String amount = "11.0"; + +paymentInstallmentTools.getInstallmentsAmount(callback, amount); +``` +]]] + +|Campo|Descrição| +|---|---| +|callback ((MPResponse>) -> Unit)|Função de resposta com o resultado da solicitação da lista de parcelas.| +|amount (String)|Valor com o qual se determina a lista de parcelas.| +|installment (Int)|Número de parcelas.| +|amount (Double)|Valor de cada parcela.| +|financialAmount (Double)|Porcentagem de acréscimo de cada parcela.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/get-payment-methods.en.md b/guides/mp-point-main-apps/get-payment-methods.en.md index e69de29bb2..644d92ad61 100644 --- a/guides/mp-point-main-apps/get-payment-methods.en.md +++ b/guides/mp-point-main-apps/get-payment-methods.en.md @@ -0,0 +1,27 @@ +# Get payment methods + +Through `MPManager`, use the instance `PaymentsMethodsTools` with the feature `getPaymentMethods`. The payment methods will be shown by an **ENUM** called `PaymentMethod`, like in the example below. + +[[[ +```kotlin +MPManager.paymentMethodsTools.getPaymentMethods { response -> +   response +       .doIfSuccess { result -> +           // You can render the list of payment methods in a recycler view +       }.doIfError { exception -> +           // Error management +       } +} +``` +```java +final Function1>, Unit> callback = (final MPResponse> response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   // You can render the list of payment methods in a recycler view + } else { +   // Error management + } + return Unit.INSTANCE; +}; +MPManager.INSTANCE.getPaymentMethodsTools().getPaymentMethods(callback); +``` +]]] \ No newline at end of file diff --git a/guides/mp-point-main-apps/get-payment-methods.es.md b/guides/mp-point-main-apps/get-payment-methods.es.md index e69de29bb2..f444439928 100644 --- a/guides/mp-point-main-apps/get-payment-methods.es.md +++ b/guides/mp-point-main-apps/get-payment-methods.es.md @@ -0,0 +1,27 @@ +# Obtener medios de pago + +A través del `MPManager`, usa la instancia `PaymentsMethodsTools` con la función `getPaymentMethods`. Los medios de pagos se mostrarán por un **ENUM** llamado `PaymentMethod`, como en el ejemplo a continuación. + +[[[ +```kotlin +MPManager.paymentMethodsTools.getPaymentMethods { response -> +   response +       .doIfSuccess { result -> +           // Puedes renderizar la lista de payment methods en un recycler view +       }.doIfError { exception -> +           // Manejo del error +       } +} +``` +```java +final Function1>, Unit> callback = (final MPResponse> response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   // Puedes renderizar la lista de payment methods en un recycler view + } else { +   // Manejo del error + } + return Unit.INSTANCE; +}; +MPManager.INSTANCE.getPaymentMethodsTools().getPaymentMethods(callback); +``` +]]] \ No newline at end of file diff --git a/guides/mp-point-main-apps/get-payment-methods.pt.md b/guides/mp-point-main-apps/get-payment-methods.pt.md index e69de29bb2..97f237738e 100644 --- a/guides/mp-point-main-apps/get-payment-methods.pt.md +++ b/guides/mp-point-main-apps/get-payment-methods.pt.md @@ -0,0 +1,27 @@ +# Obter meios de pagamento + +Por meio do `MPManager`, use a instância `PaymentsMethodsTools` com a função `getPaymentMethods`. Os meios de pagamentos serão mostrados por um **ENUM** chamado `PaymentMethod`, como no exemplo a seguir. + +[[[ +```kotlin +MPManager.paymentMethodsTools.getPaymentMethods { response -> +   response +       .doIfSuccess { result -> +           // Você pode renderizar a lista de métodos de pagamento em um recycler view +       }.doIfError { exception -> +           // Gerenciamento do erro +       } +} +``` +```java +final Function1>, Unit> callback = (final MPResponse> response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   // Você pode renderizar a lista de métodos de pagamento em um recycler view + } else { +   // Gerenciamento do erro + } + return Unit.INSTANCE; +}; +MPManager.INSTANCE.getPaymentMethodsTools().getPaymentMethods(callback); +``` +]]] \ No newline at end of file diff --git a/guides/mp-point-main-apps/start-payment-flow.en.md b/guides/mp-point-main-apps/start-payment-flow.en.md index e69de29bb2..a5b08700cf 100644 --- a/guides/mp-point-main-apps/start-payment-flow.en.md +++ b/guides/mp-point-main-apps/start-payment-flow.en.md @@ -0,0 +1,207 @@ +# Start payment flow + +To offer a fluid experience in your application, our SDK facilitates the initialization of the payment flow through the `PaymentFlow` class. Here’s how: + +[[[ +```kotlin +val paymentFlow = MPManager.paymentFlow + +val amount = "2.0" +val description = "Payment description" +val intentSuccess = paymentFlow.buildCallbackUri( +   callback = "mercadopago://smart_integrations/payment_result", +   methodCallback = "success", +   metadata = hashMapOf("message" to "testSuccess"), +   appID = "demo.app" +) +val intentError = paymentFlow.buildCallbackUri( +   callback = "mercadopago://smart_integrations/payment_result", +   methodCallback = "error", +   metadata = hashMapOf("message" to "testError"), +   appID = "demo.app" +) + +val paymentFlowData = PaymentFlowData( +   amount = amount, +   description = description, +   intentSuccess = intentSuccess, +   intentError = intentError, +   paymentMethod = PaymentMethod.CREDIT_CARD.name, +   installments = 6 +) +paymentFlow.launchPaymentFlowActivity( +   paymentFlowData = paymentFlowData, +   context = context +) { response -> +   response.doIfSuccess { message -> +       // Success management with a message +   }.doIfError { error -> +       // Error management +   } +} +``` +```java +final PaymentFlow paymentFlow = MPManager.INSTANCE.getPaymentFlow(); + +final HashMap successMetadata = new HashMap<>(); +successMetadata.put("success", "testSuccess"); + +final HashMap errorMetadata = new HashMap<>(); +successMetadata.put("message", "testError"); + +final String amount = "2.0"; +final String description = "Payment description"; +final Uri intentSuccess = paymentFlow.buildCallbackUri( +   "mercadopago://smart_integrations/payment_result", +   "success", +   successMetadata, +   "demo.app" +); +final Uri intentError = paymentFlow.buildCallbackUri( +   "mercadopago://smart_integrations/payment_result", +   "error", +   errorMetadata, +   "demo.app" +); + +final PaymentFlowData paymentFlowData = new PaymentFlowData( +   amount, +   description, +   intentSuccess, +   intentError, +   PaymentMethod.CREDIT_CARD.name(), +   6 +); + +final Function1, Unit> callback = (final MPResponse response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   // Success management with a message + } else { +   // Error management + } + return Unit.INSTANCE; +}; + +paymentFlow.launchPaymentFlowActivity(paymentFlowData, context, callback); +``` +]]] + +|Field|Description| +|---|---| +|amount (String)| The amount used to start the payment flow.| +|description (String)| The description used to start the payment flow. Using it is optional.| +|intentSuccess (Uri)| URI that requests the success screen. It’s used to create a deeplink that leads to the success activity.| +|intentError (Uri)| URI that requests the error screen. It’s used to create a deeplink that leads to the error activity.| +|paymentMethod (String)| The payment method to complete the transaction. Using it is optional.| +|installments (Int)| The number of installments used to start the payment flow, Available only for Brazil. Using it is optional.| +|launchPaymentFlowActivity| This method starts the payment flow using the SmartPOS app.| +|paymentFlowData (PaymentFlowData)| Detail model necessary to open the flow.| +|context (Context)| Context from where the flow will begin.| +|callback (MPResponse -> Unit)| Provides the result of the opening of the payment flow.| + +## Build a URI to open the payment flow + +The feature `buildCallbackUri` is designed to build a valid URI that allows you to open a specific activity, based on the deeplink strategy. To access, use the `PaymentFlow` instance through the `MPManager` object. + +> WARNING +> +> Attention +> +> Correctly set up your deeplink in your `AndroidManifest` so that the corresponding activity leads to the request. + +Check how to implement this feature: + +[[[ +```kotlin +val paymentFlow = MPManager.paymentFlow + +val uriResult = paymentFlow.buildCallbackUri( +   callback = "tuHost://tuApp/result", +   methodCallback = "error", +   metadata = hashMapOf("message" to "result"), +   appID = "demo.app" +) +``` +```java +final PaymentFlow paymentFlow = MPManager.INSTANCE.getPaymentFlow(); + +final HashMap resultMetadata = new HashMap<>(); +resultMetadata.put("message", "result"); + +final Uri uriResult = paymentFlow.buildCallbackUri( +   "tuHost://tuApp/result", +   "error", +   resultMetadata, +   "demo.app" +); +``` +]]] + +|Field|Description| +|---|---| +|callback (String)| The value of the URI to request the deeplink. E.g.: `yourHost://tuApp/test`.| +|methodCallback (String)| Identifies if the URI is for a success, error or another custom response. | +|metadata (HashMap)| Optional field to send information to the response screen, in case it’s necessary to show additional details, like the name of the customer or the summary of the products that were purchased.| +|appID (String)| Identifier of the main app. We use the package name. E.g.: `com.yourcompany.yourapp`.| +|Uri| the URI defined with the information provided.| + +## Get the payment response + +The feature `parseResponse` of the `PaymentFlow` class is used to receive the result of the payment flow, which is delivered as the `PaymentResponse` object ready for its handling. In this process, the following information is provided: + +- Payment method used. +- Payment reference. +- Creation date. +- Payment amount. +- Serial number of the POS machine. +- Card brand. +- Number of installments. +- Last four digits of the card. +- Any errors associated with the transaction. + +Check how to implement this feature: + +[[[ +```kotlin +intent.data?.let { data -> +   val response = paymentFlow.parseResponse(data) +   if (response.paymentReference.isNotEmpty()) { +       // Payment management with success case +   } else { +       // Payment management with an error +   } +} +``` +```java +final PaymentFlow paymentFlow = MPManager.INSTANCE.getPaymentFlow(); + +final Uri resultUri = getIntent().getData(); +final PaymentResponse response = paymentFlow.parseResponse(resultUri); + +if (!response.getPaymentReference().isEmpty()) { + // Payment management with success case +} else { + // Payment management with an error +} +``` +]]] + +|Field|Description| +|---|---| +|response (Uri)| The response received by the SmartPOS. To find it, use `intent.data` of the Activity in charge of opening the deeplink set within the `buildCallbackUri` feature.| +|PaymentResponse| Object that contains transaction details. If the response is null, it brings a `PaymentResponse` object with a `paymentStatusError`.| +|paymentMethod| Payment method used to complete the transaction. E.g.: credit card, debit card, QR code, payment link. | +|paymentReference| Unique transaction identifying number.| +|paymentCreationDate| Creation date of the transaction.| +|paymentAmount| Payment amount.| +|paymentSnDevice| Serial number of the POS machine with which the transaction was done.| +|paymentBrandName| User name registered in the POS machine.| +|paymentInstallments| Number of installments that a person selected when completing the payment. | +|paymentLastFourDigits| Last four digits of the card used for the payment.| +|paymentStatusError| Field to register transaction problems or errors.| + +> WARNING +> +> Attention +> +> Make sure that the response of the payment flow is valid and contains the necessary information. \ No newline at end of file diff --git a/guides/mp-point-main-apps/start-payment-flow.es.md b/guides/mp-point-main-apps/start-payment-flow.es.md index e69de29bb2..604a18c8f7 100644 --- a/guides/mp-point-main-apps/start-payment-flow.es.md +++ b/guides/mp-point-main-apps/start-payment-flow.es.md @@ -0,0 +1,207 @@ +# Iniciar el flujo de pago + +Para ofrecer una experiencia fluida en tu app, nuestro SDK facilita la inicialización del flujo de pago a través de la clase `PaymentFlow`. De esta forma: + +[[[ +```kotlin +val paymentFlow = MPManager.paymentFlow + +val amount = "2.0" +val description = "Payment description" +val intentSuccess = paymentFlow.buildCallbackUri( +   callback = "mercadopago://smart_integrations/payment_result", +   methodCallback = "success", +   metadata = hashMapOf("message" to "testSuccess"), +   appID = "demo.app" +) +val intentError = paymentFlow.buildCallbackUri( +   callback = "mercadopago://smart_integrations/payment_result", +   methodCallback = "error", +   metadata = hashMapOf("message" to "testError"), +   appID = "demo.app" +) + +val paymentFlowData = PaymentFlowData( +   amount = amount, +   description = description, +   intentSuccess = intentSuccess, +   intentError = intentError, +   paymentMethod = PaymentMethod.CREDIT_CARD.name, +   installments = 6 +) +paymentFlow.launchPaymentFlowActivity( +   paymentFlowData = paymentFlowData, +   context = context +) { response -> +   response.doIfSuccess { message -> +       // Manejo de éxito utilizando un mensaje +   }.doIfError { error -> +       // Manejo del error +   } +} +``` +```java +final PaymentFlow paymentFlow = MPManager.INSTANCE.getPaymentFlow(); + +final HashMap successMetadata = new HashMap<>(); +successMetadata.put("success", "testSuccess"); + +final HashMap errorMetadata = new HashMap<>(); +successMetadata.put("message", "testError"); + +final String amount = "2.0"; +final String description = "Payment description"; +final Uri intentSuccess = paymentFlow.buildCallbackUri( +   "mercadopago://smart_integrations/payment_result", +   "success", +   successMetadata, +   "demo.app" +); +final Uri intentError = paymentFlow.buildCallbackUri( +   "mercadopago://smart_integrations/payment_result", +   "error", +   errorMetadata, +   "demo.app" +); + +final PaymentFlowData paymentFlowData = new PaymentFlowData( +   amount, +   description, +   intentSuccess, +   intentError, +   PaymentMethod.CREDIT_CARD.name(), +   6 +); + +final Function1, Unit> callback = (final MPResponse response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   // Manejo de éxito utilizando un mensaje + } else { +   // Manejo del error + } + return Unit.INSTANCE; +}; + +paymentFlow.launchPaymentFlowActivity(paymentFlowData, context, callback); +``` +]]] + +|Campo|Descripción| +|---|---| +|amount (String)|E l monto usado para iniciar el flujo de pago.| +|description (String)| La descripción usada para iniciar el flujo de pago. Su uso es opcional.| +|intentSuccess (Uri)| URI que llama la pantalla de éxito. Se usa para formar un deeplink que envía la actividad de éxito.| +|intentError (Uri)| URI que llama la pantalla de error. Se usa para formar un deeplink que envía la actividad de error.| +|paymentMethod (String)| El medio de pago para realizar la operación. Su uso es opcional.| +|installments (Int)| El número de cuotas usado para iniciar el flujo de pago. Está disponible solo para Brasil, y su uso es opcional.| +|launchPaymentFlowActivity| Este método inicia el flujo de pago usando la app SmartPOS.| +|paymentFlowData (PaymentFlowData)| Modelo de datos necesario para la apertura del flujo.| +|context (Context)| Contexto de dónde se inciará el flujo.| +|callback (MPResponse -> Unit)| Ofrece el resultado de la apertura del flujo de pago.| + +## Construir una URI para apertura del flujo de pago + +La función `buildCallbackUri` está diseñada para construir una URI válida que permita abrir una actividad específica, con base en la estrategia del _deeplink_. Para acceder a ella, usa la función PaymentFlow a través del objeto `MPManager`. + +> WARNING +> +> Atención +> +> Configura correctamente el deeplink en tu `AndroidManifest` para que la actividad correspondiente direccione el llamado. + +Consulta cómo implementar esta funcionalidad: + +[[[ +```kotlin +val paymentFlow = MPManager.paymentFlow + +val uriResult = paymentFlow.buildCallbackUri( +   callback = "tuHost://tuApp/result", +   methodCallback = "error", +   metadata = hashMapOf("message" to "result"), +   appID = "demo.app" +) +``` +```java +final PaymentFlow paymentFlow = MPManager.INSTANCE.getPaymentFlow(); + +final HashMap resultMetadata = new HashMap<>(); +resultMetadata.put("message", "result"); + +final Uri uriResult = paymentFlow.buildCallbackUri( +   "tuHost://tuApp/result", +   "error", +   resultMetadata, +   "demo.app" +); +``` +]]] + +|Campo|Descripción| +|---|---| +|callback (String)| El monto de la URI para llamar el _deeplink_. Ejemplo: `tuHost://tuApp/prueba`.| +|methodCallback (String)| Identifica si la URI es para un caso de éxito, de error u otra respuesta personalizada.| +|metadata (HashMap)| Campo opcional para enviar información a la pantalla de respuesta, en caso de que sea necesario mostrar detalles adicionales, como el nombre del cliente o el resumen de los productos comprados. | +|appID (String)|  Identificador de la app principal. Usamos el nombre del paquete. Ejemplo: `com.tuempresa.tuapp`.| +|Uri| La URI definida con la información ingresada.| + +## Obtener el resultado del pago + +La función `parseResponse` de la clase `PaymentFlow` se usa para recibir el resultado del flujo de pago, que se entrega en forma de objeto `PaymentResponse` listo para su manipulación. En este proceso, la siguiente información se ofrece: + +- Medio de pago usado. +- Referencia de pago. +- Fecha de creación. +- Monto del pago. +- Número de serie del lector. +- Marca de la tarjeta. +- Cantidad de cuotas. +- Últimos cuatro números de la tarjeta. +- Cualquier error asociado a la operación. + +Consulta cómo implementar esta funcionalidad: + +[[[ +```kotlin +intent.data?.let { data -> +   val response = paymentFlow.parseResponse(data) +   if (response.paymentReference.isNotEmpty()) { +       // Manejo de pago con un resultado de éxito +   } else { +       // Manejo de pago con un resultado de error +   } +} +``` +```java +final PaymentFlow paymentFlow = MPManager.INSTANCE.getPaymentFlow(); + +final Uri resultUri = getIntent().getData(); +final PaymentResponse response = paymentFlow.parseResponse(resultUri); + +if (!response.getPaymentReference().isEmpty()) { + // Manejo de pago con un resultado de éxito +} else { + // Manejo de pago con un resultado de error +} +``` +]]] + +|Campo|Descripción| +|---|---| +|response (Uri)| La respuesta recibida de SmartPOS. Para encontrarla, usa `intent.data` de la _Activity_ encargada de abrir el _deeplink_ configurado dentro de la función `buildCallbackUri`.| +|PaymentResponse| Objeto que contiene detalles de la operación. Si la respuesta es nula, se devuelve un `PaymentResponse` con un `paymentStatusError`.| +|paymentMethod| Medio de pago usado para hacer la operación. Ejemplos: crédito, débito, código QR, link de pago. | +|paymentReference| Número identificador único de la operación.| +|paymentCreationDate| Fecha de creación de la operación.| +|paymentAmount|  Monto del pago.| +|paymentSnDevice| Número de serie del lector donde se hizo la operación.| +|paymentBrandName| Nombre de usuario registrado en el lector.| +|paymentInstallments| Número de cuotas que la persona seleccionó al hacer el pago.| +|paymentLastFourDigits| Últimos cuatro números de la tarjeta usada en el pago.| +|paymentStatusError| Campo para registrar problemas y errores de la operación.| + +> WARNING +> +> Atención +> +> Asegúrate de que la respuesta del flujo de pago sea válida y tenga la información necesaria. \ No newline at end of file diff --git a/guides/mp-point-main-apps/start-payment-flow.pt.md b/guides/mp-point-main-apps/start-payment-flow.pt.md index e69de29bb2..85d24dd02f 100644 --- a/guides/mp-point-main-apps/start-payment-flow.pt.md +++ b/guides/mp-point-main-apps/start-payment-flow.pt.md @@ -0,0 +1,207 @@ +# Iniciar o fluxo de pagamento + +Para oferecer uma experiência fluida no seu aplicativo, nosso SDK facilita a inicialização do fluxo de pagamento através da classe `PaymentFlow`. Desta forma: + +[[[ +```kotlin +val paymentFlow = MPManager.paymentFlow + +val amount = "2.0" +val description = "Payment description" +val intentSuccess = paymentFlow.buildCallbackUri( +   callback = "mercadopago://smart_integrations/payment_result", +   methodCallback = "success", +   metadata = hashMapOf("message" to "testSuccess"), +   appID = "demo.app" +) +val intentError = paymentFlow.buildCallbackUri( +   callback = "mercadopago://smart_integrations/payment_result", +   methodCallback = "error", +   metadata = hashMapOf("message" to "testError"), +   appID = "demo.app" +) + +val paymentFlowData = PaymentFlowData( +   amount = amount, +   description = description, +   intentSuccess = intentSuccess, +   intentError = intentError, +   paymentMethod = PaymentMethod.CREDIT_CARD.name, +   installments = 6 +) +paymentFlow.launchPaymentFlowActivity( +   paymentFlowData = paymentFlowData, +   context = context +) { response -> +   response.doIfSuccess { message -> +       // Gerenciamento bem-sucedido usando uma mensagem +   }.doIfError { error -> +       // Gerenciamento do erro +   } +} +``` +```java +final PaymentFlow paymentFlow = MPManager.INSTANCE.getPaymentFlow(); + +final HashMap successMetadata = new HashMap<>(); +successMetadata.put("success", "testSuccess"); + +final HashMap errorMetadata = new HashMap<>(); +successMetadata.put("message", "testError"); + +final String amount = "2.0"; +final String description = "Payment description"; +final Uri intentSuccess = paymentFlow.buildCallbackUri( +   "mercadopago://smart_integrations/payment_result", +   "success", +   successMetadata, +   "demo.app" +); +final Uri intentError = paymentFlow.buildCallbackUri( +   "mercadopago://smart_integrations/payment_result", +   "error", +   errorMetadata, +   "demo.app" +); + +final PaymentFlowData paymentFlowData = new PaymentFlowData( +   amount, +   description, +   intentSuccess, +   intentError, +   PaymentMethod.CREDIT_CARD.name(), +   6 +); + +final Function1, Unit> callback = (final MPResponse response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   // Gerenciamento bem-sucedido usando uma mensagem + } else { +   // Gerenciamento do erro + } + return Unit.INSTANCE; +}; + +paymentFlow.launchPaymentFlowActivity(paymentFlowData, context, callback); +``` +]]] + +|Campo|Descrição| +|---|---| +|amount (String)| O valor usado para iniciar o fluxo de pagamento.| +|description (String)| A descrição usada para iniciar o fluxo de pagamento. Seu uso é opcional.| +|intentSuccess (Uri)| URI que chama a tela de sucesso. É usada para formar um deeplink que envia a atividade de sucesso.| +|intentError (Uri)| URI que chama a tela de erro. É usada para formar um deeplink que envia a atividade de erro.| +|paymentMethod (String)| O meio de pagamento para realizar a transação. Seu uso é opcional.| +|installments (Int)| O número de parcelas usado para iniciar o fluxo de pagamento. Está disponível apenas para o Brasil e seu uso é opcional.| +|launchPaymentFlowActivity| Esse método inicia o fluxo de pagamento usando o aplicativo SmartPOS.| +|paymentFlowData (PaymentFlowData)| Modelo de dados necessário para a abertura do fluxo.| +|context (Context)| Contexto de onde será iniciado o fluxo.| +|callback (MPResponse -> Unit)| Proporciona o resultado da abertura do fluxo de pagamento.| + +## Construir uma URI para abertura do fluxo de pagamento + +A função `buildCallbackUri` está desenhada para construir uma URI válida que permita abrir uma atividade específica, com base na estratégia do _deeplink_. Para acessar, use a instância `PaymentFlow` através do objeto `MPManager`. + +> WARNING +> +> Atenção +> +> Configure corretamente o _deeplink_ no seu `AndroidManifest` para que a atividade correspondente direcione a chamada. + +Confira como implementar essa funcionalidade: + +[[[ +```kotlin +val paymentFlow = MPManager.paymentFlow + +val uriResult = paymentFlow.buildCallbackUri( +   callback = "tuHost://tuApp/result", +   methodCallback = "error", +   metadata = hashMapOf("message" to "result"), +   appID = "demo.app" +) +``` +```java +final PaymentFlow paymentFlow = MPManager.INSTANCE.getPaymentFlow(); + +final HashMap resultMetadata = new HashMap<>(); +resultMetadata.put("message", "result"); + +final Uri uriResult = paymentFlow.buildCallbackUri( +   "tuHost://tuApp/result", +   "error", +   resultMetadata, +   "demo.app" +); +``` +]]] + +|Campo|Descrição| +|---|---| +|callback (String)| O valor da URI para chamar o _deeplink_. Exemplo: `tuHost://tuApp/prueba`.| +|methodCallback (String)| Identifica se a URI é para um caso de sucesso, erro ou outra resposta personalizada.| +|metadata (HashMap)| Campo opcional para enviar informação à tela de resposta, caso seja necessário mostrar detalhes adicionais, como o nome do cliente ou o resumo dos produtos comprados. | +|appID (String)| Identificador do aplicativo principal. Usamos o nome do pacote. Exemplo: `com.tuempresa.tuapp`.| +|Uri| A URI definida com a informação proporcionada.| + +## Obter o resultado do pagamento + +A função `parseResponse` da classe `PaymentFlow` é usada para receber o resultado do fluxo de pagamento, sendo entregue na forma de objeto `PaymentResponse` pronto para a sua manipulação. Nesse processo, as seguintes informações são proporcionadas: + +- Meio de pagamento usado. +- Referência de pagamento. +- Data de criação. +- Valor do pagamento. +- Número de série da maquininha. +- Bandeira do cartão. +- Quantidade de parcelas. +- Últimos quatro dígitos do cartão. +- Qualquer erro associado à transação. + +Confira como implementar esta funcionalidade: + +[[[ +```kotlin +intent.data?.let { data -> +   val response = paymentFlow.parseResponse(data) +   if (response.paymentReference.isNotEmpty()) { +       // Gerenciamento de pagamento com um resultado de sucesso +   } else { +       // Gerenciamento de pagamento com um resultado de erro +   } +} +``` +```java +final PaymentFlow paymentFlow = MPManager.INSTANCE.getPaymentFlow(); + +final Uri resultUri = getIntent().getData(); +final PaymentResponse response = paymentFlow.parseResponse(resultUri); + +if (!response.getPaymentReference().isEmpty()) { + // Gerenciamento de pagamento com um resultado de sucesso +} else { + // Gerenciamento de pagamento com um resultado de erro +} +``` +]]] + +|Campo|Descrição| +|---|---| +|response (Uri)| A resposta recebida da SmartPOS. Para encontrá-la, use `intent.data` da _Activity_ encarregada de abrir o _deeplink_ configurado dentro da função `buildCallbackUri`.| +|PaymentResponse| Objeto que contém detalhes da transação. Se a resposta é nula, é devolvido um objeto `PaymentResponse` com um `paymentStatusError`.| +|paymentMethod| Meio de pagamento usado para fazer a transação. Exemplos: crédito, débito, código QR, link de pagamento etc. | +|paymentReference| Número identificador único da transação.| +|paymentCreationDate| Data de criação da transação.| +|paymentAmount| Valor pago.| +|paymentSnDevice| Número de série da maquininha em que a transação foi feita.| +|paymentBrandName| Nome do usuário registrado na maquininha.| +|paymentInstallments| Número de parcelas que a pessoa selecionou ao fazer o pagamento.| +|paymentLastFourDigits| Últimos quatro dígitos do cartão usado no pagamento.| +|paymentStatusError| Campo para registrar problemas e erros da transação.| + +> WARNING +> +> Atenção +> +> Certifique-se de que a resposta do fluxo de pagamento seja válida e contenha a informação necessária. \ No newline at end of file From 9eb5f5d53a7fef96dec9de99cdfa8e1191346215 Mon Sep 17 00:00:00 2001 From: hgaldino Date: Sat, 17 Aug 2024 06:30:06 -0300 Subject: [PATCH 04/34] 6 --- .../mp-point-main-apps/get-information.en.md | 52 ++++++++++++++ .../mp-point-main-apps/get-information.es.md | 67 ++++++++++++++++++ .../mp-point-main-apps/get-information.pt.md | 52 ++++++++++++++ guides/mp-point-main-apps/print-images.en.md | 38 ++++++++++ guides/mp-point-main-apps/print-images.es.md | 38 ++++++++++ guides/mp-point-main-apps/print-images.pt.md | 38 ++++++++++ guides/mp-point-main-apps/scan-qr-code.en.md | 70 +++++++++++++++++++ guides/mp-point-main-apps/scan-qr-code.es.md | 70 +++++++++++++++++++ guides/mp-point-main-apps/scan-qr-code.pt.md | 70 +++++++++++++++++++ .../start-payment-flow.en.md | 2 +- .../start-payment-flow.es.md | 2 +- .../start-payment-flow.pt.md | 2 +- 12 files changed, 498 insertions(+), 3 deletions(-) create mode 100644 guides/mp-point-main-apps/get-information.en.md create mode 100644 guides/mp-point-main-apps/get-information.es.md create mode 100644 guides/mp-point-main-apps/get-information.pt.md create mode 100644 guides/mp-point-main-apps/print-images.en.md create mode 100644 guides/mp-point-main-apps/print-images.es.md create mode 100644 guides/mp-point-main-apps/print-images.pt.md create mode 100644 guides/mp-point-main-apps/scan-qr-code.en.md create mode 100644 guides/mp-point-main-apps/scan-qr-code.es.md create mode 100644 guides/mp-point-main-apps/scan-qr-code.pt.md diff --git a/guides/mp-point-main-apps/get-information.en.md b/guides/mp-point-main-apps/get-information.en.md new file mode 100644 index 0000000000..084ca7391f --- /dev/null +++ b/guides/mp-point-main-apps/get-information.en.md @@ -0,0 +1,52 @@ +# Get information + +Through the `getInformation` feature of the `SmartInformationTools` class, you recover detailed information about a device and the integration SDK. Access this feature through the `MPManager` object, as in the following example: + +[[[ +```kotlin +val informationTools = MPManager.smartInformationTools + +informationTools.getInformation { response -> +   response.doIfSuccess { smartInformation -> +       // Manage information on the device and integration +       val deviceSerialNumber = smartInformation.smartDevice.serialNumber +       val brandName = smartInformation.smartDevice.brandName +       val modelName = smartInformation.smartDevice.modelName +       val paymentModuleVersion = smartInformation.smartDevice.paymentModuleVersion + +       val sdkVersion = smartInformation.integration.nativeSdkVersion +   }.doIfError { error -> +       // Manage error in information request +} +``` +```java +final SmartInformationTools smartInformationTools = MPManager.INSTANCE.getSmartInformationTools(); + +final Function1, Unit> callback = (final MPResponse response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   // Manage information on the device and integration +   final String deviceSerialNumber = response.getData().getSmartDevice().getSerialNumber(); +   final String brandName = response.getData().getSmartDevice().getBrandName(); +   final String modelName = response.getData().getSmartDevice().getModelName(); +   final String paymentModuleVersion = response.getData().getSmartDevice().getPaymentModuleVersion(); + +   final String sdkVersion = response.getData().getIntegration().getNativeSdkVersion(); + } else { +   // Manage error in information request + } + return Unit.INSTANCE; +}; + +smartInformationTools.getInformation(callback); +``` +]]] + +|Field|Description| +|---|---| +|smartDevice| Device details.| +|serialNumber| POS machine serial number.| +|brandName| POS machine brand.| +|modelName| POS machine model.| +|paymentModuleVersion| Version of the payment module of the [SmartPOS](/developers/en/docs/mp-point/landing).| +|integration| Integration SDK details.| +|nativeSdkVersion| Integration SDK version.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/get-information.es.md b/guides/mp-point-main-apps/get-information.es.md new file mode 100644 index 0000000000..75a3922e53 --- /dev/null +++ b/guides/mp-point-main-apps/get-information.es.md @@ -0,0 +1,67 @@ +# Obtener información + +A través de la función `getInformation` de la clase `SmartInformationTools`, recuperas información detallada sobre un dispositivo y el SDK de las integraciones. Accede a esta función por el a través del objeto `MPManager`, como en el ejemplo a continuación: + +[[[ +```kotlin +val informationTools = MPManager.smartInformationTools + +informationTools.getInformation { response -> +   response.doIfSuccess { smartInformation -> +       // Manejar la información del dispositivo e integración +       val deviceSerialNumber = smartInformation.smartDevice.serialNumber +       val brandName = smartInformation.smartDevice.brandName +       val modelName = smartInformation.smartDevice.modelName +       val paymentModuleVersion = smartInformation.smartDevice.paymentModuleVersion + +       val sdkVersion = smartInformation.integration.nativeSdkVersion +   }.doIfError { error -> +       // Manejar el error en la solicitud de información +} +``` +```java +final SmartInformationTools smartInformationTools = MPManager.INSTANCE.getSmartInformationTools(); + +final Function1, Unit> callback = (final MPResponse response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   // Manejar la información del dispositivo e integración +   final String deviceSerialNumber = response.getData().getSmartDevice().getSerialNumber(); +   final String brandName = response.getData().getSmartDevice().getBrandName(); +   final String modelName = response.getData().getSmartDevice().getModelName(); +   final String paymentModuleVersion = response.getData().getSmartDevice().getPaymentModuleVersion(); + +   final String sdkVersion = response.getData().getIntegration().getNativeSdkVersion(); + } else { +   // Manejar el error en la solicitud de información + } + return Unit.INSTANCE; +}; + +smartInformationTools.getInformation(callback); +``` +]]] + +----[mla, mlb]---- +|Campo|Descripción| +|---|---| +|smartDevice| detalles del dispositivo| +|serialNumber| número de serie del lector.| +|brandName| nombre de la marca del lector.| +|modelName| nombre del modelo del lector.| +|paymentModuleVersion| ersión del módulo de pago del [SmartPOS](/developers/en/docs/mp-point/landing).| +|integration| detalles del SDK de las integraciones.| +|nativeSdkVersion| versión del SDK de las integraciones.| + +------------ +----[mlm]---- +|Campo|Descripción| +|---|---| +|smartDevice| detalles del dispositivo| +|serialNumber| número de serie de la terminal.| +|brandName| nombre de la marca de la terminal.| +|modelName| nombre del modelo de la terminal.| +|paymentModuleVersion| ersión del módulo de pago del [SmartPOS](/developers/en/docs/mp-point/landing).| +|integration| detalles del SDK de las integraciones.| +|nativeSdkVersion| versión del SDK de las integraciones.| + +------------ \ No newline at end of file diff --git a/guides/mp-point-main-apps/get-information.pt.md b/guides/mp-point-main-apps/get-information.pt.md new file mode 100644 index 0000000000..3be181c42f --- /dev/null +++ b/guides/mp-point-main-apps/get-information.pt.md @@ -0,0 +1,52 @@ +# Obter informações + +Através da função `getInformation` da classe `SmartInformationTools`, você recupera informações detalhadas sobre um dispositivo e o SDK de integrações. Acesse essa função pelo objeto `MPManager`, como no exemplo a seguir: + +[[[ +```kotlin +val informationTools = MPManager.smartInformationTools + +informationTools.getInformation { response -> +   response.doIfSuccess { smartInformation -> +       // Gerencie informações no dispositivo e integração +       val deviceSerialNumber = smartInformation.smartDevice.serialNumber +       val brandName = smartInformation.smartDevice.brandName +       val modelName = smartInformation.smartDevice.modelName +       val paymentModuleVersion = smartInformation.smartDevice.paymentModuleVersion + +       val sdkVersion = smartInformation.integration.nativeSdkVersion +   }.doIfError { error -> +       // Gerencie erro na solicitação de informações +} +``` +```java +final SmartInformationTools smartInformationTools = MPManager.INSTANCE.getSmartInformationTools(); + +final Function1, Unit> callback = (final MPResponse response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   // Gerencie informações no dispositivo e integração +   final String deviceSerialNumber = response.getData().getSmartDevice().getSerialNumber(); +   final String brandName = response.getData().getSmartDevice().getBrandName(); +   final String modelName = response.getData().getSmartDevice().getModelName(); +   final String paymentModuleVersion = response.getData().getSmartDevice().getPaymentModuleVersion(); + +   final String sdkVersion = response.getData().getIntegration().getNativeSdkVersion(); + } else { +   // Gerencie erro na solicitação de informações + } + return Unit.INSTANCE; +}; + +smartInformationTools.getInformation(callback); +``` +]]] + +|Campo|Descrição| +|---|---| +|smartDevice| Detalhes do dispositivo.| +|serialNumber| Número de série da maquininha.| +|brandName| Nome da marca da maquininha.| +|modelName| Nome do modelo da maquininha.| +|paymentModuleVersion| Versão do módulo de pagamento do [SmartPOS](/developers/pt/docs/mp-point/landing).| +|integration| Detalhes do SDK de integrações.| +|nativeSdkVersion| Versão do SDK de integrações.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/print-images.en.md b/guides/mp-point-main-apps/print-images.en.md new file mode 100644 index 0000000000..bba55476f1 --- /dev/null +++ b/guides/mp-point-main-apps/print-images.en.md @@ -0,0 +1,38 @@ +# Imprimir imágenes + +Para imprimir imagens en bitmap con la impresora de [Point Smart](/developers/pt/docs/mp-point/landing), usa la **función print** de la clase `BitmapPrinter`. El acceso se da a través del objeto `MPManager`, como en el ejemplo a continuación: + +[[[ +```kotlin +val bitmapPrinter = MPManager.bitmapPrinter + +val imageToPrint: Bitmap = bitmap // Obtener la imagen bitmap que se imprimirá + +bitmapPrinter.print(imageToPrint) { response -> +   response.doIfSuccess { printResult -> +       // Gerenciar a impressão bem-sucedida +   }.doIfError { error -> +       // anage error in the printing operation +``` +```java +final BitmapPrinter bitmapPrinter = MPManager.INSTANCE.getBitmapPrinter(); + +final Bitmap imageToPrint = bitmap // Obtener la imagen bitmap que se imprimirá + +final Function1, Unit> callback = (final MPResponse response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   // Gerenciar a impressão bem-sucedida + } else { +   // anage error in the printing operation + } + return Unit.INSTANCE; +}; + +bitmapPrinter.print(imageToPrint, callback); +``` +]]] + +|Field|Description| +|---|---| +|dataToPrint (Bitmap)| The bitmap image that will be printed.| +|PaymentResponse| Request response feature that provides the result of the printing operation. The `[MPResponse]` includes the status, the error (if any), and the details in case of success, which contain a String representing the ID or status of the printing.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/print-images.es.md b/guides/mp-point-main-apps/print-images.es.md new file mode 100644 index 0000000000..c00808a0a1 --- /dev/null +++ b/guides/mp-point-main-apps/print-images.es.md @@ -0,0 +1,38 @@ +# Imprimir imágenes + +To print bitmap images with the [Point Smart](/developers/es/docs/mp-point/landing) printer, use the print feature of the `BitmapPrinter` class. The access is through the `MPManager` object, as in the example below: + +[[[ +```kotlin +val bitmapPrinter = MPManager.bitmapPrinter + +val imageToPrint: Bitmap = bitmap // Get the bitmap image that will be printed + +bitmapPrinter.print(imageToPrint) { response -> +   response.doIfSuccess { printResult -> +       // Gerenciar a impressão bem-sucedida +   }.doIfError { error -> +       // Gerenciar o erro na operação de impressão +``` +```java +final BitmapPrinter bitmapPrinter = MPManager.INSTANCE.getBitmapPrinter(); + +final Bitmap imageToPrint = bitmap // Get the bitmap image that will be printed + +final Function1, Unit> callback = (final MPResponse response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   // Gerenciar a impressão bem-sucedida + } else { +   // Gerenciar o erro na operação de impressão + } + return Unit.INSTANCE; +}; + +bitmapPrinter.print(imageToPrint, callback); +``` +]]] + +|Campo|Descripción| +|---|---| +|dataToPrint (Bitmap)| La imagen bitmap que se imprimirá.| +|PaymentResponse| Función de devolución del llamado que ofrece la operación de impresión. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito, que tiene un **String** representando el ID o estado de la impresión.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/print-images.pt.md b/guides/mp-point-main-apps/print-images.pt.md new file mode 100644 index 0000000000..584bd51e57 --- /dev/null +++ b/guides/mp-point-main-apps/print-images.pt.md @@ -0,0 +1,38 @@ +# Imprimir imagens + +Para imprimir imagens em bitmap com a impressora da [Point Smart](/developers/pt/docs/mp-point/landing), use a **função print** da classe `BitmapPrinter`. O acesso ocorre por meio do objeto `MPManager`, como no exemplo a seguir: + +[[[ +```kotlin +val bitmapPrinter = MPManager.bitmapPrinter + +val imageToPrint: Bitmap = bitmap // Obter a imagem bitmap que será impressa + +bitmapPrinter.print(imageToPrint) { response -> +   response.doIfSuccess { printResult -> +       // Manejar la impresión exitosa +   }.doIfError { error -> +       // Manejar el error en la operación de impresión +``` +```java +final BitmapPrinter bitmapPrinter = MPManager.INSTANCE.getBitmapPrinter(); + +final Bitmap imageToPrint = bitmap // Obtener la imagen Bitmap que se imprimirá + +final Function1, Unit> callback = (final MPResponse response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   // Manejar la impresión exitosa + } else { +   // Manejar el error en la operación de impresión + } + return Unit.INSTANCE; +}; + +bitmapPrinter.print(imageToPrint, callback); +``` +]]] + +|Campo|Descrição| +|---|---| +|dataToPrint (Bitmap)| A imagem bitmap que será impressa.| +|PaymentResponse| Função de devolução da chamada que proporciona o resultado da operação de impressão. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados em caso de sucesso, que contêm um String representando o ID ou estado da impressão.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/scan-qr-code.en.md b/guides/mp-point-main-apps/scan-qr-code.en.md new file mode 100644 index 0000000000..b45894f86d --- /dev/null +++ b/guides/mp-point-main-apps/scan-qr-code.en.md @@ -0,0 +1,70 @@ +# Scan QR code + +To begin reading QR codes of the [Point Smart](/developers/en/docs/mp-point/landing), use the `initQRCodeScanner` feature of the `CameraScanner` class. This process uses a camera request through `startActivityForResult`, and the method `onActivityResult` must be implemented in the activity to handle the reading response. + +Check the example below: + +[[[ +```kotlin +val cameraScanner = MPManager.cameraScanner +cameraScanner.initQRCodeScanner(this@YourActivity) +``` +```java +final CameraScanner cameraScanner = MPManager.INSTANCE.getCameraScanner(); +cameraScanner.initQRCodeScanner(this); +``` +]]] + +## Manage response + +To manage the response of the QR code scanner, use the `handleQrResponse` feature of the `CameraScanner` class from the `onActivityResult` method. That feature brings the `[MPResponse]` object which includes the status, the error (if any), and the details in case of success, which contain a `CameraScannerResponse` object representing the response of the reading. + +Check how that takes place below: + +[[[ +```kotlin +override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { +   super.onActivityResult(requestCode, resultCode, data) + +   val cameraScanner = MPManager.cameraScanner +   val response = cameraScanner.handleQrResponse(resultCode, data) + +   response.doIfSuccess { result -> +       // Manage successful response +       val status = result.status +       val message = result.message +       // ... Do something with the response +   }.doIfError { error -> +       // Manage error in the response +       val errorMessage = error.message +       // ... Do something with the error +   } +} +``` +```java +@Override +protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + final CameraScanner cameraScanner = MPManager.INSTANCE.getCameraScanner(); + final MPResponse response = cameraScanner.handleQrResponse(resultCode, data); + + if (response.getStatus() == ResponseStatus.SUCCESS) { +   // Manage successful response +   final CameraScannerStatus status = response.getData().getStatus(); +   final String message = response.getData().getMessage(); + } else { +   // Manage the error in the response +   final String errorMessage = response.getError().getMessage(); + } +} +``` +]]] + +|Field|Description| +|---|---| +|resultCode (Int)| Value of the `resultCode` in `onActivityResult`.| +|resultData (Intent)| Date result in `onActivityResult`.| +|MPResponse| Object [MPResponse] that includes the status, the error (if any), and the details in case of success, which contain an `CameraScannerResponse` object.| +|status (CameraScannerStatus)| Defines the status of the response. It can be **Ok** (it read it successfully), **Error** (something went wrong and it was cancelled) or **Unknown** (something went wrong).| +|message (String)| Defines the response message received by the scanner. If it’s ”Ok”, it will have the result of the reading of the code| diff --git a/guides/mp-point-main-apps/scan-qr-code.es.md b/guides/mp-point-main-apps/scan-qr-code.es.md new file mode 100644 index 0000000000..e99f8319fc --- /dev/null +++ b/guides/mp-point-main-apps/scan-qr-code.es.md @@ -0,0 +1,70 @@ +# Escanear código QR + +Para iniciar la lectura de códigos QR del [Point Smart](/developers/es/docs/mp-point/landing), usa la función `initQRCodeScanner` de la clase `CameraScanner`. Este proceso usa un llamado de cámara a través de `startActivityForResult`, de modo que el método `onActivityResult` se debe implementar en la actividad para manipular la respuesta de lectura. + +Consulta el ejemplo a continuación. + +[[[ +```kotlin +val cameraScanner = MPManager.cameraScanner +cameraScanner.initQRCodeScanner(this@YourActivity) +``` +```java +final CameraScanner cameraScanner = MPManager.INSTANCE.getCameraScanner(); +cameraScanner.initQRCodeScanner(this); +``` +]]] + +## Gestionar la respuesta + +Para gestionar la respuesta del escaner de código QR, usa la función `handleQrResponse` de la clase `CameraScanner` en el método `onActivityResult`. Esta función devuelve el objeto `[MPResponse]` que encapsula el estado, el error (si lo hay) y los datos en caso de éxito, que tiene el objeto `CameraScannerResponse` representando la respuesta de lectura. + +Consulta cómo continuar. + +[[[ +```kotlin +override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { +   super.onActivityResult(requestCode, resultCode, data) + +   val cameraScanner = MPManager.cameraScanner +   val response = cameraScanner.handleQrResponse(resultCode, data) + +   response.doIfSuccess { result -> +       // Manejar la respuesta exitosa +       val status = result.status +       val message = result.message +       // ... Hacer algo con la respuesta +   }.doIfError { error -> +       // Manejar el error en la respuesta +       val errorMessage = error.message +       // ... Hacer algo con el error +   } +} +``` +```java +@Override +protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + final CameraScanner cameraScanner = MPManager.INSTANCE.getCameraScanner(); + final MPResponse response = cameraScanner.handleQrResponse(resultCode, data); + + if (response.getStatus() == ResponseStatus.SUCCESS) { +   // Manejar la respuesta exitosa +   final CameraScannerStatus status = response.getData().getStatus(); +   final String message = response.getData().getMessage(); + } else { +   // Manejar el error en la respuesta +   final String errorMessage = response.getError().getMessage(); + } +} +``` +]]] + +|Campo|Descripción| +|---|---| +|resultCode (Int)| Valor del `resultCode` en `onActivityResult`| +|resultData (Intent)| Valor de la fecha en `onActivityResult`.| +|MPResponse| Objeto `[MPResponse]` que encapsula el estado, el error (si lo hay) y los datos en caso de éxito, que tiene un objeto `CameraScannerResponse`.| +|status (CameraScannerStatus)| Define el estado de la respuesta. Puede ser **Ok** (la lectura fue exitosa), **Error** (hubo un error o la lectura se canceló) o **Unknown** (hubo algún error indeterminado).| +|message (String)| Define el mensaje de la respuesta recibida por escaner. Si es ”Ok”, tendrá el resultado de la lectura del código.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/scan-qr-code.pt.md b/guides/mp-point-main-apps/scan-qr-code.pt.md new file mode 100644 index 0000000000..8a42ac5db2 --- /dev/null +++ b/guides/mp-point-main-apps/scan-qr-code.pt.md @@ -0,0 +1,70 @@ +# Escanear código QR + +Para iniciar a leitura de códigos QR da [Point Smart](/developers/pt/docs/mp-point/landing), use a função `initQRCodeScanner` da classe `CameraScanner`. Esse processo utiliza uma chamada de câmera mediante `startActivityForResult`, de modo que o método `onActivityResult` deve ser implementado na atividade para manipular a resposta de leitura. + +Confira o exemplo a seguir. + +[[[ +```kotlin +val cameraScanner = MPManager.cameraScanner +cameraScanner.initQRCodeScanner(this@YourActivity) +``` +```java +final CameraScanner cameraScanner = MPManager.INSTANCE.getCameraScanner(); +cameraScanner.initQRCodeScanner(this); +``` +]]] + +## Gerenciar resposta + +Para gerenciar a resposta do escâner de código QR, use a função `handleQrResponse` da classe `CameraScanner` no método `onActivityResult`. Essa função devolve o objeto `[MPResponse]` que encapsula o estado, o erro (se houver) e os dados em caso de sucesso, que contêm um objeto `CameraScannerResponse` representando a resposta da leitura. + +Confira como isso ocorre a seguir. + +[[[ +```kotlin +override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { +   super.onActivityResult(requestCode, resultCode, data) + +   val cameraScanner = MPManager.cameraScanner +   val response = cameraScanner.handleQrResponse(resultCode, data) + +   response.doIfSuccess { result -> +       // Gerenciar resposta bem-sucedida +       val status = result.status +       val message = result.message +       // ... Hacer algo con la respuesta +   }.doIfError { error -> +       // Fazer algo com a resposta +       val errorMessage = error.message +       // ... Fazer algo com o erro +   } +} +``` +```java +@Override +protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + final CameraScanner cameraScanner = MPManager.INSTANCE.getCameraScanner(); + final MPResponse response = cameraScanner.handleQrResponse(resultCode, data); + + if (response.getStatus() == ResponseStatus.SUCCESS) { +   // Gerenciar resposta bem-sucedida +   final CameraScannerStatus status = response.getData().getStatus(); +   final String message = response.getData().getMessage(); + } else { +   // Gerenciar o erro na resposta +   final String errorMessage = response.getError().getMessage(); + } +} +``` +]]] + +|Campo|Descrição| +|---|---| +|resultCode (Int)| Valor do `resultCode` em `onActivityResult`.| +|resultData (Intent)|Valor de data em `onActivityResult`.| +|MPResponse| Objeto `[MPResponse]` que encapsula o estado, o erro (se houver) e os dados em caso de sucesso, que contêm um objeto `CameraScannerResponse`.| +|status (CameraScannerStatus)| Define o estado da resposta. Pode ser **Ok** (a leitura foi exitosa), **Error** (houve um erro ou a leitura foi cancelada) ou **Unknown** (ocorreu um erro indeterminado).| +|message (String)| Define a mensagem da resposta recebida pelo escâner. Se é ”Ok”, conterá o resultado da leitura do código.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/start-payment-flow.en.md b/guides/mp-point-main-apps/start-payment-flow.en.md index a5b08700cf..1fe377c514 100644 --- a/guides/mp-point-main-apps/start-payment-flow.en.md +++ b/guides/mp-point-main-apps/start-payment-flow.en.md @@ -188,7 +188,7 @@ if (!response.getPaymentReference().isEmpty()) { |Field|Description| |---|---| -|response (Uri)| The response received by the SmartPOS. To find it, use `intent.data` of the Activity in charge of opening the deeplink set within the `buildCallbackUri` feature.| +|response (Uri)| The response received by the [SmartPOS](/developers/en/docs/mp-point/landing). To find it, use `intent.data` of the Activity in charge of opening the deeplink set within the `buildCallbackUri` feature.| |PaymentResponse| Object that contains transaction details. If the response is null, it brings a `PaymentResponse` object with a `paymentStatusError`.| |paymentMethod| Payment method used to complete the transaction. E.g.: credit card, debit card, QR code, payment link. | |paymentReference| Unique transaction identifying number.| diff --git a/guides/mp-point-main-apps/start-payment-flow.es.md b/guides/mp-point-main-apps/start-payment-flow.es.md index 604a18c8f7..d78428d7f2 100644 --- a/guides/mp-point-main-apps/start-payment-flow.es.md +++ b/guides/mp-point-main-apps/start-payment-flow.es.md @@ -188,7 +188,7 @@ if (!response.getPaymentReference().isEmpty()) { |Campo|Descripción| |---|---| -|response (Uri)| La respuesta recibida de SmartPOS. Para encontrarla, usa `intent.data` de la _Activity_ encargada de abrir el _deeplink_ configurado dentro de la función `buildCallbackUri`.| +|response (Uri)| La respuesta recibida de [SmartPOS](/developers/es/docs/mp-point/landing). Para encontrarla, usa `intent.data` de la _Activity_ encargada de abrir el _deeplink_ configurado dentro de la función `buildCallbackUri`.| |PaymentResponse| Objeto que contiene detalles de la operación. Si la respuesta es nula, se devuelve un `PaymentResponse` con un `paymentStatusError`.| |paymentMethod| Medio de pago usado para hacer la operación. Ejemplos: crédito, débito, código QR, link de pago. | |paymentReference| Número identificador único de la operación.| diff --git a/guides/mp-point-main-apps/start-payment-flow.pt.md b/guides/mp-point-main-apps/start-payment-flow.pt.md index 85d24dd02f..f51ecb2b2c 100644 --- a/guides/mp-point-main-apps/start-payment-flow.pt.md +++ b/guides/mp-point-main-apps/start-payment-flow.pt.md @@ -188,7 +188,7 @@ if (!response.getPaymentReference().isEmpty()) { |Campo|Descrição| |---|---| -|response (Uri)| A resposta recebida da SmartPOS. Para encontrá-la, use `intent.data` da _Activity_ encarregada de abrir o _deeplink_ configurado dentro da função `buildCallbackUri`.| +|response (Uri)| A resposta recebida da [SmartPOS](/developers/pt/docs/mp-point/landing). Para encontrá-la, use `intent.data` da _Activity_ encarregada de abrir o _deeplink_ configurado dentro da função `buildCallbackUri`.| |PaymentResponse| Objeto que contém detalhes da transação. Se a resposta é nula, é devolvido um objeto `PaymentResponse` com um `paymentStatusError`.| |paymentMethod| Meio de pagamento usado para fazer a transação. Exemplos: crédito, débito, código QR, link de pagamento etc. | |paymentReference| Número identificador único da transação.| From 975782744c39bc5d3515b8ab9a5a6cf90f2e2db2 Mon Sep 17 00:00:00 2001 From: hgaldino Date: Mon, 19 Aug 2024 13:01:46 -0300 Subject: [PATCH 05/34] 7 --- .../mp-point-main-apps/get-information.en.md | 14 +- .../mp-point-main-apps/get-information.es.md | 28 ++-- .../mp-point-main-apps/get-information.pt.md | 14 +- .../get-list-installments.en.md | 10 +- .../get-list-installments.es.md | 20 +-- .../get-list-installments.pt.md | 10 +- guides/mp-point-main-apps/manage-status.en.md | 150 ++++++++++++++++++ guides/mp-point-main-apps/manage-status.es.md | 150 ++++++++++++++++++ guides/mp-point-main-apps/manage-status.pt.md | 150 ++++++++++++++++++ guides/mp-point-main-apps/print-images.en.md | 4 +- guides/mp-point-main-apps/print-images.es.md | 4 +- guides/mp-point-main-apps/print-images.pt.md | 4 +- guides/mp-point-main-apps/scan-qr-code.en.md | 10 +- guides/mp-point-main-apps/scan-qr-code.es.md | 10 +- guides/mp-point-main-apps/scan-qr-code.pt.md | 10 +- .../start-payment-flow.en.md | 70 ++++---- .../start-payment-flow.es.md | 70 ++++---- .../start-payment-flow.pt.md | 70 ++++---- 18 files changed, 624 insertions(+), 174 deletions(-) create mode 100644 guides/mp-point-main-apps/manage-status.en.md create mode 100644 guides/mp-point-main-apps/manage-status.es.md create mode 100644 guides/mp-point-main-apps/manage-status.pt.md diff --git a/guides/mp-point-main-apps/get-information.en.md b/guides/mp-point-main-apps/get-information.en.md index 084ca7391f..b408bbcc28 100644 --- a/guides/mp-point-main-apps/get-information.en.md +++ b/guides/mp-point-main-apps/get-information.en.md @@ -43,10 +43,10 @@ smartInformationTools.getInformation(callback); |Field|Description| |---|---| -|smartDevice| Device details.| -|serialNumber| POS machine serial number.| -|brandName| POS machine brand.| -|modelName| POS machine model.| -|paymentModuleVersion| Version of the payment module of the [SmartPOS](/developers/en/docs/mp-point/landing).| -|integration| Integration SDK details.| -|nativeSdkVersion| Integration SDK version.| \ No newline at end of file +|**smartDevice**| Device details.| +|**serialNumber**| POS machine serial number.| +|**brandName**| POS machine brand.| +|**modelName**| POS machine model.| +|**paymentModuleVersion**| Version of the payment module of the [SmartPOS](/developers/en/docs/mp-point/landing).| +|**integration**| Integration SDK details.| +|**nativeSdkVersion**| Integration SDK version.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/get-information.es.md b/guides/mp-point-main-apps/get-information.es.md index 75a3922e53..f1d61f7f85 100644 --- a/guides/mp-point-main-apps/get-information.es.md +++ b/guides/mp-point-main-apps/get-information.es.md @@ -44,24 +44,24 @@ smartInformationTools.getInformation(callback); ----[mla, mlb]---- |Campo|Descripción| |---|---| -|smartDevice| detalles del dispositivo| -|serialNumber| número de serie del lector.| -|brandName| nombre de la marca del lector.| -|modelName| nombre del modelo del lector.| -|paymentModuleVersion| ersión del módulo de pago del [SmartPOS](/developers/en/docs/mp-point/landing).| -|integration| detalles del SDK de las integraciones.| -|nativeSdkVersion| versión del SDK de las integraciones.| +|**smartDevice**| detalles del dispositivo| +|**serialNumber**| número de serie del lector.| +|**brandName**| nombre de la marca del lector.| +|**modelName**| nombre del modelo del lector.| +|**paymentModuleVersion**| ersión del módulo de pago del [SmartPOS](/developers/en/docs/mp-point/landing).| +|**integration**| detalles del SDK de las integraciones.| +|**nativeSdkVersion**| versión del SDK de las integraciones.| ------------ ----[mlm]---- |Campo|Descripción| |---|---| -|smartDevice| detalles del dispositivo| -|serialNumber| número de serie de la terminal.| -|brandName| nombre de la marca de la terminal.| -|modelName| nombre del modelo de la terminal.| -|paymentModuleVersion| ersión del módulo de pago del [SmartPOS](/developers/en/docs/mp-point/landing).| -|integration| detalles del SDK de las integraciones.| -|nativeSdkVersion| versión del SDK de las integraciones.| +|**smartDevice**| detalles del dispositivo| +|**serialNumber**| número de serie de la terminal.| +|**brandName**| nombre de la marca de la terminal.| +|**modelName**| nombre del modelo de la terminal.| +|**paymentModuleVersion**| ersión del módulo de pago del [SmartPOS](/developers/en/docs/mp-point/landing).| +|**integration**| detalles del SDK de las integraciones.| +|**nativeSdkVersion**| versión del SDK de las integraciones.| ------------ \ No newline at end of file diff --git a/guides/mp-point-main-apps/get-information.pt.md b/guides/mp-point-main-apps/get-information.pt.md index 3be181c42f..f413dbfcc7 100644 --- a/guides/mp-point-main-apps/get-information.pt.md +++ b/guides/mp-point-main-apps/get-information.pt.md @@ -43,10 +43,10 @@ smartInformationTools.getInformation(callback); |Campo|Descrição| |---|---| -|smartDevice| Detalhes do dispositivo.| -|serialNumber| Número de série da maquininha.| -|brandName| Nome da marca da maquininha.| -|modelName| Nome do modelo da maquininha.| -|paymentModuleVersion| Versão do módulo de pagamento do [SmartPOS](/developers/pt/docs/mp-point/landing).| -|integration| Detalhes do SDK de integrações.| -|nativeSdkVersion| Versão do SDK de integrações.| \ No newline at end of file +|**smartDevice**| Detalhes do dispositivo.| +|**serialNumber**| Número de série da maquininha.| +|**brandName**| Nome da marca da maquininha.| +|**modelName**| Nome do modelo da maquininha.| +|**paymentModuleVersion**| Versão do módulo de pagamento do [SmartPOS](/developers/pt/docs/mp-point/landing).| +|**integration**| Detalhes do SDK de integrações.| +|**nativeSdkVersion**| Versão do SDK de integrações.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/get-list-installments.en.md b/guides/mp-point-main-apps/get-list-installments.en.md index 20de60e6c8..9361614ab7 100644 --- a/guides/mp-point-main-apps/get-list-installments.en.md +++ b/guides/mp-point-main-apps/get-list-installments.en.md @@ -47,8 +47,8 @@ paymentInstallmentTools.getInstallmentsAmount(callback, amount); |Field|Description| |---|---| -|callback ((MPResponse>) -> Unit)|Response feature with the result of the request of the list of installments.| -|amount (String)|Amount with which the list of installments is determined.| -|installment (Int)|Number of installments.| -|amount (Double)|Amount of each installment.| -|financialAmount (Double)|Interest rate for each installment.| \ No newline at end of file +|**callback ((MPResponse>) -> Unit)**|Response feature with the result of the request of the list of installments.| +|**amount (String)**|Amount with which the list of installments is determined.| +|**installment (Int)**|Number of installments.| +|**amount (Double)**|Amount of each installment.| +|**financialAmount (Double)**|Interest rate for each installment.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/get-list-installments.es.md b/guides/mp-point-main-apps/get-list-installments.es.md index fb5b962b1e..fdef722d83 100644 --- a/guides/mp-point-main-apps/get-list-installments.es.md +++ b/guides/mp-point-main-apps/get-list-installments.es.md @@ -56,11 +56,11 @@ paymentInstallmentTools.getInstallmentsAmount(callback, amount); |Campo|Descripción| |---|---| -|callback ((MPResponse>) -> Unit)|Función de respuesta con el resultado de la solicitud de la lista de cuotas.| -|amount (String)|Monto con el cual se determina la lista de cuotas.| -|installment (Int)|Número de cuotas.| -|amount (Double)|Monto de cada cuota.| -|financialAmount (Double)|Porcentaje de interés de cada cuota.| +|**callback ((MPResponse>) -> Unit)**|Función de respuesta con el resultado de la solicitud de la lista de cuotas.| +|**amount (String)**|Monto con el cual se determina la lista de cuotas.| +|**installment (Int)|**Número de cuotas.| +|**amount (Double)**|Monto de cada cuota.| +|**financialAmount (Double)**|Porcentaje de interés de cada cuota.| ------------ ----[mlm]---- @@ -96,10 +96,10 @@ paymentInstallmentTools.getInstallmentsAmount(callback, amount); |Campo|Descripción| |---|---| -|callback ((MPResponse>) -> Unit)|Función de respuesta con el resultado de la solicitud de la lista de mensualidades.| -|amount (String)|Monto con el cual se determina la lista de mensualidades.| -|installment (Int)|Número de mensualidades.| -|amount (Double)|Monto de cada mensualidade.| -|financialAmount (Double)|Porcentaje de interés de cada mensualidade.| +|**callback ((MPResponse>) -> Unit)**|Función de respuesta con el resultado de la solicitud de la lista de mensualidades.| +|**amount (String)**|Monto con el cual se determina la lista de mensualidades.| +|**installment (Int)**|Número de mensualidades.| +|**amount (Double)**|Monto de cada mensualidade.| +|**financialAmount (Double)**|Porcentaje de interés de cada mensualidade.| ------------ \ No newline at end of file diff --git a/guides/mp-point-main-apps/get-list-installments.pt.md b/guides/mp-point-main-apps/get-list-installments.pt.md index 654be034f9..ea30fb4929 100644 --- a/guides/mp-point-main-apps/get-list-installments.pt.md +++ b/guides/mp-point-main-apps/get-list-installments.pt.md @@ -47,8 +47,8 @@ paymentInstallmentTools.getInstallmentsAmount(callback, amount); |Campo|Descrição| |---|---| -|callback ((MPResponse>) -> Unit)|Função de resposta com o resultado da solicitação da lista de parcelas.| -|amount (String)|Valor com o qual se determina a lista de parcelas.| -|installment (Int)|Número de parcelas.| -|amount (Double)|Valor de cada parcela.| -|financialAmount (Double)|Porcentagem de acréscimo de cada parcela.| \ No newline at end of file +|**callback ((MPResponse>) -> Unit)**|Função de resposta com o resultado da solicitação da lista de parcelas.| +|**amount (String)**|Valor com o qual se determina a lista de parcelas.| +|**installment (Int)**|Número de parcelas.| +|**amount (Double)**|Valor de cada parcela.| +|**inancialAmount (Double)**|Porcentagem de acréscimo de cada parcela.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/manage-status.en.md b/guides/mp-point-main-apps/manage-status.en.md new file mode 100644 index 0000000000..e5007deab0 --- /dev/null +++ b/guides/mp-point-main-apps/manage-status.en.md @@ -0,0 +1,150 @@ +# Manage status + +Check how to activate, deactivate and validate the current status of the bluetooth using the `BluetoothIgnitor` class. + +## Activate bluetooth + +To activate the bluetooth on the [Smart POS](/developers/en/docs/mp-point/landing) machine, use the turnOn feature of the `BluetoothIgnitor` class on our SDK. You can access that feature through the MPManager object, as in the example below. + +[[[ +```kotlin +val bluetoothIgnitor = MPManager.bluetooth.ignitor + +bluetoothIgnitor.turnOn { response -> +   response +       .doIfSuccess { result -> +           if (result) { +               // Bluetooth was successfully activated +               // Perform additional actions if necessary +           } else { +               // It wasn’t possible to activate the bluetooth +           } +       }.doIfError { +           // Manage the error case if necessary +       } +} +``` +```java +final BluetoothIgnitor bluetoothIgnitor = MPManager.INSTANCE.getBluetooth().getIgnitor(); + +final Function1, Unit> callback = (final MPResponse response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   if (response.getData()) { +     // Bluetooth was successfully activated +     // Perform additional actions if necessary +   } else { +     // It wasn’t possible to activate the bluetooth +   } + } else { + +   // Manage the error case if necessary + } + return Unit.INSTANCE; +}; + +bluetoothIgnitor.turnOn(callback); +``` +]]] + +|Field|Description| +|---|---| +|**callback ((MPResponse) -> Unit)**| Request response feature that provides the result of the activation operation. The `[MPResponse]` includes the status, the error (if any) and the details in case of an error. The response contains a **boolean** value where `true` indicates that the bluetooth was activated and `false` the inability to do so.| + +## Deactivate bluetooth + +To deactivate the bluetooth on the [Point Smart](/developers/en/docs/mp-point/landing), use the feature `turnOff` from the `BluetoothIgnitor` class. The access is also done through `MPManager`, as shown below. + +[[[ +```kotlin +val bluetoothIgnitor = MPManager.bluetooth.ignitor + +bluetoothIgnitor.turnOff { response -> +   response +       .doIfSuccess { result -> +           if (!result) { +               // Bluetooth was successfully deactivated +               // Perform additional actions if necessary +           } else { +               // It wasn’t possible to deactivate the bluetooth +           } +       } +       .doIfError { error -> +           // Manage the error case +       } +} +``` +```java +final BluetoothIgnitor bluetoothIgnitor = MPManager.INSTANCE.getBluetooth().getIgnitor(); + +final Function1, Unit> callback = (final MPResponse response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   if (!response.getData()) { +     // Bluetooth was successfully deactivated +     // Perform additional actions if necessary +   } else { +     // It wasn’t possible to deactivate the bluetooth +   } + } else { + +   // Manage the error case if necessary + } + return Unit.INSTANCE; +}; + +bluetoothIgnitor.turnOff(callback); +``` +]]] + +|Field|Description| +|---|---| +|**callback ((MPResponse) -> Unit)**| Request response feature that provides the result of the deactivation operation. The `[MPResponse]` includes the status, the error (if any), and the details in case of success. The response contains a **boolean** value where `false` indicates that the bluetooth was deactivated and `true` the inability to do so.| + +## Validate the current status of the bluetooth + +The feature `getCurrentState` of the `BluetoothIgnitor` class is used to validate the activation status of the bluetooth on the [Point Smart](/developers/en/docs/mp-point/landing). The access is through the `BluetoothIgnitor` instance from the `MPManager`, as shown in the example below. + +[[[ +```kotlin +val bluetoothIgnitor = MPManager.bluetooth.ignitor + +bluetoothIgnitor.getCurrentState { result -> +   result +       .doIfSuccess { state -> +           if (state) { +               // Bluetooth is activated +               // Perform additional actions if necessary +           } else { +               // Bluetooth is deactivated +               // Perform additional actions if necessary +           } +       } +       .doIfError { error -> +           // Manage the error case if necessary +       } +} +``` +```java +final BluetoothIgnitor bluetoothIgnitor = MPManager.INSTANCE.getBluetooth().getIgnitor(); + +final Function1, Unit> callback = (final MPResponse response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   if (!response.getData()) { +     // Bluetooth is activated +     //Perform additional actions if necessary +   } else { +     // Bluetooth is deactivated +     // Perform additional actions if necessary +   } + } else { +   // Manage the error case if necessary + } + return Unit.INSTANCE; +}; + +bluetoothIgnitor.getCurrentState(callback); +``` +]]] + +|Field|Description| +|---|---| +|**callback ((MPResponse) -> Unit)**| Request response feature that provides the result the validation of the current status of the bluetooth. The `[MPResponse]` includes the status, the error (if any) and the details in case of success. The response contains a **boolean** value where `true` indicates that the bluetooth is activated and `false` indicates its deactivation.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/manage-status.es.md b/guides/mp-point-main-apps/manage-status.es.md new file mode 100644 index 0000000000..69c9553242 --- /dev/null +++ b/guides/mp-point-main-apps/manage-status.es.md @@ -0,0 +1,150 @@ +# Gestionar estado + +Consulta cómo activar, desactivar y validar el estado actual del bluetooth usando la clase `BluetoothIgnitor`. + +## Activar el bluetooth + +Para activar el bluetooth en el lector [Smart](/developers/es/docs/mp-point/landing), usa la función turnOn de la clase `BluetoothIgnitor` en nuestro SDK. Puedes acceder a esta función a través del objeto MPManager, como en el ejemplo a continuación. + +[[[ +```kotlin +val bluetoothIgnitor = MPManager.bluetooth.ignitor + +bluetoothIgnitor.turnOn { response -> +   response +       .doIfSuccess { result -> +           if (result) { +               // Bluetooth se encendió con éxito +               // Realizar acciones adicionales si es necesario +           } else { +               // No se pudo encender el Bluetooth +           } +       }.doIfError { +           // Manejar el caso de error si es necesario +       } +} +``` +```java +final BluetoothIgnitor bluetoothIgnitor = MPManager.INSTANCE.getBluetooth().getIgnitor(); + +final Function1, Unit> callback = (final MPResponse response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   if (response.getData()) { +     // Bluetooth se encendió con éxito +     // Realizar acciones adicionales si es necesario +   } else { +     // No se pudo encender el Bluetooth +   } + } else { + +   // Manejar el caso de error si es necesario + } + return Unit.INSTANCE; +}; + +bluetoothIgnitor.turnOn(callback); +``` +]]] + +|Campo|Descripción| +|---|---| +|**callback ((MPResponse) -> Unit)**| Función de devolución del llamado que ofrece el resultado de la operación de activación. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito. La respuesta tiene un valor **booleano**, en el que `true` indica que el bluetooth se activó y `false`, la incapacidad de hacerlo.| + +## Desactivar el bluetooth + +Para desactivar el bluetooth en el [Point Smart](/developers/es/docs/mp-point/landing), usa la función `turnOff` de la clase `BluetoothIgnitor`. El acceso también se hace a través del `MPManager`, como se muestra a continuación. + +[[[ +```kotlin +val bluetoothIgnitor = MPManager.bluetooth.ignitor + +bluetoothIgnitor.turnOff { response -> +   response +       .doIfSuccess { result -> +           if (!result) { +               // Bluetooth se apagó con éxito +               // Realizar acciones adicionales si es necesario +           } else { +               // No se pudo apagar el Bluetooth +           } +       } +       .doIfError { error -> +           // Manejar el caso de error +       } +} +``` +```java +final BluetoothIgnitor bluetoothIgnitor = MPManager.INSTANCE.getBluetooth().getIgnitor(); + +final Function1, Unit> callback = (final MPResponse response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   if (!response.getData()) { +     // Bluetooth se apagó con éxito +     // Realizar acciones adicionales si es necesario +   } else { +     // No se pudo apagar el Bluetooth +   } + } else { + +   // Manejar el caso de error si es necesario + } + return Unit.INSTANCE; +}; + +bluetoothIgnitor.turnOff(callback); +``` +]]] + +|Campo|Descripción| +|---|---| +|**callback ((MPResponse) -> Unit)**| Función de devolución del llamado que ofrece el resultado de la operación de desactivado. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito. La respuesta tiene un valor **booleano**, en el que `false` indica que o bluetooth se desactivó y `true`, la incapacidad de hacerlo.| + +## Validar el estado actual del bluetooth + +La función `getCurrentState` de la clase `BluetoothIgnitor` se emplea para validar el estado de activación del bluetooth en el [Point Smart](/developers/es/docs/mp-point/landing). El acceso se hace en la instancia `BluetoothIgnitor` a través del `MPManager`, como en el ejemplo a continuación. + +[[[ +```kotlin +val bluetoothIgnitor = MPManager.bluetooth.ignitor + +bluetoothIgnitor.getCurrentState { result -> +   result +       .doIfSuccess { state -> +           if (state) { +               // Bluetooth está encendido +               // Realizar acciones adicionales si es necesario +           } else { +               // Bluetooth está apagado +               // Realizar acciones adicionales si es necesario +           } +       } +       .doIfError { error -> +           // Manejar el caso de error si es necesario +       } +} +``` +```java +final BluetoothIgnitor bluetoothIgnitor = MPManager.INSTANCE.getBluetooth().getIgnitor(); + +final Function1, Unit> callback = (final MPResponse response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   if (!response.getData()) { +     // Bluetooth está encendido +     // Realizar acciones adicionales si es necesario +   } else { +     // Bluetooth está apagado +     // Realizar acciones adicionales si es necesario +   } + } else { +   // Manejar el caso de error si es necesario + } + return Unit.INSTANCE; +}; + +bluetoothIgnitor.getCurrentState(callback); +``` +]]] + +|Campo|Descripción| +|---|---| +|**callback ((MPResponse) -> Unit)**| Función de devolución del lado que ofrece el resultado de la validación del estado atual del bluetooth. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito. La respuesta tiene un valor **booleano**, en el que `true` indica que el bluetooth está activado y `false`, su desactivación.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/manage-status.pt.md b/guides/mp-point-main-apps/manage-status.pt.md new file mode 100644 index 0000000000..fcc089bf9f --- /dev/null +++ b/guides/mp-point-main-apps/manage-status.pt.md @@ -0,0 +1,150 @@ +# Gerenciar status + +Confira como ativar, desativar e validar o estado atual do bluetooth utilizando a classe `BluetoothIgnitor`. + +## Ativar o bluetooth + +Para ativar o bluetooth na maquininha [Smart](/developers/pt/docs/mp-point/landing), use a função `turnOn` da classe `BluetoothIgnitor` em nosso SDK. Você pode acessar essa função através do objeto `MPManager`, como no exemplo abaixo. + +[[[ +```kotlin +val bluetoothIgnitor = MPManager.bluetooth.ignitor + +bluetoothIgnitor.turnOn { response -> +   response +       .doIfSuccess { result -> +           if (result) { +               // O Bluetooth foi ativado com sucesso +               // Realizar ações adicionais, se necessário +           } else { +               // Não foi possível ativar o Bluetooth +           } +       }.doIfError { +           // Gerenciar o caso de erro, se necessário +       } +} +``` +```java +final BluetoothIgnitor bluetoothIgnitor = MPManager.INSTANCE.getBluetooth().getIgnitor(); + +final Function1, Unit> callback = (final MPResponse response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   if (response.getData()) { +     // O Bluetooth foi ativado com sucesso +     // Realizar ações adicionais, se necessário +   } else { +     // Não foi possível ativar o Bluetooth +   } + } else { + +   // Gerenciar o caso de erro, se necessário + } + return Unit.INSTANCE; +}; + +bluetoothIgnitor.turnOn(callback); +``` +]]] + +|Campo|Descrição| +|---|---| +|**callback ((MPResponse) -> Unit)**| Função de devolução da chamada que proporciona o resultado da operação de ativação. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados em caso de sucesso. A resposta contém um valor **booleano**, em que `true` indica que o bluetooth foi ativado e `false`, a incapacidade de fazê-lo.| + +## Desativar o bluetooth + +Para desativar o bluetooth na [Point Smart](/developers/pt/docs/mp-point/landing), use a função `turnOff` da classe `BluetoothIgnitor`. O acesso também é feito através do `MPManager`, como mostrado a seguir. + +[[[ +```kotlin +val bluetoothIgnitor = MPManager.bluetooth.ignitor + +bluetoothIgnitor.turnOff { response -> +   response +       .doIfSuccess { result -> +           if (!result) { +               // O Bluetooth foi desligado com sucesso +               // Realizar ações adicionais, se necessário +           } else { +               // Não foi possível desligar o Bluetooth +           } +       } +       .doIfError { error -> +           // Gerenciar o caso de erro, se necessário +       } +} +``` +```java +final BluetoothIgnitor bluetoothIgnitor = MPManager.INSTANCE.getBluetooth().getIgnitor(); + +final Function1, Unit> callback = (final MPResponse response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   if (!response.getData()) { +     // O Bluetooth foi desligado com sucesso +     // Realizar ações adicionais, se necessário +   } else { +     // Não foi possível desligar o Bluetooth +   } + } else { + +   // Gerenciar o caso de erro, se necessário + } + return Unit.INSTANCE; +}; + +bluetoothIgnitor.turnOff(callback); +``` +]]] + +|Campo|Descrição| +|---|---| +|**callback ((MPResponse) -> Unit)**| Função de devolução da chamada que proporciona o resultado da operação de desativação. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados em caso de sucesso. A resposta contém um valor **booleano**, em que `false` indica que o bluetooth foi desativado e `true`, a incapacidade de fazê-lo.| + +## Validar o estado atual do bluetooth + +A função `getCurrentState` da classe `BluetoothIgnitor` é empregada para validar o estado de ativação do bluetooth na [Point Smart](/developers/pt/docs/mp-point/landing). O acesso é feito pela instância `BluetoothIgnitor` através do `MPManager`, como no exemplo abaixo. + +[[[ +```kotlin +val bluetoothIgnitor = MPManager.bluetooth.ignitor + +bluetoothIgnitor.getCurrentState { result -> +   result +       .doIfSuccess { state -> +           if (state) { +               // O Bluetooth está ligado +               // Realizar ações adicionais, se necessário +           } else { +               // O Bluetooth está desligado +               // Realizar acciones adicionales si es necesario +           } +       } +       .doIfError { error -> +           // Gerenciar o caso de erro, se necessário +       } +} +``` +```java +final BluetoothIgnitor bluetoothIgnitor = MPManager.INSTANCE.getBluetooth().getIgnitor(); + +final Function1, Unit> callback = (final MPResponse response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   if (!response.getData()) { +     // O Bluetooth está ligado +     // Realizar ações adicionais, se necessário +   } else { +     // O Bluetooth está desligado +     // Realizar ações adicionais, se necessário +   } + } else { +   // Gerenciar o caso de erro, se necessário + } + return Unit.INSTANCE; +}; + +bluetoothIgnitor.getCurrentState(callback); +``` +]]] + +|Campo|Descrição| +|---|---| +|**callback ((MPResponse) -> Unit)**| Função de devolução da chamada que proporciona o resultado da validação do estado atual do bluetooth. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados em caso de sucesso. A resposta contém um valor **booleano**, em que `true` indica que o bluetooth está ativado e `false`, sua desativação.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/print-images.en.md b/guides/mp-point-main-apps/print-images.en.md index bba55476f1..89ce742ea7 100644 --- a/guides/mp-point-main-apps/print-images.en.md +++ b/guides/mp-point-main-apps/print-images.en.md @@ -34,5 +34,5 @@ bitmapPrinter.print(imageToPrint, callback); |Field|Description| |---|---| -|dataToPrint (Bitmap)| The bitmap image that will be printed.| -|PaymentResponse| Request response feature that provides the result of the printing operation. The `[MPResponse]` includes the status, the error (if any), and the details in case of success, which contain a String representing the ID or status of the printing.| \ No newline at end of file +|**dataToPrint (Bitmap)**| The bitmap image that will be printed.| +|**PaymentResponse**| Request response feature that provides the result of the printing operation. The `[MPResponse]` includes the status, the error (if any), and the details in case of success, which contain a String representing the ID or status of the printing.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/print-images.es.md b/guides/mp-point-main-apps/print-images.es.md index c00808a0a1..5118f252fa 100644 --- a/guides/mp-point-main-apps/print-images.es.md +++ b/guides/mp-point-main-apps/print-images.es.md @@ -34,5 +34,5 @@ bitmapPrinter.print(imageToPrint, callback); |Campo|Descripción| |---|---| -|dataToPrint (Bitmap)| La imagen bitmap que se imprimirá.| -|PaymentResponse| Función de devolución del llamado que ofrece la operación de impresión. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito, que tiene un **String** representando el ID o estado de la impresión.| \ No newline at end of file +|**dataToPrint (Bitmap)**| La imagen bitmap que se imprimirá.| +|**PaymentResponse**| Función de devolución del llamado que ofrece la operación de impresión. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito, que tiene un **String** representando el ID o estado de la impresión.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/print-images.pt.md b/guides/mp-point-main-apps/print-images.pt.md index 584bd51e57..723eeac2f3 100644 --- a/guides/mp-point-main-apps/print-images.pt.md +++ b/guides/mp-point-main-apps/print-images.pt.md @@ -34,5 +34,5 @@ bitmapPrinter.print(imageToPrint, callback); |Campo|Descrição| |---|---| -|dataToPrint (Bitmap)| A imagem bitmap que será impressa.| -|PaymentResponse| Função de devolução da chamada que proporciona o resultado da operação de impressão. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados em caso de sucesso, que contêm um String representando o ID ou estado da impressão.| \ No newline at end of file +|**dataToPrint (Bitmap)**| A imagem bitmap que será impressa.| +|**PaymentResponse**| Função de devolução da chamada que proporciona o resultado da operação de impressão. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados em caso de sucesso, que contêm um String representando o ID ou estado da impressão.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/scan-qr-code.en.md b/guides/mp-point-main-apps/scan-qr-code.en.md index b45894f86d..02bcdd553f 100644 --- a/guides/mp-point-main-apps/scan-qr-code.en.md +++ b/guides/mp-point-main-apps/scan-qr-code.en.md @@ -63,8 +63,8 @@ protected void onActivityResult(final int requestCode, final int resultCode, |Field|Description| |---|---| -|resultCode (Int)| Value of the `resultCode` in `onActivityResult`.| -|resultData (Intent)| Date result in `onActivityResult`.| -|MPResponse| Object [MPResponse] that includes the status, the error (if any), and the details in case of success, which contain an `CameraScannerResponse` object.| -|status (CameraScannerStatus)| Defines the status of the response. It can be **Ok** (it read it successfully), **Error** (something went wrong and it was cancelled) or **Unknown** (something went wrong).| -|message (String)| Defines the response message received by the scanner. If it’s ”Ok”, it will have the result of the reading of the code| +|**resultCode (Int)**| Value of the `resultCode` in `onActivityResult`.| +|**resultData (Intent)**| Date result in `onActivityResult`.| +|**MPResponse**| Object [MPResponse] that includes the status, the error (if any), and the details in case of success, which contain an `CameraScannerResponse` object.| +|**status (CameraScannerStatus)**| Defines the status of the response. It can be **Ok** (it read it successfully), **Error** (something went wrong and it was cancelled) or **Unknown** (something went wrong).| +|**message (String)**| Defines the response message received by the scanner. If it’s ”Ok”, it will have the result of the reading of the code| diff --git a/guides/mp-point-main-apps/scan-qr-code.es.md b/guides/mp-point-main-apps/scan-qr-code.es.md index e99f8319fc..e50b7d5790 100644 --- a/guides/mp-point-main-apps/scan-qr-code.es.md +++ b/guides/mp-point-main-apps/scan-qr-code.es.md @@ -63,8 +63,8 @@ protected void onActivityResult(final int requestCode, final int resultCode, |Campo|Descripción| |---|---| -|resultCode (Int)| Valor del `resultCode` en `onActivityResult`| -|resultData (Intent)| Valor de la fecha en `onActivityResult`.| -|MPResponse| Objeto `[MPResponse]` que encapsula el estado, el error (si lo hay) y los datos en caso de éxito, que tiene un objeto `CameraScannerResponse`.| -|status (CameraScannerStatus)| Define el estado de la respuesta. Puede ser **Ok** (la lectura fue exitosa), **Error** (hubo un error o la lectura se canceló) o **Unknown** (hubo algún error indeterminado).| -|message (String)| Define el mensaje de la respuesta recibida por escaner. Si es ”Ok”, tendrá el resultado de la lectura del código.| \ No newline at end of file +|**resultCode (Int)**| Valor del `resultCode` en `onActivityResult`| +|**resultData (Intent)**| Valor de la fecha en `onActivityResult`.| +|**MPResponse**| Objeto `[MPResponse]` que encapsula el estado, el error (si lo hay) y los datos en caso de éxito, que tiene un objeto `CameraScannerResponse`.| +|**status (CameraScannerStatus)**| Define el estado de la respuesta. Puede ser **Ok** (la lectura fue exitosa), **Error** (hubo un error o la lectura se canceló) o **Unknown** (hubo algún error indeterminado).| +|**message (String)**| Define el mensaje de la respuesta recibida por escaner. Si es ”Ok”, tendrá el resultado de la lectura del código.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/scan-qr-code.pt.md b/guides/mp-point-main-apps/scan-qr-code.pt.md index 8a42ac5db2..788976e194 100644 --- a/guides/mp-point-main-apps/scan-qr-code.pt.md +++ b/guides/mp-point-main-apps/scan-qr-code.pt.md @@ -63,8 +63,8 @@ protected void onActivityResult(final int requestCode, final int resultCode, |Campo|Descrição| |---|---| -|resultCode (Int)| Valor do `resultCode` em `onActivityResult`.| -|resultData (Intent)|Valor de data em `onActivityResult`.| -|MPResponse| Objeto `[MPResponse]` que encapsula o estado, o erro (se houver) e os dados em caso de sucesso, que contêm um objeto `CameraScannerResponse`.| -|status (CameraScannerStatus)| Define o estado da resposta. Pode ser **Ok** (a leitura foi exitosa), **Error** (houve um erro ou a leitura foi cancelada) ou **Unknown** (ocorreu um erro indeterminado).| -|message (String)| Define a mensagem da resposta recebida pelo escâner. Se é ”Ok”, conterá o resultado da leitura do código.| \ No newline at end of file +|**resultCode (Int)**| Valor do `resultCode` em `onActivityResult`.| +|**resultData (Intent)**|Valor de data em `onActivityResult`.| +|**MPResponse**| Objeto `[MPResponse]` que encapsula o estado, o erro (se houver) e os dados em caso de sucesso, que contêm um objeto `CameraScannerResponse`.| +|**status (CameraScannerStatus)**| Define o estado da resposta. Pode ser **Ok** (a leitura foi exitosa), **Error** (houve um erro ou a leitura foi cancelada) ou **Unknown** (ocorreu um erro indeterminado).| +|**message (String)**| Define a mensagem da resposta recebida pelo escâner. Se é ”Ok”, conterá o resultado da leitura do código.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/start-payment-flow.en.md b/guides/mp-point-main-apps/start-payment-flow.en.md index 1fe377c514..610d387424 100644 --- a/guides/mp-point-main-apps/start-payment-flow.en.md +++ b/guides/mp-point-main-apps/start-payment-flow.en.md @@ -88,16 +88,16 @@ paymentFlow.launchPaymentFlowActivity(paymentFlowData, context, callback); |Field|Description| |---|---| -|amount (String)| The amount used to start the payment flow.| -|description (String)| The description used to start the payment flow. Using it is optional.| -|intentSuccess (Uri)| URI that requests the success screen. It’s used to create a deeplink that leads to the success activity.| -|intentError (Uri)| URI that requests the error screen. It’s used to create a deeplink that leads to the error activity.| -|paymentMethod (String)| The payment method to complete the transaction. Using it is optional.| -|installments (Int)| The number of installments used to start the payment flow, Available only for Brazil. Using it is optional.| -|launchPaymentFlowActivity| This method starts the payment flow using the SmartPOS app.| -|paymentFlowData (PaymentFlowData)| Detail model necessary to open the flow.| -|context (Context)| Context from where the flow will begin.| -|callback (MPResponse -> Unit)| Provides the result of the opening of the payment flow.| +|**amount (String)**| The amount used to start the payment flow.| +|**description (String)**| The description used to start the payment flow. Using it is optional.| +|**intentSuccess (Uri)**| URI that requests the success screen. It’s used to create a deeplink that leads to the success activity.| +|**intentError (Uri)**| URI that requests the error screen. It’s used to create a deeplink that leads to the error activity.| +|**paymentMethod (String)**| The payment method to complete the transaction. Using it is optional.| +|**installments (Int)**| The number of installments used to start the payment flow, Available only for Brazil. Using it is optional.| +|**launchPaymentFlowActivity**| This method starts the payment flow using the SmartPOS app.| +|**paymentFlowData (PaymentFlowData)**| Detail model necessary to open the flow.| +|**context (Context)**| Context from where the flow will begin.| +|**callback (MPResponse -> Unit)**| Provides the result of the opening of the payment flow.| ## Build a URI to open the payment flow @@ -139,25 +139,25 @@ final Uri uriResult = paymentFlow.buildCallbackUri( |Field|Description| |---|---| -|callback (String)| The value of the URI to request the deeplink. E.g.: `yourHost://tuApp/test`.| -|methodCallback (String)| Identifies if the URI is for a success, error or another custom response. | -|metadata (HashMap)| Optional field to send information to the response screen, in case it’s necessary to show additional details, like the name of the customer or the summary of the products that were purchased.| -|appID (String)| Identifier of the main app. We use the package name. E.g.: `com.yourcompany.yourapp`.| -|Uri| the URI defined with the information provided.| +|**callback (String)**| The value of the URI to request the deeplink. E.g.: `yourHost://tuApp/test`.| +|**methodCallback (String)**| Identifies if the URI is for a success, error or another custom response. | +|**metadata (HashMap)**| Optional field to send information to the response screen, in case it’s necessary to show additional details, like the name of the customer or the summary of the products that were purchased.| +|**appID (String)**| Identifier of the main app. We use the package name. E.g.: `com.yourcompany.yourapp`.| +|**Uri**| the URI defined with the information provided.| ## Get the payment response The feature `parseResponse` of the `PaymentFlow` class is used to receive the result of the payment flow, which is delivered as the `PaymentResponse` object ready for its handling. In this process, the following information is provided: -- Payment method used. -- Payment reference. -- Creation date. -- Payment amount. -- Serial number of the POS machine. -- Card brand. -- Number of installments. -- Last four digits of the card. -- Any errors associated with the transaction. +- **Payment method used.** +- **Payment reference.** +- **Creation date.** +- **Payment amount.** +- **Serial number of the POS machine.** +- **Card brand.** +- **Number of installments.** +- **Last four digits of the card.** +- **Any errors associated with the transaction.** Check how to implement this feature: @@ -188,17 +188,17 @@ if (!response.getPaymentReference().isEmpty()) { |Field|Description| |---|---| -|response (Uri)| The response received by the [SmartPOS](/developers/en/docs/mp-point/landing). To find it, use `intent.data` of the Activity in charge of opening the deeplink set within the `buildCallbackUri` feature.| -|PaymentResponse| Object that contains transaction details. If the response is null, it brings a `PaymentResponse` object with a `paymentStatusError`.| -|paymentMethod| Payment method used to complete the transaction. E.g.: credit card, debit card, QR code, payment link. | -|paymentReference| Unique transaction identifying number.| -|paymentCreationDate| Creation date of the transaction.| -|paymentAmount| Payment amount.| -|paymentSnDevice| Serial number of the POS machine with which the transaction was done.| -|paymentBrandName| User name registered in the POS machine.| -|paymentInstallments| Number of installments that a person selected when completing the payment. | -|paymentLastFourDigits| Last four digits of the card used for the payment.| -|paymentStatusError| Field to register transaction problems or errors.| +|**response (Uri)**| The response received by the [SmartPOS](/developers/en/docs/mp-point/landing). To find it, use `intent.data` of the Activity in charge of opening the deeplink set within the `buildCallbackUri` feature.| +|**PaymentResponse**| Object that contains transaction details. If the response is null, it brings a `PaymentResponse` object with a `paymentStatusError`.| +|**paymentMethod**| Payment method used to complete the transaction. E.g.: credit card, debit card, QR code, payment link. | +|**paymentReference**| Unique transaction identifying number.| +|**paymentCreationDate**| Creation date of the transaction.| +|**paymentAmount**| Payment amount.| +|**paymentSnDevice**| Serial number of the POS machine with which the transaction was done.| +|**paymentBrandName**| User name registered in the POS machine.| +|**paymentInstallments**| Number of installments that a person selected when completing the payment. | +|**paymentLastFourDigits**| Last four digits of the card used for the payment.| +|**paymentStatusError**| Field to register transaction problems or errors.| > WARNING > diff --git a/guides/mp-point-main-apps/start-payment-flow.es.md b/guides/mp-point-main-apps/start-payment-flow.es.md index d78428d7f2..480b86556b 100644 --- a/guides/mp-point-main-apps/start-payment-flow.es.md +++ b/guides/mp-point-main-apps/start-payment-flow.es.md @@ -88,16 +88,16 @@ paymentFlow.launchPaymentFlowActivity(paymentFlowData, context, callback); |Campo|Descripción| |---|---| -|amount (String)|E l monto usado para iniciar el flujo de pago.| -|description (String)| La descripción usada para iniciar el flujo de pago. Su uso es opcional.| -|intentSuccess (Uri)| URI que llama la pantalla de éxito. Se usa para formar un deeplink que envía la actividad de éxito.| -|intentError (Uri)| URI que llama la pantalla de error. Se usa para formar un deeplink que envía la actividad de error.| -|paymentMethod (String)| El medio de pago para realizar la operación. Su uso es opcional.| -|installments (Int)| El número de cuotas usado para iniciar el flujo de pago. Está disponible solo para Brasil, y su uso es opcional.| -|launchPaymentFlowActivity| Este método inicia el flujo de pago usando la app SmartPOS.| -|paymentFlowData (PaymentFlowData)| Modelo de datos necesario para la apertura del flujo.| -|context (Context)| Contexto de dónde se inciará el flujo.| -|callback (MPResponse -> Unit)| Ofrece el resultado de la apertura del flujo de pago.| +|**amount (String)**|E l monto usado para iniciar el flujo de pago.| +|**description (String)**| La descripción usada para iniciar el flujo de pago. Su uso es opcional.| +|**intentSuccess (Uri)**| URI que llama la pantalla de éxito. Se usa para formar un deeplink que envía la actividad de éxito.| +|**intentError (Uri)**| URI que llama la pantalla de error. Se usa para formar un deeplink que envía la actividad de error.| +|**paymentMethod (String)**| El medio de pago para realizar la operación. Su uso es opcional.| +|**installments (Int)**| El número de cuotas usado para iniciar el flujo de pago. Está disponible solo para Brasil, y su uso es opcional.| +|**launchPaymentFlowActivity**| Este método inicia el flujo de pago usando la app SmartPOS.| +|**paymentFlowData (PaymentFlowData)**| Modelo de datos necesario para la apertura del flujo.| +|**context (Context)**| Contexto de dónde se inciará el flujo.| +|**callback (MPResponse -> Unit)**| Ofrece el resultado de la apertura del flujo de pago.| ## Construir una URI para apertura del flujo de pago @@ -139,25 +139,25 @@ final Uri uriResult = paymentFlow.buildCallbackUri( |Campo|Descripción| |---|---| -|callback (String)| El monto de la URI para llamar el _deeplink_. Ejemplo: `tuHost://tuApp/prueba`.| -|methodCallback (String)| Identifica si la URI es para un caso de éxito, de error u otra respuesta personalizada.| -|metadata (HashMap)| Campo opcional para enviar información a la pantalla de respuesta, en caso de que sea necesario mostrar detalles adicionales, como el nombre del cliente o el resumen de los productos comprados. | -|appID (String)|  Identificador de la app principal. Usamos el nombre del paquete. Ejemplo: `com.tuempresa.tuapp`.| -|Uri| La URI definida con la información ingresada.| +|**callback (String)**| El monto de la URI para llamar el _deeplink_. Ejemplo: `tuHost://tuApp/prueba`.| +|**methodCallback (String)**| Identifica si la URI es para un caso de éxito, de error u otra respuesta personalizada.| +|**metadata (HashMap)**| Campo opcional para enviar información a la pantalla de respuesta, en caso de que sea necesario mostrar detalles adicionales, como el nombre del cliente o el resumen de los productos comprados. | +|**appID (String)**|  Identificador de la app principal. Usamos el nombre del paquete. Ejemplo: `com.tuempresa.tuapp`.| +|**Uri**| La URI definida con la información ingresada.| ## Obtener el resultado del pago La función `parseResponse` de la clase `PaymentFlow` se usa para recibir el resultado del flujo de pago, que se entrega en forma de objeto `PaymentResponse` listo para su manipulación. En este proceso, la siguiente información se ofrece: -- Medio de pago usado. -- Referencia de pago. -- Fecha de creación. -- Monto del pago. -- Número de serie del lector. -- Marca de la tarjeta. -- Cantidad de cuotas. -- Últimos cuatro números de la tarjeta. -- Cualquier error asociado a la operación. +- **Medio de pago usado.** +- **Referencia de pago.** +- **Fecha de creación.** +- **Monto del pago.** +- **Número de serie del lector.** +- **Marca de la tarjeta.** +- **Cantidad de cuotas.** +- **Últimos cuatro números de la tarjeta.** +- **Cualquier error asociado a la operación.** Consulta cómo implementar esta funcionalidad: @@ -188,17 +188,17 @@ if (!response.getPaymentReference().isEmpty()) { |Campo|Descripción| |---|---| -|response (Uri)| La respuesta recibida de [SmartPOS](/developers/es/docs/mp-point/landing). Para encontrarla, usa `intent.data` de la _Activity_ encargada de abrir el _deeplink_ configurado dentro de la función `buildCallbackUri`.| -|PaymentResponse| Objeto que contiene detalles de la operación. Si la respuesta es nula, se devuelve un `PaymentResponse` con un `paymentStatusError`.| -|paymentMethod| Medio de pago usado para hacer la operación. Ejemplos: crédito, débito, código QR, link de pago. | -|paymentReference| Número identificador único de la operación.| -|paymentCreationDate| Fecha de creación de la operación.| -|paymentAmount|  Monto del pago.| -|paymentSnDevice| Número de serie del lector donde se hizo la operación.| -|paymentBrandName| Nombre de usuario registrado en el lector.| -|paymentInstallments| Número de cuotas que la persona seleccionó al hacer el pago.| -|paymentLastFourDigits| Últimos cuatro números de la tarjeta usada en el pago.| -|paymentStatusError| Campo para registrar problemas y errores de la operación.| +|**response (Uri)**| La respuesta recibida de [SmartPOS](/developers/es/docs/mp-point/landing). Para encontrarla, usa `intent.data` de la _Activity_ encargada de abrir el _deeplink_ configurado dentro de la función `buildCallbackUri`.| +|**PaymentResponse**| Objeto que contiene detalles de la operación. Si la respuesta es nula, se devuelve un `PaymentResponse` con un `paymentStatusError`.| +|**paymentMethod**| Medio de pago usado para hacer la operación. Ejemplos: crédito, débito, código QR, link de pago. | +|**paymentReference**| Número identificador único de la operación.| +|**paymentCreationDate**| Fecha de creación de la operación.| +|**paymentAmount**|  Monto del pago.| +|**paymentSnDevice**| Número de serie del lector donde se hizo la operación.| +|**paymentBrandName**| Nombre de usuario registrado en el lector.| +|**paymentInstallments**| Número de cuotas que la persona seleccionó al hacer el pago.| +|**paymentLastFourDigits**| Últimos cuatro números de la tarjeta usada en el pago.| +|**paymentStatusError**| Campo para registrar problemas y errores de la operación.| > WARNING > diff --git a/guides/mp-point-main-apps/start-payment-flow.pt.md b/guides/mp-point-main-apps/start-payment-flow.pt.md index f51ecb2b2c..b90f78bb09 100644 --- a/guides/mp-point-main-apps/start-payment-flow.pt.md +++ b/guides/mp-point-main-apps/start-payment-flow.pt.md @@ -88,16 +88,16 @@ paymentFlow.launchPaymentFlowActivity(paymentFlowData, context, callback); |Campo|Descrição| |---|---| -|amount (String)| O valor usado para iniciar o fluxo de pagamento.| -|description (String)| A descrição usada para iniciar o fluxo de pagamento. Seu uso é opcional.| -|intentSuccess (Uri)| URI que chama a tela de sucesso. É usada para formar um deeplink que envia a atividade de sucesso.| -|intentError (Uri)| URI que chama a tela de erro. É usada para formar um deeplink que envia a atividade de erro.| -|paymentMethod (String)| O meio de pagamento para realizar a transação. Seu uso é opcional.| -|installments (Int)| O número de parcelas usado para iniciar o fluxo de pagamento. Está disponível apenas para o Brasil e seu uso é opcional.| -|launchPaymentFlowActivity| Esse método inicia o fluxo de pagamento usando o aplicativo SmartPOS.| -|paymentFlowData (PaymentFlowData)| Modelo de dados necessário para a abertura do fluxo.| -|context (Context)| Contexto de onde será iniciado o fluxo.| -|callback (MPResponse -> Unit)| Proporciona o resultado da abertura do fluxo de pagamento.| +|**amount (String)**| O valor usado para iniciar o fluxo de pagamento.| +|**description (String)**| A descrição usada para iniciar o fluxo de pagamento. Seu uso é opcional.| +|**intentSuccess (Uri)**| URI que chama a tela de sucesso. É usada para formar um deeplink que envia a atividade de sucesso.| +|**intentError (Uri)**| URI que chama a tela de erro. É usada para formar um deeplink que envia a atividade de erro.| +|**paymentMethod (String)**| O meio de pagamento para realizar a transação. Seu uso é opcional.| +|**installments (Int)**| O número de parcelas usado para iniciar o fluxo de pagamento. Está disponível apenas para o Brasil e seu uso é opcional.| +|**launchPaymentFlowActivity**| Esse método inicia o fluxo de pagamento usando o aplicativo SmartPOS.| +|**paymentFlowData (PaymentFlowData)**| Modelo de dados necessário para a abertura do fluxo.| +|**context (Context)**| Contexto de onde será iniciado o fluxo.| +|**allback (MPResponse -> Unit)**| Proporciona o resultado da abertura do fluxo de pagamento.| ## Construir uma URI para abertura do fluxo de pagamento @@ -139,25 +139,25 @@ final Uri uriResult = paymentFlow.buildCallbackUri( |Campo|Descrição| |---|---| -|callback (String)| O valor da URI para chamar o _deeplink_. Exemplo: `tuHost://tuApp/prueba`.| -|methodCallback (String)| Identifica se a URI é para um caso de sucesso, erro ou outra resposta personalizada.| -|metadata (HashMap)| Campo opcional para enviar informação à tela de resposta, caso seja necessário mostrar detalhes adicionais, como o nome do cliente ou o resumo dos produtos comprados. | -|appID (String)| Identificador do aplicativo principal. Usamos o nome do pacote. Exemplo: `com.tuempresa.tuapp`.| -|Uri| A URI definida com a informação proporcionada.| +|**callback (String)**| O valor da URI para chamar o _deeplink_. Exemplo: `tuHost://tuApp/prueba`.| +|**methodCallback (String)**| Identifica se a URI é para um caso de sucesso, erro ou outra resposta personalizada.| +|**metadata (HashMap)**| Campo opcional para enviar informação à tela de resposta, caso seja necessário mostrar detalhes adicionais, como o nome do cliente ou o resumo dos produtos comprados. | +|**appID (String)**| Identificador do aplicativo principal. Usamos o nome do pacote. Exemplo: `com.tuempresa.tuapp`.| +|**Uri**| A URI definida com a informação proporcionada.| ## Obter o resultado do pagamento A função `parseResponse` da classe `PaymentFlow` é usada para receber o resultado do fluxo de pagamento, sendo entregue na forma de objeto `PaymentResponse` pronto para a sua manipulação. Nesse processo, as seguintes informações são proporcionadas: -- Meio de pagamento usado. -- Referência de pagamento. -- Data de criação. -- Valor do pagamento. -- Número de série da maquininha. -- Bandeira do cartão. -- Quantidade de parcelas. -- Últimos quatro dígitos do cartão. -- Qualquer erro associado à transação. +- **Meio de pagamento usado.** +- **Referência de pagamento.** +- **Data de criação.** +- **Valor do pagamento.** +- **Número de série da maquininha.** +- **Bandeira do cartão.** +- **Quantidade de parcelas.** +- **Últimos quatro dígitos do cartão.** +- **Qualquer erro associado à transação.** Confira como implementar esta funcionalidade: @@ -188,17 +188,17 @@ if (!response.getPaymentReference().isEmpty()) { |Campo|Descrição| |---|---| -|response (Uri)| A resposta recebida da [SmartPOS](/developers/pt/docs/mp-point/landing). Para encontrá-la, use `intent.data` da _Activity_ encarregada de abrir o _deeplink_ configurado dentro da função `buildCallbackUri`.| -|PaymentResponse| Objeto que contém detalhes da transação. Se a resposta é nula, é devolvido um objeto `PaymentResponse` com um `paymentStatusError`.| -|paymentMethod| Meio de pagamento usado para fazer a transação. Exemplos: crédito, débito, código QR, link de pagamento etc. | -|paymentReference| Número identificador único da transação.| -|paymentCreationDate| Data de criação da transação.| -|paymentAmount| Valor pago.| -|paymentSnDevice| Número de série da maquininha em que a transação foi feita.| -|paymentBrandName| Nome do usuário registrado na maquininha.| -|paymentInstallments| Número de parcelas que a pessoa selecionou ao fazer o pagamento.| -|paymentLastFourDigits| Últimos quatro dígitos do cartão usado no pagamento.| -|paymentStatusError| Campo para registrar problemas e erros da transação.| +|**response (Uri)**| A resposta recebida da [SmartPOS](/developers/pt/docs/mp-point/landing). Para encontrá-la, use `intent.data` da _Activity_ encarregada de abrir o _deeplink_ configurado dentro da função `buildCallbackUri`.| +|**PaymentResponse**| Objeto que contém detalhes da transação. Se a resposta é nula, é devolvido um objeto `PaymentResponse` com um `paymentStatusError`.| +|**paymentMethod**| Meio de pagamento usado para fazer a transação. Exemplos: crédito, débito, código QR, link de pagamento etc. | +|**paymentReference**| Número identificador único da transação.| +|**paymentCreationDate**| Data de criação da transação.| +|**paymentAmount**| Valor pago.| +|**paymentSnDevice**| Número de série da maquininha em que a transação foi feita.| +|**paymentBrandName**| Nome do usuário registrado na maquininha.| +|**aymentInstallments**| Número de parcelas que a pessoa selecionou ao fazer o pagamento.| +|**paymentLastFourDigits**| Últimos quatro dígitos do cartão usado no pagamento.| +|**paymentStatusError**| Campo para registrar problemas e erros da transação.| > WARNING > From 0018e14fe1055d7910055e987f75b36ac89e94ee Mon Sep 17 00:00:00 2001 From: hgaldino Date: Mon, 19 Aug 2024 18:13:45 -0300 Subject: [PATCH 06/34] 7 --- .../manage-connections.en.md | 162 ++++++++++++++++++ .../manage-connections.es.md | 162 ++++++++++++++++++ .../manage-connections.pt.md | 162 ++++++++++++++++++ guides/mp-point-main-apps/pair-unpair.en.md | 94 ++++++++++ guides/mp-point-main-apps/pair-unpair.es.md | 94 ++++++++++ guides/mp-point-main-apps/pair-unpair.pt.md | 94 ++++++++++ 6 files changed, 768 insertions(+) create mode 100644 guides/mp-point-main-apps/manage-connections.en.md create mode 100644 guides/mp-point-main-apps/manage-connections.es.md create mode 100644 guides/mp-point-main-apps/manage-connections.pt.md create mode 100644 guides/mp-point-main-apps/pair-unpair.en.md create mode 100644 guides/mp-point-main-apps/pair-unpair.es.md create mode 100644 guides/mp-point-main-apps/pair-unpair.pt.md diff --git a/guides/mp-point-main-apps/manage-connections.en.md b/guides/mp-point-main-apps/manage-connections.en.md new file mode 100644 index 0000000000..3d5b834333 --- /dev/null +++ b/guides/mp-point-main-apps/manage-connections.en.md @@ -0,0 +1,162 @@ +# Manage connections + +On our SDK, you can search for printers and other bluetooth devices, in addition to checking the ones paired with the POS machine. Learn how to continue. + +## Manage paired devices + +To get the list of paired devices with [Point Smart](/developers/en/docs/mp-point/landing) use the `getPairedDevices feature`, from the `BluetoothDiscoverDevices` class. Check below how to access it through the `MPManager`. + +[[[ +```kotlin +val bluetoothDiscoverDevices = MPManager.bluetooth.discover + +bluetoothDiscoverDevices.getPairedDevices { result -> +   result +       .doIfSuccess { devices -> +           // Work with the list of paired devices +       } +       .doIfError { error -> +           // Manage the error case if necessary +       } +} +``` +```java +final BluetoothDiscoverDevices bluetoothDiscoverDevices = MPManager.INSTANCE.getBluetooth().getDiscover(); + +final Function1>, Unit> callback = (final MPResponse> response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   final List devices = response.getData(); +   // Work with the list of paired devices + } else { +   // Manage the error case if necessary + } + return Unit.INSTANCE; +}; + +bluetoothDiscoverDevices.getPairedDevices(callback); +``` +]]] + +|Field|Description| +|---|---| +|**callback ((MPResponse>) -> Unit)**| Request response feature that provides the paired devices as a result. The `[MPResponse]` includes the status, the error (if any), and the details in case of success, in a list of `BluetoothDeviceModel` models.| +|**id (String)**| Unique identifier of the bluetooth device.| +|**boundState (Int)**| Pairing status of the device. It can have different values representing different status.| +|**name (String)**| Name of the device provided by the operational system.| +|**address (String)**| MAC address of the bluetooth device.| +|**isConnected (Boolean)**| Indicates if the device is connected. In a positive case, the answer is `true`; if disconnected, it appears as `false`.| + +## Get paired printers + +Use the `getPairedPrinterDevices` feature from the `BluetoothDiscoverDevices` class to check the list of bluetooth printers with the [Point Smart](/developers/en/docs/mp-point/landing). The access is done through the `MPManager object`, as in the example below. + +[[[ +```kotlin +val bluetoothDiscoverDevices = MPManager.bluetooth.discover + +bluetoothDiscoverDevices.getPairedPrinterDevices { result -> +   result +       .doIfSuccess { printers -> +           // Work with the list of paired devices +       } +       .doIfError { error -> +           // Manage the error case if necessary +       } +} +``` +```java +final BluetoothDiscoverDevices bluetoothDiscoverDevices = MPManager.INSTANCE.getBluetooth().getDiscover(); + +final Function1>, Unit> callback = (final MPResponse> response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   final List printers = response.getData(); +   // Work with the list of paired devices + } else { +   // Manage the error case if necessary + } + return Unit.INSTANCE; +}; + +bluetoothDiscoverDevices.getPairedPrinterDevices(callback); +``` +]]] + +|Field|Description| +|---|---| +|**callback ((MPResponse>) -> Unit)**| Request response feature that provides the paired printers as a result. The `[MPResponse]` includes the status, the error (if any) and the details in case of success in a list of `BluetoothDeviceModel` models.| +|**id (String)**| Unique identifier of the bluetooth device.| +|**boundState (Int)**| Pairing status of the device. It can have different values representing different status.| +|**name (String)**| Name of the device provided by the operational system.| +|**address (String)**| MAC address of the bluetooth device.|` +|**isConnected (Boolean)**| Indicates if the device is connected. In a positive case, the answer is `true`; if disconnected, it appears as `false`.| + +## Start search + +The `startDiscovery` feature from the `BluetoothDiscoverDevices` class starts the discovery of bluetooth devices. The access is through the `MPManager` object. This method makes the dynamic implementation of the logic based on events in your solution easier. Like this: + +[[[ +```kotlin +val bluetoothDiscover = MPManager.bluetooth.discover + +bluetoothDiscover.startDiscovery { response -> +   response +       .doIfSuccess { discoveryState -> +           when (discoveryState.type) { +               BluetoothDiscoveryState.Type.STARTED -> { +                   // Manage the start of the discovery +               } +               BluetoothDiscoveryState.Type.DEVICE_FOUND -> discoveryState.device?.let { device -> +                   // Manage the discovery of a new device +               } +               BluetoothDiscoveryState.Type.DEVICE_CHANGE -> discoveryState.device?.let { device -> +                   // Manage changes in a discovered device +               } +               BluetoothDiscoveryState.Type.ENDED -> { +                   // Manage the end of the discovery +               } +           } +       } +       .doIfError { error -> +           // Manage the error case if necessary +       } +} +``` +```java +final BluetoothDiscoverDevices bluetoothDiscoverDevices = MPManager.INSTANCE.getBluetooth().getDiscover(); + +final Function1, Unit> callback = (final MPResponse response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   switch (response.getData().getType()) { +     case STARTED: +       // Manage the start of the discovery +       break; +     case DEVICE_FOUND: +       // Manage the discovery of a new device +       final BluetoothDeviceModel foundDevice = response.getData().getDevice(); +       break; +     case DEVICE_CHANGE: +       // Manage changes in a discovered device +       final BluetoothDeviceModel changedDevice = response.getData().getDevice(); +       break; +     case ENDED: +       // Manage the end of the discovery + +   } + } else { +   // Manage the error case if necessary + } + return Unit.INSTANCE; +}; + +bluetoothDiscoverDevices.startDiscovery(callback); +``` +]]] + +|Field|Description| +|---|---| +|**callback ((MPResponse) -> Unit)**| Request response feature that provides the result of the discovery process. The `[MPResponse]` includes the status, the error (if any), and the details in case of success, containing a `BluetoothDiscoveryState` object that represents the current status of the discovery, events such as the start and end of the discovery and changes in the device.| +|**id (String)**| Unique identifier of the bluetooth device.| +|**boundState (Int)**| Pairing status of the device. It can have different values representing different status.| +|**name (String)**| Name of the device provided by the operational system.| +|**address (String)**| MAC address of the bluetooth device.|` +|**isConnected (Boolean)**| Indicates if the device is connected. In a positive case, the answer is `true`; if disconnected, it appears as `false`.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/manage-connections.es.md b/guides/mp-point-main-apps/manage-connections.es.md new file mode 100644 index 0000000000..26fb90a6c0 --- /dev/null +++ b/guides/mp-point-main-apps/manage-connections.es.md @@ -0,0 +1,162 @@ +# Gestionar conexiones + +En nuestro SDK, puedes buscar impresoras y otros dispositivos bluetooth, además de gestionar los que ya están emparejados al lector. Aprende cómo hacerlo. + +## Obtener dispositivos emparejados + +La obtención de la lista de dispositivos emparejados con el [Point Smart](/developers/es/docs/mp-point/landing) se hace usando la función `getPairedDevices`, de la clase `luetoothDiscoverDevices`. Consulta a continuación cómo acceder a ella a través del objeto `MPManager`. + +[[[ +```kotlin +val bluetoothDiscoverDevices = MPManager.bluetooth.discover + +bluetoothDiscoverDevices.getPairedDevices { result -> +   result +       .doIfSuccess { devices -> +           // Trabajar con la lista de dispositivos emparejados +       } +       .doIfError { error -> +           // Manejar el caso de error si es necesario +       } +} +``` +```java +final BluetoothDiscoverDevices bluetoothDiscoverDevices = MPManager.INSTANCE.getBluetooth().getDiscover(); + +final Function1>, Unit> callback = (final MPResponse> response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   final List devices = response.getData(); +   // Trabajar con la lista de dispositivos emparejados + } else { +   // Manejar el caso de error si es necesario + } + return Unit.INSTANCE; +}; + +bluetoothDiscoverDevices.getPairedDevices(callback); +``` +]]] + +|Campo|Descripción| +|---|---| +|**callback ((MPResponse>) -> Unit)**| Función de devolución del llamado que ofrece los dispositivos emparejados como resultado. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito, en una lista de modelos `BluetoothDeviceModel`.| +|**id (String)**| Identificador único del dispositivo bluetooth.| +|**boundState (Int)**| Estado de emparejamiento del dispositivo. Puede tener diferentes valores representando estados distintos.| +|**name (String)**| Nombre del dispositivo ofrecido por el sistema operacional.| +|**address (String)**| Dirección MAC del dispositivo bluetooth.| +|**isConnected (Boolean)**| Indica si el dispositivo está conectado. En caso de ser positivo, la respuesta es `true`. Si está desconectado, aparece como `false`.| + +## Obtener impresoras emparejadas + +Usa la función `getPairedPrinterDevices` de la clase `BluetoothDiscoverDevices` para consultar la lista de impresoras bluetooth emparejadas al [Point Smart](/developers/es/docs/mp-point/landing). El acceso se hace a través del objeto `MPManager`, como en el ejemplo a continuación. + +[[[ +```kotlin +val bluetoothDiscoverDevices = MPManager.bluetooth.discover + +bluetoothDiscoverDevices.getPairedPrinterDevices { result -> +   result +       .doIfSuccess { printers -> +           // Trabajar con la lista de dispositivos emparejados +       } +       .doIfError { error -> +           // Manejar el caso de error si es necesario +       } +} +``` +```java +final BluetoothDiscoverDevices bluetoothDiscoverDevices = MPManager.INSTANCE.getBluetooth().getDiscover(); + +final Function1>, Unit> callback = (final MPResponse> response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   final List printers = response.getData(); +   // Trabajar con la lista de dispositivos emparejados + } else { +   // Manejar el caso de error si es necesario + } + return Unit.INSTANCE; +}; + +bluetoothDiscoverDevices.getPairedPrinterDevices(callback); +``` +]]] + +|Campo|Descripción| +|---|---| +|**callback ((MPResponse>) -> Unit)**| Función de devolución del llamado que ofrece las impresonas emparejadas como resultado. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito en una lista de modelos `BluetoothDeviceModel`.| +|**id (String)**| Identificador único del dispositivo bluetooth.| +|**boundState (Int)**| Estado de emparejamiento del dispositivo. Puede tener diferentes valores representando estados distintos.| +|**name (String)**| Nombre del dispositivo ofrecido por el sistema operacional.| +|**address (String)**| Dirección MAC del dispositivo bluetooth.|` +|**isConnected (Boolean)**| Indica si el dispositivo está conectado. En caso de ser positivo, la respuesta es `true`. Si está desconectado, aparece como `false`.| + +## Iniciar búsqueda + +La función `startDiscovery` de la clase `BluetoothDiscoverDevices` inicia la búsqueda de dispositivos bluetooth. El acceso se hace a través del objeto `MPManager`. Este método facilita la implementación dinámica de la lógica basada en eventos en tu solución. Así: + +[[[ +```kotlin +val bluetoothDiscover = MPManager.bluetooth.discover + +bluetoothDiscover.startDiscovery { response -> +   response +       .doIfSuccess { discoveryState -> +           when (discoveryState.type) { +               BluetoothDiscoveryState.Type.STARTED -> { +                   // Manejar el inicio del descubrimiento +               } +               BluetoothDiscoveryState.Type.DEVICE_FOUND -> discoveryState.device?.let { device -> +                   // Manejar el descubrimiento de un nuevo dispositivo +               } +               BluetoothDiscoveryState.Type.DEVICE_CHANGE -> discoveryState.device?.let { device -> +                   // Manejar cambios en un dispositivo descubierto +               } +               BluetoothDiscoveryState.Type.ENDED -> { +                   // Manejar el fin del descubrimiento +               } +           } +       } +       .doIfError { error -> +           // Manejar el caso de error si es necesario +       } +} +``` +```java +final BluetoothDiscoverDevices bluetoothDiscoverDevices = MPManager.INSTANCE.getBluetooth().getDiscover(); + +final Function1, Unit> callback = (final MPResponse response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   switch (response.getData().getType()) { +     case STARTED: +       // Manejar el inicio del descubrimiento +       break; +     case DEVICE_FOUND: +       // Manejar el descubrimiento de un nuevo dispositivo +       final BluetoothDeviceModel foundDevice = response.getData().getDevice(); +       break; +     case DEVICE_CHANGE: +       // Manejar cambios en un dispositivo descubierto +       final BluetoothDeviceModel changedDevice = response.getData().getDevice(); +       break; +     case ENDED: +       // Manejar el fin del descubrimiento + +   } + } else { +   // Manejar el caso de error si es necesario + } + return Unit.INSTANCE; +}; + +bluetoothDiscoverDevices.startDiscovery(callback); +``` +]]] + +|Campo|Descripción| +|---|---| +|**callback ((MPResponse) -> Unit)**| Función de devolución del llamado que ofrece el resultado del proceso de búsqueda. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito, teniendo un objeto `BluetoothDiscoveryState` que representa el estado actual de la búsqueda, eventos como el inicio y el fin de la búsqueda y los cambios en el dispositivo.| +|**id (String)**| Identificador único del dispositivo bluetooth.| +|**boundState (Int)**| Estado de emparejamiento del dispositivo. Puede tener diferentes valores representando estados distintos.| +|**name (String)**| Nombre del dispositivo ofrecido por el sistema operacional.| +|**address (String)**| Dirección MAC del dispositivo bluetooth.|` +|**isConnected (Boolean)**| Indica si el dispositivo está conectado. En caso de ser positivo, la respuesta es `true`. Si está desconectado, aparece como `false`.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/manage-connections.pt.md b/guides/mp-point-main-apps/manage-connections.pt.md new file mode 100644 index 0000000000..4ab3114285 --- /dev/null +++ b/guides/mp-point-main-apps/manage-connections.pt.md @@ -0,0 +1,162 @@ +# Gerenciar conexões + +Em nosso SDK, você pode buscar impressoras e outros dispositivos bluetooth, além de checar os que estão emparelhados com a maquininha. Aprenda a seguir como fazê-lo. + +## Obter dispositivos emparelhados + +A obtenção da lista dos dispositivos emparelhados com a [Point Smart](/developers/pt/docs/mp-point/landing) é feita usando a função `getPairedDevices`, da classe `BluetoothDiscoverDevices`. Confira abaixo como acessá-la por meio do objeto `MPManager`. + +[[[ +```kotlin +val bluetoothDiscoverDevices = MPManager.bluetooth.discover + +bluetoothDiscoverDevices.getPairedDevices { result -> +   result +       .doIfSuccess { devices -> +           // Trabalhar com a lista de dispositivos emparelhados +       } +       .doIfError { error -> +           // Gerenciar o caso de erro, se necessário +       } +} +``` +```java +final BluetoothDiscoverDevices bluetoothDiscoverDevices = MPManager.INSTANCE.getBluetooth().getDiscover(); + +final Function1>, Unit> callback = (final MPResponse> response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   final List devices = response.getData(); +   // Trabalhar com a lista de dispositivos emparelhados + } else { +   // Gerenciar o caso de erro, se necessário + } + return Unit.INSTANCE; +}; + +bluetoothDiscoverDevices.getPairedDevices(callback); +``` +]]] + +|Campo|Descrição| +|---|---| +|**callback ((MPResponse>) -> Unit)**| Função de devolução da chamada que proporciona os dispositivos emparelhados como resultado. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados no caso de sucesso, em uma lista de modelos `BluetoothDeviceModel`.| +|**id (String)**|  Identificador único do dispositivo bluetooth.| +|**boundState (Int)**| Estado de emparelhamento do dispositivo. Pode ter diferentes valores representando estados distintos.| +|**name (String)**| Nome do dispositivo proporcionado pelo sistema operacional.| +|**address (String)**| Endereço MAC do dispositivo bluetooth.| +|**isConnected (Boolean)**| Indica se o dispositivo está conectado. Em caso positivo, a resposta é `true`; se estiver desconectado, aparece como `false`.| + +## Obter impressoras emparelhadas + +Use a função `getPairedPrinterDevices` da classe `BluetoothDiscoverDevices` para consultar a lista de impressoras bluetooth emparelhadas com a [Point Smart](/developers/pt/docs/mp-point/landing). O acesso é feito através do objeto `MPManager`, como no exemplo abaixo. + +[[[ +```kotlin +val bluetoothDiscoverDevices = MPManager.bluetooth.discover + +bluetoothDiscoverDevices.getPairedPrinterDevices { result -> +   result +       .doIfSuccess { printers -> +           // Trabalhar com a lista de dispositivos emparelhados +       } +       .doIfError { error -> +           // Gerenciar o caso de erro, se necessário +       } +} +``` +```java +final BluetoothDiscoverDevices bluetoothDiscoverDevices = MPManager.INSTANCE.getBluetooth().getDiscover(); + +final Function1>, Unit> callback = (final MPResponse> response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   final List printers = response.getData(); +   // Trabalhar com a lista de dispositivos emparelhados + } else { +   // Gerenciar o caso de erro, se necessário + } + return Unit.INSTANCE; +}; + +bluetoothDiscoverDevices.getPairedPrinterDevices(callback); +``` +]]] + +|Campo|Descrição| +|---|---| +|**callback ((MPResponse>) -> Unit)**| Função de devolução da chamada que proporciona as impressoras emparelhadas como resultado. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados em caso de sucesso em uma lista de modelos `BluetoothDeviceModel`.| +|**id (String)**|  Identificador único do dispositivo bluetooth.| +|**boundState (Int)**| Estado de emparelhamento do dispositivo. Pode ter diferentes valores representando estados distintos.| +|**name (String)**| Nome do dispositivo proporcionado pelo sistema operacional.| +|**address (String)**| Endereço MAC do dispositivo bluetooth.| +|**isConnected (Boolean)**| Indica se o dispositivo está conectado. Em caso positivo, a resposta é `true`; se estiver desconectado, aparece como `false`.| + +## Iniciar busca + +A função `startDiscovery` da classe `BluetoothDiscoverDevices` inicia o descobrimento de dispositivos bluetooth. O acesso é feito através do objeto `MPManager`. Este método facilita a implementação dinâmica da lógica baseada em eventos na sua solução. Assim: + +[[[ +```kotlin +val bluetoothDiscover = MPManager.bluetooth.discover + +bluetoothDiscover.startDiscovery { response -> +   response +       .doIfSuccess { discoveryState -> +           when (discoveryState.type) { +               BluetoothDiscoveryState.Type.STARTED -> { +                   // Gerenciar o início da descoberta +               } +               BluetoothDiscoveryState.Type.DEVICE_FOUND -> discoveryState.device?.let { device -> +                   // Gerenciar a descoberta de um novo dispositivo +               } +               BluetoothDiscoveryState.Type.DEVICE_CHANGE -> discoveryState.device?.let { device -> +                   // Gerenciar mudanças em um dispositivo descoberto +               } +               BluetoothDiscoveryState.Type.ENDED -> { +                   // Gerenciar o fim da descoberta +               } +           } +       } +       .doIfError { error -> +           // Gerenciar o caso de erro, se necessário +       } +} +``` +```java +final BluetoothDiscoverDevices bluetoothDiscoverDevices = MPManager.INSTANCE.getBluetooth().getDiscover(); + +final Function1, Unit> callback = (final MPResponse response) -> { + if (response.getStatus() == ResponseStatus.SUCCESS) { +   switch (response.getData().getType()) { +     case STARTED: +       // Gerenciar o início da descoberta +       break; +     case DEVICE_FOUND: +       // Gerenciar a descoberta de um novo dispositivo +       final BluetoothDeviceModel foundDevice = response.getData().getDevice(); +       break; +     case DEVICE_CHANGE: +       // Gerenciar mudanças em um dispositivo descoberto +       final BluetoothDeviceModel changedDevice = response.getData().getDevice(); +       break; +     case ENDED: +       // Gerenciar o fim da descoberta + +   } + } else { +   // Gerenciar o caso de erro, se necessário + } + return Unit.INSTANCE; +}; + +bluetoothDiscoverDevices.startDiscovery(callback); +``` +]]] + +|Campo|Descrição| +|---|---| +|**callback ((MPResponse) -> Unit)**| Função de devolução da chamada que proporciona o resultado do processo de descobrimento. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados em caso de sucesso, contendo um objeto `BluetoothDiscoveryState` que representa o estado atual da descoberta, eventos como o início e fim do descobrimento e mudanças no dispositivo.| +|**id (String)**|  Identificador único do dispositivo bluetooth.| +|**boundState (Int)**| Estado de emparelhamento do dispositivo. Pode ter diferentes valores representando estados distintos.| +|**name (String)**| Nome do dispositivo proporcionado pelo sistema operacional.| +|**address (String)**| Endereço MAC do dispositivo bluetooth.| +|**isConnected (Boolean)**| Indica se o dispositivo está conectado. Em caso positivo, a resposta é `true`; se estiver desconectado, aparece como `false`.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/pair-unpair.en.md b/guides/mp-point-main-apps/pair-unpair.en.md new file mode 100644 index 0000000000..98170f9dce --- /dev/null +++ b/guides/mp-point-main-apps/pair-unpair.en.md @@ -0,0 +1,94 @@ +# Pair and unpair + +In this section, you’ll learn how to pair and unpair devices with a [Point Smart](/developers/en/docs/mp-point/landing) by using a `BluetoothDevicesPairing` class. + +## Pair a device + +Use the `pairDevice` feature from the `BluetoothDevicesPairing` class to pair a device with Point Smart by sending only the (`(address)`). The access is through the  `MPManager` object, as shown below. + +[[[ +```kotlin +val bluetoothPairing = MPManager.bluetooth.paring + +bluetoothPairing.pairDevice(address) { response -> +   response.doIfSuccess { result -> +       // Manage pairing success +       val bondState = result.first +       val deviceModel = result.second +       // ... Perform additional actions if necessary +   }.doIfError { error -> +       // Manage the error case if necessary +   } +} +``` +```java +final BluetoothDevicesPairing bluetoothPairing = MPManager.INSTANCE.getBluetooth().getParing(); + +final Function1>, Unit> callback = +   (final MPResponse> response) -> { +     if (response.getStatus() == ResponseStatus.SUCCESS) { +       final BluetoothBondState bondState = response.getData().getFirst(); +       final BluetoothDeviceModel deviceModel = response.getData().getSecond(); +       // Perform additional actions if necessary +     } else { +       // Manage the error case if necessary +     } +     return Unit.INSTANCE; +   }; + +bluetoothPairing.pairDevice(address, callback); +``` +]]] + +## Unpair a device + +To unpair a device, use the `unPairDevice` feature from the `BluetoothDevicesPairing` class by accessing through the `MPManager` object. This feature uses the (`(address)`) of the selected device as a parameter, as shown below. + +[[[ +```kotlin +val bluetoothPairing = MPManager.bluetooth.paring + +bluetoothPairing.unPairDevice(address) { response -> +   response.doIfSuccess { result -> +       // Manage pairing success +       val bondState = result.first +       val deviceModel = result.second +       // ... Perform additional actions if necessary +   }.doIfError { error -> +       // Manage the error case if necessary +   } +} +``` +```java +final BluetoothDevicesPairing bluetoothPairing = MPManager.INSTANCE.getBluetooth().getParing(); + +final Function1>, Unit> callback = +   (final MPResponse> response) -> { +     if (response.getStatus() == ResponseStatus.SUCCESS) { +       final BluetoothBondState bondState = response.getData().getFirst(); +       final BluetoothDeviceModel deviceModel = response.getData().getSecond(); +       // Perform additional actions if necessary +     } else { +       // Manage the error case if necessary +     } +     return Unit.INSTANCE; +   }; + +bluetoothPairing.unPairDevice(address, callback); +``` +]]] + +## Description of the fields + +|Field|Description| +|---|---| +|**address (String)**| Location of the selected device, obtained through `[BluetoothDeviceModel]`.| +|**callback ((MPResponse>) -> Unit)**| Request response feature that provides the result of the pairing process. The [MPResponse] includes the status, the error (if any), and the details in case of success, which contain a `(Pair)` that comprises `[BluetoothBondState]` and [BluetoothDeviceModel].| +|**NONE (BOND_NONE)**| Indicates that the device isn’t paired.| +|**BONDING (BOND_BONDING)**| Indicates that the device is in pairing process. | +|**BONDED (BOND_BONDED)**| Indicates that the device is paired.| +|**id (String)**| Identificador del dispositivo.| +|**boundState (Int)**| Estado de emparejamiento del dispositivo. Puede ser `true` o `false`.| +|**name (String)**| Nombre del dispositivo ofrecido por el sistema operacional.| +|**id (String)**| Dirección MAC del dispositivo.| +|**isConnected (Boolean)**| Indica si el dispositivo está conectado.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/pair-unpair.es.md b/guides/mp-point-main-apps/pair-unpair.es.md new file mode 100644 index 0000000000..32ec2df788 --- /dev/null +++ b/guides/mp-point-main-apps/pair-unpair.es.md @@ -0,0 +1,94 @@ +# Conectar y desconectar + +En esta sección, comprenderás cómo emparejar y desemparejar dispositivos con el [Point Smart](/developers/es/docs/mp-point/landing) usando la clase `BluetoothDevicesPairing`. + +## Emparejar un dispositivo + +Usa la función `pairDevice` de la clase `BluetoothDevicesPairing` para emparejar un dispositivo con el [Point Smart](/developers/es/docs/mp-point/landing) enviando solo la dirección (`(address)`). El acceso se hace a través del objeto `MPManager`, como se muestra a continuación. + +[[[ +```kotlin +val bluetoothPairing = MPManager.bluetooth.paring + +bluetoothPairing.pairDevice(address) { response -> +   response.doIfSuccess { result -> +       // Manejar el éxito del emparejamiento +       val bondState = result.first +       val deviceModel = result.second +       // ... Realizar acciones adicionales si es necesario +   }.doIfError { error -> +       // Manejar el caso de error si es necesario +   } +} +``` +```java +final BluetoothDevicesPairing bluetoothPairing = MPManager.INSTANCE.getBluetooth().getParing(); + +final Function1>, Unit> callback = +   (final MPResponse> response) -> { +     if (response.getStatus() == ResponseStatus.SUCCESS) { +       final BluetoothBondState bondState = response.getData().getFirst(); +       final BluetoothDeviceModel deviceModel = response.getData().getSecond(); +       // Realizar acciones adicionales si es necesario +     } else { +       // Manejar el caso de error si es necesario +     } +     return Unit.INSTANCE; +   }; + +bluetoothPairing.pairDevice(address, callback); +``` +]]] + +## Desemparejar un dispositivo + +Para desemparejar un dispositivo, usa la función `unPairDevice` de la clase `BluetoothDevicesPairing` accediendo a través del objeto `MPManager`. Esta función usa como parámetro la dirección (`(address)`) del dispositivo seleccionado, como se muestra a continuación. + +[[[ +```kotlin +val bluetoothPairing = MPManager.bluetooth.paring + +bluetoothPairing.unPairDevice(address) { response -> +   response.doIfSuccess { result -> +       // Manejar el éxito del emparejamiento +       val bondState = result.first +       val deviceModel = result.second +       // ... Realizar acciones adicionales si es necesario +   }.doIfError { error -> +       // Manejar el caso de error si es necesario +   } +} +``` +```java +final BluetoothDevicesPairing bluetoothPairing = MPManager.INSTANCE.getBluetooth().getParing(); + +final Function1>, Unit> callback = +   (final MPResponse> response) -> { +     if (response.getStatus() == ResponseStatus.SUCCESS) { +       final BluetoothBondState bondState = response.getData().getFirst(); +       final BluetoothDeviceModel deviceModel = response.getData().getSecond(); +       // Realizar acciones adicionales si es necesario +     } else { +       // Manejar el caso de error si es necesario +     } +     return Unit.INSTANCE; +   }; + +bluetoothPairing.unPairDevice(address, callback); +``` +]]] + +## Descripción de campos + +|Campo|Descripción| +|---|---| +|**address (String)**| Ubicación del dispositivo seleccionado, obtenida a través de `[BluetoothDeviceModel]`.| +|**callback ((MPResponse>) -> Unit)**| Función de devolución del llamado que ofrece el resultado del proceso de emparejamiento. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito, que tiene un `(Pair)` compuesto por `[BluetoothBondState]` y `[BluetoothDeviceModel]`.| +|**NONE (BOND_NONE)**| Indica que el dispositivo no está emparejado.| +|**BONDING (BOND_BONDING)**| Indica que el dispositivo está en proceso de emparejamiento.| +|**BONDED (BOND_BONDED)**| Indica que o dispositivo está emparejado.| +|**id (String)**| Identificador del dispositivo.| +|**boundState (Int)**| Estado de emparejamiento del dispositivo. Puede ser `true` o `false`.| +|**name (String)**| Nombre del dispositivo ofrecido por el sistema operacional.| +|**id (String)**| Dirección MAC del dispositivo.| +|**isConnected (Boolean)**| Indica si el dispositivo está conectado.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/pair-unpair.pt.md b/guides/mp-point-main-apps/pair-unpair.pt.md new file mode 100644 index 0000000000..815d6a60ee --- /dev/null +++ b/guides/mp-point-main-apps/pair-unpair.pt.md @@ -0,0 +1,94 @@ +# Emparelhar e desemparelhar + +Nesta seção, você entenderá como emparelhar e desemparelhar dispositivos com a Point Smart usando a classe `BluetoothDevicesPairing`. + +## Emparelhar um dispositivo + +Use a função `pairDevice` da classe `BluetoothDevicesPairing` para emparelhar um dispositivo com a Point Smart enviando apenas o endereço (`(address)`). O acesso é feito por meio do objeto `MPManager`, como mostrado abaixo. + +[[[ +```kotlin +val bluetoothPairing = MPManager.bluetooth.paring + +bluetoothPairing.pairDevice(address) { response -> +   response.doIfSuccess { result -> +       // Manage pairing success +       val bondState = result.first +       val deviceModel = result.second +       // ... Realizar ações adicionais, se necessário +   }.doIfError { error -> +       // Gerenciar o caso de erro, se necessário +   } +} +``` +```java +final BluetoothDevicesPairing bluetoothPairing = MPManager.INSTANCE.getBluetooth().getParing(); + +final Function1>, Unit> callback = +   (final MPResponse> response) -> { +     if (response.getStatus() == ResponseStatus.SUCCESS) { +       final BluetoothBondState bondState = response.getData().getFirst(); +       final BluetoothDeviceModel deviceModel = response.getData().getSecond(); +       // Realizar ações adicionais, se necessário +     } else { +       // Gerenciar o caso de erro, se necessário +     } +     return Unit.INSTANCE; +   }; + +bluetoothPairing.pairDevice(address, callback); +``` +]]] + +## Desemparelhar um dispositivo + +Para desemparelhar um dispositivo, use a função `unPairDevice` da classe `BluetoothDevicesPairing` acessando pelo objeto `MPManager`. Essa função usa como parâmetro o endereço (`(address)`) do aparelho selecionado, como mostrado a seguir. + +[[[ +```kotlin +val bluetoothPairing = MPManager.bluetooth.paring + +bluetoothPairing.unPairDevice(address) { response -> +   response.doIfSuccess { result -> +       // Manage pairing success +       val bondState = result.first +       val deviceModel = result.second +       // ... Realizar ações adicionais, se necessário +   }.doIfError { error -> +       // Gerenciar o caso de erro, se necessário +   } +} +``` +```java +final BluetoothDevicesPairing bluetoothPairing = MPManager.INSTANCE.getBluetooth().getParing(); + +final Function1>, Unit> callback = +   (final MPResponse> response) -> { +     if (response.getStatus() == ResponseStatus.SUCCESS) { +       final BluetoothBondState bondState = response.getData().getFirst(); +       final BluetoothDeviceModel deviceModel = response.getData().getSecond(); +       // Realizar ações adicionais, se necessário +     } else { +       // Gerenciar o caso de erro, se necessário +     } +     return Unit.INSTANCE; +   }; + +bluetoothPairing.unPairDevice(address, callback); +``` +]]] + +## Descrição dos campos + +|Field|Description| +|---|---| +|**address (String)**| Localização do dispositivo selecionado, obtida por `[BluetoothDeviceModel]`.| +|**callback ((MPResponse>) -> Unit)**| Função de devolução da chamada que proporciona o resultado do processo de emparelhamento. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados no caso de sucesso, que contêm um `(Pair)` composto por `[BluetoothBondState]` e `[BluetoothDeviceModel]`.| +|**NONE (BOND_NONE)**| Indica que o dispositivo não está emparelhado.| +|**BONDING (BOND_BONDING)**| Indica que o dispositivo está em processo de emparelhamento | +|**BONDED (BOND_BONDED)**| Indica que o dispositivo está emparelhado.| +|**id (String)**| Identificador do dispositivo.| +|**boundState (Int)**| Estado de emparejação do dispositivo. Pode ser `true` ou `false`.| +|**name (String)**| Nome do dispositivo proporcionado pelo sistema operacional.| +|**id (String)**| Endereço MAC do dispositivo.| +|**isConnected (Boolean)**| Indica se o dispositivo está conectado.| \ No newline at end of file From 7b562bcc23ac2ac5606fcc706f49b1b61bbed2b7 Mon Sep 17 00:00:00 2001 From: hgaldino Date: Mon, 19 Aug 2024 18:59:24 -0300 Subject: [PATCH 07/34] 8 --- guides/mp-point-main-apps/pair-unpair.pt.md | 6 +- .../mp-point-main-apps/search-devices.en.md | 104 ++++++++++++++++++ .../mp-point-main-apps/search-devices.es.md | 104 ++++++++++++++++++ .../mp-point-main-apps/search-devices.pt.md | 104 ++++++++++++++++++ 4 files changed, 315 insertions(+), 3 deletions(-) create mode 100644 guides/mp-point-main-apps/search-devices.en.md create mode 100644 guides/mp-point-main-apps/search-devices.es.md create mode 100644 guides/mp-point-main-apps/search-devices.pt.md diff --git a/guides/mp-point-main-apps/pair-unpair.pt.md b/guides/mp-point-main-apps/pair-unpair.pt.md index 815d6a60ee..7debc56973 100644 --- a/guides/mp-point-main-apps/pair-unpair.pt.md +++ b/guides/mp-point-main-apps/pair-unpair.pt.md @@ -1,10 +1,10 @@ # Emparelhar e desemparelhar -Nesta seção, você entenderá como emparelhar e desemparelhar dispositivos com a Point Smart usando a classe `BluetoothDevicesPairing`. +Nesta seção, você entenderá como emparelhar e desemparelhar dispositivos com a [Point Smart](/developers/pt/docs/mp-point/landing) usando a classe `BluetoothDevicesPairing`. ## Emparelhar um dispositivo -Use a função `pairDevice` da classe `BluetoothDevicesPairing` para emparelhar um dispositivo com a Point Smart enviando apenas o endereço (`(address)`). O acesso é feito por meio do objeto `MPManager`, como mostrado abaixo. +Use a função `pairDevice` da classe `BluetoothDevicesPairing` para emparelhar um dispositivo com a [Point Smart](/developers/pt/docs/mp-point/landing) enviando apenas o endereço (`(address)`). O acesso é feito por meio do objeto `MPManager`, como mostrado abaixo. [[[ ```kotlin @@ -80,7 +80,7 @@ bluetoothPairing.unPairDevice(address, callback); ## Descrição dos campos -|Field|Description| +|Campo|Descrição| |---|---| |**address (String)**| Localização do dispositivo selecionado, obtida por `[BluetoothDeviceModel]`.| |**callback ((MPResponse>) -> Unit)**| Função de devolução da chamada que proporciona o resultado do processo de emparelhamento. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados no caso de sucesso, que contêm um `(Pair)` composto por `[BluetoothBondState]` e `[BluetoothDeviceModel]`.| diff --git a/guides/mp-point-main-apps/search-devices.en.md b/guides/mp-point-main-apps/search-devices.en.md new file mode 100644 index 0000000000..881e3a0e12 --- /dev/null +++ b/guides/mp-point-main-apps/search-devices.en.md @@ -0,0 +1,104 @@ +# Print with an external printer + +Use the print feature, of the `BluetoothPrinter` class, to print with an external printer. Access is through the `MPManager` object. Check how to do it. + +[[[ +```kotlin +val bluetoothPrinter = MPManager.bluetooth.printer + +bluetoothPrinter.print(dataToPrint) { response -> +   response +       .doIfSuccess { printerResult -> +           // Manage successful print case +           when (printerResult) { +               BluetoothPrinterResult.SUCCESS -> { +                   // Successful print +                   // ... Perform additional actions if necessary +               } + +               BluetoothPrinterResult.NEED_SELECTION_DEVICE -> { +                   // More than one paired device, specific address is required +                   // ... Perform additional actions if necessary +               } + +               else -> { // Other success cases } +               } +           } +       }.doIfError { error -> +           // Manage the error case if necessary +       } +} +``` +```java +final BluetoothPrinter bluetoothPrinter = MPManager.INSTANCE.getBluetooth().getPrinter(); + +final Function1, Unit> callback = +   (final MPResponse response) -> { +     if (response.getStatus() == ResponseStatus.SUCCESS) { +       // Perform additional actions if necessary +     } else { +       //Manage the error case if necessary +     } +     return Unit.INSTANCE; +   }; + +bluetoothPrinter.print(dataToPrint, callback); +``` +]]] + +|Field|Description| +|---|---| +|**dataToPrint (String)**| Text sequence you want to print.| +|**callback ((MPResponse) -> Unit)**| Request response feature that provides the result of the print request. The `[MPResponse]` includes the status, the error (if any), and the details in case of success, which contain a `[BluetoothPrinterResult]` object.| +|**CONNECTION_FAILED**| Indicates that the connection failed.| +|**ERROR_UNDEFINED**| Indicates that there is an error with an unknown cause. | +|**SUCCESS**| Indicates that the printing was successful.| +|**NEED_SELECTION_DEVICE**| Indicates that it’s necessary to specify the address of the devices when there’s more than one printer paired.| +|**ERROR_DATA_TO_PRINT_NULL**| Indicates that the details to print are null.| +|**ERROR_PRINTER_NOT_FOUND**| Indicates that no paired printers were found.| + +## Print using an external printer with a specific address + +To print with an external printer identified by its address, use the print feature of the BluetoothPrinter class. Access must be through the MPManager object, as shown below. + +[[[ +```kotlin +val bluetoothPrinter = MPManager.bluetooth.printer + +bluetoothPrinter.print(dataToPrint, address) { response -> +   response +       .doIfSuccess { printerResult -> +           // Manage successful printing result +       }.doIfError { error -> +           // Manage the error case if necessary +       } +} +``` +```java +final BluetoothPrinter bluetoothPrinter = MPManager.INSTANCE.getBluetooth().getPrinter(); + +final Function1, Unit> callback = +   (final MPResponse response) -> { +     if (response.getStatus() == ResponseStatus.SUCCESS) { +       // Perform additional actions if necessary +     } else { +       // Manage the error case if necessary +     } +     return Unit.INSTANCE; +   }; + +bluetoothPrinter.print(dataToPrint, address, callback); +``` +]]] + +|Field|Description| +|---|---| +|**dataToPrint (String)**| Text sequence you want to print.| +|**address (String)**| Address of the printer that will be used to print.| +|**callback ((MPResponse) -> Unit)**| Request response feature that provides the result of the print request. The `[MPResponse]` includes the status, the error (if any), and the details in case of success, which contain a `[BluetoothPrinterResult]` object.| +|**CONNECTION_FAILED**| Indicates that the connection failed.| +|**ERROR_UNDEFINED**| Indicates that there is an error with an unknown cause. | +|**SUCCESS**| Indicates that the printing was successful.| +|**NEED_SELECTION_DEVICE**| Indicates that it’s necessary to specify the address of the devices when there’s more than one printer paired.| +|**ERROR_DATA_TO_PRINT_NULL**| Indicates that the details to print are null.| +|**ERROR_PRINTER_NOT_FOUND**| Indicates that no paired printers were found.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/search-devices.es.md b/guides/mp-point-main-apps/search-devices.es.md new file mode 100644 index 0000000000..3d9dc60a12 --- /dev/null +++ b/guides/mp-point-main-apps/search-devices.es.md @@ -0,0 +1,104 @@ +# Imprimir con impresora externa + +Usa la función print, de la clase `BluetoothPrinter`, para hacer impresiones con la impresora externa. Este acceso se hace a través del objeto `MPManager`. Consulta cómo hacerlo. + +[[[ +```kotlin +val bluetoothPrinter = MPManager.bluetooth.printer + +bluetoothPrinter.print(dataToPrint) { response -> +   response +       .doIfSuccess { printerResult -> +           // Manejar el resultado exitoso de la impresión +           when (printerResult) { +               BluetoothPrinterResult.SUCCESS -> { +                   // Impresión exitosa +                   // ... Realizar acciones adicionales si es necesario +               } + +               BluetoothPrinterResult.NEED_SELECTION_DEVICE -> { +                   // Más de un dispositivo emparejado, se requiere especificar la dirección +                   // ... Realizar acciones adicionales si es necesario +               } + +               else -> { // Otros casos de resultado exitoso } +               } +           } +       }.doIfError { error -> +           // Manejar el caso de error si es necesario +       } +} +``` +```java +final BluetoothPrinter bluetoothPrinter = MPManager.INSTANCE.getBluetooth().getPrinter(); + +final Function1, Unit> callback = +   (final MPResponse response) -> { +     if (response.getStatus() == ResponseStatus.SUCCESS) { +       // Realizar acciones adicionales si es necesario +     } else { +       // Manejar el caso de error si es necesario +     } +     return Unit.INSTANCE; +   }; + +bluetoothPrinter.print(dataToPrint, callback); +``` +]]] + +|Campo|Descripción| +|---|---| +|**dataToPrint (String)**| Secuencia de texto que se quiere imprimir.| +|**callback ((MPResponse) -> Unit)**| Función de devolución del llamado que ofrece el resultado del pedido de impresión. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito, que tiene un objeto `[BluetoothPrinterResult]`.| +|**CONNECTION_FAILED**| Indica que la conexión falló.| +|**ERROR_UNDEFINED**| Indica que hay un error de causa indefinida. | +|**SUCCESS**| Indica que la impresión fue exitosa.| +|**NEED_SELECTION_DEVICE**| Indica que hace falta especificar la dirección de los dispositivos cuando hay más de una impresora emparejada.| +|**ERROR_DATA_TO_PRINT_NULL**| Indica que los datos para imprimir son nulos.| +|**ERROR_PRINTER_NOT_FOUND**| Indica que no se encontraron impresoras emparejadas.| + +## Imprimir usando una impressora externa con dirección específica + +Para imprimir con una impresora externa identificada por tu dirección, usa la función print de la clase `BluetoothPrinter`. El acceso se debe hacer a través del objeto `MPManager`, como se ejemplifica a continuación. + +[[[ +```kotlin +val bluetoothPrinter = MPManager.bluetooth.printer + +bluetoothPrinter.print(dataToPrint, address) { response -> +   response +       .doIfSuccess { printerResult -> +           // Manejar el resultado exitoso de la impresión +       }.doIfError { error -> +           // Manejar el caso de error si es necesario +       } +} +``` +```java +final BluetoothPrinter bluetoothPrinter = MPManager.INSTANCE.getBluetooth().getPrinter(); + +final Function1, Unit> callback = +   (final MPResponse response) -> { +     if (response.getStatus() == ResponseStatus.SUCCESS) { +       // Realizar acciones adicionales si es necesario +     } else { +       // Manejar el caso de error si es necesario +     } +     return Unit.INSTANCE; +   }; + +bluetoothPrinter.print(dataToPrint, address, callback); +``` +]]] + +|Campo|Descripción| +|---|---| +|**dataToPrint (String)**| Secuencia de texto que se quiere imprimir| +|**address (String)**| Dirección de la impresora que se usará para la impresión.| +|**callback ((MPResponse) -> Unit)**| Función de devolución del llamado que ofrece el resultado del pedido de impresión. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito, que tiene un objeto `[BluetoothPrinterResult]`.| +|**CONNECTION_FAILED**| Indica que la conexión falló.| +|**ERROR_UNDEFINED**| Indica que hay un error de causa indefinida. | +|**SUCCESS**| Indica que la impresión fue exitosa| +|**NEED_SELECTION_DEVICE**| Indica que hace falta especificar la dirección de los dispositivos cuando hay más de una impresora emparejada| +|**ERROR_DATA_TO_PRINT_NULL**| Indica que los datos para imprimir son nulos.| +|**ERROR_PRINTER_NOT_FOUND**| Indica que no se encontraron impresoras emparejadas.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/search-devices.pt.md b/guides/mp-point-main-apps/search-devices.pt.md new file mode 100644 index 0000000000..fcdef5dab9 --- /dev/null +++ b/guides/mp-point-main-apps/search-devices.pt.md @@ -0,0 +1,104 @@ +# Imprimir com impressora externa + +Use a função print, da classe `BluetoothPrinter`, para fazer impressões com uma impressora externa. Este acesso é feito pelo objeto `MPManager`. Confira como fazê-lo. + +[[[ +```kotlin +val bluetoothPrinter = MPManager.bluetooth.printer + +bluetoothPrinter.print(dataToPrint) { response -> +   response +       .doIfSuccess { printerResult -> +           // Gerenciar o resultado bem-sucedido da impressão +           when (printerResult) { +               BluetoothPrinterResult.SUCCESS -> { +                   // Impressão bem-sucedida +                   // ... Realizar ações adicionais, se necessário +               } + +               BluetoothPrinterResult.NEED_SELECTION_DEVICE -> { +                   // Mais de um dispositivo emparelhado, é necessário especificar o endereço +                   // ... Realizar ações adicionais, se necessário +               } + +               else -> { // Outros casos de resultado bem-sucedido } +               } +           } +       }.doIfError { error -> +           // Gerenciar o caso de erro, se necessário +       } +} +``` +```java +final BluetoothPrinter bluetoothPrinter = MPManager.INSTANCE.getBluetooth().getPrinter(); + +final Function1, Unit> callback = +   (final MPResponse response) -> { +     if (response.getStatus() == ResponseStatus.SUCCESS) { +       // Realizar ações adicionais, se necessário +     } else { +       // Gerenciar o caso de erro, se necessário +     } +     return Unit.INSTANCE; +   }; + +bluetoothPrinter.print(dataToPrint, callback); +``` +]]] + +|Campo|Descrição| +|---|---| +|**dataToPrint (String)**| Sequência de texto que se deseja imprimir.| +|**callback ((MPResponse) -> Unit)**| Função de devolução da chamada que proporciona o resultado do pedido de impressão. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados no caso de sucesso, que contêm um objeto `[BluetoothPrinterResult]`.| +|**CONNECTION_FAILED**| Indica que a conexão falhou.| +|**ERROR_UNDEFINED**| Indica que há um erro de causa indefinida. | +|**SUCCESS**| Indica que a impressão foi exitosa.| +|**NEED_SELECTION_DEVICE**| Indica que é preciso especificar o endereço dos dispositivos quando há mais de uma impressora emparelhada.| +|**ERROR_DATA_TO_PRINT_NULL**| Indica que os dados para imprimir são nulos.| +|**ERROR_PRINTER_NOT_FOUND**| Indica que não foram encontradas impressoras emparelhadas.| + +## Imprimir usando uma impressora externa com endereço específico + +Para imprimir com uma impressora externa identificada por seu endereço, use a função print da classe `BluetoothPrinter`. O acesso deve ser feito pelo objeto `MPManager`, como exemplificado abaixo. + +[[[ +```kotlin +val bluetoothPrinter = MPManager.bluetooth.printer + +bluetoothPrinter.print(dataToPrint, address) { response -> +   response +       .doIfSuccess { printerResult -> +           // Gerenciar o resultado bem-sucedido da impressão +       }.doIfError { error -> +           // Gerenciar o caso de erro, se necessário +       } +} +``` +```java +final BluetoothPrinter bluetoothPrinter = MPManager.INSTANCE.getBluetooth().getPrinter(); + +final Function1, Unit> callback = +   (final MPResponse response) -> { +     if (response.getStatus() == ResponseStatus.SUCCESS) { +       // Realizar ações adicionais, se necessário +     } else { +       // Gerenciar o caso de erro, se necessário +     } +     return Unit.INSTANCE; +   }; + +bluetoothPrinter.print(dataToPrint, address, callback); +``` +]]] + +|Campo|Descrição| +|---|---| +|**dataToPrint (String)**| Sequência de texto que se deseja imprimir.| +|**address (String)**| Endereço da impressora que será usada para a impressão.| +|**callback ((MPResponse) -> Unit)**| Função de devolução da chamada que proporciona o resultado do pedido de impressão. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados no caso de sucesso, que contêm um objeto `[BluetoothPrinterResult]`.| +|**CONNECTION_FAILED**| Indica que a conexão falhou.| +|**ERROR_UNDEFINED**| Indica que há um erro de causa indefinida. | +|**SUCCESS**| Indica que a impressão foi exitosa.| +|**NEED_SELECTION_DEVICE**| Indica que é preciso especificar o endereço dos dispositivos quando há mais de uma impressora emparelhada.| +|**ERROR_DATA_TO_PRINT_NULL**| Indica que os dados para imprimir são nulos.| +|**ERROR_PRINTER_NOT_FOUND**| Indica que não foram encontradas impressoras emparelhadas.| From 785f8a67ac55c52d887b48996b4d549d4e70656a Mon Sep 17 00:00:00 2001 From: hgaldino Date: Mon, 19 Aug 2024 19:07:00 -0300 Subject: [PATCH 08/34] 8 --- .../mp-point-main-apps/access-settings.en.md | 20 +++++++++++++++++++ .../mp-point-main-apps/access-settings.es.md | 20 +++++++++++++++++++ .../mp-point-main-apps/access-settings.pt.md | 20 +++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 guides/mp-point-main-apps/access-settings.en.md create mode 100644 guides/mp-point-main-apps/access-settings.es.md create mode 100644 guides/mp-point-main-apps/access-settings.pt.md diff --git a/guides/mp-point-main-apps/access-settings.en.md b/guides/mp-point-main-apps/access-settings.en.md new file mode 100644 index 0000000000..f772109a03 --- /dev/null +++ b/guides/mp-point-main-apps/access-settings.en.md @@ -0,0 +1,20 @@ +# Access settings + +Use the `launch` method of the `BluetoothUiSettings` class to start with the bluetooth settings on Mercado Pago. That component provides several features, like activating and deactivating, searching for devices, and pairing and unpairing, among others. Check how to access it. + +[[[ +```kotlin +val bluetoothUiSettings = MPManager.bluetoothUiSettings + +bluetoothUiSettings.launch(context) +``` +```java +final BluetoothUiSettings bluetoothUiSettings = MPManager.INSTANCE.getBluetoothUiSettings(); + +bluetoothUiSettings.launch(context); +``` +]]] + +|Field|Description| +|---|---| +|**context (Context)**| It must be the context of the app and it’s mandatory to begin the activity.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/access-settings.es.md b/guides/mp-point-main-apps/access-settings.es.md new file mode 100644 index 0000000000..aadf809dee --- /dev/null +++ b/guides/mp-point-main-apps/access-settings.es.md @@ -0,0 +1,20 @@ +# Acceder a la configuración + +Usa el método `launch` de la clase `BluetoothUiSettings` para iniciar la actividad de configuración de bluetooth de Mercado Pago. Este componente ofrece diversas funcionalidades, cómo activar y desactivar, buscar dispositivos, emparejar y desemparejar, entre otros. Consulta cómo acceder. + +[[[ +```kotlin +val bluetoothUiSettings = MPManager.bluetoothUiSettings + +bluetoothUiSettings.launch(context) +``` +```java +final BluetoothUiSettings bluetoothUiSettings = MPManager.INSTANCE.getBluetoothUiSettings(); + +bluetoothUiSettings.launch(context); +``` +]]] + +|Campo|Descripción| +|---|---| +|**context (Context)**| Debe ser el contexto de la app y es obligatorio para iniciar la actividad.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/access-settings.pt.md b/guides/mp-point-main-apps/access-settings.pt.md new file mode 100644 index 0000000000..ca1790c2b9 --- /dev/null +++ b/guides/mp-point-main-apps/access-settings.pt.md @@ -0,0 +1,20 @@ +# Access settings + +Use o método `launch` da classe `BluetoothUiSettings` para iniciar a atividade de configurações de bluetooth do Mercado Pago. Esse componente proporciona diversas funcionalidades, como ativar e desativar, buscar dispositivos, emparelhar e desemparelhar, entre outras. Confira como acessá-lo. + +[[[ +```kotlin +val bluetoothUiSettings = MPManager.bluetoothUiSettings + +bluetoothUiSettings.launch(context) +``` +```java +final BluetoothUiSettings bluetoothUiSettings = MPManager.INSTANCE.getBluetoothUiSettings(); + +bluetoothUiSettings.launch(context); +``` +]]] + +|Campo|Descrição| +|---|---| +|**context (Context)**| Deve ser o contexto do aplicativo e é obrigatório para iniciar a atividade.| \ No newline at end of file From ba6dce6b31be00f27de4ce6ed1530dc78c29fae1 Mon Sep 17 00:00:00 2001 From: hgaldino Date: Mon, 19 Aug 2024 19:07:12 -0300 Subject: [PATCH 09/34] 9 --- guides/mp-point-main-apps/access-settings.pt.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/mp-point-main-apps/access-settings.pt.md b/guides/mp-point-main-apps/access-settings.pt.md index ca1790c2b9..e6b33becd0 100644 --- a/guides/mp-point-main-apps/access-settings.pt.md +++ b/guides/mp-point-main-apps/access-settings.pt.md @@ -1,4 +1,4 @@ -# Access settings +# Acessar configurações Use o método `launch` da classe `BluetoothUiSettings` para iniciar a atividade de configurações de bluetooth do Mercado Pago. Esse componente proporciona diversas funcionalidades, como ativar e desativar, buscar dispositivos, emparelhar e desemparelhar, entre outras. Confira como acessá-lo. From e691946f57d3a4704666d79e393888f524767ffd Mon Sep 17 00:00:00 2001 From: hgaldino Date: Mon, 19 Aug 2024 19:18:48 -0300 Subject: [PATCH 10/34] 9 --- guides/mp-point-main-apps/landing.en.md | 2 +- guides/mp-point-main-apps/landing.es.md | 2 +- guides/mp-point-main-apps/landing.pt.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/guides/mp-point-main-apps/landing.en.md b/guides/mp-point-main-apps/landing.en.md index 9857ad46c5..da4443f0bc 100644 --- a/guides/mp-point-main-apps/landing.en.md +++ b/guides/mp-point-main-apps/landing.en.md @@ -9,7 +9,7 @@ content_section_with_media: >>>> Availability by countrys<<<< --- -available_countries: mlb +available_countries: mlb, mla, mlm --- diff --git a/guides/mp-point-main-apps/landing.es.md b/guides/mp-point-main-apps/landing.es.md index 8c2c2e83c0..c7c26c78ea 100644 --- a/guides/mp-point-main-apps/landing.es.md +++ b/guides/mp-point-main-apps/landing.es.md @@ -9,7 +9,7 @@ content_section_with_media: >>>> Disponibilidad por país <<<< --- -available_countries: mlb +available_countries: mlb, mla, mlm --- diff --git a/guides/mp-point-main-apps/landing.pt.md b/guides/mp-point-main-apps/landing.pt.md index acddf3e564..6b7fe7fb94 100644 --- a/guides/mp-point-main-apps/landing.pt.md +++ b/guides/mp-point-main-apps/landing.pt.md @@ -9,7 +9,7 @@ content_section_with_media: >>>> Disponibilidade por país <<<< --- -available_countries: mlb +available_countries: mlb, mla, mlm --- From 0523e9ac17854e49ef5af45ebe6c709e0dbd8b79 Mon Sep 17 00:00:00 2001 From: hgaldino Date: Mon, 19 Aug 2024 19:20:01 -0300 Subject: [PATCH 11/34] 10 --- guides/mp-point-main-apps/landing.en.md | 2 +- guides/mp-point-main-apps/landing.es.md | 2 +- guides/mp-point-main-apps/landing.pt.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/guides/mp-point-main-apps/landing.en.md b/guides/mp-point-main-apps/landing.en.md index da4443f0bc..f04e93f426 100644 --- a/guides/mp-point-main-apps/landing.en.md +++ b/guides/mp-point-main-apps/landing.en.md @@ -1,6 +1,6 @@ --- content_section_with_media: - - title: Main Apps Playbook + - title: Main Apps - message: This is a guide for you to develop and integrate main apps with Point Smart. Browse the side menu to find the processes, requirements and guidelines, from the POS technical data sheet to the solution distribution. The material is constantly evolving, with new content being included. - media_image: /main-apps/landing-all.png --- diff --git a/guides/mp-point-main-apps/landing.es.md b/guides/mp-point-main-apps/landing.es.md index c7c26c78ea..62db7f7da3 100644 --- a/guides/mp-point-main-apps/landing.es.md +++ b/guides/mp-point-main-apps/landing.es.md @@ -1,6 +1,6 @@ --- content_section_with_media: - - title: Main Apps Playbook + - title: Main Apps - message: Esta es una guía para que desarrolles e integres main apps al Point Smart. Navega por el menú lateral para encontrar los procesos, requisitos y direccionamientos, desde la ficha técnica del lector a la distribución de la solución. El material está en constante evolución, con nuevos contenidos que se van incluyendo. - media_image: /main-apps/landing-all.png --- diff --git a/guides/mp-point-main-apps/landing.pt.md b/guides/mp-point-main-apps/landing.pt.md index 6b7fe7fb94..775f66bbd3 100644 --- a/guides/mp-point-main-apps/landing.pt.md +++ b/guides/mp-point-main-apps/landing.pt.md @@ -1,6 +1,6 @@ --- content_section_with_media: - - title: Main Apps Playbook + - title: Main Apps - message: Este é um guia para você desenvolver e integrar main apps à Point Smart. Navegue pelo menu lateral para encontrar os processos, requisitos e direcionamentos, da ficha técnica da maquininha à distribuição da solução. O material está em constante evolução, com novos conteúdos sendo incluídos. - media_image: /main-apps/landing-all.png --- From 7f8e17eba39910418019914e93909ad4edaf8942 Mon Sep 17 00:00:00 2001 From: hgaldino Date: Tue, 20 Aug 2024 10:42:03 -0300 Subject: [PATCH 12/34] 11 --- guides/mp-point-main-apps/pair-unpair.pt.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/mp-point-main-apps/pair-unpair.pt.md b/guides/mp-point-main-apps/pair-unpair.pt.md index 7debc56973..bb1b40168e 100644 --- a/guides/mp-point-main-apps/pair-unpair.pt.md +++ b/guides/mp-point-main-apps/pair-unpair.pt.md @@ -4,7 +4,7 @@ Nesta seção, você entenderá como emparelhar e desemparelhar dispositivos com ## Emparelhar um dispositivo -Use a função `pairDevice` da classe `BluetoothDevicesPairing` para emparelhar um dispositivo com a [Point Smart](/developers/pt/docs/mp-point/landing) enviando apenas o endereço (`(address)`). O acesso é feito por meio do objeto `MPManager`, como mostrado abaixo. +Use a função `pairDevice` da classe `BluetoothDevicesPairing` para emparelhar um dispositivo com a [Point Smart](/developers/pt/docs/mp-point/landing) enviando apenas o endereço (`address`). O acesso é feito por meio do objeto `MPManager`, como mostrado abaixo. [[[ ```kotlin @@ -42,7 +42,7 @@ bluetoothPairing.pairDevice(address, callback); ## Desemparelhar um dispositivo -Para desemparelhar um dispositivo, use a função `unPairDevice` da classe `BluetoothDevicesPairing` acessando pelo objeto `MPManager`. Essa função usa como parâmetro o endereço (`(address)`) do aparelho selecionado, como mostrado a seguir. +Para desemparelhar um dispositivo, use a função `unPairDevice` da classe `BluetoothDevicesPairing` acessando pelo objeto `MPManager`. Essa função usa como parâmetro o endereço (`address`) do aparelho selecionado, como mostrado a seguir. [[[ ```kotlin From 8a1b0dd61a0c036c1a9cdbc7615a9b34ef735831 Mon Sep 17 00:00:00 2001 From: hgaldino Date: Tue, 20 Aug 2024 11:08:38 -0300 Subject: [PATCH 13/34] 12 --- guides/mp-point-main-apps/distribution.en.md | 16 ++++++---------- guides/mp-point-main-apps/distribution.es.md | 16 ++++++---------- guides/mp-point-main-apps/distribution.pt.md | 16 ++++++---------- ...evices.en.md => print-external-printer.en.md} | 0 ...evices.es.md => print-external-printer.es.md} | 0 ...evices.pt.md => print-external-printer.pt.md} | 0 6 files changed, 18 insertions(+), 30 deletions(-) rename guides/mp-point-main-apps/{search-devices.en.md => print-external-printer.en.md} (100%) rename guides/mp-point-main-apps/{search-devices.es.md => print-external-printer.es.md} (100%) rename guides/mp-point-main-apps/{search-devices.pt.md => print-external-printer.pt.md} (100%) diff --git a/guides/mp-point-main-apps/distribution.en.md b/guides/mp-point-main-apps/distribution.en.md index 182570ce52..4d164c240d 100644 --- a/guides/mp-point-main-apps/distribution.en.md +++ b/guides/mp-point-main-apps/distribution.en.md @@ -7,13 +7,9 @@ For the distribution phase of your solution, follow these steps: 3. To upload your solution to the Mercado Pago ecosystem, guaranteeing the security of the application and its subsequent versions, digitally sign the certificate. This document must be the same for both the initial package and each update. Android provides a [step-by-step guide on how to digitally sign your app](https://developer.android.com/studio/publish/app-signing#generate-key) with the certificate generated by the developer. 4. Share the **.apk** package with the Mercado Pago support team. They will carry out a series of validations and notify the integrator company of the result. -> NOTE -> -> Note -> -> **The Mercado Pago support team is responsible for facilitating the following operations:** ->

-> - Delivery of new versions.
-> - Pre-configuration of devices.
-> - UX and security validations.
-> - Distribution of native APKs.
\ No newline at end of file +The Mercado Pago support team is responsible for facilitating the following operations: + +- **Delivery of new versions.** +- **Pre-configuration of devices.** +- **UX and security validations.** +- **Distribution of native APKs.** \ No newline at end of file diff --git a/guides/mp-point-main-apps/distribution.es.md b/guides/mp-point-main-apps/distribution.es.md index fb12775e46..0b44a8dd23 100644 --- a/guides/mp-point-main-apps/distribution.es.md +++ b/guides/mp-point-main-apps/distribution.es.md @@ -7,13 +7,9 @@ Para la fase de distribución de tu solución, sigue estas etapas: 3. Para subir tu solución al ecosistema de Mercado Pago, garantizando la seguridad de la app y de tus posteriores versiones, suscribe al certificado de manera digital. Este documento debe ser el mismo tanto para el paquete inicial, como para cada una de las actualizaciones. Android disponibiliza [un paso a paso de cómo suscribir digitalmente la app](https://developer.android.com/studio/publish/app-signing?hl=es-419#generate-key), con el certificado generado por la persona desarrolladora. 4. Comparte el paquete **.apk**` com el equipo de soporte de Mercado Pago, que hará una serie de validaciones y avisará a la empresa integradora del resultado. -> NOTE -> -> Nota -> -> **El equipo de soporte de Mercado Pago es responsable de facilitar las siguientes operaciones:** ->

-> - Entrega de nuevas versiones.
-> - Pre-configuración de los dispositivos.
-> - Validaciones de UX y Seguridad.
-> - Distribución de los APKs nativos. \ No newline at end of file +El equipo de soporte de Mercado Pago es responsable de facilitar las siguientes operaciones: + +- **Entrega de nuevas versiones.** +- **Pre-configuración de los dispositivos.** +- **Validaciones de UX y Seguridad.** +- **Distribución de los APKs nativos.** \ No newline at end of file diff --git a/guides/mp-point-main-apps/distribution.pt.md b/guides/mp-point-main-apps/distribution.pt.md index 02546a2038..1e782b621f 100644 --- a/guides/mp-point-main-apps/distribution.pt.md +++ b/guides/mp-point-main-apps/distribution.pt.md @@ -7,13 +7,9 @@ Para a fase de distribuição da sua solução, siga estas etapas: 3. Para subir sua solução ao ecossistema do Mercado Pago, garantindo a segurança do aplicativo e de suas posteriores versões, faça a assinatura digital do certificado. Este documento deve ser o mesmo tanto para o pacote inicial, como para cada uma das atualizações. O Android disponibiliza [um passo a passo de como assinar o app digitalmente](https://developer.android.com/studio/publish/app-signing?hl=pt-br#generate-key), com o certificado gerado pela pessoa desenvolvedora. 4. Compartilhe o pacote **.apk** com a equipe de suporte do Mercado Pago. Ela fará uma série de validações e notificará a empresa integradora sobre o resultado. -> NOTE -> -> Nota -> -> **A equipe de suporte do Mercado Pago é responsável por facilitar as seguintes operações:** ->

-> - Entrega de novas versões.
-> - Pré-configuração dos dispositivos.
-> - Validações de UX e segurança.
-> - Distribuição dos APKs nativos.
\ No newline at end of file +A equipe de suporte do Mercado Pago é responsável por facilitar as seguintes operações: + +- **Entrega de novas versões.** +- **Pré-configuração dos dispositivos.** +- **Validações de UX e segurança.** +- **Distribuição dos APKs nativos.** \ No newline at end of file diff --git a/guides/mp-point-main-apps/search-devices.en.md b/guides/mp-point-main-apps/print-external-printer.en.md similarity index 100% rename from guides/mp-point-main-apps/search-devices.en.md rename to guides/mp-point-main-apps/print-external-printer.en.md diff --git a/guides/mp-point-main-apps/search-devices.es.md b/guides/mp-point-main-apps/print-external-printer.es.md similarity index 100% rename from guides/mp-point-main-apps/search-devices.es.md rename to guides/mp-point-main-apps/print-external-printer.es.md diff --git a/guides/mp-point-main-apps/search-devices.pt.md b/guides/mp-point-main-apps/print-external-printer.pt.md similarity index 100% rename from guides/mp-point-main-apps/search-devices.pt.md rename to guides/mp-point-main-apps/print-external-printer.pt.md From 8c506ba4af07daacb069158fad1d79702772d67a Mon Sep 17 00:00:00 2001 From: hgaldino Date: Tue, 20 Aug 2024 11:11:25 -0300 Subject: [PATCH 14/34] 13 --- guides/mp-point-main-apps/get-list-installments.en.md | 2 +- guides/mp-point-main-apps/get-list-installments.es.md | 2 +- guides/mp-point-main-apps/get-list-installments.pt.md | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/guides/mp-point-main-apps/get-list-installments.en.md b/guides/mp-point-main-apps/get-list-installments.en.md index 9361614ab7..0700143f98 100644 --- a/guides/mp-point-main-apps/get-list-installments.en.md +++ b/guides/mp-point-main-apps/get-list-installments.en.md @@ -47,7 +47,7 @@ paymentInstallmentTools.getInstallmentsAmount(callback, amount); |Field|Description| |---|---| -|**callback ((MPResponse>) -> Unit)**|Response feature with the result of the request of the list of installments.| +|****callback ((MPResponse<List<InstallmentAmount>>) -> Unit)****|Response feature with the result of the request of the list of installments.| |**amount (String)**|Amount with which the list of installments is determined.| |**installment (Int)**|Number of installments.| |**amount (Double)**|Amount of each installment.| diff --git a/guides/mp-point-main-apps/get-list-installments.es.md b/guides/mp-point-main-apps/get-list-installments.es.md index fdef722d83..42aba8b02b 100644 --- a/guides/mp-point-main-apps/get-list-installments.es.md +++ b/guides/mp-point-main-apps/get-list-installments.es.md @@ -96,7 +96,7 @@ paymentInstallmentTools.getInstallmentsAmount(callback, amount); |Campo|Descripción| |---|---| -|**callback ((MPResponse>) -> Unit)**|Función de respuesta con el resultado de la solicitud de la lista de mensualidades.| +|****callback ((MPResponse<List<InstallmentAmount>>) -> Unit)****|Función de respuesta con el resultado de la solicitud de la lista de mensualidades.| |**amount (String)**|Monto con el cual se determina la lista de mensualidades.| |**installment (Int)**|Número de mensualidades.| |**amount (Double)**|Monto de cada mensualidade.| diff --git a/guides/mp-point-main-apps/get-list-installments.pt.md b/guides/mp-point-main-apps/get-list-installments.pt.md index ea30fb4929..ee50ba6b5e 100644 --- a/guides/mp-point-main-apps/get-list-installments.pt.md +++ b/guides/mp-point-main-apps/get-list-installments.pt.md @@ -47,8 +47,8 @@ paymentInstallmentTools.getInstallmentsAmount(callback, amount); |Campo|Descrição| |---|---| -|**callback ((MPResponse>) -> Unit)**|Função de resposta com o resultado da solicitação da lista de parcelas.| +|**callback ((MPResponse<List<InstallmentAmount>>) -> Unit)**|Função de resposta com o resultado da solicitação da lista de parcelas.| |**amount (String)**|Valor com o qual se determina a lista de parcelas.| |**installment (Int)**|Número de parcelas.| |**amount (Double)**|Valor de cada parcela.| -|**inancialAmount (Double)**|Porcentagem de acréscimo de cada parcela.| \ No newline at end of file +|**inancialAmount (Double)**|Porcentagem de acréscimo de cada parcela.| \ No newline at end of file From b262ee9776be4e624dca9940cf7ce4d9655c1be0 Mon Sep 17 00:00:00 2001 From: hgaldino Date: Tue, 20 Aug 2024 12:16:55 -0300 Subject: [PATCH 15/34] 14 --- guides/mp-point-main-apps/get-list-installments.en.md | 2 +- guides/mp-point-main-apps/get-list-installments.es.md | 2 +- guides/mp-point-main-apps/get-list-installments.pt.md | 2 +- guides/mp-point-main-apps/manage-connections.en.md | 6 +++--- guides/mp-point-main-apps/manage-connections.es.md | 6 +++--- guides/mp-point-main-apps/manage-connections.pt.md | 6 +++--- guides/mp-point-main-apps/manage-status.en.md | 6 +++--- guides/mp-point-main-apps/manage-status.es.md | 6 +++--- guides/mp-point-main-apps/manage-status.pt.md | 6 +++--- guides/mp-point-main-apps/print-external-printer.en.md | 2 +- guides/mp-point-main-apps/print-external-printer.es.md | 2 +- guides/mp-point-main-apps/print-external-printer.pt.md | 2 +- guides/mp-point-main-apps/scan-qr-code.en.md | 2 +- guides/mp-point-main-apps/scan-qr-code.es.md | 2 +- guides/mp-point-main-apps/scan-qr-code.pt.md | 2 +- guides/mp-point-main-apps/start-payment-flow.en.md | 4 ++-- guides/mp-point-main-apps/start-payment-flow.es.md | 4 ++-- guides/mp-point-main-apps/start-payment-flow.pt.md | 4 ++-- 18 files changed, 33 insertions(+), 33 deletions(-) diff --git a/guides/mp-point-main-apps/get-list-installments.en.md b/guides/mp-point-main-apps/get-list-installments.en.md index 0700143f98..10f5b86f1d 100644 --- a/guides/mp-point-main-apps/get-list-installments.en.md +++ b/guides/mp-point-main-apps/get-list-installments.en.md @@ -47,7 +47,7 @@ paymentInstallmentTools.getInstallmentsAmount(callback, amount); |Field|Description| |---|---| -|****callback ((MPResponse<List<InstallmentAmount>>) -> Unit)****|Response feature with the result of the request of the list of installments.| +|**callback ((MPResponse<List<InstallmentAmount>>) -> Unit)**|Response feature with the result of the request of the list of installments.| |**amount (String)**|Amount with which the list of installments is determined.| |**installment (Int)**|Number of installments.| |**amount (Double)**|Amount of each installment.| diff --git a/guides/mp-point-main-apps/get-list-installments.es.md b/guides/mp-point-main-apps/get-list-installments.es.md index 42aba8b02b..c4a7204b92 100644 --- a/guides/mp-point-main-apps/get-list-installments.es.md +++ b/guides/mp-point-main-apps/get-list-installments.es.md @@ -96,7 +96,7 @@ paymentInstallmentTools.getInstallmentsAmount(callback, amount); |Campo|Descripción| |---|---| -|****callback ((MPResponse<List<InstallmentAmount>>) -> Unit)****|Función de respuesta con el resultado de la solicitud de la lista de mensualidades.| +|**callback ((MPResponse<List<InstallmentAmount>>) -> Unit)**|Función de respuesta con el resultado de la solicitud de la lista de mensualidades.| |**amount (String)**|Monto con el cual se determina la lista de mensualidades.| |**installment (Int)**|Número de mensualidades.| |**amount (Double)**|Monto de cada mensualidade.| diff --git a/guides/mp-point-main-apps/get-list-installments.pt.md b/guides/mp-point-main-apps/get-list-installments.pt.md index ee50ba6b5e..932c89bb31 100644 --- a/guides/mp-point-main-apps/get-list-installments.pt.md +++ b/guides/mp-point-main-apps/get-list-installments.pt.md @@ -47,7 +47,7 @@ paymentInstallmentTools.getInstallmentsAmount(callback, amount); |Campo|Descrição| |---|---| -|**callback ((MPResponse<List<InstallmentAmount>>) -> Unit)**|Função de resposta com o resultado da solicitação da lista de parcelas.| +|**callback ((MPResponse<List<InstallmentAmount>>) -> Unit)**|Função de resposta com o resultado da solicitação da lista de parcelas.| |**amount (String)**|Valor com o qual se determina a lista de parcelas.| |**installment (Int)**|Número de parcelas.| |**amount (Double)**|Valor de cada parcela.| diff --git a/guides/mp-point-main-apps/manage-connections.en.md b/guides/mp-point-main-apps/manage-connections.en.md index 3d5b834333..f8b762ea55 100644 --- a/guides/mp-point-main-apps/manage-connections.en.md +++ b/guides/mp-point-main-apps/manage-connections.en.md @@ -39,7 +39,7 @@ bluetoothDiscoverDevices.getPairedDevices(callback); |Field|Description| |---|---| -|**callback ((MPResponse>) -> Unit)**| Request response feature that provides the paired devices as a result. The `[MPResponse]` includes the status, the error (if any), and the details in case of success, in a list of `BluetoothDeviceModel` models.| +|**callback ((MPResponse<List<BluetoothDeviceModel>>) -> Unit)**| Request response feature that provides the paired devices as a result. The `[MPResponse]` includes the status, the error (if any), and the details in case of success, in a list of `BluetoothDeviceModel` models.| |**id (String)**| Unique identifier of the bluetooth device.| |**boundState (Int)**| Pairing status of the device. It can have different values representing different status.| |**name (String)**| Name of the device provided by the operational system.| @@ -83,7 +83,7 @@ bluetoothDiscoverDevices.getPairedPrinterDevices(callback); |Field|Description| |---|---| -|**callback ((MPResponse>) -> Unit)**| Request response feature that provides the paired printers as a result. The `[MPResponse]` includes the status, the error (if any) and the details in case of success in a list of `BluetoothDeviceModel` models.| +|**callback ((MPResponse<List<BluetoothDeviceModel>>) -> Unit)**| Request response feature that provides the paired printers as a result. The `[MPResponse]` includes the status, the error (if any) and the details in case of success in a list of `BluetoothDeviceModel` models.| |**id (String)**| Unique identifier of the bluetooth device.| |**boundState (Int)**| Pairing status of the device. It can have different values representing different status.| |**name (String)**| Name of the device provided by the operational system.| @@ -154,7 +154,7 @@ bluetoothDiscoverDevices.startDiscovery(callback); |Field|Description| |---|---| -|**callback ((MPResponse) -> Unit)**| Request response feature that provides the result of the discovery process. The `[MPResponse]` includes the status, the error (if any), and the details in case of success, containing a `BluetoothDiscoveryState` object that represents the current status of the discovery, events such as the start and end of the discovery and changes in the device.| +|**callback ((MPResponse<BluetoothDiscoveryState>) -> Unit)**| Request response feature that provides the result of the discovery process. The `[MPResponse]` includes the status, the error (if any), and the details in case of success, containing a `BluetoothDiscoveryState` object that represents the current status of the discovery, events such as the start and end of the discovery and changes in the device.| |**id (String)**| Unique identifier of the bluetooth device.| |**boundState (Int)**| Pairing status of the device. It can have different values representing different status.| |**name (String)**| Name of the device provided by the operational system.| diff --git a/guides/mp-point-main-apps/manage-connections.es.md b/guides/mp-point-main-apps/manage-connections.es.md index 26fb90a6c0..540bbcf46d 100644 --- a/guides/mp-point-main-apps/manage-connections.es.md +++ b/guides/mp-point-main-apps/manage-connections.es.md @@ -39,7 +39,7 @@ bluetoothDiscoverDevices.getPairedDevices(callback); |Campo|Descripción| |---|---| -|**callback ((MPResponse>) -> Unit)**| Función de devolución del llamado que ofrece los dispositivos emparejados como resultado. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito, en una lista de modelos `BluetoothDeviceModel`.| +|**callback ((MPResponse<List<BluetoothDeviceModel>>) -> Unit)**| Función de devolución del llamado que ofrece los dispositivos emparejados como resultado. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito, en una lista de modelos `BluetoothDeviceModel`.| |**id (String)**| Identificador único del dispositivo bluetooth.| |**boundState (Int)**| Estado de emparejamiento del dispositivo. Puede tener diferentes valores representando estados distintos.| |**name (String)**| Nombre del dispositivo ofrecido por el sistema operacional.| @@ -83,7 +83,7 @@ bluetoothDiscoverDevices.getPairedPrinterDevices(callback); |Campo|Descripción| |---|---| -|**callback ((MPResponse>) -> Unit)**| Función de devolución del llamado que ofrece las impresonas emparejadas como resultado. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito en una lista de modelos `BluetoothDeviceModel`.| +|**callback ((MPResponse<List<BluetoothDeviceModel>>) -> Unit)**| Función de devolución del llamado que ofrece las impresonas emparejadas como resultado. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito en una lista de modelos `BluetoothDeviceModel`.| |**id (String)**| Identificador único del dispositivo bluetooth.| |**boundState (Int)**| Estado de emparejamiento del dispositivo. Puede tener diferentes valores representando estados distintos.| |**name (String)**| Nombre del dispositivo ofrecido por el sistema operacional.| @@ -154,7 +154,7 @@ bluetoothDiscoverDevices.startDiscovery(callback); |Campo|Descripción| |---|---| -|**callback ((MPResponse) -> Unit)**| Función de devolución del llamado que ofrece el resultado del proceso de búsqueda. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito, teniendo un objeto `BluetoothDiscoveryState` que representa el estado actual de la búsqueda, eventos como el inicio y el fin de la búsqueda y los cambios en el dispositivo.| +|**callback ((MPResponse<BluetoothDiscoveryState>) -> Unit)**| Función de devolución del llamado que ofrece el resultado del proceso de búsqueda. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito, teniendo un objeto `BluetoothDiscoveryState` que representa el estado actual de la búsqueda, eventos como el inicio y el fin de la búsqueda y los cambios en el dispositivo.| |**id (String)**| Identificador único del dispositivo bluetooth.| |**boundState (Int)**| Estado de emparejamiento del dispositivo. Puede tener diferentes valores representando estados distintos.| |**name (String)**| Nombre del dispositivo ofrecido por el sistema operacional.| diff --git a/guides/mp-point-main-apps/manage-connections.pt.md b/guides/mp-point-main-apps/manage-connections.pt.md index 4ab3114285..1296930409 100644 --- a/guides/mp-point-main-apps/manage-connections.pt.md +++ b/guides/mp-point-main-apps/manage-connections.pt.md @@ -39,7 +39,7 @@ bluetoothDiscoverDevices.getPairedDevices(callback); |Campo|Descrição| |---|---| -|**callback ((MPResponse>) -> Unit)**| Função de devolução da chamada que proporciona os dispositivos emparelhados como resultado. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados no caso de sucesso, em uma lista de modelos `BluetoothDeviceModel`.| +|**callback ((MPResponse<List<BluetoothDeviceModel>>) -> Unit)**| Função de devolução da chamada que proporciona os dispositivos emparelhados como resultado. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados no caso de sucesso, em uma lista de modelos `BluetoothDeviceModel`.| |**id (String)**|  Identificador único do dispositivo bluetooth.| |**boundState (Int)**| Estado de emparelhamento do dispositivo. Pode ter diferentes valores representando estados distintos.| |**name (String)**| Nome do dispositivo proporcionado pelo sistema operacional.| @@ -83,7 +83,7 @@ bluetoothDiscoverDevices.getPairedPrinterDevices(callback); |Campo|Descrição| |---|---| -|**callback ((MPResponse>) -> Unit)**| Função de devolução da chamada que proporciona as impressoras emparelhadas como resultado. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados em caso de sucesso em uma lista de modelos `BluetoothDeviceModel`.| +|**callback ((MPResponse<List<BluetoothDeviceModel>>) -> Unit)**| Função de devolução da chamada que proporciona as impressoras emparelhadas como resultado. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados em caso de sucesso em uma lista de modelos `BluetoothDeviceModel`.| |**id (String)**|  Identificador único do dispositivo bluetooth.| |**boundState (Int)**| Estado de emparelhamento do dispositivo. Pode ter diferentes valores representando estados distintos.| |**name (String)**| Nome do dispositivo proporcionado pelo sistema operacional.| @@ -154,7 +154,7 @@ bluetoothDiscoverDevices.startDiscovery(callback); |Campo|Descrição| |---|---| -|**callback ((MPResponse) -> Unit)**| Função de devolução da chamada que proporciona o resultado do processo de descobrimento. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados em caso de sucesso, contendo um objeto `BluetoothDiscoveryState` que representa o estado atual da descoberta, eventos como o início e fim do descobrimento e mudanças no dispositivo.| +|**callback ((MPResponse<BluetoothDiscoveryState>) -> Unit)**| Função de devolução da chamada que proporciona o resultado do processo de descobrimento. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados em caso de sucesso, contendo um objeto `BluetoothDiscoveryState` que representa o estado atual da descoberta, eventos como o início e fim do descobrimento e mudanças no dispositivo.| |**id (String)**|  Identificador único do dispositivo bluetooth.| |**boundState (Int)**| Estado de emparelhamento do dispositivo. Pode ter diferentes valores representando estados distintos.| |**name (String)**| Nome do dispositivo proporcionado pelo sistema operacional.| diff --git a/guides/mp-point-main-apps/manage-status.en.md b/guides/mp-point-main-apps/manage-status.en.md index e5007deab0..ad6f9feb73 100644 --- a/guides/mp-point-main-apps/manage-status.en.md +++ b/guides/mp-point-main-apps/manage-status.en.md @@ -48,7 +48,7 @@ bluetoothIgnitor.turnOn(callback); |Field|Description| |---|---| -|**callback ((MPResponse) -> Unit)**| Request response feature that provides the result of the activation operation. The `[MPResponse]` includes the status, the error (if any) and the details in case of an error. The response contains a **boolean** value where `true` indicates that the bluetooth was activated and `false` the inability to do so.| +|**callback ((MPResponse<Boolean>) -> Unit)**| Request response feature that provides the result of the activation operation. The `[MPResponse]` includes the status, the error (if any) and the details in case of an error. The response contains a **boolean** value where `true` indicates that the bluetooth was activated and `false` the inability to do so.| ## Deactivate bluetooth @@ -97,7 +97,7 @@ bluetoothIgnitor.turnOff(callback); |Field|Description| |---|---| -|**callback ((MPResponse) -> Unit)**| Request response feature that provides the result of the deactivation operation. The `[MPResponse]` includes the status, the error (if any), and the details in case of success. The response contains a **boolean** value where `false` indicates that the bluetooth was deactivated and `true` the inability to do so.| +|**callback ((MPResponse<Boolean>) -> Unit)**| Request response feature that provides the result of the deactivation operation. The `[MPResponse]` includes the status, the error (if any), and the details in case of success. The response contains a **boolean** value where `false` indicates that the bluetooth was deactivated and `true` the inability to do so.| ## Validate the current status of the bluetooth @@ -147,4 +147,4 @@ bluetoothIgnitor.getCurrentState(callback); |Field|Description| |---|---| -|**callback ((MPResponse) -> Unit)**| Request response feature that provides the result the validation of the current status of the bluetooth. The `[MPResponse]` includes the status, the error (if any) and the details in case of success. The response contains a **boolean** value where `true` indicates that the bluetooth is activated and `false` indicates its deactivation.| \ No newline at end of file +|**callback ((MPResponse<Boolean>) -> Unit)**| Request response feature that provides the result the validation of the current status of the bluetooth. The `[MPResponse]` includes the status, the error (if any) and the details in case of success. The response contains a **boolean** value where `true` indicates that the bluetooth is activated and `false` indicates its deactivation.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/manage-status.es.md b/guides/mp-point-main-apps/manage-status.es.md index 69c9553242..2e44626711 100644 --- a/guides/mp-point-main-apps/manage-status.es.md +++ b/guides/mp-point-main-apps/manage-status.es.md @@ -48,7 +48,7 @@ bluetoothIgnitor.turnOn(callback); |Campo|Descripción| |---|---| -|**callback ((MPResponse) -> Unit)**| Función de devolución del llamado que ofrece el resultado de la operación de activación. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito. La respuesta tiene un valor **booleano**, en el que `true` indica que el bluetooth se activó y `false`, la incapacidad de hacerlo.| +|**callback ((MPResponse<Boolean>) -> Unit)**| Función de devolución del llamado que ofrece el resultado de la operación de activación. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito. La respuesta tiene un valor **booleano**, en el que `true` indica que el bluetooth se activó y `false`, la incapacidad de hacerlo.| ## Desactivar el bluetooth @@ -97,7 +97,7 @@ bluetoothIgnitor.turnOff(callback); |Campo|Descripción| |---|---| -|**callback ((MPResponse) -> Unit)**| Función de devolución del llamado que ofrece el resultado de la operación de desactivado. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito. La respuesta tiene un valor **booleano**, en el que `false` indica que o bluetooth se desactivó y `true`, la incapacidad de hacerlo.| +|**callback ((MPResponse<Boolean>) -> Unit)**| Función de devolución del llamado que ofrece el resultado de la operación de desactivado. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito. La respuesta tiene un valor **booleano**, en el que `false` indica que o bluetooth se desactivó y `true`, la incapacidad de hacerlo.| ## Validar el estado actual del bluetooth @@ -147,4 +147,4 @@ bluetoothIgnitor.getCurrentState(callback); |Campo|Descripción| |---|---| -|**callback ((MPResponse) -> Unit)**| Función de devolución del lado que ofrece el resultado de la validación del estado atual del bluetooth. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito. La respuesta tiene un valor **booleano**, en el que `true` indica que el bluetooth está activado y `false`, su desactivación.| \ No newline at end of file +|**callback ((MPResponse<Boolean>) -> Unit)**| Función de devolución del lado que ofrece el resultado de la validación del estado atual del bluetooth. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito. La respuesta tiene un valor **booleano**, en el que `true` indica que el bluetooth está activado y `false`, su desactivación.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/manage-status.pt.md b/guides/mp-point-main-apps/manage-status.pt.md index fcc089bf9f..9555fd8d53 100644 --- a/guides/mp-point-main-apps/manage-status.pt.md +++ b/guides/mp-point-main-apps/manage-status.pt.md @@ -48,7 +48,7 @@ bluetoothIgnitor.turnOn(callback); |Campo|Descrição| |---|---| -|**callback ((MPResponse) -> Unit)**| Função de devolução da chamada que proporciona o resultado da operação de ativação. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados em caso de sucesso. A resposta contém um valor **booleano**, em que `true` indica que o bluetooth foi ativado e `false`, a incapacidade de fazê-lo.| +|**callback ((MPResponse<Boolean>) -> Unit)**| Função de devolução da chamada que proporciona o resultado da operação de ativação. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados em caso de sucesso. A resposta contém um valor **booleano**, em que `true` indica que o bluetooth foi ativado e `false`, a incapacidade de fazê-lo.| ## Desativar o bluetooth @@ -97,7 +97,7 @@ bluetoothIgnitor.turnOff(callback); |Campo|Descrição| |---|---| -|**callback ((MPResponse) -> Unit)**| Função de devolução da chamada que proporciona o resultado da operação de desativação. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados em caso de sucesso. A resposta contém um valor **booleano**, em que `false` indica que o bluetooth foi desativado e `true`, a incapacidade de fazê-lo.| +|**callback ((MPResponse<Boolean>) -> Unit)**| Função de devolução da chamada que proporciona o resultado da operação de desativação. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados em caso de sucesso. A resposta contém um valor **booleano**, em que `false` indica que o bluetooth foi desativado e `true`, a incapacidade de fazê-lo.| ## Validar o estado atual do bluetooth @@ -147,4 +147,4 @@ bluetoothIgnitor.getCurrentState(callback); |Campo|Descrição| |---|---| -|**callback ((MPResponse) -> Unit)**| Função de devolução da chamada que proporciona o resultado da validação do estado atual do bluetooth. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados em caso de sucesso. A resposta contém um valor **booleano**, em que `true` indica que o bluetooth está ativado e `false`, sua desativação.| \ No newline at end of file +|**callback ((MPResponse<Boolean>) -> Unit)**| Função de devolução da chamada que proporciona o resultado da validação do estado atual do bluetooth. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados em caso de sucesso. A resposta contém um valor **booleano**, em que `true` indica que o bluetooth está ativado e `false`, sua desativação.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/print-external-printer.en.md b/guides/mp-point-main-apps/print-external-printer.en.md index 881e3a0e12..54f12d2abd 100644 --- a/guides/mp-point-main-apps/print-external-printer.en.md +++ b/guides/mp-point-main-apps/print-external-printer.en.md @@ -49,7 +49,7 @@ bluetoothPrinter.print(dataToPrint, callback); |Field|Description| |---|---| |**dataToPrint (String)**| Text sequence you want to print.| -|**callback ((MPResponse) -> Unit)**| Request response feature that provides the result of the print request. The `[MPResponse]` includes the status, the error (if any), and the details in case of success, which contain a `[BluetoothPrinterResult]` object.| +|**callback ((MPResponse<BluetoothPrinterResult>) -> Unit)**| Request response feature that provides the result of the print request. The `[MPResponse]` includes the status, the error (if any), and the details in case of success, which contain a `[BluetoothPrinterResult]` object.| |**CONNECTION_FAILED**| Indicates that the connection failed.| |**ERROR_UNDEFINED**| Indicates that there is an error with an unknown cause. | |**SUCCESS**| Indicates that the printing was successful.| diff --git a/guides/mp-point-main-apps/print-external-printer.es.md b/guides/mp-point-main-apps/print-external-printer.es.md index 3d9dc60a12..388cd4a67d 100644 --- a/guides/mp-point-main-apps/print-external-printer.es.md +++ b/guides/mp-point-main-apps/print-external-printer.es.md @@ -49,7 +49,7 @@ bluetoothPrinter.print(dataToPrint, callback); |Campo|Descripción| |---|---| |**dataToPrint (String)**| Secuencia de texto que se quiere imprimir.| -|**callback ((MPResponse) -> Unit)**| Función de devolución del llamado que ofrece el resultado del pedido de impresión. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito, que tiene un objeto `[BluetoothPrinterResult]`.| +|**callback ((MPResponse<BluetoothPrinterResult>) -> Unit)**| Función de devolución del llamado que ofrece el resultado del pedido de impresión. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito, que tiene un objeto `[BluetoothPrinterResult]`.| |**CONNECTION_FAILED**| Indica que la conexión falló.| |**ERROR_UNDEFINED**| Indica que hay un error de causa indefinida. | |**SUCCESS**| Indica que la impresión fue exitosa.| diff --git a/guides/mp-point-main-apps/print-external-printer.pt.md b/guides/mp-point-main-apps/print-external-printer.pt.md index fcdef5dab9..c06232dc57 100644 --- a/guides/mp-point-main-apps/print-external-printer.pt.md +++ b/guides/mp-point-main-apps/print-external-printer.pt.md @@ -49,7 +49,7 @@ bluetoothPrinter.print(dataToPrint, callback); |Campo|Descrição| |---|---| |**dataToPrint (String)**| Sequência de texto que se deseja imprimir.| -|**callback ((MPResponse) -> Unit)**| Função de devolução da chamada que proporciona o resultado do pedido de impressão. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados no caso de sucesso, que contêm um objeto `[BluetoothPrinterResult]`.| +|**callback ((MPResponse<BluetoothPrinterResult>) -> Unit)**| Função de devolução da chamada que proporciona o resultado do pedido de impressão. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados no caso de sucesso, que contêm um objeto `[BluetoothPrinterResult]`.| |**CONNECTION_FAILED**| Indica que a conexão falhou.| |**ERROR_UNDEFINED**| Indica que há um erro de causa indefinida. | |**SUCCESS**| Indica que a impressão foi exitosa.| diff --git a/guides/mp-point-main-apps/scan-qr-code.en.md b/guides/mp-point-main-apps/scan-qr-code.en.md index 02bcdd553f..3981e316af 100644 --- a/guides/mp-point-main-apps/scan-qr-code.en.md +++ b/guides/mp-point-main-apps/scan-qr-code.en.md @@ -65,6 +65,6 @@ protected void onActivityResult(final int requestCode, final int resultCode, |---|---| |**resultCode (Int)**| Value of the `resultCode` in `onActivityResult`.| |**resultData (Intent)**| Date result in `onActivityResult`.| -|**MPResponse**| Object [MPResponse] that includes the status, the error (if any), and the details in case of success, which contain an `CameraScannerResponse` object.| +|**MPResponse<CameraScannerResponse>**| Object [MPResponse] that includes the status, the error (if any), and the details in case of success, which contain an `CameraScannerResponse` object.| |**status (CameraScannerStatus)**| Defines the status of the response. It can be **Ok** (it read it successfully), **Error** (something went wrong and it was cancelled) or **Unknown** (something went wrong).| |**message (String)**| Defines the response message received by the scanner. If it’s ”Ok”, it will have the result of the reading of the code| diff --git a/guides/mp-point-main-apps/scan-qr-code.es.md b/guides/mp-point-main-apps/scan-qr-code.es.md index e50b7d5790..014d6b7db4 100644 --- a/guides/mp-point-main-apps/scan-qr-code.es.md +++ b/guides/mp-point-main-apps/scan-qr-code.es.md @@ -65,6 +65,6 @@ protected void onActivityResult(final int requestCode, final int resultCode, |---|---| |**resultCode (Int)**| Valor del `resultCode` en `onActivityResult`| |**resultData (Intent)**| Valor de la fecha en `onActivityResult`.| -|**MPResponse**| Objeto `[MPResponse]` que encapsula el estado, el error (si lo hay) y los datos en caso de éxito, que tiene un objeto `CameraScannerResponse`.| +|**MPResponse<CameraScannerResponse>**| Objeto `[MPResponse]` que encapsula el estado, el error (si lo hay) y los datos en caso de éxito, que tiene un objeto `CameraScannerResponse`.| |**status (CameraScannerStatus)**| Define el estado de la respuesta. Puede ser **Ok** (la lectura fue exitosa), **Error** (hubo un error o la lectura se canceló) o **Unknown** (hubo algún error indeterminado).| |**message (String)**| Define el mensaje de la respuesta recibida por escaner. Si es ”Ok”, tendrá el resultado de la lectura del código.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/scan-qr-code.pt.md b/guides/mp-point-main-apps/scan-qr-code.pt.md index 788976e194..01d6fe02d7 100644 --- a/guides/mp-point-main-apps/scan-qr-code.pt.md +++ b/guides/mp-point-main-apps/scan-qr-code.pt.md @@ -65,6 +65,6 @@ protected void onActivityResult(final int requestCode, final int resultCode, |---|---| |**resultCode (Int)**| Valor do `resultCode` em `onActivityResult`.| |**resultData (Intent)**|Valor de data em `onActivityResult`.| -|**MPResponse**| Objeto `[MPResponse]` que encapsula o estado, o erro (se houver) e os dados em caso de sucesso, que contêm um objeto `CameraScannerResponse`.| +|**MPResponse<CameraScannerResponse>**| Objeto `[MPResponse]` que encapsula o estado, o erro (se houver) e os dados em caso de sucesso, que contêm um objeto `CameraScannerResponse`.| |**status (CameraScannerStatus)**| Define o estado da resposta. Pode ser **Ok** (a leitura foi exitosa), **Error** (houve um erro ou a leitura foi cancelada) ou **Unknown** (ocorreu um erro indeterminado).| |**message (String)**| Define a mensagem da resposta recebida pelo escâner. Se é ”Ok”, conterá o resultado da leitura do código.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/start-payment-flow.en.md b/guides/mp-point-main-apps/start-payment-flow.en.md index 610d387424..d805514d52 100644 --- a/guides/mp-point-main-apps/start-payment-flow.en.md +++ b/guides/mp-point-main-apps/start-payment-flow.en.md @@ -97,7 +97,7 @@ paymentFlow.launchPaymentFlowActivity(paymentFlowData, context, callback); |**launchPaymentFlowActivity**| This method starts the payment flow using the SmartPOS app.| |**paymentFlowData (PaymentFlowData)**| Detail model necessary to open the flow.| |**context (Context)**| Context from where the flow will begin.| -|**callback (MPResponse -> Unit)**| Provides the result of the opening of the payment flow.| +|**allback (MPResponse<String> -> Unit)**| Provides the result of the opening of the payment flow.| ## Build a URI to open the payment flow @@ -141,7 +141,7 @@ final Uri uriResult = paymentFlow.buildCallbackUri( |---|---| |**callback (String)**| The value of the URI to request the deeplink. E.g.: `yourHost://tuApp/test`.| |**methodCallback (String)**| Identifies if the URI is for a success, error or another custom response. | -|**metadata (HashMap)**| Optional field to send information to the response screen, in case it’s necessary to show additional details, like the name of the customer or the summary of the products that were purchased.| +|**metadata (HashMap<String, String>)**| Optional field to send information to the response screen, in case it’s necessary to show additional details, like the name of the customer or the summary of the products that were purchased.| |**appID (String)**| Identifier of the main app. We use the package name. E.g.: `com.yourcompany.yourapp`.| |**Uri**| the URI defined with the information provided.| diff --git a/guides/mp-point-main-apps/start-payment-flow.es.md b/guides/mp-point-main-apps/start-payment-flow.es.md index 480b86556b..56ba75b898 100644 --- a/guides/mp-point-main-apps/start-payment-flow.es.md +++ b/guides/mp-point-main-apps/start-payment-flow.es.md @@ -97,7 +97,7 @@ paymentFlow.launchPaymentFlowActivity(paymentFlowData, context, callback); |**launchPaymentFlowActivity**| Este método inicia el flujo de pago usando la app SmartPOS.| |**paymentFlowData (PaymentFlowData)**| Modelo de datos necesario para la apertura del flujo.| |**context (Context)**| Contexto de dónde se inciará el flujo.| -|**callback (MPResponse -> Unit)**| Ofrece el resultado de la apertura del flujo de pago.| +|**allback (MPResponse<String> -> Unit)**| Ofrece el resultado de la apertura del flujo de pago.| ## Construir una URI para apertura del flujo de pago @@ -141,7 +141,7 @@ final Uri uriResult = paymentFlow.buildCallbackUri( |---|---| |**callback (String)**| El monto de la URI para llamar el _deeplink_. Ejemplo: `tuHost://tuApp/prueba`.| |**methodCallback (String)**| Identifica si la URI es para un caso de éxito, de error u otra respuesta personalizada.| -|**metadata (HashMap)**| Campo opcional para enviar información a la pantalla de respuesta, en caso de que sea necesario mostrar detalles adicionales, como el nombre del cliente o el resumen de los productos comprados. | +|**metadata (HashMap<String, String>)**| Campo opcional para enviar información a la pantalla de respuesta, en caso de que sea necesario mostrar detalles adicionales, como el nombre del cliente o el resumen de los productos comprados. | |**appID (String)**|  Identificador de la app principal. Usamos el nombre del paquete. Ejemplo: `com.tuempresa.tuapp`.| |**Uri**| La URI definida con la información ingresada.| diff --git a/guides/mp-point-main-apps/start-payment-flow.pt.md b/guides/mp-point-main-apps/start-payment-flow.pt.md index b90f78bb09..15d16b4420 100644 --- a/guides/mp-point-main-apps/start-payment-flow.pt.md +++ b/guides/mp-point-main-apps/start-payment-flow.pt.md @@ -97,7 +97,7 @@ paymentFlow.launchPaymentFlowActivity(paymentFlowData, context, callback); |**launchPaymentFlowActivity**| Esse método inicia o fluxo de pagamento usando o aplicativo SmartPOS.| |**paymentFlowData (PaymentFlowData)**| Modelo de dados necessário para a abertura do fluxo.| |**context (Context)**| Contexto de onde será iniciado o fluxo.| -|**allback (MPResponse -> Unit)**| Proporciona o resultado da abertura do fluxo de pagamento.| +|**allback (MPResponse<String> -> Unit)**| Proporciona o resultado da abertura do fluxo de pagamento.| ## Construir uma URI para abertura do fluxo de pagamento @@ -141,7 +141,7 @@ final Uri uriResult = paymentFlow.buildCallbackUri( |---|---| |**callback (String)**| O valor da URI para chamar o _deeplink_. Exemplo: `tuHost://tuApp/prueba`.| |**methodCallback (String)**| Identifica se a URI é para um caso de sucesso, erro ou outra resposta personalizada.| -|**metadata (HashMap)**| Campo opcional para enviar informação à tela de resposta, caso seja necessário mostrar detalhes adicionais, como o nome do cliente ou o resumo dos produtos comprados. | +|**metadata (HashMap<String, String>)**| Campo opcional para enviar informação à tela de resposta, caso seja necessário mostrar detalhes adicionais, como o nome do cliente ou o resumo dos produtos comprados. | |**appID (String)**| Identificador do aplicativo principal. Usamos o nome do pacote. Exemplo: `com.tuempresa.tuapp`.| |**Uri**| A URI definida com a informação proporcionada.| From d52351efa76e350d84bddca0229e4b7866d9860b Mon Sep 17 00:00:00 2001 From: hgaldino Date: Tue, 20 Aug 2024 14:09:40 -0300 Subject: [PATCH 16/34] 15 --- guides/mp-point-main-apps/print-external-printer.en.md | 2 +- guides/mp-point-main-apps/print-external-printer.es.md | 2 +- guides/mp-point-main-apps/print-external-printer.pt.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/guides/mp-point-main-apps/print-external-printer.en.md b/guides/mp-point-main-apps/print-external-printer.en.md index 54f12d2abd..b12829624e 100644 --- a/guides/mp-point-main-apps/print-external-printer.en.md +++ b/guides/mp-point-main-apps/print-external-printer.en.md @@ -95,7 +95,7 @@ bluetoothPrinter.print(dataToPrint, address, callback); |---|---| |**dataToPrint (String)**| Text sequence you want to print.| |**address (String)**| Address of the printer that will be used to print.| -|**callback ((MPResponse) -> Unit)**| Request response feature that provides the result of the print request. The `[MPResponse]` includes the status, the error (if any), and the details in case of success, which contain a `[BluetoothPrinterResult]` object.| +|**callback ((MPResponse<BluetoothPrinterResult>) -> Unit)**| Request response feature that provides the result of the print request. The `[MPResponse]` includes the status, the error (if any), and the details in case of success, which contain a `[BluetoothPrinterResult]` object.| |**CONNECTION_FAILED**| Indicates that the connection failed.| |**ERROR_UNDEFINED**| Indicates that there is an error with an unknown cause. | |**SUCCESS**| Indicates that the printing was successful.| diff --git a/guides/mp-point-main-apps/print-external-printer.es.md b/guides/mp-point-main-apps/print-external-printer.es.md index 388cd4a67d..5165dce4a0 100644 --- a/guides/mp-point-main-apps/print-external-printer.es.md +++ b/guides/mp-point-main-apps/print-external-printer.es.md @@ -95,7 +95,7 @@ bluetoothPrinter.print(dataToPrint, address, callback); |---|---| |**dataToPrint (String)**| Secuencia de texto que se quiere imprimir| |**address (String)**| Dirección de la impresora que se usará para la impresión.| -|**callback ((MPResponse) -> Unit)**| Función de devolución del llamado que ofrece el resultado del pedido de impresión. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito, que tiene un objeto `[BluetoothPrinterResult]`.| +|**callback ((MPResponse<BluetoothPrinterResult>) -> Unit)**| Función de devolución del llamado que ofrece el resultado del pedido de impresión. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito, que tiene un objeto `[BluetoothPrinterResult]`.| |**CONNECTION_FAILED**| Indica que la conexión falló.| |**ERROR_UNDEFINED**| Indica que hay un error de causa indefinida. | |**SUCCESS**| Indica que la impresión fue exitosa| diff --git a/guides/mp-point-main-apps/print-external-printer.pt.md b/guides/mp-point-main-apps/print-external-printer.pt.md index c06232dc57..3f0da40648 100644 --- a/guides/mp-point-main-apps/print-external-printer.pt.md +++ b/guides/mp-point-main-apps/print-external-printer.pt.md @@ -95,7 +95,7 @@ bluetoothPrinter.print(dataToPrint, address, callback); |---|---| |**dataToPrint (String)**| Sequência de texto que se deseja imprimir.| |**address (String)**| Endereço da impressora que será usada para a impressão.| -|**callback ((MPResponse) -> Unit)**| Função de devolução da chamada que proporciona o resultado do pedido de impressão. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados no caso de sucesso, que contêm um objeto `[BluetoothPrinterResult]`.| +|**callback ((MPResponse<BluetoothPrinterResult>) -> Unit)**| Função de devolução da chamada que proporciona o resultado do pedido de impressão. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados no caso de sucesso, que contêm um objeto `[BluetoothPrinterResult]`.| |**CONNECTION_FAILED**| Indica que a conexão falhou.| |**ERROR_UNDEFINED**| Indica que há um erro de causa indefinida. | |**SUCCESS**| Indica que a impressão foi exitosa.| From 148f57ba43e829394a231ba21aded171d125df9d Mon Sep 17 00:00:00 2001 From: hgaldino Date: Wed, 21 Aug 2024 17:30:05 -0300 Subject: [PATCH 17/34] final3 --- guides/mp-point-main-apps/introduction.en.md | 23 +-------------- guides/mp-point-main-apps/introduction.es.md | 23 +-------------- guides/mp-point-main-apps/introduction.pt.md | 23 +-------------- guides/mp-point-main-apps/landing.en.md | 26 +++++++++++++++-- guides/mp-point-main-apps/landing.es.md | 20 +++++++++++-- guides/mp-point-main-apps/landing.pt.md | 29 +++++++++++++++---- guides/mp-point-main-apps/prerequisites.en.md | 3 +- guides/mp-point-main-apps/prerequisites.es.md | 3 +- guides/mp-point-main-apps/prerequisites.pt.md | 3 +- 9 files changed, 74 insertions(+), 79 deletions(-) diff --git a/guides/mp-point-main-apps/introduction.en.md b/guides/mp-point-main-apps/introduction.en.md index ec36ee2b03..2b16f4c6cc 100644 --- a/guides/mp-point-main-apps/introduction.en.md +++ b/guides/mp-point-main-apps/introduction.en.md @@ -8,25 +8,4 @@ Main apps are business management applications that can be integrated with [Point Smart](/developers/en/docs/mp-point/landing). They become the main interface, and the seller uses the functionalities of the POS machine with Mercado Pago processing the payments. -The application is private, with a [closed distribution model](/developers/en/docs/main-apps/distribution) for exclusive use by the company. - -## Features - -Once integrated, the application can use the machine's functionalities to complete the experience. These are: - -### Available - -- Login in the main app from the Point Smart. -- Debit, credit and NFC payments with card or cell phone. -- Pix or QR code payments. -- Access to the camera to read the QR code. -- Customized printing of receipts and bitmap image files. -- Bluetooth connection to printers, keyboards and barcode readers. - -### Coming soon - -- Access to the camera for reading barcodes. -- Payment refunds by the POS. -- Control panel with application information. -- Testing environment. -- Remote application updates controlled by device. \ No newline at end of file +The application is private, with a [closed distribution model](/developers/en/docs/main-apps/distribution) for exclusive use by the company. \ No newline at end of file diff --git a/guides/mp-point-main-apps/introduction.es.md b/guides/mp-point-main-apps/introduction.es.md index dd75c66b68..9345bc17af 100644 --- a/guides/mp-point-main-apps/introduction.es.md +++ b/guides/mp-point-main-apps/introduction.es.md @@ -8,25 +8,4 @@ El [Point Smart](/developers/es/docs/mp-point/landing) es un dispositivo de pago Las main apps son aplicativos de gestión de negocio que se pueden integrar a [Point Smart](/developers/es/docs/mp-point/landing). Se convierten en la interfaz principal, y la persona vendedora usa las funcionalidades del lector con Mercado Pago procesando los pagos. -La app es privada, con [modelo cerrado de distribución](/developers/es/docs/main-apps/distribution) de uso exclusivo de la empresa. - -## Funcionalidades - -Cuando se integra, la app puede usar las funcionalidades del lector que completan la experiencia. Ellas son: - -### Disponibles - -- Inicio de sesión en la main app desde Point Smart. -- Pagos en débito, crédito y NFC (pago sin contacto) con tarjeta o celular. -- Pagos por Pix o código QR. -- Acceso a la cámara para lectura del código QR. -- Impresión customizada de comprobantes y archivos de imagen bitmap. -- Conexión por bluetooth a impresoras, teclados y lectores de código de barras. - -### En breve - -- Acceso a la cámara para lectura de códigos de barra. -- Reembolso y devolución de pago a través del lector. -- Panel de control con información de la app. -- Ambiente de pruebas. -- Actualizaciones remotas de la app controlada por dispositivo. \ No newline at end of file +La app es privada, con [modelo cerrado de distribución](/developers/es/docs/main-apps/distribution) de uso exclusivo de la empresa. \ No newline at end of file diff --git a/guides/mp-point-main-apps/introduction.pt.md b/guides/mp-point-main-apps/introduction.pt.md index 43e3bd4cdc..2640b1b1e3 100644 --- a/guides/mp-point-main-apps/introduction.pt.md +++ b/guides/mp-point-main-apps/introduction.pt.md @@ -8,25 +8,4 @@ A [Point Smart](/developers/pt/docs/mp-point/landing) é um dispositivo de pagam Main apps são aplicativos de gestão de negócio que podem ser integrados à [Point Smart](/developers/pt/docs/mp-point/landing). Eles se transformam na interface principal, e a pessoa vendedora utiliza as funcionalidades da maquininha com o Mercado Pago processando os pagamentos. -O aplicativo é privado, com [modelo fechado de distribuição](/developers/pt/docs/main-apps/distribution) de uso exclusivo da empresa. - -## Funcionalidades - -Uma vez integrado, o aplicativo pode usar as funções da maquininha que completam a experiência. São elas: - -### Disponíveis - -- Login no main app a partir da Point Smart. -- Pagamentos em débito, crédito e NFC (pagamento por aproximação) com cartão ou celular. -- Pagamentos por Pix ou código QR. -- Acesso à câmera para leitura do código QR. -- Impressão customizada de comprovantes e arquivos de imagem bitmap. -- Conexão via bluetooth a impressoras, teclados e leitores de código de barras. - -### Em breve - -- Acesso à câmera para leitura de códigos de barra. -- Reembolso e devolução de pagamento pela maquininha. -- Painel de controle com informações do aplicativo. -- Ambiente de testes. -- Atualizações remotas do aplicativo controlada por dispositivo. \ No newline at end of file +O aplicativo é privado, com [modelo fechado de distribuição](/developers/pt/docs/main-apps/distribution) de uso exclusivo da empresa. \ No newline at end of file diff --git a/guides/mp-point-main-apps/landing.en.md b/guides/mp-point-main-apps/landing.en.md index f04e93f426..f1ca8d7446 100644 --- a/guides/mp-point-main-apps/landing.en.md +++ b/guides/mp-point-main-apps/landing.en.md @@ -1,10 +1,32 @@ --- content_section_with_media: - - title: Main Apps - - message: This is a guide for you to develop and integrate main apps with Point Smart. Browse the side menu to find the processes, requirements and guidelines, from the POS technical data sheet to the solution distribution. The material is constantly evolving, with new content being included. + - title: Main Apps Playbook + - message: This is a guide for you to develop and integrate main apps, business management applications that can be integrated with Point Smart. Browse the side menu to find the processes, requirements and guidelines, from the POS technical data sheet to the solution distribution. The material is constantly evolving, with new content being included. - media_image: /main-apps/landing-all.png --- +--- +bullet_section_with_media: + - title: Features + - type: normal + - message: Once integrated, the application can use the machine's functionalities to complete the experience. These are: + - benefit_title: xxx + - benefit_message: Login in the main app from the Point Smart. + - benefit_title: xxx + - benefit_message: Debit, credit and NFC payments with card or cell phone. + - benefit_title: xxx + - benefit_message: Pix or QR code payments. + - benefit_title: xxx + - benefit_message: Access to the camera to read the QR code. + - benefit_title: xxx + - benefit_message: Customized printing of receipts and bitmap image files. + - benefit_title: xxx + - benefit_message: Bluetooth connection to printers, keyboards and barcode readers. + - benefit_title: xxx + - benefit_message: Access to the camera for reading barcodes. + - media_image: /main-apps/landing2-all.png +--- + --- mini_landing_separator --- >>>> Availability by countrys<<<< diff --git a/guides/mp-point-main-apps/landing.es.md b/guides/mp-point-main-apps/landing.es.md index 62db7f7da3..46d9658690 100644 --- a/guides/mp-point-main-apps/landing.es.md +++ b/guides/mp-point-main-apps/landing.es.md @@ -1,10 +1,25 @@ --- content_section_with_media: - - title: Main Apps - - message: Esta es una guía para que desarrolles e integres main apps al Point Smart. Navega por el menú lateral para encontrar los procesos, requisitos y direccionamientos, desde la ficha técnica del lector a la distribución de la solución. El material está en constante evolución, con nuevos contenidos que se van incluyendo. + - title: Main Apps Playbook + - message: Esta es una guía para que desarrolles e integres main apps, aplicativos de gestión de negocio que se pueden integrar a Point Smart. Navega por el menú lateral para encontrar los procesos, requisitos y direccionamientos, desde la ficha técnica del lector a la distribución de la solución. El material está en constante evolución, con nuevos contenidos que se van incluyendo. - media_image: /main-apps/landing-all.png --- +--- +bullet_section_with_media: + - title: Funcionalidades + - type: normal + - message: Cuando se integra, la app puede usar las funcionalidades del lector que completan la experiencia. Ellas son: + - benefit_title: Inicio de sesión en la main app desde Point Smart. + - benefit_title: Pagos en débito, crédito y NFC (pago sin contacto) con tarjeta o celular. + - benefit_title: Pagos por Pix o código QR. + - benefit_title: Acceso a la cámara para lectura del código QR. + - benefit_title: Impresión customizada de comprobantes y archivos de imagen bitmap. + - benefit_title: Conexión por bluetooth a impresoras, teclados y lectores de código de barras. + - benefit_title: Acceso a la cámara para lectura de códigos de barra. + - media_image: /main-apps/landing2-all.png +--- + --- mini_landing_separator --- >>>> Disponibilidad por país <<<< @@ -23,7 +38,6 @@ available_countries: mlb, mla, mlm available_payments: credit, debit, mercadopago, pix --- - ------------ ----[mla]---- diff --git a/guides/mp-point-main-apps/landing.pt.md b/guides/mp-point-main-apps/landing.pt.md index 775f66bbd3..9371f0d21b 100644 --- a/guides/mp-point-main-apps/landing.pt.md +++ b/guides/mp-point-main-apps/landing.pt.md @@ -1,10 +1,32 @@ --- content_section_with_media: - - title: Main Apps - - message: Este é um guia para você desenvolver e integrar main apps à Point Smart. Navegue pelo menu lateral para encontrar os processos, requisitos e direcionamentos, da ficha técnica da maquininha à distribuição da solução. O material está em constante evolução, com novos conteúdos sendo incluídos. + - title: Main Apps Playbook + - message: Este é um guia para você desenvolver e integrar main apps, aplicativos de gestão de negócio que podem ser integrados à Point Smart. Navegue pelo menu lateral para encontrar os processos, requisitos e direcionamentos, da ficha técnica da maquininha à distribuição da solução. O material está em constante evolução, com novos conteúdos sendo incluídos. - media_image: /main-apps/landing-all.png --- +--- +bullet_section_with_media: + - title: Funcionalidades + - type: normal + - message: Uma vez integrado, o aplicativo pode usar as funções da maquininha que completam a experiência. São elas: + - benefit_title: xxx + - benefit_message: Login no main app a partir da Point Smart. + - benefit_title: xxx + - benefit_message: Pagamentos em débito, crédito e NFC (pagamento por aproximação) com cartão ou celular. + - benefit_title: xxx + - benefit_message: Pagamentos por Pix ou código QR. + - benefit_title: xxx + - benefit_message: Acesso à câmera para leitura do código QR. + - benefit_title: xxx + - benefit_message: Impressão customizada de comprovantes e arquivos de imagem bitmap. + - benefit_title: xxx + - benefit_message: Conexão via bluetooth a impressoras, teclados e leitores de código de barras. + - benefit_title: xxx + - benefit_message: Acesso à câmera para leitura de códigos de barra. + - media_image: /main-apps/landing2-all.png +--- + --- mini_landing_separator --- >>>> Disponibilidade por país <<<< @@ -23,9 +45,7 @@ available_countries: mlb, mla, mlm available_payments: credit, debit, mercadopago, pix --- - ------------ - ----[mla]---- --- @@ -33,7 +53,6 @@ available_payments: credit, debit, mercadopago --- ------------ - ----[mlm]---- --- diff --git a/guides/mp-point-main-apps/prerequisites.en.md b/guides/mp-point-main-apps/prerequisites.en.md index bc43543417..d64c13fee0 100644 --- a/guides/mp-point-main-apps/prerequisites.en.md +++ b/guides/mp-point-main-apps/prerequisites.en.md @@ -4,6 +4,7 @@ Before you start developing your solution, take a look at the requirements that | Requirement | Description | |---|---| +| Mercado Pago Point | The Mercado Pago card machine that allows buyers to pay in person quickly and securely using credit or debit cards.| | Device pre-configuration| In order for the machines to operate in **Integrated mode** and for the pre-configuration to be carried out, share with Mercado Pago the account that will be used for the integration, as well as the cash register and store configurations and the serial numbers of the devices. | |Development kit | To start development, download the [Development kit](https://github.com/mercadolibre/point-mainapp-demo-android) provided by Mercado Pago. | |Android Studio| Install the [integrated development environment](https://developer.android.com/studio) to build and debug the main apps. | @@ -12,7 +13,7 @@ Before you start developing your solution, take a look at the requirements that ## Point Smart technical specifications -To ensure that the integration is successful, consider the machine's characteristics and how the application will adapt to them. +To ensure that the integration is successful, consider the Point Smart machine's characteristics and how the application will adapt to them. ![prerequisites](/main-apps/prerequisites-all.png) diff --git a/guides/mp-point-main-apps/prerequisites.es.md b/guides/mp-point-main-apps/prerequisites.es.md index 51f74c2a6a..b72308338e 100644 --- a/guides/mp-point-main-apps/prerequisites.es.md +++ b/guides/mp-point-main-apps/prerequisites.es.md @@ -4,6 +4,7 @@ Antes de empezar a desarrollar tu solución, consulta las condiciones que debes | Requisitos | Descripción | |---|---| +| Mercado Pago Point | La máquina de tarjetas de Mercado Pago que permite a los compradores realizar pagos presenciales de forma rápida y segura mediante tarjetas de crédito o débito.| | Pre-configuración de dispositivos | Para que los lectores operen de **Modo integrado** y se haga la pre-configuración, comparte con Mercado Pago la cuenta que se usará para la integración, así como la configuración de cajas, tiendas y números de serie de dispositivos. | |Kit de Desarrollo | Para empezar el desarrollo, descarga el [Kit de Desarrollo](https://github.com/mercadolibre/point-mainapp-demo-android) que ofrece Mercado Pago. | |Android Studio | Instala el [ambiente de desarrollo Android](https://developer.android.com/studio) para construir y depurar las main apps. | @@ -12,7 +13,7 @@ Antes de empezar a desarrollar tu solución, consulta las condiciones que debes ## Especificaciones técnicas de Point Smart -Para garantizar que la integración sea exitosa, considera las características del lector y cómo la app se adaptará a ellas. +Para garantizar que la integración sea exitosa, considera las características del lector Point Smart y cómo la app se adaptará a ellas. ![prerequisites](/main-apps/prerequisites-all.png) diff --git a/guides/mp-point-main-apps/prerequisites.pt.md b/guides/mp-point-main-apps/prerequisites.pt.md index d471fbd29f..220392e906 100644 --- a/guides/mp-point-main-apps/prerequisites.pt.md +++ b/guides/mp-point-main-apps/prerequisites.pt.md @@ -4,6 +4,7 @@ Antes de começar a desenvolver sua solução, veja as condições que devem ser | Requisitos | Descrição | |---|---| +| Mercado Pago Point | Point é a maquininha de cartão do Mercado Pago que permite aos compradores realizarem pagamentos presenciais de maneira rápida e segura utilizando cartões de crédito ou débito. | | Pré-configuração de dispositivos | Para que as maquininhas operem em **Modo integrado** e a pré-configuração seja feita, compartilhe com o Mercado Pago a conta que será utilizada para a integração, bem como as configurações de caixas, lojas e números de série dos aparelhos. | |Kit de Desenvolvimento| Para iniciar o desenvolvimento, baixe o [Kit de Desenvolvimento](https://github.com/mercadolibre/point-mainapp-demo-android) fornecido pelo Mercado Pago. | |Android Studio| Instale o [ambiente de desenvolvimento Android](https://developer.android.com/studio) para construir e depurar os main apps.| @@ -12,7 +13,7 @@ Antes de começar a desenvolver sua solução, veja as condições que devem ser ## Especificações técnicas da Point Smart -Para garantir que a integração seja exitosa, considere as características da maquininha e como o aplicativo se adaptará a elas. +Para garantir que a integração seja exitosa, considere as características da maquininha Point Smart e como o aplicativo se adaptará a elas. ![prerequisites](/main-apps/prerequisites-all.png) From 6fba1a52571d82d9c9714a58f5d59c2051874ac3 Mon Sep 17 00:00:00 2001 From: hgaldino Date: Wed, 21 Aug 2024 17:39:55 -0300 Subject: [PATCH 18/34] final3 --- guides/mp-point-main-apps/prerequisites.en.md | 4 ++-- guides/mp-point-main-apps/prerequisites.es.md | 4 ++-- guides/mp-point-main-apps/prerequisites.pt.md | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/guides/mp-point-main-apps/prerequisites.en.md b/guides/mp-point-main-apps/prerequisites.en.md index d64c13fee0..30b7105721 100644 --- a/guides/mp-point-main-apps/prerequisites.en.md +++ b/guides/mp-point-main-apps/prerequisites.en.md @@ -4,7 +4,7 @@ Before you start developing your solution, take a look at the requirements that | Requirement | Description | |---|---| -| Mercado Pago Point | The Mercado Pago card machine that allows buyers to pay in person quickly and securely using credit or debit cards.| +| Mercado Pago's Point Smart | [Mercado Pago Point](/developers/en/docs/mp-point/landing) is the Mercado Pago card machine that allows buyers to pay in person quickly and securely using credit or debit cards.| | Device pre-configuration| In order for the machines to operate in **Integrated mode** and for the pre-configuration to be carried out, share with Mercado Pago the account that will be used for the integration, as well as the cash register and store configurations and the serial numbers of the devices. | |Development kit | To start development, download the [Development kit](https://github.com/mercadolibre/point-mainapp-demo-android) provided by Mercado Pago. | |Android Studio| Install the [integrated development environment](https://developer.android.com/studio) to build and debug the main apps. | @@ -13,7 +13,7 @@ Before you start developing your solution, take a look at the requirements that ## Point Smart technical specifications -To ensure that the integration is successful, consider the Point Smart machine's characteristics and how the application will adapt to them. +To ensure that the integration is successful, consider the [Point Smart](/developers/en/docs/mp-point/landing) machine's characteristics and how the application will adapt to them. ![prerequisites](/main-apps/prerequisites-all.png) diff --git a/guides/mp-point-main-apps/prerequisites.es.md b/guides/mp-point-main-apps/prerequisites.es.md index b72308338e..c24aae10e0 100644 --- a/guides/mp-point-main-apps/prerequisites.es.md +++ b/guides/mp-point-main-apps/prerequisites.es.md @@ -4,7 +4,7 @@ Antes de empezar a desarrollar tu solución, consulta las condiciones que debes | Requisitos | Descripción | |---|---| -| Mercado Pago Point | La máquina de tarjetas de Mercado Pago que permite a los compradores realizar pagos presenciales de forma rápida y segura mediante tarjetas de crédito o débito.| +| Point Smart de Mercado Pago | [Mercado Pago Point](/developers/es/docs/mp-point/landing) es la máquina de tarjetas de Mercado Pago que permite a los compradores realizar pagos presenciales de forma rápida y segura mediante tarjetas de crédito o débito.| | Pre-configuración de dispositivos | Para que los lectores operen de **Modo integrado** y se haga la pre-configuración, comparte con Mercado Pago la cuenta que se usará para la integración, así como la configuración de cajas, tiendas y números de serie de dispositivos. | |Kit de Desarrollo | Para empezar el desarrollo, descarga el [Kit de Desarrollo](https://github.com/mercadolibre/point-mainapp-demo-android) que ofrece Mercado Pago. | |Android Studio | Instala el [ambiente de desarrollo Android](https://developer.android.com/studio) para construir y depurar las main apps. | @@ -13,7 +13,7 @@ Antes de empezar a desarrollar tu solución, consulta las condiciones que debes ## Especificaciones técnicas de Point Smart -Para garantizar que la integración sea exitosa, considera las características del lector Point Smart y cómo la app se adaptará a ellas. +Para garantizar que la integración sea exitosa, considera las características del lector [Point Smart](/developers/es/docs/mp-point/landing) y cómo la app se adaptará a ellas. ![prerequisites](/main-apps/prerequisites-all.png) diff --git a/guides/mp-point-main-apps/prerequisites.pt.md b/guides/mp-point-main-apps/prerequisites.pt.md index 220392e906..11becad69b 100644 --- a/guides/mp-point-main-apps/prerequisites.pt.md +++ b/guides/mp-point-main-apps/prerequisites.pt.md @@ -4,7 +4,7 @@ Antes de começar a desenvolver sua solução, veja as condições que devem ser | Requisitos | Descrição | |---|---| -| Mercado Pago Point | Point é a maquininha de cartão do Mercado Pago que permite aos compradores realizarem pagamentos presenciais de maneira rápida e segura utilizando cartões de crédito ou débito. | +| Point Smart de Mercado Pago | [Mercado Pago Point](/developers/pt/docs/mp-point/landing) é a maquininha de cartão do Mercado Pago que permite aos compradores realizarem pagamentos presenciais de maneira rápida e segura utilizando cartões de crédito ou débito. | | Pré-configuração de dispositivos | Para que as maquininhas operem em **Modo integrado** e a pré-configuração seja feita, compartilhe com o Mercado Pago a conta que será utilizada para a integração, bem como as configurações de caixas, lojas e números de série dos aparelhos. | |Kit de Desenvolvimento| Para iniciar o desenvolvimento, baixe o [Kit de Desenvolvimento](https://github.com/mercadolibre/point-mainapp-demo-android) fornecido pelo Mercado Pago. | |Android Studio| Instale o [ambiente de desenvolvimento Android](https://developer.android.com/studio) para construir e depurar os main apps.| @@ -13,7 +13,7 @@ Antes de começar a desenvolver sua solução, veja as condições que devem ser ## Especificações técnicas da Point Smart -Para garantir que a integração seja exitosa, considere as características da maquininha Point Smart e como o aplicativo se adaptará a elas. +Para garantir que a integração seja exitosa, considere as características da maquininha [Point Smart](/developers/pt/docs/mp-point/landing) e como o aplicativo se adaptará a elas. ![prerequisites](/main-apps/prerequisites-all.png) From 88ed59ac70d588e376c1231719e25d30f4895bd5 Mon Sep 17 00:00:00 2001 From: hgaldino Date: Wed, 21 Aug 2024 17:58:50 -0300 Subject: [PATCH 19/34] final3 --- guides/mp-point-main-apps/landing.en.md | 3 ++- guides/mp-point-main-apps/landing.es.md | 3 ++- guides/mp-point-main-apps/landing.pt.md | 17 +++++++---------- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/guides/mp-point-main-apps/landing.en.md b/guides/mp-point-main-apps/landing.en.md index f1ca8d7446..2a17c67b7f 100644 --- a/guides/mp-point-main-apps/landing.en.md +++ b/guides/mp-point-main-apps/landing.en.md @@ -1,6 +1,6 @@ --- content_section_with_media: - - title: Main Apps Playbook + - title: Main Apps - message: This is a guide for you to develop and integrate main apps, business management applications that can be integrated with Point Smart. Browse the side menu to find the processes, requirements and guidelines, from the POS technical data sheet to the solution distribution. The material is constantly evolving, with new content being included. - media_image: /main-apps/landing-all.png --- @@ -10,6 +10,7 @@ bullet_section_with_media: - title: Features - type: normal - message: Once integrated, the application can use the machine's functionalities to complete the experience. These are: + - media_image: /main-apps/landing2-all.png - benefit_title: xxx - benefit_message: Login in the main app from the Point Smart. - benefit_title: xxx diff --git a/guides/mp-point-main-apps/landing.es.md b/guides/mp-point-main-apps/landing.es.md index 46d9658690..24bbc05605 100644 --- a/guides/mp-point-main-apps/landing.es.md +++ b/guides/mp-point-main-apps/landing.es.md @@ -1,6 +1,6 @@ --- content_section_with_media: - - title: Main Apps Playbook + - title: Main Apps - message: Esta es una guía para que desarrolles e integres main apps, aplicativos de gestión de negocio que se pueden integrar a Point Smart. Navega por el menú lateral para encontrar los procesos, requisitos y direccionamientos, desde la ficha técnica del lector a la distribución de la solución. El material está en constante evolución, con nuevos contenidos que se van incluyendo. - media_image: /main-apps/landing-all.png --- @@ -10,6 +10,7 @@ bullet_section_with_media: - title: Funcionalidades - type: normal - message: Cuando se integra, la app puede usar las funcionalidades del lector que completan la experiencia. Ellas son: + - media_image: /main-apps/landing2-all.png - benefit_title: Inicio de sesión en la main app desde Point Smart. - benefit_title: Pagos en débito, crédito y NFC (pago sin contacto) con tarjeta o celular. - benefit_title: Pagos por Pix o código QR. diff --git a/guides/mp-point-main-apps/landing.pt.md b/guides/mp-point-main-apps/landing.pt.md index 9371f0d21b..7b86c40d41 100644 --- a/guides/mp-point-main-apps/landing.pt.md +++ b/guides/mp-point-main-apps/landing.pt.md @@ -1,6 +1,6 @@ --- content_section_with_media: - - title: Main Apps Playbook + - title: Main Apps - message: Este é um guia para você desenvolver e integrar main apps, aplicativos de gestão de negócio que podem ser integrados à Point Smart. Navegue pelo menu lateral para encontrar os processos, requisitos e direcionamentos, da ficha técnica da maquininha à distribuição da solução. O material está em constante evolução, com novos conteúdos sendo incluídos. - media_image: /main-apps/landing-all.png --- @@ -10,21 +10,18 @@ bullet_section_with_media: - title: Funcionalidades - type: normal - message: Uma vez integrado, o aplicativo pode usar as funções da maquininha que completam a experiência. São elas: - - benefit_title: xxx + - media_image: /main-apps/landing2-all.png + - benefit_title: Point Smart - benefit_message: Login no main app a partir da Point Smart. - - benefit_title: xxx + - benefit_title: Pagamentos - benefit_message: Pagamentos em débito, crédito e NFC (pagamento por aproximação) com cartão ou celular. - - benefit_title: xxx - benefit_message: Pagamentos por Pix ou código QR. - - benefit_title: xxx + - benefit_title: Câmera - benefit_message: Acesso à câmera para leitura do código QR. - - benefit_title: xxx + - benefit_message: Acesso à câmera para leitura de códigos de barra. + - benefit_title: Bluetooth - benefit_message: Impressão customizada de comprovantes e arquivos de imagem bitmap. - - benefit_title: xxx - benefit_message: Conexão via bluetooth a impressoras, teclados e leitores de código de barras. - - benefit_title: xxx - - benefit_message: Acesso à câmera para leitura de códigos de barra. - - media_image: /main-apps/landing2-all.png --- --- mini_landing_separator --- From abac649b793bfca301bd6f99136da7c089ebeadf Mon Sep 17 00:00:00 2001 From: hgaldino Date: Wed, 21 Aug 2024 18:00:58 -0300 Subject: [PATCH 20/34] final4 --- images/main-apps/landing2-all.png | Bin 0 -> 289947 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/main-apps/landing2-all.png diff --git a/images/main-apps/landing2-all.png b/images/main-apps/landing2-all.png new file mode 100644 index 0000000000000000000000000000000000000000..a8bc35d6c056fa20160beec88fd265cd810b9550 GIT binary patch literal 289947 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 z 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 bL**Pc;q1YdAGhQE{Xtn??PZm$Y4HC5uBMsY literal 0 HcmV?d00001 From 66299fbe622d73bcf9a6ff465015038f2196b8b4 Mon Sep 17 00:00:00 2001 From: hgaldino Date: Wed, 21 Aug 2024 19:15:36 -0300 Subject: [PATCH 21/34] final5 --- guides/mp-point-main-apps/landing.en.md | 42 +++++++++++++++++-------- guides/mp-point-main-apps/landing.es.md | 39 ++++++++++++++++++----- guides/mp-point-main-apps/landing.pt.md | 36 ++++++++++++++++----- 3 files changed, 89 insertions(+), 28 deletions(-) diff --git a/guides/mp-point-main-apps/landing.en.md b/guides/mp-point-main-apps/landing.en.md index 2a17c67b7f..d52e11d06e 100644 --- a/guides/mp-point-main-apps/landing.en.md +++ b/guides/mp-point-main-apps/landing.en.md @@ -5,29 +5,45 @@ content_section_with_media: - media_image: /main-apps/landing-all.png --- +----[mlb]---- + --- bullet_section_with_media: - title: Features - type: normal - message: Once integrated, the application can use the machine's functionalities to complete the experience. These are: + - benefit_title: Access + - benefit_message: Login in the main app from the Point Smart. + - benefit_title: Payments + - benefit_message: Payments via Pix, debit or credit card, QR code, and NFC (contactless payment) with card or cellphone. + - benefit_title: Camera + - benefit_message: Access to the camera to read the QR code and barcodes. + - benefit_title: Printing + - benefit_message: Connection via Bluetooth to printers, keyboards, and barcode scanners. Additionally, it allows for customized printing of receipts and bitmap image files. - media_image: /main-apps/landing2-all.png - - benefit_title: xxx +--- + +------------ +----[mla, mlm]---- + +--- +bullet_section_with_media: + - title: Features + - type: normal + - message: Once integrated, the application can use the machine's functionalities to complete the experience. These are: + - benefit_title: Access - benefit_message: Login in the main app from the Point Smart. - - benefit_title: xxx - - benefit_message: Debit, credit and NFC payments with card or cell phone. - - benefit_title: xxx - - benefit_message: Pix or QR code payments. - - benefit_title: xxx - - benefit_message: Access to the camera to read the QR code. - - benefit_title: xxx - - benefit_message: Customized printing of receipts and bitmap image files. - - benefit_title: xxx - - benefit_message: Bluetooth connection to printers, keyboards and barcode readers. - - benefit_title: xxx - - benefit_message: Access to the camera for reading barcodes. + - benefit_title: Payments + - benefit_message: Payments with debit or credit card, QR code, and NFC (contactless payment) with card or cellphone. + - benefit_title: Camera + - benefit_message: Access to the camera to read the QR code and barcodes. + - benefit_title: Printing + - benefit_message: Connection via Bluetooth to printers, keyboards, and barcode scanners. Additionally, it allows for customized printing of receipts and bitmap image files. - media_image: /main-apps/landing2-all.png --- +------------ + --- mini_landing_separator --- >>>> Availability by countrys<<<< diff --git a/guides/mp-point-main-apps/landing.es.md b/guides/mp-point-main-apps/landing.es.md index 24bbc05605..b899bbff53 100644 --- a/guides/mp-point-main-apps/landing.es.md +++ b/guides/mp-point-main-apps/landing.es.md @@ -5,22 +5,47 @@ content_section_with_media: - media_image: /main-apps/landing-all.png --- +----[mlb]---- + --- bullet_section_with_media: - title: Funcionalidades - type: normal - message: Cuando se integra, la app puede usar las funcionalidades del lector que completan la experiencia. Ellas son: + - benefit_title: Acceso + - benefit_message: Inicio de sesión en la main app desde Point Smart. + - benefit_title: Pagos + - benefit_message: Pagos mediante Pix, tarjeta de débito o crédito, código QR y NFC (pagos sin contacto) con tarjeta o celular. + - benefit_title: Cámara + - benefit_message: Acceso a la cámara para lectura del código QR y de códigos de barra. + - benefit_title: Impresión + - benefit_message: Conexión vía bluetooth a impresoras, teclados y lectores de códigos de barras. Además, posibilita la impresión customizada de comprobantes y archivos de imagen bitmap. + - media_image: /main-apps/landing2-all.png - - benefit_title: Inicio de sesión en la main app desde Point Smart. - - benefit_title: Pagos en débito, crédito y NFC (pago sin contacto) con tarjeta o celular. - - benefit_title: Pagos por Pix o código QR. - - benefit_title: Acceso a la cámara para lectura del código QR. - - benefit_title: Impresión customizada de comprobantes y archivos de imagen bitmap. - - benefit_title: Conexión por bluetooth a impresoras, teclados y lectores de código de barras. - - benefit_title: Acceso a la cámara para lectura de códigos de barra. +--- + +------------ +----[mla, mlm]---- + +--- +bullet_section_with_media: + - title: Funcionalidades + - type: normal + - message: Cuando se integra, la app puede usar las funcionalidades del lector que completan la experiencia. Ellas son: + - benefit_title: Acceso + - benefit_message: Inicio de sesión en la main app desde Point Smart. + - benefit_title: Pagos + - benefit_message: Pagos con tarjeta de débito o crédito, código QR y NFC (pagos sin contacto) con tarjeta o celular. + - benefit_title: Cámara + - benefit_message: Acceso a la cámara para lectura del código QR y de códigos de barra. + - benefit_title: Impresión + - benefit_message: Conexión vía bluetooth a impresoras, teclados y lectores de códigos de barras. Además, posibilita la impresión customizada de comprobantes y archivos de imagen bitmap. + - media_image: /main-apps/landing2-all.png --- +------------ + --- mini_landing_separator --- >>>> Disponibilidad por país <<<< diff --git a/guides/mp-point-main-apps/landing.pt.md b/guides/mp-point-main-apps/landing.pt.md index 7b86c40d41..c11693eb3d 100644 --- a/guides/mp-point-main-apps/landing.pt.md +++ b/guides/mp-point-main-apps/landing.pt.md @@ -5,25 +5,45 @@ content_section_with_media: - media_image: /main-apps/landing-all.png --- +----[mlb]---- + --- bullet_section_with_media: - title: Funcionalidades - type: normal - message: Uma vez integrado, o aplicativo pode usar as funções da maquininha que completam a experiência. São elas: + - benefit_title: Acesso + - benefit_message: Login no main app a partir da Point Smart. + - benefit_title: Pagamentos + - benefit_message: Pagamentos via Pix, cartão de débito ou crédito, código QR e NFC (pagamento por aproximação) com cartão ou celular. + - benefit_title: Câmera + - benefit_message: Acesso à câmera para leitura do código QR e de códigos de barra. + - benefit_title: Impressão + - benefit_message: Conexão via bluetooth a impressoras, teclados e leitores de código de barras. Além disso, possibilida a impressão customizada de comprovantes e arquivos de imagem bitmap. - media_image: /main-apps/landing2-all.png - - benefit_title: Point Smart +--- + +------------ +----[mla, mlm]---- + +--- +bullet_section_with_media: + - title: Funcionalidades + - type: normal + - message: Uma vez integrado, o aplicativo pode usar as funções da maquininha que completam a experiência. São elas: + - benefit_title: Acesso - benefit_message: Login no main app a partir da Point Smart. - benefit_title: Pagamentos - - benefit_message: Pagamentos em débito, crédito e NFC (pagamento por aproximação) com cartão ou celular. - - benefit_message: Pagamentos por Pix ou código QR. + - benefit_message: Pagamentos com cartão de débito ou crédito, código QR e NFC (pagamento por aproximação) com cartão ou celular. - benefit_title: Câmera - - benefit_message: Acesso à câmera para leitura do código QR. - - benefit_message: Acesso à câmera para leitura de códigos de barra. - - benefit_title: Bluetooth - - benefit_message: Impressão customizada de comprovantes e arquivos de imagem bitmap. - - benefit_message: Conexão via bluetooth a impressoras, teclados e leitores de código de barras. + - benefit_message: Acesso à câmera para leitura do código QR e de códigos de barra. + - benefit_title: Impressão + - benefit_message: Conexão via bluetooth a impressoras, teclados e leitores de código de barras. Além disso, possibilida a impressão customizada de comprovantes e arquivos de imagem bitmap. + - media_image: /main-apps/landing2-all.png --- +------------ + --- mini_landing_separator --- >>>> Disponibilidade por país <<<< From 978d0567f1370afeead0e4bcb8520b8b9fb86734 Mon Sep 17 00:00:00 2001 From: hgaldino Date: Wed, 21 Aug 2024 19:19:39 -0300 Subject: [PATCH 22/34] final6 --- guides/mp-point-main-apps/landing.en.md | 4 ++-- guides/mp-point-main-apps/landing.es.md | 6 ++---- guides/mp-point-main-apps/landing.pt.md | 4 ++-- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/guides/mp-point-main-apps/landing.en.md b/guides/mp-point-main-apps/landing.en.md index d52e11d06e..da5f2d6120 100644 --- a/guides/mp-point-main-apps/landing.en.md +++ b/guides/mp-point-main-apps/landing.en.md @@ -12,6 +12,7 @@ bullet_section_with_media: - title: Features - type: normal - message: Once integrated, the application can use the machine's functionalities to complete the experience. These are: + - image: /main-apps/landing2-all.png - benefit_title: Access - benefit_message: Login in the main app from the Point Smart. - benefit_title: Payments @@ -20,7 +21,6 @@ bullet_section_with_media: - benefit_message: Access to the camera to read the QR code and barcodes. - benefit_title: Printing - benefit_message: Connection via Bluetooth to printers, keyboards, and barcode scanners. Additionally, it allows for customized printing of receipts and bitmap image files. - - media_image: /main-apps/landing2-all.png --- ------------ @@ -31,6 +31,7 @@ bullet_section_with_media: - title: Features - type: normal - message: Once integrated, the application can use the machine's functionalities to complete the experience. These are: + - image: /main-apps/landing2-all.png - benefit_title: Access - benefit_message: Login in the main app from the Point Smart. - benefit_title: Payments @@ -39,7 +40,6 @@ bullet_section_with_media: - benefit_message: Access to the camera to read the QR code and barcodes. - benefit_title: Printing - benefit_message: Connection via Bluetooth to printers, keyboards, and barcode scanners. Additionally, it allows for customized printing of receipts and bitmap image files. - - media_image: /main-apps/landing2-all.png --- ------------ diff --git a/guides/mp-point-main-apps/landing.es.md b/guides/mp-point-main-apps/landing.es.md index b899bbff53..a44542b1a0 100644 --- a/guides/mp-point-main-apps/landing.es.md +++ b/guides/mp-point-main-apps/landing.es.md @@ -12,6 +12,7 @@ bullet_section_with_media: - title: Funcionalidades - type: normal - message: Cuando se integra, la app puede usar las funcionalidades del lector que completan la experiencia. Ellas son: + - image: /main-apps/landing2-all.png - benefit_title: Acceso - benefit_message: Inicio de sesión en la main app desde Point Smart. - benefit_title: Pagos @@ -20,8 +21,6 @@ bullet_section_with_media: - benefit_message: Acceso a la cámara para lectura del código QR y de códigos de barra. - benefit_title: Impresión - benefit_message: Conexión vía bluetooth a impresoras, teclados y lectores de códigos de barras. Además, posibilita la impresión customizada de comprobantes y archivos de imagen bitmap. - - - media_image: /main-apps/landing2-all.png --- ------------ @@ -32,6 +31,7 @@ bullet_section_with_media: - title: Funcionalidades - type: normal - message: Cuando se integra, la app puede usar las funcionalidades del lector que completan la experiencia. Ellas son: + - image: /main-apps/landing2-all.png - benefit_title: Acceso - benefit_message: Inicio de sesión en la main app desde Point Smart. - benefit_title: Pagos @@ -40,8 +40,6 @@ bullet_section_with_media: - benefit_message: Acceso a la cámara para lectura del código QR y de códigos de barra. - benefit_title: Impresión - benefit_message: Conexión vía bluetooth a impresoras, teclados y lectores de códigos de barras. Además, posibilita la impresión customizada de comprobantes y archivos de imagen bitmap. - - - media_image: /main-apps/landing2-all.png --- ------------ diff --git a/guides/mp-point-main-apps/landing.pt.md b/guides/mp-point-main-apps/landing.pt.md index c11693eb3d..144b7b69ec 100644 --- a/guides/mp-point-main-apps/landing.pt.md +++ b/guides/mp-point-main-apps/landing.pt.md @@ -12,6 +12,7 @@ bullet_section_with_media: - title: Funcionalidades - type: normal - message: Uma vez integrado, o aplicativo pode usar as funções da maquininha que completam a experiência. São elas: + - image: /main-apps/landing2-all.png - benefit_title: Acesso - benefit_message: Login no main app a partir da Point Smart. - benefit_title: Pagamentos @@ -20,7 +21,6 @@ bullet_section_with_media: - benefit_message: Acesso à câmera para leitura do código QR e de códigos de barra. - benefit_title: Impressão - benefit_message: Conexão via bluetooth a impressoras, teclados e leitores de código de barras. Além disso, possibilida a impressão customizada de comprovantes e arquivos de imagem bitmap. - - media_image: /main-apps/landing2-all.png --- ------------ @@ -31,6 +31,7 @@ bullet_section_with_media: - title: Funcionalidades - type: normal - message: Uma vez integrado, o aplicativo pode usar as funções da maquininha que completam a experiência. São elas: + - image: /main-apps/landing2-all.png - benefit_title: Acesso - benefit_message: Login no main app a partir da Point Smart. - benefit_title: Pagamentos @@ -39,7 +40,6 @@ bullet_section_with_media: - benefit_message: Acesso à câmera para leitura do código QR e de códigos de barra. - benefit_title: Impressão - benefit_message: Conexão via bluetooth a impressoras, teclados e leitores de código de barras. Além disso, possibilida a impressão customizada de comprovantes e arquivos de imagem bitmap. - - media_image: /main-apps/landing2-all.png --- ------------ From c5ba0ac76fe7aa76c7b6cf4dafccfdbbaf322851 Mon Sep 17 00:00:00 2001 From: hgaldino Date: Wed, 21 Aug 2024 19:35:56 -0300 Subject: [PATCH 23/34] final7 --- guides/mp-point-main-apps/landing.en.md | 2 +- guides/mp-point-main-apps/landing.es.md | 2 +- guides/mp-point-main-apps/landing.pt.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/guides/mp-point-main-apps/landing.en.md b/guides/mp-point-main-apps/landing.en.md index da5f2d6120..c3866c7eb5 100644 --- a/guides/mp-point-main-apps/landing.en.md +++ b/guides/mp-point-main-apps/landing.en.md @@ -1,7 +1,7 @@ --- content_section_with_media: - title: Main Apps - - message: This is a guide for you to develop and integrate main apps, business management applications that can be integrated with Point Smart. Browse the side menu to find the processes, requirements and guidelines, from the POS technical data sheet to the solution distribution. The material is constantly evolving, with new content being included. + - message: This is a guide for you to develop and integrate main apps, business management applications that can be integrated with Point Smart. Browse the side menu to find the processes, requirements and guidelines, from the POS technical data sheet to the solution distribution. - media_image: /main-apps/landing-all.png --- diff --git a/guides/mp-point-main-apps/landing.es.md b/guides/mp-point-main-apps/landing.es.md index a44542b1a0..b2306b293b 100644 --- a/guides/mp-point-main-apps/landing.es.md +++ b/guides/mp-point-main-apps/landing.es.md @@ -1,7 +1,7 @@ --- content_section_with_media: - title: Main Apps - - message: Esta es una guía para que desarrolles e integres main apps, aplicativos de gestión de negocio que se pueden integrar a Point Smart. Navega por el menú lateral para encontrar los procesos, requisitos y direccionamientos, desde la ficha técnica del lector a la distribución de la solución. El material está en constante evolución, con nuevos contenidos que se van incluyendo. + - message: Esta es una guía para que desarrolles e integres main apps, aplicativos de gestión de negocio que se pueden integrar a Point Smart. Navega por el menú lateral para encontrar los procesos, requisitos y direccionamientos, desde la ficha técnica del lector a la distribución de la solución. - media_image: /main-apps/landing-all.png --- diff --git a/guides/mp-point-main-apps/landing.pt.md b/guides/mp-point-main-apps/landing.pt.md index 144b7b69ec..81a8985f84 100644 --- a/guides/mp-point-main-apps/landing.pt.md +++ b/guides/mp-point-main-apps/landing.pt.md @@ -1,7 +1,7 @@ --- content_section_with_media: - title: Main Apps - - message: Este é um guia para você desenvolver e integrar main apps, aplicativos de gestão de negócio que podem ser integrados à Point Smart. Navegue pelo menu lateral para encontrar os processos, requisitos e direcionamentos, da ficha técnica da maquininha à distribuição da solução. O material está em constante evolução, com novos conteúdos sendo incluídos. + - message: Este é um guia para você desenvolver e integrar main apps, aplicativos de gestão de negócio que podem ser integrados à Point Smart. Navegue pelo menu lateral para encontrar os processos, requisitos e direcionamentos, da ficha técnica da maquininha à distribuição da solução. - media_image: /main-apps/landing-all.png --- From bf816786b4fe8853e00da946838e7b088e98dd67 Mon Sep 17 00:00:00 2001 From: hgaldino Date: Wed, 21 Aug 2024 19:57:43 -0300 Subject: [PATCH 24/34] final9 --- .../additional-content/security/oauth/introduction.pt.md | 2 +- guides/checkout-bricks/prerequisites.en.md | 2 +- guides/checkout-bricks/prerequisites.es.md | 2 +- guides/mp-point-main-apps/landing.en.md | 2 +- guides/mp-point-main-apps/landing.es.md | 2 +- guides/mp-point-main-apps/landing.pt.md | 2 +- guides/mp-point-main-apps/prerequisites.en.md | 7 ++++--- guides/mp-point-main-apps/prerequisites.es.md | 5 +++-- guides/mp-point-main-apps/prerequisites.pt.md | 7 ++++--- 9 files changed, 17 insertions(+), 14 deletions(-) diff --git a/guides/additional-content/security/oauth/introduction.pt.md b/guides/additional-content/security/oauth/introduction.pt.md index 8e5ae15a21..15454fafca 100644 --- a/guides/additional-content/security/oauth/introduction.pt.md +++ b/guides/additional-content/security/oauth/introduction.pt.md @@ -1,6 +1,6 @@ # OAuth -O OAuth é um protocolo de autorização que permite que aplicações tenham acesso limitado às informações privadas das contas do Mercado Pago. Ele utiliza o protocolo HTTP e introduz uma camada de autenticação e autorização. Por meio desse protocolo, é possível solicitar acesso a recursos protegidos dos vendedores, utilizando um **Access Token** limitado a uma determinada aplicação, sem precisar das credenciais dos vendedores por meio de **fluxos de acesso**. +OAuth is an authorization protocol that allows applications to have limited access to private information from Mercado Pago accounts. It uses the HTTP protocol and introduces a layer of authentication and authorization. Through this protocol, it is possible to request access to protected resources of sellers using an **Access Token** that is limited to a specific application, without needing the sellers' credentials via **access flows**. > NOTE > diff --git a/guides/checkout-bricks/prerequisites.en.md b/guides/checkout-bricks/prerequisites.en.md index e9897357e3..82e5246238 100644 --- a/guides/checkout-bricks/prerequisites.en.md +++ b/guides/checkout-bricks/prerequisites.en.md @@ -12,7 +12,7 @@ To perform a Bricks integration, you must meet the requirements listed below. |---|---| | Application | Applications are the different integrations in one or more stores. You can create an application for each solution you implement to keep everything organized and on track for easier management. Check [Your integrations](/developers/en/docs/checkout-bricks/additional-content/your-integrations/introduction) for more information on how to create an application. | | Mercado Pago or Mercado Libre seller account | To integrate Bricks you need a seller account on Mercado Pago or Mercado Libre. If not, [click here](https://www.mercadopago[FAKER][URL][DOMAIN]/hub/registration/landing) to create. | -| Credentials | Unique passwords with which we identify an integration in your account. To perform the integrations, you will need the _Public key_ and the _Access Token_. [Click here](/developers/en/guides//checkout-bricks/additional-content/your-integrations/credentials) for more information. | +| Credentials | Unique passwords with which we identify an integration in your account. To perform the integrations, you will need the _Public key_ and the _Access Token_. [Click here](/developers/en/docs/checkout-bricks/additional-content/your-integrations/credentials) for more information. | | Install the Mercado Pago SDK | Install the official SDKs to simplify your integration with our [APIs](/developers/en/reference/payments/_payments/post). For more information, [click here](/developers/en/docs/sdks-library/landing). | If all the prerequisites are met, you can perform the Bricks integration. \ No newline at end of file diff --git a/guides/checkout-bricks/prerequisites.es.md b/guides/checkout-bricks/prerequisites.es.md index fe2a6897f0..a94e7383b5 100644 --- a/guides/checkout-bricks/prerequisites.es.md +++ b/guides/checkout-bricks/prerequisites.es.md @@ -12,7 +12,7 @@ Para realizar la integración de los Bricks, debes cumplir con los requisitos qu |---|---| | Aplicación | Las aplicaciones son las diversas integraciones contenidas en una o varias tiendas. Puedes crear una aplicación para cada solución que implementes a fin de tener todo organizado y mantener un control que facilite la gestión. Consulta tu [Tus integraciones](/developers/es/docs/checkout-bricks/additional-content/your-integrations/introduction) para obtener más información sobre cómo crear una aplicación. | | Cuenta de vendedor de Mercado Pago o Mercado Libre | Para integrar los Bricks necesitas una cuenta de vendedor en Mercado Pago o Mercado Libre. Sino, [haz clic aquí](https://www.mercadopago[FAKER][URL][DOMAIN]/hub/registration/landing) para crearla gratis. | -|Credenciales | Contraseñas únicas con las que identificamos una integración en tu cuenta. Para realizar las integraciones, necesitará la _Public key_ y el _Access Token_. [Haz clic aquí](/developers/es/guides/checkout-bricks/additional-content/your-integrations/credentials) para obtener más información. | +|Credenciales | Contraseñas únicas con las que identificamos una integración en tu cuenta. Para realizar las integraciones, necesitará la _Public key_ y el _Access Token_. [Haz clic aquí](/developers/es/docs/checkout-bricks/additional-content/your-integrations/credentials) para obtener más información. | | Instalar el SDK de Mercado Pago | Instala los SDK oficiales para simplificar tu integración con nuestras [APIs](/developers/es/reference/payments/_payments/post). Para obtener más información, [haz clic aquí](/developers/es/docs/sdks-library/landing). | Si se cumplen todos los requisitos previos, podrás realizar la integración de los Bricks. \ No newline at end of file diff --git a/guides/mp-point-main-apps/landing.en.md b/guides/mp-point-main-apps/landing.en.md index c3866c7eb5..8196ae73af 100644 --- a/guides/mp-point-main-apps/landing.en.md +++ b/guides/mp-point-main-apps/landing.en.md @@ -1,7 +1,7 @@ --- content_section_with_media: - title: Main Apps - - message: This is a guide for you to develop and integrate main apps, business management applications that can be integrated with Point Smart. Browse the side menu to find the processes, requirements and guidelines, from the POS technical data sheet to the solution distribution. + - message: This is a guide for you to develop and integrate main apps, business management applications that can be integrated with Mercado Pago's Point Smart. Browse the side menu to find the processes, requirements and guidelines, from the POS technical data sheet to the solution distribution. - media_image: /main-apps/landing-all.png --- diff --git a/guides/mp-point-main-apps/landing.es.md b/guides/mp-point-main-apps/landing.es.md index b2306b293b..47aff48120 100644 --- a/guides/mp-point-main-apps/landing.es.md +++ b/guides/mp-point-main-apps/landing.es.md @@ -1,7 +1,7 @@ --- content_section_with_media: - title: Main Apps - - message: Esta es una guía para que desarrolles e integres main apps, aplicativos de gestión de negocio que se pueden integrar a Point Smart. Navega por el menú lateral para encontrar los procesos, requisitos y direccionamientos, desde la ficha técnica del lector a la distribución de la solución. + - message: Esta es una guía para que desarrolles e integres main apps, aplicativos de gestión de negocio que se pueden integrar a Point Smart de Mercado Pago. Navega por el menú lateral para encontrar los procesos, requisitos y direccionamientos, desde la ficha técnica del lector a la distribución de la solución. - media_image: /main-apps/landing-all.png --- diff --git a/guides/mp-point-main-apps/landing.pt.md b/guides/mp-point-main-apps/landing.pt.md index 81a8985f84..2046300043 100644 --- a/guides/mp-point-main-apps/landing.pt.md +++ b/guides/mp-point-main-apps/landing.pt.md @@ -1,7 +1,7 @@ --- content_section_with_media: - title: Main Apps - - message: Este é um guia para você desenvolver e integrar main apps, aplicativos de gestão de negócio que podem ser integrados à Point Smart. Navegue pelo menu lateral para encontrar os processos, requisitos e direcionamentos, da ficha técnica da maquininha à distribuição da solução. + - message: Este é um guia para você desenvolver e integrar main apps, aplicativos de gestão de negócio que podem ser integrados à Point Smart do Mercado Pago. Navegue pelo menu lateral para encontrar os processos, requisitos e direcionamentos, da ficha técnica da maquininha à distribuição da solução. - media_image: /main-apps/landing-all.png --- diff --git a/guides/mp-point-main-apps/prerequisites.en.md b/guides/mp-point-main-apps/prerequisites.en.md index 30b7105721..a5574b862d 100644 --- a/guides/mp-point-main-apps/prerequisites.en.md +++ b/guides/mp-point-main-apps/prerequisites.en.md @@ -4,12 +4,13 @@ Before you start developing your solution, take a look at the requirements that | Requirement | Description | |---|---| +| Aplicação | As aplicações são as diferentes integrações contidas em uma ou mais lojas. Você pode criar uma aplicação para cada solução que implementar, a fim de ter tudo organizado e manter um controle que facilite a gestão. Veja [Suas integrações](/developers/pt/docs/main-apps/additional-content/your-integrations/introduction) para mais informações sobre como criar uma aplicação.| +| Credentials | Unique passwords with which we identify an integration in your account. To perform the integrations, you will need the **Client ID**. [Click here](/developers/en/docss/main-apps/additional-content/your-integrations/credentials) for more information. | | Mercado Pago's Point Smart | [Mercado Pago Point](/developers/en/docs/mp-point/landing) is the Mercado Pago card machine that allows buyers to pay in person quickly and securely using credit or debit cards.| | Device pre-configuration| In order for the machines to operate in **Integrated mode** and for the pre-configuration to be carried out, share with Mercado Pago the account that will be used for the integration, as well as the cash register and store configurations and the serial numbers of the devices. | |Development kit | To start development, download the [Development kit](https://github.com/mercadolibre/point-mainapp-demo-android) provided by Mercado Pago. | -|Android Studio| Install the [integrated development environment](https://developer.android.com/studio) to build and debug the main apps. | -|App in the Developer Panel | Create an app in the [developer panel](/developers/panel/app) with the integrator's account. Then generate the `ClientId` that will serve as the integration identifier. Check out more information about creating an application in [Application details](/developers/en/docs/main-apps/additional-content/your-integrations/application-details). | -|OAuth flow| If you want to obtain information from the seller's account, do the [OAuth flow](/developers/en/docs/main-apps/additional-content/security/oauth/introduction). | +|Android Studio| OAuth is an authorization protocol that allows applications to have limited access to the private information of Mercado Pago accounts. Install the [integrated development environment](https://developer.android.com/studio) to build and debug the main apps. | +|OAuth| If you want to obtain information from the seller's account, do the [OAuth flow](/developers/en/docs/main-apps/additional-content/security/oauth/introduction). | ## Point Smart technical specifications diff --git a/guides/mp-point-main-apps/prerequisites.es.md b/guides/mp-point-main-apps/prerequisites.es.md index c24aae10e0..1edd439bd6 100644 --- a/guides/mp-point-main-apps/prerequisites.es.md +++ b/guides/mp-point-main-apps/prerequisites.es.md @@ -4,12 +4,13 @@ Antes de empezar a desarrollar tu solución, consulta las condiciones que debes | Requisitos | Descripción | |---|---| +| Aplicación | Las aplicaciones son las diversas integraciones contenidas en una o varias tiendas. Puedes crear una aplicación para cada solución que implementes a fin de tener todo organizado y mantener un control que facilite la gestión. Consulta tu [Tus integraciones](/developers/es/docs/main-apps/additional-content/your-integrations/introduction) para obtener más información sobre cómo crear una aplicación. | +|Credenciales | Contraseñas únicas con las que identificamos una integración en tu cuenta. Para realizar las integraciones, necesitará del **Client ID**. [Haz clic aquí](/developers/es/docs/main-apps/additional-content/your-integrations/credentials) para obtener más información. | | Point Smart de Mercado Pago | [Mercado Pago Point](/developers/es/docs/mp-point/landing) es la máquina de tarjetas de Mercado Pago que permite a los compradores realizar pagos presenciales de forma rápida y segura mediante tarjetas de crédito o débito.| | Pre-configuración de dispositivos | Para que los lectores operen de **Modo integrado** y se haga la pre-configuración, comparte con Mercado Pago la cuenta que se usará para la integración, así como la configuración de cajas, tiendas y números de serie de dispositivos. | |Kit de Desarrollo | Para empezar el desarrollo, descarga el [Kit de Desarrollo](https://github.com/mercadolibre/point-mainapp-demo-android) que ofrece Mercado Pago. | |Android Studio | Instala el [ambiente de desarrollo Android](https://developer.android.com/studio) para construir y depurar las main apps. | -|App en Panel de Desarrolladores | Crea una app en el [panel de desarrolladores](/developers/panel/app) con la cuenta de integrador. Luego, genera el `ClientId` que servirá como identificador de la integración. Consulte más información sobre cómo crear una aplicación en [Detalles de la aplicación](/developers/es/docs/main-apps/additional-content/your-integrations/application-details). | -|Flujo de OAuth | Para obtener información de la cuenta de quienes venden, haz el [flujo de OAuth](/developers/es/docs/main-apps/additional-content/security/oauth/introduction). | +|OAuth | OAuth es un protocolo de autorización que permite que las aplicaciones tengan acceso limitado a la información privada de las cuentas de Mercado Pago. Para obtener información de la cuenta de quienes venden, haz el [flujo de OAuth](/developers/es/docs/main-apps/additional-content/security/oauth/introduction). | ## Especificaciones técnicas de Point Smart diff --git a/guides/mp-point-main-apps/prerequisites.pt.md b/guides/mp-point-main-apps/prerequisites.pt.md index 11becad69b..39163e94e4 100644 --- a/guides/mp-point-main-apps/prerequisites.pt.md +++ b/guides/mp-point-main-apps/prerequisites.pt.md @@ -4,12 +4,13 @@ Antes de começar a desenvolver sua solução, veja as condições que devem ser | Requisitos | Descrição | |---|---| -| Point Smart de Mercado Pago | [Mercado Pago Point](/developers/pt/docs/mp-point/landing) é a maquininha de cartão do Mercado Pago que permite aos compradores realizarem pagamentos presenciais de maneira rápida e segura utilizando cartões de crédito ou débito. | +| Aplicação | As aplicações são as diferentes integrações contidas em uma ou mais lojas. Você pode criar uma aplicação para cada solução que implementar, a fim de ter tudo organizado e manter um controle que facilite a gestão. Veja [Suas integrações](/developers/pt/docs/checkout-bricks/additional-content/your-integrations/introduction) para mais informações sobre como criar uma aplicação. | +| Credenciais | Senhas únicas com as quais identificamos uma integração na sua conta. Para realizar as integrações, será necessário o **Client ID**. [Clique aqui](/developers/pt/docs/main-apps/additional-content/your-integrations/credentials) para mais informações. | +| Point Smart do Mercado Pago | [Mercado Pago Point](/developers/pt/docs/mp-point/landing) é a maquininha de cartão do Mercado Pago que permite aos compradores realizarem pagamentos presenciais de maneira rápida e segura utilizando cartões de crédito ou débito. | | Pré-configuração de dispositivos | Para que as maquininhas operem em **Modo integrado** e a pré-configuração seja feita, compartilhe com o Mercado Pago a conta que será utilizada para a integração, bem como as configurações de caixas, lojas e números de série dos aparelhos. | |Kit de Desenvolvimento| Para iniciar o desenvolvimento, baixe o [Kit de Desenvolvimento](https://github.com/mercadolibre/point-mainapp-demo-android) fornecido pelo Mercado Pago. | |Android Studio| Instale o [ambiente de desenvolvimento Android](https://developer.android.com/studio) para construir e depurar os main apps.| -|App no Painel de Desenvolvedores | Crie um app no [painel de desenvolvedores](/developers/panel/app) com a conta do integrador. Em seguida, gere o `ClientId` que servirá como identificador da integração. Veja mais informações sobre como criar uma aplicação em [Detalhes da aplicação](/developers/pt/docs/main-apps/additional-content/your-integrations/application-details).| -|Fluxo de OAuth| Se for obter informações da conta da pessoa vendedora, faça o [fluxo de OAuth](/developers/pt/docs/main-apps/additional-content/security/oauth/introduction). | +|OAuth| O OAuth é um protocolo de autorização que permite que aplicações tenham acesso limitado às informações privadas das contas do Mercado Pago. Se for obter informações da conta da pessoa vendedora, faça o [fluxo de OAuth](/developers/pt/docs/main-apps/additional-content/security/oauth/introduction). | ## Especificações técnicas da Point Smart From 696cae4dbd47c3b36d482283d3d234cc806a077e Mon Sep 17 00:00:00 2001 From: hgaldino Date: Wed, 21 Aug 2024 20:02:43 -0300 Subject: [PATCH 25/34] final10 --- guides/mp-point-main-apps/landing.en.md | 16 ++++++++-------- guides/mp-point-main-apps/landing.es.md | 16 ++++++++-------- guides/mp-point-main-apps/landing.pt.md | 16 ++++++++-------- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/guides/mp-point-main-apps/landing.en.md b/guides/mp-point-main-apps/landing.en.md index 8196ae73af..36025d2d0e 100644 --- a/guides/mp-point-main-apps/landing.en.md +++ b/guides/mp-point-main-apps/landing.en.md @@ -5,6 +5,14 @@ content_section_with_media: - media_image: /main-apps/landing-all.png --- +--- mini_landing_separator --- + +>>>> Availability by countrys<<<< +--- +available_countries: mlb, mla, mlm + +--- + ----[mlb]---- --- @@ -46,14 +54,6 @@ bullet_section_with_media: --- mini_landing_separator --- ->>>> Availability by countrys<<<< ---- -available_countries: mlb, mla, mlm - ---- - ---- mini_landing_separator --- - >>>> Accepted payment types <<<< ----[mlb]---- diff --git a/guides/mp-point-main-apps/landing.es.md b/guides/mp-point-main-apps/landing.es.md index 47aff48120..9dd80609af 100644 --- a/guides/mp-point-main-apps/landing.es.md +++ b/guides/mp-point-main-apps/landing.es.md @@ -5,6 +5,14 @@ content_section_with_media: - media_image: /main-apps/landing-all.png --- +--- mini_landing_separator --- + +>>>> Disponibilidad por país <<<< +--- +available_countries: mlb, mla, mlm + +--- + ----[mlb]---- --- @@ -46,14 +54,6 @@ bullet_section_with_media: --- mini_landing_separator --- ->>>> Disponibilidad por país <<<< ---- -available_countries: mlb, mla, mlm - ---- - ---- mini_landing_separator --- - >>>> Tipos de pago aceptados <<<< ----[mlb]---- diff --git a/guides/mp-point-main-apps/landing.pt.md b/guides/mp-point-main-apps/landing.pt.md index 2046300043..9d229c782d 100644 --- a/guides/mp-point-main-apps/landing.pt.md +++ b/guides/mp-point-main-apps/landing.pt.md @@ -7,6 +7,14 @@ content_section_with_media: ----[mlb]---- +--- mini_landing_separator --- + +>>>> Disponibilidade por país <<<< +--- +available_countries: mlb, mla, mlm + +--- + --- bullet_section_with_media: - title: Funcionalidades @@ -46,14 +54,6 @@ bullet_section_with_media: --- mini_landing_separator --- ->>>> Disponibilidade por país <<<< ---- -available_countries: mlb, mla, mlm - ---- - ---- mini_landing_separator --- - >>>> Tipos de pagamento aceitos <<<< ----[mlb]---- From 4afc660070eb0d0859c91156008a9472a6d19457 Mon Sep 17 00:00:00 2001 From: Heitor Galdino Date: Wed, 2 Oct 2024 02:31:18 -0300 Subject: [PATCH 26/34] final --- .../mp-point-main-apps/get-information.en.md | 2 +- .../mp-point-main-apps/get-information.es.md | 28 +++++++++---------- .../mp-point-main-apps/get-information.pt.md | 2 +- .../get-list-installments.es.md | 4 +-- .../manage-connections.en.md | 4 +-- .../manage-connections.es.md | 6 ++-- guides/mp-point-main-apps/manage-status.en.md | 2 +- guides/mp-point-main-apps/manage-status.es.md | 2 +- guides/mp-point-main-apps/pair-unpair.en.md | 4 +-- guides/mp-point-main-apps/pair-unpair.es.md | 6 ++-- guides/mp-point-main-apps/pair-unpair.pt.md | 6 ++-- guides/mp-point-main-apps/print-images.en.md | 2 +- guides/mp-point-main-apps/print-images.es.md | 4 +-- guides/mp-point-main-apps/print-images.pt.md | 2 +- guides/mp-point-main-apps/scan-qr-code.en.md | 4 +-- guides/mp-point-main-apps/scan-qr-code.es.md | 4 +-- guides/mp-point-main-apps/scan-qr-code.pt.md | 4 +-- .../start-payment-flow.es.md | 2 +- .../start-payment-flow.pt.md | 2 +- 19 files changed, 45 insertions(+), 45 deletions(-) diff --git a/guides/mp-point-main-apps/get-information.en.md b/guides/mp-point-main-apps/get-information.en.md index b408bbcc28..7a0c7246f0 100644 --- a/guides/mp-point-main-apps/get-information.en.md +++ b/guides/mp-point-main-apps/get-information.en.md @@ -44,9 +44,9 @@ smartInformationTools.getInformation(callback); |Field|Description| |---|---| |**smartDevice**| Device details.| +|**integration**| Integration SDK details.| |**serialNumber**| POS machine serial number.| |**brandName**| POS machine brand.| |**modelName**| POS machine model.| |**paymentModuleVersion**| Version of the payment module of the [SmartPOS](/developers/en/docs/mp-point/landing).| -|**integration**| Integration SDK details.| |**nativeSdkVersion**| Integration SDK version.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/get-information.es.md b/guides/mp-point-main-apps/get-information.es.md index f1d61f7f85..220da4ba8f 100644 --- a/guides/mp-point-main-apps/get-information.es.md +++ b/guides/mp-point-main-apps/get-information.es.md @@ -44,24 +44,24 @@ smartInformationTools.getInformation(callback); ----[mla, mlb]---- |Campo|Descripción| |---|---| -|**smartDevice**| detalles del dispositivo| -|**serialNumber**| número de serie del lector.| -|**brandName**| nombre de la marca del lector.| -|**modelName**| nombre del modelo del lector.| -|**paymentModuleVersion**| ersión del módulo de pago del [SmartPOS](/developers/en/docs/mp-point/landing).| -|**integration**| detalles del SDK de las integraciones.| -|**nativeSdkVersion**| versión del SDK de las integraciones.| +|**smartDevice**| Detalles del dispositivo.| +|**integration**| Detalles del SDK de las integraciones.| +|**serialNumber**| Número de serie del lector.| +|**brandName**| Nombre de la marca del lector.| +|**modelName**| Nombre del modelo del lector.| +|**paymentModuleVersion**| Versión del módulo de pago del [SmartPOS](/developers/en/docs/mp-point/landing).| +|**nativeSdkVersion**| Versión del SDK de las integraciones.| ------------ ----[mlm]---- |Campo|Descripción| |---|---| -|**smartDevice**| detalles del dispositivo| -|**serialNumber**| número de serie de la terminal.| -|**brandName**| nombre de la marca de la terminal.| -|**modelName**| nombre del modelo de la terminal.| -|**paymentModuleVersion**| ersión del módulo de pago del [SmartPOS](/developers/en/docs/mp-point/landing).| -|**integration**| detalles del SDK de las integraciones.| -|**nativeSdkVersion**| versión del SDK de las integraciones.| +|**smartDevice**| Detalles del dispositivo.| +|**integration**| Detalles del SDK de las integraciones.| +|**serialNumber**| Número de serie de la terminal.| +|**brandName**| Nombre de la marca de la terminal.| +|**modelName**| Nombre del modelo de la terminal.| +|**paymentModuleVersion**| Versión del módulo de pago del [SmartPOS](/developers/en/docs/mp-point/landing).| +|**nativeSdkVersion**| Versión del SDK de las integraciones.| ------------ \ No newline at end of file diff --git a/guides/mp-point-main-apps/get-information.pt.md b/guides/mp-point-main-apps/get-information.pt.md index f413dbfcc7..2b6f6518da 100644 --- a/guides/mp-point-main-apps/get-information.pt.md +++ b/guides/mp-point-main-apps/get-information.pt.md @@ -44,9 +44,9 @@ smartInformationTools.getInformation(callback); |Campo|Descrição| |---|---| |**smartDevice**| Detalhes do dispositivo.| +|**integration**| Detalhes do SDK de integrações.| |**serialNumber**| Número de série da maquininha.| |**brandName**| Nome da marca da maquininha.| |**modelName**| Nome do modelo da maquininha.| |**paymentModuleVersion**| Versão do módulo de pagamento do [SmartPOS](/developers/pt/docs/mp-point/landing).| -|**integration**| Detalhes do SDK de integrações.| |**nativeSdkVersion**| Versão do SDK de integrações.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/get-list-installments.es.md b/guides/mp-point-main-apps/get-list-installments.es.md index c4a7204b92..7c91e51c33 100644 --- a/guides/mp-point-main-apps/get-list-installments.es.md +++ b/guides/mp-point-main-apps/get-list-installments.es.md @@ -56,9 +56,9 @@ paymentInstallmentTools.getInstallmentsAmount(callback, amount); |Campo|Descripción| |---|---| -|**callback ((MPResponse>) -> Unit)**|Función de respuesta con el resultado de la solicitud de la lista de cuotas.| +|**callback ((MPResponse<List<InstallmentAmount>>) -> Unit)**|Función de respuesta con el resultado de la solicitud de la lista de cuotas.| |**amount (String)**|Monto con el cual se determina la lista de cuotas.| -|**installment (Int)|**Número de cuotas.| +|**installment (Int)**|Número de cuotas.| |**amount (Double)**|Monto de cada cuota.| |**financialAmount (Double)**|Porcentaje de interés de cada cuota.| diff --git a/guides/mp-point-main-apps/manage-connections.en.md b/guides/mp-point-main-apps/manage-connections.en.md index f8b762ea55..b1b7b6b9be 100644 --- a/guides/mp-point-main-apps/manage-connections.en.md +++ b/guides/mp-point-main-apps/manage-connections.en.md @@ -87,7 +87,7 @@ bluetoothDiscoverDevices.getPairedPrinterDevices(callback); |**id (String)**| Unique identifier of the bluetooth device.| |**boundState (Int)**| Pairing status of the device. It can have different values representing different status.| |**name (String)**| Name of the device provided by the operational system.| -|**address (String)**| MAC address of the bluetooth device.|` +|**address (String)**| MAC address of the bluetooth device.| |**isConnected (Boolean)**| Indicates if the device is connected. In a positive case, the answer is `true`; if disconnected, it appears as `false`.| ## Start search @@ -158,5 +158,5 @@ bluetoothDiscoverDevices.startDiscovery(callback); |**id (String)**| Unique identifier of the bluetooth device.| |**boundState (Int)**| Pairing status of the device. It can have different values representing different status.| |**name (String)**| Name of the device provided by the operational system.| -|**address (String)**| MAC address of the bluetooth device.|` +|**address (String)**| MAC address of the bluetooth device.| |**isConnected (Boolean)**| Indicates if the device is connected. In a positive case, the answer is `true`; if disconnected, it appears as `false`.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/manage-connections.es.md b/guides/mp-point-main-apps/manage-connections.es.md index 540bbcf46d..185db561ae 100644 --- a/guides/mp-point-main-apps/manage-connections.es.md +++ b/guides/mp-point-main-apps/manage-connections.es.md @@ -4,7 +4,7 @@ En nuestro SDK, puedes buscar impresoras y otros dispositivos bluetooth, además ## Obtener dispositivos emparejados -La obtención de la lista de dispositivos emparejados con el [Point Smart](/developers/es/docs/mp-point/landing) se hace usando la función `getPairedDevices`, de la clase `luetoothDiscoverDevices`. Consulta a continuación cómo acceder a ella a través del objeto `MPManager`. +La obtención de la lista de dispositivos emparejados con el [Point Smart](/developers/es/docs/mp-point/landing) se hace usando la función `getPairedDevices`, de la clase `BluetoothDiscoverDevices`. Consulta a continuación cómo acceder a ella a través del objeto `MPManager`. [[[ ```kotlin @@ -87,7 +87,7 @@ bluetoothDiscoverDevices.getPairedPrinterDevices(callback); |**id (String)**| Identificador único del dispositivo bluetooth.| |**boundState (Int)**| Estado de emparejamiento del dispositivo. Puede tener diferentes valores representando estados distintos.| |**name (String)**| Nombre del dispositivo ofrecido por el sistema operacional.| -|**address (String)**| Dirección MAC del dispositivo bluetooth.|` +|**address (String)**| Dirección MAC del dispositivo bluetooth.| |**isConnected (Boolean)**| Indica si el dispositivo está conectado. En caso de ser positivo, la respuesta es `true`. Si está desconectado, aparece como `false`.| ## Iniciar búsqueda @@ -158,5 +158,5 @@ bluetoothDiscoverDevices.startDiscovery(callback); |**id (String)**| Identificador único del dispositivo bluetooth.| |**boundState (Int)**| Estado de emparejamiento del dispositivo. Puede tener diferentes valores representando estados distintos.| |**name (String)**| Nombre del dispositivo ofrecido por el sistema operacional.| -|**address (String)**| Dirección MAC del dispositivo bluetooth.|` +|**address (String)**| Dirección MAC del dispositivo bluetooth.| |**isConnected (Boolean)**| Indica si el dispositivo está conectado. En caso de ser positivo, la respuesta es `true`. Si está desconectado, aparece como `false`.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/manage-status.en.md b/guides/mp-point-main-apps/manage-status.en.md index ad6f9feb73..d74ee0fd76 100644 --- a/guides/mp-point-main-apps/manage-status.en.md +++ b/guides/mp-point-main-apps/manage-status.en.md @@ -4,7 +4,7 @@ Check how to activate, deactivate and validate the current status of the bluetoo ## Activate bluetooth -To activate the bluetooth on the [Smart POS](/developers/en/docs/mp-point/landing) machine, use the turnOn feature of the `BluetoothIgnitor` class on our SDK. You can access that feature through the MPManager object, as in the example below. +To activate the bluetooth on the [Smart POS](/developers/en/docs/mp-point/landing) machine, use the `turnOn` feature of the `BluetoothIgnitor` class on our SDK. You can access that feature through the `MPManager` object, as in the example below. [[[ ```kotlin diff --git a/guides/mp-point-main-apps/manage-status.es.md b/guides/mp-point-main-apps/manage-status.es.md index 2e44626711..ed4afddd14 100644 --- a/guides/mp-point-main-apps/manage-status.es.md +++ b/guides/mp-point-main-apps/manage-status.es.md @@ -4,7 +4,7 @@ Consulta cómo activar, desactivar y validar el estado actual del bluetooth usan ## Activar el bluetooth -Para activar el bluetooth en el lector [Smart](/developers/es/docs/mp-point/landing), usa la función turnOn de la clase `BluetoothIgnitor` en nuestro SDK. Puedes acceder a esta función a través del objeto MPManager, como en el ejemplo a continuación. +Para activar el bluetooth en el lector [Smart](/developers/es/docs/mp-point/landing), usa la función `turnOn` de la clase `BluetoothIgnitor` en nuestro SDK. Puedes acceder a esta función a través del objeto `MPManager`, como en el ejemplo a continuación. [[[ ```kotlin diff --git a/guides/mp-point-main-apps/pair-unpair.en.md b/guides/mp-point-main-apps/pair-unpair.en.md index 98170f9dce..ecc1793b54 100644 --- a/guides/mp-point-main-apps/pair-unpair.en.md +++ b/guides/mp-point-main-apps/pair-unpair.en.md @@ -4,7 +4,7 @@ In this section, you’ll learn how to pair and unpair devices with a [Point Sma ## Pair a device -Use the `pairDevice` feature from the `BluetoothDevicesPairing` class to pair a device with Point Smart by sending only the (`(address)`). The access is through the  `MPManager` object, as shown below. +Use the `pairDevice` feature from the `BluetoothDevicesPairing` class to pair a device with Point Smart by sending only the `(address)`. The access is through the  `MPManager` object, as shown below. [[[ ```kotlin @@ -83,7 +83,7 @@ bluetoothPairing.unPairDevice(address, callback); |Field|Description| |---|---| |**address (String)**| Location of the selected device, obtained through `[BluetoothDeviceModel]`.| -|**callback ((MPResponse>) -> Unit)**| Request response feature that provides the result of the pairing process. The [MPResponse] includes the status, the error (if any), and the details in case of success, which contain a `(Pair)` that comprises `[BluetoothBondState]` and [BluetoothDeviceModel].| +|**callback ((MPResponse<Pair<BluetoothBondState, BluetoothDeviceModel>>) -> Unit)**| Request response feature that provides the result of the pairing process. The [MPResponse] includes the status, the error (if any), and the details in case of success, which contain a `(Pair)` that comprises `[BluetoothBondState]` and [BluetoothDeviceModel].| |**NONE (BOND_NONE)**| Indicates that the device isn’t paired.| |**BONDING (BOND_BONDING)**| Indicates that the device is in pairing process. | |**BONDED (BOND_BONDED)**| Indicates that the device is paired.| diff --git a/guides/mp-point-main-apps/pair-unpair.es.md b/guides/mp-point-main-apps/pair-unpair.es.md index 32ec2df788..da1ad0920e 100644 --- a/guides/mp-point-main-apps/pair-unpair.es.md +++ b/guides/mp-point-main-apps/pair-unpair.es.md @@ -4,7 +4,7 @@ En esta sección, comprenderás cómo emparejar y desemparejar dispositivos con ## Emparejar un dispositivo -Usa la función `pairDevice` de la clase `BluetoothDevicesPairing` para emparejar un dispositivo con el [Point Smart](/developers/es/docs/mp-point/landing) enviando solo la dirección (`(address)`). El acceso se hace a través del objeto `MPManager`, como se muestra a continuación. +Usa la función `pairDevice` de la clase `BluetoothDevicesPairing` para emparejar un dispositivo con el [Point Smart](/developers/es/docs/mp-point/landing) enviando solo la dirección `(address)`. El acceso se hace a través del objeto `MPManager`, como se muestra a continuación. [[[ ```kotlin @@ -42,7 +42,7 @@ bluetoothPairing.pairDevice(address, callback); ## Desemparejar un dispositivo -Para desemparejar un dispositivo, usa la función `unPairDevice` de la clase `BluetoothDevicesPairing` accediendo a través del objeto `MPManager`. Esta función usa como parámetro la dirección (`(address)`) del dispositivo seleccionado, como se muestra a continuación. +Para desemparejar un dispositivo, usa la función `unPairDevice` de la clase `BluetoothDevicesPairing` accediendo a través del objeto `MPManager`. Esta función usa como parámetro la dirección `(address)` del dispositivo seleccionado, como se muestra a continuación. [[[ ```kotlin @@ -83,7 +83,7 @@ bluetoothPairing.unPairDevice(address, callback); |Campo|Descripción| |---|---| |**address (String)**| Ubicación del dispositivo seleccionado, obtenida a través de `[BluetoothDeviceModel]`.| -|**callback ((MPResponse>) -> Unit)**| Función de devolución del llamado que ofrece el resultado del proceso de emparejamiento. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito, que tiene un `(Pair)` compuesto por `[BluetoothBondState]` y `[BluetoothDeviceModel]`.| +|**callback ((MPResponse<Pair<BluetoothBondState, BluetoothDeviceModel>>) -> Unit)**| Función de devolución del llamado que ofrece el resultado del proceso de emparejamiento. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito, que tiene un `(Pair)` compuesto por `[BluetoothBondState]` y `[BluetoothDeviceModel]`.| |**NONE (BOND_NONE)**| Indica que el dispositivo no está emparejado.| |**BONDING (BOND_BONDING)**| Indica que el dispositivo está en proceso de emparejamiento.| |**BONDED (BOND_BONDED)**| Indica que o dispositivo está emparejado.| diff --git a/guides/mp-point-main-apps/pair-unpair.pt.md b/guides/mp-point-main-apps/pair-unpair.pt.md index bb1b40168e..d60dfd4ad2 100644 --- a/guides/mp-point-main-apps/pair-unpair.pt.md +++ b/guides/mp-point-main-apps/pair-unpair.pt.md @@ -4,7 +4,7 @@ Nesta seção, você entenderá como emparelhar e desemparelhar dispositivos com ## Emparelhar um dispositivo -Use a função `pairDevice` da classe `BluetoothDevicesPairing` para emparelhar um dispositivo com a [Point Smart](/developers/pt/docs/mp-point/landing) enviando apenas o endereço (`address`). O acesso é feito por meio do objeto `MPManager`, como mostrado abaixo. +Use a função `pairDevice` da classe `BluetoothDevicesPairing` para emparelhar um dispositivo com a [Point Smart](/developers/pt/docs/mp-point/landing) enviando apenas o endereço `(address)`. O acesso é feito por meio do objeto `MPManager`, como mostrado abaixo. [[[ ```kotlin @@ -42,7 +42,7 @@ bluetoothPairing.pairDevice(address, callback); ## Desemparelhar um dispositivo -Para desemparelhar um dispositivo, use a função `unPairDevice` da classe `BluetoothDevicesPairing` acessando pelo objeto `MPManager`. Essa função usa como parâmetro o endereço (`address`) do aparelho selecionado, como mostrado a seguir. +Para desemparelhar um dispositivo, use a função `unPairDevice` da classe `BluetoothDevicesPairing` acessando pelo objeto `MPManager`. Essa função usa como parâmetro o endereço `(address)` do aparelho selecionado, como mostrado a seguir. [[[ ```kotlin @@ -83,7 +83,7 @@ bluetoothPairing.unPairDevice(address, callback); |Campo|Descrição| |---|---| |**address (String)**| Localização do dispositivo selecionado, obtida por `[BluetoothDeviceModel]`.| -|**callback ((MPResponse>) -> Unit)**| Função de devolução da chamada que proporciona o resultado do processo de emparelhamento. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados no caso de sucesso, que contêm um `(Pair)` composto por `[BluetoothBondState]` e `[BluetoothDeviceModel]`.| +|**callback ((MPResponse<Pair<BluetoothBondState, BluetoothDeviceModel>>) -> Unit)**| Função de devolução da chamada que proporciona o resultado do processo de emparelhamento. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados no caso de sucesso, que contêm um `(Pair)` composto por `[BluetoothBondState]` e `[BluetoothDeviceModel]`.| |**NONE (BOND_NONE)**| Indica que o dispositivo não está emparelhado.| |**BONDING (BOND_BONDING)**| Indica que o dispositivo está em processo de emparelhamento | |**BONDED (BOND_BONDED)**| Indica que o dispositivo está emparelhado.| diff --git a/guides/mp-point-main-apps/print-images.en.md b/guides/mp-point-main-apps/print-images.en.md index 89ce742ea7..f8d464c52e 100644 --- a/guides/mp-point-main-apps/print-images.en.md +++ b/guides/mp-point-main-apps/print-images.en.md @@ -35,4 +35,4 @@ bitmapPrinter.print(imageToPrint, callback); |Field|Description| |---|---| |**dataToPrint (Bitmap)**| The bitmap image that will be printed.| -|**PaymentResponse**| Request response feature that provides the result of the printing operation. The `[MPResponse]` includes the status, the error (if any), and the details in case of success, which contain a String representing the ID or status of the printing.| \ No newline at end of file +|**callback ((MPResponse<String>) -> Unit)**| Request response feature that provides the result of the printing operation. The `[MPResponse]` includes the status, the error (if any), and the details in case of success, which contain a String representing the ID or status of the printing.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/print-images.es.md b/guides/mp-point-main-apps/print-images.es.md index 5118f252fa..80d6619145 100644 --- a/guides/mp-point-main-apps/print-images.es.md +++ b/guides/mp-point-main-apps/print-images.es.md @@ -1,6 +1,6 @@ # Imprimir imágenes -To print bitmap images with the [Point Smart](/developers/es/docs/mp-point/landing) printer, use the print feature of the `BitmapPrinter` class. The access is through the `MPManager` object, as in the example below: +Para imprimir imagens en bitmap con la impresora de [Point Smart](/developers/es/docs/mp-point/landing), usa la **función print** de la clase `BitmapPrinter`. El acceso se da a través del objeto `MPManager`, como en el ejemplo a continuación: [[[ ```kotlin @@ -35,4 +35,4 @@ bitmapPrinter.print(imageToPrint, callback); |Campo|Descripción| |---|---| |**dataToPrint (Bitmap)**| La imagen bitmap que se imprimirá.| -|**PaymentResponse**| Función de devolución del llamado que ofrece la operación de impresión. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito, que tiene un **String** representando el ID o estado de la impresión.| \ No newline at end of file +|**callback ((MPResponse<String>) -> Unit)**| Función de devolución del llamado que ofrece la operación de impresión. El `[MPResponse]` encapsula el estado, el error (si lo hay) y los datos en caso de éxito, que tiene un **String** representando el ID o estado de la impresión.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/print-images.pt.md b/guides/mp-point-main-apps/print-images.pt.md index 723eeac2f3..bde257a758 100644 --- a/guides/mp-point-main-apps/print-images.pt.md +++ b/guides/mp-point-main-apps/print-images.pt.md @@ -35,4 +35,4 @@ bitmapPrinter.print(imageToPrint, callback); |Campo|Descrição| |---|---| |**dataToPrint (Bitmap)**| A imagem bitmap que será impressa.| -|**PaymentResponse**| Função de devolução da chamada que proporciona o resultado da operação de impressão. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados em caso de sucesso, que contêm um String representando o ID ou estado da impressão.| \ No newline at end of file +|**callback ((MPResponse<String>) -> Unit)**| Função de devolução da chamada que proporciona o resultado da operação de impressão. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados em caso de sucesso, que contêm um String representando o ID ou estado da impressão.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/scan-qr-code.en.md b/guides/mp-point-main-apps/scan-qr-code.en.md index 3981e316af..e7332914f0 100644 --- a/guides/mp-point-main-apps/scan-qr-code.en.md +++ b/guides/mp-point-main-apps/scan-qr-code.en.md @@ -66,5 +66,5 @@ protected void onActivityResult(final int requestCode, final int resultCode, |**resultCode (Int)**| Value of the `resultCode` in `onActivityResult`.| |**resultData (Intent)**| Date result in `onActivityResult`.| |**MPResponse<CameraScannerResponse>**| Object [MPResponse] that includes the status, the error (if any), and the details in case of success, which contain an `CameraScannerResponse` object.| -|**status (CameraScannerStatus)**| Defines the status of the response. It can be **Ok** (it read it successfully), **Error** (something went wrong and it was cancelled) or **Unknown** (something went wrong).| -|**message (String)**| Defines the response message received by the scanner. If it’s ”Ok”, it will have the result of the reading of the code| +|**status (CameraScannerStatus)**| Defines the status of the response. It can be "Ok" (it read it successfully), **Error** (something went wrong and it was cancelled) or **Unknown** (something went wrong).| +|**message (String)**| Defines the response message received by the scanner. If it’s ”Ok”, it will have the result of the reading of the code.| diff --git a/guides/mp-point-main-apps/scan-qr-code.es.md b/guides/mp-point-main-apps/scan-qr-code.es.md index 014d6b7db4..46047e5f39 100644 --- a/guides/mp-point-main-apps/scan-qr-code.es.md +++ b/guides/mp-point-main-apps/scan-qr-code.es.md @@ -63,8 +63,8 @@ protected void onActivityResult(final int requestCode, final int resultCode, |Campo|Descripción| |---|---| -|**resultCode (Int)**| Valor del `resultCode` en `onActivityResult`| +|**resultCode (Int)**| Valor del `resultCode` en `onActivityResult`.| |**resultData (Intent)**| Valor de la fecha en `onActivityResult`.| |**MPResponse<CameraScannerResponse>**| Objeto `[MPResponse]` que encapsula el estado, el error (si lo hay) y los datos en caso de éxito, que tiene un objeto `CameraScannerResponse`.| -|**status (CameraScannerStatus)**| Define el estado de la respuesta. Puede ser **Ok** (la lectura fue exitosa), **Error** (hubo un error o la lectura se canceló) o **Unknown** (hubo algún error indeterminado).| +|**status (CameraScannerStatus)**| Define el estado de la respuesta. Puede ser "Ok" (la lectura fue exitosa), **Error** (hubo un error o la lectura se canceló) o **Unknown** (hubo algún error indeterminado).| |**message (String)**| Define el mensaje de la respuesta recibida por escaner. Si es ”Ok”, tendrá el resultado de la lectura del código.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/scan-qr-code.pt.md b/guides/mp-point-main-apps/scan-qr-code.pt.md index 01d6fe02d7..8f0322bc35 100644 --- a/guides/mp-point-main-apps/scan-qr-code.pt.md +++ b/guides/mp-point-main-apps/scan-qr-code.pt.md @@ -66,5 +66,5 @@ protected void onActivityResult(final int requestCode, final int resultCode, |**resultCode (Int)**| Valor do `resultCode` em `onActivityResult`.| |**resultData (Intent)**|Valor de data em `onActivityResult`.| |**MPResponse<CameraScannerResponse>**| Objeto `[MPResponse]` que encapsula o estado, o erro (se houver) e os dados em caso de sucesso, que contêm um objeto `CameraScannerResponse`.| -|**status (CameraScannerStatus)**| Define o estado da resposta. Pode ser **Ok** (a leitura foi exitosa), **Error** (houve um erro ou a leitura foi cancelada) ou **Unknown** (ocorreu um erro indeterminado).| -|**message (String)**| Define a mensagem da resposta recebida pelo escâner. Se é ”Ok”, conterá o resultado da leitura do código.| \ No newline at end of file +|**status (CameraScannerStatus)**| Define o estado da resposta. Pode ser "Ok" (a leitura foi exitosa), **Error** (houve um erro ou a leitura foi cancelada) ou **Unknown** (ocorreu um erro indeterminado).| +|**message (String)**| Define a mensagem da resposta recebida pelo escâner. Se for "Ok", conterá o resultado da leitura do código.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/start-payment-flow.es.md b/guides/mp-point-main-apps/start-payment-flow.es.md index 56ba75b898..1ad1a49d32 100644 --- a/guides/mp-point-main-apps/start-payment-flow.es.md +++ b/guides/mp-point-main-apps/start-payment-flow.es.md @@ -101,7 +101,7 @@ paymentFlow.launchPaymentFlowActivity(paymentFlowData, context, callback); ## Construir una URI para apertura del flujo de pago -La función `buildCallbackUri` está diseñada para construir una URI válida que permita abrir una actividad específica, con base en la estrategia del _deeplink_. Para acceder a ella, usa la función PaymentFlow a través del objeto `MPManager`. +La función `buildCallbackUri` está diseñada para construir una URI válida que permita abrir una actividad específica, con base en la estrategia del _deeplink_. Para acceder a ella, usa la función `PaymentFlow` a través del objeto `MPManager`. > WARNING > diff --git a/guides/mp-point-main-apps/start-payment-flow.pt.md b/guides/mp-point-main-apps/start-payment-flow.pt.md index 15d16b4420..ea210d126f 100644 --- a/guides/mp-point-main-apps/start-payment-flow.pt.md +++ b/guides/mp-point-main-apps/start-payment-flow.pt.md @@ -97,7 +97,7 @@ paymentFlow.launchPaymentFlowActivity(paymentFlowData, context, callback); |**launchPaymentFlowActivity**| Esse método inicia o fluxo de pagamento usando o aplicativo SmartPOS.| |**paymentFlowData (PaymentFlowData)**| Modelo de dados necessário para a abertura do fluxo.| |**context (Context)**| Contexto de onde será iniciado o fluxo.| -|**allback (MPResponse<String> -> Unit)**| Proporciona o resultado da abertura do fluxo de pagamento.| +|**Callback (MPResponse<String> -> Unit)**| Proporciona o resultado da abertura do fluxo de pagamento.| ## Construir uma URI para abertura do fluxo de pagamento From f555b975bdffc14779c1cc028de5c5eca4a20bf6 Mon Sep 17 00:00:00 2001 From: Heitor Galdino Date: Fri, 4 Oct 2024 01:10:46 -0300 Subject: [PATCH 27/34] final1 --- .../mp-point-main-apps/get-list-installments.en.md | 4 +++- .../mp-point-main-apps/get-list-installments.es.md | 14 ++++++++++---- .../mp-point-main-apps/get-list-installments.pt.md | 4 +++- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/guides/mp-point-main-apps/get-list-installments.en.md b/guides/mp-point-main-apps/get-list-installments.en.md index 10f5b86f1d..146a195c1b 100644 --- a/guides/mp-point-main-apps/get-list-installments.en.md +++ b/guides/mp-point-main-apps/get-list-installments.en.md @@ -2,6 +2,8 @@ To get the list of installments linked to a specific amount, use the feature `getInstallmentsAmount`. Its accessible in the `PaymentInstallmentTools` instance, through the `MPManager` object. +The function `getInstallmentsAmount` simplifies the process of obtaining detailed information about the installments associated with a specific amount. + > WARNING > > Attention @@ -47,7 +49,7 @@ paymentInstallmentTools.getInstallmentsAmount(callback, amount); |Field|Description| |---|---| -|**callback ((MPResponse<List<InstallmentAmount>>) -> Unit)**|Response feature with the result of the request of the list of installments.| +|**callback ((MPResponse<List<InstallmentAmount>>) -> Unit)**|Response feature with the result of the request of the list of installments. Make sure to properly handle both the success case and the error case when requesting the list.| |**amount (String)**|Amount with which the list of installments is determined.| |**installment (Int)**|Number of installments.| |**amount (Double)**|Amount of each installment.| diff --git a/guides/mp-point-main-apps/get-list-installments.es.md b/guides/mp-point-main-apps/get-list-installments.es.md index 7c91e51c33..3fa3716d9e 100644 --- a/guides/mp-point-main-apps/get-list-installments.es.md +++ b/guides/mp-point-main-apps/get-list-installments.es.md @@ -2,14 +2,20 @@ ----[mla, mlb]---- # Obtener lista de cuotas +Para obtener la lista de cuotas asociadas a un monto específico, usa la función `getInstallmentsAmount`. Puedes acceder a ella a través de la `PaymentInstallmentTools`, a través del objeto `MPManager`. + +La función `getInstallmentsAmount` simplifica el proceso de obtención de información detallada sobre las cuotas asociadas a un monto específico. + ------------ ----[mlm]---- # Obtener lista de mensualidades ------------- - Para obtener la lista de cuotas asociadas a un monto específico, usa la función `getInstallmentsAmount`. Puedes acceder a ella a través de la `PaymentInstallmentTools`, a través del objeto `MPManager`. +La función `getInstallmentsAmount` simplifica el proceso de obtención de información detallada sobre las mensualidades asociadas a un monto específico. + +------------ + > WARNING > > Attention @@ -56,7 +62,7 @@ paymentInstallmentTools.getInstallmentsAmount(callback, amount); |Campo|Descripción| |---|---| -|**callback ((MPResponse<List<InstallmentAmount>>) -> Unit)**|Función de respuesta con el resultado de la solicitud de la lista de cuotas.| +|**callback ((MPResponse<List<InstallmentAmount>>) -> Unit)**|Función de respuesta con el resultado de la solicitud de la lista de cuotas. Asegúrate de manejar adecuadamente tanto el caso de éxito como el caso de error en la solicitud de la lista. | |**amount (String)**|Monto con el cual se determina la lista de cuotas.| |**installment (Int)**|Número de cuotas.| |**amount (Double)**|Monto de cada cuota.| @@ -96,7 +102,7 @@ paymentInstallmentTools.getInstallmentsAmount(callback, amount); |Campo|Descripción| |---|---| -|**callback ((MPResponse<List<InstallmentAmount>>) -> Unit)**|Función de respuesta con el resultado de la solicitud de la lista de mensualidades.| +|**callback ((MPResponse<List<InstallmentAmount>>) -> Unit)**|Función de respuesta con el resultado de la solicitud de la lista de mensualidades. Asegúrate de manejar adecuadamente tanto el caso de éxito como el caso de error en la solicitud de la lista.| |**amount (String)**|Monto con el cual se determina la lista de mensualidades.| |**installment (Int)**|Número de mensualidades.| |**amount (Double)**|Monto de cada mensualidade.| diff --git a/guides/mp-point-main-apps/get-list-installments.pt.md b/guides/mp-point-main-apps/get-list-installments.pt.md index 932c89bb31..00502df18c 100644 --- a/guides/mp-point-main-apps/get-list-installments.pt.md +++ b/guides/mp-point-main-apps/get-list-installments.pt.md @@ -2,6 +2,8 @@ Para obter a lista de parcelas associadas a um valor específico, utilize a função `getInstallmentsAmount`. Ela está acessível pela instância `PaymentInstallmentTools`, por meio do objeto `MPManager`. +A função `getInstallmentsAmount` simplifica o processo de obtenção de informações detalhadas sobre as parcelas associadas a um valor específico. + > WARNING > > Atenção @@ -47,7 +49,7 @@ paymentInstallmentTools.getInstallmentsAmount(callback, amount); |Campo|Descrição| |---|---| -|**callback ((MPResponse<List<InstallmentAmount>>) -> Unit)**|Função de resposta com o resultado da solicitação da lista de parcelas.| +|**callback ((MPResponse<List<InstallmentAmount>>) -> Unit)**|Função de resposta com o resultado da solicitação da lista de parcelas. Assegure-se de lidar adequadamente tanto com o caso de sucesso quanto com o caso de erro na solicitação da lista.| |**amount (String)**|Valor com o qual se determina a lista de parcelas.| |**installment (Int)**|Número de parcelas.| |**amount (Double)**|Valor de cada parcela.| From f53c9a77d0951b8646c244532b9dca80ae67c325 Mon Sep 17 00:00:00 2001 From: Heitor Galdino Date: Fri, 4 Oct 2024 03:45:43 -0300 Subject: [PATCH 28/34] final2 --- guides/mp-point-main-apps/scan-codes.en.md | 106 +++++++++++++++++++ guides/mp-point-main-apps/scan-codes.es.md | 106 +++++++++++++++++++ guides/mp-point-main-apps/scan-codes.pt.md | 106 +++++++++++++++++++ guides/mp-point-main-apps/scan-qr-code.en.md | 70 ------------ guides/mp-point-main-apps/scan-qr-code.es.md | 70 ------------ guides/mp-point-main-apps/scan-qr-code.pt.md | 70 ------------ 6 files changed, 318 insertions(+), 210 deletions(-) create mode 100644 guides/mp-point-main-apps/scan-codes.en.md create mode 100644 guides/mp-point-main-apps/scan-codes.es.md create mode 100644 guides/mp-point-main-apps/scan-codes.pt.md delete mode 100644 guides/mp-point-main-apps/scan-qr-code.en.md delete mode 100644 guides/mp-point-main-apps/scan-qr-code.es.md delete mode 100644 guides/mp-point-main-apps/scan-qr-code.pt.md diff --git a/guides/mp-point-main-apps/scan-codes.en.md b/guides/mp-point-main-apps/scan-codes.en.md new file mode 100644 index 0000000000..dd1bcd84d9 --- /dev/null +++ b/guides/mp-point-main-apps/scan-codes.en.md @@ -0,0 +1,106 @@ +# Scan barcodes and QR codes + +Below you will find information on how to start and manage the [Point Smart](/developers/pt/docs/mp-point/landing) scanner for reading **barcodes and QR codes**. + +## Barcode + +To begin reading QR codes of the [Point Smart](/developers/en/docs/mp-point/landing), use the `initBarcodeScanner` feature of the `CameraScanner` class. + +This process uses a camera request through `startActivityForResult`, and the method `onActivityResult` must be implemented in the activity to handle the reading response. + +Check the example below: + +[[[ +```kotlin +val cameraScanner = MPManager.cameraScanner +cameraScanner.initBarcodeScanner(this@YourActivity) +``` +```java +final CameraScanner cameraScanner = MPManager.INSTANCE.getCameraScanner(); +cameraScanner.initBarcodeScanner(this); +``` +]]] + +## QR code + +To begin reading QR codes of the [Point Smart](/developers/en/docs/mp-point/landing), use the `initQRCodeScanner` feature of the `CameraScanner` class. + +This process uses a camera request through `startActivityForResult`, and the method `onActivityResult` must be implemented in the activity to handle the reading response. + +Check the example below: + +[[[ +```kotlin +val cameraScanner = MPManager.cameraScanner +cameraScanner.initQRCodeScanner(this@YourActivity) +``` +```java +final CameraScanner cameraScanner = MPManager.INSTANCE.getCameraScanner(); +cameraScanner.initQRCodeScanner(this); +``` +]]] + +## Process scanner response + +To manage the response of a **QR code** or **barcode** scanning activity, use the `handleQrResponse` feature of the `CameraScanner` class from the `onActivityResult` method. + +This function processes the scanner result from the camera, validating the response and invoking the appropriate callback based on the result. It receives an `MPResponse` object with a `[CameraScannerResponse]`, representing the reading response. + +This method simplifies the process of handling the responses from the QR code or barcode scanner in the `onActivityResult` method, processing the scanner result from the camera, validating the response, and invoking the appropriate callback based on the result. + +Check how that takes place below. + +[[[ +```kotlin +override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + + val cameraScanner = MPManager.cameraScanner + + cameraScanner.handleScannerResponse(this, resultCode, data) { response -> + response.doIfSuccess { result -> + // Manage successful response + val status = result.status + val message = result.message + // ... Do something with the response + }.doIfError { error -> + // Manage the error in the response + val errorMessage = error.message + // ... Do something with the error + } + } +} +``` +```java +@Override +protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + final CameraScanner cameraScanner = MPManager.INSTANCE.getCameraScanner(); + final Function1, Unit> callback = (final MPResponse response) -> { + + if (response.getStatus() == ResponseStatus.SUCCESS) { + final CameraScannerResponse cameraScannerResponse = response.getData(); + // Manage successful response + final String result = response.getData().getMessage(); + // ... Do something with the response + } else { + // Manage the error in the response + final Exception errorMessage = response.getError(); + // ... Do something with the error + } + return Unit.INSTANCE; + }; + + cameraScanner.handleScannerResponse(this, resultCode, data, callback); +} +``` +]]] + +|Field|Description| +|---|---| +|**resultCode (Int)**| Value of the `resultCode` in `onActivityResult`.| +|**resultData (Intent?)**| Date result in `onActivityResult`.| +|**MPResponse<CameraScannerResponse>**| Object [MPResponse] that includes the status, the error (if any), and the details in case of success, which contain an `CameraScannerResponse` object.| +|**status (CameraScannerStatus)**| Defines the status of the response. It can be "Ok" (it read it successfully), **Error** (something went wrong and it was cancelled) or **Unknown** (something went wrong).| +|**message (String)**| Defines the response message received by the scanner. If it’s ”Ok”, it will have the result of the reading of the code.| diff --git a/guides/mp-point-main-apps/scan-codes.es.md b/guides/mp-point-main-apps/scan-codes.es.md new file mode 100644 index 0000000000..a2fd4c7dc9 --- /dev/null +++ b/guides/mp-point-main-apps/scan-codes.es.md @@ -0,0 +1,106 @@ +# Escanear códigos de barras y QR + +A continuación, encontrará información sobre cómo iniciar y gestionar el escáner de [Point Smart](/developers/pt/docs/mp-point/landing) para la lectura de **códigos de barras y QR**. + +## Código de barras + +Para iniciar la lectura de códigos QR del [Point Smart](/developers/es/docs/mp-point/landing), usa la función `initBarcodeScanner` de la clase `CameraScanner`. + +Este proceso usa un llamado de cámara a través de `startActivityForResult`, de modo que el método `onActivityResult` se debe implementar en la actividad para manipular la respuesta de lectura. + +Consulta el ejemplo a continuación. + +[[[ +```kotlin +val cameraScanner = MPManager.cameraScanner +cameraScanner.initBarcodeScanner(this@YourActivity) +``` +```java +final CameraScanner cameraScanner = MPManager.INSTANCE.getCameraScanner(); +cameraScanner.initBarcodeScanner(this); +``` +]]] + +## Código QR + +Para iniciar la lectura de códigos QR del [Point Smart](/developers/es/docs/mp-point/landing), usa la función `initQRCodeScanner` de la clase `CameraScanner`. + +Este proceso usa un llamado de cámara a través de `startActivityForResult`, de modo que el método `onActivityResult` se debe implementar en la actividad para manipular la respuesta de lectura. + +Consulta el ejemplo a continuación. + +[[[ +```kotlin +val cameraScanner = MPManager.cameraScanner +cameraScanner.initQRCodeScanner(this@YourActivity) +``` +```java +final CameraScanner cameraScanner = MPManager.INSTANCE.getCameraScanner(); +cameraScanner.initQRCodeScanner(this); +``` +]]] + +## Procesar la respuesta del escáner + +Para gestionar la respuesta de una actividad de escaneo de **código QR** o de **código de barras**, usa la función `handleQrResponse` de la clase `CameraScanner` en el método `onActivityResult`. + +Esta función procesa el resultado del escáner desde la cámara, validando la respuesta e invocando el callback apropiado según el resultado. Recibe un objeto `MPResponse` con un `[CameraScannerResponse]`, representando la respuesta de lectura. + +Este método simplifica el proceso de manejo de respuestas del escáner de QR o código de barra en el método `onActivityResult`, procesando el resultado del escáner desde la cámara, validando la respuesta e invocando el _callback_ apropiado según el resultado. + +Consulta cómo continuar. + +[[[ +```kotlin +override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + + val cameraScanner = MPManager.cameraScanner + + cameraScanner.handleScannerResponse(this, resultCode, data) { response -> + response.doIfSuccess { result -> + // Manejar la respuesta exitosa + val status = result.status + val message = result.message + // ... Hacer algo con la respuesta + }.doIfError { error -> + // Manejar el error en la respuesta + val errorMessage = error.message + // ... Hacer algo con el error + } + } +} +``` +```java +@Override +protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + final CameraScanner cameraScanner = MPManager.INSTANCE.getCameraScanner(); + final Function1, Unit> callback = (final MPResponse response) -> { + + if (response.getStatus() == ResponseStatus.SUCCESS) { + final CameraScannerResponse cameraScannerResponse = response.getData(); + // Manejar la respuesta exitosa + final String result = response.getData().getMessage(); + // ... Hacer algo con la respuesta + } else { + // Manejar el error en la respuesta + final Exception errorMessage = response.getError(); + // ... Hacer algo con el error + } + return Unit.INSTANCE; + }; + + cameraScanner.handleScannerResponse(this, resultCode, data, callback); +} +``` +]]] + +|Campo|Descripción| +|---|---| +|**resultCode (Int)**| Valor del `resultCode` en `onActivityResult`.| +|**resultData (Intent?)**| Valor de la fecha en `onActivityResult`.| +|**MPResponse<CameraScannerResponse>**| Objeto `[MPResponse]` que encapsula el estado, el error (si lo hay) y los datos en caso de éxito, que tiene un objeto `CameraScannerResponse`.| +|**status (CameraScannerStatus)**| Define el estado de la respuesta. Puede ser "Ok" (la lectura fue exitosa), **Error** (hubo un error o la lectura se canceló) o **Unknown** (hubo algún error indeterminado).| +|**message (String)**| Define el mensaje de la respuesta recibida por escaner. Si es ”Ok”, tendrá el resultado de la lectura del código.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/scan-codes.pt.md b/guides/mp-point-main-apps/scan-codes.pt.md new file mode 100644 index 0000000000..68b36e0853 --- /dev/null +++ b/guides/mp-point-main-apps/scan-codes.pt.md @@ -0,0 +1,106 @@ +# Escanear códigos de barra e QR + +Abaixo você encontrará informações de como iniciar e gerenciar o escâner da [Point Smart](/developers/pt/docs/mp-point/landing) para a leitura de **códigos de barra e QR**. + +## Código de barras + +Para iniciar a leitura de códigos de barras da [Point Smart](/developers/pt/docs/mp-point/landing), use a função `initBarcodeScanner` da classe `CameraScanner`. + +Esse processo utiliza uma chamada de câmera mediante `startActivityForResult`, de modo que o método `onActivityResult` deve ser implementado na atividade para manipular a resposta de leitura. + +Confira o exemplo a seguir. + +[[[ +```kotlin +val cameraScanner = MPManager.cameraScanner +cameraScanner.initBarcodeScanner(this@YourActivity) +``` +```java +final CameraScanner cameraScanner = MPManager.INSTANCE.getCameraScanner(); +cameraScanner.initBarcodeScanner(this); +``` +]]] + +## Código QR + +Para iniciar a leitura de códigos QR da [Point Smart](/developers/pt/docs/mp-point/landing), use a função `initQRCodeScanner` da classe `CameraScanner`. + +Esse processo utiliza uma chamada de câmera mediante `startActivityForResult`, de modo que o método `onActivityResult` deve ser implementado na atividade para manipular a resposta de leitura. + +Confira o exemplo a seguir. + +[[[ +```kotlin +val cameraScanner = MPManager.cameraScanner +cameraScanner.initQRCodeScanner(this@YourActivity) +``` +```java +final CameraScanner cameraScanner = MPManager.INSTANCE.getCameraScanner(); +cameraScanner.initQRCodeScanner(this); +``` +]]] + +## Processar resposta de escâner + +Para gerenciar a resposta de uma atividade de escâner de **código QR** ou de **código de barras**, use a função `handleScannerResponse` da classe `CameraScanner` no método `onActivityResult`. + +Esta função processa o resultado do escâner da câmera, validando a resposta e invocando o _callback_ apropriado de acordo com o resultado. Recebe um objeto `MPResponse` com um `[CameraScannerResponse]`, representando a resposta da leitura. + +Este método simplifica o processo de gerenciamento das respostas do escâner de QR ou código de barras no método `onActivityResult`, processando o resultado do escâner da câmera, validando a resposta e invocando o _callback_ apropriado de acordo com o resultado. + +Confira como isso ocorre a seguir. + +[[[ +```kotlin +override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + + val cameraScanner = MPManager.cameraScanner + + cameraScanner.handleScannerResponse(this, resultCode, data) { response -> + response.doIfSuccess { result -> + // Gerenciar resposta bem-sucedida + val status = result.status + val message = result.message + // ... Fazer algo com a resposta + }.doIfError { error -> + // Gerenciar o erro na resposta + val errorMessage = error.message + // ... Fazer algo com o erro + } + } +} +``` +```java +@Override +protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + final CameraScanner cameraScanner = MPManager.INSTANCE.getCameraScanner(); + final Function1, Unit> callback = (final MPResponse response) -> { + + if (response.getStatus() == ResponseStatus.SUCCESS) { + final CameraScannerResponse cameraScannerResponse = response.getData(); + // Gerenciar resposta bem-sucedida + final String result = response.getData().getMessage(); + // ... Fazer algo com a resposta + } else { + // Gerenciar o erro na resposta + final Exception errorMessage = response.getError(); + // ... Fazer algo com o erro + } + return Unit.INSTANCE; + }; + + cameraScanner.handleScannerResponse(this, resultCode, data, callback); +} +``` +]]] + +|Campo|Descrição| +|---|---| +|**resultCode (Int)**| Valor do `resultCode` em `onActivityResult`.| +|**resultData (Intent?)**|Valor de `data` em `onActivityResult`.| +|**MPResponse<CameraScannerResponse>**| Objeto `[MPResponse]` que encapsula o estado, o erro (se houver) e os dados em caso de sucesso, que contêm um objeto `CameraScannerResponse`. El callback a ser invocado con el resultado de la operación del escáner. | +|**status (CameraScannerStatus)**| Define o estado da resposta. Pode ser "Ok" (a leitura foi exitosa), **Error** (houve um erro ou a leitura foi cancelada) ou **Unknown** (ocorreu um erro indeterminado).| +|**message (String)**| Define a mensagem da resposta recebida pelo escâner. Se for "Ok", conterá o resultado da leitura do código.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/scan-qr-code.en.md b/guides/mp-point-main-apps/scan-qr-code.en.md deleted file mode 100644 index e7332914f0..0000000000 --- a/guides/mp-point-main-apps/scan-qr-code.en.md +++ /dev/null @@ -1,70 +0,0 @@ -# Scan QR code - -To begin reading QR codes of the [Point Smart](/developers/en/docs/mp-point/landing), use the `initQRCodeScanner` feature of the `CameraScanner` class. This process uses a camera request through `startActivityForResult`, and the method `onActivityResult` must be implemented in the activity to handle the reading response. - -Check the example below: - -[[[ -```kotlin -val cameraScanner = MPManager.cameraScanner -cameraScanner.initQRCodeScanner(this@YourActivity) -``` -```java -final CameraScanner cameraScanner = MPManager.INSTANCE.getCameraScanner(); -cameraScanner.initQRCodeScanner(this); -``` -]]] - -## Manage response - -To manage the response of the QR code scanner, use the `handleQrResponse` feature of the `CameraScanner` class from the `onActivityResult` method. That feature brings the `[MPResponse]` object which includes the status, the error (if any), and the details in case of success, which contain a `CameraScannerResponse` object representing the response of the reading. - -Check how that takes place below: - -[[[ -```kotlin -override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { -   super.onActivityResult(requestCode, resultCode, data) - -   val cameraScanner = MPManager.cameraScanner -   val response = cameraScanner.handleQrResponse(resultCode, data) - -   response.doIfSuccess { result -> -       // Manage successful response -       val status = result.status -       val message = result.message -       // ... Do something with the response -   }.doIfError { error -> -       // Manage error in the response -       val errorMessage = error.message -       // ... Do something with the error -   } -} -``` -```java -@Override -protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { - super.onActivityResult(requestCode, resultCode, data); - - final CameraScanner cameraScanner = MPManager.INSTANCE.getCameraScanner(); - final MPResponse response = cameraScanner.handleQrResponse(resultCode, data); - - if (response.getStatus() == ResponseStatus.SUCCESS) { -   // Manage successful response -   final CameraScannerStatus status = response.getData().getStatus(); -   final String message = response.getData().getMessage(); - } else { -   // Manage the error in the response -   final String errorMessage = response.getError().getMessage(); - } -} -``` -]]] - -|Field|Description| -|---|---| -|**resultCode (Int)**| Value of the `resultCode` in `onActivityResult`.| -|**resultData (Intent)**| Date result in `onActivityResult`.| -|**MPResponse<CameraScannerResponse>**| Object [MPResponse] that includes the status, the error (if any), and the details in case of success, which contain an `CameraScannerResponse` object.| -|**status (CameraScannerStatus)**| Defines the status of the response. It can be "Ok" (it read it successfully), **Error** (something went wrong and it was cancelled) or **Unknown** (something went wrong).| -|**message (String)**| Defines the response message received by the scanner. If it’s ”Ok”, it will have the result of the reading of the code.| diff --git a/guides/mp-point-main-apps/scan-qr-code.es.md b/guides/mp-point-main-apps/scan-qr-code.es.md deleted file mode 100644 index 46047e5f39..0000000000 --- a/guides/mp-point-main-apps/scan-qr-code.es.md +++ /dev/null @@ -1,70 +0,0 @@ -# Escanear código QR - -Para iniciar la lectura de códigos QR del [Point Smart](/developers/es/docs/mp-point/landing), usa la función `initQRCodeScanner` de la clase `CameraScanner`. Este proceso usa un llamado de cámara a través de `startActivityForResult`, de modo que el método `onActivityResult` se debe implementar en la actividad para manipular la respuesta de lectura. - -Consulta el ejemplo a continuación. - -[[[ -```kotlin -val cameraScanner = MPManager.cameraScanner -cameraScanner.initQRCodeScanner(this@YourActivity) -``` -```java -final CameraScanner cameraScanner = MPManager.INSTANCE.getCameraScanner(); -cameraScanner.initQRCodeScanner(this); -``` -]]] - -## Gestionar la respuesta - -Para gestionar la respuesta del escaner de código QR, usa la función `handleQrResponse` de la clase `CameraScanner` en el método `onActivityResult`. Esta función devuelve el objeto `[MPResponse]` que encapsula el estado, el error (si lo hay) y los datos en caso de éxito, que tiene el objeto `CameraScannerResponse` representando la respuesta de lectura. - -Consulta cómo continuar. - -[[[ -```kotlin -override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { -   super.onActivityResult(requestCode, resultCode, data) - -   val cameraScanner = MPManager.cameraScanner -   val response = cameraScanner.handleQrResponse(resultCode, data) - -   response.doIfSuccess { result -> -       // Manejar la respuesta exitosa -       val status = result.status -       val message = result.message -       // ... Hacer algo con la respuesta -   }.doIfError { error -> -       // Manejar el error en la respuesta -       val errorMessage = error.message -       // ... Hacer algo con el error -   } -} -``` -```java -@Override -protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { - super.onActivityResult(requestCode, resultCode, data); - - final CameraScanner cameraScanner = MPManager.INSTANCE.getCameraScanner(); - final MPResponse response = cameraScanner.handleQrResponse(resultCode, data); - - if (response.getStatus() == ResponseStatus.SUCCESS) { -   // Manejar la respuesta exitosa -   final CameraScannerStatus status = response.getData().getStatus(); -   final String message = response.getData().getMessage(); - } else { -   // Manejar el error en la respuesta -   final String errorMessage = response.getError().getMessage(); - } -} -``` -]]] - -|Campo|Descripción| -|---|---| -|**resultCode (Int)**| Valor del `resultCode` en `onActivityResult`.| -|**resultData (Intent)**| Valor de la fecha en `onActivityResult`.| -|**MPResponse<CameraScannerResponse>**| Objeto `[MPResponse]` que encapsula el estado, el error (si lo hay) y los datos en caso de éxito, que tiene un objeto `CameraScannerResponse`.| -|**status (CameraScannerStatus)**| Define el estado de la respuesta. Puede ser "Ok" (la lectura fue exitosa), **Error** (hubo un error o la lectura se canceló) o **Unknown** (hubo algún error indeterminado).| -|**message (String)**| Define el mensaje de la respuesta recibida por escaner. Si es ”Ok”, tendrá el resultado de la lectura del código.| \ No newline at end of file diff --git a/guides/mp-point-main-apps/scan-qr-code.pt.md b/guides/mp-point-main-apps/scan-qr-code.pt.md deleted file mode 100644 index 8f0322bc35..0000000000 --- a/guides/mp-point-main-apps/scan-qr-code.pt.md +++ /dev/null @@ -1,70 +0,0 @@ -# Escanear código QR - -Para iniciar a leitura de códigos QR da [Point Smart](/developers/pt/docs/mp-point/landing), use a função `initQRCodeScanner` da classe `CameraScanner`. Esse processo utiliza uma chamada de câmera mediante `startActivityForResult`, de modo que o método `onActivityResult` deve ser implementado na atividade para manipular a resposta de leitura. - -Confira o exemplo a seguir. - -[[[ -```kotlin -val cameraScanner = MPManager.cameraScanner -cameraScanner.initQRCodeScanner(this@YourActivity) -``` -```java -final CameraScanner cameraScanner = MPManager.INSTANCE.getCameraScanner(); -cameraScanner.initQRCodeScanner(this); -``` -]]] - -## Gerenciar resposta - -Para gerenciar a resposta do escâner de código QR, use a função `handleQrResponse` da classe `CameraScanner` no método `onActivityResult`. Essa função devolve o objeto `[MPResponse]` que encapsula o estado, o erro (se houver) e os dados em caso de sucesso, que contêm um objeto `CameraScannerResponse` representando a resposta da leitura. - -Confira como isso ocorre a seguir. - -[[[ -```kotlin -override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { -   super.onActivityResult(requestCode, resultCode, data) - -   val cameraScanner = MPManager.cameraScanner -   val response = cameraScanner.handleQrResponse(resultCode, data) - -   response.doIfSuccess { result -> -       // Gerenciar resposta bem-sucedida -       val status = result.status -       val message = result.message -       // ... Hacer algo con la respuesta -   }.doIfError { error -> -       // Fazer algo com a resposta -       val errorMessage = error.message -       // ... Fazer algo com o erro -   } -} -``` -```java -@Override -protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { - super.onActivityResult(requestCode, resultCode, data); - - final CameraScanner cameraScanner = MPManager.INSTANCE.getCameraScanner(); - final MPResponse response = cameraScanner.handleQrResponse(resultCode, data); - - if (response.getStatus() == ResponseStatus.SUCCESS) { -   // Gerenciar resposta bem-sucedida -   final CameraScannerStatus status = response.getData().getStatus(); -   final String message = response.getData().getMessage(); - } else { -   // Gerenciar o erro na resposta -   final String errorMessage = response.getError().getMessage(); - } -} -``` -]]] - -|Campo|Descrição| -|---|---| -|**resultCode (Int)**| Valor do `resultCode` em `onActivityResult`.| -|**resultData (Intent)**|Valor de data em `onActivityResult`.| -|**MPResponse<CameraScannerResponse>**| Objeto `[MPResponse]` que encapsula o estado, o erro (se houver) e os dados em caso de sucesso, que contêm um objeto `CameraScannerResponse`.| -|**status (CameraScannerStatus)**| Define o estado da resposta. Pode ser "Ok" (a leitura foi exitosa), **Error** (houve um erro ou a leitura foi cancelada) ou **Unknown** (ocorreu um erro indeterminado).| -|**message (String)**| Define a mensagem da resposta recebida pelo escâner. Se for "Ok", conterá o resultado da leitura do código.| \ No newline at end of file From aa6e4882c08640c1b2737e9d6eef9e1221292f9f Mon Sep 17 00:00:00 2001 From: Heitor Galdino Date: Fri, 4 Oct 2024 05:02:22 -0300 Subject: [PATCH 29/34] final3 --- guides/mp-point-main-apps/first-steps.en.md | 51 ++++++++++++++++++- guides/mp-point-main-apps/first-steps.es.md | 51 ++++++++++++++++++- guides/mp-point-main-apps/first-steps.pt.md | 50 +++++++++++++++++- guides/mp-point-main-apps/restrictions.en.md | 6 +-- guides/mp-point-main-apps/restrictions.es.md | 6 +-- guides/mp-point-main-apps/restrictions.pt.md | 6 +-- .../start-payment-flow.en.md | 16 +++--- .../start-payment-flow.es.md | 16 +++--- .../start-payment-flow.pt.md | 16 +++--- 9 files changed, 176 insertions(+), 42 deletions(-) diff --git a/guides/mp-point-main-apps/first-steps.en.md b/guides/mp-point-main-apps/first-steps.en.md index 82184934da..da9be9296f 100644 --- a/guides/mp-point-main-apps/first-steps.en.md +++ b/guides/mp-point-main-apps/first-steps.en.md @@ -15,7 +15,56 @@ dependencies { } ``` -3. In the **AndroidManifest.xml** file, define the main activity that will be set as the application launcher. Add the following `intent-filter`: +3. The correct configuration of metadata in the **AndroidManifest.xml** file is crucial to ensure optimal functioning and full integration of our SDK into your application. The metadata allows you to define essential and customized settings that the SDK needs to operate properly, adapting to the specific needs of each application and its usage environment. To do this, configure the following information: + + - **CLIENT_ID**: to identify the transactions of the integrators, indicate the [credential](/developers/en/docs/main-apps/additional-content/your-integrations/credentials) **Client ID** that was assigned to the application created in the [Developer dashboard](/developers/en/docs/checkout-bricks/additional-content/your-integrations/dashboard). + + ```xml + + + + + + + ``` + + > WARNING + > + > Important + > + > It is crucial that the metadata name is exactly `com.test.android.sdk.CLIENT_ID`. Any variation in the name may result in the SDK not recognizing the field. + >

+ > Additionally, make sure that the **Client ID** value ends with the letter "L" to indicate that it is a Long type number. This is necessary for the SDK to process the value correctly. + + - **OAUTH_ENABLED**: use the `OAUTH_ENABLED` field to enable the [OAuth](/developers/en/docs/main-apps/additional-content/security/oauth/introduction) authorization protocol, which is necessary when devices will be used with accounts different from that of the application developer. This field is optional, and if it is not added to the metadata, it will be considered the default value `false`. + + ```xml + + + + + + + + ``` + + > WARNING + > + > Important + > + > It is crucial that the metadata name is exactly `com.mercadolibre.android.sdk.OAUTH_ENABLED`. Any variation in the name may result in the SDK not recognizing the field. + >

+ > Make sure to correctly set the value of the field to only `true` or `false`, according to the need to enable or not the [OAuth](/developers/en/docs/main-apps/additional-content/security/oauth/introduction) protocol. If not specified, the default value will be `false`. + +4. Still in the **AndroidManifest.xml** file, define the main activity that will be set as the application launcher. Add the following `intent-filter`: ```xml diff --git a/guides/mp-point-main-apps/first-steps.es.md b/guides/mp-point-main-apps/first-steps.es.md index 144c0b3ed2..65dd9032da 100644 --- a/guides/mp-point-main-apps/first-steps.es.md +++ b/guides/mp-point-main-apps/first-steps.es.md @@ -15,7 +15,56 @@ dependencies { } ``` -3. En el archivo **AndroidManifest.xml**, define la actividad principal que se establecerá como _launcher_ de la app. Agrega los siguientes `intent-filter`: +3. La configuración correcta de metadata en el archivo **AndroidManifest.xml** es crucial para garantizar el funcionamiento óptimo y la integración completa de nuestro SDK en tu aplicación. La metadata permite definir configuraciones esenciales y personalizadas que el SDK necesita para operar adecuadamente, adaptándose a las necesidades específicas de cada aplicación y su entorno de uso. Para ello, configure las siguientes información: + + - **CLIENT_ID**: para identificar las transacciones de los integradores, indica la [credencial](/developers/es/docs/main-apps/additional-content/your-integrations/credentials) **Client ID** que fue asignada a la aplicación creada en el [Panel del desarrollador](/developers/es/docs/checkout-bricks/additional-content/your-integrations/dashboard). + + ```xml + + + + + + + ``` + + > WARNING + > + > Importante + > + > Es crucial que el nombre de la metadata sea exactamente `com.test.android.sdk.CLIENT_ID`. Cualquier variación en el nombre puede resultar en la falta de reconocimiento del campo por parte del SDK. + >

+ > Además, asegúrate de que el valor del **Client ID** termine con la letra "L" para indicar que es un número del tipo _Long_. Esto es necesario para que el SDK procese correctamente el valor. + + - **OAUTH_ENABLED**: utiliza el campo `OAUTH_ENABLED` para activar el protocolo de autorización [OAuth](/developers/es/docs/main-apps/additional-content/security/oauth/introduction), que es necesario cuando los dispositivos se utilizarán con cuentas diferentes a la del desarrollador de la aplicación. Este campo es opcional y, si no se agrega en la metadata, se considerará el valor predeterminado `false`. + + ```xml + + + + + + + + ``` + + > WARNING + > + > Importante + > + > Es crucial que el nombre de la metadata sea exactamente `com.mercadolibre.android.sdk.OAUTH_ENABLED`. Cualquier variación en el nombre puede resultar en la falta de reconocimiento del campo por parte del SDK. + >

+ > Asegúrate de definir correctamente el valor del campo solo con `true` o `false`, de acuerdo con la necesidad de habilitar o no el protocolo [OAuth](/developers/es/docs/main-apps/additional-content/security/oauth/introduction). Si no se especifica, el valor predeterminado será `false`. + +4. Aún en el archivo **AndroidManifest.xml**, define la actividad principal que se establecerá como _launcher_ de la app. Agrega los siguientes `intent-filter`: ```xml diff --git a/guides/mp-point-main-apps/first-steps.pt.md b/guides/mp-point-main-apps/first-steps.pt.md index d7ced9e730..cf0a6271ec 100644 --- a/guides/mp-point-main-apps/first-steps.pt.md +++ b/guides/mp-point-main-apps/first-steps.pt.md @@ -15,7 +15,55 @@ dependencies { } ``` -3. No arquivo **AndroidManifest.xml**, defina a atividade principal que será estabelecida como _launcher_ da aplicação. Adicione os seguintes `intent-filter`: +3. A configuração correta de metadata no arquivo **AndroidManifest.xml** é crucial para garantir o funcionamento ideal e a integração completa do nosso SDK em sua aplicação. A metadata permite definir configurações essenciais e personalizadas que o SDK precisa para operar adequadamente, adaptando-se às necessidades específicas de cada aplicação e seu ambiente de uso. Para isso, configure as seguintes informações: + + - **CLIENT_ID**: para identificar as transações dos integradores, indique a [credencial](/developers/pt/docs/main-apps/additional-content/your-integrations/credentials) **Client ID** que foi atribuída à aplicação criada no [Painel do desenvolvedor](/developers/pt/docs/checkout-bricks/additional-content/your-integrations/dashboard). + + ```xml + + + + + + + ``` + + > WARNING + > + > Importante + > + > É crucial que o nome da metadata seja exatamente `com.test.android.sdk.CLIENT_ID`. Qualquer variação no nome pode resultar na falta de reconhecimento do campo pelo SDK. + >

+ > Além disso, certifique-se de que o valor do **Client ID** termine com a letra "L" para indicar que é um número do tipo _Long_. Isso é necessário para que o SDK processe corretamente o valor. + + - **OAUTH_ENABLED**: utilize o campo `OAUTH_ENABLED` para ativar o protocolo de autorização [OAuth](/developers/pt/docs/main-apps/additional-content/security/oauth/introduction), que é necessário quando os dispositivos serão usados com contas diferentes da do desenvolvedor da aplicação. Este campo é opcional e, caso não seja adicionado na metadata, será considerado o valor padrão `false`. + + ```xml + + + + + + + ``` + + > WARNING + > + > Importante + > + > É crucial que o nome da metadata seja exatamente `com.mercadolibre.android.sdk.OAUTH_ENABLED`. Qualquer variação no nome pode resultar na falta de reconhecimento do campo pelo SDK. + >

+ > Certifique-se de definir corretamente o valor do campo apenas com `true` ou `false`, de acordo com a necessidade de habilitar ou não o protocolo [OAuth](/developers/pt/docs/main-apps/additional-content/security/oauth/introduction). Se não for especificado, o valor padrão será `false`. + +4. Ainda no arquivo **AndroidManifest.xml**, defina a atividade principal que será estabelecida como _launcher_ da aplicação. Adicione os seguintes `intent-filter`: ```xml diff --git a/guides/mp-point-main-apps/restrictions.en.md b/guides/mp-point-main-apps/restrictions.en.md index e81c26738c..9c40a2165b 100644 --- a/guides/mp-point-main-apps/restrictions.en.md +++ b/guides/mp-point-main-apps/restrictions.en.md @@ -26,11 +26,7 @@ Libraries that interact directly with the device's hardware, such as those from ## Issue with Build Tools -> WARNING -> -> Attention -> -> If the message **"Installed Build Tools revision 32.0.0 is corrupted"** is displayed, delete the program and install it again using the **SDK Manager**. +If the message **"Installed Build Tools revision 32.0.0 is corrupted"** is displayed, delete the program and install it again using the **SDK Manager**. Then run this command in the terminal: diff --git a/guides/mp-point-main-apps/restrictions.es.md b/guides/mp-point-main-apps/restrictions.es.md index 9ddf371e5c..c0ee25d05e 100644 --- a/guides/mp-point-main-apps/restrictions.es.md +++ b/guides/mp-point-main-apps/restrictions.es.md @@ -26,11 +26,7 @@ Las que interactuan directo con el hardware del dispositivo, como las de los fab ## Problema con Build Tools -> WARNING -> -> Atención -> -> Si el mensaje **"El Build Tools instalado revisión 32.0.0 está dañado"** aparece, elimina el programa y vuelve a instalarlo usando el **SDK Manager**. +Si el mensaje **"El Build Tools instalado revisión 32.0.0 está dañado"** aparece, elimina el programa y vuelve a instalarlo usando el **SDK Manager**. Luego, ejecuta este comando en la terminal: diff --git a/guides/mp-point-main-apps/restrictions.pt.md b/guides/mp-point-main-apps/restrictions.pt.md index bf32bb1ba8..2d09bb16f3 100644 --- a/guides/mp-point-main-apps/restrictions.pt.md +++ b/guides/mp-point-main-apps/restrictions.pt.md @@ -26,11 +26,7 @@ As que interagem diretamente com o hardware do dispositivo, como as dos fabrican ## Problema com o Build Tools -> WARNING -> -> Atenção -> -> Se a mensagem **"O Build Tools instalado revisão 32.0.0 está danificado”** for apresentada, exclua o programa e instale novamente utilizando o **SDK Manager**. +Se a mensagem **"O Build Tools instalado revisão 32.0.0 está danificado”** for apresentada, exclua o programa e instale novamente utilizando o **SDK Manager**. Em seguida, execute este comando no terminal: diff --git a/guides/mp-point-main-apps/start-payment-flow.en.md b/guides/mp-point-main-apps/start-payment-flow.en.md index d805514d52..5c221d731f 100644 --- a/guides/mp-point-main-apps/start-payment-flow.en.md +++ b/guides/mp-point-main-apps/start-payment-flow.en.md @@ -149,14 +149,14 @@ final Uri uriResult = paymentFlow.buildCallbackUri( The feature `parseResponse` of the `PaymentFlow` class is used to receive the result of the payment flow, which is delivered as the `PaymentResponse` object ready for its handling. In this process, the following information is provided: -- **Payment method used.** -- **Payment reference.** -- **Creation date.** -- **Payment amount.** -- **Serial number of the POS machine.** -- **Card brand.** -- **Number of installments.** -- **Last four digits of the card.** +- **Payment method used;** +- **Payment reference;** +- **Creation date;** +- **Payment amount;** +- **Serial number of the POS machine;** +- **Card brand;** +- **Number of installments;** +- **Last four digits of the card;** - **Any errors associated with the transaction.** Check how to implement this feature: diff --git a/guides/mp-point-main-apps/start-payment-flow.es.md b/guides/mp-point-main-apps/start-payment-flow.es.md index 1ad1a49d32..5bafdf2370 100644 --- a/guides/mp-point-main-apps/start-payment-flow.es.md +++ b/guides/mp-point-main-apps/start-payment-flow.es.md @@ -149,14 +149,14 @@ final Uri uriResult = paymentFlow.buildCallbackUri( La función `parseResponse` de la clase `PaymentFlow` se usa para recibir el resultado del flujo de pago, que se entrega en forma de objeto `PaymentResponse` listo para su manipulación. En este proceso, la siguiente información se ofrece: -- **Medio de pago usado.** -- **Referencia de pago.** -- **Fecha de creación.** -- **Monto del pago.** -- **Número de serie del lector.** -- **Marca de la tarjeta.** -- **Cantidad de cuotas.** -- **Últimos cuatro números de la tarjeta.** +- **Medio de pago usado;** +- **Referencia de pago;** +- **Fecha de creación;** +- **Monto del pago;** +- **Número de serie del lector;** +- **Marca de la tarjeta;** +- **Cantidad de cuotas;** +- **Últimos cuatro números de la tarjeta;** - **Cualquier error asociado a la operación.** Consulta cómo implementar esta funcionalidad: diff --git a/guides/mp-point-main-apps/start-payment-flow.pt.md b/guides/mp-point-main-apps/start-payment-flow.pt.md index ea210d126f..e9ba563856 100644 --- a/guides/mp-point-main-apps/start-payment-flow.pt.md +++ b/guides/mp-point-main-apps/start-payment-flow.pt.md @@ -149,14 +149,14 @@ final Uri uriResult = paymentFlow.buildCallbackUri( A função `parseResponse` da classe `PaymentFlow` é usada para receber o resultado do fluxo de pagamento, sendo entregue na forma de objeto `PaymentResponse` pronto para a sua manipulação. Nesse processo, as seguintes informações são proporcionadas: -- **Meio de pagamento usado.** -- **Referência de pagamento.** -- **Data de criação.** -- **Valor do pagamento.** -- **Número de série da maquininha.** -- **Bandeira do cartão.** -- **Quantidade de parcelas.** -- **Últimos quatro dígitos do cartão.** +- **Meio de pagamento usado;** +- **Referência de pagamento;** +- **Data de criação;** +- **Valor do pagamento;** +- **Número de série da maquininha;** +- **Bandeira do cartão;** +- **Quantidade de parcelas;** +- **Últimos quatro dígitos do cartão;** - **Qualquer erro associado à transação.** Confira como implementar esta funcionalidade: From ff62c3ad95c82b8dbde3a4356c53b3e8532eb1d3 Mon Sep 17 00:00:00 2001 From: Heitor Galdino Date: Fri, 4 Oct 2024 13:20:29 -0300 Subject: [PATCH 30/34] finalfinal --- guides/mp-point-main-apps/first-steps.en.md | 64 ++++++++--------- guides/mp-point-main-apps/first-steps.es.md | 68 +++++++++---------- guides/mp-point-main-apps/first-steps.pt.md | 68 +++++++++---------- .../get-list-installments.pt.md | 2 +- guides/mp-point-main-apps/scan-codes.pt.md | 2 +- 5 files changed, 102 insertions(+), 102 deletions(-) diff --git a/guides/mp-point-main-apps/first-steps.en.md b/guides/mp-point-main-apps/first-steps.en.md index da9be9296f..69085edb3c 100644 --- a/guides/mp-point-main-apps/first-steps.en.md +++ b/guides/mp-point-main-apps/first-steps.en.md @@ -19,50 +19,50 @@ dependencies { - **CLIENT_ID**: to identify the transactions of the integrators, indicate the [credential](/developers/en/docs/main-apps/additional-content/your-integrations/credentials) **Client ID** that was assigned to the application created in the [Developer dashboard](/developers/en/docs/checkout-bricks/additional-content/your-integrations/dashboard). - ```xml - + ```xml + + android:name="com.mercadolibre.android.sdk.CLIENT_ID" + android:value="123456789L" /> - - - ``` + + + ``` - > WARNING - > - > Important - > - > It is crucial that the metadata name is exactly `com.test.android.sdk.CLIENT_ID`. Any variation in the name may result in the SDK not recognizing the field. - >

- > Additionally, make sure that the **Client ID** value ends with the letter "L" to indicate that it is a Long type number. This is necessary for the SDK to process the value correctly. + > WARNING + > + > Important + > + > It is crucial that the metadata name is exactly `com.test.android.sdk.CLIENT_ID`. Any variation in the name may result in the SDK not recognizing the field. + >

+ > Additionally, make sure that the **Client ID** value ends with the letter "L" to indicate that it is a Long type number. This is necessary for the SDK to process the value correctly. - - **OAUTH_ENABLED**: use the `OAUTH_ENABLED` field to enable the [OAuth](/developers/en/docs/main-apps/additional-content/security/oauth/introduction) authorization protocol, which is necessary when devices will be used with accounts different from that of the application developer. This field is optional, and if it is not added to the metadata, it will be considered the default value `false`. + - **OAUTH_ENABLED**: use the `OAUTH_ENABLED` field to enable the [OAuth](/developers/en/docs/main-apps/additional-content/security/oauth/introduction) authorization protocol, which is necessary when devices will be used with accounts different from that of the application developer. This field is optional, and if it is not added to the metadata, it will be considered the default value `false`. - ```xml - + ```xml + - + android:name="com.mercadolibre.android.sdk.OAUTH_ENABLED" + android:value="true" /> - + - - ``` + + ``` - > WARNING - > - > Important - > - > It is crucial that the metadata name is exactly `com.mercadolibre.android.sdk.OAUTH_ENABLED`. Any variation in the name may result in the SDK not recognizing the field. - >

- > Make sure to correctly set the value of the field to only `true` or `false`, according to the need to enable or not the [OAuth](/developers/en/docs/main-apps/additional-content/security/oauth/introduction) protocol. If not specified, the default value will be `false`. + > WARNING + > + > Important + > + > It is crucial that the metadata name is exactly `com.mercadolibre.android.sdk.OAUTH_ENABLED`. Any variation in the name may result in the SDK not recognizing the field. + >

+ > Make sure to correctly set the value of the field to only `true` or `false`, according to the need to enable or not the [OAuth](/developers/en/docs/main-apps/additional-content/security/oauth/introduction) protocol. If not specified, the default value will be `false`. 4. Still in the **AndroidManifest.xml** file, define the main activity that will be set as the application launcher. Add the following `intent-filter`: diff --git a/guides/mp-point-main-apps/first-steps.es.md b/guides/mp-point-main-apps/first-steps.es.md index 65dd9032da..a4441aad94 100644 --- a/guides/mp-point-main-apps/first-steps.es.md +++ b/guides/mp-point-main-apps/first-steps.es.md @@ -17,52 +17,52 @@ dependencies { 3. La configuración correcta de metadata en el archivo **AndroidManifest.xml** es crucial para garantizar el funcionamiento óptimo y la integración completa de nuestro SDK en tu aplicación. La metadata permite definir configuraciones esenciales y personalizadas que el SDK necesita para operar adecuadamente, adaptándose a las necesidades específicas de cada aplicación y su entorno de uso. Para ello, configure las siguientes información: - - **CLIENT_ID**: para identificar las transacciones de los integradores, indica la [credencial](/developers/es/docs/main-apps/additional-content/your-integrations/credentials) **Client ID** que fue asignada a la aplicación creada en el [Panel del desarrollador](/developers/es/docs/checkout-bricks/additional-content/your-integrations/dashboard). + - **CLIENT_ID**: para identificar las transacciones de los integradores, indica la [credencial](/developers/es/docs/main-apps/additional-content/your-integrations/credentials) **Client ID** que fue asignada a la aplicación creada en el [Panel del desarrollador](/developers/es/docs/checkout-bricks/additional-content/your-integrations/dashboard). - ```xml - + ```xml + - + android:name="com.mercadolibre.android.sdk.CLIENT_ID" + android:value="123456789L" /> - - - ``` + + + ``` - > WARNING - > - > Importante - > - > Es crucial que el nombre de la metadata sea exactamente `com.test.android.sdk.CLIENT_ID`. Cualquier variación en el nombre puede resultar en la falta de reconocimiento del campo por parte del SDK. - >

- > Además, asegúrate de que el valor del **Client ID** termine con la letra "L" para indicar que es un número del tipo _Long_. Esto es necesario para que el SDK procese correctamente el valor. + > WARNING + > + > Importante + > + > Es crucial que el nombre de la metadata sea exactamente `com.test.android.sdk.CLIENT_ID`. Cualquier variación en el nombre puede resultar en la falta de reconocimiento del campo por parte del SDK. + >

+ > Además, asegúrate de que el valor del **Client ID** termine con la letra "L" para indicar que es un número del tipo _Long_. Esto es necesario para que el SDK procese correctamente el valor. - - **OAUTH_ENABLED**: utiliza el campo `OAUTH_ENABLED` para activar el protocolo de autorización [OAuth](/developers/es/docs/main-apps/additional-content/security/oauth/introduction), que es necesario cuando los dispositivos se utilizarán con cuentas diferentes a la del desarrollador de la aplicación. Este campo es opcional y, si no se agrega en la metadata, se considerará el valor predeterminado `false`. + - **OAUTH_ENABLED**: utiliza el campo `OAUTH_ENABLED` para activar el protocolo de autorización [OAuth](/developers/es/docs/main-apps/additional-content/security/oauth/introduction), que es necesario cuando los dispositivos se utilizarán con cuentas diferentes a la del desarrollador de la aplicación. Este campo es opcional y, si no se agrega en la metadata, se considerará el valor predeterminado `false`. - ```xml - + ```xml + - + android:name="com.mercadolibre.android.sdk.OAUTH_ENABLED" + android:value="true" /> - + - - ``` + + ``` - > WARNING - > - > Importante - > - > Es crucial que el nombre de la metadata sea exactamente `com.mercadolibre.android.sdk.OAUTH_ENABLED`. Cualquier variación en el nombre puede resultar en la falta de reconocimiento del campo por parte del SDK. - >

- > Asegúrate de definir correctamente el valor del campo solo con `true` o `false`, de acuerdo con la necesidad de habilitar o no el protocolo [OAuth](/developers/es/docs/main-apps/additional-content/security/oauth/introduction). Si no se especifica, el valor predeterminado será `false`. + > WARNING + > + > Importante + > + > Es crucial que el nombre de la metadata sea exactamente `com.mercadolibre.android.sdk.OAUTH_ENABLED`. Cualquier variación en el nombre puede resultar en la falta de reconocimiento del campo por parte del SDK. + >

+ > Asegúrate de definir correctamente el valor del campo solo con `true` o `false`, de acuerdo con la necesidad de habilitar o no el protocolo [OAuth](/developers/es/docs/main-apps/additional-content/security/oauth/introduction). Si no se especifica, el valor predeterminado será `false`. 4. Aún en el archivo **AndroidManifest.xml**, define la actividad principal que se establecerá como _launcher_ de la app. Agrega los siguientes `intent-filter`: diff --git a/guides/mp-point-main-apps/first-steps.pt.md b/guides/mp-point-main-apps/first-steps.pt.md index cf0a6271ec..2b19c9228f 100644 --- a/guides/mp-point-main-apps/first-steps.pt.md +++ b/guides/mp-point-main-apps/first-steps.pt.md @@ -17,51 +17,51 @@ dependencies { 3. A configuração correta de metadata no arquivo **AndroidManifest.xml** é crucial para garantir o funcionamento ideal e a integração completa do nosso SDK em sua aplicação. A metadata permite definir configurações essenciais e personalizadas que o SDK precisa para operar adequadamente, adaptando-se às necessidades específicas de cada aplicação e seu ambiente de uso. Para isso, configure as seguintes informações: - - **CLIENT_ID**: para identificar as transações dos integradores, indique a [credencial](/developers/pt/docs/main-apps/additional-content/your-integrations/credentials) **Client ID** que foi atribuída à aplicação criada no [Painel do desenvolvedor](/developers/pt/docs/checkout-bricks/additional-content/your-integrations/dashboard). + - **CLIENT_ID**: para identificar as transações dos integradores, indique a [credencial](/developers/pt/docs/main-apps/additional-content/your-integrations/credentials) **Client ID** que foi atribuída à aplicação criada no [Painel do desenvolvedor](/developers/pt/docs/checkout-bricks/additional-content/your-integrations/dashboard). - ```xml - + ```xml + - + android:name="com.mercadolibre.android.sdk.CLIENT_ID" + android:value="123456789L" /> - - - ``` + + + ``` - > WARNING - > - > Importante - > - > É crucial que o nome da metadata seja exatamente `com.test.android.sdk.CLIENT_ID`. Qualquer variação no nome pode resultar na falta de reconhecimento do campo pelo SDK. - >

- > Além disso, certifique-se de que o valor do **Client ID** termine com a letra "L" para indicar que é um número do tipo _Long_. Isso é necessário para que o SDK processe corretamente o valor. + > WARNING + > + > Importante + > + > É crucial que o nome da metadata seja exatamente `com.test.android.sdk.CLIENT_ID`. Qualquer variação no nome pode resultar na falta de reconhecimento do campo pelo SDK. + >

+ > Além disso, certifique-se de que o valor do **Client ID** termine com a letra "L" para indicar que é um número do tipo _Long_. Isso é necessário para que o SDK processe corretamente o valor. - - **OAUTH_ENABLED**: utilize o campo `OAUTH_ENABLED` para ativar o protocolo de autorização [OAuth](/developers/pt/docs/main-apps/additional-content/security/oauth/introduction), que é necessário quando os dispositivos serão usados com contas diferentes da do desenvolvedor da aplicação. Este campo é opcional e, caso não seja adicionado na metadata, será considerado o valor padrão `false`. + - **OAUTH_ENABLED**: utilize o campo `OAUTH_ENABLED` para ativar o protocolo de autorização [OAuth](/developers/pt/docs/main-apps/additional-content/security/oauth/introduction), que é necessário quando os dispositivos serão usados com contas diferentes da do desenvolvedor da aplicação. Este campo é opcional e, caso não seja adicionado na metadata, será considerado o valor padrão `false`. - ```xml - + ```xml + - + android:name="com.mercadolibre.android.sdk.OAUTH_ENABLED" + android:value="true" /> - - - ``` + + + ``` - > WARNING - > - > Importante - > - > É crucial que o nome da metadata seja exatamente `com.mercadolibre.android.sdk.OAUTH_ENABLED`. Qualquer variação no nome pode resultar na falta de reconhecimento do campo pelo SDK. - >

- > Certifique-se de definir corretamente o valor do campo apenas com `true` ou `false`, de acordo com a necessidade de habilitar ou não o protocolo [OAuth](/developers/pt/docs/main-apps/additional-content/security/oauth/introduction). Se não for especificado, o valor padrão será `false`. + > WARNING + > + > Importante + > + > É crucial que o nome da metadata seja exatamente `com.mercadolibre.android.sdk.OAUTH_ENABLED`. Qualquer variação no nome pode resultar na falta de reconhecimento do campo pelo SDK. + >

+ > Certifique-se de definir corretamente o valor do campo apenas com `true` ou `false`, de acordo com a necessidade de habilitar ou não o protocolo [OAuth](/developers/pt/docs/main-apps/additional-content/security/oauth/introduction). Se não for especificado, o valor padrão será `false`. 4. Ainda no arquivo **AndroidManifest.xml**, defina a atividade principal que será estabelecida como _launcher_ da aplicação. Adicione os seguintes `intent-filter`: diff --git a/guides/mp-point-main-apps/get-list-installments.pt.md b/guides/mp-point-main-apps/get-list-installments.pt.md index 00502df18c..f256ce36a5 100644 --- a/guides/mp-point-main-apps/get-list-installments.pt.md +++ b/guides/mp-point-main-apps/get-list-installments.pt.md @@ -49,7 +49,7 @@ paymentInstallmentTools.getInstallmentsAmount(callback, amount); |Campo|Descrição| |---|---| -|**callback ((MPResponse<List<InstallmentAmount>>) -> Unit)**|Função de resposta com o resultado da solicitação da lista de parcelas. Assegure-se de lidar adequadamente tanto com o caso de sucesso quanto com o caso de erro na solicitação da lista.| +|**callback ((MPResponse<List<InstallmentAmount>>) -> Unit)**|Função de resposta com o resultado da solicitação da lista de parcelas. Lembre-se de lidar corretamente tanto com o caso de sucesso quanto com o caso de erro na solicitação da lista.| |**amount (String)**|Valor com o qual se determina a lista de parcelas.| |**installment (Int)**|Número de parcelas.| |**amount (Double)**|Valor de cada parcela.| diff --git a/guides/mp-point-main-apps/scan-codes.pt.md b/guides/mp-point-main-apps/scan-codes.pt.md index 68b36e0853..d739e87ecf 100644 --- a/guides/mp-point-main-apps/scan-codes.pt.md +++ b/guides/mp-point-main-apps/scan-codes.pt.md @@ -1,4 +1,4 @@ -# Escanear códigos de barra e QR +# Escanear códigos de barras e QR Abaixo você encontrará informações de como iniciar e gerenciar o escâner da [Point Smart](/developers/pt/docs/mp-point/landing) para a leitura de **códigos de barra e QR**. From 81a007919a5f285baa4e4634accf257a25a468d7 Mon Sep 17 00:00:00 2001 From: Heitor Date: Thu, 7 Nov 2024 20:29:00 -0300 Subject: [PATCH 31/34] Update guides/mp-point-main-apps/landing.es.md Co-authored-by: Gabrielly Pereira --- guides/mp-point-main-apps/landing.es.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/mp-point-main-apps/landing.es.md b/guides/mp-point-main-apps/landing.es.md index 9dd80609af..0d1cd34a8b 100644 --- a/guides/mp-point-main-apps/landing.es.md +++ b/guides/mp-point-main-apps/landing.es.md @@ -1,7 +1,7 @@ --- content_section_with_media: - title: Main Apps - - message: Esta es una guía para que desarrolles e integres main apps, aplicativos de gestión de negocio que se pueden integrar a Point Smart de Mercado Pago. Navega por el menú lateral para encontrar los procesos, requisitos y direccionamientos, desde la ficha técnica del lector a la distribución de la solución. + - message: Esta es una guía para que desarrolles e integres main apps, aplicaciones de gestión de negocio que se pueden integrar a Point Smart de Mercado Pago. Navega por el menú lateral para encontrar los procesos, requisitos y direccionamientos, desde la ficha técnica del lector a la distribución de la solución. - media_image: /main-apps/landing-all.png --- From 5b0db2760d49f5d4243501db757adb304e3641ec Mon Sep 17 00:00:00 2001 From: Heitor Date: Thu, 7 Nov 2024 20:29:05 -0300 Subject: [PATCH 32/34] Update guides/mp-point-main-apps/pair-unpair.pt.md Co-authored-by: Gabrielly Pereira --- guides/mp-point-main-apps/pair-unpair.pt.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/mp-point-main-apps/pair-unpair.pt.md b/guides/mp-point-main-apps/pair-unpair.pt.md index d60dfd4ad2..980f291291 100644 --- a/guides/mp-point-main-apps/pair-unpair.pt.md +++ b/guides/mp-point-main-apps/pair-unpair.pt.md @@ -85,7 +85,7 @@ bluetoothPairing.unPairDevice(address, callback); |**address (String)**| Localização do dispositivo selecionado, obtida por `[BluetoothDeviceModel]`.| |**callback ((MPResponse<Pair<BluetoothBondState, BluetoothDeviceModel>>) -> Unit)**| Função de devolução da chamada que proporciona o resultado do processo de emparelhamento. O `[MPResponse]` encapsula o estado, o erro (se houver) e os dados no caso de sucesso, que contêm um `(Pair)` composto por `[BluetoothBondState]` e `[BluetoothDeviceModel]`.| |**NONE (BOND_NONE)**| Indica que o dispositivo não está emparelhado.| -|**BONDING (BOND_BONDING)**| Indica que o dispositivo está em processo de emparelhamento | +|**BONDING (BOND_BONDING)**| Indica que o dispositivo está em processo de emparelhamento. | |**BONDED (BOND_BONDED)**| Indica que o dispositivo está emparelhado.| |**id (String)**| Identificador do dispositivo.| |**boundState (Int)**| Estado de emparejação do dispositivo. Pode ser `true` ou `false`.| From 3b47320839bfd7754e08c566561fb4242a9a7568 Mon Sep 17 00:00:00 2001 From: Heitor Date: Thu, 7 Nov 2024 20:29:11 -0300 Subject: [PATCH 33/34] Update guides/mp-point-main-apps/prerequisites.pt.md Co-authored-by: Gabrielly Pereira --- guides/mp-point-main-apps/prerequisites.pt.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/mp-point-main-apps/prerequisites.pt.md b/guides/mp-point-main-apps/prerequisites.pt.md index 39163e94e4..21a696e134 100644 --- a/guides/mp-point-main-apps/prerequisites.pt.md +++ b/guides/mp-point-main-apps/prerequisites.pt.md @@ -5,7 +5,7 @@ Antes de começar a desenvolver sua solução, veja as condições que devem ser | Requisitos | Descrição | |---|---| | Aplicação | As aplicações são as diferentes integrações contidas em uma ou mais lojas. Você pode criar uma aplicação para cada solução que implementar, a fim de ter tudo organizado e manter um controle que facilite a gestão. Veja [Suas integrações](/developers/pt/docs/checkout-bricks/additional-content/your-integrations/introduction) para mais informações sobre como criar uma aplicação. | -| Credenciais | Senhas únicas com as quais identificamos uma integração na sua conta. Para realizar as integrações, será necessário o **Client ID**. [Clique aqui](/developers/pt/docs/main-apps/additional-content/your-integrations/credentials) para mais informações. | +| Credenciais | Senhas únicas com as quais identificamos uma integração na sua conta. Para realizar as integrações, será necessário o **Client ID**. Acesse [Credenciais](/developers/pt/docs/main-apps/additional-content/your-integrations/credentials) para mais informações. | | Point Smart do Mercado Pago | [Mercado Pago Point](/developers/pt/docs/mp-point/landing) é a maquininha de cartão do Mercado Pago que permite aos compradores realizarem pagamentos presenciais de maneira rápida e segura utilizando cartões de crédito ou débito. | | Pré-configuração de dispositivos | Para que as maquininhas operem em **Modo integrado** e a pré-configuração seja feita, compartilhe com o Mercado Pago a conta que será utilizada para a integração, bem como as configurações de caixas, lojas e números de série dos aparelhos. | |Kit de Desenvolvimento| Para iniciar o desenvolvimento, baixe o [Kit de Desenvolvimento](https://github.com/mercadolibre/point-mainapp-demo-android) fornecido pelo Mercado Pago. | From cf6df8dcf36290fd7aab4d1916a515d7e4dac005 Mon Sep 17 00:00:00 2001 From: Heitor Date: Thu, 7 Nov 2024 20:29:16 -0300 Subject: [PATCH 34/34] Update guides/mp-point-main-apps/prerequisites.es.md Co-authored-by: Gabrielly Pereira --- guides/mp-point-main-apps/prerequisites.es.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/mp-point-main-apps/prerequisites.es.md b/guides/mp-point-main-apps/prerequisites.es.md index 1edd439bd6..a38312c227 100644 --- a/guides/mp-point-main-apps/prerequisites.es.md +++ b/guides/mp-point-main-apps/prerequisites.es.md @@ -5,7 +5,7 @@ Antes de empezar a desarrollar tu solución, consulta las condiciones que debes | Requisitos | Descripción | |---|---| | Aplicación | Las aplicaciones son las diversas integraciones contenidas en una o varias tiendas. Puedes crear una aplicación para cada solución que implementes a fin de tener todo organizado y mantener un control que facilite la gestión. Consulta tu [Tus integraciones](/developers/es/docs/main-apps/additional-content/your-integrations/introduction) para obtener más información sobre cómo crear una aplicación. | -|Credenciales | Contraseñas únicas con las que identificamos una integración en tu cuenta. Para realizar las integraciones, necesitará del **Client ID**. [Haz clic aquí](/developers/es/docs/main-apps/additional-content/your-integrations/credentials) para obtener más información. | +|Credenciales | Contraseñas únicas con las que identificamos una integración en tu cuenta. Para realizar las integraciones, necesitará del **Client ID**. Accede a [Credenciales](/developers/es/docs/main-apps/additional-content/your-integrations/credentials) para obtener más información. | | Point Smart de Mercado Pago | [Mercado Pago Point](/developers/es/docs/mp-point/landing) es la máquina de tarjetas de Mercado Pago que permite a los compradores realizar pagos presenciales de forma rápida y segura mediante tarjetas de crédito o débito.| | Pre-configuración de dispositivos | Para que los lectores operen de **Modo integrado** y se haga la pre-configuración, comparte con Mercado Pago la cuenta que se usará para la integración, así como la configuración de cajas, tiendas y números de serie de dispositivos. | |Kit de Desarrollo | Para empezar el desarrollo, descarga el [Kit de Desarrollo](https://github.com/mercadolibre/point-mainapp-demo-android) que ofrece Mercado Pago. |