Skip to content

Commit

Permalink
feat/entry into italy (#129)
Browse files Browse the repository at this point in the history
Co-authored-by: Nicola MC <nicolamariacornelio01@gmail.com>
Co-authored-by: Kaizen <42545336+Kaizen-7@users.noreply.github.com>
  • Loading branch information
3 people committed Feb 14, 2022
1 parent 912e625 commit 70909c8
Show file tree
Hide file tree
Showing 14 changed files with 291 additions and 111 deletions.
4 changes: 2 additions & 2 deletions sdk/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -102,14 +102,14 @@ android {
buildConfigField "String", "BASE_URL", "\"https://testaka4.sogei.it/v1/dgc/\""
buildConfigField "String", "SERVER_HOST", "\"testaka4.sogei.it\""
buildConfigField "String", "CERTIFICATE_SHA", "\"sha256/R0d+cI8vTcJ3sCbpfQCH0OmdBbulPH3deYhngzOqJVA=\""
buildConfigField "String", "SDK_VERSION", "\"1.1.4\""
buildConfigField "String", "SDK_VERSION", "\"1.1.5\""
}

release {
buildConfigField "String", "BASE_URL", "\"https://get.dgc.gov.it/v1/dgc/\""
buildConfigField "String", "SERVER_HOST", "\"get.dgc.gov.it\""
buildConfigField "String", "CERTIFICATE_SHA", "\"sha256/7cZJIDPacG8FS3pq6Mvxg+7yBDM/VYc2alOcbVe/e74=\""
buildConfigField "String", "SDK_VERSION", "\"1.1.4\""
buildConfigField "String", "SDK_VERSION", "\"1.1.5\""

minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,6 @@ data class VaccinationModel(

fun isComplete(): Boolean = doseNumber >= totalSeriesOfDoses

fun isNotAllowed() = isSputnik() && !isFrom(Country.SM)

fun isNotComplete() = doseNumber < totalSeriesOfDoses

Expand All @@ -99,13 +98,8 @@ data class VaccinationModel(
}
}

private fun isFrom(country: Country) = countryOfVaccination == country.value

private fun isJansen() = medicinalProduct == MedicinalProduct.JANSEN

private fun isSputnik() = medicinalProduct == MedicinalProduct.SPUTNIK


}

data class TestModel(
Expand Down Expand Up @@ -135,6 +129,7 @@ enum class TestType(val value: String) {

enum class Country(val value: String) {
IT("IT"),
NOT_IT("NOT_IT"),
SM("SM")
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,14 @@ package it.ministerodellasalute.verificaC19sdk.model
* This enum class defines all the possible status of certifications after their verification.
*
*/
enum class CertificateStatus {
NOT_VALID,
NOT_VALID_YET,
VALID,
REVOKED,
NOT_EU_DCC,
TEST_NEEDED;
enum class CertificateStatus(val value: String) {
NOT_VALID("notValid"),
NOT_VALID_YET("notValidYet"),
VALID("valid"),
EXPIRED("expired"),
REVOKED("revoked"),
NOT_EU_DCC("notEuDCC"),
TEST_NEEDED("verificationIsNeeded");
}

fun CertificateStatus.applyFullModel(fullModel: Boolean): CertificateStatus {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,8 @@ object MedicinalProduct {
const val MODERNA = "EU/1/20/1507"
const val PFIZER = "EU/1/20/1528"
const val ASTRAZENECA = "EU/1/21/1529"
const val COVISHIELD = "Covishield"
const val R_COVI = "R-COVI"
const val COVID19_RECOMBINANT = "Covid-19-recombinant"

}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ enum class ScanMode(val value: String) {
STRENGTHENED("2G"),
BOOSTER("BOOSTED"),
SCHOOL("SCHOOL"),
WORK("WORK");
WORK("WORK"),
ENTRY_ITALY("ENTRY_ITALY");

companion object {
fun from(s: String?): ScanMode = values().find { it.value == s } ?: STANDARD
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ enum class ValidationRulesEnum(val value: String) {
RECOVERY_CERT_PV_START_DAY("recovery_pv_cert_start_day"),
RECOVERY_CERT_END_DAY("recovery_cert_end_day"),
RECOVERY_CERT_PV_END_DAY("recovery_pv_cert_end_day"),
VACCINE_END_DAY_SCHOOL("vaccine_end_day_school"),
RECOVERY_CERT_END_DAY_SCHOOL("recovery_cert_end_day_school"),
MOLECULAR_TEST_START_HOUR("molecular_test_start_hours"),
MOLECULAR_TEST_END_HOUR("molecular_test_end_hours"),
Expand All @@ -42,8 +43,6 @@ enum class ValidationRulesEnum(val value: String) {
VACCINE_START_DAY_COMPLETE("vaccine_start_day_complete"),
VACCINE_END_DAY_COMPLETE("vaccine_end_day_complete"),

VACCINE_END_DAY_SCHOOL("vaccine_end_day_school"),

VACCINE_START_DAY_COMPLETE_IT("vaccine_start_day_complete_IT"),
VACCINE_END_DAY_COMPLETE_IT("vaccine_end_day_complete_IT"),
VACCINE_START_DAY_BOOSTER_IT("vaccine_start_day_booster_IT"),
Expand All @@ -59,6 +58,9 @@ enum class ValidationRulesEnum(val value: String) {
RECOVERY_CERT_START_DAY_NOT_IT("recovery_cert_start_day_NOT_IT"),
RECOVERY_CERT_END_DAY_NOT_IT("recovery_cert_end_day_NOT_IT"),

VACCINE_END_DAY_COMPLETE_EXTENDED_EMA("vaccine_end_day_complete_extended_EMA"),
EMA_VACCINES("EMA_vaccines"),

BLACK_LIST_UVCI("black_list_uvci"),
DRL_SYNC_ACTIVE("DRL_SYNC_ACTIVE"),
MAX_RETRY("MAX_RETRY")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,14 @@ class ExemptionValidationStrategy : ValidationStrategy {
}
endDate?.let {
if (LocalDate.now().isAfter(endDate)) {
return CertificateStatus.NOT_VALID
return CertificateStatus.EXPIRED
}
}
return if (scanMode == ScanMode.BOOSTER) {
CertificateStatus.TEST_NEEDED
} else CertificateStatus.VALID
return when (scanMode) {
ScanMode.ENTRY_ITALY -> return CertificateStatus.NOT_VALID
ScanMode.BOOSTER -> return CertificateStatus.TEST_NEEDED
else -> CertificateStatus.VALID
}
} catch (e: Exception) {
return CertificateStatus.NOT_EU_DCC
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,10 @@
package it.ministerodellasalute.verificaC19sdk.model.validation

import android.util.Log
import it.ministerodellasalute.verificaC19sdk.model.ScanMode
import it.ministerodellasalute.verificaC19sdk.model.*
import it.ministerodellasalute.verificaC19sdk.util.TimeUtility.getAge
import it.ministerodellasalute.verificaC19sdk.util.TimeUtility.toLocalDate
import java.security.cert.Certificate
import it.ministerodellasalute.verificaC19sdk.util.TimeUtility.toValidDateOfBirth
import java.time.LocalDate

class RecoveryValidationStrategy : ValidationStrategy {
Expand All @@ -36,7 +36,7 @@ class RecoveryValidationStrategy : ValidationStrategy {
val scanMode = certificateModel.scanMode
val certificate = certificateModel.certificate

val countryCode = if (scanMode == ScanMode.STANDARD) recovery.country else Country.IT.value
val countryCode = if (scanMode == ScanMode.ENTRY_ITALY) recovery.country else Country.IT.value

val recoveryBis = recovery.isRecoveryBis(certificate)
val startDaysToAdd = if (recoveryBis) ruleSet.getRecoveryCertPVStartDay() else ruleSet.getRecoveryCertStartDayUnified(countryCode)
Expand All @@ -47,24 +47,17 @@ class RecoveryValidationStrategy : ValidationStrategy {
else -> ruleSet.getRecoveryCertEndDayUnified(countryCode)
}

val certificateValidUntil = recovery.certificateValidUntil.toLocalDate()
val dateOfFirstPositiveTest = recovery.dateOfFirstPositiveTest.toLocalDate().plusDays(endDaysToAdd)


try {
val startDate: LocalDate = recovery.certificateValidFrom.toLocalDate()
val startDate: LocalDate = if (scanMode == ScanMode.SCHOOL) recovery.dateOfFirstPositiveTest.toLocalDate() else recovery.certificateValidFrom.toLocalDate()


val endDate: LocalDate =
if (scanMode == ScanMode.SCHOOL)
if (certificateValidUntil.isBefore(dateOfFirstPositiveTest)) certificateValidUntil else dateOfFirstPositiveTest
else
startDate.plusDays(endDaysToAdd)
val endDate: LocalDate = startDate.plusDays(endDaysToAdd)

Log.d("RecoveryDates", "Start: $startDate End: $endDate")
return when {
LocalDate.now().isBefore(startDate.plusDays(startDaysToAdd)) -> CertificateStatus.NOT_VALID_YET
LocalDate.now().isAfter(endDate) -> CertificateStatus.NOT_VALID
else -> return if (scanMode == ScanMode.BOOSTER) CertificateStatus.TEST_NEEDED else CertificateStatus.VALID
LocalDate.now().isAfter(endDate) -> CertificateStatus.EXPIRED
else -> return if (scanMode == ScanMode.BOOSTER && !recoveryBis) CertificateStatus.TEST_NEEDED else CertificateStatus.VALID
}
} catch (e: Exception) {
return CertificateStatus.NOT_VALID
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ class RuleSet(rulesJson: String?) {
}

fun getVaccineStartDayCompleteUnified(countryCode: String, medicinalProduct: String): Long {
val daysToAdd = if (medicinalProduct == MedicinalProduct.JANSEN) 15L else 0L
val daysToAdd = if (medicinalProduct == MedicinalProduct.JANSEN) getVaccineStartDayComplete(MedicinalProduct.JANSEN) else NO_VALUE

val startDay = when (countryCode) {
Country.IT.value -> rules.find { it.name == ValidationRulesEnum.VACCINE_START_DAY_COMPLETE_IT.value }?.value?.toLong()
Expand Down Expand Up @@ -199,17 +199,28 @@ class RuleSet(rulesJson: String?) {
}

fun getRecoveryCertEndDaySchool(): Long {
return (rules.find { it.name == ValidationRulesEnum.RECOVERY_CERT_END_DAY_SCHOOL.value }?.value?.toLong()
?: NO_VALUE)
return rules.find { it.name == ValidationRulesEnum.RECOVERY_CERT_END_DAY_SCHOOL.value }?.value?.toLong()
?: NO_VALUE
}

fun getVaccineEndDaySchool(): Long {
return (rules.find { it.name == ValidationRulesEnum.VACCINE_END_DAY_SCHOOL.value }?.value?.toLong()
?: NO_VALUE)
return rules.find { it.name == ValidationRulesEnum.VACCINE_END_DAY_SCHOOL.value }?.value?.toLong()
?: NO_VALUE
}

fun hasRulesForVaccine(vaccineType: String): Boolean {
return getVaccineEndDayComplete(vaccineType) != NO_VALUE
}

fun getVaccineEndDayCompleteExtendedEMA(): Long {
return rules.find { it.name == ValidationRulesEnum.VACCINE_END_DAY_COMPLETE_EXTENDED_EMA.value }?.value?.toLong()
?: NO_VALUE
}

fun isEMA(medicinalProduct: String, countryOfVaccination: String): Boolean {
val isStandardEma = rules.find { it.name == ValidationRulesEnum.EMA_VACCINES.value }?.value?.split(";")?.contains(medicinalProduct)
// also Sputnik is EMA, but only if from San Marino
val isSpecialEma = medicinalProduct == MedicinalProduct.SPUTNIK && countryOfVaccination == Country.SM.value
return (isStandardEma ?: false) || isSpecialEma
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import android.util.Log
import it.ministerodellasalute.verificaC19sdk.model.ScanMode
import it.ministerodellasalute.verificaC19sdk.model.*
import it.ministerodellasalute.verificaC19sdk.util.TimeUtility.getAge
import it.ministerodellasalute.verificaC19sdk.util.TimeUtility.getLocalDateFromString
import it.ministerodellasalute.verificaC19sdk.util.TimeUtility.toValidDateOfBirth
import java.time.LocalDateTime
import java.time.OffsetDateTime

Expand All @@ -42,8 +42,7 @@ class TestValidationStrategy : ValidationStrategy {
override fun checkCertificate(certificateModel: CertificateModel, ruleSet: RuleSet): CertificateStatus {
val test: TestModel = certificateModel.tests!!.first()
val scanMode = certificateModel.scanMode

if (scanMode == ScanMode.BOOSTER || scanMode == ScanMode.STRENGTHENED || scanMode == ScanMode.SCHOOL) return CertificateStatus.NOT_VALID
val isTestNotAllowed = scanMode == ScanMode.BOOSTER || scanMode == ScanMode.STRENGTHENED || scanMode == ScanMode.SCHOOL

if (test.resultType == TestResult.DETECTED) {
return CertificateStatus.NOT_VALID
Expand Down Expand Up @@ -73,9 +72,10 @@ class TestValidationStrategy : ValidationStrategy {
Log.d("TestDates", "Start: $startDate End: $endDate")
return when {
LocalDateTime.now().isBefore(startDate) -> CertificateStatus.NOT_VALID_YET
LocalDateTime.now().isAfter(endDate) -> CertificateStatus.NOT_VALID
LocalDateTime.now().isAfter(endDate) -> CertificateStatus.EXPIRED
isTestNotAllowed -> CertificateStatus.NOT_VALID
else -> {
val birthDate = certificateModel.dateOfBirth?.getLocalDateFromString()
val birthDate = certificateModel.dateOfBirth?.toValidDateOfBirth()

if (birthDate?.getAge()!! >= Const.VACCINE_MANDATORY_AGE && certificateModel.scanMode == ScanMode.WORK) CertificateStatus.NOT_VALID
else CertificateStatus.VALID
Expand Down
Loading

0 comments on commit 70909c8

Please sign in to comment.