Skip to content

Commit

Permalink
feat(bank-sdk): Skonto screen. Backend Integration
Browse files Browse the repository at this point in the history
PP-480
  • Loading branch information
ndubkov-distcotech committed Jul 18, 2024
1 parent fea1e3c commit 3ae6b62
Show file tree
Hide file tree
Showing 9 changed files with 235 additions and 226 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import net.gini.android.bank.sdk.capture.digitalinvoice.DigitalInvoiceException
import net.gini.android.bank.sdk.capture.digitalinvoice.DigitalInvoiceFragment
import net.gini.android.bank.sdk.capture.digitalinvoice.DigitalInvoiceFragmentListener
import net.gini.android.bank.sdk.capture.digitalinvoice.LineItemsValidator
import net.gini.android.bank.sdk.capture.skonto.SkontoValidator
import net.gini.android.bank.sdk.capture.skonto.SkontoDataExtractor
import net.gini.android.bank.sdk.util.disallowScreenshots
import net.gini.android.capture.CaptureSDKResult
import net.gini.android.capture.Document
Expand All @@ -27,13 +27,14 @@ import net.gini.android.capture.camera.CameraFragmentListener
import net.gini.android.capture.network.model.GiniCaptureCompoundExtraction
import net.gini.android.capture.network.model.GiniCaptureSpecificExtraction
import net.gini.android.capture.internal.util.CancelListener
import java.math.BigDecimal
import java.time.LocalDate

class CaptureFlowFragment(private val openWithDocument: Document? = null) :
Fragment(),
GiniCaptureFragmentListener,
DigitalInvoiceFragmentListener,
CancelListener
{
CancelListener {

private lateinit var navController: NavController
private lateinit var captureFlowFragmentListener: CaptureFlowFragmentListener
Expand All @@ -50,7 +51,8 @@ class CaptureFlowFragment(private val openWithDocument: Document? = null) :

override fun onGetLayoutInflater(savedInstanceState: Bundle?): LayoutInflater {
val inflater = super.onGetLayoutInflater(savedInstanceState)
val contextThemeWrapper = ContextThemeWrapper(requireContext(), net.gini.android.capture.R.style.GiniCaptureTheme)
val contextThemeWrapper =
ContextThemeWrapper(requireContext(), net.gini.android.capture.R.style.GiniCaptureTheme)
return inflater.cloneInContext(contextThemeWrapper)
}

Expand All @@ -71,7 +73,8 @@ class CaptureFlowFragment(private val openWithDocument: Document? = null) :


override fun onCreate(savedInstanceState: Bundle?) {
childFragmentManager.fragmentFactory = CaptureFlowFragmentFactory(this, openWithDocument, this, this)
childFragmentManager.fragmentFactory =
CaptureFlowFragmentFactory(this, openWithDocument, this, this)
super.onCreate(savedInstanceState)
if (GiniCapture.hasInstance() && !GiniCapture.getInstance().allowScreenshots) {
requireActivity().window.disallowScreenshots()
Expand Down Expand Up @@ -128,6 +131,7 @@ class CaptureFlowFragment(private val openWithDocument: Document? = null) :
finishWithResult(result)
}
}

else -> {
didFinishWithResult = true
captureFlowFragmentListener.onFinishedWithResult(result.toCaptureResult())
Expand All @@ -138,13 +142,20 @@ class CaptureFlowFragment(private val openWithDocument: Document? = null) :
private fun tryShowingSkontoScreen(result: CaptureSDKResult.Success) {
if (GiniBank.getCaptureConfiguration()?.skontoEnabled == true) {
try {
SkontoValidator.validate(result.compoundExtractions)
navController.navigate(GiniCaptureFragmentDirections.toSkontoFragment())
val skontoData = SkontoDataExtractor.extractSkontoData(
result.specificExtractions,
result.compoundExtractions
)

navController.navigate(
GiniCaptureFragmentDirections.toSkontoFragment(data = skontoData)
)
} catch (e: Exception) {
finishWithResult(result)
}
}
}

private fun tryShowingReturnAssistant(result: CaptureSDKResult.Success) {
LineItemsValidator.validate(result.compoundExtractions)
navController.navigate(
Expand Down Expand Up @@ -192,11 +203,13 @@ class CaptureFlowFragment(private val openWithDocument: Document? = null) :
compoundExtractions: Map<String, GiniCaptureCompoundExtraction>
) {
didFinishWithResult = true
captureFlowFragmentListener.onFinishedWithResult(CaptureResult.Success(
specificExtractions,
compoundExtractions,
emptyList()
))
captureFlowFragmentListener.onFinishedWithResult(
CaptureResult.Success(
specificExtractions,
compoundExtractions,
emptyList()
)
)
}

override fun onCancelFlow() {
Expand Down Expand Up @@ -239,10 +252,12 @@ class CaptureFlowFragmentFactory(
giniCaptureFragmentListener
)
}

DigitalInvoiceFragment::class.java.name -> DigitalInvoiceFragment().apply {
listener = digitalInvoiceListener
cancelListener = cancelCallback
}

else -> super.instantiate(classLoader, className)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package net.gini.android.bank.sdk.capture.skonto

import net.gini.android.bank.sdk.capture.skonto.model.SkontoData
import net.gini.android.bank.sdk.capture.skonto.model.SkontoData.Amount
import net.gini.android.bank.sdk.capture.skonto.model.SkontoData.SkontoPaymentMethod
import net.gini.android.capture.network.model.GiniCaptureCompoundExtraction
import net.gini.android.capture.network.model.GiniCaptureExtraction
import net.gini.android.capture.network.model.GiniCaptureSpecificExtraction
import java.math.BigDecimal
import java.time.LocalDate


internal class SkontoDataExtractor {

companion object {

fun extractSkontoData(
extractions: Map<String, GiniCaptureExtraction>,
compoundExtractions: Map<String, GiniCaptureCompoundExtraction>,
): SkontoData {
val totalAmountToPay = extractions["amountToPay"]
?: throw NoSuchElementException("Field `extractions.amountToPay` is missing")

val skontoDiscountMaps = compoundExtractions["skontoDiscounts"]?.specificExtractionMaps
?: throw NoSuchElementException("Field `compoundExtractions.skontoDiscounts` is missing")

return skontoDiscountMaps.map { skontoDiscountData ->
val skontoPercentageDiscounted = skontoDiscountData.extractDataByKeys(
"skontoPercentageDiscounted",
"skontoPercentageDiscountedCalculated",
) ?: throw NoSuchElementException("Data for `PercentageDiscounted` is missing")

val skontoPaymentMethod =
skontoDiscountData.extractDataByKeys("skontoPaymentMethod")


val skontoAmountToPay = skontoDiscountData.extractDataByKeys(
"skontoAmountToPay",
"skontoAmountToPayCalculated"
) ?: throw NoSuchElementException("Skonto data for `AmountToPay` is missing")

val skontoRemainingDays = skontoDiscountData.extractDataByKeys(
"skontoRemainingDays",
"skontoRemainingDaysCalculated"
) ?: throw NoSuchElementException("Skonto data for `RemainingDays` is missing")

val skontoDueDate = skontoDiscountData.extractDataByKeys(
"skontoDueDate",
"skontoDueDateCalculated"
) ?: throw NoSuchElementException("Skonto data for `DueDate` is missing")

val skontoAmountDiscounted = skontoDiscountData.extractDataByKeys(
"skontoAmountDiscounted",
"skontoAmountDiscountedCalculated"
)

SkontoData(
skontoPercentageDiscounted = BigDecimal(skontoPercentageDiscounted.value),
skontoAmountToPay = Amount.parse(skontoAmountToPay.value),
fullAmountToPay = Amount.parse(totalAmountToPay.value),
skontoRemainingDays = skontoRemainingDays.value.toInt(),
skontoDueDate = skontoDueDate.value.let(LocalDate::parse),
skontoPaymentMethod = skontoPaymentMethod?.let { SkontoPaymentMethod.valueOf(it.value) }
)
}.first()
}
}
}

fun Map<String, GiniCaptureSpecificExtraction>.extractDataByKeys(vararg keys: String) =
keys.firstNotNullOfOrNull { this[it] }

This file was deleted.

Loading

0 comments on commit 3ae6b62

Please sign in to comment.