Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.example.consultacnpj
- import android.os.Bundle
- import androidx.core.net.toUri
- import androidx.compose.ui.text.style.TextAlign
- import androidx.compose.ui.platform.LocalContext
- import android.content.Intent
- import android.net.Uri
- import androidx.activity.ComponentActivity
- import androidx.activity.compose.setContent
- import androidx.compose.foundation.layout.*
- import androidx.compose.foundation.rememberScrollState
- import androidx.compose.foundation.verticalScroll
- import androidx.compose.material.icons.Icons
- import androidx.compose.material.icons.filled.*
- import androidx.compose.material.icons.automirrored.filled.List
- import androidx.compose.material.icons.automirrored.filled.Assignment
- import androidx.compose.material3.*
- import androidx.compose.runtime.*
- import androidx.compose.ui.Alignment
- import androidx.compose.ui.Modifier
- import androidx.compose.ui.graphics.Color
- import androidx.compose.ui.unit.dp
- import com.example.consultacnpj.ui.theme.ConsultaCNPJTheme
- import kotlinx.coroutines.launch
- import java.text.NumberFormat
- import java.util.Locale
- @OptIn(ExperimentalMaterial3Api::class)
- class MainActivity : ComponentActivity() {
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContent {
- ConsultaCNPJTheme {
- Scaffold(
- topBar = {
- TopAppBar(
- title = { Text("TM Consultas", color = Color.White) },
- navigationIcon = {
- Icon(Icons.Filled.Business, contentDescription = null, tint = Color.White)
- },
- colors = TopAppBarDefaults.topAppBarColors(
- containerColor = Color(0xFF0D47A1)
- )
- )
- },
- bottomBar = {
- Box(
- modifier = Modifier
- .fillMaxWidth()
- .padding(8.dp),
- contentAlignment = Alignment.Center
- ) {
- Text(
- text = "Feito por Marcio Luciano – Para Tassia Tiana",
- style = MaterialTheme.typography.titleSmall, // fonte mais bonita
- color = Color.Gray,
- textAlign = TextAlign.Center
- )
- }
- },
- modifier = Modifier.fillMaxSize()
- ) { paddingValues ->
- ConsultaCnpjApp(modifier = Modifier.padding(paddingValues))
- }
- }
- }
- }
- }
- @OptIn(ExperimentalMaterial3Api::class)
- @Composable
- fun ConsultaCnpjApp(modifier: Modifier = Modifier) {
- var cnpj by remember { mutableStateOf("") }
- var dados by remember { mutableStateOf<CnpjResponse?>(null) }
- var carregando by remember { mutableStateOf(false) }
- var consultaRealizada by remember { mutableStateOf(false) }
- val scope = rememberCoroutineScope()
- val scrollState = rememberScrollState()
- Column(
- modifier = modifier
- .fillMaxSize()
- .padding(16.dp)
- .verticalScroll(scrollState),
- horizontalAlignment = Alignment.CenterHorizontally
- ) {
- OutlinedCard(
- modifier = Modifier.fillMaxWidth(),
- colors = CardDefaults.outlinedCardColors(
- containerColor = MaterialTheme.colorScheme.surface
- )
- ) {
- Column(modifier = Modifier.padding(16.dp)) {
- Text("Digite para consultar os dados da empresa.",
- style = MaterialTheme.typography.titleMedium)
- Spacer(modifier = Modifier.height(12.dp))
- OutlinedTextField(
- value = cnpj,
- onValueChange = { input -> cnpj = input.filter { it.isDigit() } },
- label = { Text("Digite o CNPJ") },
- placeholder = { Text("Ex: 32956169000106") },
- leadingIcon = { Icon(Icons.Filled.Search, contentDescription = null) },
- modifier = Modifier.fillMaxWidth()
- )
- if (cnpj.isNotBlank() && cnpj.length < 14) {
- Text("CNPJ incompleto (precisa ter 14 dígitos).",
- color = Color(0xFFE57373),
- style = MaterialTheme.typography.bodySmall,
- modifier = Modifier.padding(top = 4.dp))
- }
- Text("Digite apenas números, sem pontos ou traços.",
- style = MaterialTheme.typography.bodySmall,
- modifier = Modifier.padding(top = 4.dp))
- Spacer(modifier = Modifier.height(12.dp))
- Button(
- onClick = {
- scope.launch {
- carregando = true
- consultaRealizada = true
- try {
- val resposta = RetrofitInstance.api.consultarCNPJ(cnpj)
- dados = if (resposta.isSuccessful) resposta.body() else null
- } catch (_: Exception) {
- dados = null
- }
- carregando = false
- }
- },
- enabled = cnpj.length == 14,
- modifier = Modifier.fillMaxWidth(),
- colors = ButtonDefaults.buttonColors(
- containerColor = Color(0xFF0D47A1), // Azul executivo
- contentColor = Color.White
- )
- ) {
- Icon(Icons.Filled.PlayArrow, contentDescription = null, tint = Color.White)
- Spacer(modifier = Modifier.width(8.dp))
- Text("Consultar")
- }
- }
- }
- Spacer(modifier = Modifier.height(16.dp))
- if (carregando) {
- CircularProgressIndicator()
- } else {
- if (consultaRealizada) {
- dados?.let {
- InfoCard("Registro", Icons.Filled.Info) {
- Text("CNPJ: ${it.cnpj}")
- Text("Data de Abertura: ${it.abertura}")
- Text("Última Atualização: ${it.ultimaAtualizacao}")
- }
- HorizontalDivider()
- InfoCard("Dados da Empresa", Icons.Filled.Business) {
- Text("Nome: ${it.nome}")
- Text("Fantasia: ${it.fantasia}")
- }
- HorizontalDivider()
- InfoCard("Situação Cadastral", Icons.Filled.CheckCircle) {
- val corSituacao = if (it.situacao == "ATIVA") Color(0xFF4CAF50) else Color(0xFFE57373)
- Text("Situação: ${it.situacao} (desde ${it.dataSituacao})", color = corSituacao)
- }
- HorizontalDivider()
- InfoCard("Contato", Icons.Filled.Phone) {
- Text("Telefone: ${it.telefone}")
- Text("Email: ${it.email}")
- }
- HorizontalDivider()
- InfoCard("Endereço", Icons.Filled.LocationOn) {
- Text("${it.logradouro}, ${it.numero}, ${it.bairro}")
- Text("${it.municipio} - ${it.uf}, CEP: ${it.cep}")
- }
- // Botão aparece se o endereço não for vazio
- if (!it.logradouro.isNullOrBlank()) {
- Spacer(modifier = Modifier.height(12.dp))
- val context = LocalContext.current
- Button(onClick = {
- val enderecoEmpresa = "${it.logradouro}, ${it.numero}, ${it.bairro}, ${it.municipio} - ${it.uf}"
- val gmmIntentUri = "https://www.google.com/maps/search/?api=1&query=${Uri.encode(enderecoEmpresa)}".toUri()
- val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
- mapIntent.setPackage("com.google.android.apps.maps")
- context.startActivity(mapIntent)
- }) {
- Icon(Icons.Filled.LocationOn, contentDescription = null)
- Spacer(modifier = Modifier.width(8.dp))
- Text("Encontrar esta empresa no Maps")
- }
- }
- HorizontalDivider()
- InfoCard("Atividade Principal", Icons.Filled.Work) {
- Text(it.atividadePrincipal?.firstOrNull()?.descricao ?: "")
- }
- HorizontalDivider()
- InfoCard("Atividades Secundárias", Icons.AutoMirrored.Filled.List) {
- it.atividadesSecundarias?.forEach { atividade ->
- Text("- ${atividade.descricao}")
- }
- }
- HorizontalDivider()
- InfoCard("Informações Jurídicas", Icons.Filled.Gavel) {
- Text("Natureza Jurídica: ${it.naturezaJuridica}")
- val capitalFormatado = try {
- val valor = it.capitalSocial?.replace(",", ".")?.toDoubleOrNull()
- if (valor != null) NumberFormat.getCurrencyInstance(Locale.forLanguageTag("pt-BR")).format(valor)
- else "-"
- } catch (_: Exception) {
- "-"
- }
- Text("Capital Social: $capitalFormatado")
- }
- HorizontalDivider()
- InfoCard("Simples Nacional", Icons.AutoMirrored.Filled.Assignment) {
- Text("Optante: ${if (it.simples?.optante == true) "Sim" else "Não"}")
- Text("Data de Opção: ${it.simples?.dataOpcao ?: "-"}")
- Text("Data de Exclusão: ${it.simples?.dataExclusao ?: "-"}")
- }
- HorizontalDivider()
- InfoCard("Sócios/Administradores", Icons.Filled.People) {
- it.socios?.forEach { socio ->
- Text("- ${socio.nome} (${socio.qualificacao})")
- }
- }
- } ?: run {
- if (cnpj.isNotBlank()) {
- Row(
- verticalAlignment = Alignment.CenterVertically,
- horizontalArrangement = Arrangement.Center,
- modifier = Modifier.fillMaxWidth()
- ) {
- Icon(Icons.Filled.ErrorOutline, contentDescription = null, tint = Color(0xFFE57373))
- Spacer(modifier = Modifier.width(8.dp))
- Text("CNPJ inexistente, confira!", color = Color(0xFFE57373))
- }
- }
- }
- }
- }
- }
- }
- @OptIn(ExperimentalMaterial3Api::class)
- @Composable
- fun InfoCard(
- titulo: String,
- icone: androidx.compose.ui.graphics.vector.ImageVector,
- conteudo: @Composable ColumnScope.() -> Unit
- ) {
- OutlinedCard(
- modifier = Modifier
- .fillMaxWidth()
- .padding(vertical = 8.dp),
- colors = CardDefaults.outlinedCardColors()
- ) {
- Column(modifier = Modifier.padding(12.dp)) {
- Row(verticalAlignment = Alignment.CenterVertically) {
- Icon(icone, contentDescription = null, tint = MaterialTheme.colorScheme.primary)
- Spacer(modifier = Modifier.width(8.dp))
- Text(titulo, style = MaterialTheme.typography.titleMedium)
- }
- Spacer(modifier = Modifier.height(4.dp))
- conteudo()
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment