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..c8afd6662f --- /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; + + /** + * Код ошибки + * + */ + @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.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 = 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.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.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.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.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.writeInt(isTracking ? 1 : 0); + parcel.writeInt(sold ? 1 : 0); + 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..ae9d428588 --- /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.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(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/integrations/result/CodesCheckResult.java b/src/main/java/ru/evotor/integrations/result/CodesCheckResult.java new file mode 100644 index 0000000000..6129755102 --- /dev/null +++ b/src/main/java/ru/evotor/integrations/result/CodesCheckResult.java @@ -0,0 +1,41 @@ +package ru.evotor.integrations.result; + +import android.os.Parcel; +import android.os.Parcelable; + +import java.util.List; + +public class CodesCheckResult implements Parcelable { + + private final List codesChecks; + + private CodesCheckResult(Parcel parcel) { + 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.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/integrations/result/IntegrationError.java b/src/main/java/ru/evotor/integrations/result/IntegrationError.java new file mode 100644 index 0000000000..e030fe8ac4 --- /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[i]; + } + }; +} 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..6fc8a9cf8b --- /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[i]; + } + }; +} 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..02b977c16e --- /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[i]; + } + }; +} 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..2b490b5284 --- /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[i]; + } + }; +}