diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml index 6d0ee1c2..5815a4a6 100644 --- a/.idea/kotlinc.xml +++ b/.idea/kotlinc.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 49029d75..d32fcd14 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -40,6 +40,16 @@ + + + @style/AppTheme + + + + + @style/AppTheme + + @style/AppTheme @@ -55,6 +65,11 @@ @style/AppTheme + + + @style/AppTheme + + @style/AppTheme @@ -75,11 +90,21 @@ @style/AppTheme + + + @style/AppTheme + + @style/AppTheme + + + @style/AppTheme + + @style/AppTheme @@ -90,6 +115,16 @@ @style/AppTheme + + + @style/AppTheme + + + + + @style/AppTheme + + @style/AppTheme @@ -125,6 +160,11 @@ @style/AppTheme + + + @style/AppTheme + + @style/AppTheme @@ -155,6 +195,11 @@ @style/AppTheme + + + @style/AppTheme + + @style/AppTheme @@ -170,6 +215,11 @@ @style/AppTheme + + + @style/AppTheme + + @style/AppTheme @@ -195,11 +245,21 @@ @style/AppTheme + + + @style/AppTheme + + @style/AppTheme + + + @style/AppTheme + + @style/AppTheme @@ -220,6 +280,16 @@ @style/AppTheme + + + @style/AppTheme + + + + + @style/AppTheme + + @style/AppTheme @@ -230,6 +300,11 @@ @style/AppTheme + + + @style/AppTheme + + Landscape @@ -286,6 +361,11 @@ @style/AppTheme + + + @style/AppTheme + + @style/AppTheme @@ -296,6 +376,11 @@ @style/AppTheme + + + @style/AppTheme + + @style/AppTheme @@ -321,16 +406,36 @@ @style/AppTheme + + + @style/AppTheme + + @style/AppTheme + + + @style/AppTheme + + @style/AppTheme + + + @style/AppTheme + + + + + @style/AppTheme + + @@ -373,103 +478,40 @@ - + + + - + - - + + + + + - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - + + + - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - + - { + "keyToString": { + "Android App.app.executor": "Run", + "ApkExportedModule": "Gestor_Almacén.app", + "DEBUGGABLE_DEVICE": "zebra_technologies-tc21-21114523025303", + "DEBUGGABLE_PROCESS": "es.verdnatura.sfusion", + "DEBUGGER_ID": "Auto", + "ExportApk.ApkPathForGestor_Almacén.app": "C:\\Users\\sergiodt\\AndroidStudioProjects\\vn-warehouseManager\\app", + "Gradle.vn-warehouseManager [clean].executor": "Run", + "Gradle.vn-warehouseManager.executor": "Run", + "KotlinFunctionFindUsagesOptions.isSearchForTextOccurrences": "true", + "PROJECT_TRUSTED_KEY": "true", + "RunOnceActivity.OpenProjectViewOnStart": "true", + "RunOnceActivity.ShowReadmeOnStart": "true", + "RunOnceActivity.cidr.known.project.marker": "true", + "RunOnceActivity.readMode.enableVisualFormatting": "true", + "SHARE_PROJECT_CONFIGURATION_FILES": "true", + "SHOW_ALL_PROCESSES": "false", + "ScreenRecorder.SavePath": "C:\\Users\\sergiodt", + "android-custom-viewC:/Users/sergiodt/.gradle/caches/modules-2/files-2.1/androidx.recyclerview/recyclerview/1.2.1/f0f93e67af3f7417bdd560d5142f6dec4fe629c3/recyclerview-1.2.1-sources.jar!/androidx/recyclerview/widget/RecyclerView.java_SELECTED": "RecyclerView", + "android-custom-viewC:/Users/sergiodt/AppData/Local/Android/Sdk/sources/android-29/android/widget/TextView.java_SELECTED": "TextView", + "android-custom-viewC:/Users/sergiodt/AppData/Local/Android/Sdk/sources/android-33/android/view/View.java_SELECTED": "View", + "android-custom-viewC:/Users/sergiodt/AppData/Local/Android/Sdk/sources/android-34/android/view/View.java_SELECTED": "View", + "android-custom-viewC:/Users/sergiodt/AppData/Local/Android/Sdk/sources/android-34/android/widget/CompoundButton.java_SELECTED": "CompoundButton", + "android-custom-viewC:/Users/sergiodt/AppData/Local/Android/Sdk/sources/android-34/android/widget/TextView.java_SELECTED": "TextView", + "cf.first.check.clang-format": "false", + "cidr.known.project.marker": "true", + "com.developerphil.adbidea.selecteddevices": "G65TY9DQN7X4BIE6", + "com.google.services.firebase.aqiPopupShown": "true", + "git-widget-placeholder": "dev__6078", + "ignore.virus.scanning.warn.message": "true", + "kotlin-language-version-configured": "true", + "last_directory_selection": "C:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app/src/main/res/drawable", + "last_opened_file_path": "C:/Users/sergiodt/AndroidStudioProjects/vn-warehouseManager/app", + "project.structure.last.edited": "Project", + "project.structure.proportion": "0.17", + "project.structure.side.proportion": "0.2", + "rearrange.code.on.save": "true", + "run.code.analysis.last.selected.profile": "pProject Default", + "settings.editor.selected.configurable": "preferences.pluginManager" }, - "keyToStringList": { - "ExportApk.BuildVariants": [ - "betaRelease" + "keyToStringList": { + "ExportApk.BuildVariants": [ + "generalRelease" ], - "com.android.tools.idea.sqlite.queryhistory": [ - "select * from expedition where routeFk=182933;", - "select * from expedition;", - "select * from expeditionPending;", - "select * from expedition where id = 7753995;\n\n", - "\nselect * from expedition where id = 7753995;" + "com.android.tools.idea.sqlite.queryhistory": [ + "select * from expedition where routeFk=182933;", + "select * from expedition;", + "select * from expeditionPending;", + "select * from expedition where id = 7753995;\n\n", + "\nselect * from expedition where id = 7753995;" ], - "kotlin-gradle-user-dirs": [ - "C:\\Users\\sergiodt\\.gradle" + "kotlin-gradle-user-dirs": [ + "C:\\Users\\sergiodt\\.gradle" ] } -}]]> +} + - + - @@ -720,11 +762,11 @@ + + + - - - @@ -873,6 +915,13 @@ + + + C:\Users\sergiodt\AppData\Roaming\Subversion @@ -1228,7 +1277,7 @@ @@ -1356,22 +1405,6 @@ file://$PROJECT_DIR$/app/src/main/java/es/verdnatura/domain/SalixCallback.kt - 72 - + 76 + file://$PROJECT_DIR$/app/src/main/java/es/verdnatura/domain/SalixCallback.kt - 82 + 86 file://$PROJECT_DIR$/app/src/main/java/es/verdnatura/domain/SalixCallback.kt - 81 + 85 file://$PROJECT_DIR$/app/src/main/java/es/verdnatura/domain/SalixCallback.kt - 83 + 87 diff --git a/app/build.gradle b/app/build.gradle deleted file mode 100644 index 37c34a2d..00000000 --- a/app/build.gradle +++ /dev/null @@ -1,169 +0,0 @@ -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply plugin: 'kotlin-kapt' -apply plugin: 'com.google.gms.google-services' -apply plugin: 'com.google.firebase.crashlytics' -apply plugin: 'com.google.devtools.ksp' - - -android { - namespace = "es.verdnatura" - compileSdk 34 - defaultConfig { - applicationId "es.verdnatura" - minSdkVersion 26 - targetSdkVersion 33 // se deja con target si no Play Protect la bloquea - versionCode 330 - versionName = "24.38" - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - buildTypes { - release { - /*debuggable false - shrinkResources true - minifyEnabled true*/ - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - - //package de la app general = "package_name": "es.verdnatura" - //package de la app beta = "package_name": "es.verdnatura.sfusion" - - applicationVariants.all { variant -> - variant.outputs.all { output -> - def flavorName = variant.productFlavors[0].name - def apkName - - if (flavorName == "beta") { - apkName = "vn-pickingBeta.apk" - } else if (flavorName == "general") { - apkName = "vn-picking.apk" - } else { - apkName = "vn-picking.apk" - } - - output.outputFileName = apkName - } - } - } - - flavorDimensions += "version" - productFlavors { - create("beta") { - applicationIdSuffix = ".sfusion" - } - create("general") { - //versionNameSuffix = "General" - } - } - - buildFeatures { - viewBinding = true - - } - /*kotlinOptions { - jvmTarget = "1.8" - } - buildFeatures { - compose = true - } - kotlin { - jvmToolchain(8) - } - composeOptions { - kotlinCompilerExtensionVersion = "1.4.3" - } - */ - dataBinding { - enabled = true - } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 - } - -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'com.google.firebase:firebase-crashlytics-ktx:19.0.3' - implementation 'com.google.firebase:firebase-analytics-ktx:22.0.2' - implementation 'com.google.android.gms:play-services-location:21.3.0' - implementation 'androidx.navigation:navigation-fragment-ktx:2.7.7' - implementation 'androidx.navigation:navigation-ui-ktx:2.7.7' - implementation 'androidx.core:core-ktx:1.13.1' - kapt "androidx.room:room-compiler:2.6.1" - implementation 'androidx.room:room-ktx:2.6.1' - debugImplementation fileTree(dir: 'libs/debug', include: ['*.jar']) - releaseImplementation fileTree(dir: 'libs/release', include: ['*.jar']) - - //canvas - implementation 'com.simplify:ink:1.0.0' - - // Kotlin and Android - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'androidx.appcompat:appcompat:1.7.0' - implementation 'androidx.core:core-ktx:1.13.1' - implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - implementation 'androidx.legacy:legacy-support-v4:1.0.0' - implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' - -//tests - testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test.ext:junit:1.2.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1' - implementation 'com.google.android.material:material:1.12.0' - implementation 'com.squareup.retrofit2:retrofit:2.3.0' - implementation 'com.squareup.retrofit2:converter-gson:2.0.2' - implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' - implementation "com.airbnb.android:lottie:$lottieVersion" - implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' - - //Fragments - implementation("androidx.fragment:fragment-ktx:1.8.2") - - // Architecture components - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4" - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.8.4" - implementation "androidx.legacy:legacy-support-v4:1.0.0" - - //Koin new resolve - implementation "io.insert-koin:koin-core:$koin" - implementation "io.insert-koin:koin-android:$koin" - implementation "io.insert-koin:koin-androidx-scope:$koin" - implementation "io.insert-koin:koin-androidx-viewmodel:$koin" - - // Image libraries - implementation "io.coil-kt:coil:$coil" - implementation "com.github.bumptech.glide:glide:$glide" - implementation "com.github.bumptech.glide:okhttp3-integration:$glide" - //kapt "com.github.bumptech.glide:compiler:$glide" - ksp("com.github.bumptech.glide:ksp:$glide") - - // Add the Firebase Crashlytics SDK. - implementation 'com.google.firebase:firebase-analytics:22.0.2' - - //search - implementation 'com.github.mirrajabi:search-dialog:1.1' - - //logs - implementation 'com.jakewharton.timber:timber:4.7.1' - - //pickerImage - implementation 'com.github.esafirm:android-image-picker:3.0.0-beta5' - - //preferences - implementation("androidx.datastore:datastore-preferences:1.1.1") - implementation 'androidx.datastore:datastore-core:1.1.1' - - - // Compose - /* implementation(platform("androidx.compose:compose-bom:2024.02.01")) - implementation("androidx.compose.ui:ui") - implementation("androidx.compose.material:material") - implementation("androidx.compose.runtime:runtime") - implementation("androidx.activity:activity-compose:1.8.2") - implementation("androidx.compose.ui:ui-graphics") - implementation("androidx.compose.ui:ui-tooling-preview")*/ -} diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 00000000..97becf18 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,143 @@ +plugins { + id("com.android.application") + id("kotlin-android") + id("kotlin-kapt") + id("com.google.gms.google-services") + id("com.google.firebase.crashlytics") + id("com.google.devtools.ksp") +} + +android { + namespace = "es.verdnatura" + compileSdk = 35 + + defaultConfig { + applicationId = "es.verdnatura" + minSdk = 26 + targetSdk = 33 // se deja con target si no Play Protect la bloquea + versionCode = 358 + versionName = "24.46" + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + + buildTypes { + getByName("release") { + //debuggable = false + //shrinkResources = true + //minifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" + ) + } + } + //package de la app general = "package_name": "es.verdnatura" + //package de la app beta = "package_name": "es.verdnatura.sfusion" + + applicationVariants.all { variant -> + variant.outputs.all { output -> + val flavorName = variant.productFlavors[0].name + val buildTypeName = variant.buildType.name + + val apkName = when (flavorName) { + "beta" -> "vn-pickingBeta-${buildTypeName}.apk" + else -> "vn-picking-${buildTypeName}.apk" + } + output.outputFile.renameTo(File(output.outputFile.parentFile, apkName)) + true + } + + } + flavorDimensions += "version" + productFlavors { + create("beta") { + applicationIdSuffix = ".sfusion" + } + create("general") {} + } + + buildFeatures { + viewBinding = true + //compose = true + + /*kotlinOptions { + jvmTarget = "1.8" + } + buildFeatures { + compose = true + } + + composeOptions { + kotlinCompilerExtensionVersion = "1.4.3" + } + */ + dataBinding = true + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + /* composeOptions { + kotlinCompilerExtensionVersion = "1.5.15" + }*/ + /* kotlin { + jvmToolchain(17) + } + kotlinOptions { + jvmTarget = "17" + }*/ + + dependencies { + implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) + implementation(libs.firebase.crashlytics.ktx) + implementation(libs.firebase.analytics.ktx) + implementation(libs.play.services.location) + implementation(libs.navigation.fragment.ktx) + implementation(libs.androidx.navigation.ui.ktx) + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.recyclerview) + implementation(libs.androidx.room.ktx) + kapt(libs.androidx.room.compiler) + implementation(libs.ink) + implementation(libs.kotlin.stdlib.jdk7) + implementation(libs.androidx.appcompat) + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.constraintlayout) + implementation(libs.androidx.legacy.support.v4) + implementation(libs.androidx.lifecycle.extensions) + implementation(libs.material) + implementation(libs.retrofit) + implementation(libs.converter.gson) + implementation(libs.converter.scalars) + implementation(libs.lottie) + implementation(libs.androidx.swiperefreshlayout) + implementation(libs.androidx.fragment.ktx) + implementation(libs.androidx.lifecycle.viewmodel.ktx) + implementation(libs.androidx.lifecycle.livedata.ktx) + implementation(libs.androidx.legacy.support.v4) + implementation(libs.koin.core) + implementation(libs.koin.android) + implementation(libs.koin.androidx.scope) + implementation(libs.koin.androidx.viewmodel) + implementation(libs.glide) + implementation(libs.okhttp3.integration) + ksp(libs.glide.ksp) + implementation(libs.firebase.analytics) + implementation(libs.android.image.picker) + implementation(libs.androidx.datastore.preferences) + implementation(libs.androidx.datastore.core) + implementation(libs.zxing.android.embedded) { isTransitive = false } + implementation(libs.core) + + // Compose + //implementation(libs.androidx.compose.bom) + /* implementation("androidx.compose.ui:ui") + implementation("androidx.compose.material:material") + implementation("androidx.compose.runtime:runtime") + implementation("androidx.activity:activity-compose:1.8.2") + implementation("androidx.compose.ui:ui-graphics") + implementation("androidx.compose.ui:ui-tooling-preview") */ + } +} + diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 39cb9403..58f2fc33 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,6 +1,6 @@ # Add project specific ProGuard rules here. # You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. +# proguardFiles setting in build.gradle.kts. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html diff --git a/app/src/main/java/es/verdnatura/MobileApplication.kt b/app/src/main/java/es/verdnatura/MobileApplication.kt index 8b81fa96..fbe56783 100644 --- a/app/src/main/java/es/verdnatura/MobileApplication.kt +++ b/app/src/main/java/es/verdnatura/MobileApplication.kt @@ -44,7 +44,6 @@ class MobileApplication : Application(), InteceptorListener { signListener = listener } - // lateinit var silex: VerdnaturaService lateinit var salix: SalixService var userId: Int? = null var userName: String? = null diff --git a/app/src/main/java/es/verdnatura/dataStore/DataStoreLocal.kt b/app/src/main/java/es/verdnatura/dataStore/DataStoreLocal.kt index 45ef7c9c..1077b911 100644 --- a/app/src/main/java/es/verdnatura/dataStore/DataStoreLocal.kt +++ b/app/src/main/java/es/verdnatura/dataStore/DataStoreLocal.kt @@ -124,7 +124,7 @@ class DataStoreLocal(var mobileApplication: MobileApplication) { SECTORFKDEFAULT } ) - + if (operator.sector?.isOnReservationMode != null) { editDataStoreKey( SECTORISONRESERVATIONMODE, @@ -178,7 +178,10 @@ class DataStoreLocal(var mobileApplication: MobileApplication) { editDataStoreKey( RESERVATIONMODE, operator.isOnReservationMode ) - + editDataStoreKey( + ITEMPACKING, + operator.itemPackingTypeFk + ) } suspend fun isPreferenceExists(key: String): Boolean { diff --git a/app/src/main/java/es/verdnatura/db/database.kt b/app/src/main/java/es/verdnatura/db/database.kt index 5de0a7be..54fc4f0b 100644 --- a/app/src/main/java/es/verdnatura/db/database.kt +++ b/app/src/main/java/es/verdnatura/db/database.kt @@ -1,7 +1,16 @@ package es.verdnatura.db import android.content.Context -import androidx.room.* +import androidx.room.Dao +import androidx.room.Database +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import androidx.room.Room +import androidx.room.RoomDatabase +import androidx.room.TypeConverter +import androidx.room.TypeConverters import com.google.gson.Gson import com.google.gson.reflect.TypeToken import es.verdnatura.presentation.view.feature.delivery.model.ClientTicketSalix @@ -68,6 +77,9 @@ interface ExpedicionDao { @Query("DELETE FROM expeditionPending WHERE code = :codeState") suspend fun getDeleteByState(codeState: String) + + @Query("DELETE FROM expeditionPending") + suspend fun getDeleteAllState() } @Dao diff --git a/app/src/main/java/es/verdnatura/domain/Extensions.kt b/app/src/main/java/es/verdnatura/domain/Extensions.kt index 98f784dd..9e739a20 100644 --- a/app/src/main/java/es/verdnatura/domain/Extensions.kt +++ b/app/src/main/java/es/verdnatura/domain/Extensions.kt @@ -2,11 +2,16 @@ package es.verdnatura.domain import android.content.Context import android.graphics.Color +import android.graphics.drawable.GradientDrawable import android.os.Build import android.text.Html +import android.view.Gravity +import android.view.LayoutInflater import android.widget.EditText +import android.widget.TextView import android.widget.Toast import androidx.annotation.RequiresApi +import es.verdnatura.R import java.text.SimpleDateFormat import java.time.ZonedDateTime import java.time.format.DateTimeFormatter @@ -14,7 +19,15 @@ import java.util.Date import java.util.Locale fun List.formatWithQuotes(): String { - return "[" + joinToString(", ") { if (it is String) "\"$it\"" else it.toString() } + "]" + return "[" + joinToString(", ") { + when { + it is String && (it.trim().startsWith("{") && it.trim() + .endsWith("}")) -> "\"$it\"" + + it is String -> "\"$it\"" + else -> it.toString() + } + } + "]" } @RequiresApi(Build.VERSION_CODES.N) @@ -33,6 +46,28 @@ fun Any.toast( return toast.apply { show() } } +fun Context.showToastCenterWithBackground(textToShow: String) { + val inflater = LayoutInflater.from(this) + val layout = inflater.inflate(R.layout.ticket_toast_layout, null) + val text = layout.findViewById(R.id.toast_text) + text.text = "$textToShow" + text.setTextColor(this.getColor(R.color.verdnatura_orange_salix)) + text.textSize = 18f + + val background = GradientDrawable().apply { + setColor(Color.parseColor("#000000")) + cornerRadius = 16f + } + layout.background = background + + Toast(this).apply { + duration = Toast.LENGTH_LONG + view = layout + setGravity(Gravity.CENTER, 0, 0) + show() + } +} + fun T?.notNull(f: (it: T) -> Unit) { if (this != null) f(this) } @@ -45,6 +80,7 @@ fun String.isParking(): Boolean { val regex = Regex("^[^ ]+-[^ ]+$") return this.length > 4 && regex.matches(this) } + fun String.isShelving(): Boolean { val regex = Regex("\\S{0,4}") return regex.matches(this) diff --git a/app/src/main/java/es/verdnatura/domain/SalixService.kt b/app/src/main/java/es/verdnatura/domain/SalixService.kt index b8652197..dda92e6d 100644 --- a/app/src/main/java/es/verdnatura/domain/SalixService.kt +++ b/app/src/main/java/es/verdnatura/domain/SalixService.kt @@ -5,6 +5,7 @@ import es.verdnatura.presentation.common.ExpeditionPrintOut import es.verdnatura.presentation.common.ItemBarCodeSalix import es.verdnatura.presentation.common.ItemShelving import es.verdnatura.presentation.common.PackingSiteSalix +import es.verdnatura.presentation.common.PickupResponse import es.verdnatura.presentation.common.SaleTrackingSalix import es.verdnatura.presentation.common.TicketState import es.verdnatura.presentation.view.feature.ajustes.model.Printers @@ -25,6 +26,10 @@ import es.verdnatura.presentation.view.feature.delivery.model.DeliveryInfo import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionInfoLoadUnload import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionInfoLog import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionInfoSummary +import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionWithTicket +import es.verdnatura.presentation.view.feature.delivery.model.RouteAction +import es.verdnatura.presentation.view.feature.delivery.model.RouteComplement +import es.verdnatura.presentation.view.feature.delivery.model.RouteComplementAdd import es.verdnatura.presentation.view.feature.delivery.model.RouteDelivery import es.verdnatura.presentation.view.feature.delivery.model.RouteInfo import es.verdnatura.presentation.view.feature.delivery.model.TicketObservation @@ -69,7 +74,6 @@ import es.verdnatura.presentation.view.feature.sacador.model.TicketStateSalix import es.verdnatura.presentation.view.feature.ubicador.model.ItemBuy import es.verdnatura.presentation.view.feature.ubicador.model.ItemShelvingNewer import es.verdnatura.presentation.view.feature.ubicador.model.ItemUbicador -import es.verdnatura.presentation.view.feature.ubicador.model.ItemUbicadorVO import es.verdnatura.presentation.view.feature.workermistake.model.DepartmentMistake import es.verdnatura.presentation.view.feature.workermistake.model.ExpeditionMistakeSalix import es.verdnatura.presentation.view.feature.workermistake.model.MistakeType @@ -140,6 +144,11 @@ interface SalixService { @Query("filter") filter: String ): Call> + @POST("Applications/buy_getUltimate/execute-func") + fun buyUltimate( + @Query("params") params: Any, @Query("schema") schema: String = "vn" + ): Call + @GET("Buyers") fun getBuyers( @Query("filter") filter: String @@ -181,10 +190,22 @@ interface SalixService { fun getRoutes( ): Call> - @GET("Workers/findOne") + @POST("Expeditions/moveExpeditions") + fun moveExpeditions( + @Query("clientId") clientId: Number, + @Query("warehouseId") warehouseId: Number, + @Query("addressId") addressId: Number, + @Query("agencyModeId") agencyModeId: Number, + @Query("routeId") routeId: Number, + @Query("expeditionIds") expeditionIds: ArrayList, + @Query("landed") landed: String + + ): Call + + @GET("Workers/Summary") fun getNameWorker( @Query("filter") filter: String - ): Call + ): Call> @POST("Applications/{routine}/execute-proc") fun executeProc( @@ -440,6 +461,12 @@ interface SalixService { @Query("barcode") barcode: Number, @Query("warehouseFk") warehouseFk: Int ): Call + @POST("Applications/report_print/execute-proc") + fun printItem( + @Query("params") params: Any? = null, + @Query("schema") schema: String = "vn" + ): Call + @POST("Applications/itemPlacementSupplyAiming/execute-proc") fun itemPlacementSupplyAiming( @Query("params") params: Any? = null, @Query("schema") schema: String = "vn" @@ -515,10 +542,10 @@ interface SalixService { @Query("params") params: Any? = null, @Query("schema") schema: String = "vn" ): Call - @POST("Applications/machine_getWorkerPlate/execute-proc") - fun machineGetWorkerPlate( - @Query("params") params: Any? = null, @Query("schema") schema: String = "vn" - ): Call> + /* @POST("Applications/machine_getWorkerPlate/execute-proc") + fun machineGetWorkerPlate( + @Query("params") params: Any? = null, @Query("schema") schema: String = "vn" + ): Call>*/ @POST("Applications/sectorCollection_get/execute-proc") fun sectorCollectionGet( @@ -540,9 +567,34 @@ interface SalixService { @Query("params") params: Any, @Query("schema") schema: String = "vn" ): Call> + @GET("RouteActions") + fun getRouteAction( + @Query("filter") filter: Any = """{"fields": {"id": true,"name": true,"price":true},"order": "name"}""" + ): Call> + + @GET("Expeditions") + fun getDataFromExpedition( + @Query("filter") filter: Any, + ): Call> + + @POST("RouteComplements") + fun addRouteComplements( + @Body params: RouteComplementAdd + ): Call + + @GET("RouteComplements") + fun getRouteComplements( + @Query("filter") filter: Any + ): Call> + + @DELETE("RouteComplements/{id}") + fun routeComplementDelete( + @Path("id") id: Number + ): Call + @POST("Applications/sectorCollection_new/execute-proc") fun sectorCollectionNew( - @Query("params") params: Any, @Query("schema") schema: String = "vn" + @Query("params") filter: Any, @Query("schema") schema: String = "vn" ): Call @POST("Applications/ticketStateToday_setState/execute-proc") @@ -560,6 +612,11 @@ interface SalixService { @Query("filter") filter: Any, @Query("schema") schema: String = "vn" ): Call> + @GET("Tickets") + fun ticketIsPickup( + @Query("filter") filter: Any, @Query("schema") schema: String = "vn" + ): Call> + @POST("Applications/workerMachinery_isRegistered/execute-func") fun workerMachineryIsRegistered( @Query("params") params: Any, @Query("schema") schema: String = "vn" @@ -643,18 +700,17 @@ interface SalixService { @Query("params") params: Any, ): Call> - @POST("Applications/itemShelving_get/execute-proc") - fun itemShelvingList( - @Query("schema") schema: String = "vn", - @Query("params") params: Any, - ): Call> - @POST("Applications/itemShelving_get/execute-proc") fun itemShelvingListNew( @Query("schema") schema: String = "vn", @Query("params") params: Any, ): Call> + @GET("Shelvings") + fun itemShelvingGet( + @Query("filter") filter: Any, + ): Call> + @POST("Applications/expedition_scan/execute-proc") fun expeditionScan( @Query("schema") schema: String = "srt", diff --git a/app/src/main/java/es/verdnatura/domain/userCases/UserCases.kt b/app/src/main/java/es/verdnatura/domain/userCases/UserCases.kt index c3494307..8215f29c 100644 --- a/app/src/main/java/es/verdnatura/domain/userCases/UserCases.kt +++ b/app/src/main/java/es/verdnatura/domain/userCases/UserCases.kt @@ -1,12 +1,20 @@ package es.verdnatura.domain.userCases - import es.verdnatura.domain.SalixService import retrofit2.Call - class GetItemFromBarcodeUseCase(private val salixService: SalixService) { fun execute(barcode: String): Call { return salixService.barcodesToItem(barcode) } } + +class GetItemPrintItemUseCase(private val salixService: SalixService) { + fun execute(params: Any?): Call { + return salixService.printItem(params) + } + + fun executeBuyUltimate(params: Any): Call { + return salixService.buyUltimate(params) + } +} diff --git a/app/src/main/java/es/verdnatura/presentation/base/BaseActivity.kt b/app/src/main/java/es/verdnatura/presentation/base/BaseActivity.kt index 7357c0a0..2ec9bf35 100644 --- a/app/src/main/java/es/verdnatura/presentation/base/BaseActivity.kt +++ b/app/src/main/java/es/verdnatura/presentation/base/BaseActivity.kt @@ -18,7 +18,7 @@ import com.google.android.gms.location.LocationCallback import com.google.android.gms.location.LocationResult import com.google.android.gms.location.Priority import es.verdnatura.MobileApplication -import timber.log.Timber.d +import es.verdnatura.domain.toast interface LocationUpdateCallback { fun onLocationReceived(location: LocationResult) @@ -36,7 +36,7 @@ abstract class BaseActivity : AppCompatActivity() { var locationUpdateCallback: LocationUpdateCallback? = null protected lateinit var binding: T - private lateinit var fusedLocationClient:FusedLocationProviderClient + private lateinit var fusedLocationClient: FusedLocationProviderClient private val locationRequest = com.google.android.gms.location.LocationRequest.Builder( Priority.PRIORITY_LOW_POWER, @@ -50,8 +50,8 @@ abstract class BaseActivity : AppCompatActivity() { setContentView(getLayoutId()) try { initDataBinding() - }catch (ex:Exception){ - d(ex.message.toString()) + } catch (ex: Exception) { + ex.message!!.toast(context = this) } mobileApplication = application as MobileApplication init() @@ -62,7 +62,6 @@ abstract class BaseActivity : AppCompatActivity() { open fun addBindingVariables() {} abstract fun init() - private fun initDataBinding() { binding = DataBindingUtil.setContentView(this, getLayoutId()) binding.lifecycleOwner = this diff --git a/app/src/main/java/es/verdnatura/presentation/base/BaseFragment.kt b/app/src/main/java/es/verdnatura/presentation/base/BaseFragment.kt index 979ffe90..0498151d 100644 --- a/app/src/main/java/es/verdnatura/presentation/base/BaseFragment.kt +++ b/app/src/main/java/es/verdnatura/presentation/base/BaseFragment.kt @@ -69,10 +69,10 @@ abstract class BaseFragment( addBindingVariables() } - fun textScanned_filterDouble(textScanned: String): String { + fun textScannedFilterDouble(textScanned: String): String { if (textScanned.length > 13) { - var size = textScanned.length + val size = textScanned.length if (textScanned.substring((size / 2), size) == textScanned.substring(0, size / 2) ) { return textScanned.substring(0, size / 2) @@ -149,8 +149,8 @@ abstract class BaseFragment( fun getInfoVersionNameApp(): String { val manager: PackageManager = requireContext().packageManager val info: PackageInfo = manager.getPackageInfo(requireContext().packageName, 0) - mobileApplication.versionName = info.versionName - return info.versionName + mobileApplication.versionName = info.versionName.toString() + return mobileApplication.versionName } fun getDevicePDA(): Int? { diff --git a/app/src/main/java/es/verdnatura/presentation/common/GeneralAdapter.kt b/app/src/main/java/es/verdnatura/presentation/common/GeneralAdapter.kt index eb39382f..59e04f60 100644 --- a/app/src/main/java/es/verdnatura/presentation/common/GeneralAdapter.kt +++ b/app/src/main/java/es/verdnatura/presentation/common/GeneralAdapter.kt @@ -7,9 +7,10 @@ import androidx.recyclerview.widget.RecyclerView import es.verdnatura.databinding.ItemGeneralRowBinding class GeneralAdapter( - private val items: List, - private val OnGeneralItemRowClickListener: OnGeneralItemRowClickListener, - // private var showDelete: Boolean = false + private var items: List, + private val onDeleteItemRowClickListener: OnGeneralItemRowClickListener? = null, + private var showDelete: Boolean = false, + private val onRowClickListener: OnGeneralRowClickListener? = null ) : RecyclerView.Adapter() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHolder { @@ -23,10 +24,6 @@ class GeneralAdapter( override fun onBindViewHolder(holder: ItemHolder, position: Int) { holder.bind(items[position]) - holder.binding.root.setOnClickListener { - OnGeneralItemRowClickListener.onGeneralItemRowClickListener(items[position]) - } - } inner class ItemHolder( @@ -36,11 +33,31 @@ class GeneralAdapter( fun bind(item: GeneralItem) { binding.apply { this.item = item - /*if (showDelete) itemImage.visibility = View.VISIBLE - else itemImage.visibility = View.GONE*/ + if (showDelete) itemImage.visibility = View.VISIBLE + else itemImage.visibility = View.GONE itemCode.visibility = View.GONE } + binding.itemImage.setOnClickListener { + onDeleteItemRowClickListener?.onGeneralItemRowClickListener(item) + } + binding.itemCode.setOnClickListener { + onRowClickListener?.onRowClickListener(item) + } + binding.itemTitle.setOnClickListener { + onRowClickListener?.onRowClickListener(item) + } + } } + + fun updateItems(list: List) { + items = list + notifyDataSetChanged() + } + + fun setShowDelete(hasVisibility: Boolean) { + showDelete = hasVisibility + notifyDataSetChanged() + } } diff --git a/app/src/main/java/es/verdnatura/presentation/common/PrinterDialogManager.kt b/app/src/main/java/es/verdnatura/presentation/common/PrinterDialogManager.kt new file mode 100644 index 00000000..03049540 --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/common/PrinterDialogManager.kt @@ -0,0 +1,69 @@ +package es.verdnatura.presentation.common + +import android.app.AlertDialog +import android.content.Context +import android.text.InputType +import android.view.View +import es.verdnatura.R +import es.verdnatura.presentation.view.component.CustomDialogList + +class PrinterDialogManager(private val context: Context) { + fun showPrintDialog( + item: Long, + itemName: String, + onPrintClick: (Long, String, Int?, Int) -> Unit + ) { + val customDialogList = CustomDialogList(context) + customDialogList.getEditText().setRawInputType(InputType.TYPE_CLASS_NUMBER) + customDialogList.getEditTextThree().setRawInputType(InputType.TYPE_CLASS_NUMBER) + + customDialogList.setTitle(context.getString(R.string.itemName, item, itemName)) + .setOkButton(context.getString(R.string.printQr)) { + handlePrintClick(item, customDialogList, onPrintClick, "qr") + } + .setOkTwoButton(context.getString(R.string.printBarcode)) { + handlePrintClick(item, customDialogList, onPrintClick, "barcode") + + } + .setKoButton(context.getString(R.string.cancel)) { + customDialogList.dismiss() + } + .setHintValueThree(context.getString(R.string.labelNumber)) + .setHintValue(context.getString(R.string.optionalPacking)) + .setTextThree(View.VISIBLE) + .show() + customDialogList.getFocusThree() + } + + private fun handlePrintClick( + item: Long, + customDialogList: CustomDialogList, + onPrintClick: (Long, String, Int?, Int) -> Unit, + labelType: String + ) { + onPrintClick( + item, + labelType, + if (customDialogList.getValue().isEmpty()) null else customDialogList.getValue() + .toInt(), + if (customDialogList.getValueOptional() + .isEmpty() + ) 1 else customDialogList.getValueOptional().toInt() + ) + customDialogList.dismiss() + } +} + +class LabelDialogHelper(private val context: Context) { + fun showLabelDialog( + onItemSelected: (Int) -> Unit, + ) { + val builder = AlertDialog.Builder(context) + builder.setTitle(context.getString(R.string.selectLabeltoPrint)) + val labelCount = Array(10) { (it + 1).toString() } + builder.setItems(labelCount) { _, which -> + onItemSelected(which + 1) + } + builder.create().show() + } +} \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/presentation/common/SalixBackItems.kt b/app/src/main/java/es/verdnatura/presentation/common/SalixBackItems.kt index 6c9d4049..92ee45f4 100644 --- a/app/src/main/java/es/verdnatura/presentation/common/SalixBackItems.kt +++ b/app/src/main/java/es/verdnatura/presentation/common/SalixBackItems.kt @@ -96,4 +96,26 @@ data class ExpeditionPrintOut( val expeditionFk: Long, val itemFk: Int, val isChecked: Boolean +) + +data class PickupResponse( + val routeFk: Int, + val route: Route? +) + +data class Route( + val id: Int, + val agencyModeFk: Int, + val agencyMode: AgencyMode? +) + +data class AgencyMode( + val id: Int, + val deliveryMethodFk: Int, + val deliveryMethod: DeliveryMethod? +) + +data class DeliveryMethod( + val id: Int, + val code: String? ) \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/presentation/common/UICallbacks.kt b/app/src/main/java/es/verdnatura/presentation/common/UICallbacks.kt index c5d5bec6..facac1e2 100644 --- a/app/src/main/java/es/verdnatura/presentation/common/UICallbacks.kt +++ b/app/src/main/java/es/verdnatura/presentation/common/UICallbacks.kt @@ -10,6 +10,7 @@ import es.verdnatura.presentation.view.feature.buscaritem.model.ItemLocationVO import es.verdnatura.presentation.view.feature.claim.fragment.reubication.model.Reubication import es.verdnatura.presentation.view.feature.delivery.model.ClientTicketSalix import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionInfoSummary +import es.verdnatura.presentation.view.feature.delivery.model.RouteComplement import es.verdnatura.presentation.view.feature.delivery.model.RouteInfo import es.verdnatura.presentation.view.feature.delivery.model.Ticket import es.verdnatura.presentation.view.feature.historicoarticulo.model.ItemHistoricoVO @@ -50,6 +51,10 @@ interface OnMistakeWorkerClickListener { fun onMistakeWorkerClickListener(item: WorkerFromMistake) } +interface OnSalarySupplementClickListener { + fun onSalarySupplementClickListener(item: RouteComplement) +} + interface HideBottomNavigation { fun hideBottomNavigation(entryPoint: String) } @@ -102,6 +107,10 @@ interface OnGeneralItemRowClickListener { fun onGeneralItemRowClickListener(item: GeneralItem) } +interface OnGeneralRowClickListener { + fun onRowClickListener(item: GeneralItem) +} + interface OnImageTrashClickListener { fun onImageTrashClickListener(item: Any) } @@ -263,6 +272,10 @@ interface OnTicketClickListener { fun onTicketClickListener(sale: SaleVO) } +interface OnTicketColorListener { + fun onTicketColorListener(sale: SaleVO) +} + interface OnTicketClickSaleListener { fun onTicketClickListener(sale: Sale) } @@ -271,6 +284,10 @@ interface OnSaleReserveClickListener { fun onSaleReserveListener(sale: Sale) } +interface OnAddItemClickListener { + fun onAddItemClickListener(sale: Sale) +} + interface OnBuyerSelectedListener { fun onBuyerSelected(userFk: String) } diff --git a/app/src/main/java/es/verdnatura/presentation/common/UIExtensions.kt b/app/src/main/java/es/verdnatura/presentation/common/UIExtensions.kt index 074d0eaa..a25ea5e2 100644 --- a/app/src/main/java/es/verdnatura/presentation/common/UIExtensions.kt +++ b/app/src/main/java/es/verdnatura/presentation/common/UIExtensions.kt @@ -10,6 +10,8 @@ import android.graphics.drawable.Drawable import android.media.AudioManager import android.os.Build import android.os.Bundle +import android.os.Handler +import android.os.Looper import android.text.InputType import android.view.View import android.view.ViewGroup @@ -27,6 +29,10 @@ import com.bumptech.glide.request.transition.Transition import java.text.DecimalFormat import java.text.ParseException import java.text.SimpleDateFormat +import java.time.LocalDate +import java.time.LocalDateTime +import java.time.LocalTime +import java.time.format.DateTimeFormatter import java.util.Calendar import java.util.Locale @@ -153,8 +159,12 @@ fun Activity.showKeyboardIn() { } fun Context.hideKeyboard(view: View) { - val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager - inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0) + Handler(Looper.getMainLooper()).postDelayed({ + val inputMethodManager = + getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager + inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0) + }, 100L) + } fun Context.showKeyboard() { @@ -213,7 +223,7 @@ fun PackageManager.getPackageInfoCompat(packageName: String, flags: Int = 0): Pa if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(flags.toLong())) } else { - getPackageInfo(packageName, flags) + getPackageInfo(packageName, flags) } fun convertToDateString(date: String?): String? { @@ -221,8 +231,18 @@ fun convertToDateString(date: String?): String? { if (date.isNullOrEmpty()) { return date } - val formatoEntrada = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.getDefault()) // Formato de entrada - val formatoSalida = SimpleDateFormat("yyyy-MM-dd",Locale.getDefault()) // Formato de salida + val formatoEntrada = + SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.getDefault()) // Formato de entrada + val formatoSalida = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()) // Formato de salida val dateToConvert = formatoEntrada.parse(date) // Convertir fecha de String a objeto Date return formatoSalida.format(dateToConvert!!) // Convertir fecha a String con formato deseado } + +fun getDayBounds(dateString: String): Pair { + val formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy") + val date = LocalDate.parse(dateString, formatter) + val startOfDay = date.atTime(LocalTime.MIN) + val endOfDay = date.atTime(LocalTime.MAX) + + return Pair(startOfDay, endOfDay) +} diff --git a/app/src/main/java/es/verdnatura/presentation/view/commom/SearchableAdapter.kt b/app/src/main/java/es/verdnatura/presentation/view/commom/SearchableAdapter.kt new file mode 100644 index 00000000..eb9bdf47 --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/view/commom/SearchableAdapter.kt @@ -0,0 +1,87 @@ +package es.verdnatura.presentation.view.commom + +import android.content.Context +import android.graphics.Color +import android.text.Spannable +import android.text.SpannableString +import android.text.style.ForegroundColorSpan +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.appcompat.widget.SearchView +import androidx.recyclerview.widget.RecyclerView +import es.verdnatura.domain.toast + +class SearchableAdapter( + private var listElements: MutableList, + private var context: Context, + private val onItemClick: (NameWithId) -> Unit, +) : RecyclerView.Adapter() { + + private var listElementsFiltered = listElements.toMutableList() + private var currentQuery: String = "" + private lateinit var searchView: SearchView + + inner class NameViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val nameText: TextView = itemView.findViewById(android.R.id.text1) + + fun bind(nameWithId: NameWithId, query: String) { + val spannableString = SpannableString(nameWithId.name) + try { + if (query.isNotEmpty()) { + val startIndex = nameWithId.name.indexOf(query, ignoreCase = true) + if (startIndex >= 0) { + val endIndex = startIndex + query.length + spannableString.setSpan( + ForegroundColorSpan(Color.RED), + startIndex, + endIndex, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ) + } + } + nameText.text = spannableString + itemView.setOnClickListener { + onItemClick(nameWithId) + } + } catch (ex: Exception) { + ex.message?.toast(context) + } + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NameViewHolder { + val view = LayoutInflater.from(parent.context) + .inflate(android.R.layout.simple_list_item_1, parent, false) + return NameViewHolder(view) + } + + override fun onBindViewHolder(holder: NameViewHolder, position: Int) { + val nameWithId = listElementsFiltered[position] + holder.bind(nameWithId, currentQuery) + } + + fun filter(query: String) { + currentQuery = query + listElementsFiltered = if (query.isEmpty()) { + listElements.toMutableList() + } else { + listElements.filter { it.name.contains(query, ignoreCase = true) } + .toMutableList() + } + notifyDataSetChanged() + } + + override fun getItemCount(): Int = listElementsFiltered.size + + fun updateList(newList: MutableList) { + listElements = newList + filter("") + } +} + +data class NameWithId( + val id: Number, + val name: String +) diff --git a/app/src/main/java/es/verdnatura/presentation/view/commom/SearchableRecyclerView.kt b/app/src/main/java/es/verdnatura/presentation/view/commom/SearchableRecyclerView.kt new file mode 100644 index 00000000..b44a7043 --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/view/commom/SearchableRecyclerView.kt @@ -0,0 +1,80 @@ +package es.verdnatura.presentation.view.commom + +import android.content.Context +import android.graphics.Color +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.widget.LinearLayout +import androidx.appcompat.widget.SearchView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import es.verdnatura.R + +class SearchableRecyclerView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : LinearLayout(context, attrs, defStyleAttr) { + + val searchView: SearchView + private val recyclerView: RecyclerView + lateinit var adapter: SearchableAdapter + private var allItems: MutableList = mutableListOf() + + init { + LayoutInflater.from(context).inflate(R.layout.component_searchable_dialog, this, true) + searchView = findViewById(R.id.search_view) + recyclerView = findViewById(R.id.recycler_viewer) + recyclerView.layoutManager = LinearLayoutManager(context) + recyclerView.setBackgroundColor(Color.WHITE) + searchView.setBackgroundColor(Color.WHITE) + searchView.setOnCloseListener { + visibility = View.GONE + true + } + + searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { + override fun onQueryTextSubmit(query: String?): Boolean { + return false + } + + override fun onQueryTextChange(newText: String?): Boolean { + if (::adapter.isInitialized) adapter.filter(newText ?: "") + return true + } + }) + } + + fun setAdapter(adapter: SearchableAdapter, items: MutableList) { + this.adapter = adapter + this.allItems = items + recyclerView.adapter = adapter + adapter.notifyDataSetChanged() + } + + fun setOnCloseListener(listener: () -> Boolean) { + searchView.setOnCloseListener { listener() } + } + + fun setVisibility() { + searchView.visibility = View.VISIBLE + recyclerView.visibility = View.VISIBLE + } + + fun setSearchHint(searchHint: String): SearchableRecyclerView { + searchView.queryHint = searchHint + searchView.setIconifiedByDefault(true) + searchView.isIconified = false + searchView.post { + searchView.requestFocus() + } + + return this + } + + fun setSearchHintWithoutFocus(searchHint: String): SearchableRecyclerView { + searchView.queryHint = searchHint + return this + } +} diff --git a/app/src/main/java/es/verdnatura/presentation/view/component/CustomDialogList.kt b/app/src/main/java/es/verdnatura/presentation/view/component/CustomDialogList.kt index 51970ec1..aaeaa032 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/component/CustomDialogList.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/component/CustomDialogList.kt @@ -8,49 +8,43 @@ import com.google.android.material.textfield.TextInputEditText import es.verdnatura.R import es.verdnatura.databinding.ComponentCustomListDialogBinding -//import kotlinx.android.synthetic.main.component_custom_list_dialog.* - - class CustomDialogList(context: Context) : Dialog(context, R.style.DialogTheme) { - private var binding: ComponentCustomListDialogBinding = ComponentCustomListDialogBinding.inflate(layoutInflater) init { - setContentView(binding.root) getEditText().requestFocus() - //setContentView(R.layout.component_custom_list_dialog) } fun getRecyclerView(): RecyclerView { - return binding.itemRecyclerview - //return item_recyclerview } fun getEditText(): TextInputEditText { return binding.customDialogValue - //return custom_dialog_value } fun getEditTextTwo(): TextInputEditText { return binding.customDialogValueTwo - //return custom_dialog_value_two + } + + fun getEditTextThree(): TextInputEditText { + return binding.customDialogValueThree } fun getValue(): String { return binding.customDialogValue.text.toString() - //return custom_dialog_value.text.toString() + } + + fun getValueOptional(): String { + return binding.customDialogValueThree.text.toString() } fun setValue(value: String): CustomDialogList { binding.customDialogValue.setText(value) binding.textinputlayoutUsername.visibility = View.VISIBLE - - /*custom_dialog_value.setText(value) - textinputlayout_username.visibility = View.VISIBLE*/ return this } @@ -61,96 +55,97 @@ class CustomDialogList(context: Context) : Dialog(context, R.style.DialogTheme) fun getValueTwo(): String { return binding.customDialogValueTwo.text.toString() - //return custom_dialog_value_two.text.toString() } fun setValueTwo(value: String): CustomDialogList { binding.customDialogValueTwo.setText(value) binding.textinputlayoutTwo.visibility = View.VISIBLE - - /* custom_dialog_value_two.setText(value) - textinputlayout_two.visibility = View.VISIBLE*/ return this } fun setTitle(title: String): CustomDialogList { binding.customDialogTitle.visibility = View.VISIBLE binding.customDialogTitle.text = title - /* custom_dialog_title.visibility = View.VISIBLE - custom_dialog_title.text = title*/ return this } fun setDescription(title: String): CustomDialogList { binding.customDialogDescription.visibility = View.VISIBLE binding.customDialogDescription.text = title - - /*custom_dialog_description.visibility = View.VISIBLE - custom_dialog_description.text = title*/ return this } - fun setOkButton(text: String, onButtonClicked: () -> Unit): CustomDialogList { binding.customDialogButtonOk.visibility = View.VISIBLE binding.customDialogButtonOk.text = text - - /*custom_dialog_button_ok.visibility = View.VISIBLE - custom_dialog_button_ok.text = text - custom_dialog_button_ok.setOnClickListener { onButtonClicked() }*/ binding.customDialogButtonOk.setOnClickListener { onButtonClicked() } return this } - fun setKoButton(text: String, onButtonClicked: () -> Unit): CustomDialogList { + fun setOkTwoButton(text: String, onButtonClicked: () -> Unit): CustomDialogList { + binding.customDialogButtonOkTwo.visibility = View.VISIBLE + binding.customDialogButtonOkTwo.text = text + binding.customDialogButtonOkTwo.setOnClickListener { onButtonClicked() } + return this + } + fun setKoButton(text: String, onButtonClicked: () -> Unit): CustomDialogList { binding.customDialogButtonKo.visibility = View.VISIBLE binding.customDialogButtonKo.text = text - /*custom_dialog_button_ko.visibility = View.VISIBLE - custom_dialog_button_ko.text = text*/ binding.customDialogButtonKo.setOnClickListener { onButtonClicked() dismiss() } - return this } fun setHintValue(text: String): CustomDialogList { - binding.customDialogValue.hint = text -// custom_dialog_value.hint = text return this } fun setHintValueTwo(text: String): CustomDialogList { binding.customDialogValueTwo.hint = text - //custom_dialog_value_two.hint = text return this } - fun setTextTwoGone(): CustomDialogList { - binding.textinputlayoutTwo.visibility = View.GONE - //textinputlayout_two.visibility = View.GONE + fun setHintValueThree(text: String): CustomDialogList { + binding.customDialogValueThree.hint = text + return this + } + + fun setTextTwoVisibility(visibility: Int): CustomDialogList { + binding.textinputlayoutTwo.visibility = visibility + return this + } + + fun setTextThree(visibility: Int): CustomDialogList { + binding.textinputlayoutThree.visibility = visibility return this } fun hideDialog(): CustomDialogList { binding.customDialogValue.visibility = View.GONE - //custom_dialog_value.visibility = View.GONE + return this + } + + fun showDialog(): CustomDialogList { + binding.customDialogValue.visibility = View.VISIBLE return this } fun hideDescription(): CustomDialogList { binding.customDialogDescription.visibility = View.GONE - return this } - fun hideTextInput(visibility:Int = View.INVISIBLE): CustomDialogList { + fun hideTextInput(visibility: Int = View.INVISIBLE): CustomDialogList { binding.textinputlayoutUsername.visibility = visibility - return this } + + fun getFocusThree() { + binding.customDialogValueThree.requestFocus() + } } \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/presentation/view/component/CustomDialogThreeButtons.kt b/app/src/main/java/es/verdnatura/presentation/view/component/CustomDialogThreeButtons.kt index 74e1ba91..8186e76b 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/component/CustomDialogThreeButtons.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/component/CustomDialogThreeButtons.kt @@ -7,10 +7,10 @@ import com.google.android.material.textfield.TextInputEditText import es.verdnatura.R import es.verdnatura.databinding.ComponentCustomThreeDialogBinding +class CustomDialogThreeButtons(context: Context) : Dialog(context, R.style.DialogTheme) { -class CustomDialogThreeButtons (context: Context) : Dialog(context, R.style.DialogTheme) { - - private var binding: ComponentCustomThreeDialogBinding = ComponentCustomThreeDialogBinding.inflate(layoutInflater) + private var binding: ComponentCustomThreeDialogBinding = + ComponentCustomThreeDialogBinding.inflate(layoutInflater) init { @@ -18,53 +18,52 @@ class CustomDialogThreeButtons (context: Context) : Dialog(context, R.style.Dial //setContentView(R.layout.component_custom_three_dialog) } - fun setTitle(title: String): CustomDialogThreeButtons { - binding.customDialogTitle.visibility= View.VISIBLE - binding.customDialogTitle.text=title - /* custom_dialog_title.visibility = View.VISIBLE - custom_dialog_title.text = title*/ + binding.customDialogTitle.visibility = View.VISIBLE + binding.customDialogTitle.text = title + /* custom_dialog_title.visibility = View.VISIBLE + custom_dialog_title.text = title*/ return this } fun setDescription(description: String): CustomDialogThreeButtons { - binding.customDialogDescription.visibility= View.VISIBLE - binding.customDialogDescription.text=description + binding.customDialogDescription.visibility = View.VISIBLE + binding.customDialogDescription.text = description - /* custom_dialog_description.visibility = View.VISIBLE - custom_dialog_description.text = description*/ + /* custom_dialog_description.visibility = View.VISIBLE + custom_dialog_description.text = description*/ return this } fun setOkButton(text: String, onButtonClicked: () -> Unit): CustomDialogThreeButtons { binding.customDialogButtonOk.visibility = View.VISIBLE - binding.customDialogButtonOk.text =text + binding.customDialogButtonOk.text = text binding.customDialogButtonOk.setOnClickListener { onButtonClicked() } - /* custom_dialog_button_ok.visibility = View.VISIBLE - custom_dialog_button_ok.text = text - custom_dialog_button_ok.setOnClickListener { onButtonClicked() }*/ + /* custom_dialog_button_ok.visibility = View.VISIBLE + custom_dialog_button_ok.text = text + custom_dialog_button_ok.setOnClickListener { onButtonClicked() }*/ return this } - - fun getValue() : String { + fun getValue(): String { return binding.customDialogValue.text.toString() //return custom_dialog_value.text.toString() } - fun getEditText() : TextInputEditText { + fun getEditText(): TextInputEditText { return binding.customDialogValue //return custom_dialog_value } - fun setValue(value : String): CustomDialogThreeButtons{ + + fun setValue(value: String): CustomDialogThreeButtons { binding.customDialogValue.setText(value) binding.textinputlayout.visibility = View.VISIBLE - /* custom_dialog_value.setText(value) - textinputlayout.visibility = View.VISIBLE*/ + /* custom_dialog_value.setText(value) + textinputlayout.visibility = View.VISIBLE*/ return this } @@ -117,10 +116,15 @@ class CustomDialogThreeButtons (context: Context) : Dialog(context, R.style.Dial return this } - fun setCustomDialogValue(visibility:Int){ - binding.customDialogValue.visibility=visibility + fun setCustomDialogValue(visibility: Int) { + binding.customDialogValue.visibility = visibility } - fun setFocusDialogValue(){ + + fun setFocusDialogValue() { binding.customDialogValue.requestFocus() } + + fun setHintDialogValue(text: String) { + binding.customDialogValue.hint = text + } } \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesFragment.kt index c4e7d529..5787f391 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesFragment.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesFragment.kt @@ -32,6 +32,8 @@ import es.verdnatura.presentation.base.BaseFragment import es.verdnatura.presentation.common.OnAjustesItemClickListener import es.verdnatura.presentation.common.OnOptionsSelectedListener import es.verdnatura.presentation.common.ToolBarAdapterTooltip +import es.verdnatura.presentation.view.commom.NameWithId +import es.verdnatura.presentation.view.commom.SearchableAdapter import es.verdnatura.presentation.view.component.CustomDialog import es.verdnatura.presentation.view.feature.ajustes.adapter.SettingsAdapter import es.verdnatura.presentation.view.feature.ajustes.model.AjustesItemVO @@ -75,51 +77,96 @@ class AjustesFragment : binding.mainToolbar.toolbarTitle.text = getString(R.string.settings) hideBackButton(binding.mainToolbar) getUserData() - binding.userText.text = mobileApplication.userName - binding.itemVersion.text = requireActivity().packageManager.getPackageInfo( - requireActivity().packageName, 0 - ).versionName!! - binding.androididText.text = - mobileApplication.dataStoreApp.readDataStoreKey(ANDROID_ID) - binding.serialNumber.text = mobileApplication.serialNumber pasilleroViewModel = PasilleroViewModel(mobileApplication) setToolBar() super.init() } + private fun setSearchable(listNames: MutableList) { + val adapter = + SearchableAdapter( + listElements = listNames, + context = requireContext() + ) { elementSelected -> + sectorListVO.forEach { + if (it.id == elementSelected.id) { + runBlocking { + mobileApplication.dataStoreApp.editDataStoreKey( + PRINTERNAME, getString(R.string.noprinter) + ) + mobileApplication.dataStoreApp.editDataStoreKey(PRINTERFK, -1) + mobileApplication.dataStoreApp.editDataStoreKey( + SECTORDESCRIP, it.description + ) + mobileApplication.dataStoreApp.editDataStoreKey( + SECTORFK, it.id + ) + it.warehouseFk?.let { it1 -> + mobileApplication.dataStoreApp.editDataStoreKey( + WAREHOUSEFK, it1 + ) + } + } + viewModel.settingsItem[0].sectorFk = it.id + viewModel.settingsItem[0].selected = it.description + viewModel.workerUpdateOperatorSalix( + "sector", mobileApplication.userId!!, it.id, null + ) + settingsAdapter!!.notifyItemChanged(0) + return@forEach + } + } + binding.searchableRecyclerView.visibility = View.GONE + } + + binding.searchableRecyclerView.setAdapter(adapter, listNames) + binding.searchableRecyclerView.visibility = View.VISIBLE + binding.searchableRecyclerView.setSearchHintWithoutFocus(getString(R.string.sectorSearch)) + } + private fun setToolBar() { val listIcons: ArrayList = ArrayList() val iconInfo = ImageView(context) iconInfo.setImageResource(R.drawable.ic_info_delivery) + val iconLogout = ImageView(context) + iconLogout.setImageResource(R.drawable.ic_logout) listIcons.add(iconInfo) + listIcons.add(iconLogout) binding.mainToolbar.toolbarIcons.adapter = ToolBarAdapterTooltip(listIcons, object : OnOptionsSelectedListener { override fun onOptionsItemSelected(item: Drawable) { - customDialog.setTitle(getString(R.string.info)) - .setDescription( - getString(R.string.version) + ":\t" + - requireActivity().packageManager.getPackageInfo( - requireActivity().packageName, 0 - ).versionName!! + "(${getVersionCode()})" + "\n" + - getString(R.string.user) + ":\t" + - mobileApplication.userName + "\n" + - getString(R.string.androidid) + ":\t" + - mobileApplication.dataStoreApp.readDataStoreKey( - ANDROID_ID - ) + "\n" + - if (!mobileApplication.serialNumber.isNullOrBlank()) { - getString(R.string.serialNumber) + "\t" + - mobileApplication.serialNumber - } else "" + when (item) { + iconInfo.drawable -> { + customDialog.setTitle(getString(R.string.info)) + .setDescription( + getString(R.string.version) + ":\t" + + requireActivity().packageManager.getPackageInfo( + requireActivity().packageName, 0 + ).versionName!! + "(${getVersionCode()})" + "\n" + + getString(R.string.user) + ":\t" + + mobileApplication.userName + "\n" + + getString(R.string.androidid) + ":\t" + + mobileApplication.dataStoreApp.readDataStoreKey( + ANDROID_ID + ) + "\n" + + if (!mobileApplication.serialNumber.isNullOrBlank()) { + getString(R.string.serialNumber) + "\t" + + mobileApplication.serialNumber + } else "" - ) - .setOkButton(getString(R.string.Close)) { - customDialog.dismiss() - }.show() + ) + .setOkButton(getString(R.string.Close)) { + customDialog.dismiss() + }.show() + } + iconLogout.drawable -> { + ma.onMyBackPressed() + } + } } }) binding.mainToolbar.toolbarIcons.layoutManager = @@ -177,6 +224,23 @@ class AjustesFragment : CodeWorkerAction.STOP ) + getString(R.string.holdpositionAuto) -> { + + runBlocking { + mobileApplication.dataStoreApp.editDataStoreKey( + HOLDPOSITION, + viewModel.settingsItem[5].selected != getString(R.string.yes) + ) + } + viewModel.settingsItem[5].holdPosition = + !viewModel.settingsItem[5].holdPosition + viewModel.settingsItem[5].selected = + if (viewModel.settingsItem[5].holdPosition) getString(R.string.yes) else getString( + R.string.no + ) + settingsAdapter!!.notifyItemChanged(5) + } + else -> {} } @@ -206,11 +270,13 @@ class AjustesFragment : } // modificar listSectores.sort() - val array = arrayOfNulls(listSectores.size) sectorListVO = it.list - showDialogForAll( - listSectores.toArray(array), getString(R.string.selectSector) - ) + setSearchable(sectorListVO.map { + NameWithId( + id = it.id, + name = it.description + ) + } as MutableList) } else { customDialog.setTitle(getString(R.string.sectors)) @@ -297,16 +363,6 @@ class AjustesFragment : private fun getUserData() { loginViewModel = LoginViewModel(requireActivity().applicationContext) - /* try { - loginViewModel.operatorGetData(mobileApplication.userId!!) - } catch (_: Exception) { - ma.messageWithSound( - message = getString(R.string.errorGetData), isError = true, isPlayed = true - ) - } - loginViewModel.workerOperator.observe(this@AjustesFragment) { iti -> - runBlocking { mobileApplication.dataStoreApp.saveDataOperator(iti) } - }*/ handleUserCall() loginViewModel.handleUserResponse.observe(this@AjustesFragment) { iti -> runBlocking { mobileApplication.dataStoreApp.saveWorkerData(iti) } diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesViewModel.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesViewModel.kt index c20a4863..8ac8ca71 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesViewModel.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/ajustes/fragment/AjustesViewModel.kt @@ -100,14 +100,17 @@ class AjustesViewModel(val context: Context) : BaseViewModel(context) { action = false ) ) - /*Tarea 5443 - _settingsItem.add( - AjustesItemVO( - "Bajar línea al revisar", - holdPosition = holdPosition, - action = true - ) - )*/ + //Tarea 5443 + _settingsItem.add( + AjustesItemVO( + context.getString(R.string.holdpositionAuto), + holdPosition = holdPosition, + selected = if (holdPosition) context.getString(R.string.yes) else context.getString( + R.string.no + ), + action = true + ) + ) _settingsItem.add( AjustesItemVO( @@ -124,11 +127,11 @@ class AjustesViewModel(val context: Context) : BaseViewModel(context) { context.getString(R.string.runActivityStop), action = true ) ) - _settingsItem.add( - AjustesItemVO( - context.getString(R.string.closeSession), action = true - ) - ) + /* _settingsItem.add( + AjustesItemVO( + context.getString(R.string.closeSession), action = true + ) + )*/ } diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/fragment/ItemCardFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/fragment/ItemCardFragment.kt index 842bc292..b3b03808 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/fragment/ItemCardFragment.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/fragment/ItemCardFragment.kt @@ -11,6 +11,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.google.gson.Gson import es.verdnatura.R import es.verdnatura.databinding.FragmentItemCardBinding +import es.verdnatura.domain.ConstAndValues.PRINTERFK import es.verdnatura.domain.ConstAndValues.WAREHOUSEFK import es.verdnatura.domain.notNull import es.verdnatura.domain.toast @@ -19,7 +20,9 @@ import es.verdnatura.presentation.common.OnBarcodeRowClickListener import es.verdnatura.presentation.common.OnClickDynamic import es.verdnatura.presentation.common.OnItemCardRowClickListener import es.verdnatura.presentation.common.OnOptionsSelectedListener +import es.verdnatura.presentation.common.PrinterDialogManager import es.verdnatura.presentation.common.ToolBarAdapterTooltip +import es.verdnatura.presentation.common.hideKeyboard import es.verdnatura.presentation.common.itemScanValue import es.verdnatura.presentation.common.loadUrl import es.verdnatura.presentation.view.component.CustomDialogDynamicButtons @@ -53,6 +56,8 @@ class ItemCardFragment( private var quantityToDiscard = 0 private var itemInfoG: ItemCardVO? = null private var positionToReturnY = 0 + private var originalScan: String? = null + private var buyToPrint: Long? = null companion object { fun newInstance(entryPoint: String) = ItemCardFragment(entryPoint) @@ -95,16 +100,20 @@ class ItemCardFragment( iconHistory.setImageResource(R.drawable.ic_history_black_24dp) val iconSalix = ImageView(context) iconSalix.setImageResource(R.drawable.ic_logo_salix) + val iconPrint = ImageView(context) + iconPrint.setImageResource(R.drawable.ic_print_black_24dp) iconReload.tooltipText = getTooltip(R.drawable.ic_autorenew_black_24dp) iconHistory.tooltipText = getTooltip(R.drawable.ic_history_black_24dp) iconSalix.tooltipText = getTooltip(R.drawable.ic_logo_salix) + // Tarea 7266 + // iconPrint.tooltipText = getTooltip(R.drawable.ic_print_black_24dp) listIcons.add(iconSalix) listIcons.add(iconReload) listIcons.add(iconHistory) - + // listIcons.add(iconPrint) binding.mainToolbar.toolbarIcons.adapter = ToolBarAdapterTooltip(listIcons, object : OnOptionsSelectedListener { @@ -112,6 +121,25 @@ class ItemCardFragment( override fun onOptionsItemSelected(item: Drawable) { when (item) { + + iconPrint.drawable -> { + + if (buyToPrint != null) { + + val printerDialogManager = PrinterDialogManager(requireContext()) + printerDialogManager.showPrintDialog( + itemInfoG!!.id.toLong(), + itemInfoG?.longName ?: "" + ) { id, labelType, copies, packing -> + printItem(id, labelType, copies, packing) + } + } else ma.messageWithSound( + getString(R.string.errorPrintBuy), + isError = true, + isPlayed = true + ) + } + iconReload.drawable -> { getItemCard(itemInfoG!!.id.toString()) } @@ -152,20 +180,42 @@ class ItemCardFragment( LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false) } + private fun printItem(id: Long, labelType: String, packing: Int?, copies: Int?) { + + try { + + viewModel.printItem( + reportName = "LabelBuy", + printerFk = mobileApplication.dataStoreApp.readDataStoreKey( + PRINTERFK + ), + userFk = mobileApplication.userId!!, + priority = "normal", + params = """{'copies':$copies,'id':$id,'labelType':'$labelType','packing':$packing}""" + ) + } catch (ex: Exception) { + ma.messageWithSound(message = ex.message.toString(), isError = true, isPlayed = true) + } + customDialogList.dismiss() + hideKeyboard() + } + private fun setEvents() { binding.editItemFk.requestFocus() binding.editItemFk.setOnEditorActionListener { _, actionId, _ -> if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) { - if (binding.editItemFk.text.toString().isNotEmpty()) try { - getItemCard( - itemScanValue( + if (binding.editItemFk.text.toString().isNotEmpty()) + try { + originalScan = itemScanValue( binding.editItemFk.text.toString(), arrayOf("buy"), "more" ).toString() - ) - } catch (ex: Exception) { - ma.messageWithSound(ex.message.toString(), isError = true, isPlayed = true) - } + getItemCard( + originalScan!! + ) + } catch (ex: Exception) { + ma.messageWithSound(ex.message.toString(), isError = true, isPlayed = true) + } binding.editItemFk.setText("") ma.hideKeyboard(binding.editItemFk) @@ -196,7 +246,6 @@ class ItemCardFragment( warehouseFk = mobileApplication.dataStoreApp.readDataStoreKey(WAREHOUSEFK) as Int itemFk = itemValueFk - viewModel.getItemCard(itemFk.toLong(), warehouseFk!!) } @@ -210,6 +259,19 @@ class ItemCardFragment( binding.itemcardLayout.visibility = View.VISIBLE setItemCard(it) binding.mainToolbar.toolbarIcons.visibility = View.VISIBLE + /* Tarea 7266 + if (originalScan == null || it.id == originalScan!!.toInt()) { + viewModel.buyUltimate( + itemFk = it.id, + warehouseFk = mobileApplication.dataStoreApp.readDataStoreKey( + WAREHOUSEFK + ), + dated = LocalDate.now() + .format(DateTimeFormatter.ofPattern("yyyy-dd-MM")) + ) + } else { + buyToPrint = originalScan!!.toLong() + }*/ } else { binding.itemcardLayout.visibility = GONE binding.mainToolbar.toolbarTitle.text = getString(R.string.itemCard) @@ -237,6 +299,11 @@ class ItemCardFragment( } } + loadBuyUltimateResponse.observe(viewLifecycleOwner) { event -> + event.getContentIfNotHandled().notNull { + buyToPrint = it + } + } } } diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/fragment/ItemCardViewModel.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/fragment/ItemCardViewModel.kt index 64d4a1b8..630199d4 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/fragment/ItemCardViewModel.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/fragment/ItemCardViewModel.kt @@ -7,6 +7,7 @@ import androidx.lifecycle.map import es.verdnatura.domain.SalixCallback import es.verdnatura.domain.formatWithQuotes import es.verdnatura.domain.userCases.GetItemFromBarcodeUseCase +import es.verdnatura.domain.userCases.GetItemPrintItemUseCase import es.verdnatura.presentation.base.BaseViewModel import es.verdnatura.presentation.common.Event import es.verdnatura.presentation.common.ItemBarCodeSalix @@ -25,6 +26,7 @@ import java.io.File class ItemCardViewModel(var context: Context) : BaseViewModel(context) { private val getItemFromBarcodeUseCase = GetItemFromBarcodeUseCase(salix) + private val printItemUseCase = GetItemPrintItemUseCase(salix) private val _itemCard by lazy { MutableLiveData() } val itemCard: LiveData @@ -48,6 +50,10 @@ class ItemCardViewModel(var context: Context) : BaseViewModel(context) { val loadAddressLosesList: LiveData> = _addressLosesList.map { Event(it) } + private val _buyUltimateResponse by lazy { MutableLiveData() } + val buyUltimateResponse: LiveData = _buyUltimateResponse + val loadBuyUltimateResponse: LiveData> = _buyUltimateResponse.map { Event(it) } + fun getItemCard( itemFk: Number, warehouseFk: Int, @@ -63,6 +69,28 @@ class ItemCardViewModel(var context: Context) : BaseViewModel(context) { }) } + fun printItem( + reportName: String, + printerFk: Int, + userFk: Int, + params: Any, + priority: String + + ) { + + printItemUseCase.execute( + params = arrayListOf( + reportName, + printerFk, + userFk, + params, + priority + ).formatWithQuotes() + ) + .enqueue(object : SalixCallback(context) { + }) + } + fun itemGetSimilar( itemFk: Int, warehouseFk: Int, @@ -210,4 +238,15 @@ class ItemCardViewModel(var context: Context) : BaseViewModel(context) { } }) } + + fun buyUltimate( + itemFk: Int, warehouseFk: Int, dated: String + ) { + salix.buyUltimate(params = arrayListOf(itemFk, warehouseFk, dated).formatWithQuotes()) + .enqueue(object : SalixCallback(context) { + override fun onSuccess(response: Response) { + _buyUltimateResponse.value = response.body() + } + }) + } } diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/model/ItemCardVO.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/model/ItemCardVO.kt index a8789dc2..5c5ea34f 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/model/ItemCardVO.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/articulo/model/ItemCardVO.kt @@ -10,7 +10,7 @@ class ItemCardVO( var size: Int? = null, var stems: String? = null, var itemCost: String? = null, - var category:String? = null, + var category: String? = null, var producer: String? = null, var origin: String? = null, var reserva: Int? = null, @@ -46,13 +46,20 @@ class ItemCardRowVO( class BarcodeVO( var code: String? ) + data class ItemDetails( var itemFk: Int? = null, var vShelvingFK: String = "", var itemCost: Double = 0.0, var visible: Int = 0, + ) + +data class ItemPrint( + val id: Int, + val labelType: String, + val packing: Int? = null, + val copies: Int? = 1 ) - diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/buscaritem/fragment/BuscarItemFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/buscaritem/fragment/BuscarItemFragment.kt index a9cdddd0..f95a65e5 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/buscaritem/fragment/BuscarItemFragment.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/buscaritem/fragment/BuscarItemFragment.kt @@ -45,7 +45,7 @@ class BuscarItemFragment( if (binding.editItemFk.text.toString().isNotEmpty()) try { getLocations( itemScanValue( - binding.editItemFk.text.toString(), arrayOf("buy"), "more" + binding.editItemFk.text.toString(), arrayOf("buy"), "more" ) ) } catch (ex: Exception) { diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/adapter/SaleAdapter.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/adapter/SaleAdapter.kt index 9c0f3658..5002a4a1 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/adapter/SaleAdapter.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/adapter/SaleAdapter.kt @@ -6,6 +6,8 @@ import android.graphics.Color import android.graphics.drawable.Drawable import android.view.LayoutInflater import android.view.View +import android.view.View.GONE +import android.view.View.VISIBLE import android.view.ViewGroup import androidx.core.content.ContextCompat.getColor import androidx.core.graphics.drawable.DrawableCompat @@ -13,6 +15,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import es.verdnatura.R import es.verdnatura.databinding.ItemArticleRowFragmentBinding +import es.verdnatura.domain.ConstAndValues.CONTROLADOR import es.verdnatura.domain.ConstAndValues.SACADOR import es.verdnatura.presentation.common.OnMistakeClickListener import es.verdnatura.presentation.common.OnPackingClickListener @@ -20,11 +23,12 @@ import es.verdnatura.presentation.common.OnPasillerosItemClickListener import es.verdnatura.presentation.common.OnQuantityClickListener import es.verdnatura.presentation.common.OnSaleClickListener import es.verdnatura.presentation.common.OnTicketClickListener +import es.verdnatura.presentation.common.OnTicketColorListener import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO import es.verdnatura.presentation.view.feature.sacador.model.SaleVO class SaleAdapter( - private val items: List, + private var items: MutableList, private val onPasillerosItemClickListener: OnPasillerosItemClickListener, private val onQuantityClick: OnQuantityClickListener, private val onSaleClickListener: OnSaleClickListener, @@ -33,8 +37,9 @@ class SaleAdapter( private var onTicketClick: OnTicketClickListener? = null, private var SaleAdapter: SaleAdapter? = null, private var type: String? = null, + private var onTicketColorClickListener: OnTicketColorListener? = null - ) : RecyclerView.Adapter() { +) : RecyclerView.Adapter() { var context: Context? = null var position: Int = 0 @@ -396,8 +401,32 @@ class SaleAdapter( } else { View.GONE }*/ - + println("sale ${sale.parkingCode} : ${sale.isAdvanced}") //ASIGNAMOS VALOR A LA VSITA + ticketFk.setTextColor( + getColor( + context!!, + if (sale.isAdvanced != null && sale.isAdvanced == 1) { + R.color.verdnatura_red_salix + } else { + R.color.verdnatura_black + } + ) + ) + parkingCode.visibility = if (sale.parkingCode == null) GONE else VISIBLE + + itemTicketColor.setOnClickListener { + onTicketColorClickListener?.onTicketColorListener(sale) + } + if (type == SACADOR || type == CONTROLADOR) { + itemTicketColor.tooltipText = context!!.getString(R.string.filterLevelColor) + } + + /* ticketFk.paintFlags = ticketFk.paintFlags or Paint.UNDERLINE_TEXT_FLAG + itemArticleItemFk.paintFlags = + itemArticleItemFk.paintFlags or Paint.UNDERLINE_TEXT_FLAG*/ + + this.sale = sale } @@ -468,4 +497,14 @@ class SaleAdapter( // itemTicketColor.setBackgroundResource((R.drawable.rectangle)) } + + fun updateSales(newSales: List) { + items = newSales.toMutableList() + notifyDataSetChanged() // Notifica al adaptador que los datos han cambiado + } + + fun orderSales(newSales: List) { + + notifyDataSetChanged() // Notifica al adaptador que los datos han cambiado + } } \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/adapter/SaleAdapterNew.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/adapter/SaleAdapterNew.kt index 185c1b28..61f19df0 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/adapter/SaleAdapterNew.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/adapter/SaleAdapterNew.kt @@ -7,7 +7,6 @@ import android.graphics.drawable.Drawable import android.view.LayoutInflater import android.view.View import android.view.View.GONE -import android.view.View.INVISIBLE import android.view.View.VISIBLE import android.view.ViewGroup import androidx.core.content.ContextCompat.getColor @@ -20,6 +19,7 @@ import es.verdnatura.domain.ConstAndValues.PREITEMPICKERTEST import es.verdnatura.domain.ConstAndValues.PREPARED import es.verdnatura.domain.ConstAndValues.SACADOR import es.verdnatura.domain.toast +import es.verdnatura.presentation.common.OnAddItemClickListener import es.verdnatura.presentation.common.OnMistakeClickListener import es.verdnatura.presentation.common.OnPackingClickSaleListener import es.verdnatura.presentation.common.OnPasillerosItemClickListener @@ -38,6 +38,7 @@ class SaleAdapterNew( private var onTicketClick: OnTicketClickSaleListener? = null, private var saleAdapter: SaleAdapterNew? = null, private var onReserveSaleClick: OnSaleReserveClickListener? = null, + private var onAddItemClickListener: OnAddItemClickListener? = null, private var type: String? = null, ) : RecyclerView.Adapter() { @@ -70,7 +71,6 @@ class SaleAdapterNew( ) : RecyclerView.ViewHolder(binding.root) { fun bind(sale: Sale) { binding.apply { - // if (sale.reservedQuantity == null) sale.reservedQuantity = 0 val childLayoutManager = LinearLayoutManager(context!!, RecyclerView.HORIZONTAL, false) @@ -148,12 +148,15 @@ class SaleAdapterNew( layoutError.visibility = VISIBLE txtError.text = binding.root.context.getString(R.string.originalQuantity) + sale.originalQuantity + binding.addItem.visibility = VISIBLE } else { layoutError.visibility = GONE + binding.addItem.visibility = GONE + } - binding.deleteReserve.visibility = if (sale.isAdded == 1) VISIBLE else INVISIBLE + binding.deleteReserve.visibility = if (sale.isAdded == 1) VISIBLE else GONE if (sale.isAdded == 1) { layoutError.visibility = VISIBLE @@ -183,16 +186,7 @@ class SaleAdapterNew( View.GONE } - if (sale.isParent) {/* itemArticleItemFk.visibility = View.INVISIBLE - itemPackingText.visibility = View.INVISIBLE - itemPackingItemFk.visibility = View.INVISIBLE - itemArticleCel1.visibility = View.INVISIBLE - itemArticleCel2.visibility = View.INVISIBLE - itemArticleCel3.visibility = View.INVISIBLE - itemArticleQuantity.visibility = View.INVISIBLE - txtdeNew.visibility = View.INVISIBLE - itemArticleQuantityPicked.visibility = View.INVISIBLE - itemArticleQuantityLine3.visibility = View.VISIBLE*/ + if (sale.isParent) { packingTopicker.visibility = View.INVISIBLE quantityReserved.visibility = View.INVISIBLE itemArticleItemFkNew.visibility = View.INVISIBLE @@ -200,16 +194,7 @@ class SaleAdapterNew( imageErrorMessage.visibility = View.INVISIBLE ivArrow.visibility = View.VISIBLE - } else {/*itemArticleItemFk.visibility = View.VISIBLE - itemPackingText.visibility = View.VISIBLE - itemPackingItemFk.visibility = View.VISIBLE - itemArticleCel1.visibility = View.VISIBLE - itemArticleCel2.visibility = View.VISIBLE - itemArticleCel3.visibility = View.VISIBLE - itemArticleQuantity.visibility = View.VISIBLE - txtdeNew.visibility = View.VISIBLE - itemArticleQuantityPicked.visibility = View.VISIBLE - itemArticleQuantityLine3.visibility = View.VISIBLE*/ + } else { imageErrorMessage.visibility = View.GONE if (type != SACADOR && type != PREITEMPICKERTEST) { @@ -347,9 +332,12 @@ class SaleAdapterNew( } binding.itemParkingCode.text = - // if (type == PREITEMPICKERTEST) sale.parkingCodePrevia else sale.parkingCode - sale.parkingCodePrevia + // if (type == PREPARED) sale.parkingCodePrevia else sale.parkingCode + sale.parkingCode ?: sale.parkingCodePrevia + binding.addItem.setOnClickListener { + onAddItemClickListener!!.onAddItemClickListener(sale) + } println("parkingCodePrevia ${sale.parkingCodePrevia}") println("parkingCode ${sale.parkingCode}") diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionCheckerViewModel.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionCheckerViewModel.kt new file mode 100644 index 00000000..77ad2c28 --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionCheckerViewModel.kt @@ -0,0 +1,358 @@ +package es.verdnatura.presentation.view.feature.collection.fragment + +import android.content.Context +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.map +import com.google.gson.JsonObject +import es.verdnatura.MobileApplication +import es.verdnatura.domain.SalixCallback +import es.verdnatura.domain.formatWithQuotes +import es.verdnatura.domain.toast +import es.verdnatura.domain.userCases.GetItemFromBarcodeUseCase +import es.verdnatura.presentation.base.BaseViewModel +import es.verdnatura.presentation.base.getMessageFromAllResponse +import es.verdnatura.presentation.base.nameofFunction +import es.verdnatura.presentation.common.Event +import es.verdnatura.presentation.common.PickupResponse +import es.verdnatura.presentation.common.SaleTrackingReplaceSalix +import es.verdnatura.presentation.common.TicketState +import es.verdnatura.presentation.view.feature.collection.SalixSaleQuantity +import es.verdnatura.presentation.view.feature.collection.mapper.map +import es.verdnatura.presentation.view.feature.sacador.model.CollectionVO +import es.verdnatura.presentation.view.feature.sacador.model.MistakeTypeListVO +import es.verdnatura.presentation.view.feature.sacador.model.MistakeTypeVO +import es.verdnatura.presentation.view.feature.workermistake.model.SaleMistakeSalix +import retrofit2.Response + +class CollectionCheckerViewModel(val context: Context) : BaseViewModel(context) { + private val getItemFromBarcodeUseCase = GetItemFromBarcodeUseCase(salix) + + //var isPaused: Boolean = false + + private val _isPaused = MutableLiveData() + val isPaused: LiveData get() = _isPaused + + private val _collectionTicketList by lazy { MutableLiveData() } + val collectionTicketList: LiveData = _collectionTicketList + val loadTicketList: LiveData> = _collectionTicketList.map { Event(it) } + + private val _responseSaleReplace by lazy { MutableLiveData() } + val responseSaleReplace: LiveData = _responseSaleReplace + val loadSaleReplace: LiveData> = _responseSaleReplace.map { Event(it) } + + private val _responseCollectionAddItem by lazy { MutableLiveData() } + val responseCollectionAddItem: LiveData = _responseCollectionAddItem + val loadResponseAddItem: LiveData> = _responseCollectionAddItem.map { Event(it) } + + private val _responsePrint by lazy { MutableLiveData() } + val responsePrint: LiveData = _responsePrint + val loadPrint: LiveData> = _responsePrint.map { Event(it) } + + private val _responseTicketState by lazy { MutableLiveData() } + val responseTicketState: LiveData = _responseTicketState + val loadTicketState: LiveData> = _responseTicketState.map { Event(it) } + + private val _responseTicketIsPickup by lazy { MutableLiveData() } + val responseTicketIsPickup: LiveData = _responseTicketIsPickup + val loadTicketIsPickup: LiveData> = _responseTicketIsPickup.map { Event(it) } + + private val _responseTicketClosure by lazy { MutableLiveData() } + val responseTicketClosure: LiveData = _responseTicketClosure + val loadTicketClousure: LiveData> = _responseTicketClosure.map { Event(it) } + + private val _responseCollectionUnchecked by lazy { MutableLiveData() } + val responseCollectionUnchecked: LiveData = _responseCollectionUnchecked + val loadCollectionUnchecked: LiveData> = + _responseCollectionUnchecked.map { Event(it) } + + private val _responseNew by lazy { MutableLiveData() } + val responseNew: LiveData = _responseNew + val loadAddNew: LiveData> = _responseNew.map { Event(it) } + + private val _responseIncQuantity by lazy { MutableLiveData() } + val responseIncQuantity: LiveData = _responseIncQuantity + val loadIncQuantity: LiveData> = _responseIncQuantity.map { Event(it) } + + private val _responseParking by lazy { MutableLiveData() } + val responseParking: LiveData = _responseParking + val loadParking: LiveData> = _responseParking.map { Event(it) } + + private val _mistakeList by lazy { MutableLiveData() } + val mistakeList: LiveData = _mistakeList + val loadMistakes: LiveData> = _mistakeList.map { Event(it) } + + fun getSales( + collectionFk: Number, print: String, source: String + + ) { + salix.getSalesFromTicketOrCollection( + collectionOrTicketFk = collectionFk, print = print != "0", source = source + ).enqueue(object : SalixCallback(context) { + override fun onError(t: Throwable) { + _collectionTicketList.value = CollectionVO( + 0, + isError = true, + errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!) + ) + } + + override fun onSuccess(response: Response) { + try { + _collectionTicketList.value = response.body()?.let { it.map(context) } + } catch (ex: Exception) { + ex.toast(context) + } + + } + }) + } + + fun collectionGetId( + ticketFk: Int, print: String, type: String + ) { + salix.getCollectionId( + filter = """{"where":{"ticketFk":$ticketFk},"fields":"collectionFk"}""" + ).enqueue(object : SalixCallback>(context) { + override fun onError(t: Throwable) { + _collectionTicketList.value = CollectionVO( + 0, + isError = true, + errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!) + ) + } + + override fun onSuccess(response: Response>) { + + if (response.body()!!.isNotEmpty()) { + + getSales( + response.body()!![0].entrySet().first().value.toString().toInt(), + print, + type + ) + + } else { + _collectionTicketList.value = CollectionVO( + 0, isError = false + ) + } + } + }) + } + + fun saleTrackingUpdate( + saleFk: Int, + originalQuantity: Int, + code: String, + isChecked: String, + buyFk: Long, + isScanned: Boolean? + ) { + salix.saleTrackingUpdate( + SaleTrackingReplaceSalix( + saleFk, originalQuantity, code, isChecked != "0", buyFk, isScanned!! + ) + ).enqueue(object : SalixCallback(context) { + override fun onSuccess(response: Response) { + _responseSaleReplace.value = true + } + + override fun onError(t: Throwable) { + _responseSaleReplace.value = false + super.onError(t) + } + }) + } + + fun collectionStickerPrint( + collectionFk: Int, labelCount: Int? + ) { + salix.collectionStickerPrint( + arrayListOf( + collectionFk, labelCount + ) + ).enqueue(object : SalixCallback(context) { + override fun onSuccess(response: Response) { + _responsePrint.value = true + } + + }) + } + + fun collectionAddItem( + itemFk: Int, quantity: Int, ticketFk: Int + ) { + + salix.addSale( + id = ticketFk, barcode = itemFk.toString(), quantity = quantity + ).enqueue(object : SalixCallback(context) { + override fun onError(t: Throwable) { + + _responseNew.value = false + } + + override fun onSuccess(response: Response) { + _responseNew.value = true + + } + }) + } + + fun setParking( + ticketFk: Int, parking: String + ) { + salix.setParking(arrayListOf(ticketFk, parking).formatWithQuotes()) + .enqueue(object : SalixCallback(context) { + override fun onSuccess(response: Response) { + _responseParking.value = true + super.onSuccess(response) + } + }) + } + + fun ticketStateTodaySetState( + ticketFk: Int, state: String + ) { + salix.ticketStateTodaySetState(arrayListOf(ticketFk, state).formatWithQuotes()) + .enqueue(object : SalixCallback(context) { + override fun onSuccess(response: Response) { + _responseTicketState.value = TicketState() + super.onSuccess(response) + } + }) + } + + fun collectionIncreaseQuantitySalix( + saleFk: Int, quantity: String + ) { + salix.collectionIncreaseQuantitySalix( + SalixSaleQuantity(saleId = saleFk, quantity = quantity.toInt()) + ).enqueue(object : SalixCallback(context) { + + override fun onSuccess(response: Response) { + super.onSuccess(response) + _responseIncQuantity.value = true + } + }) + } + + fun saleMistakeAdd( + saleFk: Int, typeFk: Int + ) { + salix.saleMistakeAdd( + SaleMistakeSalix( + userFk = (context as MobileApplication).userId!!, saleFk = saleFk, typeFk = typeFk + ) + ).enqueue(object : SalixCallback(context) { + + }) + } + + fun mistakeType() { + salix.getMistakeTypes().enqueue(object : SalixCallback>(context) { + override fun onSuccess(response: Response>) { + if (response.body() != null) { + _mistakeList.value = response.body()?.let { MistakeTypeListVO(it) } + } else { + val listError: ArrayList = ArrayList() + listError.add(MistakeTypeVO(0, "")) + _mistakeList.value = MistakeTypeListVO(listError) + } + } + + }) + } + + fun ticketIsOutClosureZone( + ticketFk: Int + ) { + salix.ticketIsOutClosureZone( + arrayListOf(ticketFk) + ).enqueue(object : SalixCallback(context) { + override fun onSuccess(response: Response) { + _responseTicketClosure.value = response.body()?.toString() ?: "false" + + } + + }) + } + + fun ticketState( + ticketFk: Int + ) { + salix.ticketState( + """{"where": {"ticketFk": "$ticketFk"},"include":[{"relation":"user","scope":{"fields":["username"]}}]}""" + + ).enqueue(object : SalixCallback>(context) { + override fun onSuccess(response: Response>) { + _responseTicketState.value = if (response.body()!!.isEmpty()) { + TicketState() + } else { + response.body()!![0] + } + } + + }) + } + + fun ticketIsPickup( + ticketFk: Number + ) { + salix.ticketIsPickup( + """{ + "where": { + "id": $ticketFk + }, + "fields": ["id", "routeFk"], + "include": [ + { + "relation": "route", + "scope": { + "fields": ["id", "agencyModeFk"], + "include": { + "relation": "agencyMode", + "scope": { + "fields": ["id", "deliveryMethodFk","code"], + "where": {"code": "REC_ALG"}, + "include": { + "relation": "deliveryMethod", + "scope": { + "fields": ["id", "code"] + } + } + } + } + } + } + ] + }""".trim() + + ).enqueue(object : SalixCallback>(context) { + override fun onSuccess(response: Response>) { + + _responseTicketIsPickup.value = + response.body() + ?.firstOrNull()?.route?.agencyMode?.deliveryMethod?.code == "PICKUP" + + } + + }) + } + + fun hasUncheckedTicket( + collectionFk: Int + ) { + salix.hasUncheckedTicket(collectionFk).enqueue(object : SalixCallback(context) { + override fun onSuccess(response: Response) { + _responseCollectionUnchecked.value = response.body()!!.toString() + + } + }) + } + + fun setPausedState(paused: Boolean) { + _isPaused.value = paused + } + +} \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragment.kt index ab263c09..4c818e92 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragment.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragment.kt @@ -1,6 +1,5 @@ package es.verdnatura.presentation.view.feature.collection.fragment -import android.app.AlertDialog import android.content.Context import android.graphics.drawable.Drawable import android.media.MediaPlayer @@ -37,6 +36,7 @@ import es.verdnatura.domain.notNull import es.verdnatura.domain.toast import es.verdnatura.presentation.base.BaseFragment import es.verdnatura.presentation.common.ItemScanned +import es.verdnatura.presentation.common.LabelDialogHelper import es.verdnatura.presentation.common.OnBarcodeRowClickListener import es.verdnatura.presentation.common.OnMistakeClickListener import es.verdnatura.presentation.common.OnOptionsSelectedListener @@ -410,7 +410,7 @@ class CollectionFragment( if (!binding.scanInput.text.toString().isNullOrEmpty()) { binding.mainToolbar.toolbarIcons.visibility = VISIBLE //sergio:para ver si ha marcado dos veces el mismo ticket - binding.scanInput.setText(textScanned_filterDouble(binding.scanInput.text!!.toString())) + binding.scanInput.setText(textScannedFilterDouble(binding.scanInput.text!!.toString())) //de momento solo está el qr de artículo isScanned = @@ -969,7 +969,7 @@ class CollectionFragment( myGroupList },*/ saleAdapter = SaleAdapter( - myGroupList, + myGroupList as MutableList, pasillerosItemClickListener!!, object : OnQuantityClickListener { @@ -2035,7 +2035,7 @@ class CollectionFragment( "" + totalMark + "/" + total if (totalMark == sales.size) { - getString(R.string.Coleccióncompleta).toast(this.context, Toast.LENGTH_SHORT) + getString(R.string.completCollection).toast(this.context, Toast.LENGTH_SHORT) saleAdapter!!.notifyDataSetChanged() if (canChangeState) changeTicketState() @@ -2276,20 +2276,20 @@ class CollectionFragment( } } if (isTicket) { - val builder = AlertDialog.Builder(context) - builder.setTitle(getString(R.string.selectLabeltoPrint)) - val labelCount = arrayOf("1", "2", "3", "4", "5", "6", "7", "8", "9", "10") - builder.setItems(labelCount) { dialog, which -> - viewModel.collectionStickerPrint( - collectionFk = collection.collectionFk, labelCount = (which + 1) - ) - (getString(R.string.Imprimiendo) + mobileApplication.dataStoreApp.readDataStoreKey( - PRINTERNAME - )).toast(requireContext()) + val labelDialogHelper = LabelDialogHelper(requireContext()) + labelDialogHelper.showLabelDialog( + onItemSelected = { labelCount -> + viewModel.collectionStickerPrint( + collectionFk = collection.collectionFk, + labelCount = labelCount + ) + + (getString(R.string.Imprimiendo) + mobileApplication.dataStoreApp.readDataStoreKey( + PRINTERNAME + )).toast(requireContext()) + } + ) - } - val dialog = builder.create() - dialog.show() } else { viewModel.collectionStickerPrint( collectionFk = collection.collectionFk, null diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentChecker.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentChecker.kt new file mode 100644 index 00000000..587e8b19 --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentChecker.kt @@ -0,0 +1,1198 @@ +package es.verdnatura.presentation.view.feature.collection.fragment + +import android.content.Context +import android.graphics.drawable.Drawable +import android.media.MediaPlayer +import android.text.InputType.TYPE_CLASS_NUMBER +import android.view.KeyEvent +import android.view.KeyEvent.ACTION_DOWN +import android.view.View.GONE +import android.view.View.INVISIBLE +import android.view.View.VISIBLE +import android.view.WindowManager +import android.view.inputmethod.EditorInfo +import android.widget.ImageView +import android.widget.Toast +import androidx.recyclerview.widget.LinearLayoutManager +import com.google.gson.Gson +import es.verdnatura.R +import es.verdnatura.databinding.FragmentCollectionBinding +import es.verdnatura.domain.ConstAndValues +import es.verdnatura.domain.ConstAndValues.CONTROLADOR +import es.verdnatura.domain.ConstAndValues.PRINTERNAME +import es.verdnatura.domain.notNull +import es.verdnatura.domain.showToastCenterWithBackground +import es.verdnatura.domain.toast +import es.verdnatura.presentation.base.BaseFragment +import es.verdnatura.presentation.common.ItemScanned +import es.verdnatura.presentation.common.LabelDialogHelper +import es.verdnatura.presentation.common.OnBarcodeRowClickListener +import es.verdnatura.presentation.common.OnMistakeClickListener +import es.verdnatura.presentation.common.OnOptionsSelectedListener +import es.verdnatura.presentation.common.OnPackingClickListener +import es.verdnatura.presentation.common.OnPasillerosItemClickListener +import es.verdnatura.presentation.common.OnQuantityClickListener +import es.verdnatura.presentation.common.OnSaleClickListener +import es.verdnatura.presentation.common.OnTicketClickListener +import es.verdnatura.presentation.common.OnTicketColorListener +import es.verdnatura.presentation.common.ToolBarAdapterTooltip +import es.verdnatura.presentation.common.hideKeyboard +import es.verdnatura.presentation.common.itemScanIsQr +import es.verdnatura.presentation.common.itemScanValue +import es.verdnatura.presentation.view.component.CustomDialog +import es.verdnatura.presentation.view.component.CustomDialogInput +import es.verdnatura.presentation.view.component.CustomDialogList +import es.verdnatura.presentation.view.component.CustomDialogThreeButtons +import es.verdnatura.presentation.view.feature.articulo.adapter.BarcodeAdapter +import es.verdnatura.presentation.view.feature.articulo.model.BarcodeVO +import es.verdnatura.presentation.view.feature.collection.adapter.SaleAdapter +import es.verdnatura.presentation.view.feature.main.activity.MainActivity +import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO +import es.verdnatura.presentation.view.feature.sacador.model.CollectionVO +import es.verdnatura.presentation.view.feature.sacador.model.MistakeTypeVO +import es.verdnatura.presentation.view.feature.sacador.model.PlacementVO +import es.verdnatura.presentation.view.feature.sacador.model.SaleVO +import org.json.JSONObject + +// FALTA TESTEAR REVISORES DESPUÉS DE CAMPAÑA Y VER HOLDPOSITION +@Suppress("UNUSED_ANONYMOUS_PARAMETER") +class CollectionFragmentChecker( + var collection: CollectionVO = CollectionVO(0), var type: String = CONTROLADOR +) : BaseFragment(CollectionCheckerViewModel::class) { + + private var sales: List = listOf() + private var salesParent: List = listOf() + private var saleAdapter: SaleAdapter? = null + private var lm: LinearLayoutManager? = null + private var pasillerosItemClickListener: OnPasillerosItemClickListener? = null + private lateinit var customDialogList: CustomDialogList + private var placementSupplyAdapter: BarcodeAdapter? = null + private var listPlacementSupply: ArrayList = ArrayList() + private var storedShelvingPosition: Int = 0 + private lateinit var customDialogInput: CustomDialogInput + private lateinit var customDialogThreeButtons: CustomDialogThreeButtons + private var ticketSelected: Int = 0 + private lateinit var customDialog: CustomDialog + var mperror: MediaPlayer? = null + var mpok: MediaPlayer? = null + private var tickets: ArrayList = ArrayList() + private var mistakeSale: SaleVO? = null + private var positionIncreaseQuantity = 0 + private var quantityIncrease: Int = 0 + private var isMarking = false + private lateinit var ticketScanTxt: String + private var lastScanned: Int = 0 + private var buttonPushedGetCollection = false + private var isScanned: Boolean? = null + private var canChangeState = true + private var allTicketsChecked = false + private var myPosition = 0 + private var isMarkedSalePrevious = false + private var inPause = false + private var hasFilterByLevel = false + private lateinit var myGroupList: List + + companion object { + fun newInstance(collection: CollectionVO, type: String) = + CollectionFragmentChecker(collection, type) + } + + override fun onAttach(context: Context) { + if (context is OnPasillerosItemClickListener) pasillerosItemClickListener = context + super.onAttach(context) + } + + override fun getLayoutId(): Int = R.layout.fragment_collection + + override fun onResume() { + super.onResume() + scanRequest() + } + + override fun init() { + mperror = MediaPlayer.create((activity as MainActivity), R.raw.error) + mpok = MediaPlayer.create((activity as MainActivity), R.raw.ok) + customDialogList = CustomDialogList(requireContext()) + customDialogInput = CustomDialogInput(requireContext()) + customDialog = CustomDialog(requireContext()) + customDialogThreeButtons = CustomDialogThreeButtons(requireContext()) + ma.hideBottomNavigation(GONE) + setEvents() + setToolBar() + if (collection.tickets.isNotEmpty()) { + createCollectionList() + } + super.init() + } + + override fun onPause() { + super.onPause() + //viewModel.isPaused = true + viewModel.setPausedState(true) + + } + + private fun setToolBar() { + binding.mainToolbar.toolbarSubtitle.visibility = VISIBLE + binding.mainToolbar.toolbarIcons.visibility = VISIBLE + binding.mainToolbar.backButton.visibility = VISIBLE + binding.previaButton.visibility = INVISIBLE + binding.mainToolbar.toolbarTitle.text = + if (collection.collectionFk == 0) getString(R.string.review) else collection.collectionFk.toString() + + val listIcons: ArrayList = ArrayList() + val iconPrint = ImageView(context) + iconPrint.setImageResource(R.drawable.ic_print_black_24dp) + val iconAdd = ImageView(context) + iconAdd.setImageResource(R.drawable.ic_playlist_add_black_24dp) + val iconViewCollection = ImageView(context) + iconViewCollection.setImageResource(R.drawable.ic_collection) + val iconWorker = ImageView(context) + iconWorker.setImageResource(R.drawable.ic_worker) + val iconParking = ImageView(context) + iconParking.setImageResource(R.drawable.ic_local_parking_black_24dp) + val iconUpdate = ImageView(context) + iconUpdate.setImageResource(R.drawable.ic_autorenew_black_24dp) + + iconPrint.tooltipText = getTooltip(R.drawable.ic_print_black_24dp) + iconAdd.tooltipText = getTooltip(R.drawable.ic_playlist_add_black_24dp) + iconViewCollection.tooltipText = getTooltip(R.drawable.ic_collection) + iconParking.tooltipText = getTooltip(R.drawable.ic_local_parking_black_24dp) + iconUpdate.tooltipText = getTooltip(R.drawable.ic_autorenew_black_24dp) + + listIcons.add(iconPrint) + listIcons.add(iconViewCollection) + listIcons.add(iconWorker) + listIcons.add(iconAdd) + binding.previaButton.setOnClickListener { + showPrevia() + } + + + binding.mainToolbar.toolbarIcons.adapter = + ToolBarAdapterTooltip(listIcons, object : OnOptionsSelectedListener { + override fun onOptionsItemSelected(item: Drawable) { + if (collection.tickets.isNotEmpty()) + when (item) { + iconViewCollection.drawable -> getCollection() + iconPrint.drawable -> print() + iconAdd.drawable -> addItem() + iconWorker.drawable -> showUser() + iconUpdate.drawable -> updateScreen() + iconParking.drawable -> pasillerosItemClickListener?.onPasillerosItemClickListener( + PasillerosItemVO( + title = R.string.Parking + ), "" + ) + } + + } + }) + binding.mainToolbar.toolbarIcons.layoutManager = + LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false) + } + + private fun updateScreen() { + canChangeState = false + viewModel.getSales( + collection.collectionFk, print = "0", type + ) + } + + private fun markPrevia(saleGroupScanned: String) { + for (indice in sales.indices) { + if (!sales[indice].saleGroupFk.isNullOrEmpty() && sales[indice].saleGroupFk == saleGroupScanned) { + markLine(indice) + mpok!!.start() + + } + } + } + + private fun showPrevia() { + customDialogList.getEditText().setRawInputType(TYPE_CLASS_NUMBER) + customDialogList.setTitle(getString(R.string.scanPreviousTicket)) + .setOkButton(getString(R.string.end)) { + takeActionPrevia(customDialogList) + + }.setValue("").show() + + customDialogList.getEditText().requestFocus() + ma.hideKeyboard(customDialogList.getEditText()) + + customDialogList.getEditText().setOnEditorActionListener { v, actionId, event -> + if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) { + if (customDialogList.getValue().isNotEmpty()) { + isScanned = + event != null && event.action == ACTION_DOWN && event.keyCode == KeyEvent.KEYCODE_ENTER + takeActionPrevia(customDialogList) + } + customDialogList.setValue("") + ma.hideKeyboard(customDialogList.getEditText()) + return@setOnEditorActionListener true + } + false + } + hideKeyboard() + } + + private fun takeActionPrevia(customDialogList: CustomDialogList) { + println("previaaaa ${customDialogList.getValue()}") + + ma.hideKeyboard(customDialogList.getEditText()) + try { + val saleGroupScanned = itemScanValue( + customDialogList.getValue(), arrayOf("saleGroup"), "id" + ).toString() + + markPrevia(saleGroupScanned) + customDialogList.dismiss() + } catch (ex: Exception) { + ma.messageWithSound( + message = ex.message.toString(), isError = true, isPlayed = true, isToasted = true + ) + } + } + + private fun getCollection() { + + buttonPushedGetCollection = if (!buttonPushedGetCollection) { + viewModel.collectionGetId( + collection.collectionFk, print = "0", type + ) + true + } else { + viewModel.getSales( + lastScanned, print = "0", type + + ) + false + } + lastScanned = collection.collectionFk + } + + private fun scanRequest() { + binding.scanInput.requestFocus() + requireActivity().hideKeyboard() + } + + private fun showUser() { + + ma.onPasillerosItemClickListener( + PasillerosItemVO(title = R.string.titleUserControlVehicle), + collection.tickets[0].sales[0].workerFk + ) + + } + + private fun setEvents() { + + binding.mainToolbar.backButton.setOnClickListener { + ma.onMyBackPressed() + } + requireActivity().hideKeyboard() + binding.scanInput.requestFocus() + binding.scanInput.setOnEditorActionListener { v, actionId, event -> + if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) {//ID=0 ACTION_NEXT ID=5 ACTION_UNESPECEFIED) + if (binding.scanInput.text.toString().isNotEmpty()) { + + //sergio:para ver si ha marcado dos veces el mismo ticket + binding.scanInput.setText(textScannedFilterDouble(binding.scanInput.text!!.toString())) + isScanned = + event != null && event.action == ACTION_DOWN && event.keyCode == KeyEvent.KEYCODE_ENTER + + if (itemScanIsQr(binding.scanInput.text.toString())) { + + val myQr = ItemScanned(JSONObject(binding.scanInput.text.toString())) + + when (myQr.table) { + "saleGroup" -> { + markPrevia(myQr.id.toString()) + } + + "buy" -> binding.scanInput.setText(myQr.more) + "ticket" -> findSale(myQr.id.toString()) + } + + } else { + if (sales.any { it.saleGroupFk == binding.scanInput.text.toString() }) { + markPrevia(binding.scanInput.text.toString()) + } else { + findSale(binding.scanInput.text.toString()) + } + + } + + buttonPushedGetCollection = false + + } + binding.scanInput.setText("") + requireActivity().hideKeyboard() + return@setOnEditorActionListener true + } + true + } + requireActivity().hideKeyboard() + //No se pone source en la llamada para que no cambie el estado + binding.collectionSwipe.setOnRefreshListener { + canChangeState = false + isMarking = false + binding.collectionSwipe.isRefreshing = false + viewModel.getSales( + collection.collectionFk, print = "0", " " + ) + buttonPushedGetCollection = false + binding.collectionSwipe.isRefreshing = false + } + } + + override fun observeViewModel() { + with(viewModel) { + + loadTicketList.observe(viewLifecycleOwner) { event -> + event.getContentIfNotHandled().notNull { + + if (!it.isError) { + if (it.tickets.isNotEmpty()) { + collection = it + binding.previaButton.visibility = VISIBLE + binding.fragmentSacadorCollections.visibility = VISIBLE + createCollectionList() + } else { + + binding.mainToolbar.toolbarSubtitle.text = + getString(R.string.summaryCount, 0, 0) + binding.fragmentSacadorCollections.visibility = INVISIBLE + binding.previaButton.visibility = INVISIBLE + } + } else { + customDialog.setTitle(getString(R.string.error)) + .setDescription(it.errorMessage) + .setOkButton(getString(R.string.accept)) { + customDialog.dismiss() + if (activity != null) ma.onMyBackPressed() + }.show() + } + + } + } + loadTicketIsPickup.observe(viewLifecycleOwner) { event -> + event.getContentIfNotHandled().notNull { + if (it) { + val customDialogWarning = CustomDialog(requireContext()) + customDialogWarning.setTitle(getString(R.string.ticketPickup)) + customDialogWarning.setDescription( + getString( + R.string.ticketPickupDescr, + binding.mainToolbar.toolbarTitle.text + ) + ) + .setOkButton(getString(R.string.aware)) { + customDialogWarning.dismiss() + } + customDialogWarning.show() + + } + } + } + loadParking.observe(viewLifecycleOwner) { event -> + event.getContentIfNotHandled().notNull { + context.showToastCenterWithBackground( + getString( + R.string.parkingIn, + ticketScanTxt + ) + ) + } + } + + loadPrint.observe(viewLifecycleOwner) { event -> + event.getContentIfNotHandled().notNull { + (getString(R.string.Imprimiendo) + mobileApplication.dataStoreApp.readDataStoreKey( + PRINTERNAME + )).toast( + requireContext() + ) + } + + } + + loadAddNew.observe(viewLifecycleOwner) { event -> + event.getContentIfNotHandled().notNull { + if (!it) { + customDialog.setTitle(getString(R.string.disponibility)) + .setDescription(getString(R.string.errorCollectionNew)) + .setKoButton(getString(R.string.close)) { + scanRequest() + customDialog.dismiss() + }.show() + } else { + viewModel.getSales( + collection.collectionFk, print = "0", type + ) + + } + + } + } + + loadTicketState.observe(viewLifecycleOwner) { event -> + event.getContentIfNotHandled().notNull { + if ((it.code == "ON_CHECKING" || it.code == "CHECKED") && it.user.id != mobileApplication.userId) { + val customDialogWarningChecking = CustomDialog(requireContext()) + customDialogWarningChecking.setTitle(getString(R.string.info)) + customDialogWarningChecking.setDescription( + if (it.code == "ON_CHECKING") { + getString(R.string.checkingByUser, it.user.username) + } else { + getString(R.string.checkedByUser, it.user.username) + } + ).setOkButton(getString(R.string.aware)) { + customDialogWarningChecking.dismiss() + }.show() + } + } + } + + loadTicketClousure.observe(viewLifecycleOwner) { event -> + event.getContentIfNotHandled().notNull { + if (it.toBoolean()) { + val customDialogWarning = CustomDialog(requireContext()) + customDialogWarning.setTitle(getString(R.string.urgentWarning)) + customDialogWarning.setDescription(getString(R.string.ticketWarning)) + .setOkButton(getString(R.string.aware)) { + customDialogWarning.dismiss() + }.show() + } + } + } + + loadIncQuantity.observe(viewLifecycleOwner) { event -> + event.getContentIfNotHandled().notNull { + incresaseSuccesful() + } + } + + //sergio: para si hay algun ticket por revisar antes de parkinear + + loadCollectionUnchecked.observe(viewLifecycleOwner) { event -> + event.getContentIfNotHandled().notNull { + + //sergio: devuelve false si no hay para revisar y <> false. + if (it != "false") { + customDialog.setTitle(getString(R.string.warning)) + .setDescription(getString(R.string.pendingReviewParking) + (it)) + .setOkButton(getString(R.string.accept)) { + customDialog.dismiss() + + }.setKoButton(getString(R.string.review)) { + viewModel.getSales( + it.toInt(), print = "0", type + ) + customDialog.dismiss() + } + customDialog.show() + } else { + viewModel.setParking( + ticketFk = tickets[0].toInt(), parking = ticketScanTxt + ) + } + + } + } + + loadSaleReplace.observe(viewLifecycleOwner) { event -> + event.getContentIfNotHandled().notNull { + if (!it) { + viewModel.getSales( + collection.collectionFk, print = "0", type + ) + + } else { + checkStateParent() + setTotalLines() + setListPosition() + } + } + } + + loadMistakes.observe(viewLifecycleOwner) { event -> + event.getContentIfNotHandled().notNull { + showMistakeList(it.list) + } + } + + isPaused.observe(viewLifecycleOwner) { + inPause = it + } + + } + } + + //CREATE LIST + private fun createCollectionList() { + val salesList: ArrayList = ArrayList() + tickets = ArrayList() + var observations = "" + collection.tickets.forEach { ticket -> + ticket.sales.forEach { saleVO -> + salesList.add(saleVO) + if (tickets.firstOrNull { it == saleVO.ticketFk }.isNullOrEmpty()) tickets.add( + saleVO.ticketFk + ) + } + + observations = + observations.takeIf { it.isNotBlank() }?.plus(" ${ticket.observations}") ?: "" + } + + if (!buttonPushedGetCollection) { + sales = salesList.sortedWith(compareBy { it.picked }) + myGroupList = groupSaleGroup(salesList).sortedWith(compareBy { it.picked }) + } else { + sales = salesList.sortedWith( + compareBy({ it.isControlled }, { it.picked }) + ) + myGroupList = groupSaleGroup(salesList).sortedWith( + compareBy({ it.isControlled }, { it.picked }) + ) + } + + /*sales = salesList.sortedWith( + compareBy({ it.isControlled }, { it.picked }) + )*/ + + /* myGroupList = groupSaleGroup(salesList).sortedWith( + compareBy({ it.isControlled }, { it.picked }) + )*/ + + saleAdapter = SaleAdapter( + myGroupList as MutableList, + pasillerosItemClickListener!!, + object : OnQuantityClickListener { + override fun onQuantityClick(sale: SaleVO) { + + myGroupList.forEachIndexed { index, saleVO -> + if (saleVO.saleFk == sale.saleFk) { + showQuantityDialog(index) + } + } + + } + }, + object : OnSaleClickListener { + override fun onSaleClick(sale: SaleVO) { + + sales.forEachIndexed { index, saleVO -> + if (saleVO.saleFk == sale.saleFk) { + isScanned = false + markLine(index) + } + + } + } + + }, + object : OnMistakeClickListener { + override fun onMistakeClickListener(sale: SaleVO) { + + viewModel.mistakeType() + mistakeSale = sale + + } + }, + object : OnPackingClickListener { + override fun onPackingClick(sale: SaleVO) { + } + }, + object : OnTicketClickListener { + override fun onTicketClickListener(sale: SaleVO) { + + val entryPoint = Gson().toJson( + mutableMapOf( + "entryPoint" to sale.ticketFk, "web" to "${ + mobileApplication.dataStoreApp.getServerSalix() + }/#!/ticket/${sale.ticketFk}/sale" + ) + ) + ma.onPasillerosItemClickListener( + PasillerosItemVO( + title = R.string.titleWebViewer, + ), entryPoint = entryPoint + ) + + } + }, + type = type, + onTicketColorClickListener = object : OnTicketColorListener { + override fun onTicketColorListener(sale: SaleVO) { + hasFilterByLevel = !hasFilterByLevel + + if (hasFilterByLevel) { + if (buttonPushedGetCollection) { + saleAdapter!!.updateSales(myGroupList.filter { it.level == sale.level } as MutableList) + myGroupList = myGroupList.filter { it.level == sale.level } + } + } else { + createCollectionList() + } + + } + } + ) + + lm = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false) + binding.fragmentSacadorCollections.adapter = saleAdapter + binding.fragmentSacadorCollections.layoutManager = lm + setTotalLines() + printObservations(observations) + saleAdapter!!.notifyDataSetChanged() + } + + private fun printObservations(observations: String) { + if (observations.trim().isNotEmpty()) { + customDialog.setTitle(getString(R.string.observations)).setDescription(observations) + .setOkButton(getString(R.string.accept)) { + customDialog.hide() + customDialog.dismiss() + }.show() + } + } + + private fun findSale(txtscan: String) { + var index = 0 + var isBreak = false + var isOk = false + + + try { + for (saleVO in sales) { // sales no tiene parent + + if (saleVO.isControlled == "0") { + + if (txtscan == saleVO.itemFk.toString()) { + if (mpok != null) mpok!!.start() + isOk = true + markLine(index) + break + } + //2- Por barcode + saleVO.barcodes.forEach { barcode -> + + if (txtscan == barcode) { + if (mpok != null) mpok!!.start() + isOk = true + markLine(index) + isBreak = true + } + } + + if (isBreak) break + } + index += 1 + } + } catch (ex: Exception) { + getString(R.string.errorInput).toast(requireContext()) + } + if (!isOk) { + if (txtscan.contains("-")) { + + if (tickets.size > 0) { + + ticketScanTxt = txtscan + viewModel.hasUncheckedTicket( + collectionFk = tickets[0].toInt() + ) + } + + } else { + + isMarking = false + try { + val myScan = txtscan.toInt() + val hasItemSales = sales.any { + it.itemFk == txtscan.toInt() + } + if (!hasItemSales) { + binding.mainToolbar.toolbarTitle.text = txtscan + viewModel.getSales( + myScan, print = "0", "ON_CHECKING" + ) + viewModel.ticketIsOutClosureZone( + myScan + ) + viewModel.ticketState(myScan) + viewModel.ticketIsPickup(myScan) + + } else { + mperror!!.start() + } + + } catch (ex: Exception) { + + getString(R.string.errorInput).toast(requireContext()) + } + + } + } + } + + private fun markLine(position: Int) { + + //Falta averiguar la saleFk donde está y modificar si es la hija. + //Busco al padre y ya está y esa es la posición , se puede cambiar antes porque si falla haré un getSales + + val isParentPrevia = + myGroupList.any { it.saleGroupFk == sales[position].saleGroupFk && it.isParent } + + if (sales[position].saleGroupFk == null || sales[position].saleGroupFk == "" || !isParentPrevia) { + myPosition = myGroupList.indexOfFirst { it.saleFk == sales[position].saleFk } + myGroupList[myPosition].isControlled = + if (myGroupList[myPosition].isControlled == "1") "0" else "1" + isMarkedSalePrevious = false + } else { + //buscar padre y marcar position + val myPositionParent = + myGroupList.indexOfFirst { it.saleGroupFk == sales[position].saleGroupFk && it.isParent } + myPosition = myPositionParent + val myList = myGroupList[myPositionParent].sonSales + val myPositionSon = myList.indexOfFirst { it.saleFk == sales[position].saleFk } + + myGroupList[myPositionParent].sonSales[myPositionSon].isControlled = + if (myGroupList[myPositionParent].sonSales[myPositionSon].isControlled == "1") "0" else "1" + isMarkedSalePrevious = true + + } + viewModel.saleTrackingUpdate( + saleFk = sales[position].saleFk, + isChecked = sales[position].isControlled, + originalQuantity = sales[position].pickedQuantity!!, + code = "CHECKED", + buyFk = 0, + isScanned = isScanned + + ) + checkStateParent() + saleAdapter!!.notifyItemChanged(myPosition) + canChangeState = true + isMarking = true + } + + private fun checkStateParent() { + for (s in myGroupList) { + if (s.isParent) { + val totalLines = s.sonSales.size + val isPreviousPrepared = s.sonSales.filter { it.isPreviousPrepared == "1" }.size + val isPrepared = s.sonSales.filter { it.isPrepared == "1" }.size + val isControlled = s.sonSales.filter { it.isControlled == "1" }.size + val isPreControlled = s.sonSales.filter { it.isPreControlled == "1" }.size + if (totalLines == isPreviousPrepared) { + s.isPreviousPrepared = "1" + } else { + s.isPreviousPrepared = "0" + } + if (totalLines == isPrepared) { + s.isPrepared = "1" + } else { + s.isPrepared = "0" + } + if (totalLines == isControlled) { + s.isControlled = "1" + } else { + s.isControlled = "0" + } + if (totalLines == isPreControlled) { + s.isPreControlled = "1" + } else { + s.isPreControlled = "0" + } + + } + } + + } + + private fun setListPosition() { + + if (inPause) { + //viewModel.isPaused = false + viewModel.setPausedState(false) + } else { + if (mobileApplication.dataStoreApp.readDataStoreKey( + ConstAndValues.HOLDPOSITION + ) + ) { + if (!myGroupList[myPosition].isParent) { // si no es previa movemos + + /* lm!!.scrollToPositionWithOffset(myPosition, 0) + } else {*/ + lm!!.scrollToPositionWithOffset( + if (myGroupList[myPosition].isControlled == "1") myPosition + 1 else myPosition, + 0 + ) + //} + + } else { + lm!!.scrollToPositionWithOffset(myPosition, 0) + } + } + } + } + + private fun reviewQuantityForRefreshingAndSorting( + quantityTotal: Int, quantityPicked: Int + ) { + + if (quantityPicked < quantityTotal) { + + viewModel.getSales( + collection.collectionFk, print = "0", "ON_CHECKING" + ) + + } else { + setListPosition() + } + + } + + private fun print() { + + if (ma.havePrinter() && ma.haveSector()) { + showDialogLabelCount() + + } else { + + ma.messageWithSound( + getString(R.string.printerFault), + isError = true, + true, + getString(R.string.printError), + false + ) + + } + + } + + private fun addItem() { + listPlacementSupply = ArrayList() + collection.tickets.forEach { + listPlacementSupply.add(BarcodeVO(code = it.ticketFk)) + } + if (listPlacementSupply.size == 1) { + ticketSelected = listPlacementSupply[0].code!!.toInt() + } + customDialogList.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) + customDialogList.getEditTextTwo().inputType = TYPE_CLASS_NUMBER + customDialogList.getEditText().setRawInputType(TYPE_CLASS_NUMBER) + customDialogList.setTitle(getString(R.string.Agregarartículoparaticket) + " " + ticketSelected) + .setOkButton(getString(R.string.Agregar)) { + + if (ticketSelected == 0) { + getString(R.string.Seleccionaunticketdelaista).toast(requireContext()) + } else if (customDialogList.getValue().isEmpty() || customDialogList.getValueTwo() + .isEmpty() + ) { + getString(R.string.Todosloscampossonobligatorios).toast(requireContext()) + } else { + + viewModel.collectionAddItem( + itemFk = customDialogList.getValue().toInt(), + ticketFk = ticketSelected, + quantity = customDialogList.getValueTwo().toInt() + ) + + + scanRequest() + customDialogList.dismiss() + } + + }.setKoButton(getString(R.string.close)) { + scanRequest() + customDialogList.dismiss() + }.setHintValue(getString(R.string.Artículo)).setValue("") + .setHintValueTwo(getString(R.string.Cantidad)).setValueTwo("").show() + customDialogList.getEditText().requestFocus() + requireActivity().hideKeyboard() + + customDialogList.getEditText().setOnEditorActionListener { v, actionId, event -> + if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) { + if (customDialogList.getValue().isNotEmpty()) { + try { + customDialogList.setValue( + itemScanValue( + customDialogList.getValue(), arrayOf("buy"), "more" + ).toString() + ) + + } catch (e: Exception) { + ma.messageWithSound(e.message.toString(), isError = true, isPlayed = true) + } + customDialogList.getEditTextTwo().requestFocus() + } + //requireActivity().hideKeyboard() + return@setOnEditorActionListener true + + } + false + + } + + + customDialogList.getEditTextTwo().setOnEditorActionListener { v, actionId, event -> + if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) { + if (customDialogList.getValueTwo().isNotEmpty()) { + if (ticketSelected == 0) { + getString(R.string.Seleccionaunticketdelaista).toast(requireContext()) + } else if (customDialogList.getValue() + .isEmpty() || customDialogList.getValueTwo().isEmpty() + ) { + getString(R.string.Todosloscampossonobligatorios).toast(requireContext()) + } else { + + viewModel.collectionAddItem( + itemFk = customDialogList.getValue().toInt(), + ticketFk = ticketSelected, + quantity = customDialogList.getValueTwo().toInt(), + ) + scanRequest() + customDialogList.dismiss() + } + } + requireActivity().hideKeyboard() + return@setOnEditorActionListener true + } + false + } + + placementSupplyAdapter = + BarcodeAdapter(listPlacementSupply, object : OnBarcodeRowClickListener { + override fun onBarcodeRowClickListener(item: BarcodeVO) { + customDialogInput.setTitle(getString(R.string.ArtículoparaTicket) + " " + item.code!!) + ticketSelected = item.code!!.toInt() + customDialogList.setTitle(getString(R.string.Agregarartículoparaticket) + " " + ticketSelected) + } + }, showDelete = false) + + customDialogList.getRecyclerView().adapter = placementSupplyAdapter + + customDialogList.getRecyclerView().layoutManager = + LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false) + + } + + private fun setTotalLines() { + + val totalMark = sales.count { (it.isControlled == "1") && !it.isParent } + binding.mainToolbar.toolbarTitle.text = + collection.collectionFk.takeIf { it != 0 }?.toString() ?: "" + binding.mainToolbar.toolbarSubtitle.text = + getString(R.string.summaryCount, totalMark, sales.size) + + if (totalMark == sales.size) { + getString(R.string.completCollection).toast(this.context, Toast.LENGTH_SHORT) + // saleAdapter!!.notifyDataSetChanged() + + if (canChangeState) changeTicketState() + } else { + if (allTicketsChecked) { + + sales.forEach { + if (it.isControlled == "0") { + viewModel.ticketStateTodaySetState( + ticketFk = it.ticketFk.toInt(), state = "ON_CHECKING" + ) + } + } + allTicketsChecked = false + } + } + } + + private fun showQuantityDialog(position: Int) { + try { + + customDialogThreeButtons.setDescription(getString(R.string.itemSaleQuantity)) + .setValue("").setOkButtonAdd(getString(R.string.modify)) { + try { + increaseQuantity(position, customDialogThreeButtons.getValue().toInt()) + scanRequest() + customDialogThreeButtons.dismiss() + } catch (ex: Exception) { + ma.messageWithSound( + message = getString(R.string.errorInputQuantity), + isPlayed = true, + isError = true, + isToasted = true + ) + } + + }.setKoButton(getString(R.string.cancel)) { + scanRequest() + customDialogThreeButtons.dismiss() + }.show() + customDialogThreeButtons.setFocusDialogValue() + } catch (ex: Exception) { + getString(R.string.errorInput).toast(requireContext()) + } + } + + private fun incresaseSuccesful() { + try { + sales[positionIncreaseQuantity].quantity = quantityIncrease + + } catch (e: Exception) { + e.message!!.toast(requireContext()) + } + saleAdapter?.notifyDataSetChanged() + sales[positionIncreaseQuantity].originalQuantity = quantityIncrease + } + + private fun increaseQuantity(position: Int, quantity: Int) { + positionIncreaseQuantity = position + quantityIncrease = quantity + viewModel.collectionIncreaseQuantitySalix( + saleFk = sales[position].saleFk, quantity = quantity.toString() + ) + + } + + private fun changeTicketState() { + if (!inPause) tickets.forEach { + viewModel.ticketStateTodaySetState( + ticketFk = it.toInt(), state = "CHECKED" + ) + } + allTicketsChecked = true + + } + + private fun showErrorMessage(text: String) { + customDialog.setTitle(getString(R.string.errorMarkLine)).setDescription(text) + .setKoButton(getString(R.string.close)) { + customDialog.dismiss() + }.show() + } + + private fun showDialogLabelCount() { + var isTicket = false + for (t in collection.tickets) { + if (t.ticketFk.toInt() == (collection.collectionFk)) { + isTicket = true + } + } + if (isTicket) { + val labelDialogHelper = LabelDialogHelper(requireContext()) + labelDialogHelper.showLabelDialog( + onItemSelected = { labelCount -> + viewModel.collectionStickerPrint( + collectionFk = collection.collectionFk, + labelCount = labelCount + ) + val printerName = + mobileApplication.dataStoreApp.readDataStoreKey(PRINTERNAME) + (getString(R.string.Imprimiendo) + printerName).toast(requireContext()) + } + ) + + } else { + viewModel.collectionStickerPrint( + collectionFk = collection.collectionFk, null + ) + + } + + } + + private fun showMistakeList(list: List) { + customDialogInput.dismiss() + listPlacementSupply = ArrayList() + list.forEach { + listPlacementSupply.add(BarcodeVO(code = it.description)) + } + + customDialogList.setTitle(getString(R.string.errorCause)) + customDialogList.hideTextInput().setKoButton(getString(R.string.cancel)) { + scanRequest() + requireActivity().hideKeyboard() + listPlacementSupply.clear() + customDialogList.dismiss() + + }.show() + + placementSupplyAdapter = + BarcodeAdapter(listPlacementSupply, object : OnBarcodeRowClickListener { + override fun onBarcodeRowClickListener(item: BarcodeVO) { + list.forEach { + if (it.description == item.code) { + + viewModel.saleMistakeAdd( + saleFk = mistakeSale?.saleFk!!, typeFk = it.id + ) + + getString(R.string.errorRegistered).toast(requireContext()) + customDialogList.dismiss() + } + } + + } + }, showDelete = false) + + customDialogList.getRecyclerView().adapter = placementSupplyAdapter + + customDialogList.getRecyclerView().layoutManager = + LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false) + } + + private fun groupSaleGroup(salesList: ArrayList): MutableList { + val myMap = salesList.groupBy { it.saleGroupFk } + val myList: MutableList = mutableListOf() + + for ((key, value) in myMap.entries) { + if (key.isNullOrEmpty()) { // si no tiene saleGroup se añaden las líneas + for (s in value) { + myList.add(s) + } + } else { // si tiene saleGroup se crea el padre con el tamaño e indicando que es padre, como ejemplo se toma el primer elemento + /*crea padre*/ + if (value.size > 1) { + val mySale = SaleVO( + saleOrder = value[0].saleOrder, + workerFk = value[0].workerFk, + originalQuantity = null, + quantity = null, + rgb = null, + saleFk = value[0].saleFk, + saleGroupFk = value[0].saleGroupFk, + isPreControlled = value[0].isPreControlled, + isPrepared = value[0].isPrepared, + isPreviousPrepared = value[0].isPreviousPrepared, + isControlled = value[0].isControlled, + line3 = value[0].code ?: "", //6676 + picked = value[0].picked, + ticketFk = value[0].ticketFk, + level = value[0].level + )//prime elemento//hay que hacer una copia si no queda la referencia + mySale.totalSales = value.size //total líneas + mySale.isParent = true + value as MutableList + mySale.sonSales = + value.sortedWith(compareBy { it.picked }) as MutableList + mySale.line1 = "Previa: ${mySale.saleGroupFk}" + mySale.line2 = "Líneas: ${value.size}" + mySale.line3 = value[0].code ?: "" + mySale.placements = listOf(PlacementVO(shelving = value[0].code ?: "")) + + myList.add(mySale) + } else { + for (s in value) { + myList.add(s) + } + } + + } + + } + return myList + } +} \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentCheckerPreviousNew.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentCheckerPreviousNew.kt new file mode 100644 index 00000000..75a1b15f --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentCheckerPreviousNew.kt @@ -0,0 +1,870 @@ +package es.verdnatura.presentation.view.feature.collection.fragment + +import android.content.Context +import android.graphics.drawable.Drawable +import android.media.MediaPlayer +import android.os.Bundle +import android.text.InputType +import android.view.KeyEvent +import android.view.View +import android.view.WindowManager +import android.view.inputmethod.EditorInfo +import android.widget.EditText +import android.widget.ImageView +import android.widget.Toast +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.google.gson.Gson +import es.verdnatura.R +import es.verdnatura.databinding.FragmentCollectionNewBinding +import es.verdnatura.domain.ConstAndValues.BASEURLSALIX +import es.verdnatura.domain.ConstAndValues.SECTORFK +import es.verdnatura.domain.notNull +import es.verdnatura.domain.showToastCenterWithBackground +import es.verdnatura.domain.toast +import es.verdnatura.presentation.base.BaseFragment +import es.verdnatura.presentation.common.ItemScanned +import es.verdnatura.presentation.common.OnBarcodeRowClickListener +import es.verdnatura.presentation.common.OnMistakeClickListener +import es.verdnatura.presentation.common.OnOptionsSelectedListener +import es.verdnatura.presentation.common.OnPackingClickSaleListener +import es.verdnatura.presentation.common.OnPasillerosItemClickListener +import es.verdnatura.presentation.common.OnSaleClickSaleListener +import es.verdnatura.presentation.common.OnTicketClickSaleListener +import es.verdnatura.presentation.common.ToolBarAdapterTooltip +import es.verdnatura.presentation.common.hideKeyboard +import es.verdnatura.presentation.common.itemScanIsQr +import es.verdnatura.presentation.common.itemScanValue +import es.verdnatura.presentation.view.component.CustomDialog +import es.verdnatura.presentation.view.component.CustomDialogInput +import es.verdnatura.presentation.view.component.CustomDialogList +import es.verdnatura.presentation.view.component.CustomDialogThreeButtons +import es.verdnatura.presentation.view.feature.articulo.adapter.BarcodeAdapter +import es.verdnatura.presentation.view.feature.articulo.model.BarcodeVO +import es.verdnatura.presentation.view.feature.collection.ItemVO +import es.verdnatura.presentation.view.feature.collection.adapter.SaleAdapterNew +import es.verdnatura.presentation.view.feature.collection.mapper.map +import es.verdnatura.presentation.view.feature.main.activity.MainActivity +import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO +import es.verdnatura.presentation.view.feature.sacador.model.CollectionTicket +import es.verdnatura.presentation.view.feature.sacador.model.Sale +import es.verdnatura.presentation.view.feature.sacador.model.SaleVO +import kotlinx.coroutines.runBlocking +import org.json.JSONObject + +@Suppress("UNUSED_ANONYMOUS_PARAMETER") +class CollectionFragmentCheckerPreviousNew( +) : BaseFragment( + CollectionViewModelCheckerPreviosNew::class +) { + private var sales: List = listOf() + private var saleAdapter: SaleAdapterNew? = null + private var lm: LinearLayoutManager? = null + private var storedPosition: Int = 0 + private var pasillerosItemClickListener: OnPasillerosItemClickListener? = null + private lateinit var customDialogList: CustomDialogList + private var placementSupplyAdapter: BarcodeAdapter? = null + private var listPlacementSupply: ArrayList = ArrayList() + private lateinit var customDialogInput: CustomDialogInput + private lateinit var customDialogThreeButtons: CustomDialogThreeButtons + private lateinit var customDialogThreeButtonsQuantity: CustomDialogThreeButtons + private var ticketSelected: Int = 0 + private lateinit var customDialog: CustomDialog + var mperror: MediaPlayer? = null + var mpok: MediaPlayer? = null + private var storedBackPosition: Int = 0 + private var tickets: ArrayList = ArrayList() + private var lastScanned: Int = 0 + private var positionUnmarked = -1 + private var isScanned: Boolean? = null + private var positionConfirm = 0 + private var quantityConfirm = 0 + private lateinit var myGroupList: List + private var quantityReserveToCheckItemScan = 0 + private lateinit var collection: CollectionTicket + + companion object { + fun newInstance( + ) = CollectionFragmentCheckerPreviousNew() + } + + override fun onAttach(context: Context) { + if (context is OnPasillerosItemClickListener) pasillerosItemClickListener = context + super.onAttach(context) + } + + override fun getLayoutId(): Int = R.layout.fragment_collection_new + + override fun onCreate(savedInstanceState: Bundle?) { + mperror = MediaPlayer.create((activity as MainActivity), R.raw.error) + mpok = MediaPlayer.create((activity as MainActivity), R.raw.ok) + super.onCreate(savedInstanceState) + } + + override fun onResume() { + super.onResume() + scanRequest() + } + + override fun init() { + customDialogList = CustomDialogList(requireContext()) + customDialogInput = CustomDialogInput(requireContext()) + customDialog = CustomDialog(requireContext()) + customDialogThreeButtons = CustomDialogThreeButtons(requireContext()) + customDialogThreeButtonsQuantity = CustomDialogThreeButtons(requireContext()) + ma.hideBottomNavigation(View.GONE) + setEvents() + setToolBar() + if (::collection.isInitialized) { + viewModel.getCollectionTickets( + collection.collectionFk, print = false + ) + } + + super.init() + } + + private fun setToolBar() { + binding.mainToolbar.toolbarSubtitle.visibility = View.VISIBLE + binding.mainToolbar.toolbarIcons.visibility = View.VISIBLE + binding.mainToolbar.backButton.visibility = View.VISIBLE + binding.mainToolbar.toolbarTitle.text = getString(R.string.preControlNew) + + val listIcons: ArrayList = ArrayList() + val iconAdd = ImageView(context) + iconAdd.setImageResource(R.drawable.ic_playlist_add_black_24dp) + val iconParking = ImageView(context) + iconParking.setImageResource(R.drawable.ic_local_parking_black_24dp) + val iconUpdate = ImageView(context) + iconUpdate.setImageResource(R.drawable.ic_autorenew_black_24dp) + + iconAdd.tooltipText = getTooltip(R.drawable.ic_playlist_add_black_24dp) + iconParking.tooltipText = getTooltip(R.drawable.ic_local_parking_black_24dp) + iconUpdate.tooltipText = getTooltip(R.drawable.ic_autorenew_black_24dp) + + listIcons.add(iconAdd) + listIcons.add(iconParking) + listIcons.add(iconUpdate) + + binding.mainToolbar.toolbarIcons.adapter = + ToolBarAdapterTooltip(listIcons, object : OnOptionsSelectedListener { + override fun onOptionsItemSelected(item: Drawable) { + + when (item) { + iconAdd.drawable -> addItem() + iconUpdate.drawable -> updateScreen() + iconParking.drawable -> pasillerosItemClickListener?.onPasillerosItemClickListener( + PasillerosItemVO( + title = R.string.Parking + ), "" + ) + } + + } + }) + binding.mainToolbar.toolbarIcons.layoutManager = + LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false) + } + + private fun updateScreen() { + viewModel.getCollectionTickets( + collection.collectionFk, print = false + ) + } + + private fun scanRequest() { + binding.scanInput.requestFocus() + hideKeyboards() + } + + private fun setEvents() { + + binding.mainToolbar.backButton.setOnClickListener { + ma.onMyBackPressed() + } + //ESCANER ========= + + binding.scanInput.requestFocus() + binding.scanInput.setOnEditorActionListener { v, actionId, event -> + if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) {//ID=0 ACTION_NEXT ID=5 ACTION_UNESPECEFIED) + if (binding.scanInput.text.toString().isNotEmpty()) { + binding.scanInput.setText(textScannedFilterDouble(binding.scanInput.text!!.toString())) + isScanned = + event != null && event.action == KeyEvent.ACTION_DOWN && event.keyCode == KeyEvent.KEYCODE_ENTER + if (itemScanIsQr(binding.scanInput.text.toString())) { + val myQr = ItemScanned(JSONObject(binding.scanInput.text.toString())) + when (myQr.table) { + "saleGroup" -> { + binding.scanInput.setText(myQr.id.toString()) + } + + "buy" -> binding.scanInput.setText(myQr.more) + } + + } else { + ma.hideKeyboard(binding.scanInput) + if (::collection.isInitialized) { + findSale(binding.scanInput.text.toString()) + } else { + viewModel.getCollectionTickets( + collectionFk = binding.scanInput.text.toString().toLong(), false + ) + } + } + } + binding.scanInput.setText("") + hideKeyboards() + return@setOnEditorActionListener true + } + true + } + + hideKeyboards() + + //LISTA ========= + binding.collectionSwipe.setOnRefreshListener { + binding.collectionSwipe.isRefreshing = false + updateScreen() + binding.collectionSwipe.isRefreshing = false + + } + } + + private fun hideKeyboards() { + try { + requireActivity().hideKeyboard() + } catch (e: Exception) { + println(e.message) + } + } + + override fun observeViewModel() { + + with(viewModel) { + + loadCollectionTicketSalix.observe(viewLifecycleOwner) { event -> + event.getContentIfNotHandled().notNull { + if (!it.isError) { + + if (it.tickets.isNotEmpty()) { + collection = it + createCollectionList() + + } else { + binding.mainToolbar.toolbarSubtitle.text = "0/0" + } + } else { + customDialog.setTitle(getString(R.string.error)) + .setDescription(it.errorMessage) + .setOkButton(getString(R.string.accept)) { + customDialog.dismiss() + if (activity != null) ma.onMyBackPressed() + }.show() + } + + } + } + loadExistsResponse.observe(viewLifecycleOwner) { event -> + event.getContentIfNotHandled().notNull { + if (it.exists) { + markLine(it.position, it.quantity, true) + } else { + getString(R.string.updateSalesReserve).toast( + requireContext() + ) + viewModel.getCollectionTickets(collection.collectionFk, false) + } + } + } + + loadResponseAddItem.observe(viewLifecycleOwner) { event -> + event.getContentIfNotHandled().notNull { + updateScreen() + } + + } + + loadPicked.observe(viewLifecycleOwner) { event -> + event.getContentIfNotHandled().notNull { + myGroupList[positionConfirm].isPicked = 1 + saleAdapter!!.notifyItemChanged(positionConfirm) + lm!!.scrollToPositionWithOffset(positionConfirm, 0) + //lm!!.scrollToPositionWithOffset(storedBackPosition + 1, 0) + setTotalLines() + + } + } + + loadUnpicked.observe(viewLifecycleOwner) { event -> + event.getContentIfNotHandled().notNull { + + myGroupList[positionUnmarked].isPicked = 0 + myGroupList[positionUnmarked].reservedQuantity = quantityConfirm + saleAdapter!!.notifyItemChanged(positionUnmarked) + lm!!.scrollToPositionWithOffset(positionUnmarked, 0) + + } + } + + responseCode.observe(viewLifecycleOwner) { + + if (it == null) { + showErrorMessage(text = getString(R.string.codeNotExist)) + if (mperror != null) mperror?.start() + } else { + if (checkItemScan(it.toString(), positionConfirm)) { + scanRequest() + customDialogList.dismiss() + mpok?.start() + markLine(positionConfirm, quantityReserveToCheckItemScan, false) + } else { + customDialogList.setValueTwo("") + showErrorMessage(text = getString(R.string.lineNotExist)) + if (mperror != null) mperror?.start() + } + } + + } + + } + } + + private fun createCollectionList() { + binding.mainToolbar.toolbarTitle.text = collection.collectionFk.toString() + + collection.map(requireContext()) + val salesList: ArrayList = ArrayList() + + tickets = ArrayList() + var observations = "" + + collection.tickets.forEach { ticket -> + + if (observations.isNotEmpty()) observations = observations + " " + ticket.observations + ticket.sales.forEach { sale -> + + salesList.add(sale) + } + } + + myGroupList = + salesList.sortedWith(compareBy { it.pickingOrderPrevia }.thenBy { it.itemFk }) + saleAdapter = SaleAdapterNew(myGroupList, pasillerosItemClickListener!!, + + object : OnSaleClickSaleListener { + override fun onSaleClick(sale: Sale) { + + val position = + myGroupList.indexOfFirst { it.itemShelvingSaleFk == sale.itemShelvingSaleFk } + if (position > -1) { + if (sale.isPicked == 1) { + unMarkLine(position, myGroupList[position]) + } else { + showScanner(position, sale) + } + } + + } + + }, object : OnMistakeClickListener { + override fun onMistakeClickListener(sale: SaleVO) { + } + }, object : OnPackingClickSaleListener { + override fun onPackingClick(sale: Sale) { + + if (!sale.code.isNullOrEmpty()) ma.onPasillerosItemClickListener( + PasillerosItemVO( + title = R.string.titleUbicator, + ), entryPoint = sale.code + ) + } + }, object : OnTicketClickSaleListener { + override fun onTicketClickListener(sale: Sale) { + val entryPoint = Gson().toJson( + mutableMapOf( + "entryPoint" to sale.ticketFk, "web" to "${ + mobileApplication.dataStoreApp.readDataStoreKey( + BASEURLSALIX + ) + }/#!/ticket/${sale.ticketFk}/sale" + ) + ) + ma.onPasillerosItemClickListener( + PasillerosItemVO( + title = R.string.titleWebViewer, + ), entryPoint = entryPoint + ) + } + }, type = "PRESACADOR" + ) + + + lm = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false) + binding.fragmentSacadorCollections.adapter = saleAdapter + binding.fragmentSacadorCollections.layoutManager = lm + + setTotalLines() + setListPosition() + setScrollListener(lm!!) + printObservations(observations) + } + + private fun setScrollListener(lm: LinearLayoutManager) { + binding.fragmentSacadorCollections.clearOnScrollListeners() + binding.fragmentSacadorCollections.addOnScrollListener(object : + RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + // storedBackPosition = lm.findFirstVisibleItemPosition() + storedPosition = lm.findFirstVisibleItemPosition() + super.onScrolled(recyclerView, dx, dy) + } + }) + } + + private fun printObservations(observations: String) { + if (observations.trim().isNotEmpty()) { + customDialog.setTitle(getString(R.string.observations)).setDescription(observations) + .setOkButton(getString(R.string.accept)) { + customDialog.hide() + customDialog.dismiss() + }.show() + } + } + + private fun findSale(txtscan: String) { + /* + for (tickets in collection.tickets) { + //0-Salegroup + for (sale in tickets.sales){ + if (sale == "0") { + //1- Por itemFk + if (txtscan == saleVO.itemFk.toString()) { + if (mpok != null) mpok!!.start() + isOk = true + markLine(index, type) + break + } + //2- Por barcode + if (saleVO.barcodes.isNotEmpty()) + saleVO.barcodes.forEach { barcode -> + + if (txtscan == barcode) { + if (mpok != null) mpok!!.start() + isOk = true + markLine(index, type) + isBreak = true + } + } + + if (isBreak) break + } + index += 1 + } + */ + } + + private fun findSale(txtscan: String, position: Int, sale: Sale) { + + storedPosition = position + + if (sale.code!!.uppercase() == txtscan.uppercase()) { + mpok!!.start() + printShelvingResult(position) + } else { + mperror!!.start() + } + + } + + private fun markLine(position: Int, quantity: Int, isItemShelvingSaleEmpty: Boolean?) { + + isScanned = null + positionConfirm = position + quantityConfirm = quantity + + runBlocking { + val sectorFk = mobileApplication.dataStoreApp.readDataStoreKey(SECTORFK) + viewModel.itemShelvingSaleSetQuantity( + myGroupList[position].itemShelvingSaleFk, + quantity, + isItemShelvingSaleEmpty = isItemShelvingSaleEmpty, + sectorFk = if (sectorFk == -1) null else sectorFk, + shelvingFk = myGroupList[position].code!! + ) + } + // storedBackPosition = position + + } + + private fun setListPosition() { + + //if (storedPosition == 0 && storedBackPosition == 0) { // se inicia lista, se busca porqué item vamos. + if (storedPosition == 0) { + for (indice in myGroupList.indices) { + if (myGroupList[indice].isPicked == 0) { + //storedPosition = indice + lm!!.scrollToPositionWithOffset(indice - 1, 0) + break + } + } + + } else { + // lm!!.scrollToPositionWithOffset(storedBackPosition, 0) + lm!!.scrollToPositionWithOffset(storedPosition, 0) + } + } + + private fun unMarkLine(position: Int, sale: Sale) { + + customDialog.setTitle(getString(R.string.unmarkLine)).setDescription( + getString(R.string.goUnmark) + sale.itemFk + getString( + R.string.sure + ) + ).setOkButton(getString(R.string.unmark)) { + if (!sale.isParent && sale.reservedQuantity == 0 && sale.originalQuantity != sale.saleQuantity) { + getString(R.string.unmarkError).toast(requireContext()) + } else { + //storedBackPosition = position + //storedPosition = position + // setListPosition() + viewModel.itemShelvingSaleUnpicked(myGroupList[position].itemShelvingSaleFk) + sale.isPicked = 0 + positionUnmarked = position + setTotalLines() + scanRequest() + } + + + customDialog.dismiss() + }.setKoButton(getString(R.string.cancel)) { + scanRequest() + customDialog.dismiss() + }.show() + + } + + private fun printShelvingResult(pos: Int) { + + storedPosition = pos + customDialogList.getEditTextTwo().inputType = InputType.TYPE_CLASS_TEXT + customDialogList.getEditTextTwo().setRawInputType(InputType.TYPE_CLASS_NUMBER) + customDialogList.getEditText().setRawInputType(InputType.TYPE_CLASS_NUMBER) + customDialogList.getEditTextTwo().requestFocus() + val shelving = myGroupList[pos].code + val item = myGroupList[pos].itemFk + val longName = myGroupList[pos].longName + val totalReserved = myGroupList[pos].reservedQuantity + + try { + customDialogList.setTitle("$shelving($item) $totalReserved de $longName").setOkButton( + getString( + R.string.take + ) + ) { + customDialogTakeAction(pos, totalReserved, false) + + }.setKoButton(getString(R.string.close)) { + requireActivity().hideKeyboard(customDialogList.getEditTextTwo()) + customDialogList.dismiss() + scanRequest() + + }.setHintValue(getString(R.string.quantitySelect)).setValue(totalReserved.toString()) + .setHintValueTwo(getString(R.string.scanItem)).setValueTwo("").show() + + customDialogList.getEditTextTwo().setOnEditorActionListener { v, actionId, event -> + if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) { + + customDialogTakeAction( + pos, + totalReserved, + event != null && event.action == KeyEvent.ACTION_DOWN && event.keyCode == KeyEvent.KEYCODE_ENTER + ) + + return@setOnEditorActionListener true + + } + false + } + } catch (e: Exception) { + ma.messageWithSound(e.message.toString(), isError = true, true) + } + } + + private fun customDialogTakeAction( + position: Int, totalReserved: Int, isItemScanned: Boolean? + ) { + isScanned = isItemScanned + if (customDialogList.getValueTwo().isNotEmpty()) { + + customDialogList.setValueTwo( + itemScanValue( + customDialogList.getValueTwo(), arrayOf("buy"), "more" + ).toString() + ) + val quantityToReserve = customDialogList.getValue().toInt() + + if (quantityToReserve < totalReserved) { + + if (customDialogList.getValueTwo() in myGroupList[position].Barcodes || customDialogList.getValueTwo() == myGroupList[position].itemFk.toString()) { + customDialogList.dismiss() + showQuestionUbicationEmpty(position, quantityToReserve) + } else { + ma.messageWithSound( + message = getString(R.string.errorItem), + isError = true, + isPlayed = true, + isToasted = false + ) + } + } + + if (quantityToReserve > totalReserved) { + ma.hideKeyboard(customDialogList.getEditTextTwo()) + getString(R.string.quantityHigh).toast(requireContext()) + } + if (quantityToReserve == totalReserved) { + try { + if (checkItemScan(customDialogList.getValueTwo(), position)) { + + markLine(position, quantityToReserve, false) + + mpok?.start() + ma.hideKeyboard(customDialogList.getEditTextTwo()) + customDialogList.dismiss() + requireContext().showToastCenterWithBackground(myGroupList[position].ticketFk.toString()) + scanRequest() + + } else { + + quantityReserveToCheckItemScan = quantityToReserve + viewModel.getIdFromCodeSalix( + code = customDialogList.getValueTwo(), + ) + customDialogList.dismiss() + } + } catch (ex: Exception) { + getString(R.string.errorInput).toast(requireContext()) + } + + } + + } else { + getString(R.string.scanItemValidate).toast(requireContext()) + } + } + + private fun checkItemScan(valueToCheck: String, position: Int): Boolean { + println("CheckItemScan $valueToCheck") + val saleToCheck = myGroupList[position] + println("CheckItemScan saleTocheck$saleToCheck") + println("CheckItemScan saleTocheck Item ${saleToCheck.itemFk}") + println("CheckItemScan saleTocheck ItemBarcodes ${saleToCheck.Barcodes}") + if (saleToCheck.itemFk.toString() == valueToCheck) return true + else { + saleToCheck.Barcodes.forEach { barcode -> + if (barcode == valueToCheck) return true + } + } + + return false + } + + private fun showQuestionUbicationEmpty(position: Int, quantity: Int = 0) { + customDialogThreeButtonsQuantity.setTitle( + getString( + R.string.changeQuantity, quantity, myGroupList[position].itemFk + ) + ).setDescription(getString(R.string.questionItemShelving, myGroupList[position].itemFk)) + .setValue("").setCustomDialogValue(View.GONE) + customDialogThreeButtonsQuantity.setOkButtonAdd(text = getString(R.string.yes)) { + scanRequest() + customDialogThreeButtonsQuantity.dismiss() + getString(R.string.errorQuantityShelving).toast(requireContext()) + customDialogThreeButtonsQuantity.dismiss() + showQuestionUbicationEmpty(position, quantity) + }.setOkButtonTwo(getString(R.string.no)) { + scanRequest() + customDialogThreeButtonsQuantity.dismiss() + if (quantity == 0) { + viewModel.itemShelvingSaleExists( + myGroupList[position].itemShelvingSaleFk, position, quantity + ) + } else { + markLine(position, quantity, true) + } + }.setKoButton(getString(R.string.cancel)) { + scanRequest() + customDialogThreeButtonsQuantity.dismiss() + }.show() + customDialogThreeButtons.setFocusDialogValue() + } + + private fun addItem() { + listPlacementSupply = ArrayList() + collection.tickets.forEach { + listPlacementSupply.add(BarcodeVO(code = it.ticketFk.toString())) + } + if (listPlacementSupply.size == 1) { + ticketSelected = listPlacementSupply[0].code!!.toInt() + } + customDialogList.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) + customDialogList.getEditTextTwo().inputType = InputType.TYPE_CLASS_NUMBER + customDialogList.getEditText().setRawInputType(InputType.TYPE_CLASS_NUMBER) + customDialogList.setTitle(getString(R.string.Agregarartículoparaticket) + " " + ticketSelected) + .setOkButton(getString(R.string.Agregar)) { + customDialogAddItem() + }.setKoButton(getString(R.string.close)) { + scanRequest() + customDialogList.dismiss() + }.setHintValue(getString(R.string.Artículo)).setValue("") + .setHintValueTwo(getString(R.string.Cantidad)).setValueTwo("").show() + customDialogList.getEditText().requestFocus() + requireActivity().hideKeyboard() + + customDialogList.getEditText().setOnEditorActionListener { v, actionId, event -> + if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) { + if (customDialogList.getValue().isNotEmpty()) { + try { + customDialogList.setValue( + itemScanValue( + customDialogList.getValue(), arrayOf("buy"), "more" + ).toString() + ) + + } catch (e: Exception) { + ma.messageWithSound(e.message.toString(), isError = true, true) + } + customDialogList.getEditTextTwo().requestFocus() + } + + return@setOnEditorActionListener true + + } + false + + } + + customDialogList.getEditTextTwo().setOnEditorActionListener { v, actionId, event -> + if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) { + customDialogAddItem() + return@setOnEditorActionListener true + + } + false + } + + placementSupplyAdapter = + BarcodeAdapter(listPlacementSupply, object : OnBarcodeRowClickListener { + override fun onBarcodeRowClickListener(item: BarcodeVO) { + customDialogInput.setTitle(getString(R.string.ArtículoparaTicket) + " " + item.code!!) + ticketSelected = item.code!!.toInt() + customDialogList.setTitle(getString(R.string.Agregarartículoparaticket) + " " + ticketSelected) + } + }, showDelete = false) + + customDialogList.getRecyclerView().adapter = placementSupplyAdapter + + customDialogList.getRecyclerView().layoutManager = + LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false) + + } + + private fun customDialogAddItem() { + + if (customDialogList.getValueTwo().isNotEmpty()) { + if (ticketSelected == 0) { + getString(R.string.Seleccionaunticketdelaista).toast(requireContext()) + } else if (customDialogList.getValue().isEmpty() || customDialogList.getValueTwo() + .isEmpty() + ) { + getString(R.string.Todosloscampossonobligatorios).toast(requireContext()) + } else { + val saleGroupSelected = + collection.tickets.find { it.ticketFk == ticketSelected }?.sales?.get(0)?.saleGroupFk + ?: 0 + + runBlocking { + viewModel.collectionAddWithReservation( + customDialogList.getValue().toInt(), + customDialogList.getValueTwo().toInt(), + ticketSelected, + saleGroupFk = saleGroupSelected, + sectorFk = mobileApplication.dataStoreApp.readDataStoreKey(SECTORFK) + ) + } + customDialogList.dismiss() + hideKeyboards() + scanRequest() + } + } else { + getString(R.string.scanItem).toast(requireContext()) + } + + } + + private fun toastDisponibility(item: ItemVO) { + if (item.available.isEmpty()) { + item.available = "0" + } + customDialog.setTitle(getString(R.string.itemPoints) + item.id) + .setDescription(getString(R.string.available) + ":" + item.available) + .setOkButton(getString(R.string.accept)) { + scanRequest() + customDialog.dismiss() + }.show() + + } + + private fun setTotalLines() { + val totalMark = myGroupList.count { it.isPicked == 1 } + binding.mainToolbar.toolbarTitle.text = + if (collection.collectionFk != 0) collection.collectionFk.toString() else "" + binding.mainToolbar.toolbarSubtitle.text = + getString(R.string.totalsPicker, totalMark, myGroupList.size) + if (totalMark == myGroupList.size) { + getString(R.string.completCollection).toast(this.context, Toast.LENGTH_SHORT) + viewModel.saleTrackingAddPrevOK(collection.collectionFk) + } + } + + private fun showScanner(index: Int, sale: Sale) { + customDialogInput.getEditText().inputType = InputType.TYPE_CLASS_TEXT + customDialogInput.setTitle("" + sale.itemFk) + .setDescription(getString(R.string.scanWagonForItem)) + .setOkButton(getString(R.string.accept)) { + findSaleAction(index, sale) + }.setKoButton(getString(R.string.cancel)) { + closeCustomDialog(binding.scanInput, customDialogInput) + }.setValue("").show() + + + customDialogInput.getEditText().setOnEditorActionListener { v, actionId, event -> + if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0) { + findSaleAction(index, sale) + return@setOnEditorActionListener false + } + false + } + customDialogInput.getEditText().requestFocus() + } + + private fun findSaleAction(index: Int, sale: Sale) { + if (customDialogInput.getValue().isNotEmpty()) { + findSale(customDialogInput.getValue(), index, sale) + } + closeCustomDialog(binding.scanInput, customDialogInput) + } + + private fun closeCustomDialog(scanInput: EditText, customDialogInput: CustomDialogInput) { + requireContext().hideKeyboard(customDialogInput.getEditText()) + scanInput.requestFocus() + customDialogInput.dismiss() + scanInput.requestFocus() + } + + private fun showErrorMessage(title: String = getString(R.string.errorMarkLine), text: String) { + customDialog.setTitle(title).setDescription(text).setKoButton(getString(R.string.close)) { + customDialog.dismiss() + }.show() + } +} \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPicker.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPicker.kt index 60281503..6704e57f 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPicker.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPicker.kt @@ -1,6 +1,5 @@ package es.verdnatura.presentation.view.feature.collection.fragment -import android.app.AlertDialog import android.content.Context import android.graphics.drawable.Drawable import android.media.MediaPlayer @@ -38,6 +37,7 @@ import es.verdnatura.domain.notNull import es.verdnatura.domain.toast import es.verdnatura.presentation.base.BaseFragment import es.verdnatura.presentation.common.ItemScanned +import es.verdnatura.presentation.common.LabelDialogHelper import es.verdnatura.presentation.common.OnBarcodeRowClickListener import es.verdnatura.presentation.common.OnMistakeClickListener import es.verdnatura.presentation.common.OnOptionsSelectedListener @@ -46,6 +46,7 @@ import es.verdnatura.presentation.common.OnPasillerosItemClickListener import es.verdnatura.presentation.common.OnQuantityClickListener import es.verdnatura.presentation.common.OnSaleClickListener import es.verdnatura.presentation.common.OnTicketClickListener +import es.verdnatura.presentation.common.OnTicketColorListener import es.verdnatura.presentation.common.ToolBarAdapterTooltip import es.verdnatura.presentation.common.hideKeyboard import es.verdnatura.presentation.common.itemScanIsQr @@ -126,11 +127,14 @@ class CollectionFragmentPicker( private var recylerViewState: Parcelable? = null private var isScanned: Boolean? = null private var myPosition: Int = 0 + private var changePosition = false private lateinit var myGroupList: List private var canChangeState = true private var isVerifiedCollection = false + private var hasFilterByLevel = false + companion object { fun newInstance(collection: CollectionVO, type: String) = CollectionFragmentPicker(collection, type) @@ -377,7 +381,7 @@ class CollectionFragmentPicker( if (!binding.scanInput.text.toString().isNullOrEmpty()) { //sergio:para ver si ha marcado dos veces el mismo ticket - binding.scanInput.setText(textScanned_filterDouble(binding.scanInput.text!!.toString())) + binding.scanInput.setText(textScannedFilterDouble(binding.scanInput.text!!.toString())) //de momento solo está el qr de artículo isScanned = @@ -841,7 +845,7 @@ class CollectionFragmentPicker( } else { // pintar línea saleAdapter!!.notifyDataSetChanged() - myPosition = storedPosition + myPosition = storedBackPosition ReviewQuantityForRefreshingAndSorting( sales[storedPosition].quantity!!.toInt(), @@ -926,7 +930,7 @@ class CollectionFragmentPicker( } saleAdapter = SaleAdapter( - myGroupList, + myGroupList as MutableList, pasillerosItemClickListener!!, object : OnQuantityClickListener { @@ -1001,17 +1005,25 @@ class CollectionFragmentPicker( } } }, - type = type + type = type, + onTicketColorClickListener = object : OnTicketColorListener { + override fun onTicketColorListener(sale: SaleVO) { + hasFilterByLevel = !hasFilterByLevel + + if (hasFilterByLevel) { + saleAdapter!!.updateSales(myGroupList.filter { it.level == sale.level } as MutableList) + myGroupList = myGroupList.filter { it.level == sale.level } + } else { + createCollectionList() + + } + } + } ) - - lm = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false) - - binding.fragmentSacadorCollections.adapter = saleAdapter - binding.fragmentSacadorCollections.layoutManager = lm setTotalLines() //Tarea #4628 @@ -1111,6 +1123,7 @@ class CollectionFragmentPicker( RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { storedBackPosition = lm.findFirstVisibleItemPosition() + myPosition = lm.findFirstVisibleItemPosition() super.onScrolled(recyclerView, dx, dy) } }) @@ -1368,7 +1381,7 @@ class CollectionFragmentPicker( } //nuevo - var mySale = sales[position].saleFk + val mySale = sales[position].saleFk for (indice in myGroupList.indices) { if (!myGroupList[indice].isParent && myGroupList[indice].saleFk == mySale) { @@ -1533,11 +1546,11 @@ class CollectionFragmentPicker( if (!myGroupList[indice].isParent && myGroupList[indice].saleFk == mySale) { storedBackPosition = indice + myPosition = storedBackPosition } } storedBackPosition = position - myPosition = position setListPosition(position, false) if (type != PRECHECKER) { @@ -2075,7 +2088,7 @@ class CollectionFragmentPicker( "" + totalMark + "/" + total if (totalMark == sales.size) { - getString(R.string.Coleccióncompleta).toast(this.context, Toast.LENGTH_SHORT) + getString(R.string.completCollection).toast(this.context, Toast.LENGTH_SHORT) saleAdapter!!.notifyDataSetChanged() if (!goBack) ticketCollection_setUsedShelves() @@ -2341,20 +2354,19 @@ class CollectionFragmentPicker( } } if (isTicket) { - val builder = AlertDialog.Builder(context) - builder.setTitle(getString(R.string.selectLabeltoPrint)) - val labelCount = arrayOf("1", "2", "3", "4", "5", "6", "7", "8", "9", "10") - builder.setItems(labelCount) { dialog, which -> - viewModel.collectionStickerPrint( - collectionFk = collection.collectionFk, labelCount = (which + 1) - ) - (getString(R.string.Imprimiendo) + mobileApplication.dataStoreApp.readDataStoreKey( - PRINTERNAME - )).toast(requireContext()) + val labelDialogHelper = LabelDialogHelper(requireContext()) + labelDialogHelper.showLabelDialog( + onItemSelected = { labelCount -> + viewModel.collectionStickerPrint( + collectionFk = collection.collectionFk, + labelCount = labelCount + ) - } - val dialog = builder.create() - dialog.show() + (getString(R.string.Imprimiendo) + mobileApplication.dataStoreApp.readDataStoreKey( + PRINTERNAME + )).toast(requireContext()) + } + ) } else { viewModel.collectionStickerPrint( collectionFk = collection.collectionFk, null diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPickerNew.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPickerNew.kt index f4d80f81..a27361ee 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPickerNew.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPickerNew.kt @@ -1,6 +1,5 @@ package es.verdnatura.presentation.view.feature.collection.fragment -import android.app.AlertDialog import android.content.Context import android.graphics.drawable.Drawable import android.media.MediaPlayer @@ -27,6 +26,7 @@ import es.verdnatura.domain.notNull import es.verdnatura.domain.toast import es.verdnatura.presentation.base.BaseFragment import es.verdnatura.presentation.common.ItemScanned +import es.verdnatura.presentation.common.LabelDialogHelper import es.verdnatura.presentation.common.OnBarcodeRowClickListener import es.verdnatura.presentation.common.OnMistakeClickListener import es.verdnatura.presentation.common.OnOptionsSelectedListener @@ -259,7 +259,7 @@ class CollectionFragmentPickerNew( binding.scanInput.setOnEditorActionListener { v, actionId, event -> if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) {//ID=0 ACTION_NEXT ID=5 ACTION_UNESPECEFIED) if (binding.scanInput.text.toString().isNotEmpty()) { - binding.scanInput.setText(textScanned_filterDouble(binding.scanInput.text!!.toString())) + binding.scanInput.setText(textScannedFilterDouble(binding.scanInput.text!!.toString())) isScanned = event != null && event.action == KeyEvent.ACTION_DOWN && event.keyCode == KeyEvent.KEYCODE_ENTER if (itemScanIsQr(binding.scanInput.text.toString())) { @@ -405,29 +405,6 @@ class CollectionFragmentPickerNew( } - responseConfirmReservedItemShelvingSale.observe(viewLifecycleOwner) { - - myGroupList[positionConfirm].isPicked = 1 - saleAdapter!!.notifyDataSetChanged() - lm!!.scrollToPositionWithOffset(storedPosition, 0) - /* viewModel.collectionTicketGetSalix( - collection.collectionFk, print = false - )*/ - - } - - /* - responseItemShelvingSale.observe(viewLifecycleOwner) { - myGroupList[positionConfirm].isPicked = 1 - myGroupList[positionConfirm].reservedQuantity = quantityConfirm - viewModel.collectionTicketGetSalix( - collection.collectionFk, print = false - ) - lm!!.scrollToPositionWithOffset(positionConfirm, 0) - ma.messageWithSound( - getString(R.string.operationSuccess), it.isError, !it.isError, isToasted = false - ) - }*/ loadUnpicked.observe(viewLifecycleOwner) { event -> event.getContentIfNotHandled().notNull { @@ -439,6 +416,18 @@ class CollectionFragmentPickerNew( } } + loadPicked.observe(viewLifecycleOwner) { event -> + event.getContentIfNotHandled().notNull { + if (it) { + myGroupList[positionConfirm].isPicked = 1 + saleAdapter!!.notifyItemChanged(positionConfirm) + lm!!.scrollToPositionWithOffset(positionConfirm, 0) + setTotalLines() + } else { + updateScreen() + } + } + } responseItemShelvingSaleGroup.observe(viewLifecycleOwner) { viewModel.collectionTicketGetSalix( @@ -658,7 +647,10 @@ class CollectionFragmentPickerNew( isMarking = true viewModel.itemShelvingSaleSetQuantity( - myGroupList[position].itemShelvingSaleFk, quantity, isItemShelvingSaleEmpty + myGroupList[position].itemShelvingSaleFk, + quantity, + isItemShelvingSaleEmpty, + shelvingFk = myGroupList[position].code!! ) val mySale = sales[position].itemShelvingSaleFk @@ -869,22 +861,7 @@ class CollectionFragmentPickerNew( }.setOkButtonTwo(getString(R.string.no)) { scanRequest() customDialogThreeButtonsQuantity.dismiss() - viewModel.itemShelvingSaleExists( - myGroupList[position].itemShelvingSaleFk, - myGroupList[position].itemShelvingFk, - position, - quantity - ) - /* if (quantity == 0) { - viewModel.itemShelvingSaleExists( - myGroupList[position].itemShelvingSaleFk, - myGroupList[position].itemShelvingFk, - position, - quantity - ) - } else { - markLine(position, quantity, true) - }*/ + markLine(position, quantity, true) }.setKoButton(getString(R.string.cancel)) { scanRequest() customDialogThreeButtonsQuantity.dismiss() @@ -1045,7 +1022,7 @@ class CollectionFragmentPickerNew( getString(R.string.totalsPicker, totalMark, total) if (totalMark == sales.size) { - getString(R.string.Coleccióncompleta).toast(this.context, Toast.LENGTH_SHORT) + getString(R.string.completCollection).toast(this.context, Toast.LENGTH_SHORT) saleAdapter!!.notifyDataSetChanged() changeTicketState() @@ -1108,20 +1085,19 @@ class CollectionFragmentPickerNew( } } if (isTicket) { - val builder = AlertDialog.Builder(context) - builder.setTitle(getString(R.string.selectLabeltoPrint)) - val labelCount = arrayOf("1", "2", "3", "4", "5", "6", "7", "8", "9", "10") - builder.setItems(labelCount) { dialog, which -> - viewModel.collectionStickerPrint( - collectionFk = collection.collectionFk, labelCount = (which + 1) - ) - (getString(R.string.Imprimiendo) + mobileApplication.dataStoreApp.readDataStoreKey( - PRINTERNAME - )).toast(requireContext()) + val labelDialogHelper = LabelDialogHelper(requireContext()) + labelDialogHelper.showLabelDialog( + onItemSelected = { labelCount -> + viewModel.collectionStickerPrint( + collectionFk = collection.collectionFk, + labelCount = labelCount + ) - } - val dialog = builder.create() - dialog.show() + (getString(R.string.Imprimiendo) + mobileApplication.dataStoreApp.readDataStoreKey( + PRINTERNAME + )).toast(requireContext()) + } + ) } else { viewModel.collectionStickerPrint( collectionFk = collection.collectionFk, null diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPickerPreviousNew.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPickerPreviousNew.kt index d86f1111..779ff998 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPickerPreviousNew.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPickerPreviousNew.kt @@ -1,42 +1,39 @@ package es.verdnatura.presentation.view.feature.collection.fragment -import android.app.AlertDialog import android.content.Context -import android.graphics.Color import android.graphics.drawable.Drawable -import android.graphics.drawable.GradientDrawable import android.media.MediaPlayer import android.os.Bundle import android.os.Handler import android.os.Looper import android.text.InputType -import android.view.Gravity import android.view.KeyEvent -import android.view.LayoutInflater import android.view.View import android.view.WindowManager import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputMethodManager import android.widget.EditText import android.widget.ImageView -import android.widget.TextView import android.widget.Toast import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.google.gson.Gson import es.verdnatura.R import es.verdnatura.databinding.FragmentCollectionNewBinding -import es.verdnatura.domain.ConstAndValues import es.verdnatura.domain.ConstAndValues.BASEURLSALIX import es.verdnatura.domain.ConstAndValues.PREITEMPICKERTEST import es.verdnatura.domain.ConstAndValues.PREPARED import es.verdnatura.domain.ConstAndValues.PRESACADOR +import es.verdnatura.domain.ConstAndValues.PRINTERNAME import es.verdnatura.domain.ConstAndValues.SACADOR import es.verdnatura.domain.ConstAndValues.SECTORFK import es.verdnatura.domain.notNull +import es.verdnatura.domain.showToastCenterWithBackground import es.verdnatura.domain.toast import es.verdnatura.presentation.base.BaseFragment import es.verdnatura.presentation.common.ItemScanned +import es.verdnatura.presentation.common.LabelDialogHelper +import es.verdnatura.presentation.common.OnAddItemClickListener import es.verdnatura.presentation.common.OnBarcodeRowClickListener import es.verdnatura.presentation.common.OnMistakeClickListener import es.verdnatura.presentation.common.OnOptionsSelectedListener @@ -73,6 +70,7 @@ import org.json.JSONObject 2- AL AÑADIR ITEM A A LA COLECCIÓN , EL SACADOR SALEGROUPFK Y SECTORFK SON NULOS. 3-VERIFICAR COLECCIÓN 4-IMPRIMIR +5-EL SACADOR PUEDE MARCAR PREVIA, EL PRESACADOR NO. variables: isVerifiedCollection @@ -135,6 +133,7 @@ class CollectionFragmentPickerPreviousNew( } override fun init() { + println("Sacando test") customDialogList = CustomDialogList(requireContext()) customDialogInput = CustomDialogInput(requireContext()) customDialog = CustomDialog(requireContext()) @@ -223,7 +222,7 @@ class CollectionFragmentPickerPreviousNew( binding.scanInput.setOnEditorActionListener { v, actionId, event -> if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) {//ID=0 ACTION_NEXT ID=5 ACTION_UNESPECEFIED) if (binding.scanInput.text.toString().isNotEmpty()) { - binding.scanInput.setText(textScanned_filterDouble(binding.scanInput.text!!.toString())) + binding.scanInput.setText(textScannedFilterDouble(binding.scanInput.text!!.toString())) isScanned = event != null && event.action == KeyEvent.ACTION_DOWN && event.keyCode == KeyEvent.KEYCODE_ENTER if (itemScanIsQr(binding.scanInput.text.toString())) { @@ -328,12 +327,16 @@ class CollectionFragmentPickerPreviousNew( loadPicked.observe(viewLifecycleOwner) { event -> event.getContentIfNotHandled().notNull { - myGroupList[positionConfirm].isPicked = 1 - saleAdapter!!.notifyItemChanged(positionConfirm) - lm!!.scrollToPositionWithOffset(positionConfirm, 0) - //lm!!.scrollToPositionWithOffset(storedBackPosition + 1, 0) - setTotalLines() - + if (it) { + myGroupList[positionConfirm].isPicked = 1 + saleAdapter!!.notifyItemChanged(positionConfirm) + lm!!.scrollToPositionWithOffset(positionConfirm, 0) + //lm!!.scrollToPositionWithOffset(storedBackPosition + 1, 0) + setTotalLines() + } else { + println("updating") + updateScreen() + } } } @@ -348,24 +351,25 @@ class CollectionFragmentPickerPreviousNew( } } - responseCode.observe(viewLifecycleOwner) { + loadResponseCode.observe(viewLifecycleOwner) { event -> + event.getContentIfNotHandled().notNull { - if (it == null) { - showErrorMessage(text = getString(R.string.codeNotExist)) - if (mperror != null) mperror?.start() - } else { - if (checkItemScan(it.toString(), positionConfirm)) { - scanRequest() - customDialogList.dismiss() - mpok?.start() - markLine(positionConfirm, quantityReserveToCheckItemScan, false) - } else { - customDialogList.setValueTwo("") - showErrorMessage(text = getString(R.string.lineNotExist)) + if (it == null) { + showErrorMessage(text = getString(R.string.codeNotExist)) if (mperror != null) mperror?.start() + } else { + if (checkItemScan(it.toString(), positionConfirm)) { + scanRequest() + customDialogList.dismiss() + mpok?.start() + markLine(positionConfirm, quantityReserveToCheckItemScan, false) + } else { + customDialogList.setValueTwo("") + showErrorMessage(text = getString(R.string.lineNotExist)) + if (mperror != null) mperror?.start() + } } } - } } @@ -402,7 +406,7 @@ class CollectionFragmentPickerPreviousNew( when (type) { PREITEMPICKERTEST -> { myGroupList = - salesList.sortedWith(compareBy { it.pickingOrderPrevia }.thenBy { it.itemFk }) + salesList.sortedWith(compareBy { it.pickingOrder }.thenBy { it.itemFk }) } SACADOR -> { @@ -464,6 +468,12 @@ class CollectionFragmentPickerPreviousNew( showDeleteItemShelving(sale) } + }, onAddItemClickListener = object : OnAddItemClickListener { + + override fun onAddItemClickListener(sale: Sale) { + customDialogAddItemFromSale(sale) + } + }, type = type ) @@ -528,29 +538,65 @@ class CollectionFragmentPickerPreviousNew( var isFoundSale = false //Se busca la matricula en las lineas for (indice in myGroupList.indices) { + //como cuando es presacador no hay parent no entrará + if (myGroupList[indice].isParent && myGroupList[indice].saleGroupFk == txtscan.toInt()) { + isFoundSale = true + storedPosition = indice + viewModel.itemShelvingSaleSetSaleGroup(txtscan.toInt()) + break + } if (myGroupList[indice].isPicked != 1 && myGroupList[indice].code != null && myGroupList[indice].code!!.uppercase() == txtscan.uppercase()) { - mpok!!.start() isFoundSale = true printShelvingResult(indice) break } } - if (!isFoundSale) mperror!!.start() + if (!isFoundSale) mperror!!.start() else mpok!!.start() } + private fun markPrevia(saleGroupScanned: String): Boolean { + + try { + for (indice in sales.indices) { + if (sales[indice].saleGroupFk != null && sales[indice].saleGroupFk == saleGroupScanned.toInt()) { + viewModel.itemShelvingSaleSetSaleGroup(saleGroupScanned.toInt()) + storedPosition = indice + mpok!!.start() + return true + + } + } + } catch (ex: Exception) { + return false + } + return false + } + private fun findSale(txtscan: String, position: Int, sale: Sale) { storedPosition = position - if (sale.code!!.uppercase() == txtscan.uppercase()) { - mpok!!.start() - printShelvingResult(position) - } else { - mperror!!.start() - } + val isOk = markPrevia(txtscan) + if (isOk) { + //Se ha escanado un ticket y se ha marcado la previa + ma.messageWithSound( + getString(R.string.previousCollected), + isPlayed = false, + isError = false, + isToasted = true + ) + } else { + + if (sale.code!!.uppercase() == txtscan.uppercase()) { + mpok!!.start() + printShelvingResult(position) + } else { + mperror!!.start() + } + } } private fun markLine(position: Int, quantity: Int, isItemShelvingSaleEmpty: Boolean?) { @@ -565,7 +611,8 @@ class CollectionFragmentPickerPreviousNew( myGroupList[position].itemShelvingSaleFk, quantity, isItemShelvingSaleEmpty = isItemShelvingSaleEmpty, - sectorFk = if (sectorFk == -1) null else sectorFk + sectorFk = if (sectorFk == -1) null else sectorFk, + shelvingFk = myGroupList[position].code!! ) } // storedBackPosition = position @@ -708,8 +755,7 @@ class CollectionFragmentPickerPreviousNew( mpok?.start() ma.hideKeyboard(customDialogList.getEditTextTwo()) customDialogList.dismiss() - showTicket(myGroupList[position].ticketFk) - + requireContext().showToastCenterWithBackground(myGroupList[position].ticketFk.toString()) scanRequest() } else { @@ -731,24 +777,6 @@ class CollectionFragmentPickerPreviousNew( } } - private fun showTicket(ticketFk: Int) { - val inflater = LayoutInflater.from(requireContext()) - val layout = inflater.inflate(R.layout.ticket_toast_layout, null) - val text = layout.findViewById(R.id.toast_text) - text.text = "$ticketFk" - text.setTextColor(requireContext().getColor(R.color.verdnatura_orange_salix)) - text.textSize = 18f - val background = GradientDrawable() - background.setColor(Color.parseColor("#000000")) - background.cornerRadius = 16f - layout.background = background - val toast = Toast(requireContext()) - toast.duration = Toast.LENGTH_LONG - toast.view = layout - toast.setGravity(Gravity.CENTER, 0, 0) - toast.show() - } - private fun checkItemScan(valueToCheck: String, position: Int): Boolean { println("CheckItemScan $valueToCheck") val saleToCheck = myGroupList[position] @@ -781,12 +809,13 @@ class CollectionFragmentPickerPreviousNew( }.setOkButtonTwo(getString(R.string.no)) { scanRequest() customDialogThreeButtonsQuantity.dismiss() - viewModel.itemShelvingSaleExists( - myGroupList[position].itemShelvingSaleFk, - myGroupList[position].itemShelvingFk, - position, - quantity - ) + /* viewModel.itemShelvingSaleExists( + myGroupList[position].itemShelvingSaleFk, + myGroupList[position].itemShelvingFk, + position, + quantity + )*/ + markLine(position, quantity, true) /* if (quantity == 0) { /* viewModel.itemShelvingGet( @@ -914,6 +943,44 @@ class CollectionFragmentPickerPreviousNew( } + private fun customDialogAddItemFromSale(sale: Sale) { + + customDialogThreeButtonsQuantity.setTitle( + "${getString(R.string.ticket)}${sale.ticketFk}" + ).setDescription( + getString( + R.string.addItemQuantity, sale.itemFk + ) + ) + customDialogThreeButtonsQuantity.setOkButtonAdd(text = getString(R.string.add)) { + ticketSelected = sale.ticketFk + if (customDialogThreeButtonsQuantity.getValue().isNotEmpty()) { + viewModel.collectionAddWithReservation( + sale.itemFk, + customDialogThreeButtonsQuantity.getValue().toInt(), + ticketSelected = sale.ticketFk, + saleGroupFk = if (type == PREPARED) null else collection.tickets.find { it.ticketFk == ticketSelected }?.sales?.get( + 0 + )?.saleGroupFk + ?: 0, + sectorFk = if (type == PREPARED) null else mobileApplication.dataStoreApp.readDataStoreKey( + SECTORFK + ) + ) + customDialogThreeButtonsQuantity.setValue("") + customDialogThreeButtonsQuantity.dismiss() + hideKeyboardFragment() + } else { + getString(R.string.indicateQuantity).toast(requireContext()) + } + + }.setKoButton(getString(R.string.cancel)) { + scanRequest() + customDialogThreeButtonsQuantity.dismiss() + }.show() + customDialogThreeButtonsQuantity.getEditText().requestFocus() + } + private fun hideKeyboardFragment() { Handler(Looper.getMainLooper()).postDelayed({ val inputMethodManager = @@ -944,7 +1011,7 @@ class CollectionFragmentPickerPreviousNew( binding.mainToolbar.toolbarSubtitle.text = getString(R.string.totalsPicker, totalMark, myGroupList.size) if (totalMark == myGroupList.size) { - getString(R.string.Coleccióncompleta).toast(this.context, Toast.LENGTH_SHORT) + getString(R.string.completCollection).toast(this.context, Toast.LENGTH_SHORT) when (type) { PREPARED -> { tickets.forEach { @@ -1149,20 +1216,18 @@ class CollectionFragmentPickerPreviousNew( } } if (isTicket) { - val builder = AlertDialog.Builder(context) - builder.setTitle(getString(R.string.selectLabeltoPrint)) - val labelCount = arrayOf("1", "2", "3", "4", "5", "6", "7", "8", "9", "10") - builder.setItems(labelCount) { dialog, which -> - viewModel.collectionStickerPrint( - collectionFk = collection.collectionFk, labelCount = (which + 1) - ) - (getString(R.string.Imprimiendo) + mobileApplication.dataStoreApp.readDataStoreKey( - ConstAndValues.PRINTERNAME - )).toast(requireContext()) - - } - val dialog = builder.create() - dialog.show() + val labelDialogHelper = LabelDialogHelper(requireContext()) + labelDialogHelper.showLabelDialog( + onItemSelected = { labelCount -> + viewModel.collectionStickerPrint( + collectionFk = collection.collectionFk, + labelCount = labelCount + ) + (getString(R.string.Imprimiendo) + mobileApplication.dataStoreApp.readDataStoreKey( + PRINTERNAME + )).toast(requireContext()) + } + ) } else { viewModel.collectionStickerPrint( collectionFk = collection.collectionFk, null diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPreChecker.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPreChecker.kt index 65a53e99..702e9bba 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPreChecker.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionFragmentPreChecker.kt @@ -1,6 +1,5 @@ package es.verdnatura.presentation.view.feature.collection.fragment -import android.app.AlertDialog import android.content.Context import android.graphics.drawable.Drawable import android.media.MediaPlayer @@ -38,6 +37,7 @@ import es.verdnatura.domain.toLong import es.verdnatura.domain.toast import es.verdnatura.presentation.base.BaseFragment import es.verdnatura.presentation.common.ItemScanned +import es.verdnatura.presentation.common.LabelDialogHelper import es.verdnatura.presentation.common.OnBarcodeRowClickListener import es.verdnatura.presentation.common.OnMistakeClickListener import es.verdnatura.presentation.common.OnOptionsSelectedListener @@ -205,8 +205,8 @@ class CollectionFragmentPreChecker( val listIcons: ArrayList = ArrayList() val iconPrint = ImageView(context) iconPrint.setImageResource(R.drawable.ic_print_black_24dp) - val iconAdd = ImageView(context) - iconAdd.setImageResource(R.drawable.ic_playlist_add_black_24dp) + // val iconAdd = ImageView(context) + // iconAdd.setImageResource(R.drawable.ic_playlist_add_black_24dp) val iconViewCollection = ImageView(context) iconViewCollection.setImageResource(R.drawable.ic_collection) val iconWorker = ImageView(context) @@ -220,7 +220,7 @@ class CollectionFragmentPreChecker( if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { iconPrint.tooltipText = getTooltip(R.drawable.ic_print_black_24dp) - iconAdd.tooltipText = getTooltip(R.drawable.ic_playlist_add_black_24dp) + // iconAdd.tooltipText = getTooltip(R.drawable.ic_playlist_add_black_24dp) iconViewCollection.tooltipText = getTooltip(R.drawable.ic_collection) iconPhone.tooltipText = getTooltip(R.drawable.phone_call) iconParking.tooltipText = getTooltip(R.drawable.ic_local_parking_black_24dp) @@ -237,7 +237,7 @@ class CollectionFragmentPreChecker( listIcons.add(iconWorker) } - listIcons.add(iconAdd) + // listIcons.add(iconAdd) if (type == SACADOR) { listIcons.add(iconUpdate) @@ -255,7 +255,7 @@ class CollectionFragmentPreChecker( when (item) { iconPrint.drawable -> print() - iconAdd.drawable -> addItem() + // iconAdd.drawable -> addItem() iconWorker.drawable -> showUser() iconUpdate.drawable -> updateScreen() iconParking.drawable -> pasillerosItemClickListener?.onPasillerosItemClickListener( @@ -362,7 +362,7 @@ class CollectionFragmentPreChecker( if (!binding.scanInput.text.toString().isNullOrEmpty()) { //sergio:para ver si ha marcado dos veces el mismo ticket - binding.scanInput.setText(textScanned_filterDouble(binding.scanInput.text!!.toString())) + binding.scanInput.setText(textScannedFilterDouble(binding.scanInput.text!!.toString())) //de momento solo está el qr de artículo isScanned = @@ -399,10 +399,10 @@ class CollectionFragmentPreChecker( it.sales.forEach { at -> if (at.saleGroupFk != saleGroup) { viewModel.setParking( - ticketFk = at.saleGroupFk.toInt(), + ticketFk = at.saleGroupFk!!.toInt(), parking = myQr.more ) - saleGroup = at.saleGroupFk + saleGroup = at.saleGroupFk!! } } @@ -964,15 +964,16 @@ class CollectionFragmentPreChecker( val isOnReservationMode = mobileApplication.dataStoreApp.readDataStoreKey( ConstAndValues.RESERVATIONMODE - ) - //lolass - if (isOnReservationMode) { + ) || (mobileApplication.dataStoreApp.readDataStoreKey( + ConstAndValues.SECTORISONRESERVATIONMODE + ) == true) - sales = salesList.filter { + sales = if (isOnReservationMode) { + salesList.filter { it.sectorFk == mobileApplication.dataStoreApp.readDataStoreKey(SECTORFK) }.sortedWith(compareBy({ it.saleOrder })) } else { - sales = salesList.filter { + salesList.filter { it.sectorFk == mobileApplication.dataStoreApp.readDataStoreKey(SECTORFK) }.sortedWith(compareBy({ it.picked })) } @@ -983,7 +984,7 @@ class CollectionFragmentPreChecker( saleAdapter = SaleAdapter( - sales, + sales as MutableList, pasillerosItemClickListener!!, object : OnQuantityClickListener { @@ -2014,7 +2015,7 @@ class CollectionFragmentPreChecker( "" + totalMark + "/" + total if (totalMark == sales.size) { - getString(R.string.Coleccióncompleta).toast(this.context, Toast.LENGTH_SHORT) + getString(R.string.completCollection).toast(this.context, Toast.LENGTH_SHORT) saleAdapter!!.notifyDataSetChanged() if (!goBack) @@ -2266,21 +2267,19 @@ class CollectionFragmentPreChecker( } } if (isTicket) { - val builder = AlertDialog.Builder(context) - builder.setTitle(getString(R.string.selectLabeltoPrint)) - val labelCount = arrayOf("1", "2", "3", "4", "5", "6", "7", "8", "9", "10") - builder.setItems(labelCount) { dialog, which -> - viewModel.collectionStickerPrint( - collectionFk = collection.collectionFk, - labelCount = (which + 1) - ) - (getString(R.string.Imprimiendo) + mobileApplication.dataStoreApp.readDataStoreKey( - PRINTERNAME - )).toast(requireContext()) + val labelDialogHelper = LabelDialogHelper(requireContext()) + labelDialogHelper.showLabelDialog( + onItemSelected = { labelCount -> + viewModel.collectionStickerPrint( + collectionFk = collection.collectionFk, + labelCount = labelCount + ) - } - val dialog = builder.create() - dialog.show() + (getString(R.string.Imprimiendo) + mobileApplication.dataStoreApp.readDataStoreKey( + PRINTERNAME + )).toast(requireContext()) + } + ) } else { viewModel.collectionStickerPrint( collectionFk = collection.collectionFk, diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionViewModel.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionViewModel.kt index 10bf08db..cad89ad9 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionViewModel.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionViewModel.kt @@ -180,8 +180,8 @@ class CollectionViewModel(val context: Context) : BaseViewModel(context) { val loadAddNew: LiveData> = _responseNew.map { Event(it) } private val _responseCode by lazy { MutableLiveData() } - val responseCode: LiveData - get() = _responseCode + val responseCode: LiveData = _responseCode + val loadResponseCode: LiveData> = _responseCode.map { Event(it) } private val _responseIncQuantity by lazy { MutableLiveData() } val responseIncQuantity: LiveData @@ -431,10 +431,18 @@ class CollectionViewModel(val context: Context) : BaseViewModel(context) { itemShelvingSaleFk: Int, quantity: Int, isItemShelvingSaleEmpty: Boolean?, - sectorFk: Int? = null + sectorFk: Int? = null, + shelvingFk: String ) { salix.itemShelvingSaleSetquantitySalix( - params = arrayListOf(itemShelvingSaleFk, quantity, isItemShelvingSaleEmpty, sectorFk) + params = arrayListOf( + itemShelvingSaleFk, + quantity, + isItemShelvingSaleEmpty, + sectorFk, + shelvingFk + + ).formatWithQuotes() ).enqueue(object : SalixCallback(context) { override fun onSuccess(response: Response) { @@ -444,6 +452,12 @@ class CollectionViewModel(val context: Context) : BaseViewModel(context) { _responseCollectionAddItem.value = true } + + override fun onError(t: Throwable) { + _responseConfirmReservedItemShelvingSale.value = false + super.onError(t) + + } }) } diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionViewModelCheckerPreviosNew.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionViewModelCheckerPreviosNew.kt new file mode 100644 index 00000000..9fcb7339 --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/CollectionViewModelCheckerPreviosNew.kt @@ -0,0 +1,922 @@ +package es.verdnatura.presentation.view.feature.collection.fragment + +import android.content.Context +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.map +import com.google.gson.JsonObject +import es.verdnatura.MobileApplication +import es.verdnatura.domain.SalixCallback +import es.verdnatura.domain.formatWithQuotes +import es.verdnatura.domain.toast +import es.verdnatura.domain.userCases.GetItemFromBarcodeUseCase +import es.verdnatura.presentation.base.BaseViewModel +import es.verdnatura.presentation.base.getMessageFromAllResponse +import es.verdnatura.presentation.base.nameofFunction +import es.verdnatura.presentation.common.Event +import es.verdnatura.presentation.common.ResponseItemExistsItemShelvingSale +import es.verdnatura.presentation.common.ResponseItemVO +import es.verdnatura.presentation.common.SaleTrackingReplaceSalix +import es.verdnatura.presentation.common.SaleTrackingSalix +import es.verdnatura.presentation.common.TicketState +import es.verdnatura.presentation.view.feature.collection.ItemVO +import es.verdnatura.presentation.view.feature.collection.SalixSaleQuantity +import es.verdnatura.presentation.view.feature.collection.mapper.map +import es.verdnatura.presentation.view.feature.sacador.model.CollectionTicket +import es.verdnatura.presentation.view.feature.sacador.model.CollectionVO +import es.verdnatura.presentation.view.feature.sacador.model.MistakeTypeListVO +import es.verdnatura.presentation.view.feature.sacador.model.MistakeTypeVO +import es.verdnatura.presentation.view.feature.sacador.model.PlacementSupplyListVO +import es.verdnatura.presentation.view.feature.sacador.model.PlacementSupplyVO +import es.verdnatura.presentation.view.feature.workermistake.model.SaleMistakeSalix +import es.verdnatura.presentation.view.feature.workermistake.model.SaleTrackingDelSalix +import retrofit2.Response + +class CollectionViewModelCheckerPreviosNew(val context: Context) : BaseViewModel(context) { + private val getItemFromBarcodeUseCase = GetItemFromBarcodeUseCase(salix) + private val contextApp = context + + private val _responseState by lazy { MutableLiveData() } + val responseState: LiveData + get() = _responseState + + private val _collectionTicketList by lazy { MutableLiveData() } + val collectionTicketList: LiveData + get() = _collectionTicketList + + private val _responseExistsItemShelvingSale by lazy { MutableLiveData() } + val responseExistsItemShelvingSale: LiveData + get() = _responseExistsItemShelvingSale + + val loadExistsResponse: LiveData> = + _responseExistsItemShelvingSale.map { Event(it) } + + private val _collectionTicketSalix by lazy { MutableLiveData() } + val collectionTicketSalix: LiveData + get() = _collectionTicketSalix + + private val _getSalesResponse by lazy { MutableLiveData() } + val getSalesResponse: LiveData + get() = _getSalesResponse + + val loadCollectionTicketSalix: LiveData> = + _collectionTicketSalix.map { Event(it) } + + private val _placementSuppleyList by lazy { MutableLiveData() } + val placementSuppleyList: LiveData + get() = _placementSuppleyList + + private val _response by lazy { MutableLiveData() } + val response: LiveData + get() = _response + + private val _responseSaleMistakeAdd by lazy { MutableLiveData() } + val responseSaleMistakeAdd: LiveData + get() = _responseSaleMistakeAdd + val loadSaleMistakeAdd: LiveData> = + _responseSaleMistakeAdd.map { Event(it) } + + private val _responseItemShelvingSaleSupplyAdd by lazy { MutableLiveData() } + val responseItemShelvingSaleSupplyAdd: LiveData + get() = _responseItemShelvingSaleSupplyAdd + + private val _responseSaleReplace by lazy { MutableLiveData() } + val responseSaleReplace: LiveData + get() = _responseSaleReplace + + private val _responseSaleTracking_mark by lazy { MutableLiveData() } + val responseSaleTracking_mark: LiveData + get() = _responseSaleTracking_mark + + private val _responseConfirmReservedItemShelvingSale by lazy { MutableLiveData() } + val responseConfirmReservedItemShelvingSale: LiveData + get() = _responseConfirmReservedItemShelvingSale + + val loadPicked: LiveData> = + _responseConfirmReservedItemShelvingSale.map { Event(it) } + + private val _responseItemShelvingSale by lazy { MutableLiveData() } + val responseItemShelvingSale: LiveData + get() = _responseItemShelvingSale + + private val _responseItemShelvingSaleUnPicked by lazy { MutableLiveData() } + val responseItemShelvingSaleUnPicked: LiveData + get() = _responseItemShelvingSaleUnPicked + + val loadUnpicked: LiveData> = _responseItemShelvingSaleUnPicked.map { Event(it) } + + private val _responseCollectionAddItem by lazy { MutableLiveData() } + val responseCollectionAddItem: LiveData + get() = _responseCollectionAddItem + + private val _responseParking by lazy { MutableLiveData() } + val responseParking: LiveData + get() = _responseParking + + val loadParking: LiveData> = _responseParking.map { Event(it) } + + private val _responsePrint by lazy { MutableLiveData() } + val responsePrint: LiveData + get() = _responsePrint + + private val _responseDel by lazy { MutableLiveData() } + val responseDel: LiveData + get() = _responseDel + + private val _responseItemShelvingUpdate by lazy { MutableLiveData() } + val responseItemShelvingUpdate: LiveData + get() = _responseItemShelvingUpdate + + private val _responseTicketState by lazy { MutableLiveData() } + val responseTicketState: LiveData = _responseTicketState + + val loadTicketState: LiveData> = _responseTicketState.map { Event(it) } + + private val _responseUsedShelves by lazy { MutableLiveData() } + val responseUsedShelves: LiveData + get() = _responseUsedShelves + + private val _responseSaleGroup by lazy { MutableLiveData() } + val responseSaleGroup: LiveData + get() = _responseSaleGroup + + val loadResponseSaleGroup: LiveData> = + _responseSaleGroup.map { Event(it) } + + private val _responseItemShelvingSaleGroup by lazy { MutableLiveData() } + val responseItemShelvingSaleGroup: LiveData + get() = _responseItemShelvingSaleGroup + + private val _responseTicketClosure by lazy { MutableLiveData() } + val responseTicketClosure: LiveData + get() = _responseTicketClosure + val loadTicketClousure: LiveData> = + _responseTicketClosure.map { Event(it) } + + private val _responseCollectionUnchecked by lazy { MutableLiveData() } + val responseCollectionUnchecked: LiveData + get() = _responseCollectionUnchecked + + private val _responseSplit by lazy { MutableLiveData() } + val responseSplit: LiveData + get() = _responseSplit + + private val _responseNew by lazy { MutableLiveData() } + val responseNew: LiveData + get() = _responseNew + + val loadAddNew: LiveData> = _responseNew.map { Event(it) } + + private val _responseCode by lazy { MutableLiveData() } + val responseCode: LiveData + get() = _responseCode + + private val _responseIncQuantity by lazy { MutableLiveData() } + val responseIncQuantity: LiveData + get() = _responseIncQuantity + val loadIncQuantity: LiveData> = _responseIncQuantity.map { Event(it) } + + private val _mistakeList by lazy { MutableLiveData() } + val mistakeList: LiveData + get() = _mistakeList + + private val _item by lazy { MutableLiveData() } + val item: LiveData + get() = _item + + val loadResponseDel: LiveData> = _responseDel.map { Event(it) } + + val loadResponseAddItem: LiveData> = + _responseCollectionAddItem.map { Event(it) } + + val loadResponseSaleTrackingMark: LiveData> = + _responseSaleTracking_mark.map { Event(it) } + + val loadResponseItemShelvingUpdate: LiveData> = + _responseItemShelvingUpdate.map { Event(it) } + + private val _responseSaleAddPrevOK by lazy { MutableLiveData() } + val responseSaleAddPrevOK: LiveData + get() = _responseSaleAddPrevOK + + fun getSales( + collectionFk: Number, print: String, source: String + + ) { + salix.getSalesFromTicketOrCollection( + collectionOrTicketFk = collectionFk, print = print != "0", source = source + ).enqueue(object : SalixCallback(context) { + override fun onError(t: Throwable) { + _collectionTicketList.value = CollectionVO( + 0, + isError = true, + errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!) + ) + } + + override fun onSuccess(response: Response) { + + try { + _collectionTicketList.value = response.body()?.let { it.map(contextApp) } + } catch ( + ex: Exception + ) { + ex.toast(context) + } + + } + }) + } + + fun collectionTicketGet( + collectionFk: Int, sectorFk: Int, print: String, type: String + ) { + + getSales(collectionFk, print, type) + + } + + fun getCollectionTickets( + collectionFk: Number, + print: Boolean, + + ) { + salix.getCollectionTickets( + collectionFk, hashMapOf("print" to print) + ).enqueue(object : SalixCallback(context) { + override fun onError(t: Throwable) { + _collectionTicketSalix.value = CollectionTicket( + 0, + isError = true, + errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!) + ) + } + + override fun onSuccess(response: Response) { + + if (response.body() != null) { + _collectionTicketSalix.value = response.body()?.let { it.map(contextApp) } + } else { + _collectionTicketSalix.value = CollectionTicket( + 0, isError = true, errorMessage = getMessageFromAllResponse( + nameofFunction(this), response.message() + ) + ) + } + } + }) + } + + fun collectionGetId( + ticketFk: Int, sectorFk: Int, print: String, type: String + ) { + salix.getCollectionId( + filter = """{"where":{"ticketFk":$ticketFk},"fields":"collectionFk"}""" + ).enqueue(object : SalixCallback>(context) { + override fun onError(t: Throwable) { + _collectionTicketList.value = CollectionVO( + 0, + isError = true, + errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!) + ) + } + + override fun onSuccess(response: Response>) { + + if (response.body()!!.isNotEmpty()) { + collectionTicketGet( + response.body()!![0].entrySet().first().value.toString().toInt(), + sectorFk, + print, + type + ) + } else { + _collectionTicketList.value = CollectionVO( + 0, isError = false + ) + } + } + }) + } + + fun itemShelvingSaleExists( + itemShelvingSaleFk: Number, position: Int, quantity: Int + + ) { + salix.itemShelvingSaleExists( + itemShelvingSaleFk + ).enqueue(object : SalixCallback(context) { + + override fun onSuccess(response: Response) { + _responseExistsItemShelvingSale.value = ResponseItemExistsItemShelvingSale( + response.body()!!.entrySet().first().value.asBoolean, position, quantity + ) + } + }) + } + + fun saleTrackingReplace( + saleFk: Int, + originalQuantity: Int, + code: String, + isChecked: String, + buyFk: Long, + isScanned: Boolean? + ) { + salix.saleTrackingUpdate( + SaleTrackingReplaceSalix( + saleFk, originalQuantity, code, isChecked != "0", buyFk, isScanned!! + ) + ).enqueue(object : SalixCallback(context) { + override fun onError(t: Throwable) { + _responseSaleReplace.value = ResponseItemVO( + isError = true, + errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!) + ) + } + + override fun onSuccess(response: Response) { + _responseSaleReplace.value = ResponseItemVO(isError = false, response = "") + } + }) + } + + fun saleTracking_mark( + saleFk: Int, + originalQuantity: Int, + code: String, + isChecked: String, + buyFk: Long, + itemShelvingFk: Int, + quantity: Int, + isScanned: Boolean? + ) { + salix.saleTrackingMark( + SaleTrackingSalix( + saleFk = saleFk, + originalQuantity = originalQuantity, + code = code, + isChecked = isChecked != "0", + buyFk = buyFk, + itemShelvingFk = itemShelvingFk, + quantity = quantity, + isScanned = isScanned!! + ) + ).enqueue(object : SalixCallback(context) { + override fun onError(t: Throwable) { + _responseSaleTracking_mark.value = ResponseItemVO( + isError = true, + errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!) + ) + } + + override fun onSuccess(response: Response) { + if (!response.isSuccessful) { + _responseSaleTracking_mark.value = ResponseItemVO( + isError = true, errorMessage = getMessageFromAllResponse( + nameofFunction(this), response.message() + ) + ) + } else { + _responseSaleTracking_mark.value = + ResponseItemVO(isError = false, response = "") + } + } + }) + } + + fun itemShelvingSaleSetQuantity( + itemShelvingSaleFk: Int, + quantity: Int, + isItemShelvingSaleEmpty: Boolean?, + sectorFk: Int? = null, + shelvingFk: String + ) { + salix.itemShelvingSaleSetquantitySalix( + params = arrayListOf( + itemShelvingSaleFk, + quantity, + isItemShelvingSaleEmpty, + sectorFk, + shelvingFk + ) + ).enqueue(object : SalixCallback(context) { + + override fun onSuccess(response: Response) { + _responseConfirmReservedItemShelvingSale.value = true + + if (isItemShelvingSaleEmpty == true) + _responseCollectionAddItem.value = true + + } + }) + } + + fun collectionAddWithReservation( + item: Int, quantity: Int, ticketSelected: Int, saleGroupFk: Int?, sectorFk: Int? + ) { + salix.collectionAddWithReservation( + params = arrayListOf( + item, quantity, ticketSelected, saleGroupFk, if (sectorFk == -1) null else sectorFk + ) + ).enqueue(object : SalixCallback(context) { + override fun onSuccess(response: Response) { + _responseCollectionAddItem.value = true + } + + }) + } + + fun itemPlacementSupplyAiming( + shelvingFk: String, quantity: Int, itemFk: Int + ) { + salix.itemPlacementSupplyAiming( + arrayListOf( + shelvingFk, quantity, itemFk + ).formatWithQuotes() + ).enqueue(object : SalixCallback>(context) { + override fun onSuccess(response: Response>) { + if (response.body() != null) { + _placementSuppleyList.value = response.body()?.let { PlacementSupplyListVO(it) } + } else { + val listError: ArrayList = ArrayList() + listError.add( + PlacementSupplyVO( + itemShelvingFk = 0, + isError = true, + errorMessage = getMessageFromAllResponse( + nameofFunction(this), response.message() + ) + ) + ) + _placementSuppleyList.value = PlacementSupplyListVO(listError) + } + } + + override fun onError(t: Throwable) { + val listError: ArrayList = ArrayList() + listError.add( + PlacementSupplyVO( + itemShelvingFk = 0, + isError = true, + errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!) + ) + ) + _placementSuppleyList.value = PlacementSupplyListVO(listError) + } + + }) + } + + fun collectionStickerPrint( + collectionFk: Int, labelCount: Int? + ) { + salix.collectionStickerPrint( + arrayListOf( + collectionFk, labelCount + ) + ).enqueue(object : SalixCallback(context) { + override fun onSuccess(response: Response) { + _responsePrint.value = + ResponseItemVO(isError = false, response = response.message()) + } + + override fun onError(t: Throwable) { + _responsePrint.value = ResponseItemVO( + isError = true, + errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!) + ) + } + }) + } + + fun ticketCollection_setUsedShelves( + ticketFk: Int, usedShelves: Int + ) { + salix.ticketCollectionUpdate( + """where={"ticketFk":$ticketFk}""", hashMapOf("usedShelves" to usedShelves) + ).enqueue(object : SalixCallback(context) { + override fun onError(t: Throwable) { + + _responseUsedShelves.value = ResponseItemVO( + isError = true, + errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!) + ) + } + + override fun onSuccess(response: Response) { + _responseUsedShelves.value = ResponseItemVO(isError = false) + + } + }) + } + + fun itemShelvingSaleUnpicked( + itemShelvingSaleFk: Int + ) { + salix.itemShelvingSaleUnpicked( + arrayListOf( + itemShelvingSaleFk + ) + ).enqueue(object : SalixCallback(context) { + + override fun onSuccess(response: Response) { + _responseItemShelvingSaleUnPicked.value = true + super.onSuccess(response) + } + }) + } + + fun saleTrackingAddPreparedSaleGroup( + saleGroupFk: Int + ) { + salix.saleTrackingAddPreparedSaleGroup( + arrayListOf( + saleGroupFk + ) + ).enqueue(object : SalixCallback(context) { + override fun onError(t: Throwable) { + _responseSaleGroup.value = ResponseItemVO( + isError = true, + errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!) + ) + } + + override fun onSuccess(response: Response) { + //Tarea 7926 + updateParkingFromSaleGroup(saleGroupFk) + _responseSaleGroup.value = ResponseItemVO(isError = false) + } + }) + } + + fun updateParkingFromSaleGroup( + saleGroupFk: Number + ) { + salix.saleGroupUpdate( + id = saleGroupFk, params = hashMapOf("parkingFk" to null) + ).enqueue(object : SalixCallback(context) { + override fun onSuccess(response: Response) { + } + }) + } + + fun itemShelvingSaleSetSaleGroup( + saleGroupFk: Int + ) { + salix.itemShelvingSaleSetSaleGroup( + arrayListOf( + saleGroupFk + ) + ).enqueue(object : SalixCallback(context) { + override fun onError(t: Throwable) { + _responseItemShelvingSaleGroup.value = ResponseItemVO( + isError = true, + errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!) + ) + } + + override fun onSuccess(response: Response) { + _responseItemShelvingSaleGroup.value = ResponseItemVO(isError = false) + } + }) + } + + fun collectionAddItem( + itemFk: Int, quantity: Int, ticketFk: Int + ) { + + //Tarea 6889 + salix.addSale( + id = ticketFk, barcode = itemFk.toString(), quantity = quantity + )/* salix.addSaleByCode( + CollectionItemSalix( + itemFk.toString(), + quantityFk, + ticketFk, + warehouseFk + ) + )*/ + + .enqueue(object : SalixCallback(context) { + override fun onError(t: Throwable) { + + _responseNew.value = ResponseItemVO( + isError = true, + errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!) + ) + } + + override fun onSuccess(response: Response) { + _responseNew.value = + ResponseItemVO(isError = false, response = response.message()!!) + + } + }) + } + + fun saleTrackingDel(saleFk: Int) { + + salix.saleTrackingDel( + SaleTrackingDelSalix( + saleFk = saleFk, stateCodes = listOf("CHECKED", "OK", "PREPARED") + ) + ).enqueue(object : SalixCallback(context) { + override fun onError(t: Throwable) { + _responseDel.value = ResponseItemVO( + isError = true, + errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!) + ) + } + + override fun onSuccess(response: Response) { + _responseDel.value = + ResponseItemVO(isError = false, response = response.message()) + } + }) + } + + fun itemShelvingUpdateFromSale( + saleFk: Int + ) { + salix.itemShelvingUpdateFromSale(hashMapOf("saleFk" to saleFk)) + // silex.itemShelving_updateFromSale(saleFk) + .enqueue(object : SalixCallback(context) { + override fun onError(t: Throwable) { + _responseItemShelvingUpdate.value = ResponseItemVO( + isError = true, + errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!) + ) + } + + override fun onSuccess(response: Response) { + + _responseItemShelvingUpdate.value = + ResponseItemVO(isError = false, response = response.message()!!) + } + }) + } + + fun setParking( + ticketFk: Int, parking: String + ) { + salix.setParking(arrayListOf(ticketFk, parking).formatWithQuotes()) + .enqueue(object : SalixCallback(context) { + override fun onSuccess(response: Response) { + _responseParking.value = + ResponseItemVO(isError = false, response = response.message()) + } + + override fun onError(t: Throwable) { + _responseParking.value = ResponseItemVO( + isError = true, + errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!) + ) + } + }) + } + + fun ticketStateTodaySetState( + ticketFk: Int, state: String + ) { + salix.ticketStateTodaySetState(arrayListOf(ticketFk, state).formatWithQuotes()) + .enqueue(object : SalixCallback(context) { + override fun onSuccess(response: Response) { + _response.value = ResponseItemVO(isError = false, response = "") + } + + override fun onError(t: Throwable) { + _response.value = ResponseItemVO( + isError = true, + errorMessage = getMessageFromAllResponse(nameofFunction(this), t.message!!) + ) + } + }) + } + + fun getIdFromCodeSalix(code: String) { + getItemFromBarcodeUseCase.execute(code).enqueue(object : SalixCallback(context) { + override fun onSuccess(response: Response) { + _responseCode.value = response.body() + + } + }) + } + + fun collectionIncreaseQuantitySalix( + saleFk: Int, quantity: String + ) { + salix.collectionIncreaseQuantitySalix( + SalixSaleQuantity(saleId = saleFk, quantity = quantity.toInt()) + ).enqueue(object : SalixCallback(context) { + override fun onError(t: Throwable) { + _responseIncQuantity.value = ResponseItemVO( + isError = true, errorMessage = getMessageFromAllResponse( + nameofFunction(this), t.message!! + ) + ) + } + + override fun onSuccess(response: Response) { + super.onSuccess(response) + + _responseIncQuantity.value = ResponseItemVO( + isError = false, response = response.message().toString() + ) + } + }) + } + + fun saleMistakeAdd( + saleFk: Int, typeFk: Int + ) { + + salix.saleMistakeAdd( + SaleMistakeSalix( + userFk = (context as MobileApplication).userId!!, saleFk = saleFk, typeFk = typeFk + ) + ).enqueue(object : SalixCallback(context) { + override fun onError(t: Throwable) { + _responseSaleMistakeAdd.value = ResponseItemVO( + isError = true, errorMessage = getMessageFromAllResponse( + nameofFunction(this), t.message!! + ) + ) + } + + override fun onSuccess(response: Response) { + super.onSuccess(response) + _responseSaleMistakeAdd.value = + ResponseItemVO(isError = false, response = response.message()) + } + }) + } + + fun mistakeType() { + salix.getMistakeTypes().enqueue(object : SalixCallback>(context) { + override fun onSuccess(response: Response>) { + if (response.body() != null) { + _mistakeList.value = response.body()?.let { MistakeTypeListVO(it) } + } else { + val listError: ArrayList = ArrayList() + listError.add(MistakeTypeVO(0, "")) + _mistakeList.value = MistakeTypeListVO(listError) + } + } + + override fun onError(t: Throwable) { + val listError: ArrayList = ArrayList() + listError.add(MistakeTypeVO(0, "")) + _mistakeList.value = MistakeTypeListVO(listError) + } + }) + } + + fun ticketIsOutClosureZone( + ticketFk: Int + ) { + salix.ticketIsOutClosureZone( + arrayListOf(ticketFk) + ).enqueue(object : SalixCallback(context) { + override fun onSuccess(response: Response) { + _responseTicketClosure.value = ResponseItemVO( + isError = false, + response = response.body()?.toString() ?: "false", + errorMessage = "" + ) + } + + override fun onError(t: Throwable) { + _responseTicketClosure.value = ResponseItemVO( + isError = true, errorMessage = getMessageFromAllResponse( + nameofFunction(this), t.message!! + ) + ) + } + }) + } + + fun ticketState( + ticketFk: Int + ) { + salix.ticketState( + """{"where": {"ticketFk": "$ticketFk"},"include":[{"relation":"user","scope":{"fields":["username"]}}]}""" + + ).enqueue(object : SalixCallback>(context) { + override fun onSuccess(response: Response>) { + _responseTicketState.value = if (response.body()!!.isEmpty()) { + TicketState() + } else { + response.body()!![0] + } + } + + }) + } + + fun callBackSalix(function: String, params: ArrayList) { + salix.executeFunc( + routine = function, params = params + ).enqueue(object : SalixCallback(context) { + + override fun onError(t: Throwable) { + _responseTicketClosure.value = ResponseItemVO( + isError = true, errorMessage = getMessageFromAllResponse( + nameofFunction(this), t.message!! + ) + ) + } + + override fun onSuccess(response: Response) { + _responseTicketClosure.value = ResponseItemVO( + isError = false, response = response.body()!!.toString(), errorMessage = "" + ) + + } + + }) + } + + fun hasUncheckedTicket( + collectionFk: Int + ) { + salix.hasUncheckedTicket(collectionFk) + //silex.collection_getUncheckedTicket(collectionFk) + .enqueue(object : SalixCallback(context) { + override fun onError(t: Throwable) { + _responseCollectionUnchecked.value = ResponseItemVO( + isError = true, errorMessage = getMessageFromAllResponse( + nameofFunction(this), t.message!! + ) + ) + } + + override fun onSuccess(response: Response) { + if (response.body() != null) { + + _responseCollectionUnchecked.value = ResponseItemVO( + isError = false, response = response.body()!!, errorMessage = "" + ) + } else { + _responseCollectionUnchecked.value = ResponseItemVO( + isError = true, + response = response.body()!!.toString(), + errorMessage = getMessageFromAllResponse( + nameofFunction(this), response.message() + ) + ) + } + } + }) + } + + fun collection_setState( + collectionFk: Int, state: String + ) { + salix.collectionSetState( + params = arrayListOf( + collectionFk, state + ).formatWithQuotes() + ).enqueue(object : SalixCallback(context) { + override fun onError(t: Throwable) { + + _responseState.value = ResponseItemVO( + isError = true, errorMessage = getMessageFromAllResponse( + nameofFunction(this), t.message!! + ) + ) + super.onError(t) + } + + override fun onSuccess(response: Response) { + _responseState.value = ResponseItemVO(isError = false, response = "") + super.onSuccess(response) + } + }) + } + + fun saleTrackingAddPrevOK( + sectorCollectionFk: Int + ) { + salix.saleTrackingAddPrevOK(arrayListOf(sectorCollectionFk)) + .enqueue(object : SalixCallback(context) { + override fun onError(t: Throwable) { + _responseSaleAddPrevOK.value = ResponseItemVO( + isError = true, errorMessage = getMessageFromAllResponse( + nameofFunction(this), t.message!! + ) + ) + + } + + override fun onSuccess(response: Response) { + _responseSaleAddPrevOK.value = ResponseItemVO( + isError = false, errorMessage = "" + getMessageFromAllResponse( + nameofFunction(this), response.message() + ) + ) + } + }) + } + +} diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/ShowTicketFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/ShowTicketFragment.kt index 264555ca..eedd3c29 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/ShowTicketFragment.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/fragment/ShowTicketFragment.kt @@ -1,6 +1,5 @@ package es.verdnatura.presentation.view.feature.collection.fragment -import android.app.AlertDialog import android.content.Context import android.graphics.drawable.Drawable import android.os.Bundle @@ -8,7 +7,6 @@ import android.view.View.VISIBLE import android.view.inputmethod.EditorInfo import android.widget.ImageView import android.widget.Toast -import androidx.lifecycle.Observer import androidx.recyclerview.widget.LinearLayoutManager import es.verdnatura.R import es.verdnatura.databinding.FragmentCollectionBinding @@ -17,6 +15,7 @@ import es.verdnatura.domain.ConstAndValues.SECTORFK import es.verdnatura.domain.ConstAndValues.VERTICKET import es.verdnatura.domain.toast import es.verdnatura.presentation.base.BaseFragment +import es.verdnatura.presentation.common.LabelDialogHelper import es.verdnatura.presentation.common.OnMistakeClickListener import es.verdnatura.presentation.common.OnOptionsSelectedListener import es.verdnatura.presentation.common.OnPackingClickListener @@ -138,16 +137,20 @@ class CollectionShowTicketFragment( } } if (isTicket) { - val builder = AlertDialog.Builder(context) - builder.setTitle(getString(R.string.selectLabeltoPrint)) - val labelCount = arrayOf("1", "2", "3", "4", "5", "6", "7", "8", "9", "10") - builder.setItems(labelCount) { dialog, which -> - viewModel.collectionStickerPrint( - collectionFk = collection.collectionFk, labelCount = (which + 1) - ) - } - val dialog = builder.create() - dialog.show() + val labelDialogHelper = LabelDialogHelper(requireContext()) + labelDialogHelper.showLabelDialog( + onItemSelected = { labelCount -> + viewModel.collectionStickerPrint( + collectionFk = collection.collectionFk, + labelCount = labelCount + ) + + (getString(R.string.Imprimiendo) + mobileApplication.dataStoreApp.readDataStoreKey( + PRINTERNAME + )).toast(requireContext()) + } + ) + } else { viewModel.collectionStickerPrint( @@ -166,22 +169,18 @@ class CollectionShowTicketFragment( binding.scanInput.setOnEditorActionListener { _, actionId, _ -> if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) {//ID=0 ACTION_NEXT ID=5 ACTION_UNESPECEFIED) - if (!binding.scanInput.text.toString().isNullOrEmpty()) { + if (binding.scanInput.text.toString().isNotEmpty()) { buttonPushedGetCollection = false try { viewModel.getSales( collectionFk = itemScanValue( - binding.scanInput.text.toString(), arrayOf("ticket","saleGroup"), "id" + binding.scanInput.text.toString(), + arrayOf("ticket", "saleGroup"), + "id" ).toString().toInt(), print = "0", source = type ) - - println("qrTest2") - - /* viewModel.getSales( - binding.scanInput.text.toString().toInt(), print = "0", type - )*/ } catch (ex: Exception) { getString(R.string.scanLabelTicket).toast(requireContext()) } @@ -213,13 +212,14 @@ class CollectionShowTicketFragment( try { requireActivity().hideKeyboard() } catch (e: Exception) { + e.message!!.toast(requireContext()) } } override fun observeViewModel() { with(viewModel) { - collectionTicketList.observe(viewLifecycleOwner, Observer { + collectionTicketList.observe(viewLifecycleOwner) { if (!it.isError) { if (it.tickets.isNotEmpty()) { @@ -232,18 +232,18 @@ class CollectionShowTicketFragment( } } else { - ma.messageWithSound(it.errorMessage, it.isError, false) + ma.messageWithSound(it.errorMessage, isError = true, false) if (activity != null) ma.onMyBackPressed() } - }) + } - responsePrint.observe(viewLifecycleOwner, Observer { + responsePrint.observe(viewLifecycleOwner) { if (it.isError) { ma.messageWithSound( - it.errorMessage, it.isError, true + it.errorMessage, isError = true, true ) } else { (getString(R.string.Imprimiendo) + mobileApplication.dataStoreApp.readDataStoreKey( @@ -251,7 +251,7 @@ class CollectionShowTicketFragment( )).toast(requireContext()) } - }) + } } } @@ -277,27 +277,30 @@ class CollectionShowTicketFragment( } } - sales = salesList.sortedWith(compareBy({ it.saleOrder })) - /*salesList.sortedWith(compareBy { it.isPrepared == "0" } - .thenBy { it.isControlled == "0" }*/ - + sales = salesList.sortedWith(compareBy { it.saleOrder }) saleAdapter = - SaleAdapter(sales, pasillerosItemClickListener!!, object : OnQuantityClickListener { + SaleAdapter( + sales as MutableList, + pasillerosItemClickListener!!, + object : OnQuantityClickListener { - override fun onQuantityClick(sale: SaleVO) { - } - }, object : OnSaleClickListener { - override fun onSaleClick(sale: SaleVO) { - } + override fun onQuantityClick(sale: SaleVO) { + } + }, + object : OnSaleClickListener { + override fun onSaleClick(sale: SaleVO) { + } - }, object : OnMistakeClickListener { - override fun onMistakeClickListener(sale: SaleVO) { - } - }, object : OnPackingClickListener { - override fun onPackingClick(sale: SaleVO) { - } + }, + object : OnMistakeClickListener { + override fun onMistakeClickListener(sale: SaleVO) { + } + }, + object : OnPackingClickListener { + override fun onPackingClick(sale: SaleVO) { + } - }) + }) lm = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false) binding.fragmentSacadorCollections.adapter = saleAdapter @@ -310,8 +313,13 @@ class CollectionShowTicketFragment( private fun setPosition() { val firstIndex = - sales.indexOfFirst { it.isPreviousPrepared == "0" && (it.isPrepared == "0" || it.isControlled == "0") } - lm!!.scrollToPositionWithOffset(firstIndex, 0) + sales.indexOfFirst { it.isPreviousPrepared == "0" && it.isPrepared == "0" && it.isControlled == "0" } + val resultIndex = if (firstIndex != -1) { + firstIndex + } else { + sales.indexOfFirst { it.isPreviousPrepared == "0" && it.isPrepared == "0" } + } + lm!!.scrollToPositionWithOffset(resultIndex, 0) } private fun printObservations(observations: String) { @@ -331,9 +339,10 @@ class CollectionShowTicketFragment( if (it.isControlled == "1") totalMark += 1 } binding.mainToolbar.toolbarTitle.text = collection.collectionFk.toString() - binding.mainToolbar.toolbarSubtitle.text = "" + totalMark + "/" + sales.size + binding.mainToolbar.toolbarSubtitle.text = + getString(R.string.totalsPicker, totalMark, sales.size) if (totalMark == sales.size) { - getString(R.string.Coleccióncompleta).toast(this.context, Toast.LENGTH_SHORT) + getString(R.string.completCollection).toast(this.context, Toast.LENGTH_SHORT) } } diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/mapper/CollectionMapper.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/mapper/CollectionMapper.kt index ff09cdb7..0a564adf 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/collection/mapper/CollectionMapper.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/collection/mapper/CollectionMapper.kt @@ -15,6 +15,8 @@ fun CollectionVO.map(context: Context): CollectionVO { this.tickets.forEach { ticket -> // if (ticket.sales.size>0){ ticket.sales.forEach { + it.parkingCode = ticket.parkingCode + it.isAdvanced = ticket.isAdvanced it.ticketFk = ticket.ticketFk it.level = ticket.level it.rgb = ticket.rgb diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/controlador/fragment/ControladorFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/controlador/fragment/ControladorFragment.kt index b15ed2f5..b31c9922 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/controlador/fragment/ControladorFragment.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/controlador/fragment/ControladorFragment.kt @@ -55,7 +55,7 @@ class ControladorFragment : goBack = false if (!binding.scanInput.text.isNullOrEmpty()) { - binding.scanInput.setText(textScanned_filterDouble(binding.scanInput.text!!.toString())) + binding.scanInput.setText(textScannedFilterDouble(binding.scanInput.text!!.toString())) try { binding.scanInput.setText( itemScanValue( diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/controlvehiculo/fragment/ControlVehiculoUsuarioFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/controlvehiculo/fragment/ControlVehiculoUsuarioFragment.kt index 0dd10904..f914490d 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/controlvehiculo/fragment/ControlVehiculoUsuarioFragment.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/controlvehiculo/fragment/ControlVehiculoUsuarioFragment.kt @@ -52,7 +52,7 @@ class ControlVehiculoUsuarioFragment( if (userFk == vUserFK) { val androidId: String = mobileApplication.dataStoreApp.readDataStoreKey(ANDROID_ID) - viewModel.machineGetWorkerPlate(mobileApplication.userId!!) + // viewModel.machineGetWorkerPlate(mobileApplication.userId!!) viewModel.deviceProductionGetnameDevice( androidId ) @@ -64,7 +64,8 @@ class ControlVehiculoUsuarioFragment( binding.userInformation.visibility = INVISIBLE binding.nameVehiclecontrol.visibility = INVISIBLE binding.userImage.setOnClickListener { binding.mainToolbar.backButton.performClick() } - viewModel.machineGetWorkerPlate(mobileApplication.userId!!) + // viewModel.machineGetWorkerPlate(mobileApplication.userId!!) + binding.nameVehiclecontrol.visibility = VISIBLE viewModel.getNameWorker(userFk) } diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/controlvehiculo/fragment/ControlVehiculoViewModel.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/controlvehiculo/fragment/ControlVehiculoViewModel.kt index 2164de3e..75f67e11 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/controlvehiculo/fragment/ControlVehiculoViewModel.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/controlvehiculo/fragment/ControlVehiculoViewModel.kt @@ -108,35 +108,15 @@ class ControlVehiculoViewModel(val context: Context) : BaseViewModel(context) { }) } - fun machineGetWorkerPlate(userId: Int) { - salix.machineGetWorkerPlate( - arrayListOf(userId) - ).enqueue(object : SalixCallback>(context) { - override fun onSuccess(response: Response>) { - _responseMachine.value = - ResponseItemMachineControl( - response = if (response.body()!!.isEmpty()) { - "" - } else { - response.body()!![0].entrySet().first().value.toString() - .replace("\"", "") - }, - type = "getWorkerPlate" - ) - } - - }) - } - fun getNameWorker( workerId: Int ) { salix.getNameWorker( - """{"fields": ["firstName","lastName"],"where": {"id":$workerId}}""" - ).enqueue(object : SalixCallback(context) { + """{"limit":1, "where":{"id":$workerId},"skip":0,"fields":["firstName","lastName"]}""" + ).enqueue(object : SalixCallback>(context) { - override fun onSuccess(response: Response) { - _responseGetName.value = response.body() + override fun onSuccess(response: Response>) { + _responseGetName.value = response.body()?.get(0) } }) diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/adapters/ExpeditionLoadUnloadAdapter.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/adapters/ExpeditionLoadUnloadAdapter.kt index 5d937637..4a5f0eb4 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/adapters/ExpeditionLoadUnloadAdapter.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/adapters/ExpeditionLoadUnloadAdapter.kt @@ -1,6 +1,7 @@ package es.verdnatura.presentation.view.feature.delivery.adapters import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup import androidx.core.content.ContextCompat.getColor import androidx.recyclerview.widget.RecyclerView @@ -57,8 +58,14 @@ class ExpeditionLoadUnloadAdapter( ) } + } + binding.scanOrderTxt.visibility = + if (item.scanOrder == null) View.GONE else View.VISIBLE + binding.scanOrderLabel.visibility = + if (item.scanOrder == null) View.GONE else View.VISIBLE + this.item = item } diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/adapters/SalarySupplementAdapter.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/adapters/SalarySupplementAdapter.kt new file mode 100644 index 00000000..b8c10795 --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/adapters/SalarySupplementAdapter.kt @@ -0,0 +1,50 @@ +package es.verdnatura.presentation.view.feature.delivery.adapters + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import es.verdnatura.databinding.ItemSalaryComplementRowBinding +import es.verdnatura.presentation.common.OnSalarySupplementClickListener +import es.verdnatura.presentation.view.feature.delivery.model.RouteComplement + +class SalarySupplementAdapter( + private var items: List, + private val onSalarySupplementClickListener: OnSalarySupplementClickListener +) : RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHolder { + return ItemHolder( + ItemSalaryComplementRowBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + + override fun getItemCount() = items.size + + override fun onBindViewHolder(holder: ItemHolder, position: Int) { + holder.bind(items[position]) + } + + fun updateData(list: List) { + items = list + notifyDataSetChanged() + } + + inner class ItemHolder( + val binding: ItemSalaryComplementRowBinding + ) : RecyclerView.ViewHolder(binding.root) { + private val res = binding.root.context.resources + fun bind(item: RouteComplement) { + binding.apply { + this.item = item + } + binding.imageDelete.setOnClickListener { + onSalarySupplementClickListener.onSalarySupplementClickListener(item) + } + } + } + +} diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/LoadUnloadFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/LoadUnloadFragment.kt index bbed5251..16e2aa60 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/LoadUnloadFragment.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/LoadUnloadFragment.kt @@ -24,12 +24,14 @@ import es.verdnatura.presentation.common.OnBackPressedListener import es.verdnatura.presentation.common.OnOptionsSelectedListener import es.verdnatura.presentation.common.ToolBarAdapterTooltip import es.verdnatura.presentation.view.component.CustomDialog +import es.verdnatura.presentation.view.component.CustomDialogThreeButtons import es.verdnatura.presentation.view.feature.delivery.activity.SignedActivity import es.verdnatura.presentation.view.feature.delivery.adapters.ExpeditionLoadUnloadAdapter import es.verdnatura.presentation.view.feature.delivery.model.ClientTicketSalix import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionInfoLoadUnload import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionInfoPending import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionSalix +import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionSalixPosition import es.verdnatura.presentation.view.feature.delivery.model.RouteLoaded import es.verdnatura.presentation.view.feature.delivery.viewmodels.DeliveryViewModel import kotlinx.coroutines.Dispatchers @@ -51,12 +53,11 @@ class LoadUnloadFragment( private var adapter: ExpeditionLoadUnloadAdapter? = null private var originalItem: Int = 0 private lateinit var myList: MutableList - private var counterCalls = 0 - private var counterResponse = 0 private var route = 0 private var addressFk = 0 private lateinit var db: DeliveryDatabase private lateinit var backDispatcher: OnBackPressedDispatcher + private lateinit var customDialogConfirmExpedition: CustomDialogThreeButtons companion object { var scanned = false @@ -75,8 +76,7 @@ class LoadUnloadFragment( override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - requireActivity().onBackPressedDispatcher.addCallback( - viewLifecycleOwner, + requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { if (!onBackPressedHandled()) { @@ -101,6 +101,7 @@ class LoadUnloadFragment( setSwitchButon() binding.scanInput.requestFocus() viewModel.getExpeditionFromRoute(route) + customDialogConfirmExpedition = CustomDialogThreeButtons(requireContext()) super.init() } @@ -178,25 +179,43 @@ class LoadUnloadFragment( private fun setExpeditionsState(list: MutableList, state: String) { scanning(false) - val mlist = mutableListOf() + /* val mlist = mutableListOf() + for (l in list) { + mlist.add( + ExpeditionSalix( + expeditionFk = l.id, + stateCode = if (l.code != state && l.code != "FOUND" && l.code != "DELIVERED") { + if (state == "ON DELIVERY") "NOT SCANNED" else "LOST" + } else { + l.code + }, + isScanned = l.isScanned + ) + ) + }*/ + val mlistPosition = mutableListOf() for (l in list) { - mlist.add( - ExpeditionSalix( + mlistPosition.add( + ExpeditionSalixPosition( expeditionFk = l.id, - stateCode = if (l.code != state && l.code != "FOUND" && l.code != "DELIVERED") { - "LOST" - } else { - l.code + stateCode = if (l.code == "FOUND") (l.code) else { + if (state == "ON DELIVERY" && l.code != "ON DELIVERY" && l.code != "DELIVERED" && l.code != "LOST") { + "NOT SCANNED" + } else { + if (state == "DELIVERED" && l.code != "DELIVERED") "LOST" else l.code + } }, - isScanned = l.isScanned + isScanned = l.isScanned, + scanOrder = l.scanOrder ) ) } - val expeditionBack = hashMapOf("expeditions" to mlist as List) + val expeditionBackPosition = + hashMapOf("expeditions" to mlistPosition as List) + //val expeditionBack = hashMapOf("expeditions" to mlist as List) if (list.any { it.code == state }) { if (list.filter { it.code == state }.size == list.size) { - viewModel.expeditionStateAddSalix(expeditionBack) - counterCalls = 1 + viewModel.expeditionStateAddSalix(expeditionBackPosition) } else { val alertDialog = android.app.AlertDialog.Builder(requireContext()).create() alertDialog.setTitle(getString(R.string.info)) @@ -204,8 +223,7 @@ class LoadUnloadFragment( alertDialog.setButton( android.app.AlertDialog.BUTTON_NEUTRAL, getString(R.string.save) ) { _, _ -> - counterCalls = 1 - viewModel.expeditionStateAddSalix(expeditionBack) + viewModel.expeditionStateAddSalix(expeditionBackPosition) } alertDialog.setButton( android.app.AlertDialog.BUTTON_POSITIVE, getString(R.string.ordenar) @@ -261,6 +279,8 @@ class LoadUnloadFragment( if (!binding.scanInput.text.isNullOrEmpty()) { val isScanned = event != null && event.action == KeyEvent.ACTION_DOWN && event.keyCode == KeyEvent.KEYCODE_ENTER + //Tarea 8152 + // showconfirmExpedition(binding.scanInput.text.toString().toInt(), isScanned) try { markExpedition( binding.scanInput.text.toString().toInt(), @@ -295,6 +315,70 @@ class LoadUnloadFragment( binding.scanInput.requestFocus() } + private fun showconfirmExpedition(expeditionFk: Int, isScanned: Boolean) { + + try { + customDialogConfirmExpedition.setHintDialogValue("Indica expedición") + customDialogConfirmExpedition.setDescription("No está escanenado la caja. Escríbala de nuevo:") + .setValue("").setOkButtonAdd(getString(R.string.confirm)) { + try { + + if (expeditionFk == customDialogConfirmExpedition.getValue().toInt()) { + takeActionConfirmed(isScanned) + binding.scanInput.requestFocus() + customDialogConfirmExpedition.dismiss() + } else { + + } + + } catch (ex: Exception) { + ma.messageWithSound( + message = getString(R.string.errorInputQuantity), + isPlayed = true, + isError = true, + isToasted = true + ) + } + + }.setKoButton(getString(R.string.cancel)) { + binding.scanInput.requestFocus() + binding.scanInput.setText("") + customDialogConfirmExpedition.dismiss() + + }.show() + customDialogConfirmExpedition.setFocusDialogValue() + } catch (ex: Exception) { + ex.message!!.toast(requireContext()) + } + } + + private fun takeActionConfirmed(isScanned: Boolean) { + try { + markExpedition( + binding.scanInput.text.toString().toInt(), + if (!binding.mainToolbar.switchButton.isChecked) { + state + } else { + "FOUND" + }, + isScanned = if (isScanned) 1 else 0 + ) + if (state != "DELIVERED") { + + binding.mainToolbar.toolbarTitle.text = + if (!binding.mainToolbar.switchButton.isChecked) { + getString(R.string.loading) + } else { + getString(R.string.unloading) + } + } + + } catch (ex: Exception) { + getString(R.string.errorExpedition).toast(context, Toast.LENGTH_SHORT) + } + binding.scanInput.setText("") + } + private fun markExpedition(expedNumber: Int, state: String, isScanned: Int) { var found = false @@ -307,15 +391,14 @@ class LoadUnloadFragment( found = true exped.code = state exped.isScanned = isScanned + if (state == "ON DELIVERY") exped.scanOrder = + myList.filter { it.code == state }.size break } } if (found) { ma.messageWithSound( - message = "", - isError = false, - isPlayed = true, - isToasted = false + message = "", isError = false, isPlayed = true, isToasted = false ) scanning(true) } else { @@ -324,7 +407,6 @@ class LoadUnloadFragment( } if (binding.mainToolbar.switchButton.isChecked) { - counterCalls = 1 val pendingExpeditionSend = myList.map { l -> ExpeditionSalix( expeditionFk = l.id, stateCode = l.code, isScanned = l.isScanned @@ -353,20 +435,17 @@ class LoadUnloadFragment( } responseStateAdd.observe(viewLifecycleOwner) { if (it) { - counterResponse += 1 - if (counterResponse == counterCalls) { - if (!binding.mainToolbar.switchButton.isChecked) { - if (state == "DELIVERED") { - openSignActivity() - } else { - ma.onMyBackPressed() - } + + if (!binding.mainToolbar.switchButton.isChecked) { + if (state == "DELIVERED") { + openSignActivity() } else { - binding.mainToolbar.switchButton.isChecked = false + ma.onMyBackPressed() } - counterResponse = 0 - counterCalls = 0 + } else { + binding.mainToolbar.switchButton.isChecked = false } + } else { openSignActivity() } @@ -456,6 +535,7 @@ class LoadUnloadFragment( it.routeFk == route } } + adapter = ExpeditionLoadUnloadAdapter(myList) binding.expeditionloadunloadRecyclerview.adapter = adapter binding.expeditionloadunloadRecyclerview.layoutManager = diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/LogExpeditionFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/LogExpeditionFragment.kt index 22962de1..2ba86f93 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/LogExpeditionFragment.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/LogExpeditionFragment.kt @@ -175,7 +175,7 @@ class LogExpeditionFragment( binding.routeLayout.visibility = View.VISIBLE binding.mainToolbar.toolbarIcons.visibility = View.VISIBLE binding.route.text = routeDelivery.ticket.routeFk.toString() - binding.agency.text = routeDelivery.ticket.route.agencyMode.agency.name ?: "" + binding.agency.text = routeDelivery.ticket.route?.agencyMode?.agency?.name ?: "" binding.scanInput.setText("") } diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/RoutesFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/RoutesFragment.kt index c01dea76..c8e18f24 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/RoutesFragment.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/RoutesFragment.kt @@ -5,9 +5,11 @@ import android.os.Bundle import android.text.Editable import android.text.TextWatcher import android.view.View +import android.view.inputmethod.EditorInfo import android.widget.ImageView import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.google.gson.Gson import es.verdnatura.R import es.verdnatura.databinding.FragmentRouteBinding @@ -17,14 +19,21 @@ import es.verdnatura.domain.toDateString import es.verdnatura.domain.toast import es.verdnatura.presentation.base.BaseFragment import es.verdnatura.presentation.base.database +import es.verdnatura.presentation.common.GeneralAdapter +import es.verdnatura.presentation.common.GeneralItem import es.verdnatura.presentation.common.ItemDescorationCustomized +import es.verdnatura.presentation.common.OnGeneralItemRowClickListener +import es.verdnatura.presentation.common.OnGeneralRowClickListener import es.verdnatura.presentation.common.OnItemImageRouteRowClickListener import es.verdnatura.presentation.common.OnOptionsSelectedListener import es.verdnatura.presentation.common.OnPasillerosItemClickListener import es.verdnatura.presentation.common.ToolBarAdapterTooltip +import es.verdnatura.presentation.common.hideKeyboard +import es.verdnatura.presentation.common.itemScanValue +import es.verdnatura.presentation.view.component.CustomDialogList import es.verdnatura.presentation.view.feature.delivery.adapters.RouteAdapter import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionInfoLoadUnload -import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionSalix +import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionSalixPosition import es.verdnatura.presentation.view.feature.delivery.model.RouteInfo import es.verdnatura.presentation.view.feature.delivery.model.RouteLoaded import es.verdnatura.presentation.view.feature.delivery.viewmodels.DeliveryViewModel @@ -45,6 +54,34 @@ class RoutesFragment( private lateinit var myListRoute: MutableList private lateinit var db: DeliveryDatabase private lateinit var myListRouteLoaded: List + private val customDialogList: CustomDialogList by lazy { + CustomDialogList(requireContext()) + } + private var listExpeditionScan: ArrayList = ArrayList() + private var listMyRoutes: ArrayList = ArrayList() + + private val expeditionScanAdapter: GeneralAdapter? by lazy { + GeneralAdapter(listExpeditionScan, object : OnGeneralItemRowClickListener { + override fun onGeneralItemRowClickListener(item: GeneralItem) { + + listExpeditionScan.remove(item) + expeditionScanAdapter?.notifyDataSetChanged() + } + }, onRowClickListener = object : OnGeneralRowClickListener { + override fun onRowClickListener(item: GeneralItem) { + getDataForMoveExpeditions(item.code!!) + } + }, showDelete = true + ) + } + + private val recyclerViewConfigured: RecyclerView by lazy { + customDialogList.getRecyclerView().apply { + layoutManager = + LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false) + adapter = expeditionScanAdapter + } + } companion object { fun newInstance(title: String) = RoutesFragment(title) @@ -78,30 +115,15 @@ class RoutesFragment( } val pendingExpedition = db.expedicionDao().getAllPendingExpeditions() - val pendingExpeditionSend = pendingExpedition.map { l -> - ExpeditionSalix( - expeditionFk = l.id, stateCode = l.code, l.isScanned - ) - } + if (pendingExpedition.isNotEmpty()) { + val pendingExpeditionSend = pendingExpedition.map { l -> + ExpeditionSalixPosition( + expeditionFk = l.id, stateCode = l.code, l.isScanned, l.scanOrder + ) + } - if (pendingExpeditionSend.any { it.stateCode == "DELIVERED" }) { viewModel.expeditionStateAddSalix( - hashMapOf("expeditions" to pendingExpeditionSend.filter { it.stateCode == "DELIVERED" }) - ) - } - if (pendingExpeditionSend.any { it.stateCode == "ON DELIVERY" }) { - viewModel.expeditionStateAddSalix( - hashMapOf("expeditions" to pendingExpeditionSend.filter { it.stateCode == "ON DELIVERY" }) - ) - } - if (pendingExpeditionSend.any { it.stateCode == "LOST" }) { - viewModel.expeditionStateAddSalix( - hashMapOf("expeditions" to pendingExpeditionSend.filter { it.stateCode == "LOST" }) - ) - } - if (pendingExpeditionSend.any { it.stateCode == "FOUND" }) { - viewModel.expeditionStateAddSalix( - hashMapOf("expeditions" to pendingExpeditionSend.filter { it.stateCode == "FOUND" }) + hashMapOf("expeditions" to pendingExpeditionSend) ) } @@ -123,10 +145,10 @@ class RoutesFragment( } } - private fun deleteExpeditionsPending(codeState: String) { + private fun deleteExpeditionsPending() { lifecycleScope.launch { withContext(Dispatchers.IO) { - db.expedicionDao().getDeleteByState(codeState) + db.expedicionDao().getDeleteAllState() } } @@ -152,6 +174,13 @@ class RoutesFragment( iconInfo.tooltipText = getTooltip(R.drawable.ic_info_delivery) iconRefresh.tooltipText = getTooltip(R.drawable.ic_info_refresh) iconSearch.tooltipText = getTooltip(R.drawable.expedition_find) + + val iconMove = ImageView(context) + iconMove.setImageResource(R.drawable.ic_move_expedition) + iconMove.tooltipText = getString(R.string.moveExpedition) + + //Tarea 8150 + listIcons.add(iconMove) listIcons.add(iconInfo) listIcons.add(iconRefresh) listIcons.add(iconSearch) @@ -179,6 +208,10 @@ class RoutesFragment( getString(R.string.titleLog) ) } + + iconMove.drawable -> { + showExpeditionScan() + } } } }) @@ -188,6 +221,81 @@ class RoutesFragment( binding.mainToolbar.toolbarIcons.visibility = View.VISIBLE } + private fun showExpeditionScan() { + listExpeditionScan.clear() + listMyRoutes.clear() + expeditionScanAdapter!!.updateItems(listExpeditionScan) + expeditionScanAdapter!!.setShowDelete(true) + customDialogList.setTitle(getString(R.string.scanExpeditionForMove)) + .setOkButton(getString(R.string.moveToRoute)) { + ma.hideKeyboard(customDialogList.getEditText()) + customDialogList.dismiss() + showRoutes() + + }.setKoButton(getString(R.string.cancel)) { + customDialogList.dismiss() + requireContext().hideKeyboard(binding.scanInput) + }.setValue("").showDialog().show() + + customDialogList.getEditText().requestFocus() + ma.hideKeyboard(customDialogList.getEditText()) + customDialogList.getEditText().setOnEditorActionListener { _, actionId, _ -> + if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) { + if (customDialogList.getValue().isNotEmpty()) { + val expeditionScan = itemScanValue( + customDialogList.getValue(), arrayOf("expeditionPallet"), "id" + ).toString() + listExpeditionScan.add( + GeneralItem( + expeditionScan, expeditionScan + ) + ) + expeditionScanAdapter?.notifyItemChanged(0) + } + customDialogList.setValue("") + ma.hideKeyboard(customDialogList.getEditText()) + return@setOnEditorActionListener true + } + false + } + + recyclerViewConfigured + requireContext().hideKeyboard(customDialogList.getEditText()) + } + + private fun showRoutes() { + listMyRoutes.clear() + expeditionScanAdapter!!.updateItems( + ArrayList(myListRoute.map { routeInfo -> + GeneralItem( + code = routeInfo.id.toString(), text = routeInfo.id.toString() + ) + }) + ) + expeditionScanAdapter!!.setShowDelete(false) + customDialogList.setTitle(getString(R.string.selectRoute)) + .setKoButton(getString(R.string.cancel)) { + customDialogList.dismiss() + requireContext().hideKeyboard(binding.scanInput) + }.setValue("").hideDialog().show() + requireContext().hideKeyboard(customDialogList.getEditText()) + recyclerViewConfigured + + } + + private fun getDataForMoveExpeditions(routeId: String) { + val routeItem = myListRoute.find { it.id == routeId.toLong() } + for (expedition in listExpeditionScan) { + viewModel.getDataFromExpedition( + routeId = routeId.toLong(), + expeditionId = expedition.code!!.toLong(), + landed = routeItem!!.created.toString() + ) + } + customDialogList.dismiss() + + } + private fun setEvents() { binding.mainToolbar.backButton.setOnClickListener { ma.onMyBackPressed() @@ -204,7 +312,6 @@ class RoutesFragment( } override fun afterTextChanged(s: Editable?) { - } }) @@ -262,7 +369,7 @@ class RoutesFragment( if (it) { binding.mainToolbar.toolbarIcons.visibility = View.VISIBLE - deleteExpeditionsPending("") + deleteExpeditionsPending() } } @@ -302,8 +409,7 @@ class RoutesFragment( "showTickets" -> { ma.onPasillerosItemClickListener( - PasillerosItemVO(title = R.string.tickets), - Gson().toJson(item) + PasillerosItemVO(title = R.string.tickets), Gson().toJson(item) ) } } diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/SalaryComplementFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/SalaryComplementFragment.kt new file mode 100644 index 00000000..3f52095e --- /dev/null +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/SalaryComplementFragment.kt @@ -0,0 +1,175 @@ +package es.verdnatura.presentation.view.feature.delivery.fragments + +import android.app.DatePickerDialog +import android.graphics.drawable.Drawable +import android.view.View +import android.widget.ImageView +import androidx.recyclerview.widget.LinearLayoutManager +import es.verdnatura.R +import es.verdnatura.databinding.FragmentSalaryComplementBinding +import es.verdnatura.domain.toDateString +import es.verdnatura.presentation.base.BaseFragment +import es.verdnatura.presentation.common.OnOptionsSelectedListener +import es.verdnatura.presentation.common.OnSalarySupplementClickListener +import es.verdnatura.presentation.common.ToolBarAdapterTooltip +import es.verdnatura.presentation.view.commom.NameWithId +import es.verdnatura.presentation.view.commom.SearchableAdapter +import es.verdnatura.presentation.view.feature.delivery.adapters.SalarySupplementAdapter +import es.verdnatura.presentation.view.feature.delivery.model.RouteActionList +import es.verdnatura.presentation.view.feature.delivery.model.RouteComplement +import es.verdnatura.presentation.view.feature.delivery.model.RouteComplementAdd +import es.verdnatura.presentation.view.feature.delivery.viewmodels.DeliveryViewModel +import java.time.LocalDate +import java.time.format.DateTimeFormatter +import java.util.Calendar +import java.util.Date + +class SalaryComplementFragment( + var entryPoint: String = "" + +) : BaseFragment( + DeliveryViewModel::class +) { + + private val adapterComplement: SalarySupplementAdapter by lazy { + SalarySupplementAdapter(emptyList(), object : OnSalarySupplementClickListener { + override fun onSalarySupplementClickListener(item: RouteComplement) { + viewModel.routeComplementDelete( + item.id, + binding.date.text.toString(), + mobileApplication.userId!! + ) + } + }) + } + + private val layoutManager: LinearLayoutManager by lazy { + LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false) + } + + private lateinit var routeActionComplementsList: RouteActionList + + companion object { + fun newInstance(entryPoint: String) = SalaryComplementFragment(entryPoint) + } + + override fun getLayoutId(): Int = R.layout.fragment_salary_complement + + private fun showDatePicker() { + val currentDate = Calendar.getInstance() + val year = currentDate[Calendar.YEAR] + val month = currentDate[Calendar.MONTH] + val day = currentDate[Calendar.DAY_OF_MONTH] + + DatePickerDialog( + requireContext(), { _, selectedYear, selectedMonth, selectedDay -> + binding.date.text = + getString(R.string.dateDay, selectedDay, selectedMonth + 1, selectedYear) + viewModel.getRouteComplements( + binding.date.text.toString(), + mobileApplication.userId!! + ) + }, year, month, day + ).apply { + setTitle(getString(R.string.selectDate)) + show() + } + } + + override fun init() { + viewModel.getRouteAction() + binding.date.text = toDateString(Date()) + viewModel.getRouteComplements(binding.date.text.toString(), mobileApplication.userId!!) + ma.hideBottomNavigation(View.GONE) + setToolBar() + setEvents() + super.init() + } + + private fun setToolBar() { + binding.mainToolbar.toolbarTitle.text = getString(R.string.supplementDelivery) + binding.mainToolbar.toolbarIcons.visibility = View.VISIBLE + val iconAdd = ImageView(context).apply { + setImageResource(R.drawable.ic_add_black_24dp) + tooltipText = getTooltip(R.drawable.ic_add_black_24dp) + } + + binding.mainToolbar.toolbarIcons.adapter = + ToolBarAdapterTooltip(listOf(iconAdd), object : OnOptionsSelectedListener { + + override fun onOptionsItemSelected(item: Drawable) { + + when (item) { + iconAdd.drawable -> { + binding.salarySearchableRecyclerView.visibility = View.VISIBLE + } + + } + + } + + }) + + binding.mainToolbar.toolbarIcons.layoutManager = + LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false) + } + + private fun setEvents() { + binding.mainToolbar.backButton.setOnClickListener { + ma.onMyBackPressed() + } + binding.date.setOnClickListener { + showDatePicker() + } + } + + private fun setSearchable(listElements: MutableList) { + + val searchableRecyclerView = binding.salarySearchableRecyclerView + val adapter = + SearchableAdapter( + listElements = listElements, + context = requireContext() + ) { nameWithId -> + val foundItem = routeActionComplementsList.list.find { item -> + item.id == nameWithId.id + } + foundItem?.apply { + val dateFormatted = LocalDate.parse( + binding.date.text.toString(), DateTimeFormatter.ofPattern("dd-MM-yyyy") + ).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + viewModel.addRouteComplements( + RouteComplementAdd( + workerFk = mobileApplication.userId!!, + routeActionFk = foundItem.id, + price = foundItem.price, + dated = dateFormatted, + ) + ) + + } + searchableRecyclerView.visibility = View.GONE + } + searchableRecyclerView.setAdapter(adapter, listElements) + + } + + override fun observeViewModel() { + with(viewModel) { + routeActionList.observe(viewLifecycleOwner) { list -> + routeActionComplementsList = list + setSearchable(list.list.map { item -> + NameWithId( + id = item.id, + name = item.name + ) + }.toMutableList()) + } + routeComplementList.observe(viewLifecycleOwner) { + adapterComplement.updateData(it.list) + binding.salaryComplementRecyclerview.adapter = adapterComplement + binding.salaryComplementRecyclerview.layoutManager = layoutManager + } + } + } +} diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/SummaryFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/SummaryFragment.kt index 6a6b690b..ca220953 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/SummaryFragment.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/SummaryFragment.kt @@ -22,7 +22,7 @@ import es.verdnatura.presentation.common.ToolBarAdapterTooltip import es.verdnatura.presentation.view.feature.delivery.adapters.ExpeditionSummaryAdapter import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionInfoLoadUnload import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionInfoSummary -import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionSalix +import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionSalixPosition import es.verdnatura.presentation.view.feature.delivery.viewmodels.DeliveryViewModel import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO @@ -39,8 +39,6 @@ class SummaryFragment( private var originalItem: Int = 0 private lateinit var myList: MutableList private lateinit var myListSummary: List - private var counterCalls = 0 - private var counterResponse = 0 private var positionOnScreen = 0 private var addressFkSelected = 0 private var routeSelected = 0 @@ -151,19 +149,20 @@ class SummaryFragment( list: MutableList, state: String, address: Int ) { val listExpedition = list.filter { it.addressFk == address }.map { l -> - ExpeditionSalix( - expeditionFk = l.id, stateCode = if (l.code == state && l.code != "DELIVERED") { - state - } else { - "FOUND" - }, - isScanned = l.isScanned + ExpeditionSalixPosition( + expeditionFk = l.id, stateCode = if (l.code == "FOUND") (l.code) else { + if (state == "ON DELIVERY" && l.code != "ON DELIVERY" && l.code != "DELIVERED" && l.code != "LOST") { + "NOT SCANNED" + } else { + if (state == "DELIVERED" && l.code != "DELIVERED") "LOST" else l.code + } + }, isScanned = l.isScanned, scanOrder = l.scanOrder + ) } if (list.filter { it.addressFk == address } .filter { it.code == state }.size == list.filter { it.addressFk == address }.size) { - counterCalls = 1 viewModel.expeditionStateAddSalix( hashMapOf("expeditions" to listExpedition.filter { it.stateCode == state }) ) @@ -178,8 +177,7 @@ class SummaryFragment( android.app.AlertDialog.BUTTON_POSITIVE, getString(R.string.save) ) { _, _ -> - counterCalls = 1 - viewModel.expeditionStateAddSalix(hashMapOf("expeditions" to listExpedition.filter { it.stateCode == state })) + viewModel.expeditionStateAddSalix(hashMapOf("expeditions" to listExpedition)) } alertDialog.setButton( @@ -235,15 +233,22 @@ class SummaryFragment( found = true exped.code = state exped.isScanned = isScanned + + println( + "scanOrder markExpedition${ + myList.filter { it.addressFk == addressFkSelected } + .filter { it.code == state }.size + }" + ) + + exped.scanOrder = myList.filter { it.addressFk == addressFkSelected } + .filter { it.code == state }.size break } } if (found) { ma.messageWithSound( - message = "", - isError = false, - isPlayed = true, - isToasted = false + message = "", isError = false, isPlayed = true, isToasted = false ) } else { ma.messageWithSound(message = "", isError = true, isPlayed = true, isToasted = null) @@ -279,13 +284,10 @@ class SummaryFragment( } responseStateAdd.observe(viewLifecycleOwner) { if (it) { - counterResponse += 1 - if (counterResponse == counterCalls) { - viewModel.routeGetExpeditionSummary(routeSelected) - counterResponse = 0 - counterCalls = 0 - checkNextAddress() - } + + viewModel.routeGetExpeditionSummary(routeSelected) + checkNextAddress() + } } @@ -338,7 +340,14 @@ class SummaryFragment( viewModel.getExpeditionFromRoute(routeSelected) } + println("address $addressFkSelected") + println("address isScanning $isScanning") + if (addressFkSelected != item.addressFk && isScanning) { + println("address isScanning $isScanning") + println("address setSTATE $state") + println("address address $addressFkSelected") + setExpeditionsState(myList, state, addressFkSelected) } diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/TicketsFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/TicketsFragment.kt index 31b31f40..0abb0e6e 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/TicketsFragment.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/fragments/TicketsFragment.kt @@ -31,6 +31,7 @@ import es.verdnatura.presentation.common.GeneralAdapter import es.verdnatura.presentation.common.GeneralItem import es.verdnatura.presentation.common.ItemDescorationCustomized import es.verdnatura.presentation.common.OnGeneralItemRowClickListener +import es.verdnatura.presentation.common.OnGeneralRowClickListener import es.verdnatura.presentation.common.OnItemButtonCMRRowClickListener import es.verdnatura.presentation.common.OnItemButtonTicketRowClickListener import es.verdnatura.presentation.common.OnOptionsSelectedListener @@ -102,7 +103,6 @@ class TicketsFragment : BaseFragment( binding.mainToolbar.toolbarTitle.text = route.name viewModel.getTickets(route.id) db = database(requireContext().applicationContext) - println("tickets in ") } @@ -608,32 +608,33 @@ class TicketsFragment : BaseFragment( customDialogList.dismiss() }.hideDialog().show() - val listPhonesAdapter = GeneralAdapter(phones, object : OnGeneralItemRowClickListener { - override fun onGeneralItemRowClickListener(item: GeneralItem) { - phones.forEach { - if (it.code == item.code) { - if (ContextCompat.checkSelfPermission( - requireContext(), Manifest.permission.CALL_PHONE - ) == PackageManager.PERMISSION_GRANTED - ) { - val callIntent = Intent(Intent.ACTION_CALL) - callIntent.data = Uri.parse("tel:${it.code}") - startActivity(callIntent) - return@forEach + val listPhonesAdapter = + GeneralAdapter(phones, onRowClickListener = object : OnGeneralRowClickListener { + override fun onRowClickListener(item: GeneralItem) { + phones.forEach { + if (it.code == item.code) { + if (ContextCompat.checkSelfPermission( + requireContext(), Manifest.permission.CALL_PHONE + ) == PackageManager.PERMISSION_GRANTED + ) { + val callIntent = Intent(Intent.ACTION_CALL) + callIntent.data = Uri.parse("tel:${it.code}") + startActivity(callIntent) + return@forEach + } + } else { + ActivityCompat.requestPermissions( + context as Activity, + arrayOf(Manifest.permission.CALL_PHONE), + REQUEST_CALL_PERMISSION + ) } - } else { - ActivityCompat.requestPermissions( - context as Activity, - arrayOf(Manifest.permission.CALL_PHONE), - REQUEST_CALL_PERMISSION - ) + customDialogList.dismiss() } - customDialogList.dismiss() } - } - }) + }) customDialogList.getRecyclerView().adapter = listPhonesAdapter customDialogList.getRecyclerView().layoutManager = diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/model/ClientTicket.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/model/ClientTicket.kt index ce5e5916..77c5e4b1 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/model/ClientTicket.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/model/ClientTicket.kt @@ -5,6 +5,7 @@ import androidx.room.PrimaryKey import androidx.room.TypeConverters import com.google.gson.annotations.SerializedName import es.verdnatura.db.MapTypeConverter +import es.verdnatura.domain.isoToString import java.io.Serializable class ClientTicketList( @@ -58,12 +59,13 @@ data class TicketObservation ( var ticketFk: Long, var description: String, - var observationType:ObservationType?=null + var observationType: ObservationType? = null ) data class ObservationType( - var code:String? + var code: String? ) + @Entity(tableName = "signedPending") data class SignedTickets( @TypeConverters(MapTypeConverter::class) val queryMapList: MutableMap, @@ -71,3 +73,48 @@ data class SignedTickets( val fileName: String ) +data class RouteActionList( + var list: List = listOf() +) + +data class RouteAction( + val id: Number, + val price: Double, + val name: String, +) + +data class RouteComplementList( + var list: List = listOf() +) + +data class RouteComplement( + val id: Number, + val price: Number, + val workerFk: Number, + val routeAction: RouteAction +) { + var dated: String = "" + get() { + return field.isoToString(returnOnlyDate = true) + } +} + +data class RouteComplementAdd( + val price: Number, + val workerFk: Number, + val routeActionFk: Number, + val dated: String, +) + +data class ExpeditionWithTicket( + val id: Number, + val ticket: TicketExpedition, + + ) + +data class TicketExpedition( + val clientFk: Number, + val warehouseFk: Number, + val addressFk: Number, + val agencyModeFk: Number +) diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/model/InfoCompany.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/model/InfoCompany.kt index aa6b5b14..b8a70f21 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/model/InfoCompany.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/model/InfoCompany.kt @@ -31,6 +31,17 @@ class ExpeditionSalix( val isScanned: Int? = 0 ) +data class ExpeditionsPosition( + val expeditions: List = listOf() +) + +data class ExpeditionSalixPosition( + val expeditionFk: Number, + val stateCode: String? = null, + val isScanned: Int? = 0, + val scanOrder: Int? = null +) + class ExpeditionInfoList( var list: List = listOf() ) @@ -67,7 +78,7 @@ data class Agency( class TicketSalix( var id: Int, var routeFk: Int?, - var route: RouteSalix, + var route: RouteSalix?, ) @@ -106,7 +117,8 @@ class ExpeditionInfoLoadUnload( var code: String?, var nickname: String, var postalCode: String, - var isScanned: Int? = null + var isScanned: Int? = null, + var scanOrder: Int? = null ) : Serializable @Entity(tableName = "expeditionPending") @@ -121,7 +133,8 @@ class ExpeditionInfoPending( var code: String?, var nickname: String, var postalCode: String, - var isScanned: Int? = 0 + var isScanned: Int? = 0, + var scanOrder: Int? = null ) : Serializable @@ -167,7 +180,8 @@ class RouteInfo( var finished: String, var header: Boolean = false, //tarea 5867 - var email: String? = null + var email: String? = null, + var agencyModeFk: Int ) : Serializable { override fun toString(): String { return "$driver$id$name$numberPlate$m3$created$hour$" diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/viewmodels/DeliveryViewModel.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/viewmodels/DeliveryViewModel.kt index db8ace6b..9877d417 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/viewmodels/DeliveryViewModel.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/delivery/viewmodels/DeliveryViewModel.kt @@ -11,6 +11,7 @@ import es.verdnatura.presentation.base.BaseViewModel import es.verdnatura.presentation.common.Event import es.verdnatura.presentation.common.ExpeditionPrintOut import es.verdnatura.presentation.common.ResponseSign +import es.verdnatura.presentation.common.getDayBounds import es.verdnatura.presentation.view.feature.delivery.model.ClientTicketList import es.verdnatura.presentation.view.feature.delivery.model.ClientTicketSalix import es.verdnatura.presentation.view.feature.delivery.model.DeliveryInfo @@ -20,7 +21,13 @@ import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionInfoLog import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionInfoSummary import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionList import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionSummaryList +import es.verdnatura.presentation.view.feature.delivery.model.ExpeditionWithTicket import es.verdnatura.presentation.view.feature.delivery.model.FreeLanceDeliveryInfoList +import es.verdnatura.presentation.view.feature.delivery.model.RouteAction +import es.verdnatura.presentation.view.feature.delivery.model.RouteActionList +import es.verdnatura.presentation.view.feature.delivery.model.RouteComplement +import es.verdnatura.presentation.view.feature.delivery.model.RouteComplementAdd +import es.verdnatura.presentation.view.feature.delivery.model.RouteComplementList import es.verdnatura.presentation.view.feature.delivery.model.RouteDelivery import es.verdnatura.presentation.view.feature.delivery.model.RouteDeliveryList import es.verdnatura.presentation.view.feature.delivery.model.RouteInfo @@ -35,6 +42,8 @@ import org.json.JSONObject import retrofit2.Call import retrofit2.Response import java.io.File +import java.time.LocalDate +import java.time.format.DateTimeFormatter class DeliveryViewModel(val context: Context) : BaseViewModel(context) { @@ -106,6 +115,143 @@ class DeliveryViewModel(val context: Context) : BaseViewModel(context) { private val _responseStateList by lazy { MutableLiveData() } val responseStateList: LiveData = _responseStateList + + private val _routeActionList by lazy { MutableLiveData() } + val routeActionList: LiveData = _routeActionList + + private val _routeComplementList by lazy { MutableLiveData() } + val routeComplementList: LiveData = _routeComplementList + + private val _routeActionAdd by lazy { MutableLiveData() } + val routeActionAdd: LiveData = _routeActionAdd + + fun getRouteAction() { + salix.getRouteAction() + .enqueue(object : SalixCallback>(context) { + override fun onSuccess(response: Response>) { + _routeActionList.value = + response.body()?.let { RouteActionList(it) } + } + + }) + } + + fun getDataFromExpedition(expeditionId: Number, routeId: Number, landed: String) { + salix.getDataFromExpedition( + filter = """ + |{ + |"where": + |{"id":$expeditionId}, + |"fields":["id","ticketFk"], + |"include": + |{ + |"relation":"ticket", + |"scope":{ + |"fields":["clientFk","addressFk","warehouseFk","agencyModeFk"] + | } + |} + |}""".trimMargin() + ) + .enqueue(object : SalixCallback>(context) { + override fun onSuccess(response: Response>) { + val myTicketData = response.body()!![0] + moveExpeditions( + clientId = myTicketData.ticket.clientFk, + addressId = myTicketData.ticket.addressFk, + warehouseId = myTicketData.ticket.warehouseFk, + routeId = routeId, + agencyModeId = myTicketData.ticket.agencyModeFk, + expeditionsId = arrayListOf(expeditionId), + landed = landed + ) + + } + }) + } + + fun addRouteComplements(routeComplementAdd: RouteComplementAdd) { + salix.addRouteComplements(routeComplementAdd) + .enqueue(object : SalixCallback(context) { + override fun onSuccess(response: Response) { + getRouteComplements( + LocalDate.parse( + routeComplementAdd.dated, + DateTimeFormatter.ofPattern("yyyy-MM-dd") + ) + .format(DateTimeFormatter.ofPattern("dd-MM-yyyy")), + workerFk = routeComplementAdd.workerFk + ) + } + + }) + } + + fun moveExpeditions( + clientId: Number, + warehouseId: Number, + addressId: Number, + agencyModeId: Number, + routeId: Number, + expeditionsId: ArrayList, + landed: String + ) { + salix.moveExpeditions( + clientId, warehouseId, addressId, agencyModeId, routeId, expeditionsId, landed + + ).enqueue(object : SalixCallback(context) { + override fun onSuccess(response: Response) { + } + }) + } + + fun getRouteComplements(date: String, workerFk: Number) { + val (startOfDay, endOfDay) = getDayBounds(date) + salix.getRouteComplements( + """{ + |"where": { + |"and": [ + |{ + |"dated": { + |"between": ["$startOfDay", "$endOfDay"] + |} + |}, + |{ + |"workerFK": "$workerFk" + |} + |] + |}, + |"include": [ + |{ + |"relation": "routeAction", + |"scope": { + |"fields": { + |"routeActionFk": true, + |"name": true + |} + |} + |} + |] + |}""".trimMargin() + ) + .enqueue(object : SalixCallback>(context) { + override fun onSuccess(response: Response>) { + _routeComplementList.value = + response.body()?.let { RouteComplementList(it) } + } + + }) + } + + fun routeComplementDelete(id: Number, date: String, workerFk: Number) { + salix.routeComplementDelete(id) + .enqueue(object : SalixCallback(context) { + override fun onSuccess(response: Response) { + getRouteComplements(date, workerFk) + } + + }) + } + fun getTicketObservations( listTickets: List diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/inventario/fragment/InventaryFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/inventario/fragment/InventaryFragment.kt index ce578998..e0a78a80 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/inventario/fragment/InventaryFragment.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/inventario/fragment/InventaryFragment.kt @@ -18,13 +18,13 @@ import es.verdnatura.presentation.common.OnInvetoryNichoClickListener import es.verdnatura.presentation.common.OnOptionsSelectedListener import es.verdnatura.presentation.common.OnPasillerosItemClickListener import es.verdnatura.presentation.common.ToolBarAdapterTooltip +import es.verdnatura.presentation.view.commom.NameWithId +import es.verdnatura.presentation.view.commom.SearchableAdapter import es.verdnatura.presentation.view.component.CustomDialogInput import es.verdnatura.presentation.view.component.CustomDialogTwoButtons -import es.verdnatura.presentation.view.feature.calidad.model.BuyerVO import es.verdnatura.presentation.view.feature.inventario.adapter.InventoryAdapter import es.verdnatura.presentation.view.feature.inventario.model.ItemInventaryVO import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO -import ir.mirrajabi.searchdialog.SimpleSearchDialogCompat import kotlinx.coroutines.launch @Suppress("UNUSED_ANONYMOUS_PARAMETER") @@ -39,10 +39,8 @@ class InventaryFragment : private var pasillerosItemClickListener: OnPasillerosItemClickListener? = null private var layoutManager: LinearLayoutManager? = null private var firstVisiblePosition = 0 - private var secondVisiblePosition = 1 private lateinit var itemClicked: ItemInventaryVO - private val items = ArrayList() - private lateinit var buyerId: String + private var buyerId: Number = -1 companion object { fun newInstance() = InventaryFragment() @@ -59,39 +57,17 @@ class InventaryFragment : viewModel.itemShelvingBuyerGet() binding.filterBuyer.text = mobileApplication.dataStoreApp.readDataStoreKey((BUYER)) - buyerId = mobileApplication.dataStoreApp.readDataStoreKey((BUYERID)) - if (buyerId.isNotBlank()) { + buyerId = mobileApplication.dataStoreApp.readDataStoreKey((BUYERID)) + if (buyerId != -1) { viewModel.getInventory( - buyerId.toInt(), mobileApplication.dataStoreApp.readDataStoreKey(WAREHOUSEFK) + buyerId, mobileApplication.dataStoreApp.readDataStoreKey(WAREHOUSEFK) ) } binding.filterBuyer.setOnClickListener { - SimpleSearchDialogCompat( - context, - getString(R.string.compradores), - getString(R.string.escribirparteNombre), - null, - items - ) { baseSearchDialogCompat, nombre, position -> - - binding.filterBuyer.text = (nombre.title) - buyerId = nombre.getBuyerId() - - lifecycleScope.launch { - mobileApplication.dataStoreApp.editDataStoreKey( - BUYER, nombre.getBuyerNickname() - ) - mobileApplication.dataStoreApp.editDataStoreKey( - BUYERID, nombre.getBuyerId() - ) - } - viewModel.getInventory( - nombre.getBuyerId().toInt(), - mobileApplication.dataStoreApp.readDataStoreKey(WAREHOUSEFK) - ) - baseSearchDialogCompat.dismiss() - }.show() + binding.searchableRecyclerView.visibility = View.VISIBLE + binding.searchableRecyclerView.setSearchHint(getString(R.string.BuyerSearch)) } + customDialogInput = CustomDialogInput(requireContext()) customDialog = CustomDialogTwoButtons(requireContext()) binding.mainToolbar.toolbarTitle.text = getString(R.string.itemShelvingRadar) @@ -100,6 +76,36 @@ class InventaryFragment : super.init() } + private fun setSearchable(listNames: MutableList) { + + val adapter = + SearchableAdapter( + listElements = listNames, + context = requireContext() + ) { elementSelected -> + + lifecycleScope.launch { + mobileApplication.dataStoreApp.editDataStoreKey( + BUYER, elementSelected.name + ) + mobileApplication.dataStoreApp.editDataStoreKey( + BUYERID, elementSelected.id + ) + } + viewModel.getInventory( + elementSelected.id, + mobileApplication.dataStoreApp.readDataStoreKey(WAREHOUSEFK) + ) + binding.filterBuyer.text = (elementSelected.name) + buyerId = elementSelected.id + binding.searchableRecyclerView.visibility = View.GONE + + } + + binding.searchableRecyclerView.setAdapter(adapter, listNames) + + } + private fun setToolBar() { ma.hideBottomNavigation(View.GONE) val listIcons: ArrayList = ArrayList() @@ -114,9 +120,9 @@ class InventaryFragment : if (item == iconReload.drawable) { firstVisiblePosition = layoutManager?.findFirstVisibleItemPosition() ?: 0 - if (buyerId.isNotBlank()) { + if (buyerId != -1) { viewModel.getInventory( - buyerId.toInt(), + buyerId, mobileApplication.dataStoreApp.readDataStoreKey(WAREHOUSEFK) ) } else { @@ -157,7 +163,7 @@ class InventaryFragment : setFilterItem() } - adapter!!.notifyDataSetChanged() + adapter?.notifyDataSetChanged() return@setOnKeyListener false } } @@ -178,8 +184,13 @@ class InventaryFragment : override fun observeViewModel() { with(viewModel) { - buyersList.observe(viewLifecycleOwner) { - createBuyerList(it.list) + buyersList.observe(viewLifecycleOwner) { item -> + setSearchable(item.list.map { + NameWithId( + it.userFk, + it.nickname + ) + } as MutableList) } inventaryList.observe(viewLifecycleOwner) { it -> @@ -265,13 +276,6 @@ class InventaryFragment : } - private fun createBuyerList(list: List) { - items.clear() - if (list.isNotEmpty()) list.forEach { buyer -> - items.add(SearchBuyerModel(buyer.nickname, buyer.userFk)) - } - } - } diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/inventario/fragment/InventaryParkingFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/inventario/fragment/InventaryParkingFragment.kt index ecad08c3..d0dafc0c 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/inventario/fragment/InventaryParkingFragment.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/inventario/fragment/InventaryParkingFragment.kt @@ -44,7 +44,6 @@ import es.verdnatura.presentation.view.feature.inventario.model.ItemShelvingVisi import es.verdnatura.presentation.view.feature.inventario.model.ItemShelvingVisibleZero import es.verdnatura.presentation.view.feature.ubicador.model.ItemUbicadorVO import kotlinx.coroutines.runBlocking -import timber.log.Timber.d @Suppress("UNUSED_ANONYMOUS_PARAMETER") class InventaryParkingFragment( @@ -77,13 +76,15 @@ class InventaryParkingFragment( override fun getLayoutId(): Int = R.layout.fragment_inventory_parking override fun onPause() { - try { + // try { + if (binding.inventoryParkingRecyclerview.layoutManager != null) { val layoutManager = binding.inventoryParkingRecyclerview.layoutManager as LinearLayoutManager scrollPosition = layoutManager.findFirstVisibleItemPosition() - } catch (exception: Exception) { - d(exception) } + /* } catch (ex: Exception) { + ex.message!! + "hola".toast(requireContext()) + }*/ isBack = true super.onPause() @@ -193,7 +194,7 @@ class InventaryParkingFragment( ) } catch (ex: Exception) { - d(ex) + ex.message!!.toast(requireContext()) } } @@ -475,10 +476,14 @@ class InventaryParkingFragment( ex.message!!.toast(requireContext()) } - - positionShelvingChecking = myListInventory.indexOfFirst { item -> - item.shelvingFk.uppercase() == binding.editMatricula.text.toString() + positionShelvingChecking = try { + myListInventory.indexOfFirst { item -> + item.shelvingFk.uppercase() == binding.editMatricula.text.toString() + } + } catch (ex: Exception) { + -1 } + if (positionShelvingChecking != -1) { shelvingSaved = myListInventory[positionShelvingChecking].shelvingFk.uppercase() @@ -611,7 +616,7 @@ class InventaryParkingFragment( positionShelvingChecking = -1 } catch (ex: Exception) { - d(ex) + ex.message!!.toast(requireContext()) } } } diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/inventario/fragment/InventaryViewModel.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/inventario/fragment/InventaryViewModel.kt index 019dcc2b..1294b65e 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/inventario/fragment/InventaryViewModel.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/inventario/fragment/InventaryViewModel.kt @@ -82,7 +82,7 @@ class InventaryViewModel(val context: Context) : BaseViewModel(context) { val loadInventaryList: LiveData> = _inventaryList.map { Event(it) } - fun getInventory(buyerFk: Int, warehouseFk: Int) { + fun getInventory(buyerFk: Number, warehouseFk: Int) { salix.itemShelvingFilterBuyer(params = arrayListOf(buyerFk, warehouseFk)) .enqueue(object : SalixCallback>(context) { override fun onSuccess(response: Response>) { @@ -146,7 +146,7 @@ class InventaryViewModel(val context: Context) : BaseViewModel(context) { }) } - fun workerGetFromHasMistake(departmentFk: Int) { + fun workerGetFromHasMistake(departmentFk: Number) { salix.workerGetFromHasMistake(arrayListOf(departmentFk)) .enqueue(object : SalixCallback>(context) { override fun onSuccess(response: Response>) { diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/inventario/fragment/SearchBuyerModel.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/inventario/fragment/SearchBuyerModel.kt deleted file mode 100644 index 3444b17c..00000000 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/inventario/fragment/SearchBuyerModel.kt +++ /dev/null @@ -1,61 +0,0 @@ -package es.verdnatura.presentation.view.feature.inventario.fragment - -import ir.mirrajabi.searchdialog.core.Searchable - -class SearchBuyerModel(private var nickname: String?, private var buyerId: Int?) : Searchable { - - override fun getTitle(): String { - - return nickname!! - } - - fun getBuyerId(): String { - return buyerId.toString() - } - - fun getBuyerNickname(): String { - return nickname!! - } - -} - -class SearchDepartmentModel(private var name: String?, private var departmentId: Int?) : - Searchable { - - override fun getTitle(): String { - - return name!! - } - - fun getDepartmentId(): Int { - return departmentId!! - } - - fun getDepartmentName(): String { - return name!! - } - -} - -class SearchSupplierModel( - private var name: String?, - private var id: String?, - private var observation: String? -) : Searchable { - - fun getId(): String { - return id!! - } - - fun getName(): String { - return name!! - } - - override fun getTitle(): String { - return name!! - } - - fun getObservation(): String { - return observation ?: "" - } -} \ No newline at end of file diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/login/fragment/LoginFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/login/fragment/LoginFragment.kt index 8aac834e..8e1d8961 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/login/fragment/LoginFragment.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/login/fragment/LoginFragment.kt @@ -3,6 +3,7 @@ package es.verdnatura.presentation.view.feature.login.fragment import android.annotation.SuppressLint import android.content.Intent import android.net.Uri +import android.os.Bundle import android.provider.Settings import android.view.View.GONE import android.view.View.VISIBLE @@ -41,7 +42,7 @@ import kotlinx.coroutines.runBlocking import java.util.Date import kotlin.system.exitProcess -class LoginFragment(private var imageUri: Uri?) : +class LoginFragment() : BaseFragment(LoginViewModel::class) { private lateinit var customDialogInput: CustomDialogInput @@ -50,9 +51,23 @@ class LoginFragment(private var imageUri: Uri?) : private var workFormAdapter: WorkFormAdapter? = null private lateinit var customDialogList: CustomDialogList private lateinit var listForms: List + private var imageUri: Uri? = null companion object { - fun newInstance(imageUri: Uri?) = LoginFragment(imageUri) + private const val ARG_IMAGE_URI = "image_uri" + + fun newInstance(imageUri: Uri?): LoginFragment { + return LoginFragment().apply { + arguments = Bundle().apply { + putParcelable(ARG_IMAGE_URI, imageUri) + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + imageUri = arguments?.getParcelable(ARG_IMAGE_URI) } override fun getLayoutId(): Int = R.layout.fragment_login diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/login/model/LoginItemVO.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/login/model/LoginItemVO.kt index 89f4beca..fd0a2d2e 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/login/model/LoginItemVO.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/login/model/LoginItemVO.kt @@ -18,8 +18,8 @@ data class WorkerData( val labelerFk: Int, val sectorFk: Int, val sector: Sector?, - val printer: Printer, - val train: Train, + val printer: Printer?, + val train: Train?, val id: Int, val name: String, val nickname: String, diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/main/activity/MainActivity.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/main/activity/MainActivity.kt index 70a074de..1b7b1b09 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/main/activity/MainActivity.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/main/activity/MainActivity.kt @@ -77,6 +77,7 @@ import es.verdnatura.presentation.view.feature.delivery.fragments.InfoFragment import es.verdnatura.presentation.view.feature.delivery.fragments.LoadUnloadFragment import es.verdnatura.presentation.view.feature.delivery.fragments.LogExpeditionFragment import es.verdnatura.presentation.view.feature.delivery.fragments.RoutesFragment +import es.verdnatura.presentation.view.feature.delivery.fragments.SalaryComplementFragment import es.verdnatura.presentation.view.feature.delivery.fragments.SummaryFragment import es.verdnatura.presentation.view.feature.delivery.fragments.TicketsFragment import es.verdnatura.presentation.view.feature.delivery.model.ClientTicketSalix @@ -142,7 +143,6 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking -import timber.log.Timber.d import java.util.Date import java.util.concurrent.Executors import java.util.concurrent.ScheduledExecutorService @@ -544,23 +544,23 @@ class MainActivity : BaseActivity(), OnPasillerosItemClickL // Ya no se utiliza : addFragmentOnTop(ControladorFragment.newInstance()) - if (mobileApplication.userId == 19591) { - println("Revisando nueva") - addFragmentOnTop( - CollectionFragmentChecker.newInstance( - CollectionVO(collectionFk = 0), - type = CONTROLADOR - ) + // if (mobileApplication.userId == 19591) { + println("Revisando nueva") + addFragmentOnTop( + CollectionFragmentChecker.newInstance( + CollectionVO(collectionFk = 0), + type = CONTROLADOR ) - } else { - println("Revisando vieja") - addFragmentOnTop( - CollectionFragment.newInstance( - CollectionVO(collectionFk = 0), - type = CONTROLADOR - ) - ) - } + ) + /* } else { + println("Revisando vieja") + addFragmentOnTop( + CollectionFragment.newInstance( + CollectionVO(collectionFk = 0), + type = CONTROLADOR + ) + ) + }*/ /* addFragmentOnTop( CollectionFragment.newInstance( CollectionVO(collectionFk = 0), @@ -944,6 +944,10 @@ class MainActivity : BaseActivity(), OnPasillerosItemClickL addFragmentOnTop(PickerHelperFragment.newInstance(itemTitle)) } + getString(R.string.salarySupplementTitle) -> { + addFragmentOnTop(SalaryComplementFragment.newInstance(itemTitle)) + } + "PREITEMPICKERTEST" -> { addFragmentOnTop( CollectionFragmentPickerPreviousNew.newInstance( @@ -986,7 +990,7 @@ class MainActivity : BaseActivity(), OnPasillerosItemClickL } } catch (ex: Exception) { - d("$ex") + ex.message!!.toast(this) } } @@ -1217,7 +1221,7 @@ class MainActivity : BaseActivity(), OnPasillerosItemClickL userFk = (application as MobileApplication).userId!! ) } catch (ex: Exception) { - d(ex.message.toString()) + ex.message!!.toast(this) } } diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/packaging/fragment/SupplierFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/packaging/fragment/SupplierFragment.kt index 3bcc6d8d..f146f0e0 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/packaging/fragment/SupplierFragment.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/packaging/fragment/SupplierFragment.kt @@ -12,15 +12,13 @@ import es.verdnatura.domain.ConstAndValues.SUPPLIERID import es.verdnatura.domain.ConstAndValues.SUPPLIERNAME import es.verdnatura.presentation.base.BaseFragment import es.verdnatura.presentation.common.OnPasillerosItemClickListener +import es.verdnatura.presentation.view.commom.NameWithId +import es.verdnatura.presentation.view.commom.SearchableAdapter import es.verdnatura.presentation.view.component.CustomDialog -import es.verdnatura.presentation.view.feature.inventario.fragment.SearchSupplierModel import es.verdnatura.presentation.view.feature.packaging.model.EntrySalix -import es.verdnatura.presentation.view.feature.packaging.model.Supplier import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO -import ir.mirrajabi.searchdialog.SimpleSearchDialogCompat import kotlinx.coroutines.runBlocking -@Suppress("UNUSED_ANONYMOUS_PARAMETER") class SupplierFragment( var entryPoint: String = "" @@ -31,8 +29,7 @@ class SupplierFragment( private var pasillerosItemClickListener: OnPasillerosItemClickListener? = null private var layoutManager: LinearLayoutManager? = null private var onBack = false - private val suppliers = ArrayList() - private val entries = ArrayList() + private val entries = ArrayList() private lateinit var customDialog: CustomDialog companion object { @@ -59,27 +56,14 @@ class SupplierFragment( override fun init() { binding.filterSupplier.setOnClickListener { - SimpleSearchDialogCompat( - context, - getString(R.string.suppliers), - getString(R.string.escribirparteNombre), - null, - suppliers - ) { baseSearchDialogCompat, nombre, position -> - binding.filterSupplier.text = (nombre.getName()) - runBlocking { - mobileApplication.dataStoreApp.editDataStoreKey( - SUPPLIERNAME, - nombre.getName() - ) - mobileApplication.dataStoreApp.editDataStoreKey( - SUPPLIERID, - nombre.getId().toInt() - ) - } - viewModel.getEntriesFromSupplier(nombre.getId().toInt()) - baseSearchDialogCompat.dismiss() - }.show() + binding.searchableSuplierRecyclerView.visibility = View.VISIBLE + binding.searchableSuplierRecyclerView.setSearchHint(getString(R.string.supplierSearch)) + + } + binding.filterEntry.setOnClickListener { + binding.searchableEntriesRecyclerView.visibility = View.VISIBLE + binding.searchableEntriesRecyclerView.setSearchHint(getString(R.string.entrySearch)) + } customDialog = CustomDialog(requireContext()) ma.hideBottomNavigation(View.GONE) @@ -89,6 +73,64 @@ class SupplierFragment( super.init() } + private fun setSearchable(listNames: MutableList) { + + val adapter = + SearchableAdapter( + listElements = listNames, + context = requireContext() + ) { elementSelected -> + binding.filterSupplier.text = (elementSelected.name) + runBlocking { + mobileApplication.dataStoreApp.editDataStoreKey( + SUPPLIERNAME, + elementSelected.name + ) + mobileApplication.dataStoreApp.editDataStoreKey( + SUPPLIERID, + elementSelected.id + ) + } + viewModel.getEntriesFromSupplier(elementSelected.id) + binding.searchableSuplierRecyclerView.visibility = View.GONE + + } + + binding.searchableSuplierRecyclerView.setAdapter(adapter, listNames) + + } + + private fun setSearchableEntries(listNames: MutableList) { + + val adapter = + SearchableAdapter( + listElements = listNames, + context = requireContext() + ) { elementSelected -> + binding.filterEntry.text = elementSelected.name + runBlocking { + mobileApplication.dataStoreApp.editDataStoreKey( + ENTRYID, + elementSelected.id + ) + mobileApplication.dataStoreApp.editDataStoreKey( + ENTRYOBSERVATIONORIGINAL, + entries.find { it.id == elementSelected.id }?.observation ?: "" + ) + mobileApplication.dataStoreApp.deleteImages() + } + ma.onPasillerosItemClickListener( + PasillerosItemVO(title = R.string.titlePackagingCount), + getString(R.string.titlePackagingCount) + ) + binding.searchableEntriesRecyclerView.visibility = View.GONE + + } + + binding.searchableEntriesRecyclerView.setAdapter(adapter, listNames) + + } + private fun setToolBar() { binding.mainToolbar.toolbarTitle.text = entryPoint } @@ -103,41 +145,18 @@ class SupplierFragment( private fun setEntryDialog() { binding.filterEntry.visibility = View.VISIBLE - binding.filterEntry.setOnClickListener { - SimpleSearchDialogCompat( - context, - getString(R.string.entry), - getString(R.string.escribirparteNombre), - null, - entries - ) { baseSearchDialogCompat, nombre, position -> - binding.filterEntry.text = nombre.getName() - runBlocking { - mobileApplication.dataStoreApp.editDataStoreKey( - ENTRYID, - nombre.getId().toInt() - ) - mobileApplication.dataStoreApp.editDataStoreKey( - ENTRYOBSERVATIONORIGINAL, - nombre.getObservation() - ) - mobileApplication.dataStoreApp.deleteImages() - } - ma.onPasillerosItemClickListener( - PasillerosItemVO(title = R.string.titlePackagingCount), - getString(R.string.titlePackagingCount) - ) - // } - baseSearchDialogCompat.dismiss() - }.show() - } } override fun observeViewModel() { with(viewModel) { - supplierList.observe(viewLifecycleOwner) { - createSupplierList(it.list) + supplierList.observe(viewLifecycleOwner) { item -> + setSearchable(item.list.map { + NameWithId( + it.id!!, + it.name!! + ) + } as MutableList) } entryList.observe(viewLifecycleOwner) { createEntryList(it.list) @@ -162,57 +181,20 @@ class SupplierFragment( } } - private fun createSupplierList(list: List) { - suppliers.clear() - if (list.isNotEmpty()) - - list.forEach { supplier -> - - try { - suppliers.add( - SearchSupplierModel( - supplier.name, - supplier.id.toString(), - observation = "" - ) - ) - } catch (ex: Exception) { - ma.messageWithSound( - message = ex.message.toString(), - isError = true, - isPlayed = true - ) - } - - } - } - private fun createEntryList(list: List) { list.sortedBy { it.travel?.landed } entries.clear() - list.forEach { entry -> - if (!entry.isError) { - - try { - entries.add( - SearchSupplierModel( - entry.id.toString() + "->" + (entry.travel?.landed), - id = entry.id.toString(), - observation = entry.observation - ) - ) - - } catch (ex: Exception) { - ma.messageWithSound( - message = ex.message.toString(), - isError = true, - isPlayed = true - ) - } - } + if (list.isNotEmpty() && !list[0].isError) { + setSearchableEntries(list.map { entry -> + NameWithId( + entry.id!!, + entry.id.toString() + "->" + (entry.travel?.landed) + ) + } as MutableList) + entries.addAll(list.sortedBy { it.travel?.landed }) } + binding.filterEntry.visibility = View.VISIBLE - setEntryDialog() } } diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/packaging/fragment/SupplierViewModel.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/packaging/fragment/SupplierViewModel.kt index 1c1a8be1..28fa47fd 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/packaging/fragment/SupplierViewModel.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/packaging/fragment/SupplierViewModel.kt @@ -70,7 +70,7 @@ class SupplierViewModel(val context: Context) : BaseViewModel(context) { }) } - fun getEntriesFromSupplier(supplier: Int) { + fun getEntriesFromSupplier(supplier: Number) { val calendar = Calendar.getInstance() calendar.add(Calendar.DAY_OF_YEAR, 0) diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/adapter/ExpeditionPalletAdapter.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/adapter/ExpeditionPalletAdapter.kt index deecb558..69c64cea 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/adapter/ExpeditionPalletAdapter.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/adapter/ExpeditionPalletAdapter.kt @@ -1,7 +1,6 @@ package es.verdnatura.presentation.view.feature.paletizador.adapter import android.content.Context -import android.util.Log import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.content.ContextCompat @@ -12,47 +11,63 @@ import es.verdnatura.presentation.common.OnComprobarPalletViewClickListener import es.verdnatura.presentation.common.OnPalletClickListener import es.verdnatura.presentation.view.feature.paletizador.model.ItemExpeditionTruckVO import es.verdnatura.presentation.view.feature.paletizador.model.ItemPalletVO -import timber.log.Timber.d -class ExpeditionPalletAdapter ( +class ExpeditionPalletAdapter( private val items: List, private val onPalletClickListener: OnPalletClickListener, private val onComprobarPalletViewClickListener: OnComprobarPalletViewClickListener, private val itemExpeditionTruckVO: ItemExpeditionTruckVO -): RecyclerView.Adapter () { +) : RecyclerView.Adapter() { - private var context:Context? = null + private var context: Context? = null override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHolder { this.context = parent.context return ItemHolder( - ItemExpeditionpalletRowBinding.inflate(LayoutInflater.from(parent.context),parent,false) + ItemExpeditionpalletRowBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) ) } - override fun getItemCount() =items.size + override fun getItemCount() = items.size override fun onBindViewHolder(holder: ItemHolder, position: Int) { holder.bind(items[position]) holder.binding.root.setOnClickListener { - onPalletClickListener.onPalletClickListener(itemExpeditionTruckVO,items[position]) + onPalletClickListener.onPalletClickListener(itemExpeditionTruckVO, items[position]) } holder.binding.root.setOnLongClickListener { - onComprobarPalletViewClickListener.onComprobarPalletViewClickListener(itemExpeditionTruckVO,items[position]) + onComprobarPalletViewClickListener.onComprobarPalletViewClickListener( + itemExpeditionTruckVO, + items[position] + ) true } } inner class ItemHolder( val binding: ItemExpeditionpalletRowBinding - ) : RecyclerView.ViewHolder(binding.root){ + ) : RecyclerView.ViewHolder(binding.root) { private val res = binding.root.context.resources fun bind(item: ItemPalletVO) { binding.apply { this.item = item - if (item.Rutas != 1){ - expeditionPalletRutas.setTextColor(ContextCompat.getColor(context!!, R.color.verdnatura_red)) - }else { - expeditionPalletRutas.setTextColor(ContextCompat.getColor(context!!, R.color.verdnatura_white)) + if (item.Rutas != 1) { + expeditionPalletRutas.setTextColor( + ContextCompat.getColor( + context!!, + R.color.verdnatura_red + ) + ) + } else { + expeditionPalletRutas.setTextColor( + ContextCompat.getColor( + context!!, + R.color.verdnatura_white + ) + ) } } } diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionDeleteFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionDeleteFragment.kt index 7c5c0275..c32e9a95 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionDeleteFragment.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionDeleteFragment.kt @@ -90,7 +90,7 @@ class ExpeditionDeleteFragment(var title: String = "") : if (binding.editMatricula.text.toString().isNotEmpty()) { try { val itemScaned = itemScanValue( - textScanned_filterDouble(binding.editMatricula.text.toString()), + textScannedFilterDouble(binding.editMatricula.text.toString()), arrayOf("expedition"), "id" ).toString().toLong() @@ -104,7 +104,7 @@ class ExpeditionDeleteFragment(var title: String = "") : adapter!!.updateItems(listExpeditions.map { it.expeditionFk.toLong() } as ArrayList) } else { ma.messageWithSound( - message = "Caja ya escaneada", + message = getString(R.string.boxScanned), isError = true, isPlayed = true, isToasted = true diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionPreparedStateFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionPreparedStateFragment.kt index e647c0ce..71b0e93f 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionPreparedStateFragment.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/paletizador/fragment/ExpeditionPreparedStateFragment.kt @@ -93,7 +93,7 @@ class ExpeditionPreparedStateFragment(var codeState: String = "PREPARED", var ti if (binding.editMatricula.text.toString().isNotEmpty()) { try { val itemScaned = itemScanValue( - textScanned_filterDouble(binding.editMatricula.text.toString()), + textScannedFilterDouble(binding.editMatricula.text.toString()), arrayOf("expedition"), "id" ).toString().toLong() diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/fragment/PasilleroViewModel.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/fragment/PasilleroViewModel.kt index 7ebb926f..290bb800 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/fragment/PasilleroViewModel.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/pasillero/fragment/PasilleroViewModel.kt @@ -513,6 +513,14 @@ class PasilleroViewModel(context: Context) : BaseViewModel(context) { R.drawable.ic_packaging, R.string.titlePackingHolland, R.string.titleUbicatorDescrip ) ) + //tarea 8099 + /* _pasillerositem.add( + PasillerosItemVO( + R.drawable.ic_salary_supplement, + R.string.salarySupplementTitle, + R.string.salarySupplementTitle + ) + )*/ } diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/sacador/fragment/SacadorFragmentNew.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/sacador/fragment/SacadorFragmentNew.kt index c1ba0760..0017d060 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/sacador/fragment/SacadorFragmentNew.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/sacador/fragment/SacadorFragmentNew.kt @@ -3,6 +3,7 @@ package es.verdnatura.presentation.view.feature.sacador.fragment import android.content.Context import android.graphics.drawable.Drawable import android.text.InputType +import android.util.Log.d import android.view.View import android.view.inputmethod.EditorInfo import android.widget.ImageView @@ -242,7 +243,12 @@ class SacadorFragmentNew( } else { if (it.response.isNotBlank()) { if (collectionsList.isNotEmpty()) { - addCollectionToList(it.response.toInt()) + try { + addCollectionToList(it.response.toInt()) + } catch (ex: Exception) { + d("vn", ex.message.toString()) + } + } else { callBack(type) } diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/sacador/model/TicketItemVO.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/sacador/model/TicketItemVO.kt index 157576ff..5a6cab61 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/sacador/model/TicketItemVO.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/sacador/model/TicketItemVO.kt @@ -89,7 +89,9 @@ class CollectionVO( var errorMessage: String = "", var itemPackingTypeFk: String = "", var rgb: String? = null, - var ticketTotalCount: Int? = null + var ticketTotalCount: Int? = null, + var parkingCode: String? = null, + var idAdvanced: Boolean? = null ) class CollectionSalix( @@ -154,7 +156,7 @@ class SaleVO( var cel1: String = "", var cel2: String = "", var cel3: String = "", - var saleGroupFk: String = "", + var saleGroupFk: String? = "", var picked: String? = "", var isParent: Boolean = false, var totalSales: Int = 0, @@ -162,7 +164,9 @@ class SaleVO( var code: String? = "", var hasMistake: Any? = false, var sectorFk: Int? = null, - var packingChecked: Int = 1 + var packingChecked: Int = 1, + var isAdvanced: Int? = 0, + var parkingCode: String? = "" ) @@ -175,8 +179,10 @@ class TicketVO( var sales: List = listOf(), @SerializedName(value = "observations", alternate = ["observaciones"]) var observations: String = "", + var isAdvanced: Int? = 0, + var parkingCode: String? = "" - ) +) data class CollectionIdSalix( var id: Int diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/fragment/AutomaticAddItemFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/fragment/AutomaticAddItemFragment.kt index 76fc8a40..8fdab103 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/fragment/AutomaticAddItemFragment.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/fragment/AutomaticAddItemFragment.kt @@ -86,7 +86,7 @@ class AutomaticAddItemFragment( listItems.add( 0, itemScanValue( - textScanned_filterDouble(binding.editMatricula.text.toString()), + textScannedFilterDouble(binding.editMatricula.text.toString()), arrayOf("buy"), "more" ).toString().toLong() @@ -161,7 +161,7 @@ class AutomaticAddItemFragment( customDialogList.setDescription( getString(R.string.scanShelvingsLocate) ).setOkButton(getString(R.string.locate)) { - + listItems.clear() listShelvings.forEach { viewModel.itemShelvingMakeMulti( it.code!!, diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/fragment/UbicadorFragmentNew.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/fragment/UbicadorFragmentNew.kt index 52fbd99d..76bb8fa4 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/fragment/UbicadorFragmentNew.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/fragment/UbicadorFragmentNew.kt @@ -15,6 +15,7 @@ import android.widget.Toast import androidx.recyclerview.widget.LinearLayoutManager import es.verdnatura.R import es.verdnatura.databinding.FragmentUbicadorBinding +import es.verdnatura.domain.ConstAndValues import es.verdnatura.domain.ConstAndValues.WAREHOUSEFK import es.verdnatura.domain.isShelving import es.verdnatura.domain.notNull @@ -28,6 +29,7 @@ import es.verdnatura.presentation.common.OnOptionsSelectedListener import es.verdnatura.presentation.common.OnPasillerosItemClickListener import es.verdnatura.presentation.common.OnVisibleClickListenerNew import es.verdnatura.presentation.common.ToolBarAdapterTooltip +import es.verdnatura.presentation.common.hideKeyboard import es.verdnatura.presentation.common.itemScanValue import es.verdnatura.presentation.view.component.CustomDialog import es.verdnatura.presentation.view.component.CustomDialogInput @@ -39,6 +41,7 @@ import es.verdnatura.presentation.view.feature.articulo.model.BarcodeVO import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO import es.verdnatura.presentation.view.feature.ubicador.adapter.UbicadorAdapterNew import es.verdnatura.presentation.view.feature.ubicador.model.ItemUbicador +import kotlin.math.ceil @Suppress("UNUSED_ANONYMOUS_PARAMETER") class UbicadorFragmentNew : BaseFragment( @@ -214,18 +217,20 @@ class UbicadorFragmentNew : BaseFragment showAddItemNew( isEditItem = false, null ) - iconAddMultiple.drawable -> + iconAddMultiple.drawable -> { + ma.onPasillerosItemClickListener( PasillerosItemVO( title = R.string.addItemMultipleShelving, ), entryPoint = getString(R.string.addItemMultipleShelving) ) + } iconReload.drawable -> { @@ -339,6 +344,7 @@ class UbicadorFragmentNew : BaseFragment - event.getContentIfNotHandled().notNull { - + listItems.clear() + event.getContentIfNotHandled().notNull { it -> if (isShelvinLogfromMainScreen) { viewModel.shelvingLogAdd(shelvingFk) } - listItems = ArrayList() - val totalStickers = it.list.sumOf { item -> item.stickers } - parking = it.list.firstOrNull { item -> item.code != null }?.code ?: "" listItems.addAll(it.list) + listItems.forEach { item -> + if (item.description.isNullOrEmpty()) { + item.description = + item.longName ?: "${item.name ?: ""} ${item.size ?: ""}" + } + item.stickers = + if (item.packing == null) 0 else ceil((item.visible.toDouble() / item.packing!!.toDouble())).toInt() + } + val totalStickers = listItems.sumOf { item -> item.stickers } + parking = it.list.firstOrNull { item -> item.code != null }?.code ?: "" binding.mainToolbar.toolbarTitle.text = shelvingFk.uppercase() + getString(R.string.pUppercase) + parking + getString( R.string.label ) + totalStickers - if (listItems.isNotEmpty()) binding.editPrioridad.setText(it.list[0].priority.toString()) + if (listItems.isNotEmpty()) binding.editPrioridad.setText(listItems[0].priority?.toString()) if (!binding.mainToolbar.switchButton.isChecked && listItems.isNotEmpty()) { listItems = listItems.asReversed() @@ -649,7 +662,15 @@ class UbicadorFragmentNew : BaseFragment + event.getContentIfNotHandled().notNull { + ma.messageWithSound( + getString(R.string.errorPrintBuy), + isError = true, + isPlayed = true + ) + } + } } } @@ -842,6 +863,7 @@ class UbicadorFragmentNew : BaseFragment + + if (item.buyFk == null) { + viewModel.buyUltimate( + itemFk = item.id, + warehouseFk = mobileApplication.dataStoreApp.readDataStoreKey( + WAREHOUSEFK + ), + dated = LocalDate.now() + .format( + DateTimeFormatter.ofPattern("yyyy-dd-MM") + ), + reportName = "LabelBuy", + printerFk = mobileApplication.dataStoreApp.readDataStoreKey( + ConstAndValues.PRINTERFK + ), + userFk = mobileApplication.userId!!, + priority = "normal", + copies = copies, + labelType = labelType, + packing = packing + ) + customDialogTwoButtons.dismiss() + } else { + printItem( + item.buyFk!!, labelType, packing, copies + ) + customDialogTwoButtons.dismiss() + } + } + customDialogInput.getEditText().requestFocus() + }*/ + //Tarea 7763 /* .setOkButtonThree(getString(R.string.rename)) { customDialogInput.setTitle(getString(R.string.itemNew)) @@ -1080,6 +1140,24 @@ class UbicadorFragmentNew : BaseFragment( + ConstAndValues.PRINTERFK + ), + userFk = mobileApplication.userId!!, + priority = "normal", + params = """{'copies':$copies,'id':$id,'labelType':'$labelType','packing':$packing}""" + ) + } catch (ex: Exception) { + ma.messageWithSound(message = ex.message.toString(), isError = true, isPlayed = true) + } + hideKeyboard() + } + private fun actionRename(item: ItemUbicador, itemScan: String) { if (itemScan.isNotEmpty()) { diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/fragment/UbicadorViewModel.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/fragment/UbicadorViewModel.kt index 5f98abd1..c4bc7586 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/fragment/UbicadorViewModel.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/fragment/UbicadorViewModel.kt @@ -9,9 +9,8 @@ import es.verdnatura.R import es.verdnatura.domain.SalixCallback import es.verdnatura.domain.formatWithQuotes import es.verdnatura.domain.userCases.GetItemFromBarcodeUseCase +import es.verdnatura.domain.userCases.GetItemPrintItemUseCase import es.verdnatura.presentation.base.BaseViewModel -import es.verdnatura.presentation.base.getMessageFromAllResponse -import es.verdnatura.presentation.base.nameofFunction import es.verdnatura.presentation.common.Event import es.verdnatura.presentation.common.ItemShelvingSalix import es.verdnatura.presentation.common.ResponseHasOlder @@ -22,16 +21,13 @@ import es.verdnatura.presentation.view.feature.ubicador.model.ItemShelvingNewer import es.verdnatura.presentation.view.feature.ubicador.model.ItemShelvingNewerList import es.verdnatura.presentation.view.feature.ubicador.model.ItemUbicador import es.verdnatura.presentation.view.feature.ubicador.model.ItemUbicadorListNew -import es.verdnatura.presentation.view.feature.ubicador.model.ItemUbicadorListVO -import es.verdnatura.presentation.view.feature.ubicador.model.ItemUbicadorVO import es.verdnatura.presentation.view.feature.workermistake.model.MakeMultiSalix import retrofit2.Call import retrofit2.Response class UbicadorViewModel(val context: Context) : BaseViewModel(context) { private val getItemFromBarcodeUseCase = GetItemFromBarcodeUseCase(salix) - - private val _shelvingList by lazy { MutableLiveData() } + private val printItemUseCase = GetItemPrintItemUseCase(salix) private val _responseUbicator by lazy { MutableLiveData() } val responseUbicator: LiveData @@ -43,8 +39,6 @@ class UbicadorViewModel(val context: Context) : BaseViewModel(context) { val loadResponseHasOlder: LiveData> = _responseHasOlder.map { Event(it) } - val loadShelvingList: LiveData> = _shelvingList.map { Event(it) } - private val _shelvingListNew by lazy { MutableLiveData() } val loadShelvingListNew: LiveData> = _shelvingListNew.map { Event(it) } @@ -65,45 +59,81 @@ class UbicadorViewModel(val context: Context) : BaseViewModel(context) { private val _responseAddList by lazy { MutableLiveData() } val responseAddList: LiveData = _responseAddList - val loadAddList: LiveData> = _responseAddList.map { Event(it) } private val _responseLogAdd by lazy { MutableLiveData() } val responseLogAdd: LiveData get() = _responseLogAdd - fun itemShelvingList( - vShelvingFk: String - ) { - salix.itemShelvingList(params = listOf(vShelvingFk.uppercase()).formatWithQuotes()).enqueue( - object : SalixCallback>(context) { - override fun onSuccess(response: Response>) { - _shelvingList.value = response.body()?.let { ItemUbicadorListVO(it) } - } - - override fun onError(t: Throwable) { - val listError: ArrayList = ArrayList() - listError.add( - ItemUbicadorVO( - 0, - isError = true, - errorMessage = getMessageFromAllResponse( - nameofFunction(this), - t.message!!, - ), - ), - ) - _shelvingList.value = ItemUbicadorListVO(listError) - } - - }, - ) - } + private val _buyUltimateResponse by lazy { MutableLiveData() } + val buyUltimateResponse: LiveData = _buyUltimateResponse + val loadBuyUltimateResponse: LiveData> = _buyUltimateResponse.map { Event(it) } fun itemShelvingListNew( - vShelvingFk: String + shelvingFk: String ) { - salix.itemShelvingListNew(params = listOf(vShelvingFk.uppercase()).formatWithQuotes()) + salix.itemShelvingListNew(params = listOf(shelvingFk.uppercase()).formatWithQuotes()) + .enqueue( + object : SalixCallback>(context) { + override fun onSuccess(response: Response>) { + _shelvingListNew.value = response.body()?.let { ItemUbicadorListNew(it) } + } + + }, + ) + } + + //Tarea 6869 + fun itemShelvingGet( + shelvingFk: String + ) { + salix.itemShelvingGet( + filter = """{ + "fields":[ + "priority", + "parkingFk", + "code" + ], + "include":[ + { + "relation":"parking", + "scope":{ + "fields":[ + "code" + ] + } + }, + { + "relation":"itemShelving", + "scope":{ + "fields":[ + "id", + "itemFk", + "visible", + "packing", + "grouping", + "isChecked", + "available", + "buyFk" + ], + "include":{ + "relation":"item", + "scope":{ + "fields":[ + "name", + "longName", + "size" + ] + } + } + } + } + ], + "where":{ + "code":"$shelvingFk" + } + }""".trim() + ) .enqueue( object : SalixCallback>(context) { override fun onSuccess(response: Response>) { @@ -430,6 +460,67 @@ class UbicadorViewModel(val context: Context) : BaseViewModel(context) { }) } + fun printItem( + reportName: String, + printerFk: Int, + userFk: Int, + params: Any, + priority: String + + ) { + + printItemUseCase.execute( + params = arrayListOf( + reportName, + printerFk, + userFk, + params, + priority + ).formatWithQuotes() + ) + .enqueue(object : SalixCallback(context) { + }) + } + + fun buyUltimate( + itemFk: Number, + warehouseFk: Int, + dated: String, + reportName: String, + printerFk: Int, + priority: String, + userFk: Int, + copies: Int, + labelType: String, + packing: Int? + + ) { + printItemUseCase.executeBuyUltimate( + params = arrayListOf( + itemFk, + warehouseFk, + dated + ).formatWithQuotes() + ) + .enqueue(object : SalixCallback(context) { + override fun onSuccess(response: Response) { + + if (response.body() == null) _buyUltimateResponse.value = false + else { + val params = + """{'copies':$copies,'id':${response.body()},'labelType':'$labelType','packing':$packing}""" + printItem( + reportName = reportName, + printerFk = printerFk, + priority = priority, + userFk = userFk, + params = params + ) + } + } + }) + } + fun itemShelvingMakeMulti( shelvingFk: String, items: List, warehouseFk: Int ) { diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/model/ItemUbicadorVO.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/model/ItemUbicadorVO.kt index d041679a..0397b10e 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/model/ItemUbicadorVO.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/ubicador/model/ItemUbicadorVO.kt @@ -22,7 +22,10 @@ class ItemUbicadorVO( class ItemUbicador( var item: Long, - var description: String = "", + var description: String? = null, + var size: Int? = null, + var name: String? = null, + var longName: String? = null, var visible: Int = 0, var stickers: Int = 0, var packing: Int? = null, @@ -39,7 +42,8 @@ class ItemUbicador( var isNew: Boolean = false, var isChecked: Int? = null, var url: String = "", - var units: Int = 0 + var units: Int = 0, + var buyFk: Long? = null ) class ItemEscanerVO( diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/workermistake/fragment/WorkermistakeFragment.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/workermistake/fragment/WorkermistakeFragment.kt index 9e6a46c7..e31f769b 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/workermistake/fragment/WorkermistakeFragment.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/workermistake/fragment/WorkermistakeFragment.kt @@ -4,7 +4,6 @@ import android.content.Context import android.os.Bundle import android.view.View import androidx.core.widget.addTextChangedListener -import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import es.verdnatura.R import es.verdnatura.databinding.FragmentWorkermistakeBinding @@ -15,23 +14,19 @@ import es.verdnatura.presentation.base.BaseFragment import es.verdnatura.presentation.common.OnBarcodeRowClickListener import es.verdnatura.presentation.common.OnMistakeWorkerClickListener import es.verdnatura.presentation.common.OnPasillerosItemClickListener +import es.verdnatura.presentation.view.commom.NameWithId +import es.verdnatura.presentation.view.commom.SearchableAdapter import es.verdnatura.presentation.view.component.CustomDialog import es.verdnatura.presentation.view.component.CustomDialogInput import es.verdnatura.presentation.view.component.CustomDialogList import es.verdnatura.presentation.view.feature.articulo.adapter.BarcodeAdapter import es.verdnatura.presentation.view.feature.articulo.model.BarcodeVO import es.verdnatura.presentation.view.feature.inventario.fragment.InventaryViewModel -import es.verdnatura.presentation.view.feature.inventario.fragment.SearchDepartmentModel import es.verdnatura.presentation.view.feature.workermistake.adapter.WorkermistakeAdapter -import es.verdnatura.presentation.view.feature.workermistake.model.DepartmentMistake import es.verdnatura.presentation.view.feature.workermistake.model.MistakeType import es.verdnatura.presentation.view.feature.workermistake.model.WorkerFromMistake -import ir.mirrajabi.searchdialog.SimpleSearchDialogCompat -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking -@Suppress("UNUSED_ANONYMOUS_PARAMETER") class WorkermistakeFragment( var entryPoint: String = "" @@ -49,7 +44,6 @@ class WorkermistakeFragment( private var listMistakes: ArrayList = ArrayList() private var listMistakesAdapter: BarcodeAdapter? = null private var workerMistakeName: WorkerFromMistake? = null - private val departments = ArrayList() companion object { fun newInstance(entryPoint: String) = WorkermistakeFragment(entryPoint) @@ -83,32 +77,8 @@ class WorkermistakeFragment( customDialogList = CustomDialogList(requireContext()) binding.filterDepartment.setOnClickListener { - SimpleSearchDialogCompat( - context, - getString(R.string.departamentos), - getString(R.string.escribirparteNombre), - null, - departments - ) { baseSearchDialogCompat, nombre, position -> - - binding.filterDepartment.text = (nombre.title) - lifecycleScope.launch(Dispatchers.IO) { - mobileApplication.dataStoreApp.editDataStoreKey( - DEPARTMENTMISTAKE, - nombre.getDepartmentName() - ) - mobileApplication.dataStoreApp.editDataStoreKey( - DEPARTMENTMISTAKEID, - nombre.getDepartmentId() - ) - } - - viewModel.workerGetFromHasMistake( - nombre.getDepartmentId() - ) - binding.filterItemFk.isEnabled = true - baseSearchDialogCompat.dismiss() - }.show() + binding.searchableRecyclerView.visibility = View.VISIBLE + binding.searchableRecyclerView.setSearchHint(getString(R.string.departamentSearch)) } customDialogInput = CustomDialogInput(requireContext()) customDialog = CustomDialog(requireContext()) @@ -122,6 +92,36 @@ class WorkermistakeFragment( binding.mainToolbar.toolbarTitle.text = entryPoint } + private fun setSearchable(listNames: MutableList) { + + val adapter = + SearchableAdapter( + listElements = listNames, + context = requireContext() + ) { elementSelected -> + + runBlocking { + mobileApplication.dataStoreApp.editDataStoreKey( + DEPARTMENTMISTAKE, + elementSelected.name + ) + mobileApplication.dataStoreApp.editDataStoreKey( + DEPARTMENTMISTAKEID, + elementSelected.id + ) + viewModel.workerGetFromHasMistake( + elementSelected.id + ) + } + binding.filterDepartment.text = elementSelected.name + binding.searchableRecyclerView.visibility = View.GONE + + } + + binding.searchableRecyclerView.setAdapter(adapter, listNames) + + } + private fun setEvents() { binding.mainToolbar.backButton.setOnClickListener { ma.onMyBackPressed() @@ -151,7 +151,12 @@ class WorkermistakeFragment( override fun observeViewModel() { with(viewModel) { mistakeDepartmentList.observe(viewLifecycleOwner) { - createDepartmentList(it.list) + setSearchable(it.list.map { item -> + NameWithId( + id = item.id, + name = item.name + ) + } as MutableList) } workerFromMistakeList.observe(viewLifecycleOwner) { createWorkerList(it.list) @@ -214,32 +219,20 @@ class WorkermistakeFragment( } - private fun createDepartmentList(list: List) { - departments.clear() - list.forEach { department -> - try { - departments.add(SearchDepartmentModel(department.name, department.id)) - } catch (e: Exception) { - e.message!!.toast(requireContext()) - - } - } - } - private fun createWorkerList(list: List) { - listWorker.clear() - - list.forEach { worker -> - try { - listWorker.add(worker) - } catch (e: Exception) { - e.message!!.toast(requireContext()) + try { + listWorker.apply { + clear() + addAll(list) } - + listWorkerAuxiliary.apply { + clear() + addAll(listWorker) + } + } catch (e: Exception) { + e.message?.toast(requireContext()) } - listWorkerAuxiliary.clear() - listWorkerAuxiliary.addAll(listWorker) - } + } diff --git a/app/src/main/java/es/verdnatura/presentation/view/feature/workermistake/model/mistakeWorkerType.kt b/app/src/main/java/es/verdnatura/presentation/view/feature/workermistake/model/mistakeWorkerType.kt index 6d63f020..322fdc33 100644 --- a/app/src/main/java/es/verdnatura/presentation/view/feature/workermistake/model/mistakeWorkerType.kt +++ b/app/src/main/java/es/verdnatura/presentation/view/feature/workermistake/model/mistakeWorkerType.kt @@ -13,8 +13,8 @@ data class ExpeditionMistakeSalix( ) data class DepartmentMistake( - var id: Int? = null, - var name: String = "" + var id: Int, + var name: String ) data class WorkerFromMistake( diff --git a/app/src/main/res/drawable/ic_calendar.xml b/app/src/main/res/drawable/ic_calendar.xml new file mode 100644 index 00000000..0675fd99 --- /dev/null +++ b/app/src/main/res/drawable/ic_calendar.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_click.xml b/app/src/main/res/drawable/ic_click.xml new file mode 100644 index 00000000..d8388b22 --- /dev/null +++ b/app/src/main/res/drawable/ic_click.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/drawable/ic_click_black.xml b/app/src/main/res/drawable/ic_click_black.xml new file mode 100644 index 00000000..69a6cf0f --- /dev/null +++ b/app/src/main/res/drawable/ic_click_black.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/drawable/ic_logout.xml b/app/src/main/res/drawable/ic_logout.xml new file mode 100644 index 00000000..18a1b704 --- /dev/null +++ b/app/src/main/res/drawable/ic_logout.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/ic_move_expedition.xml b/app/src/main/res/drawable/ic_move_expedition.xml new file mode 100644 index 00000000..4a3957d7 --- /dev/null +++ b/app/src/main/res/drawable/ic_move_expedition.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_salary_supplement.xml b/app/src/main/res/drawable/ic_salary_supplement.xml new file mode 100644 index 00000000..8392f96a --- /dev/null +++ b/app/src/main/res/drawable/ic_salary_supplement.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/component_custom_list_dialog.xml b/app/src/main/res/layout/component_custom_list_dialog.xml index cb688df3..f532c281 100644 --- a/app/src/main/res/layout/component_custom_list_dialog.xml +++ b/app/src/main/res/layout/component_custom_list_dialog.xml @@ -11,24 +11,24 @@ + android:focusableInTouchMode="true" + android:orientation="vertical" + android:padding="@dimen/default_layout_margin"> + android:id="@+id/custom_dialog_title" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/layout_margin_1" + android:layout_marginBottom="@dimen/layout_margin_min" + android:textAlignment="center" + android:textColor="@color/verdnatura_white" + android:textSize="@dimen/h6" + android:textStyle="bold" + android:visibility="gone" + tools:text="¿Estás seguro de que deseas eliminar el dispositivo de celia?" + tools:visibility="visible" /> - + android:layout_marginTop="@dimen/layout_margin_min" + android:textColorHint="@android:color/darker_gray"> + android:textColorHint="@android:color/darker_gray" /> + + + + + @@ -69,9 +89,10 @@ android:id="@+id/textinputlayout_two" android:layout_width="match_parent" android:layout_height="wrap_content" - android:textColorHint="@android:color/darker_gray" android:layout_marginTop="@dimen/layout_margin_min" + android:textColorHint="@android:color/darker_gray" android:visibility="gone"> + + tools:listitem="@layout/item_barcode_row" />