Merge branch 'master' into test

This commit is contained in:
unknown 2021-07-25 20:03:57 +02:00
commit 4dc55c0878
319 changed files with 23826 additions and 0 deletions

14
.gitignore vendored Normal file
View File

@ -0,0 +1,14 @@
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx

1
.idea/.name Normal file
View File

@ -0,0 +1 @@
Gestor Almacén

View File

@ -0,0 +1,122 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<JetCodeStyleSettings>
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings>
<codeStyleSettings language="XML">
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
<arrangement>
<rules>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:android</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:id</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>style</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>ANDROID_ATTRIBUTE_ORDER</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>.*</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
</rules>
</arrangement>
</codeStyleSettings>
<codeStyleSettings language="kotlin">
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</codeStyleSettings>
</code_scheme>
</component>

View File

@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>

6
.idea/compiler.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="11" />
</component>
</project>

22
.idea/gradle.xml Normal file
View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="PLATFORM" />
<option name="disableWrapperSourceDistributionNotification" value="true" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />
<option name="useQualifiedModuleNames" value="true" />
</GradleProjectSettings>
</option>
</component>
</project>

30
.idea/jarRepositories.xml Normal file
View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="BintrayJCenter" />
<option name="name" value="BintrayJCenter" />
<option name="url" value="https://jcenter.bintray.com/" />
</remote-repository>
<remote-repository>
<option name="id" value="Google" />
<option name="name" value="Google" />
<option name="url" value="https://dl.google.com/dl/android/maven2/" />
</remote-repository>
<remote-repository>
<option name="id" value="maven" />
<option name="name" value="maven" />
<option name="url" value="https://jitpack.io" />
</remote-repository>
</component>
</project>

9
.idea/misc.xml Normal file
View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.android.tools.idea.compose.preview.runconfiguration.ComposePreviewRunConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
<option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
</set>
</option>
</component>
</project>

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

1
app/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/build

91
app/build.gradle Normal file
View File

@ -0,0 +1,91 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.firebase.crashlytics'
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
defaultConfig {
applicationId "es.verdnatura"
minSdkVersion 21
targetSdkVersion 29
versionCode 60
// versionName "5.4.4"
versionName "6.1.3"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
dataBinding {
enabled = true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
debugImplementation fileTree(dir: 'libs/debug', include: ['*.jar'])
releaseImplementation fileTree(dir: 'libs/release', include: ['*.jar'])
// Kotlin and Android
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.core:core-ktx:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation 'com.google.android.material:material:1.0.0'
implementation 'com.squareup.retrofit2:retrofit:2.0.2'
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.0.0'
// Architecture components
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle"
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
// Koin for DI
implementation "org.koin:koin-core:$koin"
implementation "org.koin:koin-android:$koin"
implementation "org.koin:koin-androidx-scope:$koin"
implementation "org.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"
// Add the Firebase Crashlytics SDK.
implementation 'com.google.firebase:firebase-analytics:17.5.0'
implementation 'com.google.firebase:firebase-crashlytics:17.2.1'
//search
implementation 'com.github.mirrajabi:search-dialog:1.1'
}

40
app/google-services.json Normal file
View File

@ -0,0 +1,40 @@
{
"project_info": {
"project_number": "519813071137",
"firebase_url": "https://gestoralmacen-bfa2a.firebaseio.com",
"project_id": "gestoralmacen-bfa2a",
"storage_bucket": "gestoralmacen-bfa2a.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:519813071137:android:3de54686c580a6f79dfe60",
"android_client_info": {
"package_name": "es.verdnatura"
}
},
"oauth_client": [
{
"client_id": "519813071137-5099s9mme9juufnrkm88ajt5n7cmluqh.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyA74wQCwDCpCjWs49lCX5m2SsdqcYb_J8s"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "519813071137-5099s9mme9juufnrkm88ajt5n7cmluqh.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
}
],
"configuration_version": "1"
}

21
app/proguard-rules.pro vendored Normal file
View File

@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

Binary file not shown.

BIN
app/release/app-release.apk Normal file

Binary file not shown.

View File

@ -0,0 +1,18 @@
{
"version": 2,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "es.verdnatura",
"variantName": "processReleaseResources",
"elements": [
{
"type": "SINGLE",
"filters": [],
"versionCode": 60,
"versionName": "6.1.3",
"outputFile": "app-release.apk"
}
]
}

1
app/release/output.json Normal file
View File

@ -0,0 +1 @@
[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"5.0","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release","dirName":""},"path":"app-release.apk","properties":{}}]

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
app/release/vn-picking.apk Normal file

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,22 @@
package es.verdnatura
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("es.verdnatura", appContext.packageName)
}
}

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="es.verdnatura">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.PREVENT_POWER_KEY" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<application
android:name=".MobileApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">
<activity android:name=".presentation.view.feature.imageview.activity.ImageViewActivity" android:configChanges="orientation"
android:screenOrientation="portrait"/>
<activity
android:name=".presentation.view.feature.main.activity.MainActivity"
android:windowSoftInputMode="stateHidden|adjustResize"
android:configChanges="orientation"
android:screenOrientation="portrait"/>
<activity
android:name=".presentation.view.feature.login.activity.LoginActivity"
android:configChanges="orientation"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -0,0 +1,20 @@
package es.verdnatura
import android.app.Application
import es.verdnatura.di.viewModelModule
import org.koin.android.ext.koin.androidContext
import org.koin.core.context.loadKoinModules
import org.koin.core.context.startKoin
class MobileApplication: Application() {
override fun onCreate() {
super.onCreate()
startKoin { androidContext(this@MobileApplication)
val moduleList = listOf(viewModelModule)
loadKoinModules(moduleList)
}
}
}

View File

@ -0,0 +1,140 @@
package es.verdnatura.di
import es.verdnatura.presentation.view.feature.ajustes.fragment.AjustesViewModel
import es.verdnatura.presentation.view.feature.articulo.fragment.ItemCardViewModel
import es.verdnatura.presentation.view.feature.buscaritem.fragment.BuscarItemViewModel
import es.verdnatura.presentation.view.feature.buscaritemall.fragment.BuscarItemAllViewModel
import es.verdnatura.presentation.view.feature.calidad.fragment.BuyersViewModel
import es.verdnatura.presentation.view.feature.calidad.fragment.QaualityViewModel
import es.verdnatura.presentation.view.feature.collection.fragment.CollectionViewModel
import es.verdnatura.presentation.view.feature.controlador.fragment.ControladorViewModel
import es.verdnatura.presentation.view.feature.faltas.fragment.FaltasViewModel
import es.verdnatura.presentation.view.feature.historico.fragment.HistoricoViewModel
import es.verdnatura.presentation.view.feature.inventario.fragment.InventaryViewModel
import es.verdnatura.presentation.view.feature.login.fragment.LoginViewModel
import es.verdnatura.presentation.view.feature.paletizador.fragment.ExpeditionPalletDetailViewModel
import es.verdnatura.presentation.view.feature.paletizador.fragment.ExpeditionPalletViewModel
import es.verdnatura.presentation.view.feature.paletizador.fragment.ExpeditionScanViewModel
import es.verdnatura.presentation.view.feature.paletizador.fragment.ExpeditionTruckListViewModel
import es.verdnatura.presentation.view.feature.parking.fragment.ParkingViewModel
import es.verdnatura.presentation.view.feature.pasillero.fragment.PasilleroViewModel
import es.verdnatura.presentation.view.feature.presacador.fragment.PreSacadorViewModel
import es.verdnatura.presentation.view.feature.reposicion.fragment.ReposicionViewModel
import es.verdnatura.presentation.view.feature.sacador.fragment.SacadorViewModel
import es.verdnatura.presentation.view.feature.shelvingparking.fragment.ShelvingParkingViewModel
import es.verdnatura.presentation.view.feature.ubicador.fragment.AutomaticAddItemViewModel
import es.verdnatura.presentation.view.feature.ubicador.fragment.UbicadorViewModel
import org.koin.android.ext.koin.androidContext
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.dsl.module
val viewModelModule = module{
// Login
viewModel {
LoginViewModel(androidContext())
}
// Pasilleros
viewModel {
PasilleroViewModel(androidContext())
}
// Pasilleros / Item Card
viewModel {
ItemCardViewModel(androidContext())
}
// Pasilleros / Item Card / Historico
viewModel {
HistoricoViewModel(androidContext())
}
// Pasilleros / Buscar Item
viewModel {
BuscarItemViewModel(androidContext())
}
// Pasilleros / Buscar Item 2
viewModel {
BuscarItemAllViewModel(androidContext())
}
// Pasilleros / Inventario
viewModel {
InventaryViewModel(androidContext())
}
// Pasilleros / Faltas
viewModel {
FaltasViewModel(androidContext())
}
// ShelvingParking
viewModel {
ShelvingParkingViewModel(androidContext())
}
// Ubicador
viewModel {
UbicadorViewModel(androidContext())
}
// Ubicador // Automatic
viewModel {
AutomaticAddItemViewModel(androidContext())
}
// Ajustes
viewModel {
AjustesViewModel(androidContext())
}
// PALETIZADOR
viewModel {
ExpeditionTruckListViewModel(androidContext())
}
viewModel {
ExpeditionPalletViewModel(androidContext())
}
viewModel {
ExpeditionPalletDetailViewModel(androidContext())
}
viewModel {
ExpeditionScanViewModel(androidContext())
}
// SACADOR
viewModel {
SacadorViewModel(androidContext())
}
viewModel {
CollectionViewModel(androidContext())
}
viewModel {
ControladorViewModel(androidContext())
}
viewModel {
ParkingViewModel(androidContext())
}
viewModel {
PreSacadorViewModel(androidContext())
}
viewModel {
ReposicionViewModel(androidContext())
}
viewModel {
BuyersViewModel(androidContext())
}
viewModel {
QaualityViewModel(androidContext())
}
}

View File

@ -0,0 +1,16 @@
package es.verdnatura.domain
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
class ApiSalixUtils {
companion object {
//const val BASE_URL:String = "http://192.168.1.108:8000/"
const val BASE_URL:String = "https://salix.verdnatura.es/api/"
fun getApiService():SalixService{
val salixRetrofit = Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(
GsonConverterFactory.create()).build()
return salixRetrofit.create(SalixService::class.java)
}
}
}

View File

@ -0,0 +1,65 @@
package es.verdnatura.domain
import android.content.Context
import android.content.SharedPreferences
import android.preference.PreferenceManager
import android.util.Log
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.util.concurrent.TimeUnit
class ApiUtils {
companion object {
//const val BASE_URL:String = "http://192.168.1.54:8009/"
const val BASE_URL:String = "https://app.verdnatura.es/"
//const val BASE_URL:String = "https://test-app.verdnatura.es/"
//const val BASE_URL:String = "http://10.1.4.186/"
fun getApiService(context: Context):VerdnaturaService{
val retrofit = Retrofit.Builder()
.baseUrl(getBaseUrlLocal(context))
.addConverterFactory(GsonConverterFactory.create())
.client(getRequestHeader())
.build()
return retrofit.create(VerdnaturaService::class.java)
}
fun getBaseUrlLocal(context: Context): String {
var url = this.getDefaults("base_url",context)
if (url.isNullOrEmpty()){
setDefaults("base_url", BASE_URL,context)
}else{
if (!url.contains("http")){
url = "https://"+url
}
}
return if (url.isNullOrEmpty()) BASE_URL else url
}
fun getRequestHeader(): OkHttpClient? {
val client = OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.readTimeout(40, TimeUnit.SECONDS)
.build()
return client
}
fun setDefaults(key: String?, value: String?, context: Context?) {
val preferences: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
val editor = preferences.edit()
editor.putString(key, value)
editor.commit()
}
fun getDefaults(key: String?, context: Context?): String? {
val preferences = PreferenceManager.getDefaultSharedPreferences(context)
return preferences.getString(key, null)
}
}
}

View File

@ -0,0 +1,13 @@
package es.verdnatura.domain
object ConstAndValues {
const val SACADOR = "PREPARED"
const val CONTROLADOR = "CHECKED"
const val OK = "OK"
const val PREPARED = "PREPARED"
const val ON_PREPARATION = "ON_PREPARATION"
const val CHECKED = "CHECKED"
const val PRESACADOR = "PRESACADOR"
const val ON_CHECKING = "ON_CHECKING"
}

View File

@ -0,0 +1,12 @@
package es.verdnatura.domain
import android.content.Context
import android.widget.Toast
fun Any.toast(context: Context?, duration: Int = Toast.LENGTH_SHORT): Toast {
return Toast.makeText(context, this.toString(), duration).apply { show() }
}
fun <T : Any> T?.notNull(f: (it: T) -> Unit) {
if (this != null) f(this)
}

View File

@ -0,0 +1,14 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.ajustes.model.SectorItemVO
import retrofit2.Call
class GetAjustesUserCase(context: Context) : RestClient(context) {
fun getSectors(usuario:String,password:String) : Call<List<SectorItemVO>> {
return restClient!!.getSectors("json","1",usuario,password,"application/json")
}
}

View File

@ -0,0 +1,15 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.buscaritemall.model.ItemLocationAll
import retrofit2.Call
class GetBuscarItemAllUserCase(context: Context) : RestClient(context) {
fun searchItemsUbicadorAll(usuario:String,password:String,itemFk:String) : Call<List<ItemLocationAll>> {
val params:ArrayList<String> = ArrayList()
params.add(itemFk)
return restClient!!.searchItemsUbicadorAll("json","1",usuario,password,"application/json",params = params)
}
}

View File

@ -0,0 +1,15 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.buscaritem.model.ItemLocationVO
import retrofit2.Call
class GetBuscarItemUserCase(context: Context) : RestClient(context) {
fun searchItemsUbicador(usuario:String,password:String,itemFk:String) : Call<List<ItemLocationVO>> {
val params:ArrayList<String> = ArrayList();
params.add(itemFk)
return restClient!!.searchItemsUbicador("json","1",usuario,password,"application/json",params = params)
}
}

View File

@ -0,0 +1,44 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.ajustes.model.SectorItemVO
import es.verdnatura.presentation.view.feature.calidad.model.BuyerVO
import es.verdnatura.presentation.view.feature.faltas.model.ItemFaltasVO
import es.verdnatura.presentation.view.feature.inventario.model.ItemInventaryVO
import retrofit2.Call
class GetInventaryUserCase(context: Context) : RestClient(context) {
fun itemShelvingRadar(usuario:String,password:String,sectorFk:String) : Call<List<ItemInventaryVO>> {
val params:ArrayList<String> = ArrayList();
params.add(sectorFk)
return restClient!!.itemShelvingRadar("json","1",usuario,password,"application/json",params = params)
}
fun itemShelvingRadarFilterBuyer(usuario:String,password:String,buyerFk:String,warehouseFk: String) : Call<List<ItemInventaryVO>> {
val params:ArrayList<String> = ArrayList();
params.add(buyerFk)
params.add(warehouseFk)
return restClient!!.itemShelvingRadarFilterBuyer("json","1",usuario,password,"application/json",params = params)
}
fun faultsReview(usuario:String,password:String,warehouseFk:String) : Call<List<ItemFaltasVO>> {
val params:ArrayList<String> = ArrayList();
params.add(warehouseFk)
return restClient!!.faultsReview("json","1",usuario,password,"application/json",params = params)
}
fun faultsReview_isChecked(usuario:String,password:String,itemFk:String,warehouseFk:String) : Call<String> {
val params:ArrayList<String> = ArrayList();
params.add(itemFk)
params.add(warehouseFk)
return restClient!!.faultsReview_isChecked("json","1",usuario,password,"application/json",params = params)
}
fun itemShelvingBuyerGet(usuario:String,password:String) : Call<List<BuyerVO>> {
return restClient!!.itemShelvingBuyerGet("json","1",usuario,password,"application/json")
}
}

View File

@ -0,0 +1,94 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.articulo.model.ItemCardVO
import es.verdnatura.presentation.view.feature.articulo.model.ItemPackingType
import es.verdnatura.presentation.view.feature.historico.model.ItemHistoricoVO
import retrofit2.Call
class GetItemCardUserCase(context: Context) : RestClient(context) {
fun getItemCard(usuario:String,password:String,itemFk:String,warehouseFk:String) : Call<ItemCardVO> {
val params:ArrayList<String> = ArrayList();
params.add(itemFk)
params.add(warehouseFk)
return restClient!!.getItemCard("json","1",usuario,password,"application/json",params = params)
}
fun getItemPackingType(usuario:String,password:String) : Call<List<ItemPackingType>> {
val params:ArrayList<String> = ArrayList();
return restClient!!.getItemPackingType("json","1",usuario,password,"application/json",params = params)
}
fun itemStockUpdate(usuario:String,password:String,itemFk:String,warehouseFk:String,newVisible:String,isTrash:String ) : Call<String> {
val params:ArrayList<String> = ArrayList();
params.add(itemFk)
params.add(warehouseFk)
params.add(newVisible)
params.add(isTrash)
return restClient!!.itemStockUpdate("json","1",usuario,password,"application/json",params = params)
}
fun itemTrash(usuario:String,password:String,itemFk:String,warehouseFk:String,newVisible:String,isTrash:String ) : Call<String> {
val params:ArrayList<String> = ArrayList();
params.add(itemFk)
params.add(warehouseFk)
params.add(newVisible)
params.add(isTrash)
return restClient!!.itemTrash("json","1",usuario,password,"application/json",params = params)
}
fun itemPlacementSave(usuario:String,password:String,itemFk:String,warehouseFk:String,value:String ) : Call<String> {
val params:ArrayList<String> = ArrayList();
params.add(itemFk)
params.add(warehouseFk)
params.add(value)
return restClient!!.itemPlacementSave("json","1",usuario,password,"application/json",params = params)
}
fun updateGrouping(usuario:String,password:String,itemFk:String,value:String ,warehouseFk:String) : Call<String> {
val params:ArrayList<String> = ArrayList();
params.add(itemFk)
params.add(value)
params.add(warehouseFk)
return restClient!!.updateGrouping("json","1",usuario,password,"application/json",params = params)
}
fun updatePacking(usuario:String,password:String,itemFk:String,value:String ,warehouseFk:String) : Call<String> {
val params:ArrayList<String> = ArrayList();
params.add(itemFk)
params.add(value)
params.add(warehouseFk)
return restClient!!.updatePacking("json","1",usuario,password,"application/json",params = params)
}
fun updatePackingType(usuario:String,password:String,itemFk:String,ItemPackingType:String) : Call<Boolean> {
val params:ArrayList<String> = ArrayList();
params.add(itemFk)
params.add(ItemPackingType)
return restClient!!.updatePackingType("json","1",usuario,password,"application/json",params = params)
}
fun itemSaveMin(usuario:String,password:String,itemFk:String,value:String) : Call<String> {
val params:ArrayList<String> = ArrayList();
params.add(itemFk)
params.add(value)
return restClient!!.itemSaveMin("json","1",usuario,password,"application/json",params = params)
}
fun barcodes_edit(usuario:String,password:String,itemFk:String,value:String, delete:String) : Call<String> {
val params:ArrayList<String> = ArrayList();
params.add(value)
params.add(itemFk)
params.add(delete)
return restClient!!.barcodes_edit("json","1",usuario,password,"application/json",params = params)
}
fun itemDiary(usuario:String,password:String,itemFk:String,warehouseFk: String) : Call<List<ItemHistoricoVO>> {
val params:ArrayList<String> = ArrayList();
params.add(itemFk)
params.add(warehouseFk)
return restClient!!.itemDiary("json","1",usuario,password,"application/json",params = params)
}
}

View File

@ -0,0 +1,38 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.login.model.LoginSalixVO
import es.verdnatura.presentation.view.feature.login.model.SalixMessageVO
import es.verdnatura.presentation.view.feature.login.model.versionApp
import retrofit2.Call
class GetLoginUserCase(context: Context) : RestClient(context) {
fun login(usuario:String,password:String) : Call<String>{
val params:ArrayList<String> = ArrayList()
params.add(usuario)
params.add(password)
return restClient!!.login("json","1",usuario,password,"application/json",params)
}
fun salixLogin(usuario:String,password:String) : Call<LoginSalixVO>{
return salixClient!!.login("application/json", LoginSalixVO(usuario,password))
}
fun checkVersion_old(usuario:String,password:String,version:String) : Call<Boolean> {
val params:ArrayList<String> = ArrayList()
params.add(version)
return restClient!!.version("json","1",usuario,password,"application/json",params)
}
fun sendChekingPresence(token:String,workerId:Int,message:String) : Call<Boolean>{
return salixClient!!.sendChekingPresence(content_type = "application/json", authorization = token, params = SalixMessageVO(workerId = workerId,message = message))
}
fun checkVersion(usuario:String,password:String,nameApp:String) : Call<versionApp> {
val params:ArrayList<String> = ArrayList()
params.add(nameApp)
return restClient!!.version2("json","1",usuario,password,"application/json",params)
}
}

View File

@ -0,0 +1,86 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.paletizador.model.*
import retrofit2.Call
class GetPaletizadoresUserCase(context: Context) : RestClient(context) {
fun expeditionTruckList(usuario:String,password:String) : Call<List<ItemExpeditionTruckVO>> {
val params:ArrayList<String> = ArrayList();
return restClient!!.expeditionTruckList("json","1",usuario,password,"application/json")
}
fun expeditionTruckAdd(usuario:String,password:String,vHour:String,vDescription:String) : Call<String> {
val params:ArrayList<String> = ArrayList()
params.add(vHour)
params.add(vDescription)
// ////Log.i("VERDNATURA"," La hora es $vHour y descrip $vDescription")
return restClient!!.expeditionTruckAdd("json","1",usuario,password,"application/json",params)
}
fun expeditionPallet_List(usuario:String,password:String,vTruckFk:String) : Call<List<ItemPalletVO>> {
val params:ArrayList<String> = ArrayList()
params.add(vTruckFk)
return restClient!!.expeditionPallet_List("json","1",usuario,password,"application/json",params)
}
fun expeditionScanAdd(usuario:String,password:String,vPalletFk:String,vTruckFk:String) : Call<List<ItemScanVO>> {
val params:ArrayList<String> = ArrayList()
params.add(vPalletFk)
params.add(vTruckFk)
return restClient!!.expeditionScanAdd("json","1",usuario,password,"application/json",params)
}
fun expeditionScanPut(usuario:String,password:String,vPalletFk:String,vExpeditionFk:String) : Call<String> {
val params:ArrayList<String> = ArrayList()
params.add(vPalletFk)
params.add(vExpeditionFk)
return restClient!!.expeditionScanPut("json","1",usuario,password,"application/json",params)
}
fun checkRouteExpeditionScanPut(usuario:String,password:String,vPalletFk:String,vExpeditionFk:String) : Call<String> {
val params:ArrayList<String> = ArrayList()
params.add(vPalletFk)
params.add(vExpeditionFk)
return restClient!!.checkRouteExpeditionScanPut("json","1",usuario,password,"application/json",params)
}
fun expeditionPalletView(usuario:String,password:String,vPalletFk:String) : Call<List<ItemPalletViewVO>> {
val params:ArrayList<String> = ArrayList()
params.add(vPalletFk)
return restClient!!.expeditionPalletView("json","1",usuario,password,"application/json",params)
}
fun expeditionPalletDel(usuario:String,password:String,vPalletFk:String) : Call<String> {
val params:ArrayList<String> = ArrayList()
params.add(vPalletFk)
return restClient!!.expeditionPalletDel("json","1",usuario,password,"application/json",params)
}
fun expeditionScanList(usuario:String,password:String,vPalletFk:String) : Call<List<ItemExpeditionScanVO>> {
val params:ArrayList<String> = ArrayList()
params.add(vPalletFk)
return restClient!!.expeditionScanList("json","1",usuario,password,"application/json",params)
}
fun expeditionScanDel(usuario:String,password:String,vScanFk:String) : Call<String> {
val params:ArrayList<String> = ArrayList()
params.add(vScanFk)
return restClient!!.expeditionScanDel("json","1",usuario,password,"application/json",params)
}
fun expeditionPalletPrintSet(
usuario: String,
password: String,
vPalletFk: String,
vSectorFk: String
) : Call<String> {
val params:ArrayList<String> = ArrayList();
params.add(vPalletFk)
params.add(vSectorFk)
return restClient!!.expeditionPalletPrintSet("json","1",usuario,password,"application/json",params)
}
}

View File

@ -0,0 +1,31 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.presacador.model.PreSacadorItemVO
import retrofit2.Call
class GetPreSacadorUseCase(context: Context) : RestClient(context) {
fun ticketToPrePrepare(usuario:String,password:String,ticketFk:String,sectorFk:String) : Call<List<PreSacadorItemVO>> {
val params:ArrayList<String> = ArrayList();
params.add(ticketFk)
params.add(sectorFk)
return restClient!!.ticketToPrePrepare("json","1",usuario,password,"application/json",params)
}
fun itemPlacementSupplyGetOrder(usuario:String,password:String,sectorFk:String) : Call<List<PreSacadorItemVO>> {
val params:ArrayList<String> = ArrayList();
params.add(sectorFk)
return restClient!!.itemPlacementSupplyGetOrder("json","1",usuario,password,"application/json",params)
}
fun itemPlacementSupplyCloseOrder(usuario:String,password:String,id:String,quantity:String) : Call<String> {
val params:ArrayList<String> = ArrayList();
params.add(id)
params.add(quantity)
return restClient!!.itemPlacementSupplyCloseOrder("json","1",usuario,password,"application/json",params)
}
}

View File

@ -0,0 +1,26 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.calidad.model.BuyerVO
import es.verdnatura.presentation.view.feature.calidad.model.ItemBuyerVO
import retrofit2.Call
class GetQualityUserCase(context: Context) : RestClient(context) {
fun itemShelvingBuyerGet(usuario:String,password:String) : Call<List<BuyerVO>> {
return restClient!!.itemShelvingBuyerGet("json","1",usuario,password,"application/json")
}
fun itemShelvingBuyerTask(usuario:String,password:String, userFk: String) : Call<List<ItemBuyerVO>> {
val params:ArrayList<String> = ArrayList();
params.add(userFk)
return restClient!!.itemShelvingBuyerTask("json","1",usuario,password,"application/json",params)
}
fun itemShelvingStarsUpdate(usuario:String,password:String, vId: String,vStars: String) : Call<String> {
val params:ArrayList<String> = ArrayList();
params.add(vId)
params.add(vStars)
return restClient!!.itemShelvingStarsUpdate("json","1",usuario,password,"application/json",params)
}
}

View File

@ -0,0 +1,150 @@
package es.verdnatura.domain
import android.content.Context
import android.util.Log
import es.verdnatura.presentation.view.feature.collection.ItemVO
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.PlacementSupplyVO
import retrofit2.Call
class GetSacadorControladorUserCase(context: Context) : RestClient(context) {
fun collectionTicketGet(usuario:String,password:String,collectionFk:String,sectorFk:String,print:String) : Call<CollectionVO> {
val params:ArrayList<String> = ArrayList();
params.add(collectionFk)
params.add(sectorFk)
params.add(print)
return restClient!!.collectionTicketGet("json","1",usuario,password,"application/json",params)
}
fun collectionNew(usuario:String,password:String,sectorFk:String,carros:String) : Call<String> {
val params:ArrayList<String> = ArrayList();
params.add(sectorFk)
params.add(carros)
return restClient!!.collectionNew("json","1",usuario,password,"application/json",params)
}
fun collectionGet(usuario:String,password:String) : Call<List<CollectionVO>> {
val params:ArrayList<String> = ArrayList();
return restClient!!.collectionGet("json","1",usuario,password,"application/json")
}
fun saleTrackingReplace(usuario:String,password:String,saleFk:String,vOriginalQuantity:String,vStateFk:String,vIsChecked:String,vBuyFk:String) : Call<String> {
val params:ArrayList<String> = ArrayList();
params.add(saleFk)
params.add(vOriginalQuantity)
params.add(vStateFk)
params.add(vIsChecked)
params.add(vBuyFk)
return restClient!!.saleTrackingReplace("json","1",usuario,password,"application/json",params)
}
fun itemPlacementSupplyAiming(usuario:String,password:String,shelvingFk:String,quantity:String,itemFk:String) : Call<List<PlacementSupplyVO>> {
val params:ArrayList<String> = ArrayList();
params.add(shelvingFk)
params.add(quantity)
params.add(itemFk)
return restClient!!.itemPlacementSupplyAiming("json","1",usuario,password,"application/json",params)
}
fun itemShelvingSaleSupplyAdd(usuario:String,password:String,itemShelvingFk:String,saleFk:String,quantity:String) : Call<String> {
val params:ArrayList<String> = ArrayList();
params.add(itemShelvingFk)
params.add(saleFk)
params.add(quantity)
return restClient!!.itemShelvingSaleSupplyAdd("json","1",usuario,password,"application/json",params)
}
fun itemShelvingPlacementSupplyAdd(usuario:String,password:String,itemShelvingFk:String,itemPlacementSupplyFk:String,quantity:String) : Call<String> {
val params:ArrayList<String> = ArrayList();
params.add(itemShelvingFk)
params.add(itemPlacementSupplyFk)
params.add(quantity)
return restClient!!.itemShelvingPlacementSupplyAdd("json","1",usuario,password,"application/json",params)
}
fun collectionStickerPrint(usuario:String,password:String,collectionFk: String,sectorFk: String) : Call<String> {
val params:ArrayList<String> = ArrayList()
params.add(collectionFk)
params.add(sectorFk)
return restClient!!.collectionStickerPrint("json","1",usuario,password,"application/json",params)
}
fun itemGetAvailable(usuario:String,password:String,itemFk: String,warehouseFk: String) : Call<ItemVO> {
val params:ArrayList<String> = ArrayList()
params.add(itemFk)
params.add(warehouseFk)
return restClient!!.itemGetAvailable("json","1",usuario,password,"application/json",params)
}
fun collectionAddItem(usuario:String,password:String,itemFk: String,quantityFk: String,ticketFk: String,warehouseFk: String) : Call<String> {
val params:ArrayList<String> = ArrayList()
params.add(itemFk)
params.add(quantityFk)
params.add(ticketFk)
params.add(warehouseFk)
return restClient!!.collectionAddItem("json","1",usuario,password,"application/json",params)
}
fun saleMove(usuario:String,password:String,saleFk: String,quantity: String,originalQuantity:String) : Call<String> {
val params:ArrayList<String> = ArrayList()
params.add(saleFk)
params.add(quantity)
params.add(originalQuantity)
return restClient!!.saleMove("json","1",usuario,password,"application/json",params)
}
fun collectionMissingTrash(usuario:String,password:String,saleFk: String,quantity: String,type:String,warehouseFk:String,originalQuantity: String) : Call<String> {
val params:ArrayList<String> = ArrayList()
params.add(saleFk)
params.add(quantity)
params.add(type)
params.add(warehouseFk)
params.add(originalQuantity)
return restClient!!.collectionMissingTrash("json","1",usuario,password,"application/json",params)
}
fun saleTrackingDel(usuario:String,password:String,saleFk: String) : Call<String> {
val params:ArrayList<String> = ArrayList()
params.add(saleFk)
return restClient!!.saleTrackingDel("json","1",usuario,password,"application/json",params)
}
fun collectionUpdateState(usuario:String,password:String,collectionFk: String,state : String) : Call<String> {
val params:ArrayList<String> = ArrayList()
params.add(collectionFk)
params.add(state)
return restClient!!.collectionUpdateState("json","1",usuario,password,"application/json",params)
}
fun getIdFromCode(usuario:String,password:String,code: String) : Call<String> {
val params:ArrayList<String> = ArrayList()
params.add(code)
return restClient!!.getIdFromCode("json","1",usuario,password,"application/json",params)
}
fun collectionIncreaseQuantity(usuario:String,password:String,saleFk: String, quantity: String) : Call<String> {
val params:ArrayList<String> = ArrayList()
params.add(saleFk)
params.add(quantity)
return restClient!!.collectionIncreaseQuantity("json","1",usuario,password,"application/json",params)
}
fun saleMistakeAdd(usuario:String,password:String,vSaleFk: String, vUserFk: String, vTypeFk: String) : Call<String> {
val params:ArrayList<String> = ArrayList()
params.add(vSaleFk)
params.add(vUserFk)
params.add(vTypeFk)
return restClient!!.saleMistakeAdd("json","1",usuario,password,"application/json",params)
}
fun mistakeType(usuario:String,password:String) : Call<List<MistakeTypeVO>> {
val params:ArrayList<String> = ArrayList();
return restClient!!.mistakeType("json","1",usuario,password,"application/json")
}
}

View File

@ -0,0 +1,17 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.shelvingparking.model.ItemShelvingParkingVO
import retrofit2.Call
class GetShelvingParkingUserCase(context: Context) : RestClient(context) {
fun shelvingParking_get(usuario:String,password:String,vShelvingFk:String,vWarehouseFk:String,vDayRange:String) : Call<List<ItemShelvingParkingVO>> {
val params:ArrayList<String> = ArrayList();
params.add(vShelvingFk)
params.add(vWarehouseFk)
params.add(vDayRange)
return restClient!!.shelvingParking_get("json","1",usuario,password,"application/json",params)
}
}

View File

@ -0,0 +1,91 @@
package es.verdnatura.domain
import android.content.Context
import es.verdnatura.presentation.view.feature.ubicador.model.ItemUbicadorVO
import retrofit2.Call
class GetUbicadorUserCase(context: Context) : RestClient(context) {
fun itemShelvingList(usuario:String,password:String,vShelvingFk:String) : Call<List<ItemUbicadorVO>> {
val params:ArrayList<String> = ArrayList();
params.add(vShelvingFk)
return restClient!!.itemShelvingList("json","1",usuario,password,"application/json",params)
}
fun itemShelvingMake(usuario:String,password:String,shelving:String,item:String,deep:String,quantity:String,packing:String,warehouse:String,level:String) : Call<String> {
val params:ArrayList<String> = ArrayList();
params.add(shelving)
params.add(item)
params.add(deep)
params.add(quantity)
params.add(packing)
params.add(warehouse)
params.add(level)
return restClient!!.itemShelvingMake("json","1",usuario,password,"application/json",params)
}
fun itemShelvingMakeEdit(usuario:String,password:String,shelving:String,item:String,deep:String,quantity:String,packing:String,warehouse:String,level:String,itemShelvingFk:String) : Call<String> {
val params:ArrayList<String> = ArrayList();
params.add(shelving)
params.add(item)
params.add(deep)
params.add(quantity)
params.add(packing)
params.add(warehouse)
params.add(level)
params.add(itemShelvingFk)
return restClient!!.itemShelvingMakeEdit("json","1",usuario,password,"application/json",params)
}
fun itemShelvingMake_multi(usuario:String,password:String,shelving:String,items:List<String>,deep:String,warehouse:String,level:String) : Call<String> {
val params:ArrayList<Any> = ArrayList();
params.add(shelving)
params.add(items)
params.add(deep)
params.add(warehouse)
params.add(level)
return restClient!!.itemShelvingMake_multi("json","1",usuario,password,"application/json",params)
}
fun shelvingPriorityUpdate(usuario:String,password:String,priority:String,shelving:String) : Call<String> {
val params:ArrayList<String> = ArrayList();
params.add(priority)
params.add(shelving)
return restClient!!.shelvingPriorityUpdate("json","1",usuario,password,"application/json",params)
}
fun shelvingPark(usuario:String,password:String,shelving:String,parking:String) : Call<String> {
val params:ArrayList<String> = ArrayList();
params.add(shelving)
params.add(parking)
return restClient!!.shelvingPark("json","1",usuario,password,"application/json",params)
}
fun shelvingChange(usuario:String,password:String,origen:String,destino:String) : Call<String> {
val params:ArrayList<String> = ArrayList();
params.add(origen)
params.add(destino)
return restClient!!.shelvingChange("json","1",usuario,password,"application/json",params)
}
fun clearShelvingList(usuario:String,password:String,shelvingFk:String) : Call<String> {
val params:ArrayList<String> = ArrayList();
params.add(shelvingFk)
return restClient!!.clearShelvingList("json","1",usuario,password,"application/json",params)
}
fun itemShelvingTransfer(usuario:String,password:String,itemFk:String,shelvingFk:String) : Call<String> {
val params:ArrayList<String> = ArrayList();
params.add(itemFk)
params.add(shelvingFk)
return restClient!!.itemShelvingTransfer("json","1",usuario,password,"application/json",params)
}
fun itemShelvingDelete(usuario:String,password:String,itemFk:String) : Call<String> {
val params:ArrayList<String> = ArrayList();
params.add(itemFk)
return restClient!!.itemShelvingDelete("json","1",usuario,password,"application/json",params)
}
}

View File

@ -0,0 +1,15 @@
package es.verdnatura.domain
import android.content.Context
open class RestClient(context:Context) {
var restClient:VerdnaturaService? = null
var salixClient:SalixService? = null
init {
restClient = ApiUtils.getApiService(context)
salixClient = ApiSalixUtils.getApiService()
}
}

View File

@ -0,0 +1,23 @@
package es.verdnatura.domain
import es.verdnatura.presentation.view.feature.login.model.LoginSalixVO
import es.verdnatura.presentation.view.feature.login.model.SalixMessageVO
import retrofit2.Call
import retrofit2.http.Body
import retrofit2.http.Header
import retrofit2.http.POST
interface SalixService {
@POST("Accounts/login")
fun login(@Header("Content-Type") content_type: String,
@Body params: LoginSalixVO):
Call<LoginSalixVO>
@POST("chats/sendCheckingPresence")
fun sendChekingPresence(
@Header("Content-Type") content_type: String,
@Header("Authorization") authorization: String,
@Body params: SalixMessageVO):
Call<Boolean>
}

View File

@ -0,0 +1,666 @@
package es.verdnatura.domain
import es.verdnatura.presentation.view.feature.ajustes.model.SectorItemVO
import es.verdnatura.presentation.view.feature.articulo.model.ItemCardVO
import es.verdnatura.presentation.view.feature.articulo.model.ItemPackingType
import es.verdnatura.presentation.view.feature.buscaritemall.model.ItemLocationAll
import es.verdnatura.presentation.view.feature.buscaritem.model.ItemLocationVO
import es.verdnatura.presentation.view.feature.calidad.model.BuyerVO
import es.verdnatura.presentation.view.feature.calidad.model.ItemBuyerVO
import es.verdnatura.presentation.view.feature.collection.ItemVO
import es.verdnatura.presentation.view.feature.faltas.model.ItemFaltasVO
import es.verdnatura.presentation.view.feature.historico.model.ItemHistoricoVO
import es.verdnatura.presentation.view.feature.inventario.model.ItemInventaryVO
import es.verdnatura.presentation.view.feature.login.model.versionApp
import es.verdnatura.presentation.view.feature.paletizador.model.*
import es.verdnatura.presentation.view.feature.presacador.model.PreSacadorItemVO
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.PlacementSupplyVO
import es.verdnatura.presentation.view.feature.shelvingparking.model.ItemShelvingParkingVO
import es.verdnatura.presentation.view.feature.ubicador.model.ItemUbicadorVO
import retrofit2.Call
import retrofit2.http.Body
import retrofit2.http.Header
import retrofit2.http.POST
@JvmSuppressWildcards
interface VerdnaturaService {
//LOGIN ========================================================================>
@POST("security/login")
fun login(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/version")
fun version(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<Boolean>
@POST("/security/getVersion")
fun version2(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<versionApp>
//AJUSTES ========================================================================>
@POST("almacennew/sector_get")
fun getSectors(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String):
Call<List<SectorItemVO>>
//PRESACADORES ========================================================================>
@POST("almacennew/ticketToPrePrepare")
fun ticketToPrePrepare(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<List<PreSacadorItemVO>>
@POST("almacennew/itemPlacementSupplyGetOrder")
fun itemPlacementSupplyGetOrder(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<List<PreSacadorItemVO>>
@POST("almacennew/itemPlacementSupplyCloseOrder")
fun itemPlacementSupplyCloseOrder(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
//SACADORES / CONTROLADORES ========================================================================>
@POST("almacennew/collectionGet")
fun collectionGet(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String):
Call<List<CollectionVO>>
@POST("almacennew/collectionNew")
fun collectionNew(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/collectionTicketGet")
fun collectionTicketGet(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<CollectionVO>
@POST("almacennew/saleTrackingReplace")
fun saleTrackingReplace(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/itemPlacementSupplyAiming")
fun itemPlacementSupplyAiming(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<List<PlacementSupplyVO>>
@POST("almacennew/itemShelvingSaleSupplyAdd")
fun itemShelvingSaleSupplyAdd(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/itemShelvingPlacementSupplyAdd")
fun itemShelvingPlacementSupplyAdd(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/collectionStickerPrint")
fun collectionStickerPrint(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/itemGetAvailable")
fun itemGetAvailable(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<ItemVO>
@POST("almacennew/collectionAddItem")
fun collectionAddItem(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/saleMove")
fun saleMove(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/collectionMissingTrash")
fun collectionMissingTrash(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/saleTrackingDel")
fun saleTrackingDel(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/collectionUpdateState")
fun collectionUpdateState(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/barcodeToItem")
fun getIdFromCode(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/collectionIncreaseQuantity")
fun collectionIncreaseQuantity(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/saleMistakeAdd")
fun saleMistakeAdd(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/mistakeType")
fun mistakeType(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String):
Call<List<MistakeTypeVO>>
//PASILLEROS ========================================================================>
//CONSULTAR ARTICULO ========================================================================>
@POST("almacennew/itemDiary")
fun itemDiary(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<List<ItemHistoricoVO>>
@POST("almacennew/item_card")
fun getItemCard(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<ItemCardVO>
@POST("almacennew/get_ItemPackingType")
fun getItemPackingType(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<List<ItemPackingType>>
@POST("almacennew/itemStockUpdate")
fun itemStockUpdate(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/itemTrash")
fun itemTrash(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/item_placement_save")
fun itemPlacementSave(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/buy_updateGrouping")
fun updateGrouping(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/buy_updatePacking")
fun updatePacking(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/update_ItemPackingType")
fun updatePackingType(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<Boolean>
@POST("almacennew/itemSaveMin")
fun itemSaveMin(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/barcodes_edit")
fun barcodes_edit(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
//BUSCAR ITEM ========================================================================>
@POST("almacennew/getItemUbication")
fun searchItemsUbicador(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<List<ItemLocationVO>>
// BUSCAR ITEM ALL
@POST("almacennew/getItemUbication")
fun searchItemsUbicadorAll(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<List<ItemLocationAll>>
//INVENTARIO ========================================================================>
@POST("almacennew/itemShelvingRadar")
fun itemShelvingRadar(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<List<ItemInventaryVO>>
@POST("almacennew/itemShelving_filterBuyer")
fun itemShelvingRadarFilterBuyer(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<List<ItemInventaryVO>>
@POST("almacennew/faultsReview")
fun faultsReview(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<List<ItemFaltasVO>>
@POST("almacennew/faultsReview_isChecked")
fun faultsReview_isChecked(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
//SHELVING PARKING ========================================================================>
@POST("almacennew/shelvingParking_get")
fun shelvingParking_get(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<List<ItemShelvingParkingVO>>
//UBICADOR ========================================================================>
@POST("almacennew/itemShelvingList")
fun itemShelvingList(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<List<ItemUbicadorVO>>
@POST("almacennew/shelvingPriorityUpdate")
fun shelvingPriorityUpdate(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/itemShelvingMake")
fun itemShelvingMake(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/itemShelvingMakeEdit")
fun itemShelvingMakeEdit(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/itemShelvingMake_multi")
fun itemShelvingMake_multi(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<Any>):
Call<String>
@POST("almacennew/shelvingPark")
fun shelvingPark(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/shelvingChange")
fun shelvingChange(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/clearShelvingList")
fun clearShelvingList(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/itemShelvingTransfer")
fun itemShelvingTransfer(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/itemShelvingDelete")
fun itemShelvingDelete(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
//PALETIZADORES ========================================================================>
@POST("almacennew/expeditionTruckList")
fun expeditionTruckList(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String):
Call<List<ItemExpeditionTruckVO>>
@POST("almacennew/expeditionTruckAdd")
fun expeditionTruckAdd(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/expeditionPalletList")
fun expeditionPallet_List(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<List<ItemPalletVO>>
@POST("almacennew/expeditionScanAdd")
fun expeditionScanAdd(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<List<ItemScanVO>>
@POST("almacennew/expeditionScanPut")
fun expeditionScanPut(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/checkRouteExpeditionScanPut")
fun checkRouteExpeditionScanPut(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/expeditionPalletView")
fun expeditionPalletView(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<List<ItemPalletViewVO>>
@POST("almacennew/expeditionPalletDel")
fun expeditionPalletDel(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/expeditionScanList")
fun expeditionScanList(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<List<ItemExpeditionScanVO>>
@POST("almacennew/expeditionScanDel")
fun expeditionScanDel(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
@POST("almacennew/expeditionPalletPrintSet")
fun expeditionPalletPrintSet(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
//CALIDAD
@POST("almacennew/itemShelvingBuyerGet")
fun itemShelvingBuyerGet(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String):
Call<List<BuyerVO>>
@POST("almacennew/itemShelvingBuyerTask")
fun itemShelvingBuyerTask(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<List<ItemBuyerVO>>
@POST("almacennew/itemShelvingStarsUpdate")
fun itemShelvingStarsUpdate(@Header("aplicacion") aplicacion: String,
@Header("version") version: String,
@Header("user") user: String,
@Header("pass") pass: String,
@Header("Content-Type") content_type: String,
@Body params: List<String>):
Call<String>
}

View File

@ -0,0 +1,27 @@
package es.verdnatura.presentation.base
object BR {
const val _all = 0
const val focused = 1
const val rating = 2
const val resumePosition = 3
const val favorite = 4
const val selected = 5
const val toolBarItem = 6
const val item = 7
const val loadingInfo = 8
const val color = 9
const val icon = 10
const val episode = 11
const val title = 12
const val content = 13
const val onOptionsItemSelected = 14
const val vpsActionListener = 15
const val numberEpisodes = 16
const val seasonColor = 17
const val viewModel = 18
const val action = 19
const val liveProgram = 20
const val loadingEpisodes = 21
const val ratio = 22
}

View File

@ -0,0 +1,41 @@
package es.verdnatura.presentation.base
import android.content.Context
import android.os.Bundle
import android.view.View
import android.view.inputmethod.InputMethodManager
import androidx.annotation.LayoutRes
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
abstract class BaseActivity<T : ViewDataBinding> : AppCompatActivity() {
protected lateinit var binding: T
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(getLayoutId())
initDataBinding()
init()
}
@LayoutRes
abstract fun getLayoutId(): Int
open fun addBindingVariables() {}
abstract fun init()
private fun initDataBinding() {
binding = DataBindingUtil.setContentView(this, getLayoutId())
binding.lifecycleOwner = this
addBindingVariables()
}
fun hideKeyboard(view: View){
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(view.windowToken, 0)
}
}

View File

@ -0,0 +1,446 @@
package es.verdnatura.presentation.base
import android.Manifest
import android.app.AlarmManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.content.pm.PackageManager
import android.media.AudioManager
import android.os.Build
import android.os.Bundle
import android.speech.RecognitionListener
import android.speech.RecognizerIntent
import android.speech.SpeechRecognizer
import android.speech.tts.TextToSpeech
import android.speech.tts.UtteranceProgressListener
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.LayoutRes
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.fragment.app.Fragment
import es.verdnatura.domain.toast
import es.verdnatura.presentation.common.mediaCurrentVolume
import es.verdnatura.presentation.common.mediaMaxVolume
import org.koin.androidx.viewmodel.ext.android.viewModel
import java.util.*
import kotlin.reflect.KClass
abstract class BaseFragment<T : ViewDataBinding, V : BaseViewModel>(viewModelClass: KClass<V>) :
Fragment(), TextToSpeech.OnInitListener , RecognitionListener{
protected val TAG="VERDNATURA"
protected val PREFS_USER = "es.verdnatura.user.prefs"
protected val USERFK = "userFk"
protected val USER = "user"
protected val PASSWORD = "password"
protected val TOKEN = "token"
protected val SECTORDESCRIP = "sectordescrip"
protected val SECTORFK = "sectorFk"
protected val WAREHOUSEFK = "warehouseFk"
protected val RECORDAR = "recordar"
protected val VOZ = "voz"
//nuevo campo número carros ajustes y campos para guardar el buyerid y buyernickname
protected val BUYER = "buyernickname"
protected val BUYERID="buyerid"
protected val CARRO="carro"
protected val WAREHOUSEFK_DEFAULT=60
protected val viewModel: V by viewModel(viewModelClass)
protected lateinit var binding: T
private var isOnReadyForSpeech = false
private var textToSpeech: TextToSpeech? = null
private var mAudioManager:AudioManager? = null
protected var mSpeechRecognizer: SpeechRecognizer? = null
private var mSpeechRecognizerIntent: Intent? = null
protected val NEW_COLLECTION = 0
protected val LISTO = 1
protected val CANCEL = 2
protected val VOLVER = 3
protected val REPITE = 4
protected val OTRO = 5
protected val FALTA = 6
protected val ERROR = -1
val allowedStrings =
Arrays.asList(
"cero", "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete",
"ocho", "nueve", "diez", "once", "doce", "trece", "catorce",
"quince", "dieziseis", "diezisiete", "dieziocho", "diezinueve", "veinte",
"treinta", "cuarenta", "cincuenta", "sesenta", "setenta", "ochenta", "noventa",
"cien", "mil"
)
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? = inflater.inflate(getLayoutId(), container, false)
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
initDataBinding()
getBundleArguments()
observeViewModel()
runSound()
requestRecordAudioPermission()
init()
}
@LayoutRes
abstract fun getLayoutId(): Int
open fun init() {}
open fun observeViewModel() {}
open fun getBundleArguments() {}
open fun addBindingVariables() {}
open fun setSpeak() {
//VOZ
textToSpeech = TextToSpeech(requireContext(),this)
mAudioManager = requireActivity().getSystemService(Context.AUDIO_SERVICE) as AudioManager
}
open fun restartapp(f : Fragment){
val mStartActivity = Intent(context, f::class.java)
val mPendingIntentId = 123456
val mPendingIntent = PendingIntent.getActivity(
context,
mPendingIntentId,
mStartActivity,
PendingIntent.FLAG_CANCEL_CURRENT
)
val mgr = context!!.getSystemService(Context.ALARM_SERVICE) as AlarmManager
mgr[AlarmManager.RTC, System.currentTimeMillis() + 100] = mPendingIntent
System.exit(0)
}
open fun initialize(){
//ESCUCHA
try {
mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(requireContext())
mSpeechRecognizerIntent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
mSpeechRecognizerIntent!!.putExtra(
RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM
)
mSpeechRecognizerIntent!!.putExtra(
RecognizerIntent.EXTRA_LANGUAGE,
Locale.getDefault()
)
mSpeechRecognizerIntent!!.putExtra(RecognizerIntent.EXTRA_PREFER_OFFLINE, false)
mSpeechRecognizer?.setRecognitionListener(this)
isOnReadyForSpeech = false;
startListening()
}catch (e:Exception){
cancelSpeech()
}
}
private fun initDataBinding() {
binding = DataBindingUtil.bind<T>(view!!)!!
binding.lifecycleOwner = viewLifecycleOwner
binding.setVariable(BR.viewModel, this@BaseFragment.viewModel)
lifecycle.addObserver(this@BaseFragment.viewModel)
addBindingVariables()
}
override fun onInit(status: Int) {
if (status == TextToSpeech.SUCCESS) {
val spanish = Locale("es", "ES")
textToSpeech!!.language = spanish
textToSpeech!!.setOnUtteranceProgressListener(object: UtteranceProgressListener() {
override fun onDone(utteranceId: String?) {
Log.i("SPEEAK","on done")
requireActivity().runOnUiThread(Runnable {
if (mSpeechRecognizer != null){
mSpeechRecognizer!!.destroy()
mSpeechRecognizer = null
}
initialize()
})
}
override fun onError(utteranceId: String?) {
"Error to speak".toast(requireContext())
}
override fun onStart(utteranceId: String?) {
Log.i("SPEEAK","on start")
runSound()
}
})
}else{
"La voz no se ha podido iniciar".toast(requireContext())
}
}
private fun runSound(){
// Get the maximum media/music volume
val maxVolume = mAudioManager?.mediaMaxVolume
// mAudioManager?.setMediaVolume(maxVolume!!)
}
private fun muteSound() {
if (mAudioManager?.mediaCurrentVolume != 0){
// mAudioManager?.setMediaVolume(0)
}
}
fun speak(frase:String) {
textToSpeech!!.speak(frase, TextToSpeech.QUEUE_FLUSH, null, "frase")
}
open fun startListening() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
muteSound()
}
mSpeechRecognizer!!.startListening(mSpeechRecognizerIntent)
}
override fun onReadyForSpeech(params: Bundle?) {
isOnReadyForSpeech = true;
Log.i("Speech", "onReadyForSpeech")
}
override fun onBeginningOfSpeech() {
Log.i("Speech", "onBeginningOfSpeech")
}
override fun onRmsChanged(rmsdB: Float) {}
override fun onBufferReceived(buffer: ByteArray?) {
Log.i("Speech", "onBufferReceived")
}
override fun onEndOfSpeech() {
Log.i("Speech", "onEndOfSpeech")
}
override fun onError(error: Int) {
if (!isOnReadyForSpeech && error == SpeechRecognizer.ERROR_NO_MATCH) {
("Problemas con la velocidad de internet. No se puede usar la voz").toast(requireContext())
return
}else{
Log.i("Speech", "onError "+error)
if (mSpeechRecognizer != null) mSpeechRecognizer!!.destroy()
mSpeechRecognizer = null
initialize()
}
}
override fun onResults(results: Bundle) {}
override fun onPartialResults(partialResults: Bundle?) {
Log.i("Speech", "onPartialResults")
}
override fun onEvent(eventType: Int, params: Bundle?) {
Log.i("Speech", "onEvent")
}
open fun checkText(text: String): Int {
//check for nuevo
val nuevo = getMatch(text, "nuevo")
//check for listo
val listo = getMatch(text, "listo")
//check for cancelar
val cancelar = getMatch(text, "cancelar")
//check for volver
val volver = getMatch(text, "volver")
//check for repite
val repite = getMatch(text, "repite")
//check for siguiente
val otro = getMatch(text, "otro")
//check for FALTA
val falta = getMatch(text, "falta")
val words = IntArray(7)
words[0] = nuevo
words[1] = listo
words[2] = cancelar
words[3] = volver
words[4] = repite
words[5] = otro
words[6] = falta
return getMax(words)
}
private fun getMax(a: IntArray): Int {
var max = a[0]
var pos = 0
for (i in a.indices) {
if (a[i] > max) {
max = a[i]
pos = i
}
}
return if (max < 80) {
-1
} else pos
}
private fun getMatch(a: String, b: String): Int {
var count = 0
val cha = a.toCharArray()
val chb = b.toCharArray()
for (i in cha) {
for (x in chb) {
if (x == i) {
count += 1
break
}
}
}
val numChar = a.length
if (numChar != 0)
return count * 100 / numChar
else
return 100
}
private fun requestRecordAudioPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val requiredPermission: String = Manifest.permission.RECORD_AUDIO
val res = context!!.checkCallingOrSelfPermission(requiredPermission)
// If the user previously denied this permission then show a message explaining why
// this permission is needed
if (res == PackageManager.PERMISSION_DENIED) {
requestPermissions(arrayOf(requiredPermission), 101)
}
}
}
fun cancelSpeech(){
if (mSpeechRecognizer != null){
mSpeechRecognizer!!.destroy()
mSpeechRecognizer = null
}
}
fun saveBuyer(buyernickname: String) {
val prefs: SharedPreferences = activity!!.getSharedPreferences(PREFS_USER, 0)
val editor = prefs.edit()
editor.putString(BUYER, buyernickname)
editor.apply()
}
fun saveBuyerId(buyerid: String) {
val prefs: SharedPreferences = activity!!.getSharedPreferences(PREFS_USER, 0)
val editor = prefs.edit()
editor.putString(BUYERID, buyerid)
editor.apply()
}
/*open fun wordToNumber(input: String?): Int {
var input = input
var isValidInput = true
var result = 0
var finalResult = 0
if (input != null && input.length > 0) {
input = input.replace("-".toRegex(), " ")
input = input.toLowerCase().replace(" and".toRegex(), " ")
val splittedParts =
input.trim { it <= ' ' }.split("\\s+".toRegex()).toTypedArray()
for (str in splittedParts) {
if (!es.verdnatura.warehouse.UTILS.Utils.allowedStrings.contains(str)) {
isValidInput = false
return -1
}
}
if (isValidInput) {
for (str in splittedParts) {
if (str.equals("cero", ignoreCase = true)) {
result += 0
} else if (str.equals("uno", ignoreCase = true)) {
result += 1
} else if (str.equals("dos", ignoreCase = true)) {
result += 2
} else if (str.equals("tres", ignoreCase = true)) {
result += 3
} else if (str.equals("cuatro", ignoreCase = true)) {
result += 4
} else if (str.equals("cinco", ignoreCase = true)) {
result += 5
} else if (str.equals("seis", ignoreCase = true)) {
result += 6
} else if (str.equals("siete", ignoreCase = true)) {
result += 7
} else if (str.equals("ocho", ignoreCase = true)) {
result += 8
} else if (str.equals("nueve", ignoreCase = true)) {
result += 9
} else if (str.equals("diez", ignoreCase = true)) {
result += 10
} else if (str.equals("once", ignoreCase = true)) {
result += 11
} else if (str.equals("doce", ignoreCase = true)) {
result += 12
} else if (str.equals("trece", ignoreCase = true)) {
result += 13
} else if (str.equals("catorce", ignoreCase = true)) {
result += 14
} else if (str.equals("quince", ignoreCase = true)) {
result += 15
} else if (str.equals("dieziseis", ignoreCase = true)) {
result += 16
} else if (str.equals("diezisiete", ignoreCase = true)) {
result += 17
} else if (str.equals("dieziocho", ignoreCase = true)) {
result += 18
} else if (str.equals("diezinueve", ignoreCase = true)) {
result += 19
} else if (str.equals("veinte", ignoreCase = true)) {
result += 20
} else if (str.equals("treinta", ignoreCase = true)) {
result += 30
} else if (str.equals("cuarenta", ignoreCase = true)) {
result += 40
} else if (str.equals("cincuenta", ignoreCase = true)) {
result += 50
} else if (str.equals("sesenta", ignoreCase = true)) {
result += 60
} else if (str.equals("setenta", ignoreCase = true)) {
result += 70
} else if (str.equals("ochenta", ignoreCase = true)) {
result += 80
} else if (str.equals("noventa", ignoreCase = true)) {
result += 90
} else if (str.equals("cien", ignoreCase = true)) {
result *= 100
} else if (str.equals("mil", ignoreCase = true)) {
result *= 1000
finalResult += result
result = 0
}
}
finalResult += result
return finalResult
}
}
return finalResult
}*/
}

View File

@ -0,0 +1,6 @@
package es.verdnatura.presentation.base
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.ViewModel
abstract class BaseViewModel : ViewModel(), LifecycleObserver

View File

@ -0,0 +1,22 @@
package es.verdnatura.presentation.common
import android.view.View
import android.view.View.GONE
import android.view.View.VISIBLE
import androidx.databinding.BindingAdapter
import org.koin.core.KoinComponent
object BindingAdapter : KoinComponent {
/**
* Set view visibility depending boolean
*
* @param isVisible - If true, set view to VISIBLE, else set view to GONE
*/
@BindingAdapter("isVisible")
@JvmStatic
fun View.isVisible(isVisible: Boolean) {
visibility = if (isVisible) VISIBLE else GONE
}
}

View File

@ -0,0 +1,24 @@
package es.verdnatura.presentation.common
open class Event<out T>(private val content: T) {
var hasBeenHandled = false
private set // Allow external read but not write
/**
* Returns the content and prevents its use again.
*/
fun getContentIfNotHandled(): T? {
return if (hasBeenHandled) {
null
} else {
hasBeenHandled = true
content
}
}
/**
* Returns the content, even if it's already been handled.
*/
fun peekContent(): T = content
}

View File

@ -0,0 +1,7 @@
package es.verdnatura.presentation.common
class ResponseItemVO (
var response:String = "",
var isError: Boolean = false,
var errorMessage: String = ""
)

View File

@ -0,0 +1,105 @@
package es.verdnatura.presentation.common
import android.graphics.drawable.Drawable
import es.verdnatura.presentation.view.feature.ajustes.model.AjustesItemVO
import es.verdnatura.presentation.view.feature.articulo.model.BarcodeVO
import es.verdnatura.presentation.view.feature.articulo.model.ItemCardRowVO
import es.verdnatura.presentation.view.feature.buscaritem.model.ItemLocationVO
import es.verdnatura.presentation.view.feature.faltas.model.ItemFaltasVO
import es.verdnatura.presentation.view.feature.inventario.model.ItemInventaryVO
import es.verdnatura.presentation.view.feature.paletizador.model.ItemExpeditionScanVO
import es.verdnatura.presentation.view.feature.paletizador.model.ItemExpeditionTruckVO
import es.verdnatura.presentation.view.feature.paletizador.model.ItemPalletVO
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.SaleVO
import es.verdnatura.presentation.view.feature.ubicador.model.ItemUbicadorVO
interface OnOptionsSelectedListener {
fun onOptionsItemSelected(item: Drawable)
}
interface OnPasillerosItemClickListener {
fun onPasillerosItemClickListener(item: PasillerosItemVO,entryPoint:String)
}
interface OnAjustesItemClickListener {
fun onAjustesItemClickListener(item: AjustesItemVO)
}
interface OnItemCardRowClickListener {
fun onItemCardRowClickListener(item: ItemCardRowVO)
}
interface OnBarcodeRowClickListener {
fun onBarcodeRowClickListener(item: BarcodeVO)
}
interface OnLocationRowClickListener {
fun onLocationRowClickListener(item: ItemLocationVO)
}
interface OnInvetoryNichoClickListener {
fun onInvetoryNichoClickListener(item: ItemInventaryVO)
}
interface OnFaltasNichoClickListener {
fun onFaltasNichoClickListener(item: ItemFaltasVO)
}
interface OnFaltasReviewClickListener {
fun onFaltasReviewClickListener(item: ItemFaltasVO)
}
interface OnAutomaticItemClickListener {
fun onAutomaticItemClickListener(position: Int)
}
interface OnVisibleClickListener {
fun onVisibleClickListener(item: ItemUbicadorVO)
}
interface OnMoreClickListener {
fun onMoreClickListener(item: ItemUbicadorVO)
}
interface OnTruckClickListener {
fun onTruckClickListener(item: ItemExpeditionTruckVO,entryPoint: String)
}
interface OnPalletClickListener {
fun onPalletClickListener(itemTruck: ItemExpeditionTruckVO,itemPallet: ItemPalletVO)
}
interface OnComprobarPalletViewClickListener {
fun onComprobarPalletViewClickListener(itemTruck: ItemExpeditionTruckVO,itemPallet: ItemPalletVO)
}
interface OnScanLongClickListener {
fun onScanLongClickListener(ItemExpeditionScanVO: ItemExpeditionScanVO)
}
interface OnCollectionSelectedListener {
fun onCollectionSelected(collection: CollectionVO,type:String)
}
interface OnQuantityClickListener {
fun onQuantityClick(sale: SaleVO)
}
interface OnSaleClickListener {
fun onSaleClick(sale: SaleVO)
}
interface OnMistakeClickListener {
fun onMistakeClickListener(sale:SaleVO)
}
interface OnBuyerSelectedListener {
fun onBuyerSelected(userFk:String)
}
interface OnStarSelectedListener {
fun onStarSelected(vId:String, vStars:String)
}

View File

@ -0,0 +1,164 @@
package es.verdnatura.presentation.common
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.media.AudioManager
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import android.view.ViewTreeObserver
import android.view.inputmethod.InputMethodManager
import android.widget.ImageView
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.transition.Transition
import java.util.*
inline fun FragmentManager.inTransaction(func: FragmentTransaction.() -> FragmentTransaction) =
beginTransaction().func().commit()
fun <T> Context.openActivity(it: Class<T>, extras: Bundle.() -> Unit = {}) {
val intent = Intent(this, it)
intent.putExtras(Bundle().apply(extras))
startActivity(intent)
}
fun FragmentActivity.replaceFragment(
fragment: Fragment,
frameId: Int,
tag: String,
addToBackStack: Boolean = false
) {
supportFragmentManager.inTransaction {
replace(frameId, fragment, tag)
if (addToBackStack) addToBackStack(tag)
setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out)
}
}
fun FragmentActivity.addFragment(
fragment: Fragment,
frameId: Int,
tag: String = "",
addToBackStack: Boolean = false
) {
supportFragmentManager.inTransaction {
add(frameId, fragment, tag)
if (addToBackStack) addToBackStack(tag)
setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out)
}
}
fun View.setDimensions(width: Int, height: Int) {
val layoutParams = this.layoutParams
layoutParams?.width = width
layoutParams?.height = height
this.layoutParams = layoutParams
}
fun View.setMargins(left: Int, top: Int, right: Int, bottom: Int) {
val mlp = this.layoutParams as ViewGroup.MarginLayoutParams
mlp.setMargins(left, top, right, bottom)
}
fun ImageView.loadUrl(url: String) {
Glide.with(context)
.asBitmap()
.load(url)
.into(object : CustomTarget<Bitmap>() {
override fun onLoadCleared(placeholder: Drawable?) {}
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
setImageBitmap(resource)
}
})
}
inline val <reified T> T.TAG: String
get() = T::class.java.canonicalName ?: T::class.simpleName ?: T::class.java.simpleName
fun Calendar.convertToDateString(): String {
var dayOfWeek = ""
var dayOfMonth = ""
val day = this[Calendar.DATE]
when (this[Calendar.DAY_OF_WEEK]) {
1 -> dayOfWeek = "Dom"
2 -> dayOfWeek = "Lun"
3 -> dayOfWeek = "Mar"
4 -> dayOfWeek = "Mie"
5 -> dayOfWeek = "Jue"
6 -> dayOfWeek = "Vie"
7 -> dayOfWeek = "Sab"
}
when (this[Calendar.MONTH]) {
0 -> dayOfMonth = "Ene"
1 -> dayOfMonth = "Feb"
2 -> dayOfMonth = "Mar"
3 -> dayOfMonth = "Abr"
4 -> dayOfMonth = "May"
5 -> dayOfMonth = "Jun"
6 -> dayOfMonth = "Jul"
7 -> dayOfMonth = "Ago"
8 -> dayOfMonth = "Sep"
9 -> dayOfMonth = "Oct"
10 -> dayOfMonth = "Nov"
11 -> dayOfMonth = "Dic"
}
return dayOfWeek + " " + day + " " + dayOfMonth
}
fun RecyclerView.addViewObserver(function: () -> Unit) {
val view = this
view.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
view.viewTreeObserver.removeOnGlobalLayoutListener(this)
function.invoke()
}
})
}
fun Fragment.hideKeyboard() {
view?.let { activity?.hideKeyboard(it) }
}
fun Activity.hideKeyboard() {
hideKeyboard(currentFocus ?: View(this))
}
fun Context.hideKeyboard(view: View) {
val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
val hideSoftInputFromWindow = inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
}
// Extension function to change media volume programmatically
fun AudioManager.setMediaVolume(volumeIndex:Int) {
// Set media volume level
this.setStreamVolume(
AudioManager.STREAM_MUSIC, // Stream type
volumeIndex, // Volume index
AudioManager.FLAG_SHOW_UI// Flags
)
}
// Extension property to get media maximum volume index
val AudioManager.mediaMaxVolume:Int
get() = this.getStreamMaxVolume(AudioManager.STREAM_MUSIC)
// Extension property to get media/music current volume index
val AudioManager.mediaCurrentVolume:Int
get() = this.getStreamVolume(AudioManager.STREAM_MUSIC)

View File

@ -0,0 +1,42 @@
package es.verdnatura.presentation.view.component
import android.app.Dialog
import android.content.Context
import android.view.View
import es.verdnatura.R
import kotlinx.android.synthetic.main.component_custom_dialog.*
class CustomDialog(context: Context) : Dialog(context, R.style.DialogTheme) {
init {
setContentView(R.layout.component_custom_dialog)
}
fun setTitle(title: String): CustomDialog {
custom_dialog_title.visibility = View.VISIBLE
custom_dialog_title.text = title
return this
}
fun setDescription(description: String): CustomDialog {
custom_dialog_description.visibility = View.VISIBLE
custom_dialog_description.text = description
return this
}
fun setOkButton(text: String, onButtonClicked: () -> Unit): CustomDialog {
custom_dialog_button_ok.visibility = View.VISIBLE
custom_dialog_button_ok.text = text
custom_dialog_button_ok.setOnClickListener { onButtonClicked() }
return this
}
fun setKoButton(text: String, onButtonClicked: () -> Unit): CustomDialog {
custom_dialog_button_ko.visibility = View.VISIBLE
custom_dialog_button_ko.text = text
custom_dialog_button_ko.setOnClickListener { onButtonClicked() }
return this
}
}

View File

@ -0,0 +1,84 @@
package es.verdnatura.presentation.view.component
import android.app.Dialog
import android.app.TimePickerDialog
import android.content.Context
import android.view.View
import com.google.android.material.textfield.TextInputEditText
import es.verdnatura.R
import kotlinx.android.synthetic.main.component_custom_hour.*
import java.text.SimpleDateFormat
import java.util.*
class CustomDialogHour(context: Context) : Dialog(context, R.style.DialogTheme) {
init {
setContentView(R.layout.component_custom_hour)
}
fun getDestinoEditText(): TextInputEditText {
return custom_dialog_destino_value
}
fun getDestinoValue(): String {
return custom_dialog_destino_value.text.toString()
}
fun setDestinoValue(value: String): CustomDialogHour {
custom_dialog_destino_value.setText(value)
custom_dialog_destino_value.visibility = View.VISIBLE
return this
}
fun getHoraEditText(): TextInputEditText {
return custom_dialog_hour_value
}
fun getHoraValue(): String {
return custom_dialog_hour_value.text.toString()
}
fun setHoraValue(value: String): CustomDialogHour {
custom_dialog_hour_value.setText(value)
custom_dialog_hour_value.visibility = View.VISIBLE
ib_obtener_hora.setOnClickListener {
val cal = Calendar.getInstance()
val timeSetListener = TimePickerDialog.OnTimeSetListener { timePicker, hour, minute ->
cal.set(Calendar.HOUR_OF_DAY, hour)
cal.set(Calendar.MINUTE, minute)
custom_dialog_hour_value.setText(SimpleDateFormat("HH:mm").format(cal.time))
}
TimePickerDialog(context, timeSetListener, cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), true).show()
}
return this
}
fun setTitle(title: String): CustomDialogHour {
custom_dialog_title.visibility = View.VISIBLE
custom_dialog_title.text = title
return this
}
fun setDescription(description: String): CustomDialogHour {
custom_dialog_description.visibility = View.VISIBLE
custom_dialog_description.text = description
return this
}
fun setOkButton(text: String, onButtonClicked: () -> Unit): CustomDialogHour {
custom_dialog_button_ok.visibility = View.VISIBLE
custom_dialog_button_ok.text = text
custom_dialog_button_ok.setOnClickListener { onButtonClicked() }
return this
}
fun setKoButton(text: String, onButtonClicked: () -> Unit): CustomDialogHour {
custom_dialog_button_ko.visibility = View.VISIBLE
custom_dialog_button_ko.text = text
custom_dialog_button_ko.setOnClickListener { onButtonClicked() }
return this
}
}

View File

@ -0,0 +1,60 @@
package es.verdnatura.presentation.view.component
import android.app.Dialog
import android.content.Context
import android.view.View
import com.google.android.material.textfield.TextInputEditText
import es.verdnatura.R
import kotlinx.android.synthetic.main.component_custom_dialog.custom_dialog_button_ko
import kotlinx.android.synthetic.main.component_custom_dialog.custom_dialog_button_ok
import kotlinx.android.synthetic.main.component_custom_dialog.custom_dialog_description
import kotlinx.android.synthetic.main.component_custom_dialog.custom_dialog_title
import kotlinx.android.synthetic.main.component_custom_edit_dialog.*
class CustomDialogInput (context: Context) : Dialog(context, R.style.DialogTheme) {
init {
setContentView(R.layout.component_custom_edit_dialog)
}
fun getEditText() : TextInputEditText {
return custom_dialog_value
}
fun getValue() : String {
return custom_dialog_value.text.toString()
}
fun setValue(value : String): CustomDialogInput{
custom_dialog_value.setText(value)
custom_dialog_value.visibility = View.VISIBLE
return this
}
fun setTitle(title: String): CustomDialogInput {
custom_dialog_title.visibility = View.VISIBLE
custom_dialog_title.text = title
return this
}
fun setDescription(description: String): CustomDialogInput {
custom_dialog_description.visibility = View.VISIBLE
custom_dialog_description.text = description
return this
}
fun setOkButton(text: String, onButtonClicked: () -> Unit): CustomDialogInput {
custom_dialog_button_ok.visibility = View.VISIBLE
custom_dialog_button_ok.text = text
custom_dialog_button_ok.setOnClickListener { onButtonClicked() }
return this
}
fun setKoButton(text: String, onButtonClicked: () -> Unit): CustomDialogInput {
custom_dialog_button_ko.visibility = View.VISIBLE
custom_dialog_button_ko.text = text
custom_dialog_button_ko.setOnClickListener { onButtonClicked() }
return this
}
}

View File

@ -0,0 +1,97 @@
package es.verdnatura.presentation.view.component
import android.app.Dialog
import android.content.Context
import android.view.View
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.textfield.TextInputEditText
import es.verdnatura.R
import kotlinx.android.synthetic.main.component_custom_list_dialog.*
class CustomDialogList (context: Context) : Dialog(context, R.style.DialogTheme) {
init {
setContentView(R.layout.component_custom_list_dialog)
}
fun getRecyclerView() : RecyclerView {
return item_recyclerview
}
fun getEditText() : TextInputEditText {
return custom_dialog_value
}
fun getEditTextTwo() : TextInputEditText {
return custom_dialog_value_two
}
fun getValue() : String {
return custom_dialog_value.text.toString()
}
fun setValue(value : String): CustomDialogList{
custom_dialog_value.setText(value)
textinputlayout_username.visibility = View.VISIBLE
return this
}
fun getValueTwo() : String {
return custom_dialog_value_two.text.toString()
}
fun setValueTwo(value : String): CustomDialogList{
custom_dialog_value_two.setText(value)
textinputlayout_two.visibility = View.VISIBLE
return this
}
fun setTitle(title: String): CustomDialogList {
custom_dialog_title.visibility = View.VISIBLE
custom_dialog_title.text = title
return this
}
fun setDescription(title: String): CustomDialogList {
custom_dialog_description.visibility = View.VISIBLE
custom_dialog_description.text = title
return this
}
fun setOkButton(text: String, onButtonClicked: () -> Unit): CustomDialogList {
custom_dialog_button_ok.visibility = View.VISIBLE
custom_dialog_button_ok.text = text
custom_dialog_button_ok.setOnClickListener { onButtonClicked() }
return this
}
fun setKoButton(text: String, onButtonClicked: () -> Unit): CustomDialogList {
custom_dialog_button_ko.visibility = View.VISIBLE
custom_dialog_button_ko.text = text
custom_dialog_button_ko.setOnClickListener { onButtonClicked() }
return this
}
fun setHintValue(text:String): CustomDialogList{
custom_dialog_value.hint = text
return this
}
fun setHintValueTwo(text:String): CustomDialogList{
custom_dialog_value_two.hint = text
return this
}
fun setTextTwoGone():CustomDialogList{
textinputlayout_two.visibility = View.GONE
return this
}
fun hideDialog():CustomDialogList{
custom_dialog_value.visibility = View.GONE
return this
}
}

View File

@ -0,0 +1,90 @@
package es.verdnatura.presentation.view.component
import android.app.Dialog
import android.content.Context
import android.view.View
import com.google.android.material.textfield.TextInputEditText
import es.verdnatura.R
import kotlinx.android.synthetic.main.component_custom_three_dialog.*
import kotlinx.android.synthetic.main.component_custom_two_dialog.custom_dialog_button_ko
import kotlinx.android.synthetic.main.component_custom_two_dialog.custom_dialog_button_ok
import kotlinx.android.synthetic.main.component_custom_two_dialog.custom_dialog_button_ok_two
import kotlinx.android.synthetic.main.component_custom_two_dialog.custom_dialog_description
import kotlinx.android.synthetic.main.component_custom_two_dialog.custom_dialog_title
class CustomDialogThreeButtons (context: Context) : Dialog(context, R.style.DialogTheme) {
init {
setContentView(R.layout.component_custom_three_dialog)
}
fun setTitle(title: String): CustomDialogThreeButtons {
custom_dialog_title.visibility = View.VISIBLE
custom_dialog_title.text = title
return this
}
fun setDescription(description: String): CustomDialogThreeButtons {
custom_dialog_description.visibility = View.VISIBLE
custom_dialog_description.text = description
return this
}
fun setOkButton(text: String, onButtonClicked: () -> Unit): CustomDialogThreeButtons {
custom_dialog_button_ok.visibility = View.VISIBLE
custom_dialog_button_ok.text = text
custom_dialog_button_ok.setOnClickListener { onButtonClicked() }
return this
}
fun getValue() : String {
return custom_dialog_value.text.toString()
}
fun getEditText() : TextInputEditText {
return custom_dialog_value
}
fun setValue(value : String): CustomDialogThreeButtons{
custom_dialog_value.setText(value)
textinputlayout.visibility = View.VISIBLE
return this
}
fun setOkButtonTwo(text: String, onButtonClicked: () -> Unit): CustomDialogThreeButtons {
custom_dialog_button_ok_two.visibility = View.VISIBLE
custom_dialog_button_ok_two.text = text
custom_dialog_button_ok_two.setOnClickListener { onButtonClicked() }
return this
}
fun setOkButtonThree(text: String, onButtonClicked: () -> Unit): CustomDialogThreeButtons {
custom_dialog_button_ok_three.visibility = View.VISIBLE
custom_dialog_button_ok_three.text = text
custom_dialog_button_ok_three.setOnClickListener { onButtonClicked() }
return this
}
fun setOkButtonFour(text: String, onButtonClicked: () -> Unit): CustomDialogThreeButtons {
custom_dialog_button_ok_four.visibility = View.VISIBLE
custom_dialog_button_ok_four.text = text
custom_dialog_button_ok_four.setOnClickListener { onButtonClicked() }
return this
}
fun setOkButtonAdd(text: String, onButtonClicked: () -> Unit): CustomDialogThreeButtons {
custom_dialog_button_add.visibility = View.VISIBLE
custom_dialog_button_add.text = text
custom_dialog_button_add.setOnClickListener { onButtonClicked() }
return this
}
fun setKoButton(text: String, onButtonClicked: () -> Unit): CustomDialogThreeButtons {
custom_dialog_button_ko.visibility = View.VISIBLE
custom_dialog_button_ko.text = text
custom_dialog_button_ko.setOnClickListener { onButtonClicked() }
return this
}
}

View File

@ -0,0 +1,49 @@
package es.verdnatura.presentation.view.component
import android.app.Dialog
import android.content.Context
import android.view.View
import es.verdnatura.R
import kotlinx.android.synthetic.main.component_custom_two_dialog.*
class CustomDialogTwoButtons (context: Context) : Dialog(context, R.style.DialogTheme) {
init {
setContentView(R.layout.component_custom_two_dialog)
}
fun setTitle(title: String): CustomDialogTwoButtons {
custom_dialog_title.visibility = View.VISIBLE
custom_dialog_title.text = title
return this
}
fun setDescription(description: String): CustomDialogTwoButtons {
custom_dialog_description.visibility = View.VISIBLE
custom_dialog_description.text = description
return this
}
fun setOkButton(text: String, onButtonClicked: () -> Unit): CustomDialogTwoButtons {
custom_dialog_button_ok.visibility = View.VISIBLE
custom_dialog_button_ok.text = text
custom_dialog_button_ok.setOnClickListener { onButtonClicked() }
return this
}
fun setOkButtonTwo(text: String, onButtonClicked: () -> Unit): CustomDialogTwoButtons {
custom_dialog_button_ok_two.visibility = View.VISIBLE
custom_dialog_button_ok_two.text = text
custom_dialog_button_ok_two.setOnClickListener { onButtonClicked() }
return this
}
fun setKoButton(text: String, onButtonClicked: () -> Unit): CustomDialogTwoButtons {
custom_dialog_button_ko.visibility = View.VISIBLE
custom_dialog_button_ko.text = text
custom_dialog_button_ko.setOnClickListener { onButtonClicked() }
return this
}
}

View File

@ -0,0 +1,97 @@
package es.verdnatura.presentation.view.component
import android.app.Dialog
import android.content.Context
import android.view.View
import com.google.android.material.textfield.TextInputEditText
import es.verdnatura.R
import kotlinx.android.synthetic.main.component_custom_ubicador_dialog.*
class CustomDialogUbicador (context: Context) : Dialog(context, R.style.DialogTheme) {
init {
setContentView(R.layout.component_custom_ubicador_dialog)
}
fun setTitle(title: String): CustomDialogUbicador {
custom_dialog_title.visibility = View.VISIBLE
custom_dialog_title.text = title
return this
}
fun setItemValue(value : String) : CustomDialogUbicador{
custom_dialog_item.setText(value)
custom_dialog_item.visibility = View.VISIBLE
return this
}
fun getItemValue() : String{
return custom_dialog_item.text.toString()
}
fun getEditItem() : TextInputEditText {
return custom_dialog_item
}
fun setEtiquetaValue(value : String) : CustomDialogUbicador{
custom_dialog_etiquetas.setText(value)
custom_dialog_etiquetas.visibility = View.VISIBLE
return this
}
fun getEtiquetaValue() : String{
return custom_dialog_etiquetas.text.toString()
}
fun getEtiquetaItem() : TextInputEditText {
return custom_dialog_etiquetas
}
fun setPackingValue(value : String) : CustomDialogUbicador{
custom_dialog_packing.setText(value)
custom_dialog_packing.visibility = View.VISIBLE
return this
}
fun getPackingValue() : String{
return custom_dialog_packing.text.toString()
}
fun getPackingItem() : TextInputEditText {
return custom_dialog_packing
}
fun setVisibleValue(value : String) : CustomDialogUbicador{
custom_dialog_visible.setText(value)
custom_dialog_visible.visibility = View.VISIBLE
return this
}
fun getVisibleValue() : String{
return custom_dialog_visible.text.toString()
}
fun getVisibleItem() : TextInputEditText {
return custom_dialog_visible
}
fun setOkButton(text: String, onButtonClicked: () -> Unit): CustomDialogUbicador {
custom_dialog_button_ok.visibility = View.VISIBLE
custom_dialog_button_ok.text = text
custom_dialog_button_ok.setOnClickListener { onButtonClicked() }
return this
}
fun setKoButton(text: String, onButtonClicked: () -> Unit): CustomDialogUbicador {
custom_dialog_button_ko.visibility = View.VISIBLE
custom_dialog_button_ko.text = text
custom_dialog_button_ko.setOnClickListener { onButtonClicked() }
return this
}
}

View File

@ -0,0 +1,41 @@
package es.verdnatura.presentation.view.feature.ajustes.adapter
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import es.verdnatura.databinding.ItemAjustesRowBinding
import es.verdnatura.presentation.common.OnAjustesItemClickListener
import es.verdnatura.presentation.view.feature.ajustes.model.AjustesItemVO
class AjustesAdapter (
private val items: List<AjustesItemVO>,
private val onAjustesItemClickListener: OnAjustesItemClickListener
): RecyclerView.Adapter<AjustesAdapter.AjustesItemHolder> () {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AjustesItemHolder {
return AjustesItemHolder(
ItemAjustesRowBinding.inflate(LayoutInflater.from(parent.context),parent,false)
)
}
override fun getItemCount() =items.size
override fun onBindViewHolder(holder: AjustesItemHolder, position: Int) {
holder.bind(items[position])
holder.binding.root.setOnClickListener {
onAjustesItemClickListener.onAjustesItemClickListener(items[position])
}
}
class AjustesItemHolder(
val binding: ItemAjustesRowBinding
) : RecyclerView.ViewHolder(binding.root){
fun bind(item: AjustesItemVO) {
binding.apply {
this.item = item
}
}
}
}

View File

@ -0,0 +1,260 @@
package es.verdnatura.presentation.view.feature.ajustes.fragment
import android.app.AlarmManager
import android.app.AlertDialog
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.os.Bundle
import android.preference.PreferenceManager
import android.util.Log
import android.view.KeyEvent
import android.view.View
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
import es.verdnatura.R
import es.verdnatura.databinding.FragmentAjustesBinding
import es.verdnatura.domain.notNull
import es.verdnatura.domain.toast
import es.verdnatura.presentation.base.BaseFragment
import es.verdnatura.presentation.common.OnAjustesItemClickListener
import es.verdnatura.presentation.common.hideKeyboard
import es.verdnatura.presentation.view.component.CustomDialog
import es.verdnatura.presentation.view.feature.ajustes.adapter.AjustesAdapter
import es.verdnatura.presentation.view.feature.ajustes.model.AjustesItemVO
import es.verdnatura.presentation.view.feature.ajustes.model.SectorItemVO
import es.verdnatura.presentation.view.feature.login.activity.LoginActivity
import es.verdnatura.presentation.view.feature.login.fragment.LoginFragment
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.fragment_ajustes.*
import kotlinx.android.synthetic.main.fragment_ajustes.splash_progress
import kotlinx.android.synthetic.main.fragment_login.*
class AjustesFragment : BaseFragment<FragmentAjustesBinding,AjustesViewModel>(AjustesViewModel::class) {
private var user:String? = ""
private var password:String? = ""
private lateinit var customDialog: CustomDialog
private var sectorListVO:List<SectorItemVO> = listOf()
private var vozList:List<String> = listOf()
private var prefs: SharedPreferences? = null
private var ajustesAdapter: AjustesAdapter? = null
//añadido
private var carroList:List<String> = listOf()
companion object {
fun newInstance() = AjustesFragment()
}
override fun getLayoutId(): Int = R.layout.fragment_ajustes
override fun onCreate(savedInstanceState: Bundle?) {
prefs = activity!!.getSharedPreferences(PREFS_USER,0)
customDialog = CustomDialog(requireContext())
//modificat el InitilializeAjusts
viewModel.inititializeDefaultAjusts(prefs!!.getString(SECTORDESCRIP,getString(R.string.Sinsector)).toString(),prefs!!.getInt(SECTORFK,0),prefs!!.getInt(WAREHOUSEFK,0),prefs!!.getString(VOZ,"NO").toString(),prefs!!.getString(CARRO,"2").toString())
super.onCreate(savedInstanceState)
}
override fun init() {
activity!!.main_bottom_navigation.visibility = View.VISIBLE
user_text.setText(prefs!!.getString(USERFK,""))
val versionName = activity!!.packageManager.getPackageInfo(activity!!.packageName,0).versionName
item_version.setText(versionName)
user = prefs!!.getString(USER,"")
password = prefs!!.getString(PASSWORD,"")
txtserver.setText(this.getDefaults("base_url",this.requireContext()))
txtserver.setOnKeyListener(View.OnKeyListener { v, keyCode, event ->
if (keyCode == KeyEvent.KEYCODE_ENTER && event.action == KeyEvent.ACTION_UP) {
this.setDefaults("base_url",txtserver.text.toString(),this.requireContext())
// sergio: se comenta línea de abajo porque da fallo en la app//
// this.setDefaults("base_url", edittext_server.text.toString(), this.requireContext())
this.hideKeyboard()
//sergio:creada restartapp en BaseFragment por si es necesario utilizarla de nuevo.
// se hace un restart por si se cambia el servidor para que tome nuevos valores
restartapp(this)
return@OnKeyListener false
}
false
})
super.init()
}
override fun observeViewModel() {
with(viewModel){
ajustesAdapter = AjustesAdapter(ajustesitem,object: OnAjustesItemClickListener{
override fun onAjustesItemClickListener(item: AjustesItemVO) {
if (item.id == 0){
splash_progress.visibility = View.VISIBLE
viewModel.getSectors(user!!,password!!)
} else if (item.id == 1){
activity!!.onBackPressed()
}else if (item.id == 2){
// ////Log.i("VERDNATURA","Carros pulsados")
val listCarros : ArrayList<String> = ArrayList()
listCarros.add("1")
listCarros.add("2")
listCarros.add("3")
listCarros.add("4")
listCarros.add("5")
listCarros.add("6")
carroList = listCarros
val array= arrayOfNulls<String>(listCarros.size)
showDialogCarros(array=listCarros.toArray(array))
// getString(R.string.Nodisponibleenestaversión).toast(requireContext())
// getString(R.string.enbreveDisponible).toast(requireContext())
}else if (item.id == 3){
val listVoz : ArrayList<String> = ArrayList()
listVoz.add("NO")
listVoz.add("YES")
vozList = listVoz
val array = arrayOfNulls<String>(listVoz.size)
showDialogVoz(array = listVoz.toArray(array))
}
}
})
ajustess_items.adapter = ajustesAdapter
ajustess_items.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
loadSectorList.observe(viewLifecycleOwner, Observer { event ->
event.getContentIfNotHandled().notNull {
splash_progress.visibility = View.INVISIBLE
if (it.list != null && it.list.size > 0 && it.list.get(0).isError){
customDialog.setTitle("Error").setDescription(it.list.get(0).errorMessage).setOkButton(getString(R.string.Cerrar)){
customDialog.dismiss()
}.show()
}else{
if (it.list != null && it.list.size > 0){
val listSectores : ArrayList<String> = ArrayList()
it.list.forEach {
listSectores.add(it.description)
}
val array = arrayOfNulls<String>(listSectores.size)
sectorListVO = it.list
showDialogSector(listSectores.toArray(array))
}else{
customDialog.setTitle("Sectores").setDescription(getString(R.string.Noexistessectores)).setOkButton(getString(R.string.Cerrar)){
customDialog.dismiss()
}.show()
}
}
}
})
}
super.observeViewModel()
}
private fun showDialogSector(array:Array<String>){
val builder = AlertDialog.Builder(this.context)
builder.setTitle(getString(R.string.Seleccionaunsector))
builder.setItems(array) { _, which ->
val selected = array[which]
sectorListVO.forEach {
if (it.description.equals(selected)){
val editor = prefs!!.edit()
editor.putString(SECTORDESCRIP,it.description)
editor.putInt(SECTORFK,it.id)
it.warehouseFk?.let { it1 -> editor.putInt(WAREHOUSEFK, it1) }
editor.apply()
viewModel.ajustesitem.get(0).sectorFk = it.id
viewModel.ajustesitem.get(0).warehouse = it.warehouseFk
viewModel.ajustesitem.get(0).selected = it.description
ajustesAdapter!!.notifyDataSetChanged()
return@forEach
}
}
}
val dialog = builder.create()
dialog.show()
}
private fun showDialogVoz(array:Array<String>){
val builder = AlertDialog.Builder(this.context)
builder.setTitle(getString(R.string.Seleccionaunsector))
builder.setItems(array) { _, which ->
val selected = array[which]
vozList.forEach {
if (it.equals(selected)){
val editor = prefs!!.edit()
editor.putString(VOZ,it)
editor.apply()
viewModel.ajustesitem.get(3).selected = it
ajustesAdapter!!.notifyDataSetChanged()
return@forEach
}
}
}
val dialog = builder.create()
dialog.show()
}
//sergio : guardar datos
private fun showDialogCarros(array:Array<String>){
val builder = AlertDialog.Builder(this.context)
builder.setTitle(getString(R.string.Seleccionauncarro))
builder.setItems(array) { _, which ->
val selected = array[which]
carroList.forEach {
if (it.equals(selected)){
val editor = prefs!!.edit()
editor.putString(CARRO,it)
editor.apply()
viewModel.ajustesitem.get(2).selected = it
ajustesAdapter!!.notifyDataSetChanged()
return@forEach
}
}
}
val dialog = builder.create()
dialog.show()
}
fun setDefaults(key: String?, value: String?, context: Context?) {
val preferences: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
val editor = preferences.edit()
editor.putString(key, value)
editor.commit()
}
fun getDefaults(key: String?, context: Context?): String? {
val preferences = PreferenceManager.getDefaultSharedPreferences(context)
return preferences.getString(key, null)
}
}

View File

@ -0,0 +1,95 @@
package es.verdnatura.presentation.view.feature.ajustes.fragment
import android.content.Context
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Transformations
import es.verdnatura.domain.GetAjustesUserCase
import es.verdnatura.presentation.base.BaseViewModel
import es.verdnatura.presentation.common.Event
import es.verdnatura.presentation.view.feature.ajustes.model.AjustesItemVO
import es.verdnatura.presentation.view.feature.ajustes.model.SectorItemVO
import es.verdnatura.presentation.view.feature.ajustes.model.SectorListVO
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
class AjustesViewModel(context: Context) : BaseViewModel() {
private val getAjustesUserCase:GetAjustesUserCase = GetAjustesUserCase(context)
val version : String = "5.0.0";
private val _ajustesitem by lazy { ArrayList<AjustesItemVO>() }
val ajustesitem: List<AjustesItemVO>
get() = _ajustesitem
private val _sectorList by lazy { MutableLiveData<SectorListVO>() }
val sectorList: LiveData<SectorListVO>
get() = _sectorList
val loadSectorList = Transformations.map(_sectorList) {Event(it)}
fun inititializeDefaultAjusts(sectorDescrip: String,sectorFk : Int, warehouseFk : Int,vozDescrip:String,carroDescrip:String) {
_ajustesitem.add(
AjustesItemVO(0,
"Sector",
sectorDescrip,
sectorFk,
warehouseFk)
)
_ajustesitem.add(
AjustesItemVO(1,
"Cerrar Sesión",
"",
0,
0)
)
_ajustesitem.add(
AjustesItemVO(2,
"Carros",
carroDescrip,
0,
0)
)
_ajustesitem.add(
AjustesItemVO(3,
"Voz",
vozDescrip,
0,
0)
)
}
fun getSectors(user:String,password:String){
getAjustesUserCase.getSectors(user,password).enqueue(object : Callback<List<SectorItemVO>>{
override fun onFailure(call: Call<List<SectorItemVO>>, t: Throwable) {
val listError:ArrayList<SectorItemVO> = ArrayList()
listError.add(SectorItemVO(0,"",0,true,t.message!!))
_sectorList.value = SectorListVO(listError)
}
override fun onResponse(
call: Call<List<SectorItemVO>>,
response: Response<List<SectorItemVO>>
) {
if (response.body() != null){
_sectorList.value = response.body()?.let { SectorListVO(it) }
}else{
val listError:ArrayList<SectorItemVO> = ArrayList()
listError.add(SectorItemVO(0,"",0,true,"Error en la llamada sector_get"))
_sectorList.value = SectorListVO(listError)
}
}
})
}
}

View File

@ -0,0 +1,21 @@
package es.verdnatura.presentation.view.feature.ajustes.model
class AjustesItemVO (
var id: Int,
var title: String = "",
var selected: String = "",
var sectorFk : Int?,
var warehouse: Int?
)
class SectorItemVO (
var id: Int,
var description:String = "",
val warehouseFk:Int?,
val isError : Boolean = false,
var errorMessage : String = ""
)
class SectorListVO (
var list: List<SectorItemVO> = listOf()
)

View File

@ -0,0 +1,48 @@
package es.verdnatura.presentation.view.feature.articulo.adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import es.verdnatura.databinding.ItemBarcodeRowBinding
import es.verdnatura.presentation.common.OnBarcodeRowClickListener
import es.verdnatura.presentation.view.feature.articulo.model.BarcodeVO
class BarcodeAdapter(
private val items: List<BarcodeVO>,
private val onBarcodeRowClickListener: OnBarcodeRowClickListener,
private var showDelete: Boolean = true
): RecyclerView.Adapter<BarcodeAdapter.ItemHolder> () {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHolder {
return ItemHolder(
ItemBarcodeRowBinding.inflate(LayoutInflater.from(parent.context),parent,false)
)
}
override fun getItemCount() =items.size
override fun onBindViewHolder(holder: ItemHolder, position: Int) {
holder.bind(items[position])
holder.binding.root.setOnClickListener {
onBarcodeRowClickListener.onBarcodeRowClickListener(items[position])
}
}
inner class ItemHolder(
val binding: ItemBarcodeRowBinding
) : RecyclerView.ViewHolder(binding.root){
private val res = binding.root.context.resources
fun bind(item: BarcodeVO) {
binding.apply {
this.item = item
if (showDelete) itemImage.visibility = View.VISIBLE
else itemImage.visibility = View.GONE
}
}
}
}

View File

@ -0,0 +1,60 @@
package es.verdnatura.presentation.view.feature.articulo.adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import es.verdnatura.R
import es.verdnatura.databinding.ItemCardRowBinding
import es.verdnatura.presentation.common.OnItemCardRowClickListener
import es.verdnatura.presentation.view.feature.articulo.model.ItemCardRowVO
class ItemCardAdapter (
private val items: List<ItemCardRowVO>,
private val onItemCardRowClickListener: OnItemCardRowClickListener
): RecyclerView.Adapter<ItemCardAdapter.ItemHolder> () {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHolder {
return ItemHolder(
ItemCardRowBinding.inflate(LayoutInflater.from(parent.context),parent,false)
)
}
override fun getItemCount() =items.size
override fun onBindViewHolder(holder: ItemHolder, position: Int) {
holder.bind(items[position])
if (items[position].isEditable){
holder.binding.root.setOnClickListener {
onItemCardRowClickListener.onItemCardRowClickListener(items[position])
}
}
}
class ItemHolder(
val binding: ItemCardRowBinding
) : RecyclerView.ViewHolder(binding.root){
private val res = binding.root.context.resources
fun bind(item: ItemCardRowVO) {
binding.apply {
if (item.barcodes.isNotEmpty()){
item.value = ""
item.barcodes.forEach {
item.value = item.value + it.code + "\n"
}
}
this.item = item
if (item.isEditable){
itemImage.visibility = View.VISIBLE
itemRowLayout.setBackgroundColor(res.getColor(R.color.verdnatura_black_5))
}else{
itemImage.visibility = View.INVISIBLE
itemRowLayout.setBackgroundColor(res.getColor(R.color.verdnatura_black_9))
}
}
}
}
}

View File

@ -0,0 +1,517 @@
package es.verdnatura.presentation.view.feature.articulo.fragment
import android.app.AlertDialog
import android.content.Intent
import android.content.SharedPreferences
import android.graphics.drawable.Drawable
import android.util.Log
import android.view.View
import android.view.inputmethod.EditorInfo
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
import es.verdnatura.R
import es.verdnatura.databinding.FragmentItemCardBinding
import es.verdnatura.domain.toast
import es.verdnatura.presentation.base.BaseFragment
import es.verdnatura.presentation.common.OnBarcodeRowClickListener
import es.verdnatura.presentation.common.OnItemCardRowClickListener
import es.verdnatura.presentation.common.OnOptionsSelectedListener
import es.verdnatura.presentation.common.loadUrl
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.CustomDialogTwoButtons
import es.verdnatura.presentation.view.feature.articulo.adapter.BarcodeAdapter
import es.verdnatura.presentation.view.feature.articulo.adapter.ItemCardAdapter
import es.verdnatura.presentation.view.feature.articulo.model.BarcodeVO
import es.verdnatura.presentation.view.feature.articulo.model.ItemCardRowVO
import es.verdnatura.presentation.view.feature.articulo.model.ItemCardVO
import es.verdnatura.presentation.view.feature.articulo.model.ItemPackingType
import es.verdnatura.presentation.view.feature.calidad.model.BuyerListVO
import es.verdnatura.presentation.view.feature.imageview.activity.ImageViewActivity
import es.verdnatura.presentation.view.feature.inventario.adapter.ToolBarAdapter
import es.verdnatura.presentation.view.feature.inventario.fragment.SearchBuyerModel
import es.verdnatura.presentation.view.feature.main.activity.MainActivity
import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.buyers_fragment.*
import kotlinx.android.synthetic.main.fragment_item_card.*
import kotlinx.android.synthetic.main.fragment_item_card.splash_progress
import kotlinx.android.synthetic.main.toolbar.*
class ItemCardFragment(
var itemFk:String = ""
) : BaseFragment<FragmentItemCardBinding,ItemCardViewModel>(ItemCardViewModel::class) {
private var urlLarge:String = ""
private var titleImage:String = ""
private var user = ""
private var password = ""
private var warehouseFk = ""
private var adapter : ItemCardAdapter? = null
private var barcodeAdapter : BarcodeAdapter? = null
private var listItemsRow:ArrayList<ItemCardRowVO> = ArrayList()
private var listBarcodes:ArrayList<BarcodeVO> = ArrayList()
private var itemsPackingType:ArrayList<ItemPackingType> = ArrayList()
private var itemInfoG:ItemCardVO? = null
companion object {
fun newInstance(entryPoint:String) = ItemCardFragment(entryPoint)
}
private lateinit var customDialog: CustomDialog
private lateinit var customDialogInput: CustomDialogInput
private lateinit var customDialogList: CustomDialogList
private lateinit var customDialogTwo: CustomDialogTwoButtons
private val _buyersList by lazy { MutableLiveData<BuyerListVO>() }
val buyersList: LiveData<BuyerListVO>
get() = _buyersList
override fun getLayoutId(): Int = R.layout.fragment_item_card
override fun init() {
itemcard_layout.visibility = View.GONE
activity!!.main_bottom_navigation.visibility = View.GONE
setEvents()
toolbar_title.text = getString(R.string.ConsultarArticulo)
customDialog = CustomDialog(requireContext())
customDialogInput = CustomDialogInput(requireContext())
customDialogList = CustomDialogList(requireContext())
customDialogTwo = CustomDialogTwoButtons(requireContext())
//sergio: se le pasa el item desde otros fragments
if (!itemFk.isNullOrEmpty()){
getItemCard(itemFk)
}
setToolBar()
super.init()
}
private fun setToolBar(){
val listIcons:ArrayList<Drawable> = ArrayList()
val iconReload : Drawable = resources.getDrawable(R.drawable.ic_autorenew_black_24dp,resources.newTheme())
val iconHistory : Drawable = resources.getDrawable(R.drawable.ic_history_black_24dp,resources.newTheme())
listIcons.add(iconReload)
listIcons.add(iconHistory)
toolbar_icons.adapter = ToolBarAdapter(listIcons,object: OnOptionsSelectedListener {
override fun onOptionsItemSelected(item: Drawable) {
if (item == iconReload){
splash_progress.visibility = View.VISIBLE
getItemCard(itemFk)
}
if (item == iconHistory){
if (itemFk.isNullOrEmpty()){
"Escanea un item".toast(activity!!)
}else{
(activity as MainActivity).onPasillerosItemClickListener( PasillerosItemVO(title = "Historico"),itemFk)
}
}
}
})
toolbar_icons.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
}
private fun setEvents(){
edit_itemFk.requestFocus()
edit_itemFk.setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) {
if (!edit_itemFk.text.toString().isNullOrEmpty())
getItemCard(edit_itemFk.text.toString())
edit_itemFk.setText("")
(activity as MainActivity).hideKeyboard(edit_itemFk)
return@setOnEditorActionListener true
}
false
}
backButton.setOnClickListener {
activity!!.onBackPressed()
}
itemcard_image.setOnClickListener {
val i:Intent = Intent(activity,ImageViewActivity::class.java)
i.putExtra("url",urlLarge)
i.putExtra("title",titleImage)
startActivity(i)
}
}
private fun getItemCard(itemFk:String){
val prefs: SharedPreferences = activity!!.getSharedPreferences(PREFS_USER,0)
user = prefs.getString(USER,"").toString()
password = prefs.getString(PASSWORD,"").toString()
warehouseFk = prefs.getInt(WAREHOUSEFK,1).toString()
this.itemFk = itemFk
splash_progress.visibility = View.VISIBLE
viewModel.getItemCard(itemFk,warehouseFk,user!!,password!!)
viewModel.getItemPackingType(user!!,password!!)
}
override fun observeViewModel() {
with(viewModel){
itemcard.observe(viewLifecycleOwner, Observer {
splash_progress.visibility = View.GONE
if (it.isError){
itemcard_layout.visibility = View.GONE
toolbar_title.text = "ItemCard"
customDialog.setTitle("Error").setDescription(it.errorMessage).setOkButton("Cerrar"){
customDialog.dismiss()
}.show()
}else{
if (it.id != "0"){
itemcard_layout.visibility = View.VISIBLE
setItemCard(it)
}else{
itemcard_layout.visibility = View.GONE
toolbar_title.text = "ItemCard"
customDialog.setTitle("Sin resultados").setDescription("No hemos podido encontrar el articulo. Revisa el sector.").setOkButton("Cerrar"){
customDialog.dismiss()
}.show()
}
}
})
itemspackinglist.observe(viewLifecycleOwner, Observer {
splash_progress.visibility = View.GONE
// Log.i("VERDNATURA","el code es $it.code")
// Log.i("VERDNATURA","la descrip es $it.description")
createItemTypeTypeList(it.list)
})
response.observe(viewLifecycleOwner, Observer {
splash_progress.visibility = View.GONE
if (it.isError){
customDialog.setTitle("Error").setDescription(it.errorMessage).setOkButton("Cerrar"){
customDialog.dismiss()
}.show()
}else{
getItemCard(itemFk)
}
})
}
}
private fun createItemTypeTypeList(list: List<ItemPackingType>) {
itemsPackingType.clear()
list.forEach { item ->
if (!item.isError){
try {
itemsPackingType.add(ItemPackingType(item.code,item.description));
// Log.i("VERDNATURA","Nombre encajado ${item.code} : ${item.description}")
}catch (e:Exception){}
}
}}
private fun setItemCard(itemInfo:ItemCardVO){
itemInfoG = itemInfo
toolbar_title.text = itemInfo.id+"-"+itemInfo.longName
titleImage = itemInfo.id+"-"+itemInfo.longName
itemcard_image.setImageDrawable(resources.getDrawable(R.drawable.loadphoto,resources.newTheme()))
itemcard_image.loadUrl(itemInfo.urlImage200)
urlLarge = itemInfo.urlImage
itemcard_tag1.text = itemInfo.size
itemcard_tag2.text = itemInfo.value5
itemcard_tag3.text = itemInfo.value6
itemcard_tag4.text = itemInfo.value7 + " " + itemInfo.origin
listItemsRow = ArrayList()
listItemsRow.add(ItemCardRowVO(title = getString(R.string.total),value = itemInfo.total,isEditable = false))
listItemsRow.add(ItemCardRowVO(title = getString(R.string.Disponible),value = itemInfo.available,isEditable = false))
listItemsRow.add(ItemCardRowVO(title = getString(R.string.Ubicado),value = itemInfo.enAltillo,isEditable = false))
//EDITABLES
listItemsRow.add(ItemCardRowVO(title = getString(R.string.SINUBICAR),value = itemInfo.enNicho,isEditable = false, action = "itemStockUpdate"))
listItemsRow.add(ItemCardRowVO(title = getString(R.string.DARALTA),value = "",isEditable = true, action = "itemStockUpdateAdd"))
listItemsRow.add(ItemCardRowVO(title = getString(R.string.DARBAJA),value = "",isEditable = true, action = "itemStockUpdateRemove"))
listItemsRow.add(ItemCardRowVO(title = getString(R.string.BUSCARITEM),value = "",isEditable = true, action = "buscarItem"))
//listItemsRow.add(ItemCardRowVO(title = "NICHO",value = itemInfo.nicho,isEditable = true, action = "itemPlacementSave"))
// listItemsRow.add(ItemCardRowVO(title = "RESERVA",value = itemInfo.reserva,isEditable = true, action = "itemPlacementSave"))
listItemsRow.add(ItemCardRowVO(title = getString(R.string.Grouping),value = itemInfo.grouping,isEditable = true, action = "updateGrouping"))
listItemsRow.add(ItemCardRowVO(title = getString(R.string.Packing),value = itemInfo.packing,isEditable = true, action = "updatePacking"))
listItemsRow.add(ItemCardRowVO(title = getString(R.string.MINIMO),value = itemInfo.min,isEditable = true, action = "itemSaveMin"))
listItemsRow.add(ItemCardRowVO(title = getString(R.string.Barcode),barcodes = itemInfo.barcodes,isEditable = true, action = "toBarcode"))
//sergio para itemTypePacking
listItemsRow.add(ItemCardRowVO(title = getString(R.string.tipodeencajado),value = itemInfo.itemPackingTypeFk,isEditable = true, action = "updateSector"))
listBarcodes = itemInfo.barcodes as ArrayList<BarcodeVO>
adapter = ItemCardAdapter(listItemsRow,object: OnItemCardRowClickListener{
override fun onItemCardRowClickListener(item: ItemCardRowVO) {
if (item.action=="updateSector"){ showDialogSelectItemTypePacking()
}else{
if(item.action != "toBarcode" && item.action != "buscarItem" && item.action != "itemStockUpdateAdd" && item.action != "itemStockUpdateRemove"){
customDialogInput.setTitle(item.title!!).setDescription("Valor actual: "+item.value!!).setOkButton("Guardar"){
(activity as MainActivity).hideKeyboard(customDialogInput.getEditText())
editItemCardRow(item,customDialogInput.getValue())
customDialogInput.dismiss()
}.setKoButton("Cancelar"){
(activity as MainActivity).hideKeyboard(customDialogInput.getEditText())
customDialogInput.dismiss()
}.setValue("").show()
customDialogInput.getEditText().requestFocus()
customDialogInput.getEditText().setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0) {
if (!customDialogInput.getValue().isNullOrEmpty())
editItemCardRow(item,customDialogInput.getValue())
customDialogInput.setValue("")
customDialogInput.dismiss()
(activity as MainActivity).hideKeyboard(customDialogInput.getEditText())
return@setOnEditorActionListener true
}
false
}
}else if(item.action == "toBarcode"){
//BARCODE ROW
prepareBarcodeDialog(item)
}else if(item.action == "buscarItem"){
(activity as MainActivity).onPasillerosItemClickListener( PasillerosItemVO(title = "Buscar item"),itemFk)
}else if(item.action == "itemStockUpdateAdd"){
customDialogInput.setTitle(item.title!!).setDescription("Indica la cantidad a dar de alta").setOkButton("Guardar"){
(activity as MainActivity).hideKeyboard(customDialogInput.getEditText())
editItemCardRow(item,customDialogInput.getValue())
customDialogInput.dismiss()
}.setKoButton("Cancelar"){
(activity as MainActivity).hideKeyboard(customDialogInput.getEditText())
customDialogInput.dismiss()
}.setValue("").show()
customDialogInput.getEditText().requestFocus()
customDialogInput.getEditText().setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0) {
if (!customDialogInput.getValue().isNullOrEmpty())
editItemCardRow(item,customDialogInput.getValue())
customDialogInput.setValue("")
customDialogInput.dismiss()
(activity as MainActivity).hideKeyboard(customDialogInput.getEditText())
return@setOnEditorActionListener true
}
false
}
}else if(item.action == "itemStockUpdateRemove"){
customDialogInput.setTitle(item.title!!).setDescription("Indica la cantidad a dar de baja ").setOkButton("Guardar"){
(activity as MainActivity).hideKeyboard(customDialogInput.getEditText())
editItemCardRow(item,customDialogInput.getValue())
customDialogInput.dismiss()
}.setKoButton("Cancelar"){
(activity as MainActivity).hideKeyboard(customDialogInput.getEditText())
customDialogInput.dismiss()
}.setValue("").show()
customDialogInput.getEditText().requestFocus()
customDialogInput.getEditText().setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0) {
if (!customDialogInput.getValue().isNullOrEmpty())
editItemCardRow(item,customDialogInput.getValue())
customDialogInput.setValue("")
customDialogInput.dismiss()
(activity as MainActivity).hideKeyboard(customDialogInput.getEditText())
return@setOnEditorActionListener true
}
false
}}
}
}
})
itemcard_recyclerview.adapter = adapter
itemcard_recyclerview.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
scroll_view.post(Runnable {
val position = IntArray(2)
if (itemcard_image != null){
itemcard_image.getLocationInWindow(position)
scroll_view.scrollTo(0, position[1])
}
})
}
private fun editItemCardRow(item:ItemCardRowVO,value:String){
when (item.action){
"itemStockUpdate" -> prepareItemStockUpdate(item,value)
"itemStockUpdateAdd" -> prepareItemStockUpdate2(item,value)
"itemStockUpdateRemove" -> prepareItemStockUpdate2(item,value)
"itemPlacementSave" -> viewModel.itemPlacementSave(itemFk = itemFk, warehouseFk = warehouseFk, user = user, password = password, value = value)
"updateGrouping" -> viewModel.updateGrouping(itemFk = itemFk, user = user, password = password, value = value,warehouseFk = warehouseFk)
"updatePacking" -> viewModel.updatePacking(itemFk = itemFk, user = user, password = password, value = value,warehouseFk = warehouseFk)
"itemSaveMin" -> viewModel.itemSaveMin(itemFk = itemFk, user = user, password = password, value = value)
}
if(item.action != "itemStockUpdate")
changeOfflineValue(item,value, listBarcodes)
}
private fun changeOfflineValue(item:ItemCardRowVO,newValue:String, barcodes:List<BarcodeVO>){
splash_progress.visibility = View.VISIBLE
/*var i = 0
var position = 0
listItemsRow.forEach {
if (it.title == item.title) {
position = i
}
i = i.plus(1)
}
if (listItemsRow.get(position).title != "BARCODE") listItemsRow.get(position).value = newValue
else listItemsRow.get(position).barcodes = barcodes
adapter?.notifyDataSetChanged()*/
}
private fun prepareItemStockUpdate(itemB:ItemCardRowVO,value:String){
try{
if (itemB.value!!.toInt() > value.toInt()) {
customDialogTwo.setTitle(itemB.title!!).setDescription("Indica la causa de eliminar stock:").setOkButton("Falta"){
viewModel.itemStockUpdate(itemFk = itemFk,warehouseFk = warehouseFk,user = user,password = password,newValue = value,isTrash = "0")
changeOfflineValue(itemB,value, listBarcodes)
customDialogTwo.dismiss()
}.setOkButtonTwo("Basura"){
viewModel.itemStockUpdate(itemFk = itemFk,warehouseFk = warehouseFk,user = user,password = password,newValue = value,isTrash = "1")
changeOfflineValue(itemB,value, listBarcodes)
customDialogTwo.dismiss()
}.setKoButton("Cancelar"){
customDialogTwo.dismiss()
}.show()
}else{
changeOfflineValue(itemB,value, listBarcodes)
viewModel.itemStockUpdate(itemFk = itemFk,warehouseFk = warehouseFk,user = user,password = password,newValue = value,isTrash = "0")
}
}catch (e:Exception){
itemcard_layout.visibility = View.GONE
customDialog.setTitle("Error").setDescription("El elemento introducido no es un número").setKoButton("Cancelar"){
customDialog.dismiss()
}.show()
}
}
private fun prepareItemStockUpdate2(itemB:ItemCardRowVO,value:String){
try{
if (itemB.action == "itemStockUpdateRemove") {
customDialogTwo.setTitle(itemB.title!!).setDescription("Indica la causa de eliminar stock:").setOkButton("Falta"){
viewModel.itemTrash(itemFk = itemFk,warehouseFk = warehouseFk,user = user,password = password,newValue = value,isTrash = "0")
changeOfflineValue(itemB,value, listBarcodes)
customDialogTwo.dismiss()
}.setOkButtonTwo("Basura"){
viewModel.itemTrash(itemFk = itemFk,warehouseFk = warehouseFk,user = user,password = password,newValue = value,isTrash = "1")
changeOfflineValue(itemB,value, listBarcodes)
customDialogTwo.dismiss()
}.setKoButton("Cancelar"){
customDialogTwo.dismiss()
}.show()
}else{
changeOfflineValue(itemB,value, listBarcodes)
viewModel.itemTrash(itemFk = itemFk,warehouseFk = warehouseFk,user = user,password = password,newValue = (value.toInt() * -1).toString(),isTrash = "0")
}
}catch (e:Exception){
itemcard_layout.visibility = View.GONE
customDialog.setTitle("Error").setDescription("El elemento introducido no es un número").setKoButton("Cancelar"){
customDialog.dismiss()
}.show()
}
}
private fun prepareBarcodeDialog(itemB:ItemCardRowVO){
customDialogList.setTitle("Barcodes").setOkButton("Guardar"){
(activity as MainActivity).hideKeyboard(customDialogList.getEditText())
if (!customDialogList.getValue().isNullOrEmpty())
updateBarcode(customDialogList.getValue(),"0",itemB)
customDialogList.dismiss()
}.setKoButton("Cerrar"){
(activity as MainActivity).hideKeyboard(customDialogList.getEditText())
customDialogList.dismiss()
}.setValue("").show()
(activity as MainActivity).hideKeyboard(customDialogList.getEditText())
customDialogList.getEditText().setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0) {
if (!customDialogList.getValue().isNullOrEmpty())
updateBarcode(customDialogList.getValue(),"0",itemB)
customDialogList.setValue("")
customDialogList.dismiss()
(activity as MainActivity).hideKeyboard(customDialogList.getEditText())
return@setOnEditorActionListener true
}
false
}
barcodeAdapter = BarcodeAdapter(listBarcodes,object: OnBarcodeRowClickListener{
override fun onBarcodeRowClickListener(item: BarcodeVO) {
updateBarcode(item.code!!,"1",itemB)
}
})
customDialogList.getRecyclerView().adapter = barcodeAdapter
customDialogList.getRecyclerView().layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
}
private fun updateBarcode(code:String,delete:String,item:ItemCardRowVO){
if (delete == "1"){
var i = 0
var posDelete = 0
listBarcodes.forEach {
if (it.code == code)
posDelete = i
i+=1
}
listBarcodes.removeAt(posDelete)
}else{
listBarcodes.add(BarcodeVO(code))
}
viewModel.barcodesEdit(itemFk = itemFk, user = user, password = password, value = code, delete = delete)
barcodeAdapter!!.notifyDataSetChanged()
changeOfflineValue(item,"", listBarcodes)
}
private fun showDialogSelectItemTypePacking(){
var array= arrayOfNulls<String>(itemsPackingType.size)
for (indice in array.indices){
array[indice]=itemsPackingType[indice].code + " : "+itemsPackingType[indice].description
}
val builder = AlertDialog.Builder(this.context)
builder.setTitle(getString(R.string.mensajeseleccionencajado))
.setItems(array
) { dialog, position ->
updateItemPackingType(itemsPackingType[position].code.toString());
}
builder.create().show()
}
private fun updateItemPackingType(itemPackingType:String) {
splash_progress.visibility = View.VISIBLE
viewModel.updatePackingType(this.itemFk,user,password,itemPackingType)
}
}

View File

@ -0,0 +1,226 @@
package es.verdnatura.presentation.view.feature.articulo.fragment
import android.content.Context
import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import es.verdnatura.domain.GetItemCardUserCase
import es.verdnatura.presentation.base.BaseViewModel
import es.verdnatura.presentation.common.ResponseItemVO
import es.verdnatura.presentation.view.feature.articulo.model.ItemCardVO
import es.verdnatura.presentation.view.feature.articulo.model.ItemPackingType
import es.verdnatura.presentation.view.feature.articulo.model.ItemPackingTypeList
import es.verdnatura.presentation.view.feature.calidad.model.BuyerListVO
import es.verdnatura.presentation.view.feature.calidad.model.BuyerVO
import es.verdnatura.presentation.view.feature.calidad.model.ItemBuyerListVO
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
class ItemCardViewModel(context: Context) : BaseViewModel() {
private val getItemCardUserCase:GetItemCardUserCase = GetItemCardUserCase(context)
val version : String = "5.0.0";
private val _itemcard by lazy { MutableLiveData<ItemCardVO>() }
val itemcard: LiveData<ItemCardVO>
get() = _itemcard
private val _response by lazy { MutableLiveData<ResponseItemVO>() }
val response: LiveData<ResponseItemVO>
get() = _response
private val _itemspackinglist by lazy { MutableLiveData<ItemPackingTypeList>() }
val itemspackinglist: LiveData<ItemPackingTypeList>
get() = _itemspackinglist
fun getItemCard(itemFk:String,warehouseFk:String,user:String,password:String) {
getItemCardUserCase.getItemCard(user,password,itemFk,warehouseFk).enqueue(object :Callback<ItemCardVO>{
override fun onFailure(call: Call<ItemCardVO>, t: Throwable) {
_itemcard.value = ItemCardVO(isError = true,errorMessage = "Error al OBTENER "+itemFk+ " Respuesta:"+t.message!!)
}
override fun onResponse(call: Call<ItemCardVO>, response: Response<ItemCardVO>) {
if (response.body() != null){
_itemcard.value = response.body()!!
}else{
_itemcard.value = ItemCardVO(isError = true,errorMessage = "Error al llamar a vn.itemCard")
}
}
})
}
fun getItemPackingType(user:String,password:String) {
getItemCardUserCase.getItemPackingType(user,password).enqueue(object :
Callback<List<ItemPackingType>>{
override fun onFailure(call: Call<List<ItemPackingType>>, t: Throwable) {
val listError:ArrayList<ItemPackingType> = ArrayList()
listError.add(ItemPackingType(isError = true,errorMessage = t.message!!))
_itemspackinglist.value = ItemPackingTypeList(listError)
}
override fun onResponse(call: Call<List<ItemPackingType>>, response: Response<List<ItemPackingType>>) {
if (response.body() != null){
_itemspackinglist.value = response.body()?.let { ItemPackingTypeList(it) }
}else{
val listError:ArrayList<ItemPackingType> = ArrayList()
listError.add(ItemPackingType(isError = true,errorMessage = "Error en la llamada de getItemPackingType"))
_itemspackinglist.value = ItemPackingTypeList(listError)
}
}
})
}
fun itemStockUpdate(itemFk:String,warehouseFk:String,user:String,password:String,newValue:String,isTrash:String){
getItemCardUserCase.itemStockUpdate(user,password,itemFk,warehouseFk,newValue,isTrash).enqueue(object : Callback<String>{
override fun onFailure(call: Call<String>, t: Throwable) {
_response.value = ResponseItemVO(isError = true,errorMessage = "Error al guardar STOCK "+itemFk+ " Respuesta:"+t.message!!)
}
override fun onResponse(call: Call<String>, response: Response<String>) {
if (response.body() == null){
_response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada itemStockUpdate")
}else{
_response.value = ResponseItemVO(isError = false,response = response.body()!!)
}
}
})
}
fun itemTrash(itemFk:String,warehouseFk:String,user:String,password:String,newValue:String,isTrash:String){
getItemCardUserCase.itemTrash(user,password,itemFk,warehouseFk,newValue,isTrash).enqueue(object : Callback<String>{
override fun onFailure(call: Call<String>, t: Throwable) {
_response.value = ResponseItemVO(isError = true,errorMessage = "Error al guardar STOCK "+itemFk+ " Respuesta:"+t.message!!)
}
override fun onResponse(call: Call<String>, response: Response<String>) {
if (response.body() == null){
_response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada itemTrash")
}else{
_response.value = ResponseItemVO(isError = false,response = response.body()!!)
}
}
})
}
fun itemPlacementSave(itemFk:String,warehouseFk:String,user:String,password:String,value:String){
getItemCardUserCase.itemPlacementSave(user,password,itemFk,warehouseFk,value).enqueue(object : Callback<String>{
override fun onFailure(call: Call<String>, t: Throwable) {
_response.value = ResponseItemVO(isError = true,errorMessage ="Error al guardar NICHO "+itemFk+ " Respuesta:"+t.message!!)
}
override fun onResponse(call: Call<String>, response: Response<String>) {
if (response.body() == null){
_response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada itemPlacementSave")
}else{
_response.value = ResponseItemVO(isError = false,response = response.body()!!)
}
}
})
}
fun updateGrouping(itemFk:String,user:String,password:String,value:String,warehouseFk: String){
getItemCardUserCase.updateGrouping(user,password,itemFk,value,warehouseFk).enqueue(object : Callback<String>{
override fun onFailure(call: Call<String>, t: Throwable) {
_response.value = ResponseItemVO(isError = true,errorMessage = "Error al guardar GROUPING "+itemFk+ " Respuesta:"+t.message!!)
}
override fun onResponse(call: Call<String>, response: Response<String>) {
if (response.body() == null){
_response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada updateGrouping")
}else{
_response.value = ResponseItemVO(isError = false,response = response.body()!!)
}
}
})
}
fun updatePacking(itemFk:String,user:String,password:String,value:String,warehouseFk: String){
getItemCardUserCase.updatePacking(user,password,itemFk,value,warehouseFk).enqueue(object : Callback<String>{
override fun onFailure(call: Call<String>, t: Throwable) {
_response.value = ResponseItemVO(isError = true,errorMessage = "Error al guardar PACKING "+itemFk+ " Respuesta:"+t.message!!)
}
override fun onResponse(call: Call<String>, response: Response<String>) {
if (response.body() == null){
_response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada updatePacking")
}else{
_response.value = ResponseItemVO(isError = false,response = response.body()!!)
}
}
})
}
//sergio ver como solucionar el tema del "Finish"
fun updatePackingType(itemFk:String,user:String,password:String,itemPackingType:String){
getItemCardUserCase.updatePackingType(user,password,itemFk,itemPackingType).enqueue(object : Callback<Boolean>{
override fun onFailure(call: Call<Boolean>, t: Throwable) {
_response.value = ResponseItemVO(isError = true,errorMessage = "Error al guardar PackingType "+itemFk+ " Respuesta:"+t.message!!)
}
override fun onResponse(call: Call<Boolean>, response: Response<Boolean>) {
if (response.body() == null){
_response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada updatePackingType")
}else{
//if (response.body()=="Finish"){
// Log.i("VERDNATURA","Fisnih encontrado")}
_response.value = ResponseItemVO(isError = false,response = response.body()!!.toString())
}
}
})
}
fun itemSaveMin(itemFk:String,user:String,password:String,value:String){
getItemCardUserCase.itemSaveMin(user,password,itemFk,value).enqueue(object : Callback<String>{
override fun onFailure(call: Call<String>, t: Throwable) {
_response.value = ResponseItemVO(isError = true,errorMessage = "Error al guardar MIN "+itemFk+ " Respuesta:"+t.message!!)
}
override fun onResponse(call: Call<String>, response: Response<String>) {
if (response.body() == null){
_response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada updatePacking")
}else{
_response.value = ResponseItemVO(isError = false,response = response.body()!!)
}
}
})
}
fun barcodesEdit(itemFk:String,user:String,password:String,value:String,delete:String){
getItemCardUserCase.barcodes_edit(user,password,itemFk,value,delete).enqueue(object : Callback<String>{
override fun onFailure(call: Call<String>, t: Throwable) {
_response.value = ResponseItemVO(isError = true,errorMessage = "Error al guardar BARCODES "+itemFk+ " Respuesta:"+t.message!!)
}
override fun onResponse(call: Call<String>, response: Response<String>) {
if (response.body() == null){
_response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada itemBarcode_update")
}else{
_response.value = ResponseItemVO(isError = false,response = response.body()!!)
}
}
})
}
}

View File

@ -0,0 +1,51 @@
package es.verdnatura.presentation.view.feature.articulo.model
class ItemCardVO (
var id:String = "0",
var longName:String = "0",
var value5:String = "",
var value6:String = "0",
var value7:String = "0",
var image:String = "0",
var size:String = "0",
var stems:String = "0",
var category:String = "0",
var producer:String = "0",
var origin:String = "0",
var nicho:String = "0",
var reserva:String = "0",
var enNicho:String = "0",
var available:String = "0",
var enAltillo:String = "0",
var repo:String = "0",
var total:String = "0",
var min:String = "0",
var grouping:String = "0",
var packing:String = "0",
var barcodes:List<BarcodeVO> = listOf(),
var tag5:String = "",
var tag6:String = "",
var tag7:String = "",
var isError: Boolean = false,
var errorMessage:String = "",
var urlImage200:String = "",
var urlImage:String = "",
var itemPackingTypeFk:String =" "
)
class ItemCardRowVO (
var title:String? = "",
var value:String? = "",
var isEditable:Boolean = true,
var action:String = "",
var barcodes: List<BarcodeVO> = listOf()
)
class BarcodeVO(
var code:String? = ""
)

View File

@ -0,0 +1,15 @@
package es.verdnatura.presentation.view.feature.articulo.model
class ItemPackingType (
var code:String= "",
var description:String = "",
var isError: Boolean = false,
var errorMessage:String = ""
)
class ItemPackingTypeList (
var list: List<ItemPackingType> = listOf()
)

View File

@ -0,0 +1,43 @@
package es.verdnatura.presentation.view.feature.buscaritem.adapter
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import es.verdnatura.databinding.ItemLocationRowBinding
import es.verdnatura.presentation.common.OnPasillerosItemClickListener
import es.verdnatura.presentation.view.feature.buscaritem.model.ItemLocationVO
import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO
class LocationAdapter (
private val items: List<ItemLocationVO>,
private val onPasillerosItemClickListener: OnPasillerosItemClickListener
): RecyclerView.Adapter<LocationAdapter.ItemHolder> () {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHolder {
return ItemHolder(
ItemLocationRowBinding.inflate(LayoutInflater.from(parent.context),parent,false)
)
}
override fun getItemCount() =items.size
override fun onBindViewHolder(holder: ItemHolder, position: Int) {
holder.bind(items[position])
holder.binding.root.setOnClickListener {
onPasillerosItemClickListener.onPasillerosItemClickListener(PasillerosItemVO(title = "Ubicador"),items[position].Matricula)
}
}
class ItemHolder(
val binding: ItemLocationRowBinding
) : RecyclerView.ViewHolder(binding.root){
private val res = binding.root.context.resources
fun bind(item: ItemLocationVO) {
binding.apply {
this.item = item
}
}
}
}

View File

@ -0,0 +1,108 @@
package es.verdnatura.presentation.view.feature.buscaritem.fragment
import android.content.Context
import android.content.SharedPreferences
import android.view.View
import android.view.inputmethod.EditorInfo
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
import es.verdnatura.R
import es.verdnatura.databinding.FragmentBuscarItemBinding
import es.verdnatura.domain.notNull
import es.verdnatura.presentation.base.BaseFragment
import es.verdnatura.presentation.common.OnPasillerosItemClickListener
import es.verdnatura.presentation.view.component.CustomDialog
import es.verdnatura.presentation.view.feature.buscaritem.adapter.LocationAdapter
import es.verdnatura.presentation.view.feature.main.activity.MainActivity
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.fragment_buscar_item.*
import kotlinx.android.synthetic.main.toolbar.*
class BuscarItemFragment(
var itemFk:String = ""
) : BaseFragment<FragmentBuscarItemBinding,BuscarItemViewModel>(BuscarItemViewModel::class) {
private var user = ""
private var password = ""
private var warehouseFk = ""
private var adapter : LocationAdapter? = null
private lateinit var customDialog: CustomDialog
private var pasillerosItemClickListener: OnPasillerosItemClickListener? = null
companion object {
fun newInstance(entryPoint:String) = BuscarItemFragment(entryPoint)
}
override fun onAttach(context: Context) {
if (context is OnPasillerosItemClickListener) pasillerosItemClickListener = context
super.onAttach(context)
}
override fun getLayoutId(): Int = R.layout.fragment_buscar_item
override fun init() {
activity!!.main_bottom_navigation.visibility = View.GONE
toolbar_title.text = getString(R.string.getubicaition)
customDialog = CustomDialog(requireContext())
setEvents()
if (!itemFk.isNullOrEmpty()){
getLocations(itemFk)
}
super.init()
}
private fun setEvents(){
edit_itemFk.requestFocus()
edit_itemFk.setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) {
if (!edit_itemFk.text.toString().isNullOrEmpty())
getLocations(edit_itemFk.text.toString())
edit_itemFk.setText("")
(activity as MainActivity).hideKeyboard(edit_itemFk)
return@setOnEditorActionListener true
}
false
}
backButton.setOnClickListener {
activity!!.onBackPressed()
}
}
private fun getLocations(itemFk:String){
val prefs: SharedPreferences = activity!!.getSharedPreferences(PREFS_USER,0)
user = prefs.getString(USER,"").toString()
password = prefs.getString(PASSWORD,"").toString()
warehouseFk = prefs.getInt(WAREHOUSEFK,1).toString()
this.itemFk = itemFk
splash_progress.visibility = View.VISIBLE
viewModel.getLocations(user,password,itemFk)
}
override fun observeViewModel() {
with(viewModel){
loadLocationList.observe(viewLifecycleOwner, Observer { event ->
event.getContentIfNotHandled().notNull {
splash_progress.visibility = View.GONE
adapter = LocationAdapter(it.list,pasillerosItemClickListener!!)
location_recyclerview.adapter = adapter
location_recyclerview.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
var totalVisible:Int = 0
it.list.forEach {
if (!it.visible.isNullOrEmpty())
totalVisible += it.visible.toInt()
}
toolbar_title.text = "Item: "+itemFk+ " Total visible: "+totalVisible
}
})
}
}
}

View File

@ -0,0 +1,52 @@
package es.verdnatura.presentation.view.feature.buscaritem.fragment
import android.content.Context
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Transformations
import es.verdnatura.domain.GetBuscarItemUserCase
import es.verdnatura.presentation.base.BaseViewModel
import es.verdnatura.presentation.common.Event
import es.verdnatura.presentation.view.feature.buscaritem.model.ItemLocationVO
import es.verdnatura.presentation.view.feature.buscaritem.model.LocationListVO
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
class BuscarItemViewModel(context: Context) : BaseViewModel() {
private val getBuscarItemUserCase: GetBuscarItemUserCase = GetBuscarItemUserCase(context)
private val _locationList by lazy { MutableLiveData<LocationListVO>() }
val locationList: LiveData<LocationListVO>
get() = _locationList
val loadLocationList = Transformations.map(_locationList) { Event(it) }
fun getLocations(user:String,password:String,itemFk:String){
getBuscarItemUserCase.searchItemsUbicador(user,password,itemFk).enqueue(object : Callback<List<ItemLocationVO>> {
override fun onFailure(call: Call<List<ItemLocationVO>>, t: Throwable) {
val listError:ArrayList<ItemLocationVO> = ArrayList()
listError.add(ItemLocationVO(isError = true,errorMessage = t.message!!))
_locationList.value = LocationListVO(listError)
}
override fun onResponse(
call: Call<List<ItemLocationVO>>,
response: Response<List<ItemLocationVO>>
) {
if (response.body() != null){
_locationList.value = response.body()?.let { LocationListVO(it) }
}else{
val listError:ArrayList<ItemLocationVO> = ArrayList()
listError.add(ItemLocationVO(isError = true,errorMessage = "Error en la llamada de searchItemsUbicador"))
_locationList.value = LocationListVO(listError)
}
}
})
}
}

View File

@ -0,0 +1,18 @@
package es.verdnatura.presentation.view.feature.buscaritem.model
class ItemLocationVO (
var Parking:String = "",
var Matricula:String = "",
var visible:String = "",
var Disponible:String = "",
var level:String = "",
var created:String = "",
var itemFk:String = "",
val isError : Boolean = false,
var errorMessage : String = ""
)
class LocationListVO (
var list: List<ItemLocationVO> = listOf()
)

View File

@ -0,0 +1,44 @@
package es.verdnatura.presentation.view.feature.buscaritemall.adapter
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import es.verdnatura.databinding.ItemLocationAllRowBinding
import es.verdnatura.databinding.ItemLocationRowBinding
import es.verdnatura.presentation.common.OnPasillerosItemClickListener
import es.verdnatura.presentation.view.feature.buscaritemall.model.ItemLocationAll
import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO
class LocationAdapterAll (
private val items: List<ItemLocationAll>,
private val onPasillerosItemClickListener: OnPasillerosItemClickListener
): RecyclerView.Adapter<LocationAdapterAll.ItemHolderAll> () {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHolderAll{
return ItemHolderAll(
ItemLocationAllRowBinding.inflate(LayoutInflater.from(parent.context),parent,false)
)
}
override fun getItemCount() =items.size
override fun onBindViewHolder(holder: ItemHolderAll, position: Int) {
holder.bind(items[position])
holder.binding.root.setOnClickListener {
onPasillerosItemClickListener.onPasillerosItemClickListener(PasillerosItemVO(title = "Ubicador"),items[position].Matricula)
}
}
class ItemHolderAll(
val binding: ItemLocationAllRowBinding
) : RecyclerView.ViewHolder(binding.root){
private val res = binding.root.context.resources
fun bind(item: ItemLocationAll) {
binding.apply {
this.item = item
}
}
}
}

View File

@ -0,0 +1,143 @@
package es.verdnatura.presentation.view.feature.buscaritem.fragment
import android.content.Context
import android.content.SharedPreferences
import android.util.Log
import android.view.View
import android.view.inputmethod.EditorInfo
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
import es.verdnatura.R
import es.verdnatura.databinding.FragmentBuscarItemAllBinding
import es.verdnatura.domain.notNull
import es.verdnatura.presentation.base.BaseFragment
import es.verdnatura.presentation.common.OnPasillerosItemClickListener
import es.verdnatura.presentation.view.component.CustomDialog
import es.verdnatura.presentation.view.feature.buscaritemall.adapter.LocationAdapterAll
import es.verdnatura.presentation.view.feature.buscaritemall.fragment.BuscarItemAllViewModel
import es.verdnatura.presentation.view.feature.main.activity.MainActivity
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.fragment_buscar_item.*
import kotlinx.android.synthetic.main.fragment_buscar_item.edit_itemFk
import kotlinx.android.synthetic.main.fragment_buscar_item.location_recyclerview
import kotlinx.android.synthetic.main.fragment_buscar_item.splash_progress
import kotlinx.android.synthetic.main.fragment_buscar_item_all.*
import kotlinx.android.synthetic.main.fragment_inventary.*
import kotlinx.android.synthetic.main.toolbar.*
class BuscarItemAllFragment(
var itemFk:String = ""
) : BaseFragment<FragmentBuscarItemAllBinding, BuscarItemAllViewModel>(BuscarItemAllViewModel::class) {
private var user = ""
private var password = ""
private var warehouseFk = ""
private var adapter : LocationAdapterAll? = null
private lateinit var customDialog: CustomDialog
private var pasillerosItemClickListener: OnPasillerosItemClickListener? = null
companion object {
fun newInstance(entryPoint:String) = BuscarItemAllFragment(entryPoint)
}
override fun onAttach(context: Context) {
if (context is OnPasillerosItemClickListener) pasillerosItemClickListener = context
super.onAttach(context)
}
override fun getLayoutId(): Int = R.layout.fragment_buscar_item_all
override fun init() {
activity!!.main_bottom_navigation.visibility = View.GONE
toolbar_title.text = getString(R.string.getubicaition)
customDialog = CustomDialog(requireContext())
setEvents()
if (!itemFk.isNullOrEmpty()){
getLocations(itemFk)
}
super.init()
}
private fun setEvents(){
edit_itemFk.requestFocus()
edit_itemFk.setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) {
if (!edit_itemFk.text.toString().isNullOrEmpty())
getLocations(edit_itemFk.text.toString())
edit_itemFk.setText("")
(activity as MainActivity).hideKeyboard(edit_itemFk)
return@setOnEditorActionListener true
}
false
}
edit_itemFk.setOnKeyListener { v, keyCode, event ->
Log.i("VERDNATURA","text")
return@setOnKeyListener false}
/*if (filter_itemFk.text.toString().isNullOrEmpty()){
if (listInvetory.size != listInvetoryAux.size){
listInvetory.removeAll(listInvetoryAux)
listInvetoryAux.forEach {
listInvetory.add(it)
}
}
}else{
listInvetory.removeAll(listInvetoryAux)
listInvetoryAux.forEach {
if ((it.itemFk.contains(filter_itemFk.text.toString(),true)) || (it.producer?.contains(filter_itemFk.text.toString(),true))){
listInvetory.add(it)
}
}
}
LocationAdapterAll!!.notifyDataSetChanged()
return@setOnKeyListener false
}*/
backButton.setOnClickListener {
activity!!.onBackPressed()
}
}
private fun getLocations(itemFk:String){
val prefs: SharedPreferences = activity!!.getSharedPreferences(PREFS_USER,0)
user = prefs.getString(USER,"").toString()
password = prefs.getString(PASSWORD,"").toString()
warehouseFk = prefs.getInt(WAREHOUSEFK,1).toString()
this.itemFk = itemFk
splash_progress.visibility = View.VISIBLE
viewModel.getLocationsAll(user,password,itemFk)
}
override fun observeViewModel() {
with(viewModel){
loadLocationListAll.observe(viewLifecycleOwner, Observer { event ->
event.getContentIfNotHandled().notNull {
splash_progress.visibility = View.GONE
adapter = LocationAdapterAll(it.list,pasillerosItemClickListener!!)
location_all_recyclerview.adapter = adapter
location_all_recyclerview.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
var totalVisible:Int = 0
it.list.forEach {
if (!it.visible.isNullOrEmpty())
totalVisible += it.visible.toInt()
}
toolbar_title.text = "Item: "+itemFk+ " Total visible: "+totalVisible
}
})
}
}
}

View File

@ -0,0 +1,53 @@
package es.verdnatura.presentation.view.feature.buscaritemall.fragment
import android.content.Context
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Transformations
import es.verdnatura.domain.GetBuscarItemAllUserCase
import es.verdnatura.presentation.base.BaseViewModel
import es.verdnatura.presentation.common.Event
import es.verdnatura.presentation.view.feature.buscaritemall.model.ItemLocationAll
import es.verdnatura.presentation.view.feature.buscaritemall.model.LocationListAll
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
class BuscarItemAllViewModel(context: Context) : BaseViewModel() {
private val getBuscarItemAllUserCase: GetBuscarItemAllUserCase = GetBuscarItemAllUserCase(context)
private val _locationListAll by lazy { MutableLiveData<LocationListAll>() }
val locationListAll: LiveData<LocationListAll>
get() = _locationListAll
val loadLocationListAll = Transformations.map(_locationListAll) { Event(it) }
fun getLocationsAll(user:String,password:String,itemFk:String){
getBuscarItemAllUserCase.searchItemsUbicadorAll(user,password,itemFk).enqueue(object : Callback<List<ItemLocationAll>> {
override fun onFailure(call: Call<List<ItemLocationAll>>, t: Throwable) {
val listError:ArrayList<ItemLocationAll> = ArrayList()
listError.add(ItemLocationAll(isError = true,errorMessage = t.message!!))
_locationListAll.value = LocationListAll(listError)
}
override fun onResponse(
call: Call<List<ItemLocationAll>>,
response: Response<List<ItemLocationAll>>
) {
if (response.body() != null){
_locationListAll.value = response.body()?.let { LocationListAll(it) }
}else{
val listError:ArrayList<ItemLocationAll> = ArrayList()
listError.add(ItemLocationAll(isError = true,errorMessage = "Error en la llamada de searchItemsUbicadorAll"))
_locationListAll.value = LocationListAll(listError)
}
}
})
}
}

View File

@ -0,0 +1,18 @@
package es.verdnatura.presentation.view.feature.buscaritemall.model
class ItemLocationAll (
var Parking:String = "",
var Matricula:String = "",
var visible:String = "",
var Disponible:String = "",
var level:String = "",
var created:String = "",
var itemFk:String = "",
val isError : Boolean = false,
var errorMessage : String = ""
)
class LocationListAll (
var list: List<ItemLocationAll> = listOf()
)

View File

@ -0,0 +1,124 @@
package es.verdnatura.presentation.view.feature.calidad.adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import es.verdnatura.databinding.ItemBuyerRowBinding
import es.verdnatura.presentation.common.OnPasillerosItemClickListener
import es.verdnatura.presentation.common.OnStarSelectedListener
import es.verdnatura.presentation.common.convertToDateString
import es.verdnatura.presentation.common.loadUrl
import es.verdnatura.presentation.view.feature.calidad.model.ItemBuyerVO
import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO
import java.text.SimpleDateFormat
import java.util.*
class ItemBuyersAdapter (
private val items: List<ItemBuyerVO>,
private val onPasillerosItemClickListener: OnPasillerosItemClickListener,
private val onStarSelectedListener: OnStarSelectedListener
): RecyclerView.Adapter<ItemBuyersAdapter.BuyersItemHolder> () {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BuyersItemHolder {
return BuyersItemHolder(
ItemBuyerRowBinding.inflate(LayoutInflater.from(parent.context),parent,false)
)
}
override fun getItemCount() =items.size
override fun onBindViewHolder(holder: BuyersItemHolder, position: Int) {
holder.bind(items[position])
}
inner class BuyersItemHolder(
val binding: ItemBuyerRowBinding
) : RecyclerView.ViewHolder(binding.root){
fun bind(item: ItemBuyerVO) {
binding.apply {
this.itemBuyer = item
if (item != null && item.image != "")
imgItem.loadUrl("https://verdnatura.es/vn-image-data/catalog/200x200/"+item.image);
else
imgItem.loadUrl("https://verdnatura.es/vn-image-data/catalog/200x200/"+item.itemFk);
imgItem.setOnClickListener {
onPasillerosItemClickListener.onPasillerosItemClickListener(PasillerosItemVO(title = "Consultar artículo"),item.itemFk)
}
if (item.showStars) layoutStars.visibility = View.VISIBLE
else layoutStars.visibility = View.GONE
s1.setOnClickListener {
onStarSelectedListener.onStarSelected(item.id,"1")
}
s2.setOnClickListener {
onStarSelectedListener.onStarSelected(item.id,"2")
}
s3.setOnClickListener {
onStarSelectedListener.onStarSelected(item.id,"3")
}
s4.setOnClickListener {
onStarSelectedListener.onStarSelected(item.id,"4")
}
s5.setOnClickListener {
onStarSelectedListener.onStarSelected(item.id,"5")
}
if (item.stars != null && item.stars != ""){
try {
val punt = item.stars.toInt()
if (punt == 1){
s1.setImageResource(item.iconResourceOk)
s2.setImageResource(item.iconResourceKo)
s3.setImageResource(item.iconResourceKo)
s4.setImageResource(item.iconResourceKo)
s5.setImageResource(item.iconResourceKo)
}else if (punt == 2){
s1.setImageResource(item.iconResourceOk)
s2.setImageResource(item.iconResourceOk)
s3.setImageResource(item.iconResourceKo)
s4.setImageResource(item.iconResourceKo)
s5.setImageResource(item.iconResourceKo)
}else if (punt == 3){
s1.setImageResource(item.iconResourceOk)
s2.setImageResource(item.iconResourceOk)
s3.setImageResource(item.iconResourceOk)
s4.setImageResource(item.iconResourceKo)
s5.setImageResource(item.iconResourceKo)
}else if (punt == 4){
s1.setImageResource(item.iconResourceOk)
s2.setImageResource(item.iconResourceOk)
s3.setImageResource(item.iconResourceOk)
s4.setImageResource(item.iconResourceOk)
s5.setImageResource(item.iconResourceKo)
}else if (punt == 5){
s1.setImageResource(item.iconResourceOk)
s2.setImageResource(item.iconResourceOk)
s3.setImageResource(item.iconResourceOk)
s4.setImageResource(item.iconResourceOk)
s5.setImageResource(item.iconResourceOk)
}else{
s1.setImageResource(item.iconResourceOk)
s2.setImageResource(item.iconResourceOk)
s3.setImageResource(item.iconResourceOk)
s4.setImageResource(item.iconResourceOk)
s5.setImageResource(item.iconResourceOk)
}
}catch (e:Exception){}
}
}
}
}
}

View File

@ -0,0 +1,127 @@
package es.verdnatura.presentation.view.feature.calidad.fragment
import android.content.Context
import android.content.SharedPreferences
import android.graphics.drawable.Drawable
import android.os.Bundle
import android.view.View
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
import es.verdnatura.R
import es.verdnatura.databinding.BuyersFragmentBinding
import es.verdnatura.domain.toast
import es.verdnatura.presentation.base.BaseFragment
import es.verdnatura.presentation.common.OnAjustesItemClickListener
import es.verdnatura.presentation.common.OnBuyerSelectedListener
import es.verdnatura.presentation.common.OnOptionsSelectedListener
import es.verdnatura.presentation.common.OnPasillerosItemClickListener
import es.verdnatura.presentation.view.component.CustomDialog
import es.verdnatura.presentation.view.feature.ajustes.adapter.AjustesAdapter
import es.verdnatura.presentation.view.feature.ajustes.model.AjustesItemVO
import es.verdnatura.presentation.view.feature.calidad.model.BuyerVO
import es.verdnatura.presentation.view.feature.inventario.adapter.ToolBarAdapter
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.buyers_fragment.*
import kotlinx.android.synthetic.main.buyers_fragment.splash_progress
import kotlinx.android.synthetic.main.fragment_ajustes.*
import kotlinx.android.synthetic.main.toolbar.*
class BuyersFragment : BaseFragment<BuyersFragmentBinding,BuyersViewModel>(BuyersViewModel::class) {
private var user = ""
private var password = ""
private var sectorFk = ""
private var warehouseFk = ""
private lateinit var customDialog: CustomDialog
private var onBuyerSelectedListener : OnBuyerSelectedListener? = null
private var buyersAdapter: AjustesAdapter? = null
companion object {
fun newInstance() = BuyersFragment()
}
override fun getLayoutId(): Int = R.layout.buyers_fragment
override fun onAttach(context: Context) {
if (context is OnBuyerSelectedListener) onBuyerSelectedListener = context
super.onAttach(context)
}
override fun onCreate(savedInstanceState: Bundle?) {
val prefs: SharedPreferences = activity!!.getSharedPreferences(PREFS_USER,0)
user = prefs.getString(USER,"").toString()
password = prefs.getString(PASSWORD,"").toString()
sectorFk = prefs.getInt(SECTORFK,1).toString()
warehouseFk = prefs.getInt(WAREHOUSEFK,1).toString()
viewModel.itemShelvingBuyerGet(user = user,password = password)
super.onCreate(savedInstanceState)
}
override fun init() {
customDialog = CustomDialog(requireContext())
activity!!.main_bottom_navigation.visibility = View.GONE
splash_progress.visibility = View.VISIBLE
toolbar_title.text = getString(R.string.quality)
setToolBar()
setEvents()
super.init()
}
private fun setToolBar(){
val listIcons:ArrayList<Drawable> = ArrayList()
val iconReload : Drawable = resources.getDrawable(R.drawable.ic_autorenew_black_24dp,resources.newTheme())
listIcons.add(iconReload)
toolbar_icons.adapter = ToolBarAdapter(listIcons,object: OnOptionsSelectedListener {
override fun onOptionsItemSelected(item: Drawable) {
if (item == iconReload){
splash_progress.visibility = View.VISIBLE
viewModel.itemShelvingBuyerGet(user = user,password = password)
}
}
})
toolbar_icons.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
}
private fun setEvents(){
backButton.setOnClickListener {
activity!!.onBackPressed()
}
}
override fun observeViewModel() {
with(viewModel) {
buyersList.observe(viewLifecycleOwner, Observer {
splash_progress.visibility = View.GONE
createBuyerList(it.list)
})
}
}
private fun createBuyerList(list:List<BuyerVO>){
var buyers = ArrayList<AjustesItemVO>()
list.forEach { buyer ->
if (!buyer.isError){
try {
buyers.add(
AjustesItemVO(
id = buyer.userFk.toInt(),
title = buyer.nickname,
sectorFk = 0,
warehouse = 0
)
)
}catch (e:Exception){}
}
}
buyersAdapter = AjustesAdapter(buyers,object: OnAjustesItemClickListener {
override fun onAjustesItemClickListener(item: AjustesItemVO) {
onBuyerSelectedListener?.onBuyerSelected(item.id.toString())
}
})
buyers_items.adapter = buyersAdapter
buyers_items.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
}
}

View File

@ -0,0 +1,49 @@
package es.verdnatura.presentation.view.feature.calidad.fragment
import android.content.Context
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import es.verdnatura.domain.GetQualityUserCase
import es.verdnatura.presentation.base.BaseViewModel
import es.verdnatura.presentation.view.feature.calidad.model.BuyerListVO
import es.verdnatura.presentation.view.feature.calidad.model.BuyerVO
import es.verdnatura.presentation.view.feature.inventario.model.InventaryListVO
import es.verdnatura.presentation.view.feature.inventario.model.ItemInventaryVO
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
class BuyersViewModel(context: Context) : BaseViewModel() {
private val getQualityUserCase: GetQualityUserCase = GetQualityUserCase(context)
private val _buyersList by lazy { MutableLiveData<BuyerListVO>() }
val buyersList: LiveData<BuyerListVO>
get() = _buyersList
fun itemShelvingBuyerGet(user:String,password:String){
getQualityUserCase.itemShelvingBuyerGet(user,password).enqueue(object :
Callback<List<BuyerVO>> {
override fun onFailure(call: Call<List<BuyerVO>>, t: Throwable) {
val listError:ArrayList<BuyerVO> = ArrayList()
listError.add(BuyerVO(isError = true,errorMessage = t.message!!))
_buyersList.value = BuyerListVO(listError)
}
override fun onResponse(
call: Call<List<BuyerVO>>,
response: Response<List<BuyerVO>>
) {
if (response.body() != null){
_buyersList.value = response.body()?.let { BuyerListVO(it) }
}else{
val listError:ArrayList<BuyerVO> = ArrayList()
listError.add(BuyerVO(isError = true,errorMessage = "Error en la llamada de itemShelving_buyerGet"))
_buyersList.value = BuyerListVO(listError)
}
}
})
}
}

View File

@ -0,0 +1,211 @@
package es.verdnatura.presentation.view.feature.calidad.fragment
import android.content.Context
import android.content.SharedPreferences
import android.graphics.drawable.Drawable
import android.os.Bundle
import android.view.View
import android.view.inputmethod.EditorInfo
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
import es.verdnatura.R
import es.verdnatura.databinding.QaualityFragmentBinding
import es.verdnatura.presentation.base.BaseFragment
import es.verdnatura.presentation.common.*
import es.verdnatura.presentation.view.component.CustomDialog
import es.verdnatura.presentation.view.feature.calidad.adapter.ItemBuyersAdapter
import es.verdnatura.presentation.view.feature.calidad.model.ItemBuyerVO
import es.verdnatura.presentation.view.feature.inventario.adapter.ToolBarAdapter
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.fragment_collection.*
import kotlinx.android.synthetic.main.qauality_fragment.*
import kotlinx.android.synthetic.main.qauality_fragment.scan_input
import kotlinx.android.synthetic.main.qauality_fragment.splash_progress
import kotlinx.android.synthetic.main.toolbar.*
import java.text.SimpleDateFormat
import java.util.*
import kotlin.collections.ArrayList
class QaualityFragment(
var userFk : String = "0"
) : BaseFragment<QaualityFragmentBinding,QaualityViewModel>(QaualityViewModel::class) {
private var user = ""
private var password = ""
private var sectorFk = ""
private var warehouseFk = ""
private lateinit var customDialog: CustomDialog
private var buyersAdapter: ItemBuyersAdapter? = null
private var pasillerosItemClickListener: OnPasillerosItemClickListener? = null
private var onStarSelectedListener : OnStarSelectedListener? = null
private var listItems:List<ItemBuyerVO> = listOf()
private var lm : LinearLayoutManager? = null
private var storedPosition: Int = 0
private var goBack:Boolean = false
companion object {
fun newInstance(userFk:String) = QaualityFragment(userFk)
}
override fun onAttach(context: Context) {
if (context is OnPasillerosItemClickListener) pasillerosItemClickListener = context
super.onAttach(context)
}
override fun getLayoutId(): Int = R.layout.qauality_fragment
override fun onCreate(savedInstanceState: Bundle?) {
val prefs: SharedPreferences = activity!!.getSharedPreferences(PREFS_USER,0)
user = prefs.getString(USER,"").toString()
password = prefs.getString(PASSWORD,"").toString()
sectorFk = prefs.getInt(SECTORFK,1).toString()
warehouseFk = prefs.getInt(WAREHOUSEFK,1).toString()
viewModel.itemShelvingBuyerTask(user = user,password = password,userFk = userFk)
super.onCreate(savedInstanceState)
}
override fun init() {
customDialog = CustomDialog(requireContext())
activity!!.main_bottom_navigation.visibility = View.GONE
splash_progress.visibility = View.VISIBLE
toolbar_title.text = "itemShelving_BuyerTask"
setToolBar()
setEvents()
super.init()
}
override fun onPause() {
super.onPause()
goBack = true
storedPosition = lm?.findFirstVisibleItemPosition() ?: 0
}
private fun setToolBar(){
val listIcons:ArrayList<Drawable> = ArrayList()
val iconReload : Drawable = resources.getDrawable(R.drawable.ic_autorenew_black_24dp,resources.newTheme())
listIcons.add(iconReload)
toolbar_icons.adapter = ToolBarAdapter(listIcons,object: OnOptionsSelectedListener {
override fun onOptionsItemSelected(item: Drawable) {
if (item == iconReload){
splash_progress.visibility = View.VISIBLE
viewModel.itemShelvingBuyerTask(user = user,password = password,userFk = userFk)
}
}
})
toolbar_icons.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
}
private fun setEvents(){
backButton.setOnClickListener {
activity!!.onBackPressed()
}
//ESCANER =========
hideKeyboards()
scan_input.requestFocus()
scan_input.setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0 || actionId == 5) {
if (!scan_input.text.toString().isNullOrEmpty()){
findSale(scan_input.text.toString())
}
scan_input.setText("")
hideKeyboards()
return@setOnEditorActionListener true
}
true
}
}
private fun hideKeyboards(){
try{
requireActivity().hideKeyboard()
}catch (e:Exception){}
}
override fun observeViewModel() {
with(viewModel) {
buyersList.observe(viewLifecycleOwner, Observer {
splash_progress.visibility = View.GONE
createBuyerList(it.list)
})
response.observe(viewLifecycleOwner, Observer {
viewModel.itemShelvingBuyerTask(user = user,password = password,userFk = userFk)
})
}
}
private fun createBuyerList(list:List<ItemBuyerVO>){
list.forEach { item ->
if (!goBack){
if (item.created != null && item.created != ""){
item.created = getCalendarFromDate(item.created).convertToDateString()
}
}
if (item.visible.contains("Visible:",ignoreCase = true)){
item.visible = item.visible
}else{
item.visible = "Visible: "+item.visible
}
item.iconResourceOk = R.drawable.ic_start_ok
item.iconResourceKo = R.drawable.ic_star_ko
}
goBack = false
listItems = list
buyersAdapter = ItemBuyersAdapter(listItems,pasillerosItemClickListener!!,object: OnStarSelectedListener{
override fun onStarSelected(vId: String, vStars: String) {
splash_progress.visibility = View.VISIBLE
viewModel.itemShelvingStarsUpdate(user,password,vId,vStars)
}
})
shelving_buyers_items.adapter = buyersAdapter
lm = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
shelving_buyers_items.layoutManager = lm
if (storedPosition < listItems.size)
goToPosition(storedPosition)
}
private fun getCalendarFromDate(date:String): Calendar {
val sdf = SimpleDateFormat("yyyy-MM-dd")
val cal = Calendar.getInstance()
cal.setTime(sdf.parse(date))
return cal
}
private fun findSale(matricula:String){
var isSearch = false
var index = 0
var position = 0
listItems.forEach { item ->
if (item.shelvingFk.toUpperCase() == matricula.toUpperCase()){
item.showStars = true
if (!isSearch){
position = index
isSearch = true
}
}else{
item.showStars = false
}
index += 1
}
storedPosition = position
goToPosition(position)
buyersAdapter?.notifyDataSetChanged()
}
private fun goToPosition(position:Int){
if (shelving_buyers_items != null){
shelving_buyers_items.addViewObserver {
lm!!.scrollToPositionWithOffset(position,0)
}
}
}
}

View File

@ -0,0 +1,71 @@
package es.verdnatura.presentation.view.feature.calidad.fragment
import android.content.Context
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import es.verdnatura.domain.GetQualityUserCase
import es.verdnatura.presentation.base.BaseViewModel
import es.verdnatura.presentation.common.ResponseItemVO
import es.verdnatura.presentation.view.feature.calidad.model.BuyerListVO
import es.verdnatura.presentation.view.feature.calidad.model.BuyerVO
import es.verdnatura.presentation.view.feature.calidad.model.ItemBuyerListVO
import es.verdnatura.presentation.view.feature.calidad.model.ItemBuyerVO
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
class QaualityViewModel(context: Context) : BaseViewModel() {
private val getQualityUserCase: GetQualityUserCase = GetQualityUserCase(context)
private val _buyersList by lazy { MutableLiveData<ItemBuyerListVO>() }
val buyersList: LiveData<ItemBuyerListVO>
get() = _buyersList
private val _response by lazy { MutableLiveData<ResponseItemVO>() }
val response: LiveData<ResponseItemVO>
get() = _response
fun itemShelvingBuyerTask(user:String,password:String,userFk:String){
getQualityUserCase.itemShelvingBuyerTask(user,password,userFk).enqueue(object :
Callback<List<ItemBuyerVO>> {
override fun onFailure(call: Call<List<ItemBuyerVO>>, t: Throwable) {
val listError:ArrayList<ItemBuyerVO> = ArrayList()
listError.add(ItemBuyerVO(isError = true,errorMessage = t.message!!))
_buyersList.value = ItemBuyerListVO(listError)
}
override fun onResponse(
call: Call<List<ItemBuyerVO>>,
response: Response<List<ItemBuyerVO>>
) {
if (response.body() != null){
_buyersList.value = response.body()?.let { ItemBuyerListVO(it) }
}else{
val listError:ArrayList<ItemBuyerVO> = ArrayList()
listError.add(ItemBuyerVO(isError = true,errorMessage = "Error en la llamada de itemShelvingBuyerTask"))
_buyersList.value = ItemBuyerListVO(listError)
}
}
})
}
fun itemShelvingStarsUpdate(usuario:String,password:String, vId: String,vStars: String) {
getQualityUserCase.itemShelvingStarsUpdate(usuario,password,vId,vStars).enqueue(object : Callback<String>{
override fun onFailure(call: Call<String>, t: Throwable) {
_response.value = ResponseItemVO(isError = true,errorMessage = ""+t.message!!)
}
override fun onResponse(call: Call<String>, response: Response<String>) {
if (response.body() == null){
_response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada itemShelvingStarsUpdate")
}else{
_response.value = ResponseItemVO(isError = false,response = response.body()!!)
}
}
})
}
}

View File

@ -0,0 +1,36 @@
package es.verdnatura.presentation.view.feature.calidad.model
//import es.verdnatura.presentation.view.feature.inventario.model.ItemInventaryVO
class BuyerVO (
var userFk:String = "",
var nickname:String= "",
var isError:Boolean = false,
var errorMessage:String = ""
)
class BuyerListVO (
var list: List<BuyerVO> = listOf()
)
class ItemBuyerVO (
var id:String = "",
var itemFk:String = "",
var longName:String = "",
var image:String = "",
var parking:String = "",
var shelvingFk:String = "",
var visible:String = "",
var created:String = "",
var stars:String = "",
var isError:Boolean = false,
var errorMessage:String = "",
var showStars:Boolean = false,
var iconResourceOk: Int = 0,
var iconResourceKo: Int = 0
)
class ItemBuyerListVO(
var list: List<ItemBuyerVO> = listOf()
)

View File

@ -0,0 +1,10 @@
package es.verdnatura.presentation.view.feature.collection
class ItemVO(
var id : String = "",
var longName : String = "",
var visible : String = "",
var available : String = "",
var isError: Boolean = false,
var errorMessage: String = ""
)

View File

@ -0,0 +1,46 @@
package es.verdnatura.presentation.view.feature.collection.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import es.verdnatura.databinding.ItemPlacementRowBinding
import es.verdnatura.presentation.common.OnPasillerosItemClickListener
import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO
import es.verdnatura.presentation.view.feature.sacador.model.PlacementVO
class PlacementAdapter (
private val items: List<PlacementVO>,
private val onPasillerosItemClickListener: OnPasillerosItemClickListener
): RecyclerView.Adapter<PlacementAdapter.AjustesItemHolder> () {
var context: Context? = null
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AjustesItemHolder {
this.context = parent.context
return AjustesItemHolder(
ItemPlacementRowBinding.inflate(LayoutInflater.from(parent.context),parent,false)
)
}
override fun getItemCount() =items.size
override fun onBindViewHolder(holder: AjustesItemHolder, position: Int) {
holder.bind(items[position])
}
inner class AjustesItemHolder(
val binding: ItemPlacementRowBinding
) : RecyclerView.ViewHolder(binding.root){
fun bind(placement: PlacementVO) {
binding.apply {
if (placement.placement.isNullOrEmpty())
placement.placement = placement.parking
if (placement.visible.isNullOrEmpty())
placement.visible = "("+placement.stockTotal+")"
this.item = placement
itemRootLayout.setOnClickListener {
onPasillerosItemClickListener.onPasillerosItemClickListener(PasillerosItemVO(title = "Ubicador"),placement.shelving)
}
}
}
}
}

View File

@ -0,0 +1,139 @@
package es.verdnatura.presentation.view.feature.collection.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import es.verdnatura.R
import es.verdnatura.databinding.ItemArticleRowBinding
import es.verdnatura.presentation.common.OnMistakeClickListener
import es.verdnatura.presentation.common.OnPasillerosItemClickListener
import es.verdnatura.presentation.common.OnQuantityClickListener
import es.verdnatura.presentation.common.OnSaleClickListener
import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO
import es.verdnatura.presentation.view.feature.sacador.model.SaleVO
class SaleAdapter (
private val items: List<SaleVO>,
private val onPasillerosItemClickListener: OnPasillerosItemClickListener,
private val onQuantityClick: OnQuantityClickListener,
private val onSaleClickListener: OnSaleClickListener,
private val onMistakeClickListener: OnMistakeClickListener
): RecyclerView.Adapter<SaleAdapter.AjustesItemHolder> () {
var context:Context? = null
var position:Int = 0
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AjustesItemHolder {
this.context = parent.context
return AjustesItemHolder(
ItemArticleRowBinding.inflate(LayoutInflater.from(parent.context),parent,false)
)
}
override fun getItemCount() =items.size
override fun onBindViewHolder(holder: AjustesItemHolder, position: Int) {
this.position = position
holder.bind(items[position])
}
inner class AjustesItemHolder(
val binding: ItemArticleRowBinding
) : RecyclerView.ViewHolder(binding.root){
fun bind(sale: SaleVO) {
binding.apply {
if (sale.pickedQuantity.isNullOrEmpty())
sale.pickedQuantity = "0"
val childLayoutManager = LinearLayoutManager(context!!, RecyclerView.HORIZONTAL, false)
itemArticlePlacements.apply {
layoutManager = childLayoutManager
adapter = PlacementAdapter(sale.placements,onPasillerosItemClickListener)
}
//CLICK EVENTS
contentLayout.setOnClickListener {
onSaleClickListener.onSaleClick(sale)
}
itemArticleItemFk.setOnClickListener {
onPasillerosItemClickListener.onPasillerosItemClickListener(PasillerosItemVO(title = "Consultar artículo"),sale.itemFk)
}
itemArticleQuantity.setOnClickListener {
onQuantityClick.onQuantityClick(sale)
}
itemArticleQuantityPicked.setOnClickListener {
onQuantityClick.onQuantityClick(sale)
}
txtde.setOnClickListener {
onQuantityClick.onQuantityClick(sale)
}
contentLayout.setOnLongClickListener {
onMistakeClickListener.onMistakeClickListener(sale)
false
}
//ERROR
if (sale.originalQuantity != sale.quantity){
layoutError.visibility = View.VISIBLE
txtError.text = "Cantidad original: "+sale.originalQuantity
if (sale.isPrepared == "1" || sale.isControlled == "1")
sale.pickedQuantity = sale.quantity
}
if (sale.isNew){
layoutError.visibility = View.VISIBLE
txtError.text = "Artículo nuevo"
}
if (!sale.isNew && sale.originalQuantity == sale.quantity){
layoutError.visibility = View.GONE
}
//SEMAFORO
if (sale.isPreviousPrepared == "1"){
itemArticleRowSemaforoPre.setBackgroundColor(ContextCompat.getColor(context!!, R.color.verdnatura_dark_sky_blue))
}else{
itemArticleRowSemaforoPre.setBackgroundColor(ContextCompat.getColor(context!!, R.color.verdnatura_warm_grey))
}
if (sale.isPrepared == "1"){
itemArticleRowSemaforoSac.setBackgroundColor(ContextCompat.getColor(context!!, R.color.verdnatura_pumpkin_orange))
}else{
itemArticleRowSemaforoSac.setBackgroundColor(ContextCompat.getColor(context!!, R.color.verdnatura_warm_grey))
}
if (sale.isControlled == "1"){
itemArticleRowSemaforoCon.setBackgroundColor(ContextCompat.getColor(context!!, R.color.verdnatura_dark_mint))
}else{
itemArticleRowSemaforoCon.setBackgroundColor(ContextCompat.getColor(context!!, R.color.verdnatura_warm_grey))
}
if (sale.isControlled == "1"){
contentLayout.setBackgroundColor(ContextCompat.getColor(context!!, R.color.verdnatura_dark_mint))
}else if (sale.isPrepared == "1"){
contentLayout.setBackgroundColor(ContextCompat.getColor(context!!, R.color.verdnatura_pumpkin_orange))
}else if (sale.isPreviousPrepared == "1"){
contentLayout.setBackgroundColor(ContextCompat.getColor(context!!, R.color.verdnatura_dark_sky_blue))
}else{
contentLayout.setBackgroundColor(ContextCompat.getColor(context!!, R.color.verdnatura_black))
}
//ASIGNAMOS VALOR A LA VSITA
this.sale = sale
}
}
}
}

View File

@ -0,0 +1,354 @@
package es.verdnatura.presentation.view.feature.collection.fragment
import android.content.Context
import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import es.verdnatura.domain.GetLoginUserCase
import es.verdnatura.domain.GetSacadorControladorUserCase
import es.verdnatura.domain.GetUbicadorUserCase
import es.verdnatura.presentation.base.BaseViewModel
import es.verdnatura.presentation.common.ResponseItemVO
import es.verdnatura.presentation.view.feature.collection.ItemVO
import es.verdnatura.presentation.view.feature.collection.mapper.map
import es.verdnatura.presentation.view.feature.sacador.model.*
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
class CollectionViewModel(context: Context) : BaseViewModel() {
val emptyMessage = "La colección no tiene tickets";
private val getSacadorControladorUserCase: GetSacadorControladorUserCase = GetSacadorControladorUserCase(context)
private val getUbicadorUserCase: GetUbicadorUserCase = GetUbicadorUserCase(context)
private val getLoginUserCase: GetLoginUserCase = GetLoginUserCase(context)
private val _collectionTicketList by lazy { MutableLiveData<CollectionVO>() }
val collectionTicketList: LiveData<CollectionVO>
get() = _collectionTicketList
private val _placementSuppleyList by lazy { MutableLiveData<PlacementSupplyListVO>() }
val placementSuppleyList: LiveData<PlacementSupplyListVO>
get() = _placementSuppleyList
private val _response by lazy { MutableLiveData<ResponseItemVO>() }
val response: LiveData<ResponseItemVO>
get() = _response
private val _responseNew by lazy { MutableLiveData<ResponseItemVO>() }
val responseNew: LiveData<ResponseItemVO>
get() = _responseNew
private val _responseCode by lazy { MutableLiveData<ResponseItemVO>() }
val responseCode: LiveData<ResponseItemVO>
get() = _responseCode
private val _responseIncQuantity by lazy { MutableLiveData<ResponseItemVO>() }
val responseIncQuantity: LiveData<ResponseItemVO>
get() = _responseIncQuantity
private val _mistakeList by lazy { MutableLiveData<MistakeTypeListVO>() }
val mistakeList: LiveData<MistakeTypeListVO>
get() = _mistakeList
private val _item by lazy { MutableLiveData<ItemVO>() }
val item: LiveData<ItemVO>
get() = _item
fun collectionTicketGet(usuario:String,password:String,collectionFk:String,sectorFk:String){
getSacadorControladorUserCase.collectionTicketGet(usuario,password,collectionFk,sectorFk,"0").enqueue(object :
Callback<CollectionVO> {
override fun onFailure(call: Call<CollectionVO>, t: Throwable) {
_collectionTicketList.value = CollectionVO(isError = true,errorMessage = t.message!!)
}
override fun onResponse(
call: Call<CollectionVO>,
response: Response<CollectionVO>
) {
if (response.body() != null){
_collectionTicketList.value = response.body()?.let { it.map() }
}else{
_collectionTicketList.value = CollectionVO(isError = true,errorMessage = "Error en la llamada de collection_get")
}
}
})
}
fun saleTrackingReplace(usuario:String,password:String,saleFk:String,vOriginalQuantity:String,vStateFk:String,vIsChecked:String,vBuyFk:String){
getSacadorControladorUserCase.saleTrackingReplace(usuario,password,saleFk,vOriginalQuantity,vStateFk,vIsChecked,vBuyFk).enqueue(object : Callback<String>{
override fun onFailure(call: Call<String>, t: Throwable) {
_response.value = ResponseItemVO(isError = true,errorMessage = ""+t.message!!)
}
override fun onResponse(call: Call<String>, response: Response<String>) {
if (response.body() == null){
_response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada saleTracking_Replace")
}else{
_response.value = ResponseItemVO(isError = false,response = response.body()!!)
}
}
})
}
fun itemPlacementSupplyAiming(usuario:String,password:String,shelvingFk:String,quantity:String,itemFk:String){
getSacadorControladorUserCase.itemPlacementSupplyAiming(usuario,password,shelvingFk,quantity,itemFk).enqueue(object :
Callback<List<PlacementSupplyVO>> {
override fun onFailure(call: Call<List<PlacementSupplyVO>>, t: Throwable) {
val listError:ArrayList<PlacementSupplyVO> = ArrayList()
listError.add(PlacementSupplyVO(isError = true,errorMessage = t.message!!))
_placementSuppleyList.value = PlacementSupplyListVO(listError)
}
override fun onResponse(
call: Call<List<PlacementSupplyVO>>,
response: Response<List<PlacementSupplyVO>>
) {
if (response.body() != null){
_placementSuppleyList.value = response.body()?.let { PlacementSupplyListVO(it) }
}else{
val listError:ArrayList<PlacementSupplyVO> = ArrayList()
listError.add(PlacementSupplyVO(isError = true,errorMessage = "Error en la llamada de itemPlacementSupplyAiming"))
_placementSuppleyList.value = PlacementSupplyListVO(listError)
}
}
})
}
fun itemShelvingSaleSupplyAdd(usuario:String,password:String,itemShelvingFk:String,saleFk:String,quantity:String){
getSacadorControladorUserCase.itemShelvingSaleSupplyAdd(usuario,password,itemShelvingFk,saleFk,quantity).enqueue(object : Callback<String>{
override fun onFailure(call: Call<String>, t: Throwable) {
_response.value = ResponseItemVO(isError = true,errorMessage = ""+t.message!!)
}
override fun onResponse(call: Call<String>, response: Response<String>) {
if (response.body() == null){
_response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada itemShelvingSaleSupplyAdd")
}else{
_response.value = ResponseItemVO(isError = false,response = response.body()!!)
}
}
})
}
fun collectionStickerPrint(usuario:String,password:String,collectionFk: String,sectorFk: String){
getSacadorControladorUserCase.collectionStickerPrint(usuario,password,collectionFk,sectorFk).enqueue(object : Callback<String>{
override fun onFailure(call: Call<String>, t: Throwable) {
_response.value = ResponseItemVO(isError = true,errorMessage = ""+t.message!!)
}
override fun onResponse(call: Call<String>, response: Response<String>) {
if (response.body() == null){
_response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada collectionStickerPrint")
}else{
_response.value = ResponseItemVO(isError = false,response = response.body()!!)
}
}
})
}
fun itemGetAvailable(usuario:String,password:String,itemFk: String,warehouseFk: String){
getSacadorControladorUserCase.itemGetAvailable(usuario,password,itemFk,warehouseFk).enqueue(object : Callback<ItemVO>{
override fun onFailure(call: Call<ItemVO>, t: Throwable) {
_item.value = ItemVO(isError = true,errorMessage = ""+t.message!!)
}
override fun onResponse(call: Call<ItemVO>, response: Response<ItemVO>) {
if (response.body() == null){
_item.value = ItemVO(isError = true,errorMessage = "Error en la llamada item_GetVisibleAvailable")
}else{
_item.value = response.body()
}
}
})
}
fun collectionAddItem(usuario:String,password:String,itemFk: String,quantityFk: String,ticketFk: String,warehouseFk: String){
getSacadorControladorUserCase.collectionAddItem(usuario,password,itemFk,quantityFk,ticketFk,warehouseFk).enqueue(object : Callback<String>{
override fun onFailure(call: Call<String>, t: Throwable) {
_responseNew.value = ResponseItemVO(isError = true,errorMessage = ""+t.message!!)
}
override fun onResponse(call: Call<String>, response: Response<String>) {
if (response.body() == null){
_responseNew.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada collectionAddItem")
}else{
_responseNew.value = ResponseItemVO(isError = false,response = response.body()!!)
}
}
})
}
fun saleMove(usuario:String,password:String,saleFk: String,quantity: String,originalQuantity : String){
getSacadorControladorUserCase.saleMove(usuario,password,saleFk,quantity,originalQuantity).enqueue(object : Callback<String>{
override fun onFailure(call: Call<String>, t: Throwable) {
_response.value = ResponseItemVO(isError = true,errorMessage = ""+t.message!!)
}
override fun onResponse(call: Call<String>, response: Response<String>) {
if (response.body() == null){
_response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada saleMove")
}else{
_response.value = ResponseItemVO(isError = false,response = response.body()!!)
}
}
})
}
fun collectionMissingTrash(usuario:String,password:String,saleFk: String,quantity: String,type:String,warehouseFk:String,originalQuantity: String){
getSacadorControladorUserCase.collectionMissingTrash(usuario,password,saleFk,quantity,type,warehouseFk,originalQuantity).enqueue(object : Callback<String>{
override fun onFailure(call: Call<String>, t: Throwable) {
_response.value = ResponseItemVO(isError = true,errorMessage = ""+t.message!!)
}
override fun onResponse(call: Call<String>, response: Response<String>) {
if (response.body() == null){
_response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada collectionMissingTrash")
}else{
_response.value = ResponseItemVO(isError = false,response = response.body()!!)
}
}
})
}
fun saleTrackingDel(usuario:String,password:String,saleFk: String){
getSacadorControladorUserCase.saleTrackingDel(usuario,password,saleFk).enqueue(object : Callback<String>{
override fun onFailure(call: Call<String>, t: Throwable) {
_response.value = ResponseItemVO(isError = true,errorMessage = ""+t.message!!)
}
override fun onResponse(call: Call<String>, response: Response<String>) {
if (response.body() == null){
_response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada collectionMissingTrash")
}else{
_response.value = ResponseItemVO(isError = false,response = response.body()!!)
}
}
})
}
fun parking(usuario: String,password: String,ticketFk: String,parking:String){
getUbicadorUserCase.shelvingPark(usuario,password,ticketFk,parking).enqueue(object : Callback<String>{
override fun onFailure(call: Call<String>, t: Throwable) {
_response.value = ResponseItemVO(isError = true,errorMessage = ""+t.message!!)
}
override fun onResponse(call: Call<String>, response: Response<String>) {
if (response.body() == null){
_response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada shelvingPark")
}else{
_response.value = ResponseItemVO(isError = false,response = response.body()!!)
}
}
})
}
fun collectionUpdateState(usuario:String,password:String,collectionFk: String,state : String){
getSacadorControladorUserCase.collectionUpdateState(usuario,password,collectionFk,state).enqueue(object : Callback<String>{
override fun onFailure(call: Call<String>, t: Throwable) {
_response.value = ResponseItemVO(isError = true,errorMessage = ""+t.message!!)
}
override fun onResponse(call: Call<String>, response: Response<String>) {
if (response.body() == null){
_response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada collectionUpdateState")
}else{
_response.value = ResponseItemVO(isError = false,response = response.body()!!)
}
}
})
}
fun getIdFromCode(usuario:String,password:String,code: String){
getSacadorControladorUserCase.getIdFromCode(usuario,password,code).enqueue(object : Callback<String>{
override fun onFailure(call: Call<String>, t: Throwable) {
_responseCode.value = ResponseItemVO(isError = true,errorMessage = ""+t.message!!)
}
override fun onResponse(call: Call<String>, response: Response<String>) {
if (response.body() == null){
_responseCode.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada barcodeToItem")
}else{
_responseCode.value = ResponseItemVO(isError = false,response = response.body()!!)
}
}
})
}
fun collectionIncreaseQuantity(usuario:String,password:String,saleFk: String,quantity: String){
getSacadorControladorUserCase.collectionIncreaseQuantity(usuario,password,saleFk,quantity).enqueue(object : Callback<String>{
override fun onFailure(call: Call<String>, t: Throwable) {
_responseIncQuantity.value = ResponseItemVO(isError = true,errorMessage = ""+t.message!!)
}
override fun onResponse(call: Call<String>, response: Response<String>) {
if (response.body() == null){
_responseIncQuantity.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada collectionIncreaseQuantity")
}else{
_responseIncQuantity.value = ResponseItemVO(isError = false,response = response.body()!!)
}
}
})
}
fun sendChekingPresence(token:String,workerId:String,message:String){
try{
getLoginUserCase.sendChekingPresence(token,workerId.toInt(),message).enqueue(object : Callback<Boolean>{
override fun onResponse(call: Call<Boolean>, response: Response<Boolean>) {
Log.i("Salix","Mensaje enviado a salix")
}
override fun onFailure(call: Call<Boolean>, t: Throwable) {
Log.i("Salix Error",""+t.message)
}
})
}catch (e:Exception){}
}
fun saleMistakeAdd(usuario:String,password:String,vSaleFk: String, vUserFk: String, vTypeFk: String){
getSacadorControladorUserCase.saleMistakeAdd(usuario,password,vSaleFk,vUserFk,vTypeFk).enqueue(object :
Callback<String> {
override fun onFailure(call: Call<String>, t: Throwable) {
_response.value = ResponseItemVO(isError = true,errorMessage = ""+t.message!!)
}
override fun onResponse(
call: Call<String>,
response: Response<String>
) {
if (response.body() == null){
_response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada saleMistakeAdd")
}else{
_response.value = ResponseItemVO(isError = false,response = response.body()!!)
}
}
})
}
fun mistakeType(usuario:String,password:String){
getSacadorControladorUserCase.mistakeType(usuario,password).enqueue(object : Callback<List<MistakeTypeVO>>{
override fun onFailure(call: Call<List<MistakeTypeVO>>, t: Throwable) {
val listError:ArrayList<MistakeTypeVO> = ArrayList()
listError.add(MistakeTypeVO("0",""))
_mistakeList.value = MistakeTypeListVO(listError)
}
override fun onResponse(
call: Call<List<MistakeTypeVO>>,
response: Response<List<MistakeTypeVO>>
) {
if (response.body() != null){
_mistakeList.value = response.body()?.let { MistakeTypeListVO(it) }
}else{
val listError:ArrayList<MistakeTypeVO> = ArrayList()
listError.add(MistakeTypeVO("0",""))
_mistakeList.value = MistakeTypeListVO(listError)
}
}
})
}
}

View File

@ -0,0 +1,61 @@
package es.verdnatura.presentation.view.feature.collection.mapper
import es.verdnatura.presentation.common.convertToDateString
import es.verdnatura.presentation.view.feature.sacador.model.CollectionVO
import java.text.SimpleDateFormat
import java.util.*
fun CollectionVO.map() : CollectionVO{
try {
this.tickets.forEach { ticket ->
ticket.sales.forEach {
it.ticketFk = ticket.ticketFk
it.level = ticket.level
it.salePersonFk = ticket.salesPersonFk
it.agencyName = ticket.agencyName
it.quantity = it.quantity.substring(0, it.quantity.indexOf("."))
it.isNew = it.isAdded == "1"
it.originalQuantity =
if (it.originalQuantity != "-1") it.originalQuantity.substring(
0,
it.originalQuantity.indexOf(".")
) else it.quantity
it.pickedQuantity =
if (it.isPrepared == "1" || it.isPreviousPrepared == "1" || it.isControlled == "1") it.quantity else it.pickedQuantity
if (!it.placements.isNullOrEmpty()) {
it.placements.forEachIndexed { index, placement ->
if (index == 0) {
try {
it.saleOrder = placement.saleOrder.toInt()
} catch (e: NumberFormatException) {
it.saleOrder = 9999
}
}
placement.created =
getCalendarFromDate(placement.created).convertToDateString()
placement.visible = "(" + (if(placement.visible.toInt() > 0) placement.visible else "0") + ")"
}
} else {
it.placements = listOf()
}
}
}
}catch (e:Exception){
this.isError = true
if (this.tickets == null || this.tickets.isEmpty()){
this.errorMessage = "La colección no tiene tickets"
}else{
this.errorMessage = "Error al construir la colección"
}
}
return this
}
private fun getCalendarFromDate(date:String): Calendar {
val sdf = SimpleDateFormat("yyyy-MM-dd")
val cal = Calendar.getInstance()
cal.setTime(sdf.parse(date))
return cal
}

View File

@ -0,0 +1,110 @@
package es.verdnatura.presentation.view.feature.controlador.fragment
import android.content.Context
import android.content.SharedPreferences
import android.os.Bundle
import android.util.Log
import android.view.View
import android.view.inputmethod.EditorInfo
import androidx.lifecycle.Observer
import es.verdnatura.R
import es.verdnatura.databinding.FragmentControladorBinding
import es.verdnatura.domain.ConstAndValues
import es.verdnatura.presentation.base.BaseFragment
import es.verdnatura.presentation.common.OnCollectionSelectedListener
import es.verdnatura.presentation.view.component.CustomDialog
import es.verdnatura.presentation.view.feature.main.activity.MainActivity
import es.verdnatura.presentation.view.feature.sacador.model.CollectionVO
import kotlinx.android.synthetic.main.fragment_controlador.*
import kotlinx.android.synthetic.main.toolbar.*
class ControladorFragment : BaseFragment<FragmentControladorBinding,ControladorViewModel>(ControladorViewModel::class) {
private var user = ""
private var password = ""
private var sectorFk = ""
private var warehouseFk = ""
private var goBack:Boolean = false
private var onCollectionSelectedListener : OnCollectionSelectedListener? = null
override fun getLayoutId(): Int = R.layout.fragment_controlador
private lateinit var customDialog: CustomDialog
companion object {
fun newInstance() = ControladorFragment()
}
override fun onAttach(context: Context) {
super.onAttach(context)
if (context is OnCollectionSelectedListener) onCollectionSelectedListener = context
}
override fun init() {
splash_progress.visibility = View.GONE
customDialog = CustomDialog(requireContext())
toolbar_title.text = getString(R.string.getcollection)
setEvents()
super.init()
}
override fun onPause() {
goBack = true
super.onPause()
}
override fun onCreate(savedInstanceState: Bundle?) {
val prefs: SharedPreferences = activity!!.getSharedPreferences(PREFS_USER,0)
user = prefs.getString(USER,"").toString()
password = prefs.getString(PASSWORD,"").toString()
sectorFk = prefs.getInt(SECTORFK,1).toString()
warehouseFk = prefs.getInt(WAREHOUSEFK,1).toString()
super.onCreate(savedInstanceState)
}
private fun setEvents(){
scan_input.requestFocus()
scan_input.setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0) {
if (!scan_input.text.isNullOrEmpty()) {
splash_progress.visibility = View.VISIBLE
viewModel.collectionTicketGet(
usuario = user,
password = password,
sectorFk = sectorFk,
collectionFk = scan_input.text.toString()
)
Log.i("VERDNATURA","La collection es ${scan_input.text.toString()}")
}
scan_input.setText("")
(activity as MainActivity).hideKeyboard(scan_input)
return@setOnEditorActionListener true
}
false
}
}
override fun observeViewModel() {
with(viewModel){
collectionTicketList.observe(viewLifecycleOwner, Observer {
splash_progress.visibility = View.GONE
if (it.isError){
customDialog.setTitle("Error").setDescription(it.errorMessage).setOkButton("Aceptar"){
customDialog.dismiss()
}.show()
}else{
if (!goBack)navigateToCollectionList(it)
goBack = false
}
})
}
}
private fun navigateToCollectionList(collection: CollectionVO){
onCollectionSelectedListener?.onCollectionSelected(collection, ConstAndValues.CONTROLADOR)
}
}

View File

@ -0,0 +1,43 @@
package es.verdnatura.presentation.view.feature.controlador.fragment
import android.content.Context
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import es.verdnatura.domain.GetSacadorControladorUserCase
import es.verdnatura.presentation.base.BaseViewModel
import es.verdnatura.presentation.view.feature.collection.mapper.map
import es.verdnatura.presentation.view.feature.sacador.model.CollectionVO
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
class ControladorViewModel(context: Context) : BaseViewModel() {
private val _collectionTicketList by lazy { MutableLiveData<CollectionVO>() }
private val getSacadorControladorUserCase: GetSacadorControladorUserCase = GetSacadorControladorUserCase(context)
val collectionTicketList: LiveData<CollectionVO>
get() = _collectionTicketList
fun collectionTicketGet(usuario:String,password:String,collectionFk:String,sectorFk:String){
getSacadorControladorUserCase.collectionTicketGet(usuario,password,collectionFk,sectorFk,"0").enqueue(object :
Callback<CollectionVO> {
override fun onFailure(call: Call<CollectionVO>, t: Throwable) {
_collectionTicketList.value = CollectionVO(isError = true,errorMessage = t.message!!)
}
override fun onResponse(
call: Call<CollectionVO>,
response: Response<CollectionVO>
) {
if (response.body() != null){
_collectionTicketList.value = response.body()?.let { it.map() }
}else{
_collectionTicketList.value = CollectionVO(isError = true,errorMessage = "No hay tickets para sacar")
}
}
})
}
}

View File

@ -0,0 +1,64 @@
package es.verdnatura.presentation.view.feature.faltas.adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import es.verdnatura.databinding.ItemFaltasRowBinding
import es.verdnatura.presentation.common.OnFaltasNichoClickListener
import es.verdnatura.presentation.common.OnFaltasReviewClickListener
import es.verdnatura.presentation.common.OnPasillerosItemClickListener
import es.verdnatura.presentation.view.feature.faltas.model.ItemFaltasVO
import es.verdnatura.presentation.view.feature.pasillero.model.PasillerosItemVO
class FaltasAdapter (
private val items: List<ItemFaltasVO>,
private val onFaltasNichoClickListener: OnFaltasNichoClickListener,
private val onFaltasReviewClickListener:OnFaltasReviewClickListener,
private val onPasillerosItemClickListener: OnPasillerosItemClickListener
): RecyclerView.Adapter<FaltasAdapter.ItemHolder> () {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHolder {
return ItemHolder(
ItemFaltasRowBinding.inflate(LayoutInflater.from(parent.context),parent,false)
)
}
override fun getItemCount() =items.size
override fun onBindViewHolder(holder: ItemHolder, position: Int) {
holder.bind(items[position])
}
inner class ItemHolder(
val binding: ItemFaltasRowBinding
) : RecyclerView.ViewHolder(binding.root){
private val res = binding.root.context.resources
fun bind(item: ItemFaltasVO) {
binding.apply {
this.item = item
if(item.producer.isNullOrEmpty()){
itemProducer.visibility = View.GONE
}else{
itemProducer.visibility = View.VISIBLE
}
itemNicho.setOnClickListener {
onFaltasNichoClickListener.onFaltasNichoClickListener(item)
}
itemFaltas.setOnClickListener {
onFaltasReviewClickListener.onFaltasReviewClickListener(item)
}
itemFk.setOnClickListener {
onPasillerosItemClickListener.onPasillerosItemClickListener(PasillerosItemVO(title = "Consultar artículo"),item.itemFk)
}
itemUp.setOnClickListener {
onPasillerosItemClickListener.onPasillerosItemClickListener(PasillerosItemVO(title = "Buscar item"),item.itemFk)
}
itemDown.setOnClickListener {
onPasillerosItemClickListener.onPasillerosItemClickListener(PasillerosItemVO(title = "Buscar item"),item.itemFk)
}
}
}
}
}

View File

@ -0,0 +1,220 @@
package es.verdnatura.presentation.view.feature.faltas.fragment
import android.content.Context
import android.content.SharedPreferences
import android.graphics.drawable.Drawable
import android.os.Bundle
import android.view.View
import android.view.inputmethod.EditorInfo
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
import es.verdnatura.R
import es.verdnatura.databinding.FragmentFaltasBinding
import es.verdnatura.presentation.base.BaseFragment
import es.verdnatura.presentation.common.OnFaltasNichoClickListener
import es.verdnatura.presentation.common.OnFaltasReviewClickListener
import es.verdnatura.presentation.common.OnOptionsSelectedListener
import es.verdnatura.presentation.common.OnPasillerosItemClickListener
import es.verdnatura.presentation.view.component.CustomDialog
import es.verdnatura.presentation.view.component.CustomDialogInput
import es.verdnatura.presentation.view.feature.faltas.adapter.FaltasAdapter
import es.verdnatura.presentation.view.feature.faltas.model.ItemFaltasVO
import es.verdnatura.presentation.view.feature.inventario.adapter.ToolBarAdapter
import es.verdnatura.presentation.view.feature.main.activity.MainActivity
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.fragment_faltas.*
import kotlinx.android.synthetic.main.toolbar.*
class FaltasFragment : BaseFragment<FragmentFaltasBinding, FaltasViewModel>(FaltasViewModel::class) {
private var user = ""
private var password = ""
private var sectorFk = ""
private var warehouseFk = ""
private var adapter : FaltasAdapter? = null
private lateinit var customDialogInput: CustomDialogInput
private var listInvetory:ArrayList<ItemFaltasVO> = ArrayList()
private var listInvetoryAux:ArrayList<ItemFaltasVO> = ArrayList()
private lateinit var customDialog: CustomDialog
private var pasillerosItemClickListener: OnPasillerosItemClickListener? = null
private var reload = false
private var hideLoad = true
companion object {
fun newInstance() = FaltasFragment()
}
override fun onAttach(context: Context) {
if (context is OnPasillerosItemClickListener) pasillerosItemClickListener = context
super.onAttach(context)
}
override fun getLayoutId(): Int = R.layout.fragment_faltas
override fun onCreate(savedInstanceState: Bundle?) {
val prefs: SharedPreferences = activity!!.getSharedPreferences(PREFS_USER,0)
user = prefs.getString(USER,"").toString()
password = prefs.getString(PASSWORD,"").toString()
sectorFk = prefs.getInt(SECTORFK,1).toString()
warehouseFk = prefs.getInt(WAREHOUSEFK,1).toString()
viewModel.getFaltas(user,password,warehouseFk)
super.onCreate(savedInstanceState)
}
override fun init() {
splash_progress.visibility = View.VISIBLE
activity!!.main_bottom_navigation.visibility = View.GONE
toolbar_title.text = getString(R.string.faultsReview)
setToolBar()
customDialogInput = CustomDialogInput(requireContext())
customDialog = CustomDialog(requireContext())
setEvents()
if (reload){
reload = false
hideLoad = false
splash_progress.visibility = View.VISIBLE
viewModel.getFaltas(user,password,warehouseFk)
}
super.init()
}
private fun setToolBar(){
val listIcons:ArrayList<Drawable> = ArrayList()
val iconReload : Drawable = resources.getDrawable(R.drawable.ic_autorenew_black_24dp,resources.newTheme())
listIcons.add(iconReload)
toolbar_icons.adapter = ToolBarAdapter(listIcons,object: OnOptionsSelectedListener {
override fun onOptionsItemSelected(item: Drawable) {
if (item == iconReload){
splash_progress.visibility = View.VISIBLE
viewModel.getFaltas(user,password,warehouseFk)
}
}
})
toolbar_icons.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
}
private fun setEvents(){
backButton.setOnClickListener {
activity!!.onBackPressed()
}
filter_itemFk.setOnKeyListener { v, keyCode, event ->
if (filter_itemFk.text.toString().isNullOrEmpty()){
if (listInvetory.size != listInvetoryAux.size){
listInvetory.removeAll(listInvetoryAux)
listInvetoryAux.forEach {
listInvetory.add(it)
}
}
}else{
listInvetory.removeAll(listInvetoryAux)
listInvetoryAux.forEach {
if (it.itemFk.contains(filter_itemFk.text.toString(),true)){
listInvetory.add(it)
}
}
}
adapter!!.notifyDataSetChanged()
return@setOnKeyListener false
}
}
override fun observeViewModel() {
with(viewModel){
faltasList.observe(viewLifecycleOwner, Observer {
if (hideLoad){
splash_progress.visibility = View.GONE
}else{
hideLoad = true
}
listInvetory = ArrayList()
listInvetoryAux = ArrayList()
it.list.forEach {
listInvetory.add(it)
listInvetoryAux.add(it)
}
adapter = FaltasAdapter(listInvetory,object: OnFaltasNichoClickListener {
override fun onFaltasNichoClickListener(item: ItemFaltasVO) {
customDialogInput.setTitle(item.itemFk+"\n"+item.longName+" "+item.size).setDescription("Cantidad real("+item.nicho+")").setOkButton("Tirar"){
viewModel.itemStockUpdate(item.itemFk,warehouseFk,user,password,customDialogInput.getValue(),"0")
changeOfflineValue(item)
customDialogInput.dismiss()
}.setKoButton("Cancelar"){
customDialogInput.dismiss()
}.setValue("0").show()
customDialogInput.getEditText().requestFocus()
customDialogInput.getEditText().setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || actionId == 0) {
if (!customDialogInput.getValue().isNullOrEmpty()){
viewModel.itemStockUpdate(item.itemFk,warehouseFk,user,password,customDialogInput.getValue(),"0")
changeOfflineValue(item)
}
customDialogInput.setValue("")
customDialogInput.dismiss()
(activity as MainActivity).hideKeyboard(customDialogInput.getEditText())
return@setOnEditorActionListener true
}
false
}
}
},object: OnFaltasReviewClickListener{
override fun onFaltasReviewClickListener(item: ItemFaltasVO) {
viewModel.faultsReview_isChecked(user,password,item.itemFk,warehouseFk)
changeOfflineValue(item)
}
},pasillerosItemClickListener!!)
location_recyclerview.adapter = adapter
location_recyclerview.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
})
response.observe(viewLifecycleOwner, Observer {
if (it.isError){
customDialog.setTitle("Error").setDescription(it.errorMessage).setOkButton("Cerrar"){
customDialog.dismiss()
}.show()
}
})
}
}
private fun changeOfflineValue(item: ItemFaltasVO){
var i = 0
var position = 0
listInvetory.forEach {
if (it.itemFk == item.itemFk) {
position = i
}
i = i.plus(1)
}
listInvetory.removeAt(position)
i = 0
position = 0
listInvetoryAux.forEach {
if (it.itemFk == item.itemFk) {
position = i
}
i = i.plus(1)
}
listInvetoryAux.removeAt(position)
adapter?.notifyDataSetChanged()
reload = true
}
}

View File

@ -0,0 +1,98 @@
package es.verdnatura.presentation.view.feature.faltas.fragment
import android.content.Context
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Transformations
import es.verdnatura.domain.GetInventaryUserCase
import es.verdnatura.domain.GetItemCardUserCase
import es.verdnatura.presentation.base.BaseViewModel
import es.verdnatura.presentation.common.Event
import es.verdnatura.presentation.common.ResponseItemVO
import es.verdnatura.presentation.view.feature.faltas.model.ItemFaltasListVO
import es.verdnatura.presentation.view.feature.faltas.model.ItemFaltasVO
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
class FaltasViewModel(context: Context) : BaseViewModel() {
private val getInventaryUserCase: GetInventaryUserCase = GetInventaryUserCase(context)
private val getItemCardUserCase: GetItemCardUserCase = GetItemCardUserCase(context)
private val _faltasList by lazy { MutableLiveData<ItemFaltasListVO>() }
val faltasList: LiveData<ItemFaltasListVO>
get() = _faltasList
private val _response by lazy { MutableLiveData<ResponseItemVO>() }
val response: LiveData<ResponseItemVO>
get() = _response
val loadFaltasList = Transformations.map(_faltasList) { Event(it) }
fun getFaltas(user:String,password:String,warehouseFk:String){
getInventaryUserCase.faultsReview(user,password,warehouseFk).enqueue(object :
Callback<List<ItemFaltasVO>> {
override fun onFailure(call: Call<List<ItemFaltasVO>>, t: Throwable) {
val listError:ArrayList<ItemFaltasVO> = ArrayList()
listError.add(ItemFaltasVO(isError = true,errorMessage = t.message!!))
_faltasList.value = ItemFaltasListVO(listError)
}
override fun onResponse(
call: Call<List<ItemFaltasVO>>,
response: Response<List<ItemFaltasVO>>
) {
if (response.body() != null){
_faltasList.value = response.body()?.let { ItemFaltasListVO(it) }
}else{
val listError:ArrayList<ItemFaltasVO> = ArrayList()
listError.add(ItemFaltasVO(isError = true,errorMessage = "Error en la llamada de faultsReview"))
_faltasList.value = ItemFaltasListVO(listError)
}
}
})
}
fun itemStockUpdate(itemFk:String,warehouseFk:String,user:String,password:String,newValue:String,isTrash:String){
getItemCardUserCase.itemStockUpdate(user,password,itemFk,warehouseFk,newValue,isTrash).enqueue(object :
Callback<String> {
override fun onFailure(call: Call<String>, t: Throwable) {
_response.value = ResponseItemVO(isError = true,errorMessage = "Error al guardar STOCK "+itemFk+ " Respuesta:"+t.message!!)
}
override fun onResponse(call: Call<String>, response: Response<String>) {
if (response.body() == null){
_response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada itemStockUpdate")
}else{
_response.value = ResponseItemVO(isError = false,response = response.body()!!)
}
}
})
}
fun faultsReview_isChecked(user:String,password:String,itemFk:String,warehouseFk:String){
getInventaryUserCase.faultsReview_isChecked(user,password,itemFk,warehouseFk).enqueue(object :
Callback<String> {
override fun onFailure(call: Call<String>, t: Throwable) {
_response.value = ResponseItemVO(isError = true,errorMessage = "Error faultsReview_isChecked "+itemFk+ " Respuesta:"+t.message!!)
}
override fun onResponse(call: Call<String>, response: Response<String>) {
if (response.body() == null){
_response.value = ResponseItemVO(isError = true,errorMessage = "Error en la llamada faultsReview_isChecked")
}else{
_response.value = ResponseItemVO(isError = false,response = response.body()!!)
}
}
})
}
}

View File

@ -0,0 +1,19 @@
package es.verdnatura.presentation.view.feature.faltas.model
class ItemFaltasVO (
var itemFk:String = "",
var longName:String= "",
var size:String= "",
var producer:String= "",
var downstairs:String= "",
var upstairs:String= "",
var nicho:String= "",
var faltas:String= "",
var isError:Boolean = false,
var errorMessage:String = ""
)
class ItemFaltasListVO (
var list: List<ItemFaltasVO> = listOf()
)

View File

@ -0,0 +1,46 @@
package es.verdnatura.presentation.view.feature.historico.adapter
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import es.verdnatura.R
import es.verdnatura.databinding.ItemHistoricoRowBinding
import es.verdnatura.presentation.view.feature.historico.model.ItemHistoricoVO
import java.text.SimpleDateFormat
import java.util.*
class HistoricoAdapter (
private val items: List<ItemHistoricoVO>
): RecyclerView.Adapter<HistoricoAdapter.ItemHolder> () {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHolder {
return ItemHolder(
ItemHistoricoRowBinding.inflate(LayoutInflater.from(parent.context),parent,false)
)
}
override fun getItemCount() =items.size
override fun onBindViewHolder(holder: ItemHolder, position: Int) {
holder.bind(items[position])
}
inner class ItemHolder(
val binding: ItemHistoricoRowBinding
) : RecyclerView.ViewHolder(binding.root){
private val res = binding.root.context.resources
fun bind(item: ItemHistoricoVO) {
binding.apply {
this.item = item
val sdf = SimpleDateFormat("yyyy-MM-dd")
val currentDate = sdf.format(Date())
if (currentDate == item.shipped){
historicoDate.setBackgroundColor(res.getColor(R.color.verdnatura_pumpkin_orange))
}else{
historicoDate.setBackgroundColor(res.getColor(R.color.verdnatura_black_5))
}
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More