From 6a41b02c0774c5e632c95b428112f8b1cefb44d9 Mon Sep 17 00:00:00 2001 From: "v.drebnev" Date: Wed, 25 Mar 2026 15:23:10 +0500 Subject: [PATCH 01/17] =?UTF-8?q?MRK-5213=20=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20API=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20=D0=BC=D0=B0?= =?UTF-8?q?=D1=80=D0=BE=D0=BA=20=D0=B2=20=D0=95=D0=A1=D0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- gradlew | 0 .../evotor/integrations/ITsPioTService.aidl | 11 + .../evotor/integrations/model/ClientInfo.aidl | 3 + .../evotor/integrations/result/CodeCheck.aidl | 3 + .../integrations/result/CodesCheck.aidl | 3 + .../integrations/result/CodesCheckResult.aidl | 3 + .../result/IntegrationCallback.aidl | 9 + .../integrations/result/IntegrationError.aidl | 3 + .../result/IntegrationResult.aidl | 3 + .../evotor/integrations/result/KktInfo.aidl | 3 + .../evotor/integrations/model/ClientInfo.java | 53 ++ .../evotor/integrations/result/CodeCheck.java | 534 ++++++++++++++++++ .../integrations/result/CodesCheck.java | 122 ++++ .../integrations/result/CodesCheckResult.java | 39 ++ .../integrations/result/IntegrationError.java | 46 ++ .../result/IntegrationResult.java | 66 +++ .../evotor/integrations/result/KktInfo.java | 83 +++ .../result/VariableExpiration.java | 46 ++ .../result/VariableExpirations.java | 40 ++ 20 files changed, 1071 insertions(+), 1 deletion(-) mode change 100644 => 100755 gradlew create mode 100644 src/main/aidl/ru/evotor/integrations/ITsPioTService.aidl create mode 100644 src/main/aidl/ru/evotor/integrations/model/ClientInfo.aidl create mode 100644 src/main/aidl/ru/evotor/integrations/result/CodeCheck.aidl create mode 100644 src/main/aidl/ru/evotor/integrations/result/CodesCheck.aidl create mode 100644 src/main/aidl/ru/evotor/integrations/result/CodesCheckResult.aidl create mode 100644 src/main/aidl/ru/evotor/integrations/result/IntegrationCallback.aidl create mode 100644 src/main/aidl/ru/evotor/integrations/result/IntegrationError.aidl create mode 100644 src/main/aidl/ru/evotor/integrations/result/IntegrationResult.aidl create mode 100644 src/main/aidl/ru/evotor/integrations/result/KktInfo.aidl create mode 100644 src/main/java/ru/evotor/integrations/model/ClientInfo.java create mode 100644 src/main/java/ru/evotor/integrations/result/CodeCheck.java create mode 100644 src/main/java/ru/evotor/integrations/result/CodesCheck.java create mode 100644 src/main/java/ru/evotor/integrations/result/CodesCheckResult.java create mode 100644 src/main/java/ru/evotor/integrations/result/IntegrationError.java create mode 100644 src/main/java/ru/evotor/integrations/result/IntegrationResult.java create mode 100644 src/main/java/ru/evotor/integrations/result/KktInfo.java create mode 100644 src/main/java/ru/evotor/integrations/result/VariableExpiration.java create mode 100644 src/main/java/ru/evotor/integrations/result/VariableExpirations.java diff --git a/build.gradle b/build.gradle index ad5d25a90e..0f642108f8 100644 --- a/build.gradle +++ b/build.gradle @@ -123,7 +123,7 @@ publishing { mavenKotlin(MavenPublication) { groupId 'com.github.evotor' artifactId "integration-library" - version "STDEV-13213" + version "STDEV-13213-SNAPHOT" artifact(sourceJar) artifact(javadocJar) artifact "${project.buildDir}/outputs/aar/${project.archivesBaseName}-release.aar" diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/src/main/aidl/ru/evotor/integrations/ITsPioTService.aidl b/src/main/aidl/ru/evotor/integrations/ITsPioTService.aidl new file mode 100644 index 0000000000..74e4be6d0a --- /dev/null +++ b/src/main/aidl/ru/evotor/integrations/ITsPioTService.aidl @@ -0,0 +1,11 @@ +package ru.evotor.integrations; + +import ru.evotor.integrations.result.IntegrationCallback; +import ru.evotor.integrations.model.ClientInfo; + +interface ITsPioTService { + + void getKktInfo(in IntegrationCallback callback); + + void checkMarks(in List codes, in ClientInfo clientInfo, in IntegrationCallback callback); +} \ No newline at end of file diff --git a/src/main/aidl/ru/evotor/integrations/model/ClientInfo.aidl b/src/main/aidl/ru/evotor/integrations/model/ClientInfo.aidl new file mode 100644 index 0000000000..0be3e42e6e --- /dev/null +++ b/src/main/aidl/ru/evotor/integrations/model/ClientInfo.aidl @@ -0,0 +1,3 @@ +package ru.evotor.integrations.model; + +parcelable ClientInfo; \ No newline at end of file diff --git a/src/main/aidl/ru/evotor/integrations/result/CodeCheck.aidl b/src/main/aidl/ru/evotor/integrations/result/CodeCheck.aidl new file mode 100644 index 0000000000..c393569932 --- /dev/null +++ b/src/main/aidl/ru/evotor/integrations/result/CodeCheck.aidl @@ -0,0 +1,3 @@ +package ru.evotor.integrations.result; + +parcelable CodeCheck; \ No newline at end of file diff --git a/src/main/aidl/ru/evotor/integrations/result/CodesCheck.aidl b/src/main/aidl/ru/evotor/integrations/result/CodesCheck.aidl new file mode 100644 index 0000000000..68d03a6579 --- /dev/null +++ b/src/main/aidl/ru/evotor/integrations/result/CodesCheck.aidl @@ -0,0 +1,3 @@ +package ru.evotor.integrations.result; + +parcelable CodesCheck; \ No newline at end of file diff --git a/src/main/aidl/ru/evotor/integrations/result/CodesCheckResult.aidl b/src/main/aidl/ru/evotor/integrations/result/CodesCheckResult.aidl new file mode 100644 index 0000000000..cb429fb03e --- /dev/null +++ b/src/main/aidl/ru/evotor/integrations/result/CodesCheckResult.aidl @@ -0,0 +1,3 @@ +package ru.evotor.integrations.result; + +parcelable CodesCheckResult; \ No newline at end of file diff --git a/src/main/aidl/ru/evotor/integrations/result/IntegrationCallback.aidl b/src/main/aidl/ru/evotor/integrations/result/IntegrationCallback.aidl new file mode 100644 index 0000000000..d3f87ea98e --- /dev/null +++ b/src/main/aidl/ru/evotor/integrations/result/IntegrationCallback.aidl @@ -0,0 +1,9 @@ +package ru.evotor.integrations.result; + +import ru.evotor.integrations.result.IntegrationResult; +import ru.evotor.integrations.result.IntegrationError; + +interface IntegrationCallback { + void onSuccess(in IntegrationResult result); + void onFailure(in IntegrationError error); +} \ No newline at end of file diff --git a/src/main/aidl/ru/evotor/integrations/result/IntegrationError.aidl b/src/main/aidl/ru/evotor/integrations/result/IntegrationError.aidl new file mode 100644 index 0000000000..f40c94a8d1 --- /dev/null +++ b/src/main/aidl/ru/evotor/integrations/result/IntegrationError.aidl @@ -0,0 +1,3 @@ +package ru.evotor.integrations.result; + +parcelable IntegrationError; \ No newline at end of file diff --git a/src/main/aidl/ru/evotor/integrations/result/IntegrationResult.aidl b/src/main/aidl/ru/evotor/integrations/result/IntegrationResult.aidl new file mode 100644 index 0000000000..289367a938 --- /dev/null +++ b/src/main/aidl/ru/evotor/integrations/result/IntegrationResult.aidl @@ -0,0 +1,3 @@ +package ru.evotor.integrations.result; + +parcelable IntegrationResult; \ No newline at end of file diff --git a/src/main/aidl/ru/evotor/integrations/result/KktInfo.aidl b/src/main/aidl/ru/evotor/integrations/result/KktInfo.aidl new file mode 100644 index 0000000000..0015cf8b15 --- /dev/null +++ b/src/main/aidl/ru/evotor/integrations/result/KktInfo.aidl @@ -0,0 +1,3 @@ +package ru.evotor.integrations.result; + +parcelable KktInfo; \ No newline at end of file diff --git a/src/main/java/ru/evotor/integrations/model/ClientInfo.java b/src/main/java/ru/evotor/integrations/model/ClientInfo.java new file mode 100644 index 0000000000..721c7aa0af --- /dev/null +++ b/src/main/java/ru/evotor/integrations/model/ClientInfo.java @@ -0,0 +1,53 @@ +package ru.evotor.integrations.model; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * Информация об интеграционном приложении (ПСМР, стороннее кассовое ПО) + */ +public class ClientInfo implements Parcelable { + + /** Наименование приложения */ + public final String name; + + /** Версия приложения */ + public final String version; + + /** Контрольная сумма/ЭЦП исполняемого файла ПМСР (кассового ПО) */ + public final String token; + + private ClientInfo(Parcel parcel) { + this.name = parcel.readString(); + this.version = parcel.readString(); + this.token = parcel.readString(); + } + + public ClientInfo(String name, String version, String token) { + this.name = name; + this.version = version; + this.token = token; + } + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(Parcel parcel, int flags) { + parcel.writeString(name); + parcel.writeString(version); + parcel.writeString(token); + } + + public static final Creator CREATOR = new Creator<>() { + @Override + public ClientInfo createFromParcel(Parcel parcel) { + return new ClientInfo(parcel); + } + + @Override + public ClientInfo[] newArray(int i) { + return new ClientInfo[0]; + } + }; +} diff --git a/src/main/java/ru/evotor/integrations/result/CodeCheck.java b/src/main/java/ru/evotor/integrations/result/CodeCheck.java new file mode 100644 index 0000000000..1ecb9606b3 --- /dev/null +++ b/src/main/java/ru/evotor/integrations/result/CodeCheck.java @@ -0,0 +1,534 @@ +package ru.evotor.integrations.result; + +import android.os.Parcel; +import android.os.Parcelable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +public class CodeCheck implements Parcelable { + + /** КИ / КиЗ из запроса */ + private final String cis; + + /** Признак наличия кода в ГИС МТ */ + private final boolean found; + + /** Результат проверки валидности структуры КИ / КиЗ */ + private final boolean valid; + + /** КИ без крипто-подписи / КиЗ */ + private final String printView; + + /** Код товара */ + private final String gtin; + + /** Массив идентификаторов товарных групп */ + private final int[] groupIds; + + /** Результат проверки крипто-подписи КМ */ + private final boolean verified; + + /** Признак возможности реализации КИ / КиЗ */ + private final boolean realizable; + + /** Признак нанесения КИ / КиЗ на упаковку */ + private final boolean utilized; + + /** Дата и время истечения срока годности */ + @Nullable private final String expireDate; + + /** Информация о вариативном сроке годности */ + @Nullable private final VariableExpirations variableExpirations; + + /** Дата производства продукции */ + @Nullable private final String productionDate; + + /** Переменный вес продукции (в граммах) */ + @Nullable private final Integer productWeight; + + /** Производственный ветеринарный сопроводительный документ */ + @Nullable private final String prVetDocument; + + /** Признак, определяющий, что запрос направлен владельцем кода (определяется по аутентификационному токену) */ + @Nullable private final Boolean isOwner; + + /** Признак того, что розничная продажа продукции заблокирована по решению ОГВ */ + @Nullable private final Boolean isBlocked; + + /** Органы государственной власти, установившие блокировку на КИ */ + private final OGVS[] ogvs; + + /** Сообщение об ошибке */ + @Nullable private final String message; + + /** + * Код ошибки + *
    + * Возможные значения: + *
      + *
    • 0 — ошибки отсутствуют
    • + *
    • 1 — ошибка валидации КМ
    • + *
    • 2 — КМ не содержит GTIN
    • + *
    • 3 — КМ не содержит серийный номер
    • + *
    • 4 — КМ содержит недопустимые символы
    • + *
    • 5 — ошибка верификации крипто-подписи КМ (формат крипто-подписи не соответствует типу КМ)
    • + *
    • 6 — ошибка верификации крипто-подписи КМ (криптоподпись невалидная)
    • + *
    • 7 — ошибка верификации крипто-подписи КМ (крипто-ключ не валиден)
    • + *
    • 8 — КМ не прошел верификацию в стране эмитента
    • + *
    • 9 — Найденные AI в КМ не поддерживаются
    • + *
    • 10 — КМ не найден в ГИС МТ
    • + *
    • 11 — КМ не найден в трансгране
    • + *
    + *
+ */ + @Nullable private final Integer errorCode; + + /** Признак контроля прослеживаемости в товарной группе */ + private final boolean isTracking; + + /** Признак продажи товара */ + private final boolean sold; + + /** Признак использования причин выбытия, разрешающих продажу КМ */ + @Nullable private final EliminationState eliminationState; + + /** Максимальная розничная цена */ + @Nullable private final Integer mrp; + + /** Единая минимальная цена (ЕМЦ) */ + @Nullable private final Integer smp; + + /** Признак принадлежности табачной продукции к «серой зоне» */ + @Nullable private final Boolean grayZone; + + /** + * Количество единиц товара в потребительской упаковке / Фактический объём / Фактический вес + */ + @Nullable private final Integer innerUnitCount; + + /** Счётчик проданного и возвращённого товара */ + @Nullable private final Integer soldUnitCount; + + /** Тип упаковки */ + private final String packageType; + + /** КИ агрегата */ + @Nullable private final String parent; + + /** ИНН производителя */ + @Nullable private final String producerInn; + + /** Номер производственной серии */ + @Nullable private final String productionSerialNumber; + + /** Номер производственной партии */ + @Nullable private final String productionBatchNumber; + + /** Заводской серийный номер */ + @Nullable private final String factorySerialNumber; + + /** Ёмкость КИГУ */ + @Nullable private final Integer packageQuantity; + + private CodeCheck(Parcel parcel) { + this.cis = parcel.readString(); + this.found = parcel.readBoolean(); + this.valid = parcel.readBoolean(); + this.printView = parcel.readString(); + this.gtin = parcel.readString(); + this.groupIds = parcel.createIntArray(); + this.verified = parcel.readBoolean(); + this.realizable = parcel.readBoolean(); + this.utilized = parcel.readBoolean(); + this.expireDate = parcel.readString(); + this.variableExpirations = parcel.readTypedObject(VariableExpirations.CREATOR); + this.productionDate = parcel.readString(); + this.productWeight = readInteger(parcel); + this.prVetDocument = parcel.readString(); + this.isOwner = readBoolean(parcel); + this.isBlocked = readBoolean(parcel); + this.ogvs = parcel.createTypedArray(OGVS.CREATOR); + this.message = parcel.readString(); + this.errorCode = readInteger(parcel); + this.isTracking = parcel.readBoolean(); + this.sold = parcel.readBoolean(); + String eliminationStateName = parcel.readString(); + this.eliminationState = eliminationStateName != null ? EliminationState.valueOf(eliminationStateName) : null; + this.mrp = readInteger(parcel); + this.smp = readInteger(parcel); + this.grayZone = readBoolean(parcel); + this.innerUnitCount = readInteger(parcel); + this.soldUnitCount = readInteger(parcel); + this.packageType = parcel.readString(); + this.parent = parcel.readString(); + this.producerInn = parcel.readString(); + this.productionSerialNumber = parcel.readString(); + this.productionBatchNumber = parcel.readString(); + this.factorySerialNumber = parcel.readString(); + this.packageQuantity = readInteger(parcel); + } + + public CodeCheck( + String cis, + Boolean found, + Boolean valid, + String printView, + String gtin, + int[] groupIds, + Boolean verified, + Boolean realizable, + Boolean utilized, + @Nullable String expireDate, + @Nullable VariableExpirations variableExpirations, + @Nullable String productionDate, + @Nullable Integer productWeight, + @Nullable String prVetDocument, + @Nullable Boolean isOwner, + @Nullable Boolean isBlocked, + @Nullable OGVS[] ogvs, + @Nullable String message, + @Nullable Integer errorCode, + Boolean isTracking, + Boolean sold, + @Nullable EliminationState eliminationState, + @Nullable Integer mrp, + @Nullable Integer smp, + @Nullable Boolean grayZone, + @Nullable Integer innerUnitCount, + @Nullable Integer soldUnitCount, + String packageType, + @Nullable String parent, + @Nullable String producerInn, + @Nullable String productionSerialNumber, + @Nullable String productionBatchNumber, + @Nullable String factorySerialNumber, + @Nullable Integer packageQuantity + ) { + this.cis = cis; + this.found = found; + this.valid = valid; + this.printView = printView; + this.gtin = gtin; + this.groupIds = groupIds; + this.verified = verified; + this.realizable = realizable; + this.utilized = utilized; + this.expireDate = expireDate; + this.variableExpirations = variableExpirations; + this.productionDate = productionDate; + this.productWeight = productWeight; + this.prVetDocument = prVetDocument; + this.isOwner = isOwner; + this.isBlocked = isBlocked; + this.ogvs = ogvs == null ? new OGVS[0] : ogvs; + this.message = message; + this.errorCode = errorCode; + this.isTracking = isTracking; + this.sold = sold; + this.eliminationState = eliminationState; + this.mrp = mrp; + this.smp = smp; + this.grayZone = grayZone; + this.innerUnitCount = innerUnitCount; + this.soldUnitCount = soldUnitCount; + this.packageType = packageType; + this.parent = parent; + this.producerInn = producerInn; + this.productionSerialNumber = productionSerialNumber; + this.productionBatchNumber = productionBatchNumber; + this.factorySerialNumber = factorySerialNumber; + this.packageQuantity = packageQuantity; + } + + public String getCis() { return cis; } + + public boolean isFound() { return found; } + + @Nullable + public Boolean getGrayZone() { return grayZone; } + + @Nullable + public Boolean getOwner() { return isOwner; } + + public boolean isRealizable() { return realizable; } + + public boolean isSold() { return sold; } + + public boolean isTracking() { return isTracking; } + + public boolean isUtilized() { return utilized; } + + public boolean isValid() { return valid; } + + public boolean isVerified() { return verified; } + + @Nullable + public EliminationState getEliminationState() { return eliminationState; } + + public int[] getGroupIds() { return groupIds; } + + @Nullable + public Integer getErrorCode() { return errorCode; } + + @Nullable + public Integer getInnerUnitCount() { return innerUnitCount; } + + @Nullable + public Integer getMrp() { return mrp; } + + @Nullable + public Integer getPackageQuantity() { return packageQuantity; } + + @Nullable + public Integer getProductWeight() { return productWeight; } + + @Nullable + public Integer getSmp() { return smp; } + + @Nullable + public Integer getSoldUnitCount() { return soldUnitCount; } + + @Nullable + public VariableExpirations getVariableExpirations() { return variableExpirations; } + + @Nullable + public OGVS[] getOgvs() { return ogvs; } + + @Nullable + public String getExpireDate() { return expireDate; } + + @Nullable + public String getFactorySerialNumber() { return factorySerialNumber; } + + public String getGtin() { return gtin; } + + @Nullable + public String getMessage() { return message; } + + public String getPackageType() { return packageType; } + + @Nullable + public String getParent() { return parent; } + + public String getPrintView() { return printView; } + + @Nullable + public String getProducerInn() { return producerInn; } + + @Nullable + public String getProductionBatchNumber() { return productionBatchNumber; } + + @Nullable + public String getProductionDate() { return productionDate; } + + @Nullable + public String getProductionSerialNumber() { return productionSerialNumber; } + + @Nullable + public String getPrVetDocument() { return prVetDocument; } + + @Nullable + public Boolean getBlocked() { return isBlocked; } + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(Parcel parcel, int flags) { + parcel.writeString(cis); + parcel.writeBoolean(found); + parcel.writeBoolean(valid); + parcel.writeString(printView); + parcel.writeString(gtin); + parcel.writeIntArray(groupIds); + parcel.writeBoolean(verified); + parcel.writeBoolean(realizable); + parcel.writeBoolean(utilized); + parcel.writeString(expireDate); + parcel.writeTypedObject(this.variableExpirations, flags); + parcel.writeString(productionDate); + parcel.writeValue(productWeight); + parcel.writeString(prVetDocument); + parcel.writeValue(isOwner); + parcel.writeValue(isBlocked); + parcel.writeTypedArray(ogvs, flags); + parcel.writeString(message); + parcel.writeValue(errorCode); + parcel.writeBoolean(isTracking); + parcel.writeBoolean(sold); + parcel.writeString(eliminationState != null ? eliminationState.name() : null); + parcel.writeValue(mrp); + parcel.writeValue(smp); + parcel.writeValue(grayZone); + parcel.writeValue(innerUnitCount); + parcel.writeValue(soldUnitCount); + parcel.writeString(packageType); + parcel.writeString(parent); + parcel.writeString(producerInn); + parcel.writeString(productionSerialNumber); + parcel.writeString(productionBatchNumber); + parcel.writeString(factorySerialNumber); + parcel.writeValue(packageQuantity); + } + + public static final Creator CREATOR = new Creator<>() { + @Override + public CodeCheck createFromParcel(Parcel parcel) { + return new CodeCheck(parcel); + } + + @Override + public CodeCheck[] newArray(int i) { + return new CodeCheck[i]; + } + }; + + /** + *
    + *
  • RAR — Росалкогольтабакконтроль;
  • + *
  • FTS — ФТС России;
  • + *
  • FNS — ФНС России;
  • + *
  • RSHN — Россельхознадзор;
  • + *
  • RPN — Роспотребнадзор;
  • + *
  • MVD — МВД России;
  • + *
  • RZN — Росздравнадзор
  • + *
+ */ + public enum OGVS implements Parcelable { + RAR, FTS, FNS, RSHN, RPN, MVD, RZN; + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(Parcel parcel, int i) { + parcel.writeString(this.name()); + } + + public static Creator CREATOR = new Creator<>() { + @Override + public OGVS createFromParcel(Parcel parcel) { + try { + return OGVS.valueOf(parcel.readString()); + } catch (Exception ex) { + return null; + } + } + + @Override + public OGVS[] newArray(int i) { + return new OGVS[0]; + } + }; + } + + /** + *
    + *
  • «BY_SAMPLES» («Продажа по образцам»)
  • + *
  • «DISTANCE» («Дистанционная продажа»)
  • + *
  • «OWN_USE» («Использование для собственных нужд»)
  • + *
  • «PRODUCTION_USE» («Использование для производственных целей»)
  • + *
+ */ + public enum EliminationState { + BY_SAMPLES, DISTANCE, OWN_USE, PRODUCTION_USE + } + + @Nullable + private Integer readInteger(Parcel parcel) { + try { + return (Integer) parcel.readValue(Integer.class.getClassLoader()); + } catch (Exception ex) { + return null; + } + } + + @Nullable + private Boolean readBoolean(Parcel parcel) { + try { + return (Boolean) parcel.readValue(Boolean.class.getClassLoader()); + } catch (Exception ex) { + return null; + } + } + + @NonNull + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("Cis: ").append(cis).append("\n"); + builder.append("IsFound: ").append(found).append("\n"); + builder.append("IsValid: ").append(valid).append("\n"); + builder.append("PrintView").append(printView).append("\n"); + builder.append("Gtin: ").append(gtin).append("\n"); + builder.append("GroupIds: "); + if (groupIds == null || groupIds.length == 0) { + builder.append("null\n"); + } else { + for (int i = 0; i < groupIds.length; i++) { + builder.append(groupIds[i]); + + if (i != groupIds.length - 1) { + builder.append(", "); + } + } + builder.append("\n"); + } + builder.append("IsVerified: ").append(verified).append("\n"); + builder.append("IsRealizable: ").append(realizable).append("\n"); + builder.append("IsUtilized: ").append(utilized).append("\n"); + builder.append("ExpireDate: ").append(expireDate).append("\n"); + builder.append("VariableExpirations: "); + if (variableExpirations == null || variableExpirations.getExpirations().length == 0) { + builder.append("null\n"); + } else { + VariableExpiration[] expirations = variableExpirations.getExpirations(); + for (int i = 0; i < expirations.length; i++) { + int first = expirations[i].getDegrees(); + String second = expirations[i].getDate(); + builder.append(first).append(":").append(second); + + if (i != variableExpirations.getExpirations().length - 1) { + builder.append(", "); + } + } + builder.append("\n"); + } + builder.append("ProductionDate: ").append(productionDate).append("\n"); + builder.append("ProductWeight: ").append(productWeight).append("\n"); + builder.append("PrVetDocument: ").append(prVetDocument).append("\n"); + builder.append("IsOwner: ").append(isOwner).append("\n"); + builder.append("IsBlocked: ").append(isBlocked).append("\n"); + builder.append("Ogvs: "); + if (ogvs.length == 0) { + builder.append("null\n"); + } else { + for (int i = 0; i < ogvs.length; i++) { + builder.append(ogvs[i]); + + if (i != ogvs.length - 1) { + builder.append(", "); + } + } + builder.append("\n"); + } + builder.append("Message: ").append(message).append("\n"); + builder.append("ErrorCode: ").append(errorCode).append("\n"); + builder.append("IsTracking: ").append(isTracking).append("\n"); + builder.append("IsSold: ").append(sold).append("\n"); + builder.append("EliminationState: ").append(eliminationState).append("\n"); + builder.append("Mrp: ").append(mrp).append("\n"); + builder.append("Smp: ").append(smp).append("\n"); + builder.append("IsGrayZone: ").append(grayZone).append("\n"); + builder.append("InnerUnitCount: ").append(innerUnitCount).append("\n"); + builder.append("SoldUnitCount: ").append(soldUnitCount).append("\n"); + builder.append("PackageType: ").append(packageType).append("\n"); + builder.append("Parent: ").append(parent).append("\n"); + builder.append("ProducerInn: ").append(producerInn).append("\n"); + builder.append("ProductionSerialNumber: ").append(productionSerialNumber).append("\n"); + builder.append("ProductionBatchNumber: ").append(productionBatchNumber).append("\n"); + builder.append("FactorySerialNumber: ").append(factorySerialNumber).append("\n"); + builder.append("PackageQuantity: ").append(packageQuantity).append("\n"); + return builder.toString(); + } +} diff --git a/src/main/java/ru/evotor/integrations/result/CodesCheck.java b/src/main/java/ru/evotor/integrations/result/CodesCheck.java new file mode 100644 index 0000000000..5358ce1968 --- /dev/null +++ b/src/main/java/ru/evotor/integrations/result/CodesCheck.java @@ -0,0 +1,122 @@ +package ru.evotor.integrations.result; + +import android.os.Parcel; +import android.os.Parcelable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import java.util.List; + +public class CodesCheck implements Parcelable { + + private final int code; + + /** Текстовое описание результата выполнения метода */ + @Nullable private final String description; + + /** Результат проверки марок*/ + private final List codes; + + /** Уникальный идентификатор запроса */ + private final String reqId; + + /** Дата и время формирования запроса (в UTC) */ + private final long reqTimestamp; + + /** Признак проверки марки в оффлайн режиме. */ + private final boolean isCheckedOffline; + + /** Версия ЛМ ЧЗ */ + @Nullable private final String version; + + @Nullable private final String inst; + + private CodesCheck(Parcel parcel) { + this.code = parcel.readInt(); + this.description = parcel.readString(); + this.codes = parcel.createTypedArrayList(CodeCheck.CREATOR); + this.reqId = parcel.readString(); + this.reqTimestamp = parcel.readLong(); + this.isCheckedOffline = parcel.readBoolean(); + this.version = parcel.readString(); + this.inst = parcel.readString(); + } + + public CodesCheck( + int code, + @Nullable String description, + List codes, + String reqId, + long reqTimestamp, + boolean isCheckedOffline, + @Nullable String version, + @Nullable String inst + ) { + this.code = code; + this.description = description; + this.codes = codes; + this.reqId = reqId; + this.reqTimestamp = reqTimestamp; + this.isCheckedOffline = isCheckedOffline; + this.version = version; + this.inst = inst; + } + + public int getCode() { return code; } + + @Nullable + public String getDescription() { return description; } + + public List getCodes() { return codes; } + + public String getReqId() { return reqId; } + + public long getReqTimestamp() { return reqTimestamp; } + + public boolean isCheckedOffline() { return isCheckedOffline; } + + @Nullable + public String getVersion() { return version; } + + @Nullable + public String getInst() { return inst; } + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(Parcel parcel, int i) { + parcel.writeInt(code); + parcel.writeString(description); + parcel.writeTypedList(codes); + parcel.writeString(reqId); + parcel.writeLong(reqTimestamp); + parcel.writeBoolean(isCheckedOffline); + parcel.writeString(version); + parcel.writeString(inst); + } + + public static final Creator CREATOR = new Creator<>() { + @Override + public CodesCheck createFromParcel(Parcel parcel) { + return new CodesCheck(parcel); + } + + @Override + public CodesCheck[] newArray(int i) { + return new CodesCheck[i]; + } + }; + + @NonNull + @Override + public String toString() { + return "Code: " + code + "\n" + + "Description: " + description + "\n" + + "Codes: " + (codes != null ? codes.toString() : "[]") + "\n" + + "ReqId: " + reqId + "\n" + + "ReqTimestamp: " + reqTimestamp + "\n" + + "IsCheckedOffline: " + isCheckedOffline + "\n" + + "Version: " + version + "\n" + + "Inst: " + inst + "\n"; + } +} diff --git a/src/main/java/ru/evotor/integrations/result/CodesCheckResult.java b/src/main/java/ru/evotor/integrations/result/CodesCheckResult.java new file mode 100644 index 0000000000..a1d594f391 --- /dev/null +++ b/src/main/java/ru/evotor/integrations/result/CodesCheckResult.java @@ -0,0 +1,39 @@ +package ru.evotor.integrations.result; + +import android.os.Parcel; +import android.os.Parcelable; + +public class CodesCheckResult implements Parcelable { + + private final CodesCheck[] codesChecks; + + private CodesCheckResult(Parcel parcel) { + this.codesChecks = parcel.createTypedArray(CodesCheck.CREATOR); + } + + public CodesCheckResult(CodesCheck[] codesChecks) { + this.codesChecks = codesChecks; + } + + public CodesCheck[] getCodesChecks() { return codesChecks; } + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(Parcel parcel, int flags) { + parcel.writeTypedArray(codesChecks, flags); + } + + public static Creator CREATOR = new Creator<>() { + @Override + public CodesCheckResult createFromParcel(Parcel parcel) { + return new CodesCheckResult(parcel); + } + + @Override + public CodesCheckResult[] newArray(int i) { + return new CodesCheckResult[0]; + } + }; +} diff --git a/src/main/java/ru/evotor/integrations/result/IntegrationError.java b/src/main/java/ru/evotor/integrations/result/IntegrationError.java new file mode 100644 index 0000000000..58c65f70d0 --- /dev/null +++ b/src/main/java/ru/evotor/integrations/result/IntegrationError.java @@ -0,0 +1,46 @@ +package ru.evotor.integrations.result; + +import android.os.Parcel; +import android.os.Parcelable; + +public class IntegrationError implements Parcelable { + + private final int code; + + private final String message; + + private IntegrationError(Parcel parcel) { + this.code = parcel.readInt(); + this.message = parcel.readString(); + } + + public IntegrationError(int code, String message) { + this.code = code; + this.message = message; + } + + public int getCode() { return code; } + + public String getMessage() { return message; } + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(Parcel parcel, int flags) { + parcel.writeInt(code); + parcel.writeString(message); + } + + public static final Creator CREATOR = new Creator<>() { + @Override + public IntegrationError createFromParcel(Parcel parcel) { + return new IntegrationError(parcel); + } + + @Override + public IntegrationError[] newArray(int i) { + return new IntegrationError[0]; + } + }; +} diff --git a/src/main/java/ru/evotor/integrations/result/IntegrationResult.java b/src/main/java/ru/evotor/integrations/result/IntegrationResult.java new file mode 100644 index 0000000000..1473b8256c --- /dev/null +++ b/src/main/java/ru/evotor/integrations/result/IntegrationResult.java @@ -0,0 +1,66 @@ +package ru.evotor.integrations.result; + +import android.os.Parcel; +import android.os.Parcelable; +import androidx.annotation.Nullable; +import java.io.Serializable; + +public class IntegrationResult implements Parcelable { + + private final Class classType; + + private final T data; + + private IntegrationResult(Parcel parcel) { + this.classType = upcastClassType(parcel.readSerializable()); + this.data = parseData(classType, parcel); + } + + @SuppressWarnings("unchecked") + @Nullable + private Class upcastClassType(Serializable serializable) { + try { + return (Class) serializable; + } catch (Exception exception) { + return null; + } + } + + @Nullable + private T parseData(Class classType, Parcel parcel) { + try { + return parcel.readParcelable(classType.getClassLoader()); + } catch (Exception exception) { + return null; + } + } + + @SuppressWarnings("unchecked") + public IntegrationResult(T data) { + this.classType = (Class) data.getClass(); + this.data = data; + } + + public T getData() { return data; } + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(Parcel parcel, int flags) { + parcel.writeSerializable(classType); + parcel.writeParcelable(data, flags); + } + + public static final Creator> CREATOR = new Creator<>() { + @Override + public IntegrationResult createFromParcel(Parcel parcel) { + return new IntegrationResult<>(parcel); + } + + @Override + public IntegrationResult[] newArray(int i) { + return new IntegrationResult[0]; + } + }; +} diff --git a/src/main/java/ru/evotor/integrations/result/KktInfo.java b/src/main/java/ru/evotor/integrations/result/KktInfo.java new file mode 100644 index 0000000000..f60c19097d --- /dev/null +++ b/src/main/java/ru/evotor/integrations/result/KktInfo.java @@ -0,0 +1,83 @@ +package ru.evotor.integrations.result; + +import android.os.Parcel; +import android.os.Parcelable; + +import androidx.annotation.NonNull; + +public class KktInfo implements Parcelable { + + /** Идентификатор ТС ПИоТ */ + private final String tspiotId; + + /** ЗН ККТ */ + private final String kktSerial; + + /** ЗН ФН */ + private final String fnSerial; + + /** ИНН ККТ */ + private final String kktInn; + + /** Время проверки кода в ТС ПИоТ */ + private final String codesCheckTimeOut; + + public KktInfo(String tspiotId, String kktSerial, String fnSerial, String kktInn, String codesCheckTimeOut) { + this.tspiotId = tspiotId; + this.kktSerial = kktSerial; + this.fnSerial = fnSerial; + this.kktInn = kktInn; + this.codesCheckTimeOut = codesCheckTimeOut; + } + + private KktInfo(Parcel parcel) { + this.tspiotId = parcel.readString(); + this.kktSerial = parcel.readString(); + this.fnSerial = parcel.readString(); + this.kktInn = parcel.readString(); + this.codesCheckTimeOut = parcel.readString(); + } + + public String getTspiotId() { return tspiotId; } + + public String getKktSerial() {return kktSerial; } + + public String getFnSerial() { return fnSerial; } + + public String getKktInn() { return kktInn; } + + public String getCodesCheckTimeOut() { return codesCheckTimeOut; } + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(Parcel parcel, int i) { + parcel.writeString(tspiotId); + parcel.writeString(kktSerial); + parcel.writeString(fnSerial); + parcel.writeString(kktInn); + parcel.writeString(codesCheckTimeOut); + } + + public static final Creator CREATOR = new Creator<>() { + + public KktInfo createFromParcel(Parcel in) { + return new KktInfo(in); + } + + public KktInfo[] newArray(int size) { + return new KktInfo[size]; + } + }; + + @NonNull + @Override + public String toString() { + return "TsPioTId: " + tspiotId + "\n" + + "KktSerial: " + kktSerial + "\n" + + "FnSerial: " + fnSerial + "\n" + + "KktInn: " + kktInn + "\n" + + "CodesCheckTimeout: " + codesCheckTimeOut + "\n"; + } +} diff --git a/src/main/java/ru/evotor/integrations/result/VariableExpiration.java b/src/main/java/ru/evotor/integrations/result/VariableExpiration.java new file mode 100644 index 0000000000..b63b85ca57 --- /dev/null +++ b/src/main/java/ru/evotor/integrations/result/VariableExpiration.java @@ -0,0 +1,46 @@ +package ru.evotor.integrations.result; + +import android.os.Parcel; +import android.os.Parcelable; + +public class VariableExpiration implements Parcelable { + + private final int degrees; + + private final String date; + + private VariableExpiration(Parcel parcel) { + this.degrees = parcel.readInt(); + this.date = parcel.readString(); + } + + public VariableExpiration(int degrees, String date) { + this.degrees = degrees; + this.date = date; + } + + public int getDegrees() { return degrees; } + + public String getDate() { return date; } + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(Parcel parcel, int i) { + parcel.writeInt(degrees); + parcel.writeString(date); + } + + public static final Creator CREATOR = new Creator() { + @Override + public VariableExpiration createFromParcel(Parcel parcel) { + return new VariableExpiration(parcel); + } + + @Override + public VariableExpiration[] newArray(int i) { + return new VariableExpiration[0]; + } + }; +} diff --git a/src/main/java/ru/evotor/integrations/result/VariableExpirations.java b/src/main/java/ru/evotor/integrations/result/VariableExpirations.java new file mode 100644 index 0000000000..f2cc84733f --- /dev/null +++ b/src/main/java/ru/evotor/integrations/result/VariableExpirations.java @@ -0,0 +1,40 @@ +package ru.evotor.integrations.result; + +import android.os.Parcel; +import android.os.Parcelable; + +/** Вариативный срок годности */ +public class VariableExpirations implements Parcelable { + + private VariableExpiration[] expirations; + + private VariableExpirations(Parcel parcel) { + parcel.readTypedArray(expirations, VariableExpiration.CREATOR); + } + + public VariableExpirations(VariableExpiration[] expirations) { + this.expirations = expirations; + } + + public VariableExpiration[] getExpirations() { return expirations; } + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(Parcel parcel, int flags) { + parcel.writeTypedArray(expirations, flags); + } + + public static Creator CREATOR = new Creator() { + @Override + public VariableExpirations createFromParcel(Parcel parcel) { + return new VariableExpirations(parcel); + } + + @Override + public VariableExpirations[] newArray(int i) { + return new VariableExpirations[0]; + } + }; +} From 7886f66e3790e58a66257906bd11341acedd26ee Mon Sep 17 00:00:00 2001 From: "v.drebnev" Date: Wed, 25 Mar 2026 16:07:14 +0500 Subject: [PATCH 02/17] MRK-5213 --- build.gradle | 2 +- .../evotor/integrations/result/CodeCheck.java | 28 +++++++++---------- .../integrations/result/CodesCheck.java | 4 +-- .../integrations/result/CodesCheckResult.java | 14 ++++++---- .../integrations/result/IntegrationError.java | 2 +- .../result/IntegrationResult.java | 2 +- .../result/VariableExpiration.java | 2 +- .../result/VariableExpirations.java | 2 +- 8 files changed, 29 insertions(+), 27 deletions(-) diff --git a/build.gradle b/build.gradle index 0f642108f8..8393748f8e 100644 --- a/build.gradle +++ b/build.gradle @@ -123,7 +123,7 @@ publishing { mavenKotlin(MavenPublication) { groupId 'com.github.evotor' artifactId "integration-library" - version "STDEV-13213-SNAPHOT" + version "STDEV-13213-SNAPHOT-0" artifact(sourceJar) artifact(javadocJar) artifact "${project.buildDir}/outputs/aar/${project.archivesBaseName}-release.aar" diff --git a/src/main/java/ru/evotor/integrations/result/CodeCheck.java b/src/main/java/ru/evotor/integrations/result/CodeCheck.java index 1ecb9606b3..c8afd6662f 100644 --- a/src/main/java/ru/evotor/integrations/result/CodeCheck.java +++ b/src/main/java/ru/evotor/integrations/result/CodeCheck.java @@ -132,14 +132,14 @@ public class CodeCheck implements Parcelable { private CodeCheck(Parcel parcel) { this.cis = parcel.readString(); - this.found = parcel.readBoolean(); - this.valid = parcel.readBoolean(); + this.found = parcel.readInt() == 1; + this.valid = parcel.readInt() == 1; this.printView = parcel.readString(); this.gtin = parcel.readString(); this.groupIds = parcel.createIntArray(); - this.verified = parcel.readBoolean(); - this.realizable = parcel.readBoolean(); - this.utilized = parcel.readBoolean(); + this.verified = parcel.readInt() == 1; + this.realizable = parcel.readInt() == 1; + this.utilized = parcel.readInt() == 1; this.expireDate = parcel.readString(); this.variableExpirations = parcel.readTypedObject(VariableExpirations.CREATOR); this.productionDate = parcel.readString(); @@ -150,8 +150,8 @@ private CodeCheck(Parcel parcel) { this.ogvs = parcel.createTypedArray(OGVS.CREATOR); this.message = parcel.readString(); this.errorCode = readInteger(parcel); - this.isTracking = parcel.readBoolean(); - this.sold = parcel.readBoolean(); + this.isTracking = parcel.readInt() == 1; + this.sold = parcel.readInt() == 1; String eliminationStateName = parcel.readString(); this.eliminationState = eliminationStateName != null ? EliminationState.valueOf(eliminationStateName) : null; this.mrp = readInteger(parcel); @@ -336,14 +336,14 @@ public CodeCheck( @Override public void writeToParcel(Parcel parcel, int flags) { parcel.writeString(cis); - parcel.writeBoolean(found); - parcel.writeBoolean(valid); + parcel.writeInt(found ? 1 : 0); + parcel.writeInt(valid ? 1 : 0); parcel.writeString(printView); parcel.writeString(gtin); parcel.writeIntArray(groupIds); - parcel.writeBoolean(verified); - parcel.writeBoolean(realizable); - parcel.writeBoolean(utilized); + parcel.writeInt(verified ? 1 : 0); + parcel.writeInt(realizable ? 1 : 0); + parcel.writeInt(utilized ? 1 : 0); parcel.writeString(expireDate); parcel.writeTypedObject(this.variableExpirations, flags); parcel.writeString(productionDate); @@ -354,8 +354,8 @@ public void writeToParcel(Parcel parcel, int flags) { parcel.writeTypedArray(ogvs, flags); parcel.writeString(message); parcel.writeValue(errorCode); - parcel.writeBoolean(isTracking); - parcel.writeBoolean(sold); + parcel.writeInt(isTracking ? 1 : 0); + parcel.writeInt(sold ? 1 : 0); parcel.writeString(eliminationState != null ? eliminationState.name() : null); parcel.writeValue(mrp); parcel.writeValue(smp); diff --git a/src/main/java/ru/evotor/integrations/result/CodesCheck.java b/src/main/java/ru/evotor/integrations/result/CodesCheck.java index 5358ce1968..ae9d428588 100644 --- a/src/main/java/ru/evotor/integrations/result/CodesCheck.java +++ b/src/main/java/ru/evotor/integrations/result/CodesCheck.java @@ -36,7 +36,7 @@ private CodesCheck(Parcel parcel) { this.codes = parcel.createTypedArrayList(CodeCheck.CREATOR); this.reqId = parcel.readString(); this.reqTimestamp = parcel.readLong(); - this.isCheckedOffline = parcel.readBoolean(); + this.isCheckedOffline = parcel.readInt() == 1; this.version = parcel.readString(); this.inst = parcel.readString(); } @@ -90,7 +90,7 @@ public void writeToParcel(Parcel parcel, int i) { parcel.writeTypedList(codes); parcel.writeString(reqId); parcel.writeLong(reqTimestamp); - parcel.writeBoolean(isCheckedOffline); + parcel.writeInt(isCheckedOffline ? 1 : 0); parcel.writeString(version); parcel.writeString(inst); } diff --git a/src/main/java/ru/evotor/integrations/result/CodesCheckResult.java b/src/main/java/ru/evotor/integrations/result/CodesCheckResult.java index a1d594f391..6129755102 100644 --- a/src/main/java/ru/evotor/integrations/result/CodesCheckResult.java +++ b/src/main/java/ru/evotor/integrations/result/CodesCheckResult.java @@ -3,26 +3,28 @@ import android.os.Parcel; import android.os.Parcelable; +import java.util.List; + public class CodesCheckResult implements Parcelable { - private final CodesCheck[] codesChecks; + private final List codesChecks; private CodesCheckResult(Parcel parcel) { - this.codesChecks = parcel.createTypedArray(CodesCheck.CREATOR); + this.codesChecks = parcel.createTypedArrayList(CodesCheck.CREATOR); } - public CodesCheckResult(CodesCheck[] codesChecks) { + public CodesCheckResult(List codesChecks) { this.codesChecks = codesChecks; } - public CodesCheck[] getCodesChecks() { return codesChecks; } + public List getCodesChecks() { return codesChecks; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel parcel, int flags) { - parcel.writeTypedArray(codesChecks, flags); + parcel.writeTypedList(codesChecks); } public static Creator CREATOR = new Creator<>() { @@ -33,7 +35,7 @@ public CodesCheckResult createFromParcel(Parcel parcel) { @Override public CodesCheckResult[] newArray(int i) { - return new CodesCheckResult[0]; + return new CodesCheckResult[i]; } }; } diff --git a/src/main/java/ru/evotor/integrations/result/IntegrationError.java b/src/main/java/ru/evotor/integrations/result/IntegrationError.java index 58c65f70d0..e030fe8ac4 100644 --- a/src/main/java/ru/evotor/integrations/result/IntegrationError.java +++ b/src/main/java/ru/evotor/integrations/result/IntegrationError.java @@ -40,7 +40,7 @@ public IntegrationError createFromParcel(Parcel parcel) { @Override public IntegrationError[] newArray(int i) { - return new IntegrationError[0]; + return new IntegrationError[i]; } }; } diff --git a/src/main/java/ru/evotor/integrations/result/IntegrationResult.java b/src/main/java/ru/evotor/integrations/result/IntegrationResult.java index 1473b8256c..6fc8a9cf8b 100644 --- a/src/main/java/ru/evotor/integrations/result/IntegrationResult.java +++ b/src/main/java/ru/evotor/integrations/result/IntegrationResult.java @@ -60,7 +60,7 @@ public IntegrationResult createFromParcel(Parcel parcel) { @Override public IntegrationResult[] newArray(int i) { - return new IntegrationResult[0]; + return new IntegrationResult[i]; } }; } diff --git a/src/main/java/ru/evotor/integrations/result/VariableExpiration.java b/src/main/java/ru/evotor/integrations/result/VariableExpiration.java index b63b85ca57..02b977c16e 100644 --- a/src/main/java/ru/evotor/integrations/result/VariableExpiration.java +++ b/src/main/java/ru/evotor/integrations/result/VariableExpiration.java @@ -40,7 +40,7 @@ public VariableExpiration createFromParcel(Parcel parcel) { @Override public VariableExpiration[] newArray(int i) { - return new VariableExpiration[0]; + return new VariableExpiration[i]; } }; } diff --git a/src/main/java/ru/evotor/integrations/result/VariableExpirations.java b/src/main/java/ru/evotor/integrations/result/VariableExpirations.java index f2cc84733f..2b490b5284 100644 --- a/src/main/java/ru/evotor/integrations/result/VariableExpirations.java +++ b/src/main/java/ru/evotor/integrations/result/VariableExpirations.java @@ -34,7 +34,7 @@ public VariableExpirations createFromParcel(Parcel parcel) { @Override public VariableExpirations[] newArray(int i) { - return new VariableExpirations[0]; + return new VariableExpirations[i]; } }; } From 2c1238b4eabaec588d9934bc896f1e5a41f68be6 Mon Sep 17 00:00:00 2001 From: "v.drebnev" Date: Wed, 25 Mar 2026 16:07:41 +0500 Subject: [PATCH 03/17] MRK-5213 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 8393748f8e..0f642108f8 100644 --- a/build.gradle +++ b/build.gradle @@ -123,7 +123,7 @@ publishing { mavenKotlin(MavenPublication) { groupId 'com.github.evotor' artifactId "integration-library" - version "STDEV-13213-SNAPHOT-0" + version "STDEV-13213-SNAPHOT" artifact(sourceJar) artifact(javadocJar) artifact "${project.buildDir}/outputs/aar/${project.archivesBaseName}-release.aar" From 306f3bc87360a2fe078e53e212865e8d1ad5f5fe Mon Sep 17 00:00:00 2001 From: "v.drebnev" Date: Mon, 30 Mar 2026 09:53:55 +0500 Subject: [PATCH 04/17] MRK-5213 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 0f642108f8..ad5d25a90e 100644 --- a/build.gradle +++ b/build.gradle @@ -123,7 +123,7 @@ publishing { mavenKotlin(MavenPublication) { groupId 'com.github.evotor' artifactId "integration-library" - version "STDEV-13213-SNAPHOT" + version "STDEV-13213" artifact(sourceJar) artifact(javadocJar) artifact "${project.buildDir}/outputs/aar/${project.archivesBaseName}-release.aar" From 4ca8363dafdfbf5da1f3412187dfe4daaaba2d84 Mon Sep 17 00:00:00 2001 From: "v.drebnev" Date: Wed, 1 Apr 2026 11:46:10 +0500 Subject: [PATCH 05/17] =?UTF-8?q?MRK-5213=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8?= =?UTF-8?q?=D0=B9=20=D0=B4=D0=BB=D1=8F=20Parcelable=20=D0=BA=D0=BB=D0=B0?= =?UTF-8?q?=D1=81=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../evotor/integrations/model/ClientInfo.java | 7 +- .../evotor/integrations/result/CodeCheck.java | 87 ++++++++++++++++--- .../integrations/result/CodesCheck.java | 5 ++ .../integrations/result/CodesCheckResult.java | 6 +- .../integrations/result/IntegrationError.java | 5 ++ .../result/IntegrationResult.java | 5 ++ .../evotor/integrations/result/KktInfo.java | 6 +- .../result/VariableExpiration.java | 5 ++ .../result/VariableExpirations.java | 5 ++ 9 files changed, 117 insertions(+), 14 deletions(-) diff --git a/src/main/java/ru/evotor/integrations/model/ClientInfo.java b/src/main/java/ru/evotor/integrations/model/ClientInfo.java index 721c7aa0af..7340aa8ce6 100644 --- a/src/main/java/ru/evotor/integrations/model/ClientInfo.java +++ b/src/main/java/ru/evotor/integrations/model/ClientInfo.java @@ -8,6 +8,9 @@ */ public class ClientInfo implements Parcelable { + /** Версия ClientInfo */ + private final static int VERSION = 1; + /** Наименование приложения */ public final String name; @@ -18,6 +21,7 @@ public class ClientInfo implements Parcelable { public final String token; private ClientInfo(Parcel parcel) { + int version = parcel.readInt(); this.name = parcel.readString(); this.version = parcel.readString(); this.token = parcel.readString(); @@ -34,6 +38,7 @@ public ClientInfo(String name, String version, String token) { @Override public void writeToParcel(Parcel parcel, int flags) { + parcel.writeInt(VERSION); parcel.writeString(name); parcel.writeString(version); parcel.writeString(token); @@ -47,7 +52,7 @@ public ClientInfo createFromParcel(Parcel parcel) { @Override public ClientInfo[] newArray(int i) { - return new ClientInfo[0]; + return new ClientInfo[i]; } }; } diff --git a/src/main/java/ru/evotor/integrations/result/CodeCheck.java b/src/main/java/ru/evotor/integrations/result/CodeCheck.java index c8afd6662f..3ca0cc1e75 100644 --- a/src/main/java/ru/evotor/integrations/result/CodeCheck.java +++ b/src/main/java/ru/evotor/integrations/result/CodeCheck.java @@ -7,6 +7,9 @@ public class CodeCheck implements Parcelable { + /** Версия CodeCheck */ + private final static int VERSION = 1; + /** КИ / КиЗ из запроса */ private final String cis; @@ -131,6 +134,7 @@ public class CodeCheck implements Parcelable { @Nullable private final Integer packageQuantity; private CodeCheck(Parcel parcel) { + int version = parcel.readInt(); this.cis = parcel.readString(); this.found = parcel.readInt() == 1; this.valid = parcel.readInt() == 1; @@ -335,6 +339,7 @@ public CodeCheck( @Override public void writeToParcel(Parcel parcel, int flags) { + parcel.writeInt(VERSION); parcel.writeString(cis); parcel.writeInt(found ? 1 : 0); parcel.writeInt(valid ? 1 : 0); @@ -392,32 +397,48 @@ public CodeCheck[] newArray(int i) { *
  • RPN — Роспотребнадзор;
  • *
  • MVD — МВД России;
  • *
  • RZN — Росздравнадзор
  • + *
  • UNKNOWN — Неизвестное значение поля, связаное с различием версий
  • * */ public enum OGVS implements Parcelable { - RAR, FTS, FNS, RSHN, RPN, MVD, RZN; + RAR, FTS, FNS, RSHN, RPN, MVD, RZN, UNKNOWN; + + /** Версия OGVS */ + public final static int VERSION = 1; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel parcel, int i) { + parcel.writeInt(VERSION); parcel.writeString(this.name()); } + @Nullable + public static OGVS restoreFormParcel(Parcel parcel) { + int version = parcel.readInt(); + + try { + return OGVS.valueOf(parcel.readString()); + } catch (Exception exception) { + if (version != VERSION) { + return OGVS.UNKNOWN; + } else { + return null; + } + } + } + public static Creator CREATOR = new Creator<>() { @Override public OGVS createFromParcel(Parcel parcel) { - try { - return OGVS.valueOf(parcel.readString()); - } catch (Exception ex) { - return null; - } + return restoreFormParcel(parcel); } @Override public OGVS[] newArray(int i) { - return new OGVS[0]; + return new OGVS[i]; } }; } @@ -428,10 +449,50 @@ public OGVS[] newArray(int i) { *
  • «DISTANCE» («Дистанционная продажа»)
  • *
  • «OWN_USE» («Использование для собственных нужд»)
  • *
  • «PRODUCTION_USE» («Использование для производственных целей»)
  • + *
  • UNKNOWN — Неизвестное значение поля, связаное с различием версий
  • * */ - public enum EliminationState { - BY_SAMPLES, DISTANCE, OWN_USE, PRODUCTION_USE + public enum EliminationState implements Parcelable { + BY_SAMPLES, DISTANCE, OWN_USE, PRODUCTION_USE, UNKNOWN; + + /** Версия EliminationState */ + public final static int VERSION = 1; + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(Parcel parcel, int i) { + parcel.writeInt(VERSION); + parcel.writeString(this.name()); + } + + @Nullable + public static EliminationState restoreFormParcel(Parcel parcel) { + int version = parcel.readInt(); + + try { + return EliminationState.valueOf(parcel.readString()); + } catch (Exception exception) { + if (version != VERSION) { + return EliminationState.UNKNOWN; + } else { + return null; + } + } + } + + public static Creator CREATOR = new Creator<>() { + @Override + public EliminationState createFromParcel(Parcel parcel) { + return restoreFormParcel(parcel); + } + + @Override + public EliminationState[] newArray(int i) { + return new EliminationState[i]; + } + }; } @Nullable @@ -462,8 +523,10 @@ public String toString() { builder.append("PrintView").append(printView).append("\n"); builder.append("Gtin: ").append(gtin).append("\n"); builder.append("GroupIds: "); - if (groupIds == null || groupIds.length == 0) { + if (groupIds == null) { builder.append("null\n"); + } else if (groupIds.length == 0) { + builder.append("[]\n"); } else { for (int i = 0; i < groupIds.length; i++) { builder.append(groupIds[i]); @@ -479,8 +542,10 @@ public String toString() { builder.append("IsUtilized: ").append(utilized).append("\n"); builder.append("ExpireDate: ").append(expireDate).append("\n"); builder.append("VariableExpirations: "); - if (variableExpirations == null || variableExpirations.getExpirations().length == 0) { + if (variableExpirations == null) { builder.append("null\n"); + } else if (variableExpirations.getExpirations().length == 0) { + builder.append("[]\n"); } else { VariableExpiration[] expirations = variableExpirations.getExpirations(); for (int i = 0; i < expirations.length; i++) { diff --git a/src/main/java/ru/evotor/integrations/result/CodesCheck.java b/src/main/java/ru/evotor/integrations/result/CodesCheck.java index ae9d428588..4e94b4db28 100644 --- a/src/main/java/ru/evotor/integrations/result/CodesCheck.java +++ b/src/main/java/ru/evotor/integrations/result/CodesCheck.java @@ -8,6 +8,9 @@ public class CodesCheck implements Parcelable { + /** Версия CodesCheck */ + private final static int VERSION = 1; + private final int code; /** Текстовое описание результата выполнения метода */ @@ -31,6 +34,7 @@ public class CodesCheck implements Parcelable { @Nullable private final String inst; private CodesCheck(Parcel parcel) { + int version = parcel.readInt(); this.code = parcel.readInt(); this.description = parcel.readString(); this.codes = parcel.createTypedArrayList(CodeCheck.CREATOR); @@ -85,6 +89,7 @@ public CodesCheck( @Override public void writeToParcel(Parcel parcel, int i) { + parcel.writeInt(VERSION); parcel.writeInt(code); parcel.writeString(description); parcel.writeTypedList(codes); diff --git a/src/main/java/ru/evotor/integrations/result/CodesCheckResult.java b/src/main/java/ru/evotor/integrations/result/CodesCheckResult.java index 6129755102..28e2b1f11d 100644 --- a/src/main/java/ru/evotor/integrations/result/CodesCheckResult.java +++ b/src/main/java/ru/evotor/integrations/result/CodesCheckResult.java @@ -2,14 +2,17 @@ import android.os.Parcel; import android.os.Parcelable; - import java.util.List; public class CodesCheckResult implements Parcelable { + /** Версия CodesCheckResult */ + private final static int VERSION = 1; + private final List codesChecks; private CodesCheckResult(Parcel parcel) { + int version = parcel.readInt(); this.codesChecks = parcel.createTypedArrayList(CodesCheck.CREATOR); } @@ -24,6 +27,7 @@ public CodesCheckResult(List codesChecks) { @Override public void writeToParcel(Parcel parcel, int flags) { + parcel.writeInt(VERSION); parcel.writeTypedList(codesChecks); } diff --git a/src/main/java/ru/evotor/integrations/result/IntegrationError.java b/src/main/java/ru/evotor/integrations/result/IntegrationError.java index e030fe8ac4..ce619a7b10 100644 --- a/src/main/java/ru/evotor/integrations/result/IntegrationError.java +++ b/src/main/java/ru/evotor/integrations/result/IntegrationError.java @@ -5,11 +5,15 @@ public class IntegrationError implements Parcelable { + /** Версия IntegrationError */ + private final static int VERSION = 1; + private final int code; private final String message; private IntegrationError(Parcel parcel) { + int version = parcel.readInt(); this.code = parcel.readInt(); this.message = parcel.readString(); } @@ -28,6 +32,7 @@ public IntegrationError(int code, String message) { @Override public void writeToParcel(Parcel parcel, int flags) { + parcel.writeInt(VERSION); parcel.writeInt(code); parcel.writeString(message); } diff --git a/src/main/java/ru/evotor/integrations/result/IntegrationResult.java b/src/main/java/ru/evotor/integrations/result/IntegrationResult.java index 6fc8a9cf8b..4b462c010f 100644 --- a/src/main/java/ru/evotor/integrations/result/IntegrationResult.java +++ b/src/main/java/ru/evotor/integrations/result/IntegrationResult.java @@ -7,11 +7,15 @@ public class IntegrationResult implements Parcelable { + /** Версия IntegrationResult */ + private final static int VERSION = 1; + private final Class classType; private final T data; private IntegrationResult(Parcel parcel) { + int version = parcel.readInt(); this.classType = upcastClassType(parcel.readSerializable()); this.data = parseData(classType, parcel); } @@ -48,6 +52,7 @@ public IntegrationResult(T data) { @Override public void writeToParcel(Parcel parcel, int flags) { + parcel.writeInt(VERSION); parcel.writeSerializable(classType); parcel.writeParcelable(data, flags); } diff --git a/src/main/java/ru/evotor/integrations/result/KktInfo.java b/src/main/java/ru/evotor/integrations/result/KktInfo.java index f60c19097d..f45ae3d26f 100644 --- a/src/main/java/ru/evotor/integrations/result/KktInfo.java +++ b/src/main/java/ru/evotor/integrations/result/KktInfo.java @@ -2,11 +2,13 @@ import android.os.Parcel; import android.os.Parcelable; - import androidx.annotation.NonNull; public class KktInfo implements Parcelable { + /** Версия KktInfo */ + private final static int VERSION = 1; + /** Идентификатор ТС ПИоТ */ private final String tspiotId; @@ -31,6 +33,7 @@ public KktInfo(String tspiotId, String kktSerial, String fnSerial, String kktInn } private KktInfo(Parcel parcel) { + int version = parcel.readInt(); this.tspiotId = parcel.readString(); this.kktSerial = parcel.readString(); this.fnSerial = parcel.readString(); @@ -53,6 +56,7 @@ private KktInfo(Parcel parcel) { @Override public void writeToParcel(Parcel parcel, int i) { + parcel.writeInt(VERSION); parcel.writeString(tspiotId); parcel.writeString(kktSerial); parcel.writeString(fnSerial); diff --git a/src/main/java/ru/evotor/integrations/result/VariableExpiration.java b/src/main/java/ru/evotor/integrations/result/VariableExpiration.java index 02b977c16e..171c3715b1 100644 --- a/src/main/java/ru/evotor/integrations/result/VariableExpiration.java +++ b/src/main/java/ru/evotor/integrations/result/VariableExpiration.java @@ -5,11 +5,15 @@ public class VariableExpiration implements Parcelable { + /** Версия VariableExpiration */ + private final static int VERSION = 1; + private final int degrees; private final String date; private VariableExpiration(Parcel parcel) { + int version = parcel.readInt(); this.degrees = parcel.readInt(); this.date = parcel.readString(); } @@ -28,6 +32,7 @@ public VariableExpiration(int degrees, String date) { @Override public void writeToParcel(Parcel parcel, int i) { + parcel.writeInt(VERSION); parcel.writeInt(degrees); parcel.writeString(date); } diff --git a/src/main/java/ru/evotor/integrations/result/VariableExpirations.java b/src/main/java/ru/evotor/integrations/result/VariableExpirations.java index 2b490b5284..c860cc6203 100644 --- a/src/main/java/ru/evotor/integrations/result/VariableExpirations.java +++ b/src/main/java/ru/evotor/integrations/result/VariableExpirations.java @@ -6,9 +6,13 @@ /** Вариативный срок годности */ public class VariableExpirations implements Parcelable { + /** Версия VariableExpirations */ + private final static int VERSION = 1; + private VariableExpiration[] expirations; private VariableExpirations(Parcel parcel) { + int version = parcel.readInt(); parcel.readTypedArray(expirations, VariableExpiration.CREATOR); } @@ -23,6 +27,7 @@ public VariableExpirations(VariableExpiration[] expirations) { @Override public void writeToParcel(Parcel parcel, int flags) { + parcel.writeInt(VERSION); parcel.writeTypedArray(expirations, flags); } From 8bc2f1933352c50e661f36ffd6143a7680b06e46 Mon Sep 17 00:00:00 2001 From: "v.drebnev" Date: Tue, 7 Apr 2026 16:39:17 +0500 Subject: [PATCH 06/17] =?UTF-8?q?MRK-5213=20=D0=97=D0=B0=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20callback-=D0=BE=D0=B2=20=D0=B2=20ITsPioTService.aidl?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0=D1=89?= =?UTF-8?q?=D0=B0=D0=B5=D0=BC=D1=8B=D0=B9=20TsPioTResult.java.=20=D0=94?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=81=D0=B5?= =?UTF-8?q?=D1=80=D0=B2=D0=B8=D1=81=20TsPioTService.java=20=D0=B8=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=91=D1=80=D1=82=D0=BA=D0=B0=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=B3=D0=BE=20TsPioTServiceConnector.java.=20?= =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B=D0=B5=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8F=20=D0=B2=20CodeCheck.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../evotor/integrations/ITsPioTService.aidl | 11 -- .../evotor/integrations/model/ClientInfo.aidl | 3 - .../evotor/integrations/result/CodeCheck.aidl | 3 - .../integrations/result/CodesCheck.aidl | 3 - .../integrations/result/CodesCheckResult.aidl | 3 - .../result/IntegrationCallback.aidl | 9 - .../integrations/result/IntegrationError.aidl | 3 - .../result/IntegrationResult.aidl | 3 - .../evotor/integrations/result/KktInfo.aidl | 3 - .../aidl/ru/evotor/tspiot/ITsPioTService.aidl | 10 ++ .../ru/evotor/tspiot/model/MarkingCode.aidl | 3 + .../ru/evotor/tspiot/result/TsPioTResult.aidl | 3 + .../evotor/integrations/model/ClientInfo.java | 58 ------ .../evotor/tspiot/TsPioTServiceConnector.java | 64 +++++++ src/main/java/ru/evotor/tspiot/Utils.java | 25 +++ .../exceptions/NullContextException.java | 5 + .../ServiceAlreadyConnectedException.java | 5 + .../ServiceNotConnectedException.java | 8 + .../TsPioTErrorHolderException.java | 18 ++ .../TsPioTServiceRuntimeException.java | 8 + .../tspiot/exceptions/UnknownException.java | 8 + .../base/TsPioTServiceException.java | 17 ++ .../ru/evotor/tspiot/model/MarkingCode.java | 56 ++++++ .../result/CodeCheck.java | 85 ++++----- .../result/CodesCheck.java | 2 +- .../result/CodesCheckResult.java | 2 +- .../java/ru/evotor/tspiot/result/Errors.java | 59 ++++++ .../result/KktInfo.java | 14 +- .../result/TsPioTError.java} | 26 +-- .../result/TsPioTResult.java} | 45 +++-- .../result/VariableExpiration.java | 2 +- .../result/VariableExpirations.java | 2 +- .../service/ITsPioTConnectionWrapper.java | 7 + .../tspiot/service/ITsPioTServiceWrapper.java | 15 ++ .../evotor/tspiot/service/TsPioTService.java | 170 ++++++++++++++++++ 35 files changed, 574 insertions(+), 184 deletions(-) delete mode 100644 src/main/aidl/ru/evotor/integrations/ITsPioTService.aidl delete mode 100644 src/main/aidl/ru/evotor/integrations/model/ClientInfo.aidl delete mode 100644 src/main/aidl/ru/evotor/integrations/result/CodeCheck.aidl delete mode 100644 src/main/aidl/ru/evotor/integrations/result/CodesCheck.aidl delete mode 100644 src/main/aidl/ru/evotor/integrations/result/CodesCheckResult.aidl delete mode 100644 src/main/aidl/ru/evotor/integrations/result/IntegrationCallback.aidl delete mode 100644 src/main/aidl/ru/evotor/integrations/result/IntegrationError.aidl delete mode 100644 src/main/aidl/ru/evotor/integrations/result/IntegrationResult.aidl delete mode 100644 src/main/aidl/ru/evotor/integrations/result/KktInfo.aidl create mode 100644 src/main/aidl/ru/evotor/tspiot/ITsPioTService.aidl create mode 100644 src/main/aidl/ru/evotor/tspiot/model/MarkingCode.aidl create mode 100644 src/main/aidl/ru/evotor/tspiot/result/TsPioTResult.aidl delete mode 100644 src/main/java/ru/evotor/integrations/model/ClientInfo.java create mode 100644 src/main/java/ru/evotor/tspiot/TsPioTServiceConnector.java create mode 100644 src/main/java/ru/evotor/tspiot/Utils.java create mode 100644 src/main/java/ru/evotor/tspiot/exceptions/NullContextException.java create mode 100644 src/main/java/ru/evotor/tspiot/exceptions/ServiceAlreadyConnectedException.java create mode 100644 src/main/java/ru/evotor/tspiot/exceptions/ServiceNotConnectedException.java create mode 100644 src/main/java/ru/evotor/tspiot/exceptions/TsPioTErrorHolderException.java create mode 100644 src/main/java/ru/evotor/tspiot/exceptions/TsPioTServiceRuntimeException.java create mode 100644 src/main/java/ru/evotor/tspiot/exceptions/UnknownException.java create mode 100644 src/main/java/ru/evotor/tspiot/exceptions/base/TsPioTServiceException.java create mode 100644 src/main/java/ru/evotor/tspiot/model/MarkingCode.java rename src/main/java/ru/evotor/{integrations => tspiot}/result/CodeCheck.java (90%) rename src/main/java/ru/evotor/{integrations => tspiot}/result/CodesCheck.java (98%) rename src/main/java/ru/evotor/{integrations => tspiot}/result/CodesCheckResult.java (96%) create mode 100644 src/main/java/ru/evotor/tspiot/result/Errors.java rename src/main/java/ru/evotor/{integrations => tspiot}/result/KktInfo.java (84%) rename src/main/java/ru/evotor/{integrations/result/IntegrationError.java => tspiot/result/TsPioTError.java} (50%) rename src/main/java/ru/evotor/{integrations/result/IntegrationResult.java => tspiot/result/TsPioTResult.java} (54%) rename src/main/java/ru/evotor/{integrations => tspiot}/result/VariableExpiration.java (97%) rename src/main/java/ru/evotor/{integrations => tspiot}/result/VariableExpirations.java (97%) create mode 100644 src/main/java/ru/evotor/tspiot/service/ITsPioTConnectionWrapper.java create mode 100644 src/main/java/ru/evotor/tspiot/service/ITsPioTServiceWrapper.java create mode 100644 src/main/java/ru/evotor/tspiot/service/TsPioTService.java diff --git a/src/main/aidl/ru/evotor/integrations/ITsPioTService.aidl b/src/main/aidl/ru/evotor/integrations/ITsPioTService.aidl deleted file mode 100644 index 74e4be6d0a..0000000000 --- a/src/main/aidl/ru/evotor/integrations/ITsPioTService.aidl +++ /dev/null @@ -1,11 +0,0 @@ -package ru.evotor.integrations; - -import ru.evotor.integrations.result.IntegrationCallback; -import ru.evotor.integrations.model.ClientInfo; - -interface ITsPioTService { - - void getKktInfo(in IntegrationCallback callback); - - void checkMarks(in List codes, in ClientInfo clientInfo, in IntegrationCallback callback); -} \ No newline at end of file diff --git a/src/main/aidl/ru/evotor/integrations/model/ClientInfo.aidl b/src/main/aidl/ru/evotor/integrations/model/ClientInfo.aidl deleted file mode 100644 index 0be3e42e6e..0000000000 --- a/src/main/aidl/ru/evotor/integrations/model/ClientInfo.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package ru.evotor.integrations.model; - -parcelable ClientInfo; \ No newline at end of file diff --git a/src/main/aidl/ru/evotor/integrations/result/CodeCheck.aidl b/src/main/aidl/ru/evotor/integrations/result/CodeCheck.aidl deleted file mode 100644 index c393569932..0000000000 --- a/src/main/aidl/ru/evotor/integrations/result/CodeCheck.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package ru.evotor.integrations.result; - -parcelable CodeCheck; \ No newline at end of file diff --git a/src/main/aidl/ru/evotor/integrations/result/CodesCheck.aidl b/src/main/aidl/ru/evotor/integrations/result/CodesCheck.aidl deleted file mode 100644 index 68d03a6579..0000000000 --- a/src/main/aidl/ru/evotor/integrations/result/CodesCheck.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package ru.evotor.integrations.result; - -parcelable CodesCheck; \ No newline at end of file diff --git a/src/main/aidl/ru/evotor/integrations/result/CodesCheckResult.aidl b/src/main/aidl/ru/evotor/integrations/result/CodesCheckResult.aidl deleted file mode 100644 index cb429fb03e..0000000000 --- a/src/main/aidl/ru/evotor/integrations/result/CodesCheckResult.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package ru.evotor.integrations.result; - -parcelable CodesCheckResult; \ No newline at end of file diff --git a/src/main/aidl/ru/evotor/integrations/result/IntegrationCallback.aidl b/src/main/aidl/ru/evotor/integrations/result/IntegrationCallback.aidl deleted file mode 100644 index d3f87ea98e..0000000000 --- a/src/main/aidl/ru/evotor/integrations/result/IntegrationCallback.aidl +++ /dev/null @@ -1,9 +0,0 @@ -package ru.evotor.integrations.result; - -import ru.evotor.integrations.result.IntegrationResult; -import ru.evotor.integrations.result.IntegrationError; - -interface IntegrationCallback { - void onSuccess(in IntegrationResult result); - void onFailure(in IntegrationError error); -} \ No newline at end of file diff --git a/src/main/aidl/ru/evotor/integrations/result/IntegrationError.aidl b/src/main/aidl/ru/evotor/integrations/result/IntegrationError.aidl deleted file mode 100644 index f40c94a8d1..0000000000 --- a/src/main/aidl/ru/evotor/integrations/result/IntegrationError.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package ru.evotor.integrations.result; - -parcelable IntegrationError; \ No newline at end of file diff --git a/src/main/aidl/ru/evotor/integrations/result/IntegrationResult.aidl b/src/main/aidl/ru/evotor/integrations/result/IntegrationResult.aidl deleted file mode 100644 index 289367a938..0000000000 --- a/src/main/aidl/ru/evotor/integrations/result/IntegrationResult.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package ru.evotor.integrations.result; - -parcelable IntegrationResult; \ No newline at end of file diff --git a/src/main/aidl/ru/evotor/integrations/result/KktInfo.aidl b/src/main/aidl/ru/evotor/integrations/result/KktInfo.aidl deleted file mode 100644 index 0015cf8b15..0000000000 --- a/src/main/aidl/ru/evotor/integrations/result/KktInfo.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package ru.evotor.integrations.result; - -parcelable KktInfo; \ No newline at end of file diff --git a/src/main/aidl/ru/evotor/tspiot/ITsPioTService.aidl b/src/main/aidl/ru/evotor/tspiot/ITsPioTService.aidl new file mode 100644 index 0000000000..95abd74e8c --- /dev/null +++ b/src/main/aidl/ru/evotor/tspiot/ITsPioTService.aidl @@ -0,0 +1,10 @@ +package ru.evotor.tspiot; + +import ru.evotor.tspiot.model.MarkingCode; +import ru.evotor.tspiot.result.TsPioTResult; + +interface ITsPioTService { + TsPioTResult getKktInfo(); + + TsPioTResult getMarkedProductsInfo(in List codes); +} \ No newline at end of file diff --git a/src/main/aidl/ru/evotor/tspiot/model/MarkingCode.aidl b/src/main/aidl/ru/evotor/tspiot/model/MarkingCode.aidl new file mode 100644 index 0000000000..487b3f17a5 --- /dev/null +++ b/src/main/aidl/ru/evotor/tspiot/model/MarkingCode.aidl @@ -0,0 +1,3 @@ +package ru.evotor.tspiot.model; + +parcelable MarkingCode; \ No newline at end of file diff --git a/src/main/aidl/ru/evotor/tspiot/result/TsPioTResult.aidl b/src/main/aidl/ru/evotor/tspiot/result/TsPioTResult.aidl new file mode 100644 index 0000000000..65c890c8fd --- /dev/null +++ b/src/main/aidl/ru/evotor/tspiot/result/TsPioTResult.aidl @@ -0,0 +1,3 @@ +package ru.evotor.tspiot.result; + +parcelable TsPioTResult; \ No newline at end of file diff --git a/src/main/java/ru/evotor/integrations/model/ClientInfo.java b/src/main/java/ru/evotor/integrations/model/ClientInfo.java deleted file mode 100644 index 7340aa8ce6..0000000000 --- a/src/main/java/ru/evotor/integrations/model/ClientInfo.java +++ /dev/null @@ -1,58 +0,0 @@ -package ru.evotor.integrations.model; - -import android.os.Parcel; -import android.os.Parcelable; - -/** - * Информация об интеграционном приложении (ПСМР, стороннее кассовое ПО) - */ -public class ClientInfo implements Parcelable { - - /** Версия ClientInfo */ - private final static int VERSION = 1; - - /** Наименование приложения */ - public final String name; - - /** Версия приложения */ - public final String version; - - /** Контрольная сумма/ЭЦП исполняемого файла ПМСР (кассового ПО) */ - public final String token; - - private ClientInfo(Parcel parcel) { - int version = parcel.readInt(); - this.name = parcel.readString(); - this.version = parcel.readString(); - this.token = parcel.readString(); - } - - public ClientInfo(String name, String version, String token) { - this.name = name; - this.version = version; - this.token = token; - } - - @Override - public int describeContents() { return 0; } - - @Override - public void writeToParcel(Parcel parcel, int flags) { - parcel.writeInt(VERSION); - parcel.writeString(name); - parcel.writeString(version); - parcel.writeString(token); - } - - public static final Creator CREATOR = new Creator<>() { - @Override - public ClientInfo createFromParcel(Parcel parcel) { - return new ClientInfo(parcel); - } - - @Override - public ClientInfo[] newArray(int i) { - return new ClientInfo[i]; - } - }; -} diff --git a/src/main/java/ru/evotor/tspiot/TsPioTServiceConnector.java b/src/main/java/ru/evotor/tspiot/TsPioTServiceConnector.java new file mode 100644 index 0000000000..a162324a33 --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/TsPioTServiceConnector.java @@ -0,0 +1,64 @@ +package ru.evotor.tspiot; + +import android.content.Context; +import android.os.DeadObjectException; +import java.util.concurrent.CopyOnWriteArrayList; +import ru.evotor.devices.commons.exception.DeviceServiceOperationOnMainThreadException; +import ru.evotor.tspiot.exceptions.ServiceNotConnectedException; +import ru.evotor.tspiot.exceptions.base.TsPioTServiceException; +import ru.evotor.tspiot.exceptions.TsPioTServiceRuntimeException; +import ru.evotor.tspiot.service.ITsPioTConnectionWrapper; +import ru.evotor.tspiot.service.ITsPioTServiceWrapper; +import ru.evotor.tspiot.service.TsPioTService; + +public class TsPioTServiceConnector { + + protected static final String TAG = "TsPioTServiceConnector"; + + public static final String ACTION_TSPIOT_SERVICE = "evotor.intent.action.TSPIOT_SERVICE"; + public static final String TARGET_PACKAGE = "ru.esp.umesm"; + public static final String TARGET_CLASS_NAME = "ru.esp.worker.worker.IntegrationMarksCheckService"; + + protected final static TsPioTService tsPioTService = new TsPioTService(); + + protected final static CopyOnWriteArrayList connectionWrappers = new CopyOnWriteArrayList<>(); + + public static CopyOnWriteArrayList getConnectionWrappers() { + return connectionWrappers; + } + + public static void addConnectionWrapper(ITsPioTConnectionWrapper connectionWrapper) { + connectionWrappers.add(connectionWrapper); + } + + public static void removeConnectionWrapper(ITsPioTConnectionWrapper connectionWrapper) { + connectionWrappers.remove(connectionWrapper); + } + + public static void clearConnectionWrappers() { + connectionWrappers.clear(); + } + + public static ITsPioTServiceWrapper connectTsPioTService(Context context) throws TsPioTServiceException { + DeviceServiceOperationOnMainThreadException.throwIfMainThread(); + + tsPioTService.connectService(context, false); + return tsPioTService; + } + + public static void disconnectTsPioTService() throws TsPioTServiceException { + DeviceServiceOperationOnMainThreadException.throwIfMainThread(); + + tsPioTService.disconnectService(); + } + + public static void processException(Exception exc) throws TsPioTServiceException { + if (exc instanceof DeadObjectException) { + tsPioTService.reconnectService(); + throw new ServiceNotConnectedException(exc); + } else if (exc instanceof RuntimeException) { + throw new TsPioTServiceRuntimeException(exc); + } + exc.printStackTrace(); + } +} diff --git a/src/main/java/ru/evotor/tspiot/Utils.java b/src/main/java/ru/evotor/tspiot/Utils.java new file mode 100644 index 0000000000..4129f12675 --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/Utils.java @@ -0,0 +1,25 @@ +package ru.evotor.tspiot; + +import android.os.Parcel; +import androidx.annotation.Nullable; + +public final class Utils { + + @Nullable + public static Integer readInteger(Parcel parcel) { + try { + return (Integer) parcel.readValue(Integer.class.getClassLoader()); + } catch (Exception ex) { + return null; + } + } + + @Nullable + public static Boolean readBoolean(Parcel parcel) { + try { + return (Boolean) parcel.readValue(Boolean.class.getClassLoader()); + } catch (Exception ex) { + return null; + } + } +} diff --git a/src/main/java/ru/evotor/tspiot/exceptions/NullContextException.java b/src/main/java/ru/evotor/tspiot/exceptions/NullContextException.java new file mode 100644 index 0000000000..d027ead12a --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/exceptions/NullContextException.java @@ -0,0 +1,5 @@ +package ru.evotor.tspiot.exceptions; + +import ru.evotor.tspiot.exceptions.base.TsPioTServiceException; + +public class NullContextException extends TsPioTServiceException { } diff --git a/src/main/java/ru/evotor/tspiot/exceptions/ServiceAlreadyConnectedException.java b/src/main/java/ru/evotor/tspiot/exceptions/ServiceAlreadyConnectedException.java new file mode 100644 index 0000000000..cb8829c7f1 --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/exceptions/ServiceAlreadyConnectedException.java @@ -0,0 +1,5 @@ +package ru.evotor.tspiot.exceptions; + +import ru.evotor.tspiot.exceptions.base.TsPioTServiceException; + +public class ServiceAlreadyConnectedException extends TsPioTServiceException { } diff --git a/src/main/java/ru/evotor/tspiot/exceptions/ServiceNotConnectedException.java b/src/main/java/ru/evotor/tspiot/exceptions/ServiceNotConnectedException.java new file mode 100644 index 0000000000..93d8812b78 --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/exceptions/ServiceNotConnectedException.java @@ -0,0 +1,8 @@ +package ru.evotor.tspiot.exceptions; + +import ru.evotor.tspiot.exceptions.base.TsPioTServiceException; + +public class ServiceNotConnectedException extends TsPioTServiceException { + + public ServiceNotConnectedException(Exception ex) { super(ex); } +} diff --git a/src/main/java/ru/evotor/tspiot/exceptions/TsPioTErrorHolderException.java b/src/main/java/ru/evotor/tspiot/exceptions/TsPioTErrorHolderException.java new file mode 100644 index 0000000000..2af941a060 --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/exceptions/TsPioTErrorHolderException.java @@ -0,0 +1,18 @@ +package ru.evotor.tspiot.exceptions; + +import ru.evotor.tspiot.exceptions.base.TsPioTServiceException; +import ru.evotor.tspiot.result.Errors; + +/** Исключение обёртка для передачи ошибок от драйвера ТС ПИоТ */ +public class TsPioTErrorHolderException extends TsPioTServiceException { + + public final Errors code; + + public final String message; + + public TsPioTErrorHolderException(Errors code, String message) { + super(); + this.code = code; + this.message = message; + } +} diff --git a/src/main/java/ru/evotor/tspiot/exceptions/TsPioTServiceRuntimeException.java b/src/main/java/ru/evotor/tspiot/exceptions/TsPioTServiceRuntimeException.java new file mode 100644 index 0000000000..f7d3b3a681 --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/exceptions/TsPioTServiceRuntimeException.java @@ -0,0 +1,8 @@ +package ru.evotor.tspiot.exceptions; + +import ru.evotor.tspiot.exceptions.base.TsPioTServiceException; + +public class TsPioTServiceRuntimeException extends TsPioTServiceException { + + public TsPioTServiceRuntimeException(Exception ex) { super(ex); } +} diff --git a/src/main/java/ru/evotor/tspiot/exceptions/UnknownException.java b/src/main/java/ru/evotor/tspiot/exceptions/UnknownException.java new file mode 100644 index 0000000000..f89bf1b1f3 --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/exceptions/UnknownException.java @@ -0,0 +1,8 @@ +package ru.evotor.tspiot.exceptions; + +import ru.evotor.tspiot.exceptions.base.TsPioTServiceException; + +public class UnknownException extends TsPioTServiceException { + + public UnknownException(String message) { super(message); } +} diff --git a/src/main/java/ru/evotor/tspiot/exceptions/base/TsPioTServiceException.java b/src/main/java/ru/evotor/tspiot/exceptions/base/TsPioTServiceException.java new file mode 100644 index 0000000000..f892280bae --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/exceptions/base/TsPioTServiceException.java @@ -0,0 +1,17 @@ +package ru.evotor.tspiot.exceptions.base; + +/** Базовый класс для исключений, которые могу возникнуть на стороне клиента ТС ПИоТ*/ +public class TsPioTServiceException extends Exception { + + public TsPioTServiceException() { + super(); + } + + public TsPioTServiceException(String message) { + super(message); + } + + public TsPioTServiceException(Exception e) { + super(e); + } +} diff --git a/src/main/java/ru/evotor/tspiot/model/MarkingCode.java b/src/main/java/ru/evotor/tspiot/model/MarkingCode.java new file mode 100644 index 0000000000..018e1533db --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/model/MarkingCode.java @@ -0,0 +1,56 @@ +package ru.evotor.tspiot.model; + +import android.os.Parcel; +import android.os.Parcelable; +import androidx.annotation.Nullable; +import ru.evotor.tspiot.Utils; + +public class MarkingCode implements Parcelable { + + /** Версия MarkingCode */ + private static final int VERSION = 1; + + /** Код маркировки */ + private final String cis; + + /** Опциональный параметр идентификатора товарной группы */ + @Nullable private final Integer productType; + + public MarkingCode(String cis, @Nullable Integer productType) { + this.cis = cis; + this.productType = productType; + } + + private MarkingCode(Parcel parcel) { + int version = parcel.readInt(); + this.cis = parcel.readString(); + this.productType = Utils.readInteger(parcel); + } + + public String getCis() { return cis; } + + @Nullable + public Integer getProductType() { return productType; } + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(Parcel parcel, int i) { + parcel.writeInt(VERSION); + parcel.writeString(cis); + parcel.writeValue(productType); + } + + public static Creator CREATOR = new Creator<>() { + @Override + public MarkingCode createFromParcel(Parcel parcel) { + return new MarkingCode(parcel); + } + + @Override + public MarkingCode[] newArray(int i) { + return new MarkingCode[i]; + } + }; +} diff --git a/src/main/java/ru/evotor/integrations/result/CodeCheck.java b/src/main/java/ru/evotor/tspiot/result/CodeCheck.java similarity index 90% rename from src/main/java/ru/evotor/integrations/result/CodeCheck.java rename to src/main/java/ru/evotor/tspiot/result/CodeCheck.java index 3ca0cc1e75..9d23ab0fe7 100644 --- a/src/main/java/ru/evotor/integrations/result/CodeCheck.java +++ b/src/main/java/ru/evotor/tspiot/result/CodeCheck.java @@ -1,9 +1,11 @@ -package ru.evotor.integrations.result; +package ru.evotor.tspiot.result; import android.os.Parcel; import android.os.Parcelable; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import java.util.Date; +import ru.evotor.tspiot.Utils; public class CodeCheck implements Parcelable { @@ -38,13 +40,13 @@ public class CodeCheck implements Parcelable { private final boolean utilized; /** Дата и время истечения срока годности */ - @Nullable private final String expireDate; + @Nullable private final Date expireDate; /** Информация о вариативном сроке годности */ @Nullable private final VariableExpirations variableExpirations; /** Дата производства продукции */ - @Nullable private final String productionDate; + @Nullable private final Date productionDate; /** Переменный вес продукции (в граммах) */ @Nullable private final Integer productWeight; @@ -59,7 +61,7 @@ public class CodeCheck implements Parcelable { @Nullable private final Boolean isBlocked; /** Органы государственной власти, установившие блокировку на КИ */ - private final OGVS[] ogvs; + private final String[] ogvs; /** Сообщение об ошибке */ @Nullable private final String message; @@ -93,7 +95,7 @@ public class CodeCheck implements Parcelable { private final boolean sold; /** Признак использования причин выбытия, разрешающих продажу КМ */ - @Nullable private final EliminationState eliminationState; + @Nullable private final Integer eliminationState; /** Максимальная розничная цена */ @Nullable private final Integer mrp; @@ -144,32 +146,31 @@ private CodeCheck(Parcel parcel) { this.verified = parcel.readInt() == 1; this.realizable = parcel.readInt() == 1; this.utilized = parcel.readInt() == 1; - this.expireDate = parcel.readString(); + this.expireDate = (Date) parcel.readSerializable(); this.variableExpirations = parcel.readTypedObject(VariableExpirations.CREATOR); - this.productionDate = parcel.readString(); - this.productWeight = readInteger(parcel); + this.productionDate = (Date) parcel.readSerializable(); + this.productWeight = Utils.readInteger(parcel); this.prVetDocument = parcel.readString(); - this.isOwner = readBoolean(parcel); - this.isBlocked = readBoolean(parcel); - this.ogvs = parcel.createTypedArray(OGVS.CREATOR); + this.isOwner = Utils.readBoolean(parcel); + this.isBlocked = Utils.readBoolean(parcel); + this.ogvs = parcel.createStringArray(); this.message = parcel.readString(); - this.errorCode = readInteger(parcel); + this.errorCode = Utils.readInteger(parcel); this.isTracking = parcel.readInt() == 1; this.sold = parcel.readInt() == 1; - String eliminationStateName = parcel.readString(); - this.eliminationState = eliminationStateName != null ? EliminationState.valueOf(eliminationStateName) : null; - this.mrp = readInteger(parcel); - this.smp = readInteger(parcel); - this.grayZone = readBoolean(parcel); - this.innerUnitCount = readInteger(parcel); - this.soldUnitCount = readInteger(parcel); + this.eliminationState = Utils.readInteger(parcel); + this.mrp = Utils.readInteger(parcel); + this.smp = Utils.readInteger(parcel); + this.grayZone = Utils.readBoolean(parcel); + this.innerUnitCount = Utils.readInteger(parcel); + this.soldUnitCount = Utils.readInteger(parcel); this.packageType = parcel.readString(); this.parent = parcel.readString(); this.producerInn = parcel.readString(); this.productionSerialNumber = parcel.readString(); this.productionBatchNumber = parcel.readString(); this.factorySerialNumber = parcel.readString(); - this.packageQuantity = readInteger(parcel); + this.packageQuantity = Utils.readInteger(parcel); } public CodeCheck( @@ -182,19 +183,19 @@ public CodeCheck( Boolean verified, Boolean realizable, Boolean utilized, - @Nullable String expireDate, + @Nullable Date expireDate, @Nullable VariableExpirations variableExpirations, - @Nullable String productionDate, + @Nullable Date productionDate, @Nullable Integer productWeight, @Nullable String prVetDocument, @Nullable Boolean isOwner, @Nullable Boolean isBlocked, - @Nullable OGVS[] ogvs, + @Nullable String[] ogvs, @Nullable String message, @Nullable Integer errorCode, Boolean isTracking, Boolean sold, - @Nullable EliminationState eliminationState, + @Nullable Integer eliminationState, @Nullable Integer mrp, @Nullable Integer smp, @Nullable Boolean grayZone, @@ -224,7 +225,7 @@ public CodeCheck( this.prVetDocument = prVetDocument; this.isOwner = isOwner; this.isBlocked = isBlocked; - this.ogvs = ogvs == null ? new OGVS[0] : ogvs; + this.ogvs = ogvs == null ? new String[0] : ogvs; this.message = message; this.errorCode = errorCode; this.isTracking = isTracking; @@ -267,7 +268,7 @@ public CodeCheck( public boolean isVerified() { return verified; } @Nullable - public EliminationState getEliminationState() { return eliminationState; } + public Integer getEliminationState() { return eliminationState; } public int[] getGroupIds() { return groupIds; } @@ -296,10 +297,10 @@ public CodeCheck( public VariableExpirations getVariableExpirations() { return variableExpirations; } @Nullable - public OGVS[] getOgvs() { return ogvs; } + public String[] getOgvs() { return ogvs; } @Nullable - public String getExpireDate() { return expireDate; } + public Date getExpireDate() { return expireDate; } @Nullable public String getFactorySerialNumber() { return factorySerialNumber; } @@ -323,7 +324,7 @@ public CodeCheck( public String getProductionBatchNumber() { return productionBatchNumber; } @Nullable - public String getProductionDate() { return productionDate; } + public Date getProductionDate() { return productionDate; } @Nullable public String getProductionSerialNumber() { return productionSerialNumber; } @@ -349,19 +350,19 @@ public void writeToParcel(Parcel parcel, int flags) { parcel.writeInt(verified ? 1 : 0); parcel.writeInt(realizable ? 1 : 0); parcel.writeInt(utilized ? 1 : 0); - parcel.writeString(expireDate); + parcel.writeSerializable(expireDate); parcel.writeTypedObject(this.variableExpirations, flags); - parcel.writeString(productionDate); + parcel.writeSerializable(productionDate); parcel.writeValue(productWeight); parcel.writeString(prVetDocument); parcel.writeValue(isOwner); parcel.writeValue(isBlocked); - parcel.writeTypedArray(ogvs, flags); + parcel.writeStringArray(ogvs); parcel.writeString(message); parcel.writeValue(errorCode); parcel.writeInt(isTracking ? 1 : 0); parcel.writeInt(sold ? 1 : 0); - parcel.writeString(eliminationState != null ? eliminationState.name() : null); + parcel.writeValue(eliminationState); parcel.writeValue(mrp); parcel.writeValue(smp); parcel.writeValue(grayZone); @@ -495,24 +496,6 @@ public EliminationState[] newArray(int i) { }; } - @Nullable - private Integer readInteger(Parcel parcel) { - try { - return (Integer) parcel.readValue(Integer.class.getClassLoader()); - } catch (Exception ex) { - return null; - } - } - - @Nullable - private Boolean readBoolean(Parcel parcel) { - try { - return (Boolean) parcel.readValue(Boolean.class.getClassLoader()); - } catch (Exception ex) { - return null; - } - } - @NonNull @Override public String toString() { diff --git a/src/main/java/ru/evotor/integrations/result/CodesCheck.java b/src/main/java/ru/evotor/tspiot/result/CodesCheck.java similarity index 98% rename from src/main/java/ru/evotor/integrations/result/CodesCheck.java rename to src/main/java/ru/evotor/tspiot/result/CodesCheck.java index 4e94b4db28..c893535961 100644 --- a/src/main/java/ru/evotor/integrations/result/CodesCheck.java +++ b/src/main/java/ru/evotor/tspiot/result/CodesCheck.java @@ -1,4 +1,4 @@ -package ru.evotor.integrations.result; +package ru.evotor.tspiot.result; import android.os.Parcel; import android.os.Parcelable; diff --git a/src/main/java/ru/evotor/integrations/result/CodesCheckResult.java b/src/main/java/ru/evotor/tspiot/result/CodesCheckResult.java similarity index 96% rename from src/main/java/ru/evotor/integrations/result/CodesCheckResult.java rename to src/main/java/ru/evotor/tspiot/result/CodesCheckResult.java index 28e2b1f11d..1f38864274 100644 --- a/src/main/java/ru/evotor/integrations/result/CodesCheckResult.java +++ b/src/main/java/ru/evotor/tspiot/result/CodesCheckResult.java @@ -1,4 +1,4 @@ -package ru.evotor.integrations.result; +package ru.evotor.tspiot.result; import android.os.Parcel; import android.os.Parcelable; diff --git a/src/main/java/ru/evotor/tspiot/result/Errors.java b/src/main/java/ru/evotor/tspiot/result/Errors.java new file mode 100644 index 0000000000..ac094ae8ef --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/result/Errors.java @@ -0,0 +1,59 @@ +package ru.evotor.tspiot.result; + +import android.os.Parcel; +import android.os.Parcelable; +import androidx.annotation.Nullable; + +public enum Errors implements Parcelable { + NOT_REGISTERED, + NOT_CONFIGURED, + ONLINE_CHECK_FAILED, + OFFLINE_CHECK_FAILED, + KKM_ERROR, + FN_SID_ERROR, + NOT_FOUND_PERMISSION, + NOT_FOUND_PMSR_ID, + NOT_FOUND_PMSR_TOKEN, + FAILED_GET_APP_NAME, + FAILED_GET_APP_VERSION, + UNKNOWN_ERROR; + + /** Версия Errors */ + public final static int VERSION = 1; + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(Parcel parcel, int i) { + parcel.writeInt(VERSION); + parcel.writeString(this.name()); + } + + @Nullable + public static Errors restoreFormParcel(Parcel parcel) { + int version = parcel.readInt(); + + try { + return Errors.valueOf(parcel.readString()); + } catch (Exception exception) { + if (version != VERSION) { + return Errors.UNKNOWN_ERROR; + } else { + return null; + } + } + } + + public final static Creator CREATOR = new Creator<>() { + @Override + public Errors createFromParcel(Parcel parcel) { + return restoreFormParcel(parcel); + } + + @Override + public Errors[] newArray(int size) { + return new Errors[size]; + } + }; +} diff --git a/src/main/java/ru/evotor/integrations/result/KktInfo.java b/src/main/java/ru/evotor/tspiot/result/KktInfo.java similarity index 84% rename from src/main/java/ru/evotor/integrations/result/KktInfo.java rename to src/main/java/ru/evotor/tspiot/result/KktInfo.java index f45ae3d26f..02c2a4e33a 100644 --- a/src/main/java/ru/evotor/integrations/result/KktInfo.java +++ b/src/main/java/ru/evotor/tspiot/result/KktInfo.java @@ -1,4 +1,4 @@ -package ru.evotor.integrations.result; +package ru.evotor.tspiot.result; import android.os.Parcel; import android.os.Parcelable; @@ -21,10 +21,10 @@ public class KktInfo implements Parcelable { /** ИНН ККТ */ private final String kktInn; - /** Время проверки кода в ТС ПИоТ */ - private final String codesCheckTimeOut; + /** Время проверки кода в ТС ПИоТ (В миллисекундах) */ + private final int codesCheckTimeOut; - public KktInfo(String tspiotId, String kktSerial, String fnSerial, String kktInn, String codesCheckTimeOut) { + public KktInfo(String tspiotId, String kktSerial, String fnSerial, String kktInn, int codesCheckTimeOut) { this.tspiotId = tspiotId; this.kktSerial = kktSerial; this.fnSerial = fnSerial; @@ -38,7 +38,7 @@ private KktInfo(Parcel parcel) { this.kktSerial = parcel.readString(); this.fnSerial = parcel.readString(); this.kktInn = parcel.readString(); - this.codesCheckTimeOut = parcel.readString(); + this.codesCheckTimeOut = parcel.readInt(); } public String getTspiotId() { return tspiotId; } @@ -49,7 +49,7 @@ private KktInfo(Parcel parcel) { public String getKktInn() { return kktInn; } - public String getCodesCheckTimeOut() { return codesCheckTimeOut; } + public int getCodesCheckTimeOut() { return codesCheckTimeOut; } @Override public int describeContents() { return 0; } @@ -61,7 +61,7 @@ public void writeToParcel(Parcel parcel, int i) { parcel.writeString(kktSerial); parcel.writeString(fnSerial); parcel.writeString(kktInn); - parcel.writeString(codesCheckTimeOut); + parcel.writeInt(codesCheckTimeOut); } public static final Creator CREATOR = new Creator<>() { diff --git a/src/main/java/ru/evotor/integrations/result/IntegrationError.java b/src/main/java/ru/evotor/tspiot/result/TsPioTError.java similarity index 50% rename from src/main/java/ru/evotor/integrations/result/IntegrationError.java rename to src/main/java/ru/evotor/tspiot/result/TsPioTError.java index ce619a7b10..f0b963dd4c 100644 --- a/src/main/java/ru/evotor/integrations/result/IntegrationError.java +++ b/src/main/java/ru/evotor/tspiot/result/TsPioTError.java @@ -1,29 +1,29 @@ -package ru.evotor.integrations.result; +package ru.evotor.tspiot.result; import android.os.Parcel; import android.os.Parcelable; -public class IntegrationError implements Parcelable { +public class TsPioTError implements Parcelable { /** Версия IntegrationError */ private final static int VERSION = 1; - private final int code; + private final Errors code; private final String message; - private IntegrationError(Parcel parcel) { + private TsPioTError(Parcel parcel) { int version = parcel.readInt(); - this.code = parcel.readInt(); + this.code = parcel.readParcelable(Errors.class.getClassLoader()); this.message = parcel.readString(); } - public IntegrationError(int code, String message) { + public TsPioTError(Errors code, String message) { this.code = code; this.message = message; } - public int getCode() { return code; } + public Errors getCode() { return code; } public String getMessage() { return message; } @@ -33,19 +33,19 @@ public IntegrationError(int code, String message) { @Override public void writeToParcel(Parcel parcel, int flags) { parcel.writeInt(VERSION); - parcel.writeInt(code); + parcel.writeParcelable(code, flags); parcel.writeString(message); } - public static final Creator CREATOR = new Creator<>() { + public static final Creator CREATOR = new Creator<>() { @Override - public IntegrationError createFromParcel(Parcel parcel) { - return new IntegrationError(parcel); + public TsPioTError createFromParcel(Parcel parcel) { + return new TsPioTError(parcel); } @Override - public IntegrationError[] newArray(int i) { - return new IntegrationError[i]; + public TsPioTError[] newArray(int size) { + return new TsPioTError[size]; } }; } diff --git a/src/main/java/ru/evotor/integrations/result/IntegrationResult.java b/src/main/java/ru/evotor/tspiot/result/TsPioTResult.java similarity index 54% rename from src/main/java/ru/evotor/integrations/result/IntegrationResult.java rename to src/main/java/ru/evotor/tspiot/result/TsPioTResult.java index 4b462c010f..f2100f3742 100644 --- a/src/main/java/ru/evotor/integrations/result/IntegrationResult.java +++ b/src/main/java/ru/evotor/tspiot/result/TsPioTResult.java @@ -1,28 +1,37 @@ -package ru.evotor.integrations.result; +package ru.evotor.tspiot.result; import android.os.Parcel; import android.os.Parcelable; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import java.io.Serializable; -public class IntegrationResult implements Parcelable { +public class TsPioTResult implements Parcelable { /** Версия IntegrationResult */ private final static int VERSION = 1; + @Nullable private final Class classType; - private final T data; + @Nullable private final TsPioTError error; + + @Nullable private final T data; - private IntegrationResult(Parcel parcel) { + private TsPioTResult(Parcel parcel) { int version = parcel.readInt(); this.classType = upcastClassType(parcel.readSerializable()); this.data = parseData(classType, parcel); + this.error = parcel.readParcelable(TsPioTError.class.getClassLoader()); } @SuppressWarnings("unchecked") @Nullable private Class upcastClassType(Serializable serializable) { + if (serializable == null) { + return null; + } + try { return (Class) serializable; } catch (Exception exception) { @@ -33,6 +42,10 @@ private Class upcastClassType(Serializable serializable) { @Nullable private T parseData(Class classType, Parcel parcel) { try { + if (classType == null) { + return parcel.readParcelable(null); + } + return parcel.readParcelable(classType.getClassLoader()); } catch (Exception exception) { return null; @@ -40,13 +53,24 @@ private T parseData(Class classType, Parcel parcel) { } @SuppressWarnings("unchecked") - public IntegrationResult(T data) { + public TsPioTResult(T data) { this.classType = (Class) data.getClass(); this.data = data; + this.error = null; } + public TsPioTResult(@NonNull TsPioTError error) { + this.classType = null; + this.data = null; + this.error = error; + } + + @Nullable public T getData() { return data; } + @Nullable + public TsPioTError getError() { return error; } + @Override public int describeContents() { return 0; } @@ -55,17 +79,18 @@ public void writeToParcel(Parcel parcel, int flags) { parcel.writeInt(VERSION); parcel.writeSerializable(classType); parcel.writeParcelable(data, flags); + parcel.writeParcelable(error, flags); } - public static final Creator> CREATOR = new Creator<>() { + public static final Creator> CREATOR = new Creator<>() { @Override - public IntegrationResult createFromParcel(Parcel parcel) { - return new IntegrationResult<>(parcel); + public TsPioTResult createFromParcel(Parcel parcel) { + return new TsPioTResult<>(parcel); } @Override - public IntegrationResult[] newArray(int i) { - return new IntegrationResult[i]; + public TsPioTResult[] newArray(int size) { + return new TsPioTResult[size]; } }; } diff --git a/src/main/java/ru/evotor/integrations/result/VariableExpiration.java b/src/main/java/ru/evotor/tspiot/result/VariableExpiration.java similarity index 97% rename from src/main/java/ru/evotor/integrations/result/VariableExpiration.java rename to src/main/java/ru/evotor/tspiot/result/VariableExpiration.java index 171c3715b1..a77ecbac4e 100644 --- a/src/main/java/ru/evotor/integrations/result/VariableExpiration.java +++ b/src/main/java/ru/evotor/tspiot/result/VariableExpiration.java @@ -1,4 +1,4 @@ -package ru.evotor.integrations.result; +package ru.evotor.tspiot.result; import android.os.Parcel; import android.os.Parcelable; diff --git a/src/main/java/ru/evotor/integrations/result/VariableExpirations.java b/src/main/java/ru/evotor/tspiot/result/VariableExpirations.java similarity index 97% rename from src/main/java/ru/evotor/integrations/result/VariableExpirations.java rename to src/main/java/ru/evotor/tspiot/result/VariableExpirations.java index c860cc6203..3e67d76cc9 100644 --- a/src/main/java/ru/evotor/integrations/result/VariableExpirations.java +++ b/src/main/java/ru/evotor/tspiot/result/VariableExpirations.java @@ -1,4 +1,4 @@ -package ru.evotor.integrations.result; +package ru.evotor.tspiot.result; import android.os.Parcel; import android.os.Parcelable; diff --git a/src/main/java/ru/evotor/tspiot/service/ITsPioTConnectionWrapper.java b/src/main/java/ru/evotor/tspiot/service/ITsPioTConnectionWrapper.java new file mode 100644 index 0000000000..95bdc90bb7 --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/service/ITsPioTConnectionWrapper.java @@ -0,0 +1,7 @@ +package ru.evotor.tspiot.service; + +public interface ITsPioTConnectionWrapper { + void onTsPioTServiceConnected(ITsPioTServiceWrapper tsPioTService); + + void onTsPioTServiceDisconnected(); +} diff --git a/src/main/java/ru/evotor/tspiot/service/ITsPioTServiceWrapper.java b/src/main/java/ru/evotor/tspiot/service/ITsPioTServiceWrapper.java new file mode 100644 index 0000000000..0539686752 --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/service/ITsPioTServiceWrapper.java @@ -0,0 +1,15 @@ +package ru.evotor.tspiot.service; + +import java.util.List; + +import ru.evotor.tspiot.exceptions.TsPioTErrorHolderException; +import ru.evotor.tspiot.exceptions.base.TsPioTServiceException; +import ru.evotor.tspiot.model.MarkingCode; +import ru.evotor.tspiot.result.CodesCheckResult; +import ru.evotor.tspiot.result.KktInfo; + +public interface ITsPioTServiceWrapper { + KktInfo getKktInfo() throws TsPioTServiceException, TsPioTErrorHolderException; + + CodesCheckResult getMarkedProductsInfo(List codes) throws TsPioTServiceException, TsPioTErrorHolderException; +} diff --git a/src/main/java/ru/evotor/tspiot/service/TsPioTService.java b/src/main/java/ru/evotor/tspiot/service/TsPioTService.java new file mode 100644 index 0000000000..2742fa1469 --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/service/TsPioTService.java @@ -0,0 +1,170 @@ +package ru.evotor.tspiot.service; + +import android.app.Service; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.IBinder; +import android.os.Parcelable; +import android.os.RemoteException; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import ru.evotor.devices.commons.exception.DeviceServiceOperationOnMainThreadException; +import ru.evotor.tspiot.ITsPioTService; +import ru.evotor.tspiot.TsPioTServiceConnector; +import ru.evotor.tspiot.exceptions.NullContextException; +import ru.evotor.tspiot.exceptions.ServiceAlreadyConnectedException; +import ru.evotor.tspiot.exceptions.TsPioTErrorHolderException; +import ru.evotor.tspiot.exceptions.base.TsPioTServiceException; +import ru.evotor.tspiot.exceptions.UnknownException; +import ru.evotor.tspiot.model.MarkingCode; +import ru.evotor.tspiot.result.CodesCheckResult; +import ru.evotor.tspiot.result.KktInfo; +import ru.evotor.tspiot.result.TsPioTError; +import ru.evotor.tspiot.result.TsPioTResult; + +public class TsPioTService implements ITsPioTServiceWrapper { + + public static final String UNKNOWN_EXCEPTION_TEXT = "Request to TsPioTService failed"; + + private Context context; + + private final ExecutorService executor = Executors.newSingleThreadExecutor(); + + private ITsPioTService service; + + private volatile boolean serviceConnected = false; + + private final ServiceConnection serviceConnection = new ServiceConnection() { + @Override + public void onServiceConnected(ComponentName componentName, IBinder iBinder) { + service = ITsPioTService.Stub.asInterface(iBinder); + serviceConnected = true; + + for(ITsPioTConnectionWrapper connectionWrapper : TsPioTServiceConnector.getConnectionWrappers()) { + connectionWrapper.onTsPioTServiceConnected(TsPioTService.this); + } + } + + @Override + public void onServiceDisconnected(ComponentName componentName) { + service = null; + serviceConnected = false; + context = null; + + for(ITsPioTConnectionWrapper connectionWrapper : TsPioTServiceConnector.getConnectionWrappers()) { + connectionWrapper.onTsPioTServiceDisconnected(); + } + } + }; + + public TsPioTService() { } + + public synchronized void connectService(Context userContext, boolean force) throws ServiceAlreadyConnectedException, NullContextException { + if (!force && service != null) { + throw new ServiceAlreadyConnectedException(); + } + + if (userContext == null) { + throw new NullContextException(); + } + + executor.execute(() -> { + context = userContext; + Intent pr = new Intent(TsPioTServiceConnector.ACTION_TSPIOT_SERVICE); + pr.setPackage(TsPioTServiceConnector.TARGET_PACKAGE); + pr.setClassName(TsPioTServiceConnector.TARGET_PACKAGE, TsPioTServiceConnector.TARGET_CLASS_NAME); + serviceConnected = false; + + boolean serviceBound = context.bindService(pr, serviceConnection, Service.BIND_AUTO_CREATE); + if (!serviceBound) { + serviceConnected = false; + } + }); + } + + public synchronized void reconnectService() throws NullContextException { + if (context == null) { + throw new NullContextException(); + } + + try { + connectService(context, true); + } catch (ServiceAlreadyConnectedException ignored) { } + } + + public synchronized void disconnectService() throws NullContextException { + if (context == null) { + throw new NullContextException(); + } + + executor.execute(() -> { + context.unbindService(serviceConnection); + service = null; + serviceConnected = false; + context = null; + + for(ITsPioTConnectionWrapper connectionWrapper : TsPioTServiceConnector.getConnectionWrappers()) { + connectionWrapper.onTsPioTServiceDisconnected(); + } + }); + } + + public boolean getServiceConnected() { return serviceConnected; } + + /** Метод для получения информации о драйвере ТС ПИоТ */ + @SuppressWarnings("rawtypes") + @Override + public KktInfo getKktInfo() throws TsPioTServiceException, TsPioTErrorHolderException { + DeviceServiceOperationOnMainThreadException.throwIfMainThread(); + + try { + TsPioTResult result = service.getKktInfo(); + Parcelable data = result.getData(); + + if (data != null) { + return (KktInfo) data; + } else { + TsPioTError error = result.getError(); + + if (error != null) { + throw new TsPioTErrorHolderException(error.getCode(), error.getMessage()); + } else { + throw new UnknownException(UNKNOWN_EXCEPTION_TEXT); + } + } + } catch (RemoteException | RuntimeException ex) { + TsPioTServiceConnector.processException(ex); + throw new UnknownException(UNKNOWN_EXCEPTION_TEXT); + } + } + + /** Метод проверки марок */ + @SuppressWarnings("rawtypes") + @Override + public CodesCheckResult getMarkedProductsInfo(List codes) throws TsPioTServiceException, TsPioTErrorHolderException { + DeviceServiceOperationOnMainThreadException.throwIfMainThread(); + + try { + TsPioTResult result = service.getMarkedProductsInfo(codes); + Parcelable data = result.getData(); + + if (data != null) { + return (CodesCheckResult) data; + } else { + TsPioTError error = result.getError(); + + if (error != null) { + throw new TsPioTErrorHolderException(error.getCode(), error.getMessage()); + } else { + throw new UnknownException(UNKNOWN_EXCEPTION_TEXT); + } + } + } catch (RemoteException | RuntimeException ex) { + TsPioTServiceConnector.processException(ex); + throw new UnknownException(UNKNOWN_EXCEPTION_TEXT); + } + } +} From 2635c4ecafe651bbdc947164439d6e195a8a9d28 Mon Sep 17 00:00:00 2001 From: "v.drebnev" Date: Tue, 7 Apr 2026 16:49:35 +0500 Subject: [PATCH 07/17] MRK-5213 --- src/main/java/ru/evotor/tspiot/result/TsPioTError.java | 2 +- src/main/java/ru/evotor/tspiot/result/TsPioTResult.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/evotor/tspiot/result/TsPioTError.java b/src/main/java/ru/evotor/tspiot/result/TsPioTError.java index f0b963dd4c..33f37ec91e 100644 --- a/src/main/java/ru/evotor/tspiot/result/TsPioTError.java +++ b/src/main/java/ru/evotor/tspiot/result/TsPioTError.java @@ -5,7 +5,7 @@ public class TsPioTError implements Parcelable { - /** Версия IntegrationError */ + /** Версия TsPioTError */ private final static int VERSION = 1; private final Errors code; diff --git a/src/main/java/ru/evotor/tspiot/result/TsPioTResult.java b/src/main/java/ru/evotor/tspiot/result/TsPioTResult.java index f2100f3742..a731854c91 100644 --- a/src/main/java/ru/evotor/tspiot/result/TsPioTResult.java +++ b/src/main/java/ru/evotor/tspiot/result/TsPioTResult.java @@ -8,7 +8,7 @@ public class TsPioTResult implements Parcelable { - /** Версия IntegrationResult */ + /** Версия TsPioTResult */ private final static int VERSION = 1; @Nullable From a5c028c051efcb0b2af8b99d79e93a632986e98f Mon Sep 17 00:00:00 2001 From: "v.drebnev" Date: Thu, 9 Apr 2026 12:01:39 +0500 Subject: [PATCH 08/17] MRK-5213 --- .../ru/evotor/tspiot/TsPioTServiceConnector.java | 6 +++--- ...ioTServiceOperationOnMainThreadException.java | 16 ++++++++++++++++ .../ru/evotor/tspiot/service/TsPioTService.java | 10 +++++----- 3 files changed, 24 insertions(+), 8 deletions(-) create mode 100644 src/main/java/ru/evotor/tspiot/exceptions/TsPioTServiceOperationOnMainThreadException.java diff --git a/src/main/java/ru/evotor/tspiot/TsPioTServiceConnector.java b/src/main/java/ru/evotor/tspiot/TsPioTServiceConnector.java index a162324a33..8bddbaa9c4 100644 --- a/src/main/java/ru/evotor/tspiot/TsPioTServiceConnector.java +++ b/src/main/java/ru/evotor/tspiot/TsPioTServiceConnector.java @@ -3,8 +3,8 @@ import android.content.Context; import android.os.DeadObjectException; import java.util.concurrent.CopyOnWriteArrayList; -import ru.evotor.devices.commons.exception.DeviceServiceOperationOnMainThreadException; import ru.evotor.tspiot.exceptions.ServiceNotConnectedException; +import ru.evotor.tspiot.exceptions.TsPioTServiceOperationOnMainThreadException; import ru.evotor.tspiot.exceptions.base.TsPioTServiceException; import ru.evotor.tspiot.exceptions.TsPioTServiceRuntimeException; import ru.evotor.tspiot.service.ITsPioTConnectionWrapper; @@ -40,14 +40,14 @@ public static void clearConnectionWrappers() { } public static ITsPioTServiceWrapper connectTsPioTService(Context context) throws TsPioTServiceException { - DeviceServiceOperationOnMainThreadException.throwIfMainThread(); + TsPioTServiceOperationOnMainThreadException.throwIfMainThread(); tsPioTService.connectService(context, false); return tsPioTService; } public static void disconnectTsPioTService() throws TsPioTServiceException { - DeviceServiceOperationOnMainThreadException.throwIfMainThread(); + TsPioTServiceOperationOnMainThreadException.throwIfMainThread(); tsPioTService.disconnectService(); } diff --git a/src/main/java/ru/evotor/tspiot/exceptions/TsPioTServiceOperationOnMainThreadException.java b/src/main/java/ru/evotor/tspiot/exceptions/TsPioTServiceOperationOnMainThreadException.java new file mode 100644 index 0000000000..7641883b55 --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/exceptions/TsPioTServiceOperationOnMainThreadException.java @@ -0,0 +1,16 @@ +package ru.evotor.tspiot.exceptions; + +import android.os.Looper; +import ru.evotor.tspiot.exceptions.base.TsPioTServiceException; + +public class TsPioTServiceOperationOnMainThreadException extends TsPioTServiceException { + public TsPioTServiceOperationOnMainThreadException() { + super("It is forbidden to perform operations with TS PIoT service in the main thread, it can be time-consuming"); + } + + public static void throwIfMainThread() throws TsPioTServiceOperationOnMainThreadException { + if (Looper.getMainLooper() == Looper.myLooper()) { + throw new TsPioTServiceOperationOnMainThreadException(); + } + } +} diff --git a/src/main/java/ru/evotor/tspiot/service/TsPioTService.java b/src/main/java/ru/evotor/tspiot/service/TsPioTService.java index 2742fa1469..2ca2a0da33 100644 --- a/src/main/java/ru/evotor/tspiot/service/TsPioTService.java +++ b/src/main/java/ru/evotor/tspiot/service/TsPioTService.java @@ -11,12 +11,12 @@ import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import ru.evotor.devices.commons.exception.DeviceServiceOperationOnMainThreadException; import ru.evotor.tspiot.ITsPioTService; import ru.evotor.tspiot.TsPioTServiceConnector; import ru.evotor.tspiot.exceptions.NullContextException; import ru.evotor.tspiot.exceptions.ServiceAlreadyConnectedException; import ru.evotor.tspiot.exceptions.TsPioTErrorHolderException; +import ru.evotor.tspiot.exceptions.TsPioTServiceOperationOnMainThreadException; import ru.evotor.tspiot.exceptions.base.TsPioTServiceException; import ru.evotor.tspiot.exceptions.UnknownException; import ru.evotor.tspiot.model.MarkingCode; @@ -117,8 +117,8 @@ public synchronized void disconnectService() throws NullContextException { /** Метод для получения информации о драйвере ТС ПИоТ */ @SuppressWarnings("rawtypes") @Override - public KktInfo getKktInfo() throws TsPioTServiceException, TsPioTErrorHolderException { - DeviceServiceOperationOnMainThreadException.throwIfMainThread(); + public KktInfo getKktInfo() throws TsPioTServiceException { + TsPioTServiceOperationOnMainThreadException.throwIfMainThread(); try { TsPioTResult result = service.getKktInfo(); @@ -144,8 +144,8 @@ public KktInfo getKktInfo() throws TsPioTServiceException, TsPioTErrorHolderExce /** Метод проверки марок */ @SuppressWarnings("rawtypes") @Override - public CodesCheckResult getMarkedProductsInfo(List codes) throws TsPioTServiceException, TsPioTErrorHolderException { - DeviceServiceOperationOnMainThreadException.throwIfMainThread(); + public CodesCheckResult getMarkedProductsInfo(List codes) throws TsPioTServiceException { + TsPioTServiceOperationOnMainThreadException.throwIfMainThread(); try { TsPioTResult result = service.getMarkedProductsInfo(codes); From 511fdba1342191fb2921dac253fd1b335b39d3eb Mon Sep 17 00:00:00 2001 From: "v.drebnev" Date: Wed, 6 May 2026 12:03:02 +0500 Subject: [PATCH 09/17] MRK-5213 --- build.gradle | 2 +- .../aidl/ru/evotor/tspiot/ITsPioTService.aidl | 2 +- src/main/java/ru/evotor/tspiot/Utils.java | 57 ++ .../TsPioTErrorHolderException.java | 12 +- .../ru/evotor/tspiot/result/CodeCheck.java | 582 ------------------ .../ru/evotor/tspiot/result/CodesCheck.java | 127 ---- .../tspiot/result/CodesCheckResult.java | 45 -- .../java/ru/evotor/tspiot/result/Errors.java | 59 -- .../ru/evotor/tspiot/result/TsPioTError.java | 27 +- .../ru/evotor/tspiot/result/TsPioTResult.java | 33 +- .../tspiot/result/model/CodesCheckResult.java | 59 ++ .../tspiot/result/{ => model}/KktInfo.java | 35 +- .../evotor/tspiot/result/model/LmChzInfo.java | 179 ++++++ .../{ => model}/VariableExpiration.java | 13 +- .../{ => model}/VariableExpirations.java | 12 +- .../result/model/base/BaseCodeCheck.java | 185 ++++++ .../result/model/base/BaseCodesCheck.java | 59 ++ .../result/model/base/ErrorDescription.java | 5 + .../errors/CheckServiceAreUnavailable.java | 33 + .../errors/CodesCheckErrorDescription.java | 67 ++ .../model/errors/CommonErrorDescription.java | 53 ++ .../errors/CommonErrorDescriptionError.java | 74 +++ .../model/errors/MessageErrorDescription.java | 45 ++ .../errors/MessageErrorDescriptionError.java | 126 ++++ .../model/errors/TsPioTErrorsDescription.java | 37 ++ .../model/offline/OfflineCodeCheck.java | 68 ++ .../model/offline/OfflineCodesCheck.java | 97 +++ .../result/model/online/OnlineCodeCheck.java | 317 ++++++++++ .../result/model/online/OnlineCodesCheck.java | 87 +++ .../tspiot/service/ITsPioTServiceWrapper.java | 10 +- .../evotor/tspiot/service/TsPioTService.java | 19 +- 31 files changed, 1640 insertions(+), 886 deletions(-) delete mode 100644 src/main/java/ru/evotor/tspiot/result/CodeCheck.java delete mode 100644 src/main/java/ru/evotor/tspiot/result/CodesCheck.java delete mode 100644 src/main/java/ru/evotor/tspiot/result/CodesCheckResult.java delete mode 100644 src/main/java/ru/evotor/tspiot/result/Errors.java create mode 100644 src/main/java/ru/evotor/tspiot/result/model/CodesCheckResult.java rename src/main/java/ru/evotor/tspiot/result/{ => model}/KktInfo.java (65%) create mode 100644 src/main/java/ru/evotor/tspiot/result/model/LmChzInfo.java rename src/main/java/ru/evotor/tspiot/result/{ => model}/VariableExpiration.java (81%) rename src/main/java/ru/evotor/tspiot/result/{ => model}/VariableExpirations.java (83%) create mode 100644 src/main/java/ru/evotor/tspiot/result/model/base/BaseCodeCheck.java create mode 100644 src/main/java/ru/evotor/tspiot/result/model/base/BaseCodesCheck.java create mode 100644 src/main/java/ru/evotor/tspiot/result/model/base/ErrorDescription.java create mode 100644 src/main/java/ru/evotor/tspiot/result/model/errors/CheckServiceAreUnavailable.java create mode 100644 src/main/java/ru/evotor/tspiot/result/model/errors/CodesCheckErrorDescription.java create mode 100644 src/main/java/ru/evotor/tspiot/result/model/errors/CommonErrorDescription.java create mode 100644 src/main/java/ru/evotor/tspiot/result/model/errors/CommonErrorDescriptionError.java create mode 100644 src/main/java/ru/evotor/tspiot/result/model/errors/MessageErrorDescription.java create mode 100644 src/main/java/ru/evotor/tspiot/result/model/errors/MessageErrorDescriptionError.java create mode 100644 src/main/java/ru/evotor/tspiot/result/model/errors/TsPioTErrorsDescription.java create mode 100644 src/main/java/ru/evotor/tspiot/result/model/offline/OfflineCodeCheck.java create mode 100644 src/main/java/ru/evotor/tspiot/result/model/offline/OfflineCodesCheck.java create mode 100644 src/main/java/ru/evotor/tspiot/result/model/online/OnlineCodeCheck.java create mode 100644 src/main/java/ru/evotor/tspiot/result/model/online/OnlineCodesCheck.java diff --git a/build.gradle b/build.gradle index ad5d25a90e..2e0f6d9de7 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ apply plugin: 'org.jetbrains.dokka' android { namespace = "ru.evotor.integrations" - def version = 40 + def version = 41 compileSdk 30 diff --git a/src/main/aidl/ru/evotor/tspiot/ITsPioTService.aidl b/src/main/aidl/ru/evotor/tspiot/ITsPioTService.aidl index 95abd74e8c..b654ddd95f 100644 --- a/src/main/aidl/ru/evotor/tspiot/ITsPioTService.aidl +++ b/src/main/aidl/ru/evotor/tspiot/ITsPioTService.aidl @@ -6,5 +6,5 @@ import ru.evotor.tspiot.result.TsPioTResult; interface ITsPioTService { TsPioTResult getKktInfo(); - TsPioTResult getMarkedProductsInfo(in List codes); + TsPioTResult getMarkedProductsInfo(in List codes, in String userUuid); } \ No newline at end of file diff --git a/src/main/java/ru/evotor/tspiot/Utils.java b/src/main/java/ru/evotor/tspiot/Utils.java index 4129f12675..452ae6904a 100644 --- a/src/main/java/ru/evotor/tspiot/Utils.java +++ b/src/main/java/ru/evotor/tspiot/Utils.java @@ -1,7 +1,9 @@ package ru.evotor.tspiot; import android.os.Parcel; +import android.os.Parcelable; import androidx.annotation.Nullable; +import java.io.Serializable; public final class Utils { @@ -22,4 +24,59 @@ public static Boolean readBoolean(Parcel parcel) { return null; } } + + @SuppressWarnings("unchecked") + @Nullable + public static Class readClass(Parcel parcel) { + Serializable serializable = parcel.readSerializable(); + + if (serializable == null) { + return null; + } + + try { + return (Class) serializable; + } catch (Exception exception) { + return null; + } + } + + @Nullable + public static T readData(Class classType, Parcel parcel) { + try { + if (classType == null) { + return parcel.readParcelable(null); + } + + return parcel.readParcelable(classType.getClassLoader()); + } catch (Exception exception) { + return null; + } + } + + public static String toString(@Nullable Object object) { + return object == null ? "null" : object.toString(); + } + + public static String toString(@Nullable Object[] objects) { + if (objects == null) { + return "null"; + } else if (objects.length == 0) { + return "[]"; + } else { + StringBuilder sb = new StringBuilder(); + + sb.append("["); + for (int i = 0; i < objects.length; i++) { + sb.append(objects[i]); + + if (i != objects.length - 1) { + sb.append(", "); + } + } + sb.append("]"); + + return sb.toString(); + } + } } diff --git a/src/main/java/ru/evotor/tspiot/exceptions/TsPioTErrorHolderException.java b/src/main/java/ru/evotor/tspiot/exceptions/TsPioTErrorHolderException.java index 2af941a060..b848de9b99 100644 --- a/src/main/java/ru/evotor/tspiot/exceptions/TsPioTErrorHolderException.java +++ b/src/main/java/ru/evotor/tspiot/exceptions/TsPioTErrorHolderException.java @@ -1,18 +1,16 @@ package ru.evotor.tspiot.exceptions; import ru.evotor.tspiot.exceptions.base.TsPioTServiceException; -import ru.evotor.tspiot.result.Errors; +import ru.evotor.tspiot.result.model.base.ErrorDescription; +import ru.evotor.tspiot.result.model.errors.TsPioTErrorsDescription; /** Исключение обёртка для передачи ошибок от драйвера ТС ПИоТ */ public class TsPioTErrorHolderException extends TsPioTServiceException { - public final Errors code; + public final TsPioTErrorsDescription errorDescription; - public final String message; - - public TsPioTErrorHolderException(Errors code, String message) { + public TsPioTErrorHolderException(TsPioTErrorsDescription errorDescription) { super(); - this.code = code; - this.message = message; + this.errorDescription = errorDescription; } } diff --git a/src/main/java/ru/evotor/tspiot/result/CodeCheck.java b/src/main/java/ru/evotor/tspiot/result/CodeCheck.java deleted file mode 100644 index 9d23ab0fe7..0000000000 --- a/src/main/java/ru/evotor/tspiot/result/CodeCheck.java +++ /dev/null @@ -1,582 +0,0 @@ -package ru.evotor.tspiot.result; - -import android.os.Parcel; -import android.os.Parcelable; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import java.util.Date; -import ru.evotor.tspiot.Utils; - -public class CodeCheck implements Parcelable { - - /** Версия CodeCheck */ - private final static int VERSION = 1; - - /** КИ / КиЗ из запроса */ - private final String cis; - - /** Признак наличия кода в ГИС МТ */ - private final boolean found; - - /** Результат проверки валидности структуры КИ / КиЗ */ - private final boolean valid; - - /** КИ без крипто-подписи / КиЗ */ - private final String printView; - - /** Код товара */ - private final String gtin; - - /** Массив идентификаторов товарных групп */ - private final int[] groupIds; - - /** Результат проверки крипто-подписи КМ */ - private final boolean verified; - - /** Признак возможности реализации КИ / КиЗ */ - private final boolean realizable; - - /** Признак нанесения КИ / КиЗ на упаковку */ - private final boolean utilized; - - /** Дата и время истечения срока годности */ - @Nullable private final Date expireDate; - - /** Информация о вариативном сроке годности */ - @Nullable private final VariableExpirations variableExpirations; - - /** Дата производства продукции */ - @Nullable private final Date productionDate; - - /** Переменный вес продукции (в граммах) */ - @Nullable private final Integer productWeight; - - /** Производственный ветеринарный сопроводительный документ */ - @Nullable private final String prVetDocument; - - /** Признак, определяющий, что запрос направлен владельцем кода (определяется по аутентификационному токену) */ - @Nullable private final Boolean isOwner; - - /** Признак того, что розничная продажа продукции заблокирована по решению ОГВ */ - @Nullable private final Boolean isBlocked; - - /** Органы государственной власти, установившие блокировку на КИ */ - private final String[] ogvs; - - /** Сообщение об ошибке */ - @Nullable private final String message; - - /** - * Код ошибки - *
      - * Возможные значения: - *
        - *
      • 0 — ошибки отсутствуют
      • - *
      • 1 — ошибка валидации КМ
      • - *
      • 2 — КМ не содержит GTIN
      • - *
      • 3 — КМ не содержит серийный номер
      • - *
      • 4 — КМ содержит недопустимые символы
      • - *
      • 5 — ошибка верификации крипто-подписи КМ (формат крипто-подписи не соответствует типу КМ)
      • - *
      • 6 — ошибка верификации крипто-подписи КМ (криптоподпись невалидная)
      • - *
      • 7 — ошибка верификации крипто-подписи КМ (крипто-ключ не валиден)
      • - *
      • 8 — КМ не прошел верификацию в стране эмитента
      • - *
      • 9 — Найденные AI в КМ не поддерживаются
      • - *
      • 10 — КМ не найден в ГИС МТ
      • - *
      • 11 — КМ не найден в трансгране
      • - *
      - *
    - */ - @Nullable private final Integer errorCode; - - /** Признак контроля прослеживаемости в товарной группе */ - private final boolean isTracking; - - /** Признак продажи товара */ - private final boolean sold; - - /** Признак использования причин выбытия, разрешающих продажу КМ */ - @Nullable private final Integer eliminationState; - - /** Максимальная розничная цена */ - @Nullable private final Integer mrp; - - /** Единая минимальная цена (ЕМЦ) */ - @Nullable private final Integer smp; - - /** Признак принадлежности табачной продукции к «серой зоне» */ - @Nullable private final Boolean grayZone; - - /** - * Количество единиц товара в потребительской упаковке / Фактический объём / Фактический вес - */ - @Nullable private final Integer innerUnitCount; - - /** Счётчик проданного и возвращённого товара */ - @Nullable private final Integer soldUnitCount; - - /** Тип упаковки */ - private final String packageType; - - /** КИ агрегата */ - @Nullable private final String parent; - - /** ИНН производителя */ - @Nullable private final String producerInn; - - /** Номер производственной серии */ - @Nullable private final String productionSerialNumber; - - /** Номер производственной партии */ - @Nullable private final String productionBatchNumber; - - /** Заводской серийный номер */ - @Nullable private final String factorySerialNumber; - - /** Ёмкость КИГУ */ - @Nullable private final Integer packageQuantity; - - private CodeCheck(Parcel parcel) { - int version = parcel.readInt(); - this.cis = parcel.readString(); - this.found = parcel.readInt() == 1; - this.valid = parcel.readInt() == 1; - this.printView = parcel.readString(); - this.gtin = parcel.readString(); - this.groupIds = parcel.createIntArray(); - this.verified = parcel.readInt() == 1; - this.realizable = parcel.readInt() == 1; - this.utilized = parcel.readInt() == 1; - this.expireDate = (Date) parcel.readSerializable(); - this.variableExpirations = parcel.readTypedObject(VariableExpirations.CREATOR); - this.productionDate = (Date) parcel.readSerializable(); - this.productWeight = Utils.readInteger(parcel); - this.prVetDocument = parcel.readString(); - this.isOwner = Utils.readBoolean(parcel); - this.isBlocked = Utils.readBoolean(parcel); - this.ogvs = parcel.createStringArray(); - this.message = parcel.readString(); - this.errorCode = Utils.readInteger(parcel); - this.isTracking = parcel.readInt() == 1; - this.sold = parcel.readInt() == 1; - this.eliminationState = Utils.readInteger(parcel); - this.mrp = Utils.readInteger(parcel); - this.smp = Utils.readInteger(parcel); - this.grayZone = Utils.readBoolean(parcel); - this.innerUnitCount = Utils.readInteger(parcel); - this.soldUnitCount = Utils.readInteger(parcel); - this.packageType = parcel.readString(); - this.parent = parcel.readString(); - this.producerInn = parcel.readString(); - this.productionSerialNumber = parcel.readString(); - this.productionBatchNumber = parcel.readString(); - this.factorySerialNumber = parcel.readString(); - this.packageQuantity = Utils.readInteger(parcel); - } - - public CodeCheck( - String cis, - Boolean found, - Boolean valid, - String printView, - String gtin, - int[] groupIds, - Boolean verified, - Boolean realizable, - Boolean utilized, - @Nullable Date expireDate, - @Nullable VariableExpirations variableExpirations, - @Nullable Date productionDate, - @Nullable Integer productWeight, - @Nullable String prVetDocument, - @Nullable Boolean isOwner, - @Nullable Boolean isBlocked, - @Nullable String[] ogvs, - @Nullable String message, - @Nullable Integer errorCode, - Boolean isTracking, - Boolean sold, - @Nullable Integer eliminationState, - @Nullable Integer mrp, - @Nullable Integer smp, - @Nullable Boolean grayZone, - @Nullable Integer innerUnitCount, - @Nullable Integer soldUnitCount, - String packageType, - @Nullable String parent, - @Nullable String producerInn, - @Nullable String productionSerialNumber, - @Nullable String productionBatchNumber, - @Nullable String factorySerialNumber, - @Nullable Integer packageQuantity - ) { - this.cis = cis; - this.found = found; - this.valid = valid; - this.printView = printView; - this.gtin = gtin; - this.groupIds = groupIds; - this.verified = verified; - this.realizable = realizable; - this.utilized = utilized; - this.expireDate = expireDate; - this.variableExpirations = variableExpirations; - this.productionDate = productionDate; - this.productWeight = productWeight; - this.prVetDocument = prVetDocument; - this.isOwner = isOwner; - this.isBlocked = isBlocked; - this.ogvs = ogvs == null ? new String[0] : ogvs; - this.message = message; - this.errorCode = errorCode; - this.isTracking = isTracking; - this.sold = sold; - this.eliminationState = eliminationState; - this.mrp = mrp; - this.smp = smp; - this.grayZone = grayZone; - this.innerUnitCount = innerUnitCount; - this.soldUnitCount = soldUnitCount; - this.packageType = packageType; - this.parent = parent; - this.producerInn = producerInn; - this.productionSerialNumber = productionSerialNumber; - this.productionBatchNumber = productionBatchNumber; - this.factorySerialNumber = factorySerialNumber; - this.packageQuantity = packageQuantity; - } - - public String getCis() { return cis; } - - public boolean isFound() { return found; } - - @Nullable - public Boolean getGrayZone() { return grayZone; } - - @Nullable - public Boolean getOwner() { return isOwner; } - - public boolean isRealizable() { return realizable; } - - public boolean isSold() { return sold; } - - public boolean isTracking() { return isTracking; } - - public boolean isUtilized() { return utilized; } - - public boolean isValid() { return valid; } - - public boolean isVerified() { return verified; } - - @Nullable - public Integer getEliminationState() { return eliminationState; } - - public int[] getGroupIds() { return groupIds; } - - @Nullable - public Integer getErrorCode() { return errorCode; } - - @Nullable - public Integer getInnerUnitCount() { return innerUnitCount; } - - @Nullable - public Integer getMrp() { return mrp; } - - @Nullable - public Integer getPackageQuantity() { return packageQuantity; } - - @Nullable - public Integer getProductWeight() { return productWeight; } - - @Nullable - public Integer getSmp() { return smp; } - - @Nullable - public Integer getSoldUnitCount() { return soldUnitCount; } - - @Nullable - public VariableExpirations getVariableExpirations() { return variableExpirations; } - - @Nullable - public String[] getOgvs() { return ogvs; } - - @Nullable - public Date getExpireDate() { return expireDate; } - - @Nullable - public String getFactorySerialNumber() { return factorySerialNumber; } - - public String getGtin() { return gtin; } - - @Nullable - public String getMessage() { return message; } - - public String getPackageType() { return packageType; } - - @Nullable - public String getParent() { return parent; } - - public String getPrintView() { return printView; } - - @Nullable - public String getProducerInn() { return producerInn; } - - @Nullable - public String getProductionBatchNumber() { return productionBatchNumber; } - - @Nullable - public Date getProductionDate() { return productionDate; } - - @Nullable - public String getProductionSerialNumber() { return productionSerialNumber; } - - @Nullable - public String getPrVetDocument() { return prVetDocument; } - - @Nullable - public Boolean getBlocked() { return isBlocked; } - - @Override - public int describeContents() { return 0; } - - @Override - public void writeToParcel(Parcel parcel, int flags) { - parcel.writeInt(VERSION); - parcel.writeString(cis); - parcel.writeInt(found ? 1 : 0); - parcel.writeInt(valid ? 1 : 0); - parcel.writeString(printView); - parcel.writeString(gtin); - parcel.writeIntArray(groupIds); - parcel.writeInt(verified ? 1 : 0); - parcel.writeInt(realizable ? 1 : 0); - parcel.writeInt(utilized ? 1 : 0); - parcel.writeSerializable(expireDate); - parcel.writeTypedObject(this.variableExpirations, flags); - parcel.writeSerializable(productionDate); - parcel.writeValue(productWeight); - parcel.writeString(prVetDocument); - parcel.writeValue(isOwner); - parcel.writeValue(isBlocked); - parcel.writeStringArray(ogvs); - parcel.writeString(message); - parcel.writeValue(errorCode); - parcel.writeInt(isTracking ? 1 : 0); - parcel.writeInt(sold ? 1 : 0); - parcel.writeValue(eliminationState); - parcel.writeValue(mrp); - parcel.writeValue(smp); - parcel.writeValue(grayZone); - parcel.writeValue(innerUnitCount); - parcel.writeValue(soldUnitCount); - parcel.writeString(packageType); - parcel.writeString(parent); - parcel.writeString(producerInn); - parcel.writeString(productionSerialNumber); - parcel.writeString(productionBatchNumber); - parcel.writeString(factorySerialNumber); - parcel.writeValue(packageQuantity); - } - - public static final Creator CREATOR = new Creator<>() { - @Override - public CodeCheck createFromParcel(Parcel parcel) { - return new CodeCheck(parcel); - } - - @Override - public CodeCheck[] newArray(int i) { - return new CodeCheck[i]; - } - }; - - /** - *
      - *
    • RAR — Росалкогольтабакконтроль;
    • - *
    • FTS — ФТС России;
    • - *
    • FNS — ФНС России;
    • - *
    • RSHN — Россельхознадзор;
    • - *
    • RPN — Роспотребнадзор;
    • - *
    • MVD — МВД России;
    • - *
    • RZN — Росздравнадзор
    • - *
    • UNKNOWN — Неизвестное значение поля, связаное с различием версий
    • - *
    - */ - public enum OGVS implements Parcelable { - RAR, FTS, FNS, RSHN, RPN, MVD, RZN, UNKNOWN; - - /** Версия OGVS */ - public final static int VERSION = 1; - - @Override - public int describeContents() { return 0; } - - @Override - public void writeToParcel(Parcel parcel, int i) { - parcel.writeInt(VERSION); - parcel.writeString(this.name()); - } - - @Nullable - public static OGVS restoreFormParcel(Parcel parcel) { - int version = parcel.readInt(); - - try { - return OGVS.valueOf(parcel.readString()); - } catch (Exception exception) { - if (version != VERSION) { - return OGVS.UNKNOWN; - } else { - return null; - } - } - } - - public static Creator CREATOR = new Creator<>() { - @Override - public OGVS createFromParcel(Parcel parcel) { - return restoreFormParcel(parcel); - } - - @Override - public OGVS[] newArray(int i) { - return new OGVS[i]; - } - }; - } - - /** - *
      - *
    • «BY_SAMPLES» («Продажа по образцам»)
    • - *
    • «DISTANCE» («Дистанционная продажа»)
    • - *
    • «OWN_USE» («Использование для собственных нужд»)
    • - *
    • «PRODUCTION_USE» («Использование для производственных целей»)
    • - *
    • UNKNOWN — Неизвестное значение поля, связаное с различием версий
    • - *
    - */ - public enum EliminationState implements Parcelable { - BY_SAMPLES, DISTANCE, OWN_USE, PRODUCTION_USE, UNKNOWN; - - /** Версия EliminationState */ - public final static int VERSION = 1; - - @Override - public int describeContents() { return 0; } - - @Override - public void writeToParcel(Parcel parcel, int i) { - parcel.writeInt(VERSION); - parcel.writeString(this.name()); - } - - @Nullable - public static EliminationState restoreFormParcel(Parcel parcel) { - int version = parcel.readInt(); - - try { - return EliminationState.valueOf(parcel.readString()); - } catch (Exception exception) { - if (version != VERSION) { - return EliminationState.UNKNOWN; - } else { - return null; - } - } - } - - public static Creator CREATOR = new Creator<>() { - @Override - public EliminationState createFromParcel(Parcel parcel) { - return restoreFormParcel(parcel); - } - - @Override - public EliminationState[] newArray(int i) { - return new EliminationState[i]; - } - }; - } - - @NonNull - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("Cis: ").append(cis).append("\n"); - builder.append("IsFound: ").append(found).append("\n"); - builder.append("IsValid: ").append(valid).append("\n"); - builder.append("PrintView").append(printView).append("\n"); - builder.append("Gtin: ").append(gtin).append("\n"); - builder.append("GroupIds: "); - if (groupIds == null) { - builder.append("null\n"); - } else if (groupIds.length == 0) { - builder.append("[]\n"); - } else { - for (int i = 0; i < groupIds.length; i++) { - builder.append(groupIds[i]); - - if (i != groupIds.length - 1) { - builder.append(", "); - } - } - builder.append("\n"); - } - builder.append("IsVerified: ").append(verified).append("\n"); - builder.append("IsRealizable: ").append(realizable).append("\n"); - builder.append("IsUtilized: ").append(utilized).append("\n"); - builder.append("ExpireDate: ").append(expireDate).append("\n"); - builder.append("VariableExpirations: "); - if (variableExpirations == null) { - builder.append("null\n"); - } else if (variableExpirations.getExpirations().length == 0) { - builder.append("[]\n"); - } else { - VariableExpiration[] expirations = variableExpirations.getExpirations(); - for (int i = 0; i < expirations.length; i++) { - int first = expirations[i].getDegrees(); - String second = expirations[i].getDate(); - builder.append(first).append(":").append(second); - - if (i != variableExpirations.getExpirations().length - 1) { - builder.append(", "); - } - } - builder.append("\n"); - } - builder.append("ProductionDate: ").append(productionDate).append("\n"); - builder.append("ProductWeight: ").append(productWeight).append("\n"); - builder.append("PrVetDocument: ").append(prVetDocument).append("\n"); - builder.append("IsOwner: ").append(isOwner).append("\n"); - builder.append("IsBlocked: ").append(isBlocked).append("\n"); - builder.append("Ogvs: "); - if (ogvs.length == 0) { - builder.append("null\n"); - } else { - for (int i = 0; i < ogvs.length; i++) { - builder.append(ogvs[i]); - - if (i != ogvs.length - 1) { - builder.append(", "); - } - } - builder.append("\n"); - } - builder.append("Message: ").append(message).append("\n"); - builder.append("ErrorCode: ").append(errorCode).append("\n"); - builder.append("IsTracking: ").append(isTracking).append("\n"); - builder.append("IsSold: ").append(sold).append("\n"); - builder.append("EliminationState: ").append(eliminationState).append("\n"); - builder.append("Mrp: ").append(mrp).append("\n"); - builder.append("Smp: ").append(smp).append("\n"); - builder.append("IsGrayZone: ").append(grayZone).append("\n"); - builder.append("InnerUnitCount: ").append(innerUnitCount).append("\n"); - builder.append("SoldUnitCount: ").append(soldUnitCount).append("\n"); - builder.append("PackageType: ").append(packageType).append("\n"); - builder.append("Parent: ").append(parent).append("\n"); - builder.append("ProducerInn: ").append(producerInn).append("\n"); - builder.append("ProductionSerialNumber: ").append(productionSerialNumber).append("\n"); - builder.append("ProductionBatchNumber: ").append(productionBatchNumber).append("\n"); - builder.append("FactorySerialNumber: ").append(factorySerialNumber).append("\n"); - builder.append("PackageQuantity: ").append(packageQuantity).append("\n"); - return builder.toString(); - } -} diff --git a/src/main/java/ru/evotor/tspiot/result/CodesCheck.java b/src/main/java/ru/evotor/tspiot/result/CodesCheck.java deleted file mode 100644 index c893535961..0000000000 --- a/src/main/java/ru/evotor/tspiot/result/CodesCheck.java +++ /dev/null @@ -1,127 +0,0 @@ -package ru.evotor.tspiot.result; - -import android.os.Parcel; -import android.os.Parcelable; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import java.util.List; - -public class CodesCheck implements Parcelable { - - /** Версия CodesCheck */ - private final static int VERSION = 1; - - private final int code; - - /** Текстовое описание результата выполнения метода */ - @Nullable private final String description; - - /** Результат проверки марок*/ - private final List codes; - - /** Уникальный идентификатор запроса */ - private final String reqId; - - /** Дата и время формирования запроса (в UTC) */ - private final long reqTimestamp; - - /** Признак проверки марки в оффлайн режиме. */ - private final boolean isCheckedOffline; - - /** Версия ЛМ ЧЗ */ - @Nullable private final String version; - - @Nullable private final String inst; - - private CodesCheck(Parcel parcel) { - int version = parcel.readInt(); - this.code = parcel.readInt(); - this.description = parcel.readString(); - this.codes = parcel.createTypedArrayList(CodeCheck.CREATOR); - this.reqId = parcel.readString(); - this.reqTimestamp = parcel.readLong(); - this.isCheckedOffline = parcel.readInt() == 1; - this.version = parcel.readString(); - this.inst = parcel.readString(); - } - - public CodesCheck( - int code, - @Nullable String description, - List codes, - String reqId, - long reqTimestamp, - boolean isCheckedOffline, - @Nullable String version, - @Nullable String inst - ) { - this.code = code; - this.description = description; - this.codes = codes; - this.reqId = reqId; - this.reqTimestamp = reqTimestamp; - this.isCheckedOffline = isCheckedOffline; - this.version = version; - this.inst = inst; - } - - public int getCode() { return code; } - - @Nullable - public String getDescription() { return description; } - - public List getCodes() { return codes; } - - public String getReqId() { return reqId; } - - public long getReqTimestamp() { return reqTimestamp; } - - public boolean isCheckedOffline() { return isCheckedOffline; } - - @Nullable - public String getVersion() { return version; } - - @Nullable - public String getInst() { return inst; } - - @Override - public int describeContents() { return 0; } - - @Override - public void writeToParcel(Parcel parcel, int i) { - parcel.writeInt(VERSION); - parcel.writeInt(code); - parcel.writeString(description); - parcel.writeTypedList(codes); - parcel.writeString(reqId); - parcel.writeLong(reqTimestamp); - parcel.writeInt(isCheckedOffline ? 1 : 0); - parcel.writeString(version); - parcel.writeString(inst); - } - - public static final Creator CREATOR = new Creator<>() { - @Override - public CodesCheck createFromParcel(Parcel parcel) { - return new CodesCheck(parcel); - } - - @Override - public CodesCheck[] newArray(int i) { - return new CodesCheck[i]; - } - }; - - @NonNull - @Override - public String toString() { - return "Code: " + code + "\n" + - "Description: " + description + "\n" + - "Codes: " + (codes != null ? codes.toString() : "[]") + "\n" + - "ReqId: " + reqId + "\n" + - "ReqTimestamp: " + reqTimestamp + "\n" + - "IsCheckedOffline: " + isCheckedOffline + "\n" + - "Version: " + version + "\n" + - "Inst: " + inst + "\n"; - } -} diff --git a/src/main/java/ru/evotor/tspiot/result/CodesCheckResult.java b/src/main/java/ru/evotor/tspiot/result/CodesCheckResult.java deleted file mode 100644 index 1f38864274..0000000000 --- a/src/main/java/ru/evotor/tspiot/result/CodesCheckResult.java +++ /dev/null @@ -1,45 +0,0 @@ -package ru.evotor.tspiot.result; - -import android.os.Parcel; -import android.os.Parcelable; -import java.util.List; - -public class CodesCheckResult implements Parcelable { - - /** Версия CodesCheckResult */ - private final static int VERSION = 1; - - private final List codesChecks; - - private CodesCheckResult(Parcel parcel) { - int version = parcel.readInt(); - this.codesChecks = parcel.createTypedArrayList(CodesCheck.CREATOR); - } - - public CodesCheckResult(List codesChecks) { - this.codesChecks = codesChecks; - } - - public List getCodesChecks() { return codesChecks; } - - @Override - public int describeContents() { return 0; } - - @Override - public void writeToParcel(Parcel parcel, int flags) { - parcel.writeInt(VERSION); - parcel.writeTypedList(codesChecks); - } - - public static Creator CREATOR = new Creator<>() { - @Override - public CodesCheckResult createFromParcel(Parcel parcel) { - return new CodesCheckResult(parcel); - } - - @Override - public CodesCheckResult[] newArray(int i) { - return new CodesCheckResult[i]; - } - }; -} diff --git a/src/main/java/ru/evotor/tspiot/result/Errors.java b/src/main/java/ru/evotor/tspiot/result/Errors.java deleted file mode 100644 index ac094ae8ef..0000000000 --- a/src/main/java/ru/evotor/tspiot/result/Errors.java +++ /dev/null @@ -1,59 +0,0 @@ -package ru.evotor.tspiot.result; - -import android.os.Parcel; -import android.os.Parcelable; -import androidx.annotation.Nullable; - -public enum Errors implements Parcelable { - NOT_REGISTERED, - NOT_CONFIGURED, - ONLINE_CHECK_FAILED, - OFFLINE_CHECK_FAILED, - KKM_ERROR, - FN_SID_ERROR, - NOT_FOUND_PERMISSION, - NOT_FOUND_PMSR_ID, - NOT_FOUND_PMSR_TOKEN, - FAILED_GET_APP_NAME, - FAILED_GET_APP_VERSION, - UNKNOWN_ERROR; - - /** Версия Errors */ - public final static int VERSION = 1; - - @Override - public int describeContents() { return 0; } - - @Override - public void writeToParcel(Parcel parcel, int i) { - parcel.writeInt(VERSION); - parcel.writeString(this.name()); - } - - @Nullable - public static Errors restoreFormParcel(Parcel parcel) { - int version = parcel.readInt(); - - try { - return Errors.valueOf(parcel.readString()); - } catch (Exception exception) { - if (version != VERSION) { - return Errors.UNKNOWN_ERROR; - } else { - return null; - } - } - } - - public final static Creator CREATOR = new Creator<>() { - @Override - public Errors createFromParcel(Parcel parcel) { - return restoreFormParcel(parcel); - } - - @Override - public Errors[] newArray(int size) { - return new Errors[size]; - } - }; -} diff --git a/src/main/java/ru/evotor/tspiot/result/TsPioTError.java b/src/main/java/ru/evotor/tspiot/result/TsPioTError.java index 33f37ec91e..b129f43b4a 100644 --- a/src/main/java/ru/evotor/tspiot/result/TsPioTError.java +++ b/src/main/java/ru/evotor/tspiot/result/TsPioTError.java @@ -2,30 +2,33 @@ import android.os.Parcel; import android.os.Parcelable; +import ru.evotor.tspiot.Utils; +import ru.evotor.tspiot.result.model.base.ErrorDescription; +import ru.evotor.tspiot.result.model.errors.TsPioTErrorsDescription; public class TsPioTError implements Parcelable { /** Версия TsPioTError */ private final static int VERSION = 1; - private final Errors code; + /** Описание ошибки */ + private final TsPioTErrorsDescription error; - private final String message; + private final Class> errorType; private TsPioTError(Parcel parcel) { int version = parcel.readInt(); - this.code = parcel.readParcelable(Errors.class.getClassLoader()); - this.message = parcel.readString(); + errorType = Utils.readClass(parcel); + error = Utils.readData(errorType, parcel); } - public TsPioTError(Errors code, String message) { - this.code = code; - this.message = message; + @SuppressWarnings("unchecked") + public TsPioTError(TsPioTErrorsDescription error) { + this.error = error; + this.errorType = (Class>) error.getClass(); } - public Errors getCode() { return code; } - - public String getMessage() { return message; } + public TsPioTErrorsDescription getError() { return error; } @Override public int describeContents() { return 0; } @@ -33,8 +36,8 @@ public TsPioTError(Errors code, String message) { @Override public void writeToParcel(Parcel parcel, int flags) { parcel.writeInt(VERSION); - parcel.writeParcelable(code, flags); - parcel.writeString(message); + parcel.writeSerializable(errorType); + parcel.writeParcelable(error, flags); } public static final Creator CREATOR = new Creator<>() { diff --git a/src/main/java/ru/evotor/tspiot/result/TsPioTResult.java b/src/main/java/ru/evotor/tspiot/result/TsPioTResult.java index a731854c91..10a4cb963e 100644 --- a/src/main/java/ru/evotor/tspiot/result/TsPioTResult.java +++ b/src/main/java/ru/evotor/tspiot/result/TsPioTResult.java @@ -4,7 +4,7 @@ import android.os.Parcelable; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import java.io.Serializable; +import ru.evotor.tspiot.Utils; public class TsPioTResult implements Parcelable { @@ -20,38 +20,11 @@ public class TsPioTResult implements Parcelable { private TsPioTResult(Parcel parcel) { int version = parcel.readInt(); - this.classType = upcastClassType(parcel.readSerializable()); - this.data = parseData(classType, parcel); + this.classType = Utils.readClass(parcel); + this.data = Utils.readData(classType, parcel); this.error = parcel.readParcelable(TsPioTError.class.getClassLoader()); } - @SuppressWarnings("unchecked") - @Nullable - private Class upcastClassType(Serializable serializable) { - if (serializable == null) { - return null; - } - - try { - return (Class) serializable; - } catch (Exception exception) { - return null; - } - } - - @Nullable - private T parseData(Class classType, Parcel parcel) { - try { - if (classType == null) { - return parcel.readParcelable(null); - } - - return parcel.readParcelable(classType.getClassLoader()); - } catch (Exception exception) { - return null; - } - } - @SuppressWarnings("unchecked") public TsPioTResult(T data) { this.classType = (Class) data.getClass(); diff --git a/src/main/java/ru/evotor/tspiot/result/model/CodesCheckResult.java b/src/main/java/ru/evotor/tspiot/result/model/CodesCheckResult.java new file mode 100644 index 0000000000..1742d6a8ec --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/result/model/CodesCheckResult.java @@ -0,0 +1,59 @@ +package ru.evotor.tspiot.result.model; + +import android.os.Parcel; +import android.os.Parcelable; +import androidx.annotation.Nullable; +import java.util.List; +import ru.evotor.tspiot.result.model.offline.OfflineCodesCheck; +import ru.evotor.tspiot.result.model.online.OnlineCodesCheck; + +public class CodesCheckResult implements Parcelable { + + /** Версия CodesCheckResult */ + private final static int VERSION = 1; + + @Nullable private final List onlineCodesChecks; + + @Nullable private final List offlineCodesChecks; + + private CodesCheckResult(Parcel parcel) { + int version = parcel.readInt(); + this.onlineCodesChecks = parcel.createTypedArrayList(OnlineCodesCheck.CREATOR); + this.offlineCodesChecks = parcel.createTypedArrayList(OfflineCodesCheck.CREATOR); + } + + public CodesCheckResult(@Nullable List onlineCodesChecks, @Nullable List offlineCodesChecks) { + this.onlineCodesChecks = onlineCodesChecks; + this.offlineCodesChecks = offlineCodesChecks; + } + + @Nullable + public List getOnlineCodesChecks() { return onlineCodesChecks; } + + @Nullable + public List getOfflineCodesChecks() { return offlineCodesChecks; } + + public boolean isOffline() { return offlineCodesChecks != null && !offlineCodesChecks.isEmpty(); } + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(Parcel parcel, int flags) { + parcel.writeInt(VERSION); + parcel.writeTypedList(onlineCodesChecks); + parcel.writeTypedList(offlineCodesChecks); + } + + public static Creator CREATOR = new Creator<>() { + @Override + public CodesCheckResult createFromParcel(Parcel parcel) { + return new CodesCheckResult(parcel); + } + + @Override + public CodesCheckResult[] newArray(int size) { + return new CodesCheckResult[size]; + } + }; +} diff --git a/src/main/java/ru/evotor/tspiot/result/KktInfo.java b/src/main/java/ru/evotor/tspiot/result/model/KktInfo.java similarity index 65% rename from src/main/java/ru/evotor/tspiot/result/KktInfo.java rename to src/main/java/ru/evotor/tspiot/result/model/KktInfo.java index 02c2a4e33a..15f01b657d 100644 --- a/src/main/java/ru/evotor/tspiot/result/KktInfo.java +++ b/src/main/java/ru/evotor/tspiot/result/model/KktInfo.java @@ -1,8 +1,11 @@ -package ru.evotor.tspiot.result; +package ru.evotor.tspiot.result.model; import android.os.Parcel; import android.os.Parcelable; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import ru.evotor.tspiot.Utils; public class KktInfo implements Parcelable { @@ -24,12 +27,22 @@ public class KktInfo implements Parcelable { /** Время проверки кода в ТС ПИоТ (В миллисекундах) */ private final int codesCheckTimeOut; - public KktInfo(String tspiotId, String kktSerial, String fnSerial, String kktInn, int codesCheckTimeOut) { + @Nullable private final LmChzInfo lmChzInfo; + + public KktInfo( + String tspiotId, + String kktSerial, + String fnSerial, + String kktInn, + int codesCheckTimeOut, + @Nullable LmChzInfo lmChzInfo + ) { this.tspiotId = tspiotId; this.kktSerial = kktSerial; this.fnSerial = fnSerial; this.kktInn = kktInn; this.codesCheckTimeOut = codesCheckTimeOut; + this.lmChzInfo = lmChzInfo; } private KktInfo(Parcel parcel) { @@ -39,6 +52,7 @@ private KktInfo(Parcel parcel) { this.fnSerial = parcel.readString(); this.kktInn = parcel.readString(); this.codesCheckTimeOut = parcel.readInt(); + this.lmChzInfo = parcel.readTypedObject(LmChzInfo.CREATOR); } public String getTspiotId() { return tspiotId; } @@ -51,17 +65,21 @@ private KktInfo(Parcel parcel) { public int getCodesCheckTimeOut() { return codesCheckTimeOut; } + @Nullable + public LmChzInfo getLmChzInfo() { return lmChzInfo; } + @Override public int describeContents() { return 0; } @Override - public void writeToParcel(Parcel parcel, int i) { + public void writeToParcel(Parcel parcel, int flags) { parcel.writeInt(VERSION); parcel.writeString(tspiotId); parcel.writeString(kktSerial); parcel.writeString(fnSerial); parcel.writeString(kktInn); parcel.writeInt(codesCheckTimeOut); + parcel.writeTypedObject(lmChzInfo, flags); } public static final Creator CREATOR = new Creator<>() { @@ -78,10 +96,11 @@ public KktInfo[] newArray(int size) { @NonNull @Override public String toString() { - return "TsPioTId: " + tspiotId + "\n" + - "KktSerial: " + kktSerial + "\n" + - "FnSerial: " + fnSerial + "\n" + - "KktInn: " + kktInn + "\n" + - "CodesCheckTimeout: " + codesCheckTimeOut + "\n"; + return "TsPioTId: " + Utils.toString(tspiotId) + "\n" + + "KktSerial: " + Utils.toString(kktSerial) + "\n" + + "FnSerial: " + Utils.toString(fnSerial) + "\n" + + "KktInn: " + Utils.toString(kktInn) + "\n" + + "CodesCheckTimeout: " + Utils.toString(codesCheckTimeOut) + "\n" + + "LmChzInfo: " + Utils.toString(lmChzInfo); } } diff --git a/src/main/java/ru/evotor/tspiot/result/model/LmChzInfo.java b/src/main/java/ru/evotor/tspiot/result/model/LmChzInfo.java new file mode 100644 index 0000000000..b429d2459b --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/result/model/LmChzInfo.java @@ -0,0 +1,179 @@ +package ru.evotor.tspiot.result.model; + +import android.os.Parcel; +import android.os.Parcelable; +import androidx.annotation.NonNull; + +import ru.evotor.tspiot.Utils; + +public class LmChzInfo implements Parcelable { + + private final static String VERSION_DEFAULT = ""; + private final static String STATUS_DEFAULT = ""; + private final static String TOKEN_DEFAULT = ""; + private final static String EXP_DATE_DEFAULT = ""; + private final static String IP_DEFAULT = ""; + private final static String LOGIN_DEFAULT = ""; + private final static String PASS_DEFAULT = ""; + + /** Версия LmChzInfo */ + private final static int VERSION = 1; + + /** Версия СПО «Локальный модуль» «Честный ЗНАК» */ + @NonNull private final String version; + + /** + *
      + * Возможные значения: + *
        + *
      • not_configured – не отконфигурирован;
      • + *
      • initialization – инициализация;
      • + *
      • ready – готов к работе;
      • + *
      • sync_error – ошибка синхронизации.
      • + *
      + *
    + */ + @NonNull private final String status; + + /** + * Дата и время последней синхронизации по всем базам данных. + * Если система не была инициализирована, то значение по умолчанию равно нулю. UnixTime в (мс) + */ + private final long lastSync; + + /** Токен ЛМ ЧЗ. */ + @NonNull private final String token; + + /** + * Дата и время истечения срока действия токена в формате ISO 8601 + * (например, 2025-03- 22T10:30:00Z). Время указано в UTC. + */ + @NonNull private final String expDate; + + /** IP-адрес установки ЛМ ЧЗ */ + @NonNull private final String ip; + + /** Порт ЛМ ЧЗ */ + private final int port; + + /** Логин для авторизации в ЛМ ЧЗ */ + @NonNull private final String login; + + /** Пароль для авторизации в ЛМ ЧЗ */ + @NonNull private final String pass; + + private LmChzInfo(@NonNull Parcel parcel) { + int classVersion = parcel.readInt(); + version = readParcelString(parcel, VERSION_DEFAULT); + status = readParcelString(parcel, STATUS_DEFAULT); + lastSync = parcel.readLong(); + token = readParcelString(parcel, TOKEN_DEFAULT); + expDate = readParcelString(parcel, EXP_DATE_DEFAULT); + ip = readParcelString(parcel, IP_DEFAULT); + port = parcel.readInt(); + login = readParcelString(parcel, LOGIN_DEFAULT); + pass = readParcelString(parcel, PASS_DEFAULT); + } + + private @NonNull String readParcelString(@NonNull Parcel parcel, @NonNull String defaultString) { + String parcelString = parcel.readString(); + return parcelString == null ? defaultString : parcelString; + } + + public LmChzInfo( + @NonNull + String version, + @NonNull + String status, + long lastSync, + @NonNull + String token, + @NonNull + String expDate, + @NonNull + String ip, + int port, + @NonNull + String login, + @NonNull + String pass + ) { + this.version = version; + this.status = status; + this.lastSync = lastSync; + this.token = token; + this.expDate = expDate; + this.ip = ip; + this.port = port; + this.login = login; + this.pass = pass; + } + + public int getPort() { return port; } + + public long getLastSync() { return lastSync; } + + @NonNull + public String getExpDate() { return expDate; } + + @NonNull + public String getIp() { return ip; } + + @NonNull + public String getLogin() { return login; } + + @NonNull + public String getPass() { return pass; } + + @NonNull + public String getStatus() { return status; } + + @NonNull + public String getToken() { return token; } + + @NonNull + public String getVersion() { return version; } + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(@NonNull Parcel parcel, int i) { + parcel.writeInt(VERSION); + parcel.writeString(version); + parcel.writeString(status); + parcel.writeLong(lastSync); + parcel.writeString(token); + parcel.writeString(expDate); + parcel.writeString(ip); + parcel.writeInt(port); + parcel.writeString(login); + parcel.writeString(pass); + } + + @NonNull + @Override + public String toString() { + return "Version: " + Utils.toString(version) + "\n" + + "Status : " + Utils.toString(status) + "\n" + + "Last sync: " + Utils.toString(lastSync) + "\n" + + "Token: " + Utils.toString(token) + "\n" + + "Exp date: " + Utils.toString(expDate) + "\n" + + "Ip: " + Utils.toString(ip) + "\n" + + "Port: " + Utils.toString(port) + "\n" + + "Login: " + Utils.toString(login) + "\n" + + "Pass: " + Utils.toString(pass); + } + + public final static Creator CREATOR = new Creator<>() { + @Override + public LmChzInfo createFromParcel(Parcel parcel) { + return new LmChzInfo(parcel); + } + + @Override + public LmChzInfo[] newArray(int size) { + return new LmChzInfo[size]; + } + }; +} diff --git a/src/main/java/ru/evotor/tspiot/result/VariableExpiration.java b/src/main/java/ru/evotor/tspiot/result/model/VariableExpiration.java similarity index 81% rename from src/main/java/ru/evotor/tspiot/result/VariableExpiration.java rename to src/main/java/ru/evotor/tspiot/result/model/VariableExpiration.java index a77ecbac4e..8d8d9aa628 100644 --- a/src/main/java/ru/evotor/tspiot/result/VariableExpiration.java +++ b/src/main/java/ru/evotor/tspiot/result/model/VariableExpiration.java @@ -1,8 +1,12 @@ -package ru.evotor.tspiot.result; +package ru.evotor.tspiot.result.model; import android.os.Parcel; import android.os.Parcelable; +import androidx.annotation.NonNull; + +import ru.evotor.tspiot.Utils; + public class VariableExpiration implements Parcelable { /** Версия VariableExpiration */ @@ -48,4 +52,11 @@ public VariableExpiration[] newArray(int i) { return new VariableExpiration[i]; } }; + + @NonNull + @Override + public String toString() { + return "Degrees: " + Utils.toString(degrees) + "\n" + + "Date: " + Utils.toString(date); + } } diff --git a/src/main/java/ru/evotor/tspiot/result/VariableExpirations.java b/src/main/java/ru/evotor/tspiot/result/model/VariableExpirations.java similarity index 83% rename from src/main/java/ru/evotor/tspiot/result/VariableExpirations.java rename to src/main/java/ru/evotor/tspiot/result/model/VariableExpirations.java index 3e67d76cc9..5dd6491d59 100644 --- a/src/main/java/ru/evotor/tspiot/result/VariableExpirations.java +++ b/src/main/java/ru/evotor/tspiot/result/model/VariableExpirations.java @@ -1,8 +1,12 @@ -package ru.evotor.tspiot.result; +package ru.evotor.tspiot.result.model; import android.os.Parcel; import android.os.Parcelable; +import androidx.annotation.NonNull; + +import ru.evotor.tspiot.Utils; + /** Вариативный срок годности */ public class VariableExpirations implements Parcelable { @@ -42,4 +46,10 @@ public VariableExpirations[] newArray(int i) { return new VariableExpirations[i]; } }; + + @NonNull + @Override + public String toString() { + return "VariableExpirations: " + Utils.toString(expirations); + } } diff --git a/src/main/java/ru/evotor/tspiot/result/model/base/BaseCodeCheck.java b/src/main/java/ru/evotor/tspiot/result/model/base/BaseCodeCheck.java new file mode 100644 index 0000000000..43bb41fb3d --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/result/model/base/BaseCodeCheck.java @@ -0,0 +1,185 @@ +package ru.evotor.tspiot.result.model.base; + +import android.os.Parcel; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import ru.evotor.tspiot.Utils; +import ru.evotor.tspiot.result.model.VariableExpirations; + +public abstract class BaseCodeCheck { + + /** Версия BaseCodeCheck */ + private final static int VERSION = 1; + + /** КИ / КиЗ из запроса */ + protected final String cis; + + /** Признак наличия кода в ГИС МТ */ + protected final boolean found; + + /** Результат проверки валидности структуры КИ / КиЗ */ + protected final boolean valid; + + /** КИ без крипто-подписи / КиЗ */ + protected final String printView; + + /** Код товара */ + protected final String gtin; + + /** Массив идентификаторов товарных групп */ + protected final int[] groupIds; + + /** Результат проверки крипто-подписи КМ */ + protected final boolean verified; + + /** Признак возможности реализации КИ / КиЗ */ + protected final boolean realizable; + + /** Признак нанесения КИ / КиЗ на упаковку */ + protected final boolean utilized; + + /** Информация о вариативном сроке годности */ + @Nullable + protected final VariableExpirations variableExpirations; + + /** Признак того, что розничная продажа продукции заблокирована по решению ОГВ */ + @Nullable protected final Boolean isBlocked; + + /** Органы государственной власти, установившие блокировку на КИ */ + protected final String[] ogvs; + + /** Признак продажи товара */ + protected final boolean sold; + + /** Максимальная розничная цена */ + @Nullable protected final Integer mrp; + + /** Единая минимальная цена (ЕМЦ) */ + @Nullable protected final Integer smp; + + protected BaseCodeCheck(Parcel parcel) { + int version = parcel.readInt(); + this.cis = parcel.readString(); + this.found = parcel.readInt() == 1; + this.valid = parcel.readInt() == 1; + this.printView = parcel.readString(); + this.gtin = parcel.readString(); + this.groupIds = parcel.createIntArray(); + this.verified = parcel.readInt() == 1; + this.realizable = parcel.readInt() == 1; + this.utilized = parcel.readInt() == 1; + this.variableExpirations = parcel.readTypedObject(VariableExpirations.CREATOR); + this.isBlocked = Utils.readBoolean(parcel); + this.ogvs = parcel.createStringArray(); + this.sold = parcel.readInt() == 1; + this.mrp = Utils.readInteger(parcel); + this.smp = Utils.readInteger(parcel); + } + + public BaseCodeCheck( + String cis, + boolean found, + boolean valid, + String printView, + String gtin, + int[] groupIds, + boolean verified, + boolean realizable, + boolean utilized, + @Nullable VariableExpirations variableExpirations, + @Nullable Boolean isBlocked, + String[] ogvs, + boolean sold, + @Nullable Integer mrp, + @Nullable Integer smp + ) { + this.cis = cis; + this.found = found; + this.valid = valid; + this.printView = printView; + this.gtin = gtin; + this.groupIds = groupIds; + this.verified = verified; + this.realizable = realizable; + this.utilized = utilized; + this.variableExpirations = variableExpirations; + this.isBlocked = isBlocked; + this.ogvs = ogvs; + this.sold = sold; + this.mrp = mrp; + this.smp = smp; + } + + protected void write(Parcel parcel, int flags) { + parcel.writeInt(VERSION); + parcel.writeString(cis); + parcel.writeInt(found ? 1 : 0); + parcel.writeInt(valid ? 1 : 0); + parcel.writeString(printView); + parcel.writeString(gtin); + parcel.writeIntArray(groupIds); + parcel.writeInt(verified ? 1 : 0); + parcel.writeInt(realizable ? 1 : 0); + parcel.writeInt(utilized ? 1 : 0); + parcel.writeTypedObject(this.variableExpirations, flags); + parcel.writeValue(isBlocked); + parcel.writeStringArray(ogvs); + parcel.writeInt(sold ? 1 : 0); + parcel.writeValue(mrp); + parcel.writeValue(smp); + } + + @Nullable + public Boolean getBlocked() { return isBlocked; } + + public boolean isFound() { return found; } + + public boolean isRealizable() { return realizable; } + + public boolean isSold() { return sold; } + + public boolean isUtilized() { return utilized; } + + public boolean isValid() { return valid; } + + public boolean isVerified() { return verified; } + + public int[] getGroupIds() { return groupIds; } + + @Nullable + public Integer getMrp() { return mrp; } + + @Nullable + public Integer getSmp() { return smp; } + + public String getCis() { return cis; } + + public String getGtin() { return gtin; } + + public String getPrintView() { return printView; } + + public String[] getOgvs() { return ogvs; } + + @Nullable + public VariableExpirations getVariableExpirations() { return variableExpirations; } + + @NonNull + @Override + public String toString() { + return "Cis: " + Utils.toString(cis) + "\n" + + "IsFound: " + Utils.toString(found) + "\n" + + "IsValid: " + Utils.toString(valid) + "\n" + + "PrintView" + Utils.toString(printView) + "\n" + + "Gtin: " + Utils.toString(gtin) + "\n" + + "GroupIds: " + Utils.toString(groupIds) + "\n" + + "IsVerified: " + Utils.toString(verified) + "\n" + + "IsRealizable: " + Utils.toString(realizable) + "\n" + + "IsUtilized: " + Utils.toString(utilized) + "\n" + + "VariableExpirations: " + Utils.toString(variableExpirations) + "\n" + + "IsBlocked: " + Utils.toString(isBlocked) + "\n" + + "Ogvs: " + Utils.toString(ogvs) + "\n" + + "IsSold: " + Utils.toString(sold) + "\n" + + "Mrp: " + Utils.toString(mrp) + "\n" + + "Smp: " + Utils.toString(smp) + "\n"; + } +} diff --git a/src/main/java/ru/evotor/tspiot/result/model/base/BaseCodesCheck.java b/src/main/java/ru/evotor/tspiot/result/model/base/BaseCodesCheck.java new file mode 100644 index 0000000000..cdd703f3b0 --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/result/model/base/BaseCodesCheck.java @@ -0,0 +1,59 @@ +package ru.evotor.tspiot.result.model.base; + +import android.os.Parcel; + +import androidx.annotation.NonNull; + +import ru.evotor.tspiot.Utils; + +public abstract class BaseCodesCheck { + + /** Версия BaseCodesCheck */ + private final static int VERSION = 1; + + protected final int code; + + /** Уникальный идентификатор запроса */ + protected final String reqId; + + /** Дата и время формирования запроса (в UTC) */ + protected final long reqTimestamp; + + protected BaseCodesCheck(Parcel parcel) { + int version = parcel.readInt(); + this.code = parcel.readInt(); + this.reqId = parcel.readString(); + this.reqTimestamp = parcel.readLong(); + } + + public BaseCodesCheck( + int code, + String reqId, + long reqTimestamp + ) { + this.code = code; + this.reqId = reqId; + this.reqTimestamp = reqTimestamp; + } + + protected final void write(Parcel parcel, int flags) { + parcel.writeInt(VERSION); + parcel.writeInt(code); + parcel.writeString(reqId); + parcel.writeLong(reqTimestamp); + } + + public int getCode() { return code; } + + public String getReqId() { return reqId; } + + public long getReqTimestamp() { return reqTimestamp; } + + @NonNull + @Override + public String toString() { + return "Code: " + Utils.toString(code) + "\n" + + "ReqId: " + Utils.toString(reqId) + "\n" + + "ReqTimestamp: " + Utils.toString(reqTimestamp) + "\n"; + } +} diff --git a/src/main/java/ru/evotor/tspiot/result/model/base/ErrorDescription.java b/src/main/java/ru/evotor/tspiot/result/model/base/ErrorDescription.java new file mode 100644 index 0000000000..7211f4e4cc --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/result/model/base/ErrorDescription.java @@ -0,0 +1,5 @@ +package ru.evotor.tspiot.result.model.base; + +import android.os.Parcelable; + +public interface ErrorDescription extends Parcelable { } diff --git a/src/main/java/ru/evotor/tspiot/result/model/errors/CheckServiceAreUnavailable.java b/src/main/java/ru/evotor/tspiot/result/model/errors/CheckServiceAreUnavailable.java new file mode 100644 index 0000000000..7255f84608 --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/result/model/errors/CheckServiceAreUnavailable.java @@ -0,0 +1,33 @@ +package ru.evotor.tspiot.result.model.errors; + +import android.os.Parcel; + +/** + * ТС ПИоТ не смог получить ответ ни от ГИС МТ, ни от ЛМ ЧЗ. + * Сервисы ЧЗ недоступны, имеет смысл повторить запрос позже. + */ +public final class CheckServiceAreUnavailable extends TsPioTErrorsDescription { + private final CodesCheckErrorDescription errorDescription; + + public CheckServiceAreUnavailable(CodesCheckErrorDescription errorDescription) { + this.errorDescription = errorDescription; + } + + private CheckServiceAreUnavailable(Parcel parcel) { + super(parcel); + this.errorDescription = parcel.readParcelable(CodesCheckErrorDescription.class.getClassLoader()); + } + + @Override + public CodesCheckErrorDescription getErrorDescription() { return errorDescription; } + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(Parcel parcel, int flags) { + parcel.writeParcelable(errorDescription, flags); + } + + public static final Creator CREATOR = new BaseCreator<>(CheckServiceAreUnavailable.class); +} \ No newline at end of file diff --git a/src/main/java/ru/evotor/tspiot/result/model/errors/CodesCheckErrorDescription.java b/src/main/java/ru/evotor/tspiot/result/model/errors/CodesCheckErrorDescription.java new file mode 100644 index 0000000000..ee89f8bd3b --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/result/model/errors/CodesCheckErrorDescription.java @@ -0,0 +1,67 @@ +package ru.evotor.tspiot.result.model.errors; + +import android.os.Parcel; +import androidx.annotation.Nullable; +import ru.evotor.tspiot.Utils; +import ru.evotor.tspiot.result.model.base.ErrorDescription; + +public class CodesCheckErrorDescription implements ErrorDescription { + + /** Версия CodesCheckErrorDescription */ + private final static int VERSION = 1; + + @Nullable private final Class onlineErrorClass; + + @Nullable private final Class offlineErrorClass; + + /** Ошибка онлайн проверки */ + @Nullable private final ErrorDescription onlineError; + + /** Ошибка офлайн проверки */ + @Nullable private final ErrorDescription offlineError; + + private CodesCheckErrorDescription(Parcel parcel) { + int version = parcel.readInt(); + this.onlineErrorClass = Utils.readClass(parcel); + this.offlineErrorClass = Utils.readClass(parcel); + this.onlineError = Utils.readData(onlineErrorClass, parcel); + this.offlineError = Utils.readData(offlineErrorClass, parcel); + } + + public CodesCheckErrorDescription(@Nullable ErrorDescription onlineError, @Nullable ErrorDescription offlineError) { + this.onlineErrorClass = onlineError != null ? onlineError.getClass() : null; + this.offlineErrorClass = offlineError != null ? offlineError.getClass() : null; + this.onlineError = onlineError; + this.offlineError = offlineError; + } + + @Nullable + public ErrorDescription getOnlineError() { return onlineError; } + + @Nullable + public ErrorDescription getOfflineError() { return offlineError; } + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(Parcel parcel, int flags) { + parcel.writeInt(VERSION); + parcel.writeSerializable(onlineErrorClass); + parcel.writeSerializable(offlineErrorClass); + parcel.writeParcelable(onlineError, flags); + parcel.writeParcelable(offlineError, flags); + } + + public static final Creator CREATOR = new Creator<>() { + @Override + public CodesCheckErrorDescription createFromParcel(Parcel parcel) { + return new CodesCheckErrorDescription(parcel); + } + + @Override + public CodesCheckErrorDescription[] newArray(int size) { + return new CodesCheckErrorDescription[size]; + } + }; +} diff --git a/src/main/java/ru/evotor/tspiot/result/model/errors/CommonErrorDescription.java b/src/main/java/ru/evotor/tspiot/result/model/errors/CommonErrorDescription.java new file mode 100644 index 0000000000..253b7914da --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/result/model/errors/CommonErrorDescription.java @@ -0,0 +1,53 @@ +package ru.evotor.tspiot.result.model.errors; + +import android.os.Parcel; +import ru.evotor.tspiot.result.model.base.ErrorDescription; + +public class CommonErrorDescription implements ErrorDescription { + + /** Версия CommonErrorDescription */ + private final static int VERSION = 1; + + /** Код ошибки */ + private final int errorCode; + + /** Описание ошибки */ + private final String message; + + private CommonErrorDescription(Parcel parcel) { + int version = parcel.readInt(); + this.errorCode = parcel.readInt(); + this.message = parcel.readString(); + } + + public CommonErrorDescription(int errorCode, String message) { + this.errorCode = errorCode; + this.message = message; + } + + public int getErrorCode() { return errorCode; } + + public String getMessage() { return message; } + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(Parcel parcel, int i) { + parcel.writeInt(VERSION); + parcel.writeInt(errorCode); + parcel.writeString(message); + } + + public static final Creator CREATOR = new Creator<>() { + @Override + public CommonErrorDescription createFromParcel(Parcel parcel) { + return new CommonErrorDescription(parcel); + } + + @Override + public CommonErrorDescription[] newArray(int size) { + return new CommonErrorDescription[size]; + } + }; +} diff --git a/src/main/java/ru/evotor/tspiot/result/model/errors/CommonErrorDescriptionError.java b/src/main/java/ru/evotor/tspiot/result/model/errors/CommonErrorDescriptionError.java new file mode 100644 index 0000000000..bb9914c1c0 --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/result/model/errors/CommonErrorDescriptionError.java @@ -0,0 +1,74 @@ +package ru.evotor.tspiot.result.model.errors; + +import android.os.Parcel; + +public sealed abstract class CommonErrorDescriptionError extends TsPioTErrorsDescription { + protected final CommonErrorDescription errorDescription; + + protected CommonErrorDescriptionError(Parcel parcel) { + super(parcel); + this.errorDescription = parcel.readParcelable(CommonErrorDescription.class.getClassLoader()); + } + + public CommonErrorDescriptionError(CommonErrorDescription errorDescription) { + this.errorDescription = errorDescription; + } + + @Override + public CommonErrorDescription getErrorDescription() { return errorDescription; } + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(Parcel parcel, int flags) { + parcel.writeParcelable(errorDescription, flags); + } + + /** Ошибка на стороне ККМ */ + public static final class KkmError extends CommonErrorDescriptionError { + private KkmError(Parcel parcel) { super(parcel); } + + public KkmError(CommonErrorDescription errorDescription) { + super(errorDescription); + } + + public static final Creator CREATOR = new BaseCreator<>(KkmError.class); + } + + /** Ошибка на стороне локального модуля */ + public static final class LocalModuleError extends CommonErrorDescriptionError { + private LocalModuleError(Parcel parcel) { super(parcel); } + + public LocalModuleError(CommonErrorDescription errorDescription) { + super(errorDescription); + } + + public static final Creator CREATOR = new BaseCreator<>(LocalModuleError.class); + } + + /** Не удалось получить fnSid (Не удалось установить доверенный канал) */ + public static final class FnSidError extends CommonErrorDescriptionError { + private FnSidError(Parcel parcel) { super(parcel); } + + public FnSidError(CommonErrorDescription errorDescription) { + super(errorDescription); + } + + public static final Creator CREATOR = new BaseCreator<>(FnSidError.class); + } + + /** + * Аварийный режим. Продажа товара разрешена без проверки, + * действуют ограничения аварийного режима + */ + public static final class EmergencyMode extends CommonErrorDescriptionError { + private EmergencyMode(Parcel parcel) { super(parcel); } + + public EmergencyMode(CommonErrorDescription errorDescription) { + super(errorDescription); + } + + public static final Creator CREATOR = new BaseCreator<>(EmergencyMode.class); + } +} diff --git a/src/main/java/ru/evotor/tspiot/result/model/errors/MessageErrorDescription.java b/src/main/java/ru/evotor/tspiot/result/model/errors/MessageErrorDescription.java new file mode 100644 index 0000000000..4ef10bff66 --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/result/model/errors/MessageErrorDescription.java @@ -0,0 +1,45 @@ +package ru.evotor.tspiot.result.model.errors; + +import android.os.Parcel; +import ru.evotor.tspiot.result.model.base.ErrorDescription; + +public class MessageErrorDescription implements ErrorDescription { + + /** Версия MessageErrorDescription */ + private final static int VERSION = 1; + + /** Описание ошибки */ + private final String message; + + private MessageErrorDescription(Parcel parcel) { + int version = parcel.readInt(); + this.message = parcel.readString(); + } + + public MessageErrorDescription(String message) { + this.message = message; + } + + public String getMessage() { return message; } + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(Parcel parcel, int i) { + parcel.writeInt(VERSION); + parcel.writeString(message); + } + + public static final Creator CREATOR = new Creator() { + @Override + public MessageErrorDescription createFromParcel(Parcel parcel) { + return new MessageErrorDescription(parcel); + } + + @Override + public MessageErrorDescription[] newArray(int size) { + return new MessageErrorDescription[size]; + } + }; +} diff --git a/src/main/java/ru/evotor/tspiot/result/model/errors/MessageErrorDescriptionError.java b/src/main/java/ru/evotor/tspiot/result/model/errors/MessageErrorDescriptionError.java new file mode 100644 index 0000000000..3da2e99035 --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/result/model/errors/MessageErrorDescriptionError.java @@ -0,0 +1,126 @@ +package ru.evotor.tspiot.result.model.errors; + +import android.os.Parcel; + +public sealed abstract class MessageErrorDescriptionError extends TsPioTErrorsDescription { + final protected MessageErrorDescription errorDescription; + + protected MessageErrorDescriptionError(Parcel parcel) { + super(parcel); + this.errorDescription = parcel.readParcelable(MessageErrorDescription.class.getClassLoader()); + } + + public MessageErrorDescriptionError(MessageErrorDescription errorDescription) { + this.errorDescription = errorDescription; + } + + @Override + public MessageErrorDescription getErrorDescription() { return errorDescription; } + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(Parcel parcel, int flags) { + parcel.writeParcelable(errorDescription, flags); + } + + /** Нет доступных CDN для онлайн проверки */ + public static final class CdnNotFoundError extends MessageErrorDescriptionError { + private CdnNotFoundError(Parcel parcel) { super(parcel); } + + public CdnNotFoundError(MessageErrorDescription errorDescription) { + super(errorDescription); + } + + public static final Creator CREATOR = new BaseCreator<>(CdnNotFoundError.class); + } + + /** ТСПиОТ не зарегистрирован */ + public static final class NotRegistered extends MessageErrorDescriptionError { + private NotRegistered(Parcel parcel) { super(parcel); } + + public NotRegistered(MessageErrorDescription errorDescription) { + super(errorDescription); + } + + public static final Creator CREATOR = new BaseCreator<>(NotRegistered.class); + } + + /** Не получена конфигурация ТСПиОТ */ + public static final class NotConfigured extends MessageErrorDescriptionError { + private NotConfigured(Parcel parcel) { super(parcel); } + + public NotConfigured(MessageErrorDescription errorDescription) { + super(errorDescription); + } + + public static final Creator CREATOR = new BaseCreator<>(NotConfigured.class); + } + + /** Отсутствует пермишн PMSR в манифесте приложения */ + public static final class NotFoundPermission extends MessageErrorDescriptionError { + private NotFoundPermission(Parcel parcel) { super(parcel); } + + public NotFoundPermission(MessageErrorDescription errorDescription) { + super(errorDescription); + } + + public static final Creator CREATOR = new BaseCreator<>(NotFoundPermission.class); + } + + /** Отсутствует PMSR_ID в манифесте приложения */ + public static final class NotFoundPmsrId extends MessageErrorDescriptionError { + private NotFoundPmsrId(Parcel parcel) { super(parcel); } + + public NotFoundPmsrId(MessageErrorDescription errorDescription) { + super(errorDescription); + } + + public static final Creator CREATOR = new BaseCreator<>(NotFoundPmsrId.class); + } + + /** Отсутствует PMSR_TOKEN в манифесте приложения */ + public static final class NotFoundPmsrToken extends MessageErrorDescriptionError { + private NotFoundPmsrToken(Parcel parcel) { super(parcel); } + + public NotFoundPmsrToken(MessageErrorDescription errorDescription) { + super(errorDescription); + } + + public static final Creator CREATOR = new BaseCreator<>(NotFoundPmsrToken.class); + } + + /** Не удалось получить appName вызывающего приложения */ + public static final class FailedGetAppName extends MessageErrorDescriptionError { + private FailedGetAppName(Parcel parcel) { super(parcel); } + + public FailedGetAppName(MessageErrorDescription errorDescription) { + super(errorDescription); + } + + public static final Creator CREATOR = new BaseCreator<>(FailedGetAppName.class); + } + + /** Не удалось получить версию вызывающего приложения */ + public static final class FailedGetAppVersion extends MessageErrorDescriptionError { + private FailedGetAppVersion(Parcel parcel) { super(parcel); } + + public FailedGetAppVersion(MessageErrorDescription errorDescription) { + super(errorDescription); + } + + public static final Creator CREATOR = new BaseCreator<>(FailedGetAppVersion.class); + } + + /** Неизвестная ошибка */ + public static final class UnknownError extends MessageErrorDescriptionError { + private UnknownError(Parcel parcel) { super(parcel); } + + public UnknownError(MessageErrorDescription errorDescription) { + super(errorDescription); + } + + public static final Creator CREATOR = new BaseCreator<>(UnknownError.class); + } +} diff --git a/src/main/java/ru/evotor/tspiot/result/model/errors/TsPioTErrorsDescription.java b/src/main/java/ru/evotor/tspiot/result/model/errors/TsPioTErrorsDescription.java new file mode 100644 index 0000000000..877aa387f1 --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/result/model/errors/TsPioTErrorsDescription.java @@ -0,0 +1,37 @@ +package ru.evotor.tspiot.result.model.errors; + +import android.os.Parcel; +import android.os.Parcelable; +import java.lang.reflect.Array; +import java.lang.reflect.Constructor; +import ru.evotor.tspiot.result.model.base.ErrorDescription; + +public abstract sealed class TsPioTErrorsDescription implements Parcelable permits CheckServiceAreUnavailable, CommonErrorDescriptionError, MessageErrorDescriptionError { + abstract public T getErrorDescription(); + + protected TsPioTErrorsDescription() { } + + protected TsPioTErrorsDescription(Parcel parcel) { } + + public static class BaseCreator> implements Creator { + private final Class clazz; + + public BaseCreator(Class clazz) { this.clazz = clazz; } + + @SuppressWarnings("unchecked") + @Override + public I createFromParcel(Parcel in) { + try { + Constructor ctor = clazz.getDeclaredConstructor(Parcel.class); + ctor.setAccessible(true); + return ctor.newInstance(in); + } catch (Exception e) { + throw new RuntimeException("Cannot create " + clazz.getSimpleName(), e); + } + } + + @SuppressWarnings("unchecked") + @Override + public I[] newArray(int size) { return (I[]) Array.newInstance(clazz, size); } + } +} \ No newline at end of file diff --git a/src/main/java/ru/evotor/tspiot/result/model/offline/OfflineCodeCheck.java b/src/main/java/ru/evotor/tspiot/result/model/offline/OfflineCodeCheck.java new file mode 100644 index 0000000000..e8ab700f19 --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/result/model/offline/OfflineCodeCheck.java @@ -0,0 +1,68 @@ +package ru.evotor.tspiot.result.model.offline; + +import android.os.Parcel; +import android.os.Parcelable; +import androidx.annotation.Nullable; +import ru.evotor.tspiot.result.model.VariableExpirations; +import ru.evotor.tspiot.result.model.base.BaseCodeCheck; + +public class OfflineCodeCheck extends BaseCodeCheck implements Parcelable { + + private OfflineCodeCheck(Parcel parcel) { + super(parcel); + } + + public OfflineCodeCheck( + String cis, + boolean found, + boolean valid, + String printView, + String gtin, + int[] groupIds, + boolean verified, + boolean realizable, + boolean utilized, + @Nullable VariableExpirations variableExpirations, + @Nullable Boolean isBlocked, + String[] ogvs, + boolean sold, + @Nullable Integer mrp, + @Nullable Integer smp + ) { + super( + cis, + found, + valid, + printView, + gtin, + groupIds, + verified, + realizable, + utilized, + variableExpirations, + isBlocked, + ogvs, + sold, + mrp, + smp + ); + } + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(Parcel parcel, int flags) { super.write(parcel, flags); } + + public final static Creator CREATOR = new Creator() { + @Override + public OfflineCodeCheck createFromParcel(Parcel parcel) { + return new OfflineCodeCheck(parcel); + } + + @Override + public OfflineCodeCheck[] newArray(int size) { + return new OfflineCodeCheck[size]; + } + }; +} diff --git a/src/main/java/ru/evotor/tspiot/result/model/offline/OfflineCodesCheck.java b/src/main/java/ru/evotor/tspiot/result/model/offline/OfflineCodesCheck.java new file mode 100644 index 0000000000..e3bfa4f90e --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/result/model/offline/OfflineCodesCheck.java @@ -0,0 +1,97 @@ +package ru.evotor.tspiot.result.model.offline; + +import android.os.Parcel; +import android.os.Parcelable; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import java.util.List; + +import ru.evotor.tspiot.Utils; +import ru.evotor.tspiot.result.model.base.BaseCodesCheck; + +public class OfflineCodesCheck extends BaseCodesCheck implements Parcelable { + + /** Версия OfflineCodesCheck */ + private final static int VERSION = 1; + + /** Версия ЛМ ЧЗ */ + @Nullable + private final String version; + + @Nullable private final String inst; + + /** Результат проверки марок*/ + private final List codes; + + private OfflineCodesCheck(Parcel parcel) { + super(parcel); + + int classVersion = parcel.readInt(); + this.version = parcel.readString(); + this.inst = parcel.readString(); + this.codes = parcel.createTypedArrayList(OfflineCodeCheck.CREATOR); + } + + public OfflineCodesCheck( + int code, + String reqId, + long reqTimestamp, + @Nullable String version, + @Nullable String inst, + List codes + ) { + super(code, reqId, reqTimestamp); + + this.version = version; + this.inst = inst; + this.codes = codes; + } + + @Nullable + public String getInst() { return inst; } + + @Nullable + public String getVersion() { return version; } + + public List getCodes() { return codes; } + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(Parcel parcel, int flags) { + super.write(parcel, flags); + + parcel.writeInt(VERSION); + parcel.writeString(version); + parcel.writeString(inst); + parcel.writeTypedList(codes); + } + + @NonNull + @Override + public String toString() { + StringBuilder builder = new StringBuilder(super.toString()); + + builder.append("Version: ").append(Utils.toString(version)).append("\n"); + builder.append("Inst: ").append(Utils.toString(inst)).append("\n"); + codes.forEach(offlineCodeCheck -> { + builder.append("OfflineCodeCheck: ").append(offlineCodeCheck).append("\n"); + }); + + return builder.toString(); + } + + public final static Creator CREATOR = new Creator<>() { + @Override + public OfflineCodesCheck createFromParcel(Parcel parcel) { + return new OfflineCodesCheck(parcel); + } + + @Override + public OfflineCodesCheck[] newArray(int size) { + return new OfflineCodesCheck[size]; + } + }; +} diff --git a/src/main/java/ru/evotor/tspiot/result/model/online/OnlineCodeCheck.java b/src/main/java/ru/evotor/tspiot/result/model/online/OnlineCodeCheck.java new file mode 100644 index 0000000000..68b9ca6138 --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/result/model/online/OnlineCodeCheck.java @@ -0,0 +1,317 @@ +package ru.evotor.tspiot.result.model.online; + +import android.os.Parcel; +import android.os.Parcelable; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import java.util.Date; + +import ru.evotor.tspiot.Utils; +import ru.evotor.tspiot.result.model.VariableExpirations; +import ru.evotor.tspiot.result.model.base.BaseCodeCheck; + +public class OnlineCodeCheck extends BaseCodeCheck implements Parcelable { + + /** Версия OnlineCodeCheck */ + private final static int VERSION = 1; + + /** Дата и время истечения срока годности */ + @Nullable private final Date expireDate; + + /** Дата производства продукции */ + @Nullable private final Date productionDate; + + /** Переменный вес продукции (в граммах) */ + @Nullable private final Integer productWeight; + + /** Производственный ветеринарный сопроводительный документ */ + @Nullable private final String prVetDocument; + + /** Признак, определяющий, что запрос направлен владельцем кода (определяется по аутентификационному токену) */ + @Nullable private final Boolean isOwner; + + /** Сообщение об ошибке */ + @Nullable private final String message; + + /** + * Код ошибки + *
      + * Возможные значения: + *
        + *
      • 0 — ошибки отсутствуют
      • + *
      • 1 — ошибка валидации КМ
      • + *
      • 2 — КМ не содержит GTIN
      • + *
      • 3 — КМ не содержит серийный номер
      • + *
      • 4 — КМ содержит недопустимые символы
      • + *
      • 5 — ошибка верификации крипто-подписи КМ (формат крипто-подписи не соответствует типу КМ)
      • + *
      • 6 — ошибка верификации крипто-подписи КМ (криптоподпись невалидная)
      • + *
      • 7 — ошибка верификации крипто-подписи КМ (крипто-ключ не валиден)
      • + *
      • 8 — КМ не прошел верификацию в стране эмитента
      • + *
      • 9 — Найденные AI в КМ не поддерживаются
      • + *
      • 10 — КМ не найден в ГИС МТ
      • + *
      • 11 — КМ не найден в трансгране
      • + *
      + *
    + */ + @Nullable private final Integer errorCode; + + /** Признак контроля прослеживаемости в товарной группе */ + private final boolean isTracking; + + /** Признак использования причин выбытия, разрешающих продажу КМ */ + @Nullable private final Integer eliminationState; + + /** Признак принадлежности табачной продукции к «серой зоне» */ + @Nullable private final Boolean grayZone; + + /** + * Количество единиц товара в потребительской упаковке / Фактический объём / Фактический вес + */ + @Nullable private final Integer innerUnitCount; + + /** Счётчик проданного и возвращённого товара */ + @Nullable private final Integer soldUnitCount; + + /** Тип упаковки */ + private final String packageType; + + /** КИ агрегата */ + @Nullable private final String parent; + + /** ИНН производителя */ + @Nullable private final String producerInn; + + /** Номер производственной серии */ + @Nullable private final String productionSerialNumber; + + /** Номер производственной партии */ + @Nullable private final String productionBatchNumber; + + /** Заводской серийный номер */ + @Nullable private final String factorySerialNumber; + + /** Ёмкость КИГУ */ + @Nullable private final Integer packageQuantity; + + private OnlineCodeCheck(Parcel parcel) { + super(parcel); + + int version = parcel.readInt(); + this.expireDate = (Date) parcel.readSerializable(); + this.productionDate = (Date) parcel.readSerializable(); + this.productWeight = Utils.readInteger(parcel); + this.prVetDocument = parcel.readString(); + this.isOwner = Utils.readBoolean(parcel); + this.message = parcel.readString(); + this.errorCode = Utils.readInteger(parcel); + this.isTracking = parcel.readInt() == 1; + this.eliminationState = Utils.readInteger(parcel); + this.grayZone = Utils.readBoolean(parcel); + this.innerUnitCount = Utils.readInteger(parcel); + this.soldUnitCount = Utils.readInteger(parcel); + this.packageType = parcel.readString(); + this.parent = parcel.readString(); + this.producerInn = parcel.readString(); + this.productionSerialNumber = parcel.readString(); + this.productionBatchNumber = parcel.readString(); + this.factorySerialNumber = parcel.readString(); + this.packageQuantity = Utils.readInteger(parcel); + } + + public OnlineCodeCheck( + String cis, + Boolean found, + Boolean valid, + String printView, + String gtin, + int[] groupIds, + Boolean verified, + Boolean realizable, + Boolean utilized, + @Nullable Date expireDate, + @Nullable VariableExpirations variableExpirations, + @Nullable Date productionDate, + @Nullable Integer productWeight, + @Nullable String prVetDocument, + @Nullable Boolean isOwner, + @Nullable Boolean isBlocked, + @Nullable String[] ogvs, + @Nullable String message, + @Nullable Integer errorCode, + Boolean isTracking, + Boolean sold, + @Nullable Integer eliminationState, + @Nullable Integer mrp, + @Nullable Integer smp, + @Nullable Boolean grayZone, + @Nullable Integer innerUnitCount, + @Nullable Integer soldUnitCount, + String packageType, + @Nullable String parent, + @Nullable String producerInn, + @Nullable String productionSerialNumber, + @Nullable String productionBatchNumber, + @Nullable String factorySerialNumber, + @Nullable Integer packageQuantity + ) { + super( + cis, + found, + valid, + printView, + gtin, + groupIds, + verified, + realizable, + utilized, + variableExpirations, + isBlocked, + ogvs, + sold, + mrp, + smp + ); + + this.expireDate = expireDate; + this.productionDate = productionDate; + this.productWeight = productWeight; + this.prVetDocument = prVetDocument; + this.isOwner = isOwner; + this.message = message; + this.errorCode = errorCode; + this.isTracking = isTracking; + this.eliminationState = eliminationState; + this.grayZone = grayZone; + this.innerUnitCount = innerUnitCount; + this.soldUnitCount = soldUnitCount; + this.packageType = packageType; + this.parent = parent; + this.producerInn = producerInn; + this.productionSerialNumber = productionSerialNumber; + this.productionBatchNumber = productionBatchNumber; + this.factorySerialNumber = factorySerialNumber; + this.packageQuantity = packageQuantity; + } + + @Nullable + public Boolean getGrayZone() { return grayZone; } + + @Nullable + public Boolean getOwner() { return isOwner; } + + public boolean isTracking() { return isTracking; } + + @Nullable + public Date getExpireDate() { return expireDate; } + + @Nullable + public Date getProductionDate() { return productionDate; } + + @Nullable + public Integer getEliminationState() { return eliminationState; } + + @Nullable + public Integer getErrorCode() { return errorCode; } + + @Nullable + public Integer getInnerUnitCount() { return innerUnitCount; } + + @Nullable + public Integer getPackageQuantity() { return packageQuantity; } + + @Nullable + public Integer getProductWeight() { return productWeight; } + + @Nullable + public Integer getSoldUnitCount() { return soldUnitCount; } + + @Nullable + public String getFactorySerialNumber() { return factorySerialNumber; } + + @Nullable + public String getMessage() { return message; } + + public String getPackageType() { return packageType; } + + @Nullable + public String getParent() { return parent; } + + @Nullable + public String getProducerInn() { return producerInn; } + + @Nullable + public String getProductionBatchNumber() { return productionBatchNumber; } + + @Nullable + public String getProductionSerialNumber() { return productionSerialNumber; } + + @Nullable + public String getPrVetDocument() { return prVetDocument; } + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(Parcel parcel, int flags) { + super.write(parcel, flags); + + parcel.writeInt(VERSION); + parcel.writeSerializable(expireDate); + parcel.writeSerializable(productionDate); + parcel.writeValue(productWeight); + parcel.writeString(prVetDocument); + parcel.writeValue(isOwner); + parcel.writeString(message); + parcel.writeValue(errorCode); + parcel.writeInt(isTracking ? 1 : 0); + parcel.writeValue(eliminationState); + parcel.writeValue(grayZone); + parcel.writeValue(innerUnitCount); + parcel.writeValue(soldUnitCount); + parcel.writeString(packageType); + parcel.writeString(parent); + parcel.writeString(producerInn); + parcel.writeString(productionSerialNumber); + parcel.writeString(productionBatchNumber); + parcel.writeString(factorySerialNumber); + parcel.writeValue(packageQuantity); + } + + @NonNull + @Override + public String toString() { + return super.toString() + "ExpireDate: " + Utils.toString(expireDate) + "\n" + + "ProductionDate: " + Utils.toString(productionDate) + "\n" + + "ProductWeight: " + Utils.toString(productWeight) + "\n" + + "PrVetDocument: " + Utils.toString(prVetDocument) + "\n" + + "IsOwner: " + Utils.toString(isOwner) + "\n" + + "Message: " + Utils.toString(message) + "\n" + + "ErrorCode: " + Utils.toString(errorCode) + "\n" + + "IsTracking: " + Utils.toString(isTracking) + "\n" + + "EliminationState: " + Utils.toString(eliminationState) + "\n" + + "IsGrayZone: " + Utils.toString(grayZone) + "\n" + + "InnerUnitCount: " + Utils.toString(innerUnitCount) + "\n" + + "SoldUnitCount: " + Utils.toString(soldUnitCount) + "\n" + + "PackageType: " + Utils.toString(packageType) + "\n" + + "Parent: " + Utils.toString(parent) + "\n" + + "ProducerInn: " + Utils.toString(producerInn) + "\n" + + "ProductionSerialNumber: " + Utils.toString(productionSerialNumber) + "\n" + + "ProductionBatchNumber: " + Utils.toString(productionBatchNumber) + "\n" + + "FactorySerialNumber: " + Utils.toString(factorySerialNumber) + "\n" + + "PackageQuantity: " + Utils.toString(packageQuantity) + "\n"; + } + + public final static Creator CREATOR = new Creator<>() { + @Override + public OnlineCodeCheck createFromParcel(Parcel parcel) { + return new OnlineCodeCheck(parcel); + } + + @Override + public OnlineCodeCheck[] newArray(int size) { + return new OnlineCodeCheck[size]; + } + }; +} diff --git a/src/main/java/ru/evotor/tspiot/result/model/online/OnlineCodesCheck.java b/src/main/java/ru/evotor/tspiot/result/model/online/OnlineCodesCheck.java new file mode 100644 index 0000000000..5edd7f159e --- /dev/null +++ b/src/main/java/ru/evotor/tspiot/result/model/online/OnlineCodesCheck.java @@ -0,0 +1,87 @@ +package ru.evotor.tspiot.result.model.online; + +import android.os.Parcel; +import android.os.Parcelable; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import java.util.List; + +import ru.evotor.tspiot.Utils; +import ru.evotor.tspiot.result.model.base.BaseCodesCheck; + +public class OnlineCodesCheck extends BaseCodesCheck implements Parcelable { + + /** Версия OnlineCodesCheck */ + private final static int VERSION = 1; + + /** Текстовое описание результата выполнения метода */ + @Nullable + private final String description; + + /** Результат проверки марок*/ + private final List codes; + + private OnlineCodesCheck(Parcel parcel) { + super(parcel); + + int version = parcel.readInt(); + this.description = parcel.readString(); + this.codes = parcel.createTypedArrayList(OnlineCodeCheck.CREATOR); + } + + public OnlineCodesCheck( + int code, + @Nullable String description, + List codes, + String reqId, + long reqTimestamp + ) { + super(code, reqId, reqTimestamp); + + this.description = description; + this.codes = codes; + } + + @Nullable + public String getDescription() { return description; } + + public List getCodes() { return codes; } + + @Override + public int describeContents() { return 0; } + + @Override + public void writeToParcel(Parcel parcel, int flags) { + super.write(parcel, flags); + + parcel.writeInt(VERSION); + parcel.writeString(description); + parcel.writeTypedList(codes); + } + + @NonNull + @Override + public String toString() { + StringBuilder builder = new StringBuilder(super.toString()); + + builder.append("Description: ").append(Utils.toString(description)).append("\n"); + codes.forEach(onlineCodeCheck -> { + builder.append("OnlineCodeCheck: ").append(onlineCodeCheck).append("\n"); + }); + + return builder.toString(); + } + + public final static Creator CREATOR = new Creator<>() { + @Override + public OnlineCodesCheck createFromParcel(Parcel parcel) { + return new OnlineCodesCheck(parcel); + } + + @Override + public OnlineCodesCheck[] newArray(int size) { + return new OnlineCodesCheck[size]; + } + }; +} diff --git a/src/main/java/ru/evotor/tspiot/service/ITsPioTServiceWrapper.java b/src/main/java/ru/evotor/tspiot/service/ITsPioTServiceWrapper.java index 0539686752..58f8281f94 100644 --- a/src/main/java/ru/evotor/tspiot/service/ITsPioTServiceWrapper.java +++ b/src/main/java/ru/evotor/tspiot/service/ITsPioTServiceWrapper.java @@ -1,15 +1,13 @@ package ru.evotor.tspiot.service; import java.util.List; - -import ru.evotor.tspiot.exceptions.TsPioTErrorHolderException; import ru.evotor.tspiot.exceptions.base.TsPioTServiceException; import ru.evotor.tspiot.model.MarkingCode; -import ru.evotor.tspiot.result.CodesCheckResult; -import ru.evotor.tspiot.result.KktInfo; +import ru.evotor.tspiot.result.model.CodesCheckResult; +import ru.evotor.tspiot.result.model.KktInfo; public interface ITsPioTServiceWrapper { - KktInfo getKktInfo() throws TsPioTServiceException, TsPioTErrorHolderException; + KktInfo getKktInfo() throws TsPioTServiceException; - CodesCheckResult getMarkedProductsInfo(List codes) throws TsPioTServiceException, TsPioTErrorHolderException; + CodesCheckResult getMarkedProductsInfo(List codes, String userUuid) throws TsPioTServiceException; } diff --git a/src/main/java/ru/evotor/tspiot/service/TsPioTService.java b/src/main/java/ru/evotor/tspiot/service/TsPioTService.java index 2ca2a0da33..2a4ef59867 100644 --- a/src/main/java/ru/evotor/tspiot/service/TsPioTService.java +++ b/src/main/java/ru/evotor/tspiot/service/TsPioTService.java @@ -8,6 +8,10 @@ import android.os.IBinder; import android.os.Parcelable; import android.os.RemoteException; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -20,8 +24,8 @@ import ru.evotor.tspiot.exceptions.base.TsPioTServiceException; import ru.evotor.tspiot.exceptions.UnknownException; import ru.evotor.tspiot.model.MarkingCode; -import ru.evotor.tspiot.result.CodesCheckResult; -import ru.evotor.tspiot.result.KktInfo; +import ru.evotor.tspiot.result.model.CodesCheckResult; +import ru.evotor.tspiot.result.model.KktInfo; import ru.evotor.tspiot.result.TsPioTError; import ru.evotor.tspiot.result.TsPioTResult; @@ -130,7 +134,7 @@ public KktInfo getKktInfo() throws TsPioTServiceException { TsPioTError error = result.getError(); if (error != null) { - throw new TsPioTErrorHolderException(error.getCode(), error.getMessage()); + throw new TsPioTErrorHolderException(error.getError()); } else { throw new UnknownException(UNKNOWN_EXCEPTION_TEXT); } @@ -144,11 +148,14 @@ public KktInfo getKktInfo() throws TsPioTServiceException { /** Метод проверки марок */ @SuppressWarnings("rawtypes") @Override - public CodesCheckResult getMarkedProductsInfo(List codes) throws TsPioTServiceException { + public CodesCheckResult getMarkedProductsInfo( + @NonNull List codes, + @Nullable String userUuid + ) throws TsPioTServiceException { TsPioTServiceOperationOnMainThreadException.throwIfMainThread(); try { - TsPioTResult result = service.getMarkedProductsInfo(codes); + TsPioTResult result = service.getMarkedProductsInfo(codes, userUuid); Parcelable data = result.getData(); if (data != null) { @@ -157,7 +164,7 @@ public CodesCheckResult getMarkedProductsInfo(List codes) throws Ts TsPioTError error = result.getError(); if (error != null) { - throw new TsPioTErrorHolderException(error.getCode(), error.getMessage()); + throw new TsPioTErrorHolderException(error.getError()); } else { throw new UnknownException(UNKNOWN_EXCEPTION_TEXT); } From 621fbebbf7babf8d82b40253f03782dd94895924 Mon Sep 17 00:00:00 2001 From: "v.drebnev" Date: Thu, 7 May 2026 11:30:55 +0500 Subject: [PATCH 10/17] MRK-5213 --- .../tspiot/result/model/base/BaseCodeCheck.java | 15 +++++++++------ .../result/model/offline/OfflineCodeCheck.java | 6 ++---- .../result/model/offline/OfflineCodesCheck.java | 12 +++++------- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/main/java/ru/evotor/tspiot/result/model/base/BaseCodeCheck.java b/src/main/java/ru/evotor/tspiot/result/model/base/BaseCodeCheck.java index 43bb41fb3d..d471d1839d 100644 --- a/src/main/java/ru/evotor/tspiot/result/model/base/BaseCodeCheck.java +++ b/src/main/java/ru/evotor/tspiot/result/model/base/BaseCodeCheck.java @@ -21,13 +21,13 @@ public abstract class BaseCodeCheck { protected final boolean valid; /** КИ без крипто-подписи / КиЗ */ - protected final String printView; + @Nullable protected final String printView; /** Код товара */ protected final String gtin; /** Массив идентификаторов товарных групп */ - protected final int[] groupIds; + @Nullable protected final int[] groupIds; /** Результат проверки крипто-подписи КМ */ protected final boolean verified; @@ -46,7 +46,7 @@ public abstract class BaseCodeCheck { @Nullable protected final Boolean isBlocked; /** Органы государственной власти, установившие блокировку на КИ */ - protected final String[] ogvs; + @Nullable protected final String[] ogvs; /** Признак продажи товара */ protected final boolean sold; @@ -80,15 +80,15 @@ public BaseCodeCheck( String cis, boolean found, boolean valid, - String printView, + @Nullable String printView, String gtin, - int[] groupIds, + @Nullable int[] groupIds, boolean verified, boolean realizable, boolean utilized, @Nullable VariableExpirations variableExpirations, @Nullable Boolean isBlocked, - String[] ogvs, + @Nullable String[] ogvs, boolean sold, @Nullable Integer mrp, @Nullable Integer smp @@ -144,6 +144,7 @@ protected void write(Parcel parcel, int flags) { public boolean isVerified() { return verified; } + @Nullable public int[] getGroupIds() { return groupIds; } @Nullable @@ -156,8 +157,10 @@ protected void write(Parcel parcel, int flags) { public String getGtin() { return gtin; } + @Nullable public String getPrintView() { return printView; } + @Nullable public String[] getOgvs() { return ogvs; } @Nullable diff --git a/src/main/java/ru/evotor/tspiot/result/model/offline/OfflineCodeCheck.java b/src/main/java/ru/evotor/tspiot/result/model/offline/OfflineCodeCheck.java index e8ab700f19..2a37640958 100644 --- a/src/main/java/ru/evotor/tspiot/result/model/offline/OfflineCodeCheck.java +++ b/src/main/java/ru/evotor/tspiot/result/model/offline/OfflineCodeCheck.java @@ -18,13 +18,11 @@ public OfflineCodeCheck( boolean valid, String printView, String gtin, - int[] groupIds, boolean verified, boolean realizable, boolean utilized, @Nullable VariableExpirations variableExpirations, @Nullable Boolean isBlocked, - String[] ogvs, boolean sold, @Nullable Integer mrp, @Nullable Integer smp @@ -35,13 +33,13 @@ public OfflineCodeCheck( valid, printView, gtin, - groupIds, + null, verified, realizable, utilized, variableExpirations, isBlocked, - ogvs, + null, sold, mrp, smp diff --git a/src/main/java/ru/evotor/tspiot/result/model/offline/OfflineCodesCheck.java b/src/main/java/ru/evotor/tspiot/result/model/offline/OfflineCodesCheck.java index e3bfa4f90e..46a8c92b42 100644 --- a/src/main/java/ru/evotor/tspiot/result/model/offline/OfflineCodesCheck.java +++ b/src/main/java/ru/evotor/tspiot/result/model/offline/OfflineCodesCheck.java @@ -15,11 +15,11 @@ public class OfflineCodesCheck extends BaseCodesCheck implements Parcelable { /** Версия OfflineCodesCheck */ private final static int VERSION = 1; - /** Версия ЛМ ЧЗ */ - @Nullable + /** Версия базы "чёрного списка", на которой выполнялась проверка КИ */ private final String version; - @Nullable private final String inst; + /** Идентификатор экземпляра ПО ЛМ ЧЗ */ + private final String inst; /** Результат проверки марок*/ private final List codes; @@ -37,8 +37,8 @@ public OfflineCodesCheck( int code, String reqId, long reqTimestamp, - @Nullable String version, - @Nullable String inst, + String version, + String inst, List codes ) { super(code, reqId, reqTimestamp); @@ -48,10 +48,8 @@ public OfflineCodesCheck( this.codes = codes; } - @Nullable public String getInst() { return inst; } - @Nullable public String getVersion() { return version; } public List getCodes() { return codes; } From cdac98038c2a818227737264e35f0715de09dd02 Mon Sep 17 00:00:00 2001 From: "v.drebnev" Date: Tue, 19 May 2026 10:30:38 +0500 Subject: [PATCH 11/17] =?UTF-8?q?MRK-5213=20=D0=9F=D0=BE=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D0=BD=D0=B5=D0=B9=D0=BC=D0=B8=D0=BD=D0=B3?= =?UTF-8?q?=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA=20=D0=A2=D0=A1=20=D0=9F?= =?UTF-8?q?=D0=98=D0=BE=D0=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TsPioTErrorHolderException.java | 6 ++-- .../ru/evotor/tspiot/result/TsPioTError.java | 12 ++++---- .../errors/CheckServiceAreUnavailable.java | 2 +- ....java => CodeMessageErrorDescription.java} | 16 +++++------ ...> CodeMessageErrorDescriptionWrapper.java} | 28 +++++++++---------- ...va => MessageErrorDescriptionWrapper.java} | 24 ++++++++-------- ...va => TsPioTErrorsDescriptionWrapper.java} | 14 +++++----- 7 files changed, 51 insertions(+), 51 deletions(-) rename src/main/java/ru/evotor/tspiot/result/model/errors/{CommonErrorDescription.java => CodeMessageErrorDescription.java} (64%) rename src/main/java/ru/evotor/tspiot/result/model/errors/{CommonErrorDescriptionError.java => CodeMessageErrorDescriptionWrapper.java} (58%) rename src/main/java/ru/evotor/tspiot/result/model/errors/{MessageErrorDescriptionError.java => MessageErrorDescriptionWrapper.java} (90%) rename src/main/java/ru/evotor/tspiot/result/model/errors/{TsPioTErrorsDescription.java => TsPioTErrorsDescriptionWrapper.java} (59%) diff --git a/src/main/java/ru/evotor/tspiot/exceptions/TsPioTErrorHolderException.java b/src/main/java/ru/evotor/tspiot/exceptions/TsPioTErrorHolderException.java index b848de9b99..d19212b5bd 100644 --- a/src/main/java/ru/evotor/tspiot/exceptions/TsPioTErrorHolderException.java +++ b/src/main/java/ru/evotor/tspiot/exceptions/TsPioTErrorHolderException.java @@ -2,14 +2,14 @@ import ru.evotor.tspiot.exceptions.base.TsPioTServiceException; import ru.evotor.tspiot.result.model.base.ErrorDescription; -import ru.evotor.tspiot.result.model.errors.TsPioTErrorsDescription; +import ru.evotor.tspiot.result.model.errors.TsPioTErrorsDescriptionWrapper; /** Исключение обёртка для передачи ошибок от драйвера ТС ПИоТ */ public class TsPioTErrorHolderException extends TsPioTServiceException { - public final TsPioTErrorsDescription errorDescription; + public final TsPioTErrorsDescriptionWrapper errorDescription; - public TsPioTErrorHolderException(TsPioTErrorsDescription errorDescription) { + public TsPioTErrorHolderException(TsPioTErrorsDescriptionWrapper errorDescription) { super(); this.errorDescription = errorDescription; } diff --git a/src/main/java/ru/evotor/tspiot/result/TsPioTError.java b/src/main/java/ru/evotor/tspiot/result/TsPioTError.java index b129f43b4a..f74c2afc82 100644 --- a/src/main/java/ru/evotor/tspiot/result/TsPioTError.java +++ b/src/main/java/ru/evotor/tspiot/result/TsPioTError.java @@ -4,7 +4,7 @@ import android.os.Parcelable; import ru.evotor.tspiot.Utils; import ru.evotor.tspiot.result.model.base.ErrorDescription; -import ru.evotor.tspiot.result.model.errors.TsPioTErrorsDescription; +import ru.evotor.tspiot.result.model.errors.TsPioTErrorsDescriptionWrapper; public class TsPioTError implements Parcelable { @@ -12,9 +12,9 @@ public class TsPioTError implements Parcelable { private final static int VERSION = 1; /** Описание ошибки */ - private final TsPioTErrorsDescription error; + private final TsPioTErrorsDescriptionWrapper error; - private final Class> errorType; + private final Class> errorType; private TsPioTError(Parcel parcel) { int version = parcel.readInt(); @@ -23,12 +23,12 @@ private TsPioTError(Parcel parcel) { } @SuppressWarnings("unchecked") - public TsPioTError(TsPioTErrorsDescription error) { + public TsPioTError(TsPioTErrorsDescriptionWrapper error) { this.error = error; - this.errorType = (Class>) error.getClass(); + this.errorType = (Class>) error.getClass(); } - public TsPioTErrorsDescription getError() { return error; } + public TsPioTErrorsDescriptionWrapper getError() { return error; } @Override public int describeContents() { return 0; } diff --git a/src/main/java/ru/evotor/tspiot/result/model/errors/CheckServiceAreUnavailable.java b/src/main/java/ru/evotor/tspiot/result/model/errors/CheckServiceAreUnavailable.java index 7255f84608..efbe6dd5a9 100644 --- a/src/main/java/ru/evotor/tspiot/result/model/errors/CheckServiceAreUnavailable.java +++ b/src/main/java/ru/evotor/tspiot/result/model/errors/CheckServiceAreUnavailable.java @@ -6,7 +6,7 @@ * ТС ПИоТ не смог получить ответ ни от ГИС МТ, ни от ЛМ ЧЗ. * Сервисы ЧЗ недоступны, имеет смысл повторить запрос позже. */ -public final class CheckServiceAreUnavailable extends TsPioTErrorsDescription { +public final class CheckServiceAreUnavailable extends TsPioTErrorsDescriptionWrapper { private final CodesCheckErrorDescription errorDescription; public CheckServiceAreUnavailable(CodesCheckErrorDescription errorDescription) { diff --git a/src/main/java/ru/evotor/tspiot/result/model/errors/CommonErrorDescription.java b/src/main/java/ru/evotor/tspiot/result/model/errors/CodeMessageErrorDescription.java similarity index 64% rename from src/main/java/ru/evotor/tspiot/result/model/errors/CommonErrorDescription.java rename to src/main/java/ru/evotor/tspiot/result/model/errors/CodeMessageErrorDescription.java index 253b7914da..74cdda37ce 100644 --- a/src/main/java/ru/evotor/tspiot/result/model/errors/CommonErrorDescription.java +++ b/src/main/java/ru/evotor/tspiot/result/model/errors/CodeMessageErrorDescription.java @@ -3,7 +3,7 @@ import android.os.Parcel; import ru.evotor.tspiot.result.model.base.ErrorDescription; -public class CommonErrorDescription implements ErrorDescription { +public class CodeMessageErrorDescription implements ErrorDescription { /** Версия CommonErrorDescription */ private final static int VERSION = 1; @@ -14,13 +14,13 @@ public class CommonErrorDescription implements ErrorDescription { /** Описание ошибки */ private final String message; - private CommonErrorDescription(Parcel parcel) { + private CodeMessageErrorDescription(Parcel parcel) { int version = parcel.readInt(); this.errorCode = parcel.readInt(); this.message = parcel.readString(); } - public CommonErrorDescription(int errorCode, String message) { + public CodeMessageErrorDescription(int errorCode, String message) { this.errorCode = errorCode; this.message = message; } @@ -39,15 +39,15 @@ public void writeToParcel(Parcel parcel, int i) { parcel.writeString(message); } - public static final Creator CREATOR = new Creator<>() { + public static final Creator CREATOR = new Creator<>() { @Override - public CommonErrorDescription createFromParcel(Parcel parcel) { - return new CommonErrorDescription(parcel); + public CodeMessageErrorDescription createFromParcel(Parcel parcel) { + return new CodeMessageErrorDescription(parcel); } @Override - public CommonErrorDescription[] newArray(int size) { - return new CommonErrorDescription[size]; + public CodeMessageErrorDescription[] newArray(int size) { + return new CodeMessageErrorDescription[size]; } }; } diff --git a/src/main/java/ru/evotor/tspiot/result/model/errors/CommonErrorDescriptionError.java b/src/main/java/ru/evotor/tspiot/result/model/errors/CodeMessageErrorDescriptionWrapper.java similarity index 58% rename from src/main/java/ru/evotor/tspiot/result/model/errors/CommonErrorDescriptionError.java rename to src/main/java/ru/evotor/tspiot/result/model/errors/CodeMessageErrorDescriptionWrapper.java index bb9914c1c0..fbe962ffd0 100644 --- a/src/main/java/ru/evotor/tspiot/result/model/errors/CommonErrorDescriptionError.java +++ b/src/main/java/ru/evotor/tspiot/result/model/errors/CodeMessageErrorDescriptionWrapper.java @@ -2,20 +2,20 @@ import android.os.Parcel; -public sealed abstract class CommonErrorDescriptionError extends TsPioTErrorsDescription { - protected final CommonErrorDescription errorDescription; +public sealed abstract class CodeMessageErrorDescriptionWrapper extends TsPioTErrorsDescriptionWrapper { + protected final CodeMessageErrorDescription errorDescription; - protected CommonErrorDescriptionError(Parcel parcel) { + protected CodeMessageErrorDescriptionWrapper(Parcel parcel) { super(parcel); - this.errorDescription = parcel.readParcelable(CommonErrorDescription.class.getClassLoader()); + this.errorDescription = parcel.readParcelable(CodeMessageErrorDescription.class.getClassLoader()); } - public CommonErrorDescriptionError(CommonErrorDescription errorDescription) { + public CodeMessageErrorDescriptionWrapper(CodeMessageErrorDescription errorDescription) { this.errorDescription = errorDescription; } @Override - public CommonErrorDescription getErrorDescription() { return errorDescription; } + public CodeMessageErrorDescription getErrorDescription() { return errorDescription; } @Override public int describeContents() { return 0; } @@ -26,10 +26,10 @@ public void writeToParcel(Parcel parcel, int flags) { } /** Ошибка на стороне ККМ */ - public static final class KkmError extends CommonErrorDescriptionError { + public static final class KkmError extends CodeMessageErrorDescriptionWrapper { private KkmError(Parcel parcel) { super(parcel); } - public KkmError(CommonErrorDescription errorDescription) { + public KkmError(CodeMessageErrorDescription errorDescription) { super(errorDescription); } @@ -37,10 +37,10 @@ public KkmError(CommonErrorDescription errorDescription) { } /** Ошибка на стороне локального модуля */ - public static final class LocalModuleError extends CommonErrorDescriptionError { + public static final class LocalModuleError extends CodeMessageErrorDescriptionWrapper { private LocalModuleError(Parcel parcel) { super(parcel); } - public LocalModuleError(CommonErrorDescription errorDescription) { + public LocalModuleError(CodeMessageErrorDescription errorDescription) { super(errorDescription); } @@ -48,10 +48,10 @@ public LocalModuleError(CommonErrorDescription errorDescription) { } /** Не удалось получить fnSid (Не удалось установить доверенный канал) */ - public static final class FnSidError extends CommonErrorDescriptionError { + public static final class FnSidError extends CodeMessageErrorDescriptionWrapper { private FnSidError(Parcel parcel) { super(parcel); } - public FnSidError(CommonErrorDescription errorDescription) { + public FnSidError(CodeMessageErrorDescription errorDescription) { super(errorDescription); } @@ -62,10 +62,10 @@ public FnSidError(CommonErrorDescription errorDescription) { * Аварийный режим. Продажа товара разрешена без проверки, * действуют ограничения аварийного режима */ - public static final class EmergencyMode extends CommonErrorDescriptionError { + public static final class EmergencyMode extends CodeMessageErrorDescriptionWrapper { private EmergencyMode(Parcel parcel) { super(parcel); } - public EmergencyMode(CommonErrorDescription errorDescription) { + public EmergencyMode(CodeMessageErrorDescription errorDescription) { super(errorDescription); } diff --git a/src/main/java/ru/evotor/tspiot/result/model/errors/MessageErrorDescriptionError.java b/src/main/java/ru/evotor/tspiot/result/model/errors/MessageErrorDescriptionWrapper.java similarity index 90% rename from src/main/java/ru/evotor/tspiot/result/model/errors/MessageErrorDescriptionError.java rename to src/main/java/ru/evotor/tspiot/result/model/errors/MessageErrorDescriptionWrapper.java index 3da2e99035..1bc90387a8 100644 --- a/src/main/java/ru/evotor/tspiot/result/model/errors/MessageErrorDescriptionError.java +++ b/src/main/java/ru/evotor/tspiot/result/model/errors/MessageErrorDescriptionWrapper.java @@ -2,15 +2,15 @@ import android.os.Parcel; -public sealed abstract class MessageErrorDescriptionError extends TsPioTErrorsDescription { +public sealed abstract class MessageErrorDescriptionWrapper extends TsPioTErrorsDescriptionWrapper { final protected MessageErrorDescription errorDescription; - protected MessageErrorDescriptionError(Parcel parcel) { + protected MessageErrorDescriptionWrapper(Parcel parcel) { super(parcel); this.errorDescription = parcel.readParcelable(MessageErrorDescription.class.getClassLoader()); } - public MessageErrorDescriptionError(MessageErrorDescription errorDescription) { + public MessageErrorDescriptionWrapper(MessageErrorDescription errorDescription) { this.errorDescription = errorDescription; } @@ -26,7 +26,7 @@ public void writeToParcel(Parcel parcel, int flags) { } /** Нет доступных CDN для онлайн проверки */ - public static final class CdnNotFoundError extends MessageErrorDescriptionError { + public static final class CdnNotFoundError extends MessageErrorDescriptionWrapper { private CdnNotFoundError(Parcel parcel) { super(parcel); } public CdnNotFoundError(MessageErrorDescription errorDescription) { @@ -37,7 +37,7 @@ public CdnNotFoundError(MessageErrorDescription errorDescription) { } /** ТСПиОТ не зарегистрирован */ - public static final class NotRegistered extends MessageErrorDescriptionError { + public static final class NotRegistered extends MessageErrorDescriptionWrapper { private NotRegistered(Parcel parcel) { super(parcel); } public NotRegistered(MessageErrorDescription errorDescription) { @@ -48,7 +48,7 @@ public NotRegistered(MessageErrorDescription errorDescription) { } /** Не получена конфигурация ТСПиОТ */ - public static final class NotConfigured extends MessageErrorDescriptionError { + public static final class NotConfigured extends MessageErrorDescriptionWrapper { private NotConfigured(Parcel parcel) { super(parcel); } public NotConfigured(MessageErrorDescription errorDescription) { @@ -59,7 +59,7 @@ public NotConfigured(MessageErrorDescription errorDescription) { } /** Отсутствует пермишн PMSR в манифесте приложения */ - public static final class NotFoundPermission extends MessageErrorDescriptionError { + public static final class NotFoundPermission extends MessageErrorDescriptionWrapper { private NotFoundPermission(Parcel parcel) { super(parcel); } public NotFoundPermission(MessageErrorDescription errorDescription) { @@ -70,7 +70,7 @@ public NotFoundPermission(MessageErrorDescription errorDescription) { } /** Отсутствует PMSR_ID в манифесте приложения */ - public static final class NotFoundPmsrId extends MessageErrorDescriptionError { + public static final class NotFoundPmsrId extends MessageErrorDescriptionWrapper { private NotFoundPmsrId(Parcel parcel) { super(parcel); } public NotFoundPmsrId(MessageErrorDescription errorDescription) { @@ -81,7 +81,7 @@ public NotFoundPmsrId(MessageErrorDescription errorDescription) { } /** Отсутствует PMSR_TOKEN в манифесте приложения */ - public static final class NotFoundPmsrToken extends MessageErrorDescriptionError { + public static final class NotFoundPmsrToken extends MessageErrorDescriptionWrapper { private NotFoundPmsrToken(Parcel parcel) { super(parcel); } public NotFoundPmsrToken(MessageErrorDescription errorDescription) { @@ -92,7 +92,7 @@ public NotFoundPmsrToken(MessageErrorDescription errorDescription) { } /** Не удалось получить appName вызывающего приложения */ - public static final class FailedGetAppName extends MessageErrorDescriptionError { + public static final class FailedGetAppName extends MessageErrorDescriptionWrapper { private FailedGetAppName(Parcel parcel) { super(parcel); } public FailedGetAppName(MessageErrorDescription errorDescription) { @@ -103,7 +103,7 @@ public FailedGetAppName(MessageErrorDescription errorDescription) { } /** Не удалось получить версию вызывающего приложения */ - public static final class FailedGetAppVersion extends MessageErrorDescriptionError { + public static final class FailedGetAppVersion extends MessageErrorDescriptionWrapper { private FailedGetAppVersion(Parcel parcel) { super(parcel); } public FailedGetAppVersion(MessageErrorDescription errorDescription) { @@ -114,7 +114,7 @@ public FailedGetAppVersion(MessageErrorDescription errorDescription) { } /** Неизвестная ошибка */ - public static final class UnknownError extends MessageErrorDescriptionError { + public static final class UnknownError extends MessageErrorDescriptionWrapper { private UnknownError(Parcel parcel) { super(parcel); } public UnknownError(MessageErrorDescription errorDescription) { diff --git a/src/main/java/ru/evotor/tspiot/result/model/errors/TsPioTErrorsDescription.java b/src/main/java/ru/evotor/tspiot/result/model/errors/TsPioTErrorsDescriptionWrapper.java similarity index 59% rename from src/main/java/ru/evotor/tspiot/result/model/errors/TsPioTErrorsDescription.java rename to src/main/java/ru/evotor/tspiot/result/model/errors/TsPioTErrorsDescriptionWrapper.java index 877aa387f1..7c50b7b638 100644 --- a/src/main/java/ru/evotor/tspiot/result/model/errors/TsPioTErrorsDescription.java +++ b/src/main/java/ru/evotor/tspiot/result/model/errors/TsPioTErrorsDescriptionWrapper.java @@ -6,14 +6,14 @@ import java.lang.reflect.Constructor; import ru.evotor.tspiot.result.model.base.ErrorDescription; -public abstract sealed class TsPioTErrorsDescription implements Parcelable permits CheckServiceAreUnavailable, CommonErrorDescriptionError, MessageErrorDescriptionError { +public abstract sealed class TsPioTErrorsDescriptionWrapper implements Parcelable permits CheckServiceAreUnavailable, CodeMessageErrorDescriptionWrapper, MessageErrorDescriptionWrapper { abstract public T getErrorDescription(); - protected TsPioTErrorsDescription() { } + protected TsPioTErrorsDescriptionWrapper() { } - protected TsPioTErrorsDescription(Parcel parcel) { } + protected TsPioTErrorsDescriptionWrapper(Parcel parcel) { } - public static class BaseCreator> implements Creator { + public static class BaseCreator> implements Creator { private final Class clazz; public BaseCreator(Class clazz) { this.clazz = clazz; } @@ -22,9 +22,9 @@ public static class BaseCreator ctor = clazz.getDeclaredConstructor(Parcel.class); - ctor.setAccessible(true); - return ctor.newInstance(in); + Constructor constructor = clazz.getDeclaredConstructor(Parcel.class); + constructor.setAccessible(true); + return constructor.newInstance(in); } catch (Exception e) { throw new RuntimeException("Cannot create " + clazz.getSimpleName(), e); } From ab61b4adfb2d80eab8f6f97c1bcb42ebc2dc90d2 Mon Sep 17 00:00:00 2001 From: Anna Balakireva Date: Wed, 27 May 2026 16:10:11 +0300 Subject: [PATCH 12/17] =?UTF-8?q?MRK-5213=20=D0=9D=D0=B5=D0=BA=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D1=8B=D0=B5=20=D0=BF=D0=BE=D0=BB=D1=8F=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BC=D0=B5=D1=87=D0=B5=D0=BD=D1=8B=20nullable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../result/model/base/BaseCodeCheck.java | 208 +++++++++++----- .../model/offline/OfflineCodeCheck.java | 16 +- .../result/model/online/OnlineCodeCheck.java | 231 +++++++++++++----- 3 files changed, 318 insertions(+), 137 deletions(-) diff --git a/src/main/java/ru/evotor/tspiot/result/model/base/BaseCodeCheck.java b/src/main/java/ru/evotor/tspiot/result/model/base/BaseCodeCheck.java index d471d1839d..36bbcc4dbe 100644 --- a/src/main/java/ru/evotor/tspiot/result/model/base/BaseCodeCheck.java +++ b/src/main/java/ru/evotor/tspiot/result/model/base/BaseCodeCheck.java @@ -1,95 +1,142 @@ package ru.evotor.tspiot.result.model.base; import android.os.Parcel; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; + import ru.evotor.tspiot.Utils; import ru.evotor.tspiot.result.model.VariableExpirations; public abstract class BaseCodeCheck { - /** Версия BaseCodeCheck */ + /** + * Версия BaseCodeCheck + */ private final static int VERSION = 1; - /** КИ / КиЗ из запроса */ + /** + * КИ / КиЗ из запроса + */ protected final String cis; - /** Признак наличия кода в ГИС МТ */ - protected final boolean found; + /** + * Признак наличия кода в ГИС МТ + */ + @Nullable + protected final Boolean found; - /** Результат проверки валидности структуры КИ / КиЗ */ - protected final boolean valid; + /** + * Результат проверки валидности структуры КИ / КиЗ + */ + @Nullable + protected final Boolean valid; - /** КИ без крипто-подписи / КиЗ */ - @Nullable protected final String printView; + /** + * КИ без крипто-подписи / КиЗ + */ + @Nullable + protected final String printView; - /** Код товара */ + /** + * Код товара + */ + @Nullable protected final String gtin; - /** Массив идентификаторов товарных групп */ - @Nullable protected final int[] groupIds; + /** + * Массив идентификаторов товарных групп + */ + @Nullable + protected final int[] groupIds; - /** Результат проверки крипто-подписи КМ */ - protected final boolean verified; + /** + * Результат проверки крипто-подписи КМ + */ + @Nullable + protected final Boolean verified; - /** Признак возможности реализации КИ / КиЗ */ - protected final boolean realizable; + /** + * Признак возможности реализации КИ / КиЗ + */ + @Nullable + protected final Boolean realizable; - /** Признак нанесения КИ / КиЗ на упаковку */ - protected final boolean utilized; + /** + * Признак нанесения КИ / КиЗ на упаковку + */ + @Nullable + protected final Boolean utilized; - /** Информация о вариативном сроке годности */ + /** + * Информация о вариативном сроке годности + */ @Nullable protected final VariableExpirations variableExpirations; - /** Признак того, что розничная продажа продукции заблокирована по решению ОГВ */ - @Nullable protected final Boolean isBlocked; + /** + * Признак того, что розничная продажа продукции заблокирована по решению ОГВ + */ + @Nullable + protected final Boolean isBlocked; - /** Органы государственной власти, установившие блокировку на КИ */ - @Nullable protected final String[] ogvs; + /** + * Органы государственной власти, установившие блокировку на КИ + */ + @Nullable + protected final String[] ogvs; - /** Признак продажи товара */ - protected final boolean sold; + /** + * Признак продажи товара + */ + @Nullable + protected final Boolean sold; - /** Максимальная розничная цена */ - @Nullable protected final Integer mrp; + /** + * Максимальная розничная цена + */ + @Nullable + protected final Integer mrp; - /** Единая минимальная цена (ЕМЦ) */ - @Nullable protected final Integer smp; + /** + * Единая минимальная цена (ЕМЦ) + */ + @Nullable + protected final Integer smp; protected BaseCodeCheck(Parcel parcel) { int version = parcel.readInt(); this.cis = parcel.readString(); - this.found = parcel.readInt() == 1; - this.valid = parcel.readInt() == 1; + this.found = Utils.readBoolean(parcel); + this.valid = Utils.readBoolean(parcel); this.printView = parcel.readString(); this.gtin = parcel.readString(); this.groupIds = parcel.createIntArray(); - this.verified = parcel.readInt() == 1; - this.realizable = parcel.readInt() == 1; - this.utilized = parcel.readInt() == 1; + this.verified = Utils.readBoolean(parcel); + this.realizable = Utils.readBoolean(parcel); + this.utilized = Utils.readBoolean(parcel); this.variableExpirations = parcel.readTypedObject(VariableExpirations.CREATOR); this.isBlocked = Utils.readBoolean(parcel); this.ogvs = parcel.createStringArray(); - this.sold = parcel.readInt() == 1; + this.sold = Utils.readBoolean(parcel); this.mrp = Utils.readInteger(parcel); this.smp = Utils.readInteger(parcel); } public BaseCodeCheck( String cis, - boolean found, - boolean valid, + @Nullable Boolean found, + @Nullable Boolean valid, @Nullable String printView, - String gtin, + @Nullable String gtin, @Nullable int[] groupIds, - boolean verified, - boolean realizable, - boolean utilized, + @Nullable Boolean verified, + @Nullable Boolean realizable, + @Nullable Boolean utilized, @Nullable VariableExpirations variableExpirations, @Nullable Boolean isBlocked, @Nullable String[] ogvs, - boolean sold, + @Nullable Boolean sold, @Nullable Integer mrp, @Nullable Integer smp ) { @@ -113,58 +160,95 @@ public BaseCodeCheck( protected void write(Parcel parcel, int flags) { parcel.writeInt(VERSION); parcel.writeString(cis); - parcel.writeInt(found ? 1 : 0); - parcel.writeInt(valid ? 1 : 0); + parcel.writeValue(found); + parcel.writeValue(valid); parcel.writeString(printView); parcel.writeString(gtin); parcel.writeIntArray(groupIds); - parcel.writeInt(verified ? 1 : 0); - parcel.writeInt(realizable ? 1 : 0); - parcel.writeInt(utilized ? 1 : 0); + parcel.writeValue(verified); + parcel.writeValue(realizable); + parcel.writeValue(utilized); parcel.writeTypedObject(this.variableExpirations, flags); parcel.writeValue(isBlocked); parcel.writeStringArray(ogvs); - parcel.writeInt(sold ? 1 : 0); + parcel.writeValue(sold); parcel.writeValue(mrp); parcel.writeValue(smp); } @Nullable - public Boolean getBlocked() { return isBlocked; } + public Boolean getBlocked() { + return isBlocked; + } - public boolean isFound() { return found; } + @Nullable + public Boolean isFound() { + return found; + } - public boolean isRealizable() { return realizable; } + @Nullable + public Boolean isRealizable() { + return realizable; + } - public boolean isSold() { return sold; } + @Nullable + public Boolean isSold() { + return sold; + } - public boolean isUtilized() { return utilized; } + @Nullable + public Boolean isUtilized() { + return utilized; + } - public boolean isValid() { return valid; } + @Nullable + public Boolean isValid() { + return valid; + } - public boolean isVerified() { return verified; } + @Nullable + public Boolean isVerified() { + return verified; + } @Nullable - public int[] getGroupIds() { return groupIds; } + public int[] getGroupIds() { + return groupIds; + } @Nullable - public Integer getMrp() { return mrp; } + public Integer getMrp() { + return mrp; + } @Nullable - public Integer getSmp() { return smp; } + public Integer getSmp() { + return smp; + } - public String getCis() { return cis; } + public String getCis() { + return cis; + } - public String getGtin() { return gtin; } + @Nullable + public String getGtin() { + return gtin; + } @Nullable - public String getPrintView() { return printView; } + public String getPrintView() { + return printView; + } @Nullable - public String[] getOgvs() { return ogvs; } + public String[] getOgvs() { + return ogvs; + } @Nullable - public VariableExpirations getVariableExpirations() { return variableExpirations; } + public VariableExpirations getVariableExpirations() { + return variableExpirations; + } @NonNull @Override diff --git a/src/main/java/ru/evotor/tspiot/result/model/offline/OfflineCodeCheck.java b/src/main/java/ru/evotor/tspiot/result/model/offline/OfflineCodeCheck.java index 2a37640958..d9267a105d 100644 --- a/src/main/java/ru/evotor/tspiot/result/model/offline/OfflineCodeCheck.java +++ b/src/main/java/ru/evotor/tspiot/result/model/offline/OfflineCodeCheck.java @@ -14,16 +14,16 @@ private OfflineCodeCheck(Parcel parcel) { public OfflineCodeCheck( String cis, - boolean found, - boolean valid, - String printView, - String gtin, - boolean verified, - boolean realizable, - boolean utilized, + @Nullable Boolean found, + @Nullable Boolean valid, + @Nullable String printView, + @Nullable String gtin, + @Nullable Boolean verified, + @Nullable Boolean realizable, + @Nullable Boolean utilized, @Nullable VariableExpirations variableExpirations, @Nullable Boolean isBlocked, - boolean sold, + @Nullable Boolean sold, @Nullable Integer mrp, @Nullable Integer smp ) { diff --git a/src/main/java/ru/evotor/tspiot/result/model/online/OnlineCodeCheck.java b/src/main/java/ru/evotor/tspiot/result/model/online/OnlineCodeCheck.java index 68b9ca6138..9b26f16fc3 100644 --- a/src/main/java/ru/evotor/tspiot/result/model/online/OnlineCodeCheck.java +++ b/src/main/java/ru/evotor/tspiot/result/model/online/OnlineCodeCheck.java @@ -14,26 +14,46 @@ public class OnlineCodeCheck extends BaseCodeCheck implements Parcelable { - /** Версия OnlineCodeCheck */ + /** + * Версия OnlineCodeCheck + */ private final static int VERSION = 1; - /** Дата и время истечения срока годности */ - @Nullable private final Date expireDate; + /** + * Дата и время истечения срока годности + */ + @Nullable + private final Date expireDate; - /** Дата производства продукции */ - @Nullable private final Date productionDate; + /** + * Дата производства продукции + */ + @Nullable + private final Date productionDate; - /** Переменный вес продукции (в граммах) */ - @Nullable private final Integer productWeight; + /** + * Переменный вес продукции (в граммах) + */ + @Nullable + private final Integer productWeight; - /** Производственный ветеринарный сопроводительный документ */ - @Nullable private final String prVetDocument; + /** + * Производственный ветеринарный сопроводительный документ + */ + @Nullable + private final String prVetDocument; - /** Признак, определяющий, что запрос направлен владельцем кода (определяется по аутентификационному токену) */ - @Nullable private final Boolean isOwner; + /** + * Признак, определяющий, что запрос направлен владельцем кода (определяется по аутентификационному токену) + */ + @Nullable + private final Boolean isOwner; - /** Сообщение об ошибке */ - @Nullable private final String message; + /** + * Сообщение об ошибке + */ + @Nullable + private final String message; /** * Код ошибки @@ -55,45 +75,80 @@ public class OnlineCodeCheck extends BaseCodeCheck implements Parcelable { * * */ - @Nullable private final Integer errorCode; + @Nullable + private final Integer errorCode; - /** Признак контроля прослеживаемости в товарной группе */ - private final boolean isTracking; + /** + * Признак контроля прослеживаемости в товарной группе + */ + @Nullable + private final Boolean isTracking; - /** Признак использования причин выбытия, разрешающих продажу КМ */ - @Nullable private final Integer eliminationState; + /** + * Признак использования причин выбытия, разрешающих продажу КМ + */ + @Nullable + private final Integer eliminationState; - /** Признак принадлежности табачной продукции к «серой зоне» */ - @Nullable private final Boolean grayZone; + /** + * Признак принадлежности табачной продукции к «серой зоне» + */ + @Nullable + private final Boolean grayZone; /** * Количество единиц товара в потребительской упаковке / Фактический объём / Фактический вес */ - @Nullable private final Integer innerUnitCount; + @Nullable + private final Integer innerUnitCount; - /** Счётчик проданного и возвращённого товара */ - @Nullable private final Integer soldUnitCount; + /** + * Счётчик проданного и возвращённого товара + */ + @Nullable + private final Integer soldUnitCount; - /** Тип упаковки */ + /** + * Тип упаковки + */ + @Nullable private final String packageType; - /** КИ агрегата */ - @Nullable private final String parent; + /** + * КИ агрегата + */ + @Nullable + private final String parent; - /** ИНН производителя */ - @Nullable private final String producerInn; + /** + * ИНН производителя + */ + @Nullable + private final String producerInn; - /** Номер производственной серии */ - @Nullable private final String productionSerialNumber; + /** + * Номер производственной серии + */ + @Nullable + private final String productionSerialNumber; - /** Номер производственной партии */ - @Nullable private final String productionBatchNumber; + /** + * Номер производственной партии + */ + @Nullable + private final String productionBatchNumber; - /** Заводской серийный номер */ - @Nullable private final String factorySerialNumber; + /** + * Заводской серийный номер + */ + @Nullable + private final String factorySerialNumber; - /** Ёмкость КИГУ */ - @Nullable private final Integer packageQuantity; + /** + * Ёмкость КИГУ + */ + @Nullable + private final Integer packageQuantity; private OnlineCodeCheck(Parcel parcel) { super(parcel); @@ -122,14 +177,14 @@ private OnlineCodeCheck(Parcel parcel) { public OnlineCodeCheck( String cis, - Boolean found, - Boolean valid, - String printView, + @Nullable Boolean found, + @Nullable Boolean valid, + @Nullable String printView, String gtin, - int[] groupIds, - Boolean verified, - Boolean realizable, - Boolean utilized, + @Nullable int[] groupIds, + @Nullable Boolean verified, + @Nullable Boolean realizable, + @Nullable Boolean utilized, @Nullable Date expireDate, @Nullable VariableExpirations variableExpirations, @Nullable Date productionDate, @@ -140,15 +195,15 @@ public OnlineCodeCheck( @Nullable String[] ogvs, @Nullable String message, @Nullable Integer errorCode, - Boolean isTracking, - Boolean sold, + @Nullable Boolean isTracking, + @Nullable Boolean sold, @Nullable Integer eliminationState, @Nullable Integer mrp, @Nullable Integer smp, @Nullable Boolean grayZone, @Nullable Integer innerUnitCount, @Nullable Integer soldUnitCount, - String packageType, + @Nullable String packageType, @Nullable String parent, @Nullable String producerInn, @Nullable String productionSerialNumber, @@ -196,62 +251,104 @@ public OnlineCodeCheck( } @Nullable - public Boolean getGrayZone() { return grayZone; } + public Boolean getGrayZone() { + return grayZone; + } @Nullable - public Boolean getOwner() { return isOwner; } + public Boolean getOwner() { + return isOwner; + } - public boolean isTracking() { return isTracking; } + @Nullable + public Boolean isTracking() { + return isTracking; + } @Nullable - public Date getExpireDate() { return expireDate; } + public Date getExpireDate() { + return expireDate; + } @Nullable - public Date getProductionDate() { return productionDate; } + public Date getProductionDate() { + return productionDate; + } @Nullable - public Integer getEliminationState() { return eliminationState; } + public Integer getEliminationState() { + return eliminationState; + } @Nullable - public Integer getErrorCode() { return errorCode; } + public Integer getErrorCode() { + return errorCode; + } @Nullable - public Integer getInnerUnitCount() { return innerUnitCount; } + public Integer getInnerUnitCount() { + return innerUnitCount; + } @Nullable - public Integer getPackageQuantity() { return packageQuantity; } + public Integer getPackageQuantity() { + return packageQuantity; + } @Nullable - public Integer getProductWeight() { return productWeight; } + public Integer getProductWeight() { + return productWeight; + } @Nullable - public Integer getSoldUnitCount() { return soldUnitCount; } + public Integer getSoldUnitCount() { + return soldUnitCount; + } @Nullable - public String getFactorySerialNumber() { return factorySerialNumber; } + public String getFactorySerialNumber() { + return factorySerialNumber; + } @Nullable - public String getMessage() { return message; } + public String getMessage() { + return message; + } - public String getPackageType() { return packageType; } + @Nullable + public String getPackageType() { + return packageType; + } @Nullable - public String getParent() { return parent; } + public String getParent() { + return parent; + } @Nullable - public String getProducerInn() { return producerInn; } + public String getProducerInn() { + return producerInn; + } @Nullable - public String getProductionBatchNumber() { return productionBatchNumber; } + public String getProductionBatchNumber() { + return productionBatchNumber; + } @Nullable - public String getProductionSerialNumber() { return productionSerialNumber; } + public String getProductionSerialNumber() { + return productionSerialNumber; + } @Nullable - public String getPrVetDocument() { return prVetDocument; } + public String getPrVetDocument() { + return prVetDocument; + } @Override - public int describeContents() { return 0; } + public int describeContents() { + return 0; + } @Override public void writeToParcel(Parcel parcel, int flags) { @@ -265,7 +362,7 @@ public void writeToParcel(Parcel parcel, int flags) { parcel.writeValue(isOwner); parcel.writeString(message); parcel.writeValue(errorCode); - parcel.writeInt(isTracking ? 1 : 0); + parcel.writeValue(isTracking); parcel.writeValue(eliminationState); parcel.writeValue(grayZone); parcel.writeValue(innerUnitCount); From 1c1b3cfaf4d16dd36f6d074008c4646e1ab288b3 Mon Sep 17 00:00:00 2001 From: Anna Balakireva Date: Wed, 27 May 2026 16:26:54 +0300 Subject: [PATCH 13/17] =?UTF-8?q?MRK-5213=20gtin=20=D1=82=D0=BE=D0=B6?= =?UTF-8?q?=D0=B5=20nullable=20=D1=81=20=D0=BD=D0=B5=D0=BA=D0=BE=D1=80?= =?UTF-8?q?=D1=80=D0=B5=D0=BA=D1=82=D0=BD=D1=8B=D0=BC=D0=B8=20=D0=BC=D0=B0?= =?UTF-8?q?=D1=80=D0=BA=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/evotor/tspiot/result/model/online/OnlineCodeCheck.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/evotor/tspiot/result/model/online/OnlineCodeCheck.java b/src/main/java/ru/evotor/tspiot/result/model/online/OnlineCodeCheck.java index 9b26f16fc3..a3bd2e9225 100644 --- a/src/main/java/ru/evotor/tspiot/result/model/online/OnlineCodeCheck.java +++ b/src/main/java/ru/evotor/tspiot/result/model/online/OnlineCodeCheck.java @@ -180,7 +180,7 @@ public OnlineCodeCheck( @Nullable Boolean found, @Nullable Boolean valid, @Nullable String printView, - String gtin, + @Nullable String gtin, @Nullable int[] groupIds, @Nullable Boolean verified, @Nullable Boolean realizable, From a93f99fe9ab02c342de766a1aaf09ff9a789fe9d Mon Sep 17 00:00:00 2001 From: "v.drebnev" Date: Thu, 4 Jun 2026 19:22:54 +0500 Subject: [PATCH 14/17] =?UTF-8?q?MRK-5213=20=D0=98=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D0=BB=D0=BE=D0=B3=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BE=D0=BB=D0=B5=D0=B9=20gro?= =?UTF-8?q?upIds=20=D0=B8=20printView=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81?= =?UTF-8?q?=D0=B0=20BaseCodeCheck.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/ru/evotor/tspiot/Utils.java | 22 +++++++++++++++++++ .../result/model/base/BaseCodeCheck.java | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/evotor/tspiot/Utils.java b/src/main/java/ru/evotor/tspiot/Utils.java index 452ae6904a..edcf42ca88 100644 --- a/src/main/java/ru/evotor/tspiot/Utils.java +++ b/src/main/java/ru/evotor/tspiot/Utils.java @@ -58,6 +58,28 @@ public static String toString(@Nullable Object object) { return object == null ? "null" : object.toString(); } + public static String toString(@Nullable int[] ints) { + if (ints == null) { + return "null"; + } else if (ints.length == 0) { + return "[]"; + } else { + StringBuilder sb = new StringBuilder(); + + sb.append("["); + for (int i = 0; i < ints.length; i++) { + sb.append(ints[i]); + + if (i != ints.length - 1) { + sb.append(", "); + } + } + sb.append("]"); + + return sb.toString(); + } + } + public static String toString(@Nullable Object[] objects) { if (objects == null) { return "null"; diff --git a/src/main/java/ru/evotor/tspiot/result/model/base/BaseCodeCheck.java b/src/main/java/ru/evotor/tspiot/result/model/base/BaseCodeCheck.java index 36bbcc4dbe..fb2052b4ee 100644 --- a/src/main/java/ru/evotor/tspiot/result/model/base/BaseCodeCheck.java +++ b/src/main/java/ru/evotor/tspiot/result/model/base/BaseCodeCheck.java @@ -256,7 +256,7 @@ public String toString() { return "Cis: " + Utils.toString(cis) + "\n" + "IsFound: " + Utils.toString(found) + "\n" + "IsValid: " + Utils.toString(valid) + "\n" + - "PrintView" + Utils.toString(printView) + "\n" + + "PrintView: " + Utils.toString(printView) + "\n" + "Gtin: " + Utils.toString(gtin) + "\n" + "GroupIds: " + Utils.toString(groupIds) + "\n" + "IsVerified: " + Utils.toString(verified) + "\n" + From c0e577092430bd1cc113c8042c533716a95a7835 Mon Sep 17 00:00:00 2001 From: "v.drebnev" Date: Tue, 9 Jun 2026 11:41:12 +0500 Subject: [PATCH 15/17] =?UTF-8?q?STDEV-25309=20=D0=94=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20toString=20=D0=B4=D0=BB=D1=8F=20=D0=BE?= =?UTF-8?q?=D1=88=D0=B8=D0=B1=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tspiot/exceptions/TsPioTErrorHolderException.java | 6 +++--- .../model/errors/CodeMessageErrorDescription.java | 11 +++++++++++ .../model/errors/CodesCheckErrorDescription.java | 10 ++++++++++ .../result/model/errors/MessageErrorDescription.java | 10 ++++++++++ 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/evotor/tspiot/exceptions/TsPioTErrorHolderException.java b/src/main/java/ru/evotor/tspiot/exceptions/TsPioTErrorHolderException.java index d19212b5bd..6f76af0da5 100644 --- a/src/main/java/ru/evotor/tspiot/exceptions/TsPioTErrorHolderException.java +++ b/src/main/java/ru/evotor/tspiot/exceptions/TsPioTErrorHolderException.java @@ -7,10 +7,10 @@ /** Исключение обёртка для передачи ошибок от драйвера ТС ПИоТ */ public class TsPioTErrorHolderException extends TsPioTServiceException { - public final TsPioTErrorsDescriptionWrapper errorDescription; + public final TsPioTErrorsDescriptionWrapper errorDescriptionWrapper; - public TsPioTErrorHolderException(TsPioTErrorsDescriptionWrapper errorDescription) { + public TsPioTErrorHolderException(TsPioTErrorsDescriptionWrapper errorDescriptionWrapper) { super(); - this.errorDescription = errorDescription; + this.errorDescriptionWrapper = errorDescriptionWrapper; } } diff --git a/src/main/java/ru/evotor/tspiot/result/model/errors/CodeMessageErrorDescription.java b/src/main/java/ru/evotor/tspiot/result/model/errors/CodeMessageErrorDescription.java index 74cdda37ce..b3d8ab9aed 100644 --- a/src/main/java/ru/evotor/tspiot/result/model/errors/CodeMessageErrorDescription.java +++ b/src/main/java/ru/evotor/tspiot/result/model/errors/CodeMessageErrorDescription.java @@ -1,6 +1,10 @@ package ru.evotor.tspiot.result.model.errors; import android.os.Parcel; + +import androidx.annotation.NonNull; + +import ru.evotor.tspiot.Utils; import ru.evotor.tspiot.result.model.base.ErrorDescription; public class CodeMessageErrorDescription implements ErrorDescription { @@ -39,6 +43,13 @@ public void writeToParcel(Parcel parcel, int i) { parcel.writeString(message); } + @NonNull + @Override + public String toString() { + return "ErrorCode: " + Utils.toString(errorCode) + "\n" + + "Message: " + Utils.toString(message) + "\n"; + } + public static final Creator CREATOR = new Creator<>() { @Override public CodeMessageErrorDescription createFromParcel(Parcel parcel) { diff --git a/src/main/java/ru/evotor/tspiot/result/model/errors/CodesCheckErrorDescription.java b/src/main/java/ru/evotor/tspiot/result/model/errors/CodesCheckErrorDescription.java index ee89f8bd3b..9f65924237 100644 --- a/src/main/java/ru/evotor/tspiot/result/model/errors/CodesCheckErrorDescription.java +++ b/src/main/java/ru/evotor/tspiot/result/model/errors/CodesCheckErrorDescription.java @@ -2,6 +2,9 @@ import android.os.Parcel; import androidx.annotation.Nullable; + +import org.jetbrains.annotations.NotNull; + import ru.evotor.tspiot.Utils; import ru.evotor.tspiot.result.model.base.ErrorDescription; @@ -53,6 +56,13 @@ public void writeToParcel(Parcel parcel, int flags) { parcel.writeParcelable(offlineError, flags); } + @NotNull + @Override + public String toString() { + return "OnlineError:\n" + Utils.toString(onlineError) + "\n" + + "OfflineError:\n" + Utils.toString(offlineError) + "\n"; + } + public static final Creator CREATOR = new Creator<>() { @Override public CodesCheckErrorDescription createFromParcel(Parcel parcel) { diff --git a/src/main/java/ru/evotor/tspiot/result/model/errors/MessageErrorDescription.java b/src/main/java/ru/evotor/tspiot/result/model/errors/MessageErrorDescription.java index 4ef10bff66..b91b65619d 100644 --- a/src/main/java/ru/evotor/tspiot/result/model/errors/MessageErrorDescription.java +++ b/src/main/java/ru/evotor/tspiot/result/model/errors/MessageErrorDescription.java @@ -1,6 +1,10 @@ package ru.evotor.tspiot.result.model.errors; import android.os.Parcel; + +import org.jetbrains.annotations.NotNull; + +import ru.evotor.tspiot.Utils; import ru.evotor.tspiot.result.model.base.ErrorDescription; public class MessageErrorDescription implements ErrorDescription { @@ -31,6 +35,12 @@ public void writeToParcel(Parcel parcel, int i) { parcel.writeString(message); } + @NotNull + @Override + public String toString() { + return "Message: " + Utils.toString(message) + "\n"; + } + public static final Creator CREATOR = new Creator() { @Override public MessageErrorDescription createFromParcel(Parcel parcel) { From efae7572439e64ffc238b5dccd3e027414c7efc9 Mon Sep 17 00:00:00 2001 From: "v.drebnev" Date: Tue, 9 Jun 2026 15:21:10 +0500 Subject: [PATCH 16/17] =?UTF-8?q?STDEV-25310=20=D0=9F=D0=BE=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BF=D0=BE=D0=BB=D0=B5=20cis=20?= =?UTF-8?q?=D0=B2=20MarkingCode.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/ru/evotor/tspiot/model/MarkingCode.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/evotor/tspiot/model/MarkingCode.java b/src/main/java/ru/evotor/tspiot/model/MarkingCode.java index 018e1533db..88bbd82222 100644 --- a/src/main/java/ru/evotor/tspiot/model/MarkingCode.java +++ b/src/main/java/ru/evotor/tspiot/model/MarkingCode.java @@ -3,6 +3,8 @@ import android.os.Parcel; import android.os.Parcelable; import androidx.annotation.Nullable; +import org.jetbrains.annotations.NotNull; +import java.util.Objects; import ru.evotor.tspiot.Utils; public class MarkingCode implements Parcelable { @@ -11,22 +13,23 @@ public class MarkingCode implements Parcelable { private static final int VERSION = 1; /** Код маркировки */ - private final String cis; + @NotNull private final String cis; /** Опциональный параметр идентификатора товарной группы */ @Nullable private final Integer productType; - public MarkingCode(String cis, @Nullable Integer productType) { + public MarkingCode(@NotNull String cis, @Nullable Integer productType) { this.cis = cis; this.productType = productType; } private MarkingCode(Parcel parcel) { int version = parcel.readInt(); - this.cis = parcel.readString(); + this.cis = Objects.requireNonNull(parcel.readString()); this.productType = Utils.readInteger(parcel); } + @NotNull public String getCis() { return cis; } @Nullable From 69882cff278827d63e41acf96ef8a191245fb958 Mon Sep 17 00:00:00 2001 From: "v.drebnev" Date: Tue, 9 Jun 2026 15:52:41 +0500 Subject: [PATCH 17/17] =?UTF-8?q?STDEV-25315=20=D0=A3=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=BB=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20isOffline=20=D0=B8?= =?UTF-8?q?=D0=B7=20CodesCheckResult.java=20=D0=B7=D0=B0=20=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=D0=B4=D0=BE=D0=B1=D0=BD=D0=BE=D1=81=D1=82=D1=8C?= =?UTF-8?q?=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ru/evotor/tspiot/result/model/CodesCheckResult.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/ru/evotor/tspiot/result/model/CodesCheckResult.java b/src/main/java/ru/evotor/tspiot/result/model/CodesCheckResult.java index 1742d6a8ec..900589fbcc 100644 --- a/src/main/java/ru/evotor/tspiot/result/model/CodesCheckResult.java +++ b/src/main/java/ru/evotor/tspiot/result/model/CodesCheckResult.java @@ -33,8 +33,6 @@ public CodesCheckResult(@Nullable List onlineCodesChecks, @Nul @Nullable public List getOfflineCodesChecks() { return offlineCodesChecks; } - public boolean isOffline() { return offlineCodesChecks != null && !offlineCodesChecks.isEmpty(); } - @Override public int describeContents() { return 0; }