From ae6e24d91cc797fe5fdf7c2b4786c4ea3136dbcc Mon Sep 17 00:00:00 2001 From: carvalho-joao Date: Tue, 28 Oct 2025 10:49:26 -0300 Subject: [PATCH 1/8] =?UTF-8?q?arrumando=20insert=20do=20produto,=20coloca?= =?UTF-8?q?ndo=20insert=20na=20vitrine=20e=20arrumando=20a=20exibi=C3=A7?= =?UTF-8?q?=C3=A3o=20da=20vitrine?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/deploymentTargetSelector.xml | 3 - .../projetosaveit/adapter/AdapterProduto.kt | 52 +- .../projetosaveit/api/network/ApiService.kt | 25 +- .../api/network/RetrofitClientSql.kt | 6 +- .../api/repository/EstoqueRepository.kt | 7 +- .../api/repository/ProdutoRepository.kt | 4 +- .../example/projetosaveit/model/EstoqueDTO.kt | 2 +- .../model/RelatorioProdutoDTO.kt | 7 + .../example/projetosaveit/model/VitrineDTO.kt | 4 +- .../projetosaveit/model/VitrineInsertDTO.kt | 2 +- .../projetosaveit/ui/AdicionarProduto.kt | 10 +- .../projetosaveit/ui/CadastroEndereco.kt | 23 +- .../projetosaveit/ui/ProdutoVitrine.kt | 6 +- .../example/projetosaveit/ui/TelaEstoque.kt | 98 ++++ .../cadastrarRelatorio/CadastrarRelatorio.kt | 11 +- .../projetosaveit/ui/home/HomeFragment.kt | 11 +- .../ui/vitrine/VitrineFragment.kt | 22 +- .../res/layout-sw600dp/activity_login.xml | 55 ++- .../res/layout-sw600dp/fragment_vitrine.xml | 6 +- .../main/res/layout/fragment_relatorio.xml | 454 +++++++++++++++++- app/src/main/res/layout/fragment_vitrine.xml | 123 +++-- 21 files changed, 784 insertions(+), 147 deletions(-) create mode 100644 app/src/main/java/com/example/projetosaveit/model/RelatorioProdutoDTO.kt diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index 5219fd1..6fd26cd 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -13,9 +13,6 @@ - - \ No newline at end of file diff --git a/app/src/main/java/com/example/projetosaveit/adapter/AdapterProduto.kt b/app/src/main/java/com/example/projetosaveit/adapter/AdapterProduto.kt index 6d7afcc..27ece8a 100644 --- a/app/src/main/java/com/example/projetosaveit/adapter/AdapterProduto.kt +++ b/app/src/main/java/com/example/projetosaveit/adapter/AdapterProduto.kt @@ -3,6 +3,7 @@ package com.example.projetosaveit.adapter import android.app.AlertDialog import android.content.Intent import android.os.Bundle +import android.util.Log import android.view.LayoutInflater import android.view.View import java.util.Date @@ -19,7 +20,6 @@ import com.example.projetosaveit.R import com.example.projetosaveit.adapter.recycleView.Produto import com.example.projetosaveit.api.repository.EstoqueRepository import com.example.projetosaveit.api.repository.LoteRepository -import com.example.projetosaveit.api.repository.ProdutoRepository import com.example.projetosaveit.api.repository.VitrineRepository import com.example.projetosaveit.model.EstoqueDTO import com.example.projetosaveit.model.ProdutoInfoDTO @@ -38,7 +38,7 @@ class AdapterProduto : RecyclerView.Adapter() { var listProdutos = listOf() var repository : LoteRepository = LoteRepository() var repositoryVitrine : VitrineRepository = VitrineRepository() - var produtoRepository : ProdutoRepository = ProdutoRepository() + var repositoryEstoque : EstoqueRepository = EstoqueRepository() override fun onCreateViewHolder( parent: ViewGroup, @@ -85,7 +85,10 @@ class AdapterProduto : RecyclerView.Adapter() { cancelBtn.setOnClickListener { dialog.dismiss() } saveBtn.setOnClickListener { val quantidade = editQuantidade.text.toString().toInt() - val vitrineInsert : VitrineInsertDTO = VitrineInsertDTO("", produto.batchId, quantidade, Date()) + val sdf = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.getDefault()) + val currentDate = sdf.format(Date()) + + val vitrineInsert = VitrineInsertDTO("", produto.batchId, quantidade, currentDate) repositoryVitrine.postVitrine(vitrineInsert).enqueue(object : retrofit2.Callback { override fun onResponse( @@ -93,29 +96,26 @@ class AdapterProduto : RecyclerView.Adapter() { response: retrofit2.Response ) { if (response.isSuccessful) { + val apenasNumero = produto.quantity.filter { it.isDigit() } + val quantidadeAtual = apenasNumero.toInt() Toast.makeText(holder.itemView.context, "Produto adicionado à vitrine com sucesso!", Toast.LENGTH_LONG).show() - val updates = mapOf("quatity" to produto.quantity.toInt() - quantidade) - repository.patchProdutoId(produto.id, updates).enqueue(object : retrofit2.Callback { + var estoque : EstoqueDTO = EstoqueDTO(0, 0, quantidadeAtual - quantidade, produto.batchId, produto.id, 0, "", currentDate) + repositoryEstoque.postEstoque(estoque).enqueue(object : retrofit2.Callback { override fun onResponse( call: retrofit2.Call, response: retrofit2.Response ) { if (response.isSuccessful) { - var estoque : EstoqueDTO = EstoqueDTO(0, 0, produto.quantity.toInt() - quantidade, produto.batchId, produto.id, 0, "", LocalDateTime.now()) - produtoRepository.postProduto(estoque).enqueue(object : retrofit2.Callback { - override fun onResponse( - call: retrofit2.Call, - response: retrofit2.Response - ) { - if (response.isSuccessful) { - Toast.makeText(holder.itemView.context, "O estoque foi atualizado junto com inserção na vitrine", Toast.LENGTH_LONG).show() - } - } - - override fun onFailure(call: retrofit2.Call, t: Throwable) { - Toast.makeText(holder.itemView.context, "Erro ao atualizar estoque: ${t.message}", Toast.LENGTH_LONG).show() - } - }) + Toast.makeText(holder.itemView.context, "O estoque foi atualizado junto com inserção na vitrine", Toast.LENGTH_LONG).show() + }else { + val errorBodyString = try { + response.errorBody()?.string() + } catch (e: Exception) { + "Erro desconhecido ao ler o corpo de erro" + } + + Log.e("API_ERROR", "Erro na API: $errorBodyString") + Toast.makeText(context, errorBodyString ?: "Erro desconhecido", Toast.LENGTH_LONG).show() } } @@ -123,6 +123,15 @@ class AdapterProduto : RecyclerView.Adapter() { Toast.makeText(holder.itemView.context, "Erro ao atualizar estoque: ${t.message}", Toast.LENGTH_LONG).show() } }) + }else { + val errorBodyString = try { + response.errorBody()?.string() + } catch (e: Exception) { + "Erro desconhecido ao ler o corpo de erro" + } + + Log.e("API_ERROR", "Erro na API: $errorBodyString") + Toast.makeText(context, errorBodyString ?: "Erro desconhecido", Toast.LENGTH_LONG).show() } } @@ -140,7 +149,7 @@ class AdapterProduto : RecyclerView.Adapter() { } else -> { - repository.getProdutoId(produto.id).enqueue(object : retrofit2.Callback { + repository.getProdutoId(produto.batchId).enqueue(object : retrofit2.Callback { override fun onResponse( call: retrofit2.Call, response: retrofit2.Response @@ -174,6 +183,7 @@ class AdapterProduto : RecyclerView.Adapter() { bundle.putString("quantidadeMostrada", produto?.batchResponseDTO?.quantity.toString()) bundle.putString("marcaProduto", produto?.productResponseDTO?.brand) bundle.putString("skuProduto", produto?.batchResponseDTO?.batchCode) + bundle.putLong("idProduto", produto?.productResponseDTO?.id!!) val intent : Intent = Intent(holder.itemView.context, TelaEstoque::class.java) intent.putExtras(bundle) diff --git a/app/src/main/java/com/example/projetosaveit/api/network/ApiService.kt b/app/src/main/java/com/example/projetosaveit/api/network/ApiService.kt index f5e9561..3510f88 100644 --- a/app/src/main/java/com/example/projetosaveit/api/network/ApiService.kt +++ b/app/src/main/java/com/example/projetosaveit/api/network/ApiService.kt @@ -6,7 +6,6 @@ import com.example.projetosaveit.model.ChatDTO import com.example.projetosaveit.model.EmpresaDTO import com.example.projetosaveit.model.EmpresaInsertDTO import com.example.projetosaveit.model.EstoqueDTO -import com.example.projetosaveit.model.EstoqueInsertDTO import com.example.projetosaveit.model.FuncionarioDTO import com.example.projetosaveit.model.FuncionarioInsertDTO import com.example.projetosaveit.model.ImagemDTO @@ -14,6 +13,7 @@ import com.example.projetosaveit.model.LoteDTO import com.example.projetosaveit.model.LoteInsertDTO import com.example.projetosaveit.model.ProdutoInfoDTO import com.example.projetosaveit.model.RelatorioDTO +import com.example.projetosaveit.model.RelatorioProdutoDTO import com.example.projetosaveit.model.VitrineDTO import com.example.projetosaveit.model.VitrineInsertDTO import okhttp3.ResponseBody @@ -30,8 +30,18 @@ interface ApiService { // API de SQL - @POST("api/product/inserir") - fun postProduto(@Body estoque : EstoqueDTO) : Call + @GET("api/stock/relatorioProdutoPorProduto/{enterpriseId}/{productId}") + fun getRelatorioProduto(@Path("enterpriseId") enterpriseId: Long, @Path("productId") productId: Long + ): Call> + + @GET("api/stock/relatorioProduto/{enterpriseId}") + fun getRelatorioProdutos(@Path("enterpriseId") idEmpresa : Long): Call> + + @POST("/api/stock/inserir") + fun postEstoque(@Body estoque : EstoqueDTO) : Call + + @GET("/api/batch/selecionarSku/{sku}") + fun getBatchSku(@Path("sku") sku : String) : Call @GET("api/batch/listarProdutosLote/{enterpriseId}") fun getProdutos(@Path("enterpriseId") idEmpresa : Long): Call> @@ -81,15 +91,6 @@ interface ApiService { @GET("api/employee/buscarPorEmail/{email}") fun getFuncionarioEmail(@Path("email") email : String): Call - @GET("api/stock/relatorioProduto/{enterpriseId}") - fun getRelatorioProdutos(@Path("enterpriseId") idEmpresa : Long): Call> - - @GET("api/batch/selecionarSku/{sku}") - fun getBatchSku(@Path("sku") sku : String): Call - - @POST("api/stock/inserir") - fun postEstoque(@Body estoque : EstoqueInsertDTO) : Call - // API de Mongo @GET("chats/enterprise/{enterpriseId}") diff --git a/app/src/main/java/com/example/projetosaveit/api/network/RetrofitClientSql.kt b/app/src/main/java/com/example/projetosaveit/api/network/RetrofitClientSql.kt index e476829..f417f19 100644 --- a/app/src/main/java/com/example/projetosaveit/api/network/RetrofitClientSql.kt +++ b/app/src/main/java/com/example/projetosaveit/api/network/RetrofitClientSql.kt @@ -6,8 +6,8 @@ import okhttp3.OkHttpClient object RetrofitClientSql { - private const val BASE_URL = "https://apisaveit.onrender.com/" - private const val API_TOKEN = "essentiasaveit-193812-paoea-oei" + private const val BASE_URL = "https://apisaveit.onrender.com" + private const val API_TOKEN = "essentiasaveit-193812-paoea-oei" // mesmo que está nas variáveis de ambiente do Render private val client = OkHttpClient.Builder() .addInterceptor { chain -> @@ -28,4 +28,4 @@ object RetrofitClientSql { val instance: ApiService by lazy { retrofit.create(ApiService::class.java) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/example/projetosaveit/api/repository/EstoqueRepository.kt b/app/src/main/java/com/example/projetosaveit/api/repository/EstoqueRepository.kt index 49b9a19..f0f81a1 100644 --- a/app/src/main/java/com/example/projetosaveit/api/repository/EstoqueRepository.kt +++ b/app/src/main/java/com/example/projetosaveit/api/repository/EstoqueRepository.kt @@ -5,6 +5,7 @@ import com.example.projetosaveit.api.network.RetrofitClientSql import com.example.projetosaveit.model.EstoqueDTO import com.example.projetosaveit.model.EstoqueInsertDTO import com.example.projetosaveit.model.RelatorioDTO +import com.example.projetosaveit.model.RelatorioProdutoDTO import okhttp3.Response import okhttp3.ResponseBody import retrofit2.Call @@ -15,7 +16,11 @@ class EstoqueRepository { return RetrofitClientSql.instance.getRelatorioProdutos(enterpriseId) } - fun postEstoque(estoque: EstoqueInsertDTO) : Call { + fun postEstoque(estoque: EstoqueDTO) : Call { return RetrofitClientSql.instance.postEstoque(estoque) } + + fun getRelatorioProduto(enterpriseId : Long, productId : Long) : Call> { + return RetrofitClientSql.instance.getRelatorioProduto(enterpriseId, productId) + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/projetosaveit/api/repository/ProdutoRepository.kt b/app/src/main/java/com/example/projetosaveit/api/repository/ProdutoRepository.kt index 1be77e1..8717238 100644 --- a/app/src/main/java/com/example/projetosaveit/api/repository/ProdutoRepository.kt +++ b/app/src/main/java/com/example/projetosaveit/api/repository/ProdutoRepository.kt @@ -10,7 +10,5 @@ import retrofit2.Response class ProdutoRepository { - fun postProduto(estoque : EstoqueDTO) : Call { - return RetrofitClientSql.instance.postProduto(estoque) - } + // por enquanto nada... } \ No newline at end of file diff --git a/app/src/main/java/com/example/projetosaveit/model/EstoqueDTO.kt b/app/src/main/java/com/example/projetosaveit/model/EstoqueDTO.kt index 5562c63..1ad1e30 100644 --- a/app/src/main/java/com/example/projetosaveit/model/EstoqueDTO.kt +++ b/app/src/main/java/com/example/projetosaveit/model/EstoqueDTO.kt @@ -10,5 +10,5 @@ class EstoqueDTO ( var productId : Long, var discardQuantity : Int, var discardReason : String, - var createdAt : LocalDateTime + var createdAt : String ) \ No newline at end of file diff --git a/app/src/main/java/com/example/projetosaveit/model/RelatorioProdutoDTO.kt b/app/src/main/java/com/example/projetosaveit/model/RelatorioProdutoDTO.kt new file mode 100644 index 0000000..b2c4d69 --- /dev/null +++ b/app/src/main/java/com/example/projetosaveit/model/RelatorioProdutoDTO.kt @@ -0,0 +1,7 @@ +package com.example.projetosaveit.model + +data class RelatorioProdutoDTO( + val totalOutput: Int, + val mouthInput: Int +) { +} \ No newline at end of file diff --git a/app/src/main/java/com/example/projetosaveit/model/VitrineDTO.kt b/app/src/main/java/com/example/projetosaveit/model/VitrineDTO.kt index 573682e..8b01886 100644 --- a/app/src/main/java/com/example/projetosaveit/model/VitrineDTO.kt +++ b/app/src/main/java/com/example/projetosaveit/model/VitrineDTO.kt @@ -5,13 +5,11 @@ class VitrineDTO( var name: String, var description: String, var image: String, - var price: Double, - var productId: Long, var loteId: Long, var tipoPeso: String, var quantidadeGeral: Int, var empresa: String, var localizacao: String, - var validade: String + var validade: String, ) { } diff --git a/app/src/main/java/com/example/projetosaveit/model/VitrineInsertDTO.kt b/app/src/main/java/com/example/projetosaveit/model/VitrineInsertDTO.kt index e4f7749..f76929d 100644 --- a/app/src/main/java/com/example/projetosaveit/model/VitrineInsertDTO.kt +++ b/app/src/main/java/com/example/projetosaveit/model/VitrineInsertDTO.kt @@ -6,6 +6,6 @@ class VitrineInsertDTO( var description : String, var batchId : Long, var quantityShowcase : Int, - var entranceDate : Date + var entranceDate : String ) { } \ No newline at end of file diff --git a/app/src/main/java/com/example/projetosaveit/ui/AdicionarProduto.kt b/app/src/main/java/com/example/projetosaveit/ui/AdicionarProduto.kt index 448698d..28c9d9e 100644 --- a/app/src/main/java/com/example/projetosaveit/ui/AdicionarProduto.kt +++ b/app/src/main/java/com/example/projetosaveit/ui/AdicionarProduto.kt @@ -332,6 +332,7 @@ class AdicionarProduto : AppCompatActivity() { }, onError = { e -> Toast.makeText(this@AdicionarProduto, "Erro no upload: ${e.message}", Toast.LENGTH_SHORT).show() + Log.d(ContentValues.TAG, "Erro no upload: ${e.message}") } ) } @@ -410,8 +411,13 @@ class AdicionarProduto : AppCompatActivity() { } private fun openGallery() { - val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) - startActivityForResult(intent, REQUEST_IMAGE_PICK) + if (ContextCompat.checkSelfPermission(this@AdicionarProduto, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + requestCameraPermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE) + return + } else { + val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) + startActivityForResult(intent, REQUEST_IMAGE_PICK) + } } private fun openCamera() { diff --git a/app/src/main/java/com/example/projetosaveit/ui/CadastroEndereco.kt b/app/src/main/java/com/example/projetosaveit/ui/CadastroEndereco.kt index 33ce84e..567766d 100644 --- a/app/src/main/java/com/example/projetosaveit/ui/CadastroEndereco.kt +++ b/app/src/main/java/com/example/projetosaveit/ui/CadastroEndereco.kt @@ -54,19 +54,19 @@ class CadastroEndereco : AppCompatActivity() { val estadoEmpresa : String = findViewById(R.id.estadoEmpresaInput).text.toString() val complementoEmpresa : String = findViewById(R.id.complementoEmpresaInput).text.toString() - if (cepEmpresa == null) { + if (cepEmpresa.isEmpty()) { Toast.makeText(this@CadastroEndereco, "CEP não pode ser vazio", Toast.LENGTH_LONG).show() - }else if(ruaEmpresa == null) { + }else if(ruaEmpresa.isEmpty()) { Toast.makeText(this@CadastroEndereco, "A rua da empresa não pode ser vazia", Toast.LENGTH_LONG).show() - }else if(bairroEmpresa == null) { + }else if(bairroEmpresa.isEmpty()) { Toast.makeText(this@CadastroEndereco, "O bairro da empresa não pode ser vazio", Toast.LENGTH_LONG).show() - }else if(numeroEmpresa == null) { + }else if(numeroEmpresa.isEmpty()) { Toast.makeText(this@CadastroEndereco, "O número da empresa não pode ser vazio", Toast.LENGTH_LONG).show() - }else if(cidadeEmpresa == null) { + }else if(cidadeEmpresa.isEmpty()) { Toast.makeText(this@CadastroEndereco, "A cidade da empresa não pode ser vazio", Toast.LENGTH_LONG).show() - }else if (estadoEmpresa == null) { + }else if (estadoEmpresa.isEmpty()) { Toast.makeText(this@CadastroEndereco, "O estado da empresa não pode ser vazio", Toast.LENGTH_LONG).show() - }else if (complementoEmpresa == null) { + }else if (complementoEmpresa.isEmpty()) { Toast.makeText(this@CadastroEndereco, "O complemento da empresa não pode ser vazio", Toast.LENGTH_LONG).show() }else { @@ -122,6 +122,15 @@ class CadastroEndereco : AppCompatActivity() { ) { if(p1.isSuccessful) { Toast.makeText(this@CadastroEndereco, "Empresa cadastrada com sucesso!", Toast.LENGTH_LONG).show() + }else { + val errorBodyString = try { + p1.errorBody()?.string() + } catch (e: Exception) { + "Erro desconhecido ao ler o corpo de erro" + } + + Log.e("API_ERROR", "Erro na API: $errorBodyString") + Toast.makeText(this@CadastroEndereco, errorBodyString ?: "Erro desconhecido", Toast.LENGTH_LONG).show() } } diff --git a/app/src/main/java/com/example/projetosaveit/ui/ProdutoVitrine.kt b/app/src/main/java/com/example/projetosaveit/ui/ProdutoVitrine.kt index 12e63b5..12cfabc 100644 --- a/app/src/main/java/com/example/projetosaveit/ui/ProdutoVitrine.kt +++ b/app/src/main/java/com/example/projetosaveit/ui/ProdutoVitrine.kt @@ -1,5 +1,6 @@ package com.example.projetosaveit.ui +import android.annotation.SuppressLint import android.os.Bundle import android.view.View import android.widget.ImageView @@ -15,6 +16,7 @@ import java.util.Date import java.util.Locale class ProdutoVitrine : AppCompatActivity() { + @SuppressLint("SetTextI18n") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) this.enableEdgeToEdge() @@ -32,7 +34,7 @@ class ProdutoVitrine : AppCompatActivity() { val descricaoProduto = bundle?.getString("descricaoVitrine") val empresaVitrine = bundle?.getString("empresaVitrine") val validadeProduto = bundle?.getString("validadeVitrine") - val quantidadeVitreine = bundle?.getString("quantidadeVitrine") + val quantidadeVitrine = bundle?.getInt("quantidadeVitrine").toString() val pesoVitrine = bundle?.getString("pesoVitrine") val localizacaoVitrine = bundle?.getString("localizacaoVitrine") val imgProduto = bundle?.getString("imagemVitrine") @@ -44,7 +46,7 @@ class ProdutoVitrine : AppCompatActivity() { (findViewById(R.id.descricaoProdutoResult)).setText(descricaoProduto) (findViewById(R.id.empresaProdutoResult)).setText(empresaVitrine) (findViewById(R.id.validadeProdutoResult)).setText(validadeProduto) - (findViewById(R.id.pesoProdutoResult)).setText(quantidadeVitreine + " " + pesoVitrine) + (findViewById(R.id.pesoProdutoResult)).setText(quantidadeVitrine + " " + pesoVitrine) (findViewById(R.id.cidadeProdutoResult)).setText(localizacaoVitrine) (findViewById(R.id.setaEsquerdaVoltar)).setOnClickListener { diff --git a/app/src/main/java/com/example/projetosaveit/ui/TelaEstoque.kt b/app/src/main/java/com/example/projetosaveit/ui/TelaEstoque.kt index b34da81..0aa146b 100644 --- a/app/src/main/java/com/example/projetosaveit/ui/TelaEstoque.kt +++ b/app/src/main/java/com/example/projetosaveit/ui/TelaEstoque.kt @@ -1,16 +1,38 @@ package com.example.projetosaveit.ui import android.os.Bundle +import android.util.Log import android.widget.ProgressBar import android.widget.TextView +import android.widget.Toast +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.data.BarDataSet +import com.github.mikephil.charting.data.BarData +import com.github.mikephil.charting.data.BarEntry import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import com.bumptech.glide.Glide import com.example.projetosaveit.R +import com.example.projetosaveit.api.repository.EstoqueRepository +import com.example.projetosaveit.api.repository.VitrineRepository +import com.example.projetosaveit.model.RelatorioProdutoDTO +import com.example.projetosaveit.ui.CadastroEndereco +import com.example.projetosaveit.util.GetEmpresa +import com.github.mikephil.charting.components.XAxis +import com.google.firebase.auth.FirebaseAuth +import retrofit2.Call +import retrofit2.Response +import javax.security.auth.callback.Callback class TelaEstoque : AppCompatActivity() { + + val objAutenticar: FirebaseAuth = FirebaseAuth.getInstance() + var enterpriseId : Long = 0 + val repository : EstoqueRepository = EstoqueRepository() + + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() @@ -32,6 +54,8 @@ class TelaEstoque : AppCompatActivity() { findViewById(R.id.textView46).text = bundle.getString("quantidadeProduto") findViewById(R.id.textView25).text = bundle.getString("skuProduto") + val idProduto : Long = bundle.getLong("idProduto") + val quantidadeStr = bundle.getString("quantidadeMostrada") val quantidadeMaxStr = bundle.getString("quantidadeMaximaProduto") @@ -48,6 +72,80 @@ class TelaEstoque : AppCompatActivity() { .load(imageUrl) .into(findViewById(R.id.imageView28)) } + + val barChart = findViewById(R.id.barChart) + barChart.description.isEnabled = false + barChart.setDrawGridBackground(false) + barChart.setFitBars(true) + barChart.animateY(1500) + + GetEmpresa.pegarEmailEmpresa(objAutenticar.currentUser?.email!!) { empresa -> + if (empresa != null) { + enterpriseId = empresa.id + } + } + } } + + private fun getRelatorioProduto(productId : Long, enterpriseId : Long) { + repository.getRelatorioProduto(productId, enterpriseId).enqueue(object : retrofit2.Callback> { + override fun onResponse( + p0: Call?>, + p1: Response?> + ) { + if (p1.isSuccessful) { + mostrarGrafico(p1.body()!!) + }else { + val errorBodyString = try { + p1.errorBody()?.string() + } catch (e: Exception) { + "Erro desconhecido ao ler o corpo de erro" + } + + Log.e("API_ERROR", "Erro na API: $errorBodyString") + Toast.makeText(this@TelaEstoque, errorBodyString ?: "Erro desconhecido", Toast.LENGTH_LONG).show() } + } + + override fun onFailure( + p0: Call?>, + p1: Throwable + ) { + Toast.makeText(this@TelaEstoque, p1.message, Toast.LENGTH_LONG).show() + } + + }) + } + + private fun mostrarGrafico(dados: List) { + val barChart = findViewById(R.id.barChart) + + val entradasInput = ArrayList() + val entradasOutput = ArrayList() + + for ((index, item) in dados.withIndex()) { + entradasInput.add(BarEntry(index.toFloat(), item.mouthInput.toFloat())) + entradasOutput.add(BarEntry(index.toFloat(), item.totalOutput.toFloat())) + } + + val dataSetInput = BarDataSet(entradasInput, "Entradas") + dataSetInput.color = getColor(R.color.VerdeEscuro) + + val dataSetOutput = BarDataSet(entradasOutput, "Saídas") + dataSetOutput.color = getColor(R.color.Verde) + + val data = BarData(dataSetInput, dataSetOutput) + data.barWidth = 0.3f + + barChart.data = data + + val xAxis = barChart.xAxis + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.granularity = 1f + xAxis.setDrawGridLines(false) + + barChart.groupBars(0f, 0.4f, 0.05f) + barChart.invalidate() + } + } \ No newline at end of file diff --git a/app/src/main/java/com/example/projetosaveit/ui/cadastrarRelatorio/CadastrarRelatorio.kt b/app/src/main/java/com/example/projetosaveit/ui/cadastrarRelatorio/CadastrarRelatorio.kt index ba68949..a70c201 100644 --- a/app/src/main/java/com/example/projetosaveit/ui/cadastrarRelatorio/CadastrarRelatorio.kt +++ b/app/src/main/java/com/example/projetosaveit/ui/cadastrarRelatorio/CadastrarRelatorio.kt @@ -9,11 +9,13 @@ import androidx.fragment.app.Fragment import com.example.projetosaveit.api.repository.EstoqueRepository import com.example.projetosaveit.api.repository.LoteRepository import com.example.projetosaveit.databinding.FragmentCadastrarRelatorioBinding +import com.example.projetosaveit.model.EstoqueDTO import com.example.projetosaveit.model.EstoqueInsertDTO import com.example.projetosaveit.model.LoteDTO import com.google.firebase.auth.FirebaseAuth import okhttp3.ResponseBody import retrofit2.Call +import retrofit2.Callback import retrofit2.Response import java.time.LocalDateTime @@ -44,23 +46,24 @@ class CadastrarRelatorio : Fragment() { val createdAt = LocalDateTime.now() - loteRepository.getLoteSku(sku).enqueue(object : retrofit2.Callback { + loteRepository.getLoteSku(sku).enqueue(object : Callback { override fun onResponse(call: Call, response: Response) { if (response.isSuccessful) { val lote = response.body() if (lote != null) { - val estoqueDto = EstoqueInsertDTO( + val estoqueDto = EstoqueDTO( quantityInput = qntdProd.toInt(), quantityOutput = qntdSaida.toInt(), createdAt = createdAt.toString(), productId = lote.productId, batchId = lote.id, discardReason = motivoDescarte, - discardQuantity = qntdDescarte.toInt() + discardQuantity = qntdDescarte.toInt(), + id = 0 ) estoqueRepository.postEstoque(estoqueDto) - .enqueue(object : retrofit2.Callback { + .enqueue(object : Callback { override fun onResponse( call: Call, response: Response diff --git a/app/src/main/java/com/example/projetosaveit/ui/home/HomeFragment.kt b/app/src/main/java/com/example/projetosaveit/ui/home/HomeFragment.kt index 6585893..e0431b0 100644 --- a/app/src/main/java/com/example/projetosaveit/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/example/projetosaveit/ui/home/HomeFragment.kt @@ -88,9 +88,14 @@ class HomeFragment : Fragment() { Log.d("teste", "getEmpresa body=${response.body()}") onResult(response.body()) } else { - val err = try { response.errorBody()?.string() } catch (e: Exception) { "erro lendo body" } - Log.e("erro", "getEmpresa erro do servidor: code=${response.code()} body=$err") - onResult(null) + val errorBodyString = try { + response.errorBody()?.string() + } catch (e: Exception) { + "Erro desconhecido ao ler o corpo de erro" + } + + Log.e("API_ERROR", "Erro na API: $errorBodyString") + Toast.makeText(context, errorBodyString ?: "Erro desconhecido", Toast.LENGTH_LONG).show() } } diff --git a/app/src/main/java/com/example/projetosaveit/ui/vitrine/VitrineFragment.kt b/app/src/main/java/com/example/projetosaveit/ui/vitrine/VitrineFragment.kt index f64893e..3d20fcf 100644 --- a/app/src/main/java/com/example/projetosaveit/ui/vitrine/VitrineFragment.kt +++ b/app/src/main/java/com/example/projetosaveit/ui/vitrine/VitrineFragment.kt @@ -2,6 +2,7 @@ package com.example.projetosaveit.ui.vitrine import android.content.Intent import android.os.Bundle +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -16,6 +17,7 @@ import com.example.projetosaveit.api.repository.VitrineRepository import com.example.projetosaveit.databinding.FragmentVitrineBinding import com.example.projetosaveit.model.VitrineDTO import com.example.projetosaveit.ui.AdicionarProdutoVitrine +import com.example.projetosaveit.ui.CadastroEndereco import retrofit2.Call import retrofit2.Response @@ -34,15 +36,15 @@ class VitrineFragment : Fragment() { binding = FragmentVitrineBinding.inflate(inflater, container, false) val root: View = binding!!.root - val botoes = listOf(binding!!.button9, binding!!.button15, binding!!.button14) + val botoes = listOf(binding!!.todosFiltro, binding!!.embutidosFiltro, binding!!.lacticiniosFiltro, binding!!.graosFIltro, binding!!.frutasFiltro, binding!!.salgadosFiltro) botoes.forEach { botao -> - botao.setOnClickListener { - botoes.forEach { it.isSelected = false } + botao?.setOnClickListener { + botoes.forEach { it?.isSelected = false } botao.isSelected = true - botoes.forEach { it.setBackgroundResource(R.drawable.bt_filtro_estilizacao) - it.setTextColor(resources.getColor(R.color.BrancoNaoPuro))} + botoes.forEach { it?.setBackgroundResource(R.drawable.bt_filtro_estilizacao) + it?.setTextColor(resources.getColor(R.color.BrancoNaoPuro))} botao.setBackgroundResource(R.drawable.bt_filtro_estilizacao_selecionado) botao.setTextColor(resources.getColor(R.color.PretoNaoPuro)) @@ -65,6 +67,7 @@ class VitrineFragment : Fragment() { binding!!.rvVitrine.adapter = adapter binding!!.rvVitrine.setLayoutManager(StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)) + carregarVitrine("Todos") return root } @@ -80,7 +83,14 @@ class VitrineFragment : Fragment() { adapter.listVitrine = produtos ?: emptyList() adapter.notifyDataSetChanged() } else { - Toast.makeText(context, "Falha ao carregar a vitrine", Toast.LENGTH_LONG).show() + val errorBodyString = try { + response.errorBody()?.string() + } catch (e: Exception) { + "Erro desconhecido ao ler o corpo de erro" + } + + Log.e("API_ERROR", "Erro na API: $errorBodyString") + Toast.makeText(context, errorBodyString ?: "Erro desconhecido", Toast.LENGTH_LONG).show() } } diff --git a/app/src/main/res/layout-sw600dp/activity_login.xml b/app/src/main/res/layout-sw600dp/activity_login.xml index 69e024e..340ce8a 100644 --- a/app/src/main/res/layout-sw600dp/activity_login.xml +++ b/app/src/main/res/layout-sw600dp/activity_login.xml @@ -12,10 +12,11 @@ @@ -27,7 +28,7 @@ android:fontFamily="@font/inclusive_sans" android:text="SaveIt" android:textColor="@color/PretoNaoPuro" - android:textSize="24sp" + android:textSize="48sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.493" @@ -45,14 +46,14 @@ android:textSize="24sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.198" + app:layout_constraintHorizontal_bias="0.197" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/senhaLogin" - app:layout_constraintVertical_bias="0.081" /> + app:layout_constraintVertical_bias="0.09" /> @@ -77,22 +78,22 @@ android:textSize="24sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.117" + app:layout_constraintHorizontal_bias="0.118" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/imageView3" - app:layout_constraintVertical_bias="0.305" /> + app:layout_constraintVertical_bias="0.31" /> @@ -122,7 +122,6 @@ android:id="@+id/botaoLogin" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="4dp" android:background="@drawable/bt_cadastro_estilizacao_tablet" android:fontFamily="@font/inclusive_sans" android:gravity="center_vertical" @@ -135,43 +134,47 @@ android:textColorHighlight="@color/BrancoNaoPuro" android:textColorHint="@color/BrancoNaoPuro" android:textColorLink="@color/BrancoNaoPuro" - android:textSize="24sp" + android:textSize="20sp" app:layout_constraintBottom_toTopOf="@+id/btnCadastro" app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.502" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/esqueciSenha" /> + app:layout_constraintTop_toBottomOf="@+id/esqueciSenha" + app:layout_constraintVertical_bias="0.458" /> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.934" /> \ No newline at end of file diff --git a/app/src/main/res/layout-sw600dp/fragment_vitrine.xml b/app/src/main/res/layout-sw600dp/fragment_vitrine.xml index c19fa3b..df045af 100644 --- a/app/src/main/res/layout-sw600dp/fragment_vitrine.xml +++ b/app/src/main/res/layout-sw600dp/fragment_vitrine.xml @@ -52,7 +52,7 @@ app:layout_constraintVertical_bias="0.213">