ajustes no front e finalizado o salvamento dos dados no DB
This commit is contained in:
@@ -100,7 +100,8 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||
children: [
|
||||
InputSearchText(
|
||||
hint: 'Busca cidadão (Por NOME ou CNS ou PRONTUÁRIO ou DATA NASCIMENTO)',
|
||||
fontSize: 10,
|
||||
fontSize: 20,
|
||||
fontSizeHint: 11,
|
||||
controller: inputSearch,
|
||||
width: width*0.72,
|
||||
),
|
||||
|
||||
@@ -25,7 +25,6 @@ class _LoginLoadScreenState extends State<LoginLoadScreen> {
|
||||
String error = '';
|
||||
String? now;
|
||||
String? selectCity;
|
||||
bool validatorDropDown= false;
|
||||
int contLogo = 0;
|
||||
String mode = 'desenvolvimento';
|
||||
String urlAPI = UrlApiConst.ApiUrlDesenvolvimento;
|
||||
@@ -35,6 +34,7 @@ class _LoginLoadScreenState extends State<LoginLoadScreen> {
|
||||
String codState = '';
|
||||
int codCity = 0;
|
||||
int codCityIbge = 0;
|
||||
bool mandatory = false;
|
||||
|
||||
final PrefService _prefService = PrefService();
|
||||
checkLogin()async{
|
||||
@@ -115,9 +115,9 @@ class _LoginLoadScreenState extends State<LoginLoadScreen> {
|
||||
}
|
||||
});
|
||||
}else{
|
||||
setState(() {
|
||||
error = 'Selecione sua cidade';
|
||||
});
|
||||
error = 'Selecione sua cidade';
|
||||
mandatory = true;
|
||||
setState(() {});
|
||||
}
|
||||
}else{
|
||||
setState(() {
|
||||
@@ -187,7 +187,7 @@ class _LoginLoadScreenState extends State<LoginLoadScreen> {
|
||||
children: [
|
||||
InputText(
|
||||
hint: 'Usuário',
|
||||
label: inputUser.text.isNotEmpty?'':'Usuário',
|
||||
label: 'Usuário',
|
||||
controller: inputUser,
|
||||
width: width*0.6,
|
||||
colorBorder: Colors.white,
|
||||
@@ -195,7 +195,7 @@ class _LoginLoadScreenState extends State<LoginLoadScreen> {
|
||||
),
|
||||
InputText(
|
||||
hint: 'Senha',
|
||||
label: inputPassword.text.isNotEmpty?'':'Senha',
|
||||
label: 'Senha',
|
||||
obscure: true,
|
||||
controller: inputPassword,
|
||||
width: width*0.6,
|
||||
@@ -204,12 +204,12 @@ class _LoginLoadScreenState extends State<LoginLoadScreen> {
|
||||
),
|
||||
DropDownButtonCity(
|
||||
error: 'Campo obrigatório',
|
||||
validator: validatorDropDown,
|
||||
validator: mandatory,
|
||||
select: selectCity,
|
||||
onChanged: (value){
|
||||
setState(() {
|
||||
selectCity = value!;
|
||||
validatorDropDown = true;
|
||||
mandatory = false;
|
||||
});
|
||||
},
|
||||
),
|
||||
|
||||
@@ -585,7 +585,7 @@ class _RegisterCitizenScreenState extends State<RegisterCitizenScreen> {
|
||||
selectCountry = widget.listData[0]['ID_PAIS_RESID']==33?'BRASIL':'OUTRO';
|
||||
int codCity = widget.listData[0]['ID_MUNICIPIO_RESID'];
|
||||
List listCity = await DBQuerys().buscaMunicipioporId(codCity);
|
||||
cityController.text = listCity[0]['NO_MUNICIPIO'];
|
||||
cityController.text = listCity[0]['NO_MUNICIPIO']+listCity.length!=0?' - SP':'';
|
||||
resultListResid = listCity;
|
||||
codIBGEController.text = listCity[0]['CODIGO_IBGE'];
|
||||
selectVillage = widget.listData[0]['NO_BAIRRO_LOGR'];
|
||||
@@ -800,31 +800,33 @@ class _RegisterCitizenScreenState extends State<RegisterCitizenScreen> {
|
||||
),
|
||||
selectGender==null && mandatory?ErrorDefault():Container(),
|
||||
Container(
|
||||
width: width*0.75,
|
||||
child: Row(
|
||||
children: [
|
||||
GestureDetector(
|
||||
onTap:edit?null: ()=>escolherprazoInicio(context,'birth'),
|
||||
child: Container(
|
||||
alignment: Alignment.centerLeft,
|
||||
height: 58,
|
||||
margin: EdgeInsets.symmetric(horizontal: 15,vertical: 5),
|
||||
padding: EdgeInsets.symmetric(horizontal: 8,vertical: 10),
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(color: ColorPalette.white),
|
||||
borderRadius: BorderRadius.all(
|
||||
Radius.circular(5.0)
|
||||
),
|
||||
),
|
||||
width: width*0.7,
|
||||
child: TextDefault(
|
||||
text: date,
|
||||
color: Colors.black,
|
||||
fontSize: 16,
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
width: width*0.7,
|
||||
child: TextDefault(
|
||||
textAlign: TextAlign.start,
|
||||
text: 'Data de Nascimento',
|
||||
color: ColorPalette.black54,
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
GestureDetector(
|
||||
onTap:edit?null: ()=>escolherprazoInicio(context,'birth'),
|
||||
child: Container(
|
||||
alignment: Alignment.centerLeft,
|
||||
height: 58,
|
||||
margin: EdgeInsets.symmetric(horizontal: 15,vertical: 5),
|
||||
padding: EdgeInsets.symmetric(horizontal: 8,vertical: 10),
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(color: ColorPalette.white),
|
||||
borderRadius: BorderRadius.all(
|
||||
Radius.circular(5.0)
|
||||
),
|
||||
),
|
||||
width: width*0.7,
|
||||
child: TextDefault(
|
||||
text: date,
|
||||
color: Colors.black,
|
||||
fontSize: 16,
|
||||
),
|
||||
),
|
||||
),
|
||||
date == 'Data de Nascimento'&& mandatory?ErrorDefault():Container(),
|
||||
@@ -1804,6 +1806,15 @@ class _RegisterCitizenScreenState extends State<RegisterCitizenScreen> {
|
||||
mandatory: false,
|
||||
onChanged: (v)=>setState((){}),
|
||||
),
|
||||
Container(
|
||||
width: width*0.7,
|
||||
child: TextDefault(
|
||||
textAlign: TextAlign.start,
|
||||
text: 'RG - Data de Emissão',
|
||||
color: ColorPalette.black54,
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
GestureDetector(
|
||||
onTap:edit?null: ()=>escolherprazoInicio(context,'rg'),
|
||||
child: Container(
|
||||
@@ -1905,6 +1916,15 @@ class _RegisterCitizenScreenState extends State<RegisterCitizenScreen> {
|
||||
enabled: !edit,
|
||||
onChanged: (v)=>setState((){}),
|
||||
),
|
||||
Container(
|
||||
width: width*0.7,
|
||||
child: TextDefault(
|
||||
textAlign: TextAlign.start,
|
||||
text: 'Data de Emissão da Certidão',
|
||||
color: ColorPalette.black54,
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
GestureDetector(
|
||||
onTap:edit?null: ()=>escolherprazoInicio(context,'cert'),
|
||||
child: Container(
|
||||
@@ -2076,6 +2096,15 @@ class _RegisterCitizenScreenState extends State<RegisterCitizenScreen> {
|
||||
enabled: !edit,
|
||||
onChanged: (v)=>setState((){}),
|
||||
),
|
||||
Container(
|
||||
width: width*0.7,
|
||||
child: TextDefault(
|
||||
textAlign: TextAlign.start,
|
||||
text: 'Data Óbito',
|
||||
color: ColorPalette.black54,
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
GestureDetector(
|
||||
onTap:edit?null: ()=>escolherprazoInicio(context,'death'),
|
||||
child: Container(
|
||||
|
||||
@@ -5,9 +5,12 @@ import 'package:rkm/config/const_variable.dart';
|
||||
import 'package:rkm/service/db/db_querys.dart';
|
||||
import 'package:rkm/widgets/button_default.dart';
|
||||
import 'package:rkm/widgets/title_containers.dart';
|
||||
import '../../service/db/db_sqlite_sync.dart';
|
||||
import '../../service/shared_preferences/shared_preferences_service.dart';
|
||||
import '../../widgets/alert_dialog_default.dart';
|
||||
import '../../widgets/appbar_default.dart';
|
||||
import '../../widgets/dropdown_with_subtitle.dart';
|
||||
import '../../widgets/error_default.dart';
|
||||
import '../../widgets/input_with_subtitle.dart';
|
||||
import '../../widgets/onbackbutton.dart';
|
||||
import '../../widgets/subtitle_appbar_citizen.dart';
|
||||
@@ -26,7 +29,7 @@ class _RegisterHomeScreenState extends State<RegisterHomeScreen> {
|
||||
var QTDE_ANIMAIS = TextEditingController();
|
||||
var NUM_COMODOS = TextEditingController();
|
||||
var NUM_MORADORES = TextEditingController();
|
||||
var ID_RESP_CADASTRO = TextEditingController();
|
||||
var NOME_RESP_CADASTRO = TextEditingController();
|
||||
var CNES_RESP_CADASTRO = TextEditingController();
|
||||
var DT_CADASTRO = TextEditingController();
|
||||
|
||||
@@ -41,6 +44,7 @@ class _RegisterHomeScreenState extends State<RegisterHomeScreen> {
|
||||
bool editing = false;
|
||||
bool mandatory = false;
|
||||
bool CNS_VALIDO = false;
|
||||
bool showCheckError = false;
|
||||
|
||||
List<String> listTypeHome = [];
|
||||
List<String> listINE = [];
|
||||
@@ -75,8 +79,17 @@ class _RegisterHomeScreenState extends State<RegisterHomeScreen> {
|
||||
String? ESCOAMENTO;
|
||||
String? CBO_RESP_CADASTRO;
|
||||
String? INE_RESP_CADASTRO;
|
||||
String? NOME_INSTITUICAO_PERMANENCIA;
|
||||
String? PROFISSIONAIS_VINCULADOS_INST;
|
||||
String? RESPONSAVEL_TECNICO_INST;
|
||||
String? CARGO_RESP_TECNICO_INST;
|
||||
String? TEL_RESP_TECNICO_INST;
|
||||
int ID_CIDADAO=0;
|
||||
String date_cad = '';
|
||||
String TIPO_SALVAR = 'new';
|
||||
|
||||
int ID_RESP_CADASTRO=0;
|
||||
int ID_DOMICILIO=0;
|
||||
int ID_AREA_DOMICILIO=0;
|
||||
int ID_MICROAREA_DOMICILIO=0;
|
||||
int TIPO_IMOVEL_COD = 0;
|
||||
@@ -90,6 +103,7 @@ class _RegisterHomeScreenState extends State<RegisterHomeScreen> {
|
||||
int TRATAMENTO_AGUA_COD = 0;
|
||||
int DESTINO_LIXO_COD = 0;
|
||||
int ESCOAMENTO_COD = 0;
|
||||
int ID_EQUIPE = 0;
|
||||
|
||||
escolherprazoInicio(BuildContext context) async {
|
||||
var pickDate = await showDatePicker(
|
||||
@@ -165,9 +179,13 @@ class _RegisterHomeScreenState extends State<RegisterHomeScreen> {
|
||||
}
|
||||
|
||||
loadRegisterHome()async{
|
||||
int ID_DOMICILIO = widget.listData[0]['ID_DOMICILIO'];
|
||||
ID_DOMICILIO = widget.listData[0]['ID_DOMICILIO'];
|
||||
ID_CIDADAO = widget.listData[0]['ID_CIDADAO'];
|
||||
DBQuerys().buscaCadDomiciliar(ID_DOMICILIO).then((dataHome)async{
|
||||
TIPO_IMOVEL_COD = dataHome[0]['TIPO_IMOVEL']??0;
|
||||
if(dataHome.length!=0){
|
||||
TIPO_SALVAR = 'update';
|
||||
}
|
||||
for (int i = 0; ConstVariable().listTypeHome.length > i; i++) {
|
||||
if (ConstVariable().listTypeHome[i].cod == TIPO_IMOVEL_COD) {
|
||||
TIPO_IMOVEL = ConstVariable().listTypeHome[i].title;
|
||||
@@ -251,6 +269,13 @@ class _RegisterHomeScreenState extends State<RegisterHomeScreen> {
|
||||
date_cad = dataHome[0]['DT_CADASTRO']??'';
|
||||
List splitted = date_cad.toString().split('-');
|
||||
DT_CADASTRO.text = splitted.length<2?'':'${splitted[2]}/${splitted[1]}/${splitted[0]}';
|
||||
print(DT_CADASTRO.text);
|
||||
ID_EQUIPE = dataHome[0]['ID_EQUIPE']??0;
|
||||
NOME_INSTITUICAO_PERMANENCIA = dataHome[0]['NOME_INSTITUICAO_PERMANENCIA'];
|
||||
PROFISSIONAIS_VINCULADOS_INST = dataHome[0]['PROFISSIONAIS_VINCULADOS_INST'];
|
||||
RESPONSAVEL_TECNICO_INST = dataHome[0]['RESPONSAVEL_TECNICO_INST'];
|
||||
CARGO_RESP_TECNICO_INST = dataHome[0]['CARGO_RESP_TECNICO_INST'];
|
||||
TEL_RESP_TECNICO_INST = dataHome[0]['TEL_RESP_TECNICO_INST'];
|
||||
await DBQuerys().buscaCBOProfissional(idUsuario).then((list){
|
||||
if(list.length!=0){
|
||||
for(int i = 0; list.length>i;i++){
|
||||
@@ -261,17 +286,14 @@ class _RegisterHomeScreenState extends State<RegisterHomeScreen> {
|
||||
setState(() {});
|
||||
});
|
||||
});
|
||||
await DBQuerys().buscaProfissionalCadInd(idUsuario).then((list)async{
|
||||
ID_RESP_CADASTRO.text = list['NOME_PROFISSIONAL'];
|
||||
CNES_RESP_CADASTRO.text = await DBQuerys().buscaNomeUnidade(idUnidade);
|
||||
});
|
||||
List list = await DBQuerys().buscaDadosProfissional(idUnidade,idUsuario);
|
||||
for(int i=0; list.length > i;i++){
|
||||
INE_RESP_CADASTRO = 'INE: ${list[i]['INE']} / Área: ${list[i]['AREA']} - Microárea : ${list[i]['MICROAREA']}';
|
||||
listINEPROF.add('INE: ${list[i]['INE']} / Área: ${list[i]['AREA']} - Microárea : ${list[i]['MICROAREA']}');
|
||||
}
|
||||
await DBQuerys().buscaProfissionalCadInd(idUsuario).then((list){
|
||||
ID_RESP_CADASTRO.text = list['NOME_PROFISSIONAL'];
|
||||
ID_RESP_CADASTRO = list['ID_PROFISSIONAL'];
|
||||
NOME_RESP_CADASTRO.text = list['NOME_PROFISSIONAL'];
|
||||
String CNS_PROFISSIONAL = list['CNS_PROFISSIONAL'];
|
||||
if(CNS_PROFISSIONAL == 999999999999999 || CNS_PROFISSIONAL == '999999999999999'){
|
||||
CNS_VALIDO = true;
|
||||
@@ -280,6 +302,77 @@ class _RegisterHomeScreenState extends State<RegisterHomeScreen> {
|
||||
setState(() {});
|
||||
}
|
||||
|
||||
checkSave()async{
|
||||
// adicionar depois e usar um usuário real
|
||||
// CBO_RESP_CADASTRO
|
||||
//ok
|
||||
if(TIPO_IMOVEL==null || DT_CADASTRO.text.isEmpty ){
|
||||
print('erro');
|
||||
setState(() {
|
||||
showCheckError = true;
|
||||
mandatory = true;
|
||||
});
|
||||
}else{
|
||||
print('passou');
|
||||
mandatory = false;
|
||||
showCheckError = false;
|
||||
setState(() {});
|
||||
saveCitizenHome();
|
||||
}
|
||||
}
|
||||
|
||||
saveCitizenHome()async{
|
||||
Map<String, dynamic> row = {
|
||||
'TIPO_IMOVEL' : TIPO_IMOVEL_COD,
|
||||
'ID_AREA_DOMICILIO' : ID_AREA_DOMICILIO,
|
||||
'ID_MICROAREA_DOMICILIO' : ID_MICROAREA_DOMICILIO,
|
||||
'FORA_AREA' : FORA_AREA?1:2,
|
||||
'SITUACAO_MORADIA' : SITUACAO_MORADIA_COD,
|
||||
'TIPO_LOCALIDADE' : TIPO_LOCALIDADE_COD,
|
||||
'TIPO_DOMICILIO' : TIPO_DOMICILIO_COD,
|
||||
'NUM_MORADORES' : int.parse(NUM_MORADORES.text),
|
||||
'NUM_COMODOS' : int.parse(NUM_COMODOS.text),
|
||||
'SITUACAO_RURAL' : SITUACAO_RURAL_COD,
|
||||
'TIPO_ACESSO' : TIPO_ACESSO_COD,
|
||||
'MAT_PREDOMINANTE' : MAT_PREDOMINANTE_COD,
|
||||
'DISPONIBILIDADE_ENERGIA' : DISPONIBILIDADE_ENERGIA?1:2,
|
||||
'TIPO_ABASTECIMENTO' : TIPO_ABASTECIMENTO_COD,
|
||||
'TRATAMENTO_AGUA' : TRATAMENTO_AGUA_COD,
|
||||
'DESTINO_LIXO' : DESTINO_LIXO_COD,
|
||||
'ESCOAMENTO' : ESCOAMENTO_COD,
|
||||
'FL_ANIMAIS' : FL_ANIMAIS?1:2,
|
||||
'ANIMAIS_GATO' : ANIMAIS_GATO?1:2,
|
||||
'ANIMAIS_CACHORRO' : ANIMAIS_CACHORRO?1:2,
|
||||
'ANIMAIS_PASSARO' : ANIMAIS_PASSARO?1:2,
|
||||
'ANIMAIS_OUTROS' : ANIMAIS_OUTROS?1:2,
|
||||
'QTDE_ANIMAIS' : QTDE_ANIMAIS.text.isEmpty?0:int.parse(QTDE_ANIMAIS.text),
|
||||
'CBO_RESP_CADASTRO' : CBO_RESP_CADASTRO,
|
||||
'ID_RESP_CADASTRO' : ID_RESP_CADASTRO,
|
||||
'CNES_RESP_CADASTRO' : CNES_RESP_CADASTRO.text,
|
||||
'INE_RESP_CADASTRO' : INE,
|
||||
'DT_CADASTRO' : date_cad,
|
||||
'ID_EQUIPE' : ID_EQUIPE,
|
||||
'ORIGEM' : 'A',
|
||||
'SINCRONIZADO' : 'N',
|
||||
'NOME_INSTITUICAO_PERMANENCIA': NOME_INSTITUICAO_PERMANENCIA,
|
||||
'PROFISSIONAIS_VINCULADOS_INST': PROFISSIONAIS_VINCULADOS_INST,
|
||||
'RESPONSAVEL_TECNICO_INST' : RESPONSAVEL_TECNICO_INST,
|
||||
'CARGO_RESP_TECNICO_INST' : CARGO_RESP_TECNICO_INST,
|
||||
'TEL_RESP_TECNICO_INST' : TEL_RESP_TECNICO_INST,
|
||||
};
|
||||
await DbSqliteSync().insertCadastrosDomiciliares(row,TIPO_SALVAR,ID_DOMICILIO,ID_CIDADAO).then((value){
|
||||
AlertDialogDefault().alert(
|
||||
context,
|
||||
'Aviso',
|
||||
TIPO_SALVAR!='new'?
|
||||
'Cadastro Domiciliar alterado com sucesso!':
|
||||
'Cadastro Domiciliar realizado com sucesso!',
|
||||
'OK'
|
||||
);
|
||||
// print(value);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
@@ -303,6 +396,19 @@ class _RegisterHomeScreenState extends State<RegisterHomeScreen> {
|
||||
child: ListView(
|
||||
children: [
|
||||
SubtitleAppbarCitizen(title: 3,edit: true,listData: widget.listData),
|
||||
showCheckError?Card(
|
||||
margin: EdgeInsets.all(10),
|
||||
child: Container(
|
||||
padding: EdgeInsets.all(10),
|
||||
child: Row(
|
||||
children: [
|
||||
Icon(Icons.warning,color: Colors.red,),
|
||||
TextDefault(text: 'Existem campos obrigatórios não preenchidos.',color: ColorPalette.red,fontSize: 15,)
|
||||
],
|
||||
),
|
||||
),
|
||||
color: ColorPalette.white,
|
||||
):Container(),
|
||||
Card(
|
||||
margin: EdgeInsets.all(10),
|
||||
child: Padding(
|
||||
@@ -314,7 +420,6 @@ class _RegisterHomeScreenState extends State<RegisterHomeScreen> {
|
||||
setState(() {
|
||||
edit = true;
|
||||
editing = true;
|
||||
mandatory = true;
|
||||
});
|
||||
},
|
||||
title: 'Alterar',
|
||||
@@ -323,10 +428,7 @@ class _RegisterHomeScreenState extends State<RegisterHomeScreen> {
|
||||
textColor: ColorPalette.white,
|
||||
width: double.infinity,
|
||||
):ButtonDefault(
|
||||
onPressed: ()=>setState((){
|
||||
edit=false;
|
||||
editing = false;
|
||||
}),
|
||||
onPressed: ()=>checkSave(),
|
||||
title: 'Salvar',
|
||||
borderColor: ColorPalette.appBar,
|
||||
background: ColorPalette.appBar,
|
||||
@@ -378,6 +480,7 @@ class _RegisterHomeScreenState extends State<RegisterHomeScreen> {
|
||||
}
|
||||
},
|
||||
),
|
||||
TIPO_IMOVEL==null&& mandatory?ErrorDefault():Container(),
|
||||
DropdownWithSubtitle(
|
||||
list:listINE,
|
||||
widthSubtitle: width*0.7,
|
||||
@@ -392,7 +495,12 @@ class _RegisterHomeScreenState extends State<RegisterHomeScreen> {
|
||||
width: width*0.7,
|
||||
title: 'Fora de área',
|
||||
value: FORA_AREA,
|
||||
onChanged: !editing?null: (value)=>setState(()=>FORA_AREA=value),
|
||||
onChanged: !editing?null: (value){
|
||||
if(value){
|
||||
INE = null;
|
||||
}
|
||||
setState(()=>FORA_AREA=value);
|
||||
},
|
||||
),
|
||||
DropdownWithSubtitle(
|
||||
list:listSituationHome,
|
||||
@@ -662,7 +770,7 @@ class _RegisterHomeScreenState extends State<RegisterHomeScreen> {
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
InputWithSubtitle(
|
||||
controller: ID_RESP_CADASTRO,
|
||||
controller: NOME_RESP_CADASTRO,
|
||||
subtitle: 'Usuário responsável Pelo Cadastro',
|
||||
errorInput: 'Campo Obrigatório',
|
||||
labelInput: 'Usuário responsável Pelo Cadastro',
|
||||
@@ -707,17 +815,22 @@ class _RegisterHomeScreenState extends State<RegisterHomeScreen> {
|
||||
},
|
||||
list: listINEPROF
|
||||
),
|
||||
InputWithSubtitle(
|
||||
controller: DT_CADASTRO,
|
||||
subtitle: 'Data do Cadastro',
|
||||
errorInput: 'Campo Obrigatório',
|
||||
labelInput: 'Data do Cadastro',
|
||||
widthInput: width*0.7,
|
||||
widthSubtitle: width*0.7,
|
||||
hintInput: 'Escreva aqui',
|
||||
enabled: false,
|
||||
onChanged: (v)=>setState((){}),
|
||||
GestureDetector(
|
||||
onTap:!edit?null: ()=>escolherprazoInicio(context),
|
||||
child: InputWithSubtitle(
|
||||
controller: DT_CADASTRO,
|
||||
subtitle: 'Data do Cadastro',
|
||||
errorInput: 'Campo Obrigatório!',
|
||||
labelInput: 'Data do Cadastro',
|
||||
widthInput: width*0.7,
|
||||
widthSubtitle: width*0.7,
|
||||
hintInput: 'Escreva aqui',
|
||||
enabled: false,
|
||||
mandatory: mandatory,
|
||||
onChanged: (v)=>setState((){}),
|
||||
),
|
||||
),
|
||||
DT_CADASTRO.text.isEmpty&& mandatory?ErrorDefault():Container(),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
@@ -115,7 +115,7 @@ class _RegisterIndividualScreenState extends State<RegisterIndividualScreen> {
|
||||
int ALIMENTACAO_DIARIA_COD = 0;
|
||||
int IDENTIDADE_GENERO_COD = 0;
|
||||
int ID_EQUIPE = 0;
|
||||
String CD_USUARIO_SUS = '';
|
||||
int ID_CIDADAO = 0;
|
||||
String? INE;
|
||||
String? INE_DB;
|
||||
String? ESCOLARIDADE;
|
||||
@@ -216,9 +216,9 @@ class _RegisterIndividualScreenState extends State<RegisterIndividualScreen> {
|
||||
}
|
||||
|
||||
loadCadIndividual()async{
|
||||
CD_USUARIO_SUS = widget.listData[0]['CD_USUARIO_SUS'];
|
||||
ID_CIDADAO = widget.listData[0]['ID_CIDADAO'];
|
||||
|
||||
await DBQuerys().buscaCadInvidual(CD_USUARIO_SUS).then((dataCitizen)async{
|
||||
await DBQuerys().buscaCadInvidual(ID_CIDADAO).then((dataCitizen)async{
|
||||
// print(CD_USUARIO_SUS);
|
||||
if(dataCitizen.length != 0) {
|
||||
TIPO_SALVAR = 'update';
|
||||
@@ -545,7 +545,7 @@ class _RegisterIndividualScreenState extends State<RegisterIndividualScreen> {
|
||||
'CRIANCAS_OUTRO' : CRIANCAS_OUTRO?1:2,
|
||||
'IDENTIDADE_GENERO' : IDENTIDADE_GENERO_COD,
|
||||
};
|
||||
await DbSqliteSync().insertCadastrosIndividuais(row,TIPO_SALVAR,CD_USUARIO_SUS).then((value){
|
||||
await DbSqliteSync().insertCadastrosIndividuais(row,TIPO_SALVAR,ID_CIDADAO).then((value){
|
||||
AlertDialogDefault().alert(
|
||||
context,
|
||||
'Aviso',
|
||||
@@ -1003,6 +1003,15 @@ class _RegisterIndividualScreenState extends State<RegisterIndividualScreen> {
|
||||
onTapDelete: ()=>setState(()=>SAIDA_CADASTRO=null),
|
||||
showDelete: true,
|
||||
),
|
||||
Container(
|
||||
width: width*0.7,
|
||||
child: TextDefault(
|
||||
textAlign: TextAlign.start,
|
||||
text: 'Data',
|
||||
color: ColorPalette.black54,
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
GestureDetector(
|
||||
onTap:!edit?null: ()=>escolherprazoInicio(context,'data_saida'),
|
||||
child: InputWithSubtitle(
|
||||
@@ -1508,6 +1517,15 @@ class _RegisterIndividualScreenState extends State<RegisterIndividualScreen> {
|
||||
onChanged: !editing?null: (value)=>setState(()=>INE_RESP_CADASTRO = value),
|
||||
list: listINEPROF
|
||||
),
|
||||
Container(
|
||||
width: width*0.7,
|
||||
child: TextDefault(
|
||||
textAlign: TextAlign.start,
|
||||
text: 'Data do Cadastro',
|
||||
color: ColorPalette.black54,
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
GestureDetector(
|
||||
onTap:!edit?null: ()=>escolherprazoInicio(context,'cadastro'),
|
||||
child: InputWithSubtitle(
|
||||
|
||||
@@ -134,14 +134,14 @@ class _SyncInitScreenState extends State<SyncInitScreen> {
|
||||
}else{
|
||||
setState(()=> messageSteps = "Etapa 9 de 10 - Gravando os Cadastros Domiciliares no Aplicativo");
|
||||
}
|
||||
await DbSqliteSync().insertCadastrosDomiciliares(value).then((value)async{
|
||||
await DbSqliteSync().insertCadastrosDomiciliares(value,'sync',0,0).then((value)async{
|
||||
await ApiDataSync().syncCadastrosIndividuais(urlAPI,mode,nameCityApi,user,idUnidade,area,microarea,foraArea).then((value)async{
|
||||
if(value.length == 0){
|
||||
setState(()=> messageSteps = "ERRO: Erro para carregar os Cadastros Individuais - Por favor, tente novamente!");
|
||||
}else{
|
||||
setState(()=> messageSteps = "Etapa 10 de 10 - Gravando os Cadastros Individuais no Aplicativo");
|
||||
}
|
||||
await DbSqliteSync().insertCadastrosIndividuais(value,'sync','').then((value)async{
|
||||
await DbSqliteSync().insertCadastrosIndividuais(value,'sync',0).then((value)async{
|
||||
await DbSqliteSync().saveSync(codCity,codState,urlAPI,mode,nameCityApi,nameCityFront,codCityIbge,user,idUnidade,nomeUnidade,area,microarea).then((value)async{
|
||||
Navigator.pushNamed(context, '/home');
|
||||
});
|
||||
|
||||
@@ -23,7 +23,6 @@ class DBQuerys{
|
||||
Database db = await DbSqliteLoad().intialDB();
|
||||
var query = "SELECT * FROM EQUIPES JOIN PROFISSIONAIS_EQUIPE ON PROFISSIONAIS_EQUIPE.ID_EQUIPE = EQUIPES.ID_EQUIPE WHERE ID_UNIDADE = $idUnidade AND ID_PROFISSIONAL = $idUsuario";
|
||||
List list = await db.rawQuery(query);
|
||||
// print(await db.rawQuery('SELECT NO_BAIRRO FROM BAIRROS'));
|
||||
// print(list);
|
||||
return list;
|
||||
}
|
||||
@@ -31,7 +30,6 @@ class DBQuerys{
|
||||
Database db = await DbSqliteLoad().intialDB();
|
||||
var query = "SELECT * FROM PROFISSIONAIS WHERE ID_PROFISSIONAL = $ID_PROFISSIONAL";
|
||||
List list = await db.rawQuery(query);
|
||||
// print(await db.rawQuery('SELECT NO_BAIRRO FROM BAIRROS'));
|
||||
// print(list);
|
||||
return list[0];
|
||||
}
|
||||
@@ -39,7 +37,6 @@ class DBQuerys{
|
||||
Database db = await DbSqliteLoad().intialDB();
|
||||
var query = "SELECT * FROM UNIDADES WHERE ID_UNIDADE = $ID_UNIDADE";
|
||||
List list = await db.rawQuery(query);
|
||||
// print(await db.rawQuery('SELECT NO_BAIRRO FROM BAIRROS'));
|
||||
// print(list);
|
||||
return list[0]['NOME_UNIDADE'];
|
||||
}
|
||||
@@ -53,7 +50,6 @@ class DBQuerys{
|
||||
buscaTipoLogradouro(tipo)async{
|
||||
Database db = await DbSqliteLoad().intialDB();
|
||||
List list = await db.rawQuery("SELECT * FROM LOGRADOUROS_TIPOS WHERE NO_LOGR_TIPO = '$tipo'");
|
||||
// print(await db.rawQuery('SELECT NO_BAIRRO FROM BAIRROS'));
|
||||
// print(list[0]['ID_LOGR_TIPO']);
|
||||
return list[0]['ID_LOGR_TIPO'];
|
||||
}
|
||||
@@ -128,19 +124,19 @@ class DBQuerys{
|
||||
// print(list);
|
||||
return list;
|
||||
}
|
||||
Future buscaCadInvidual(String CD_USUARIO_SUS)async{
|
||||
Future buscaCadInvidual(int ID_CIDADAO)async{
|
||||
Database db = await DbSqliteLoad().intialDB();
|
||||
var query = 'SELECT * FROM CADASTROS_INDIVIDUAIS WHERE CD_USUARIO_SUS = "$CD_USUARIO_SUS"';
|
||||
var query = 'SELECT * FROM CADASTROS_INDIVIDUAIS WHERE ID_CIDADAO = $ID_CIDADAO';
|
||||
List list = await db.rawQuery(query);
|
||||
// print(list);
|
||||
return list;
|
||||
}
|
||||
Future buscaCadDomiciliar(int ID_DOMICILIO)async{
|
||||
Database db = await DbSqliteLoad().intialDB();
|
||||
var query = 'SELECT * FROM CIDADAO_DOMICILIO WHERE ID_DOMICILIO = "$ID_DOMICILIO"';
|
||||
var query = 'SELECT * FROM CIDADAO_DOMICILIO WHERE ID_DOMICILIO = $ID_DOMICILIO';
|
||||
// var query = 'SELECT * FROM DOMICILIOS_CIDADAOS';
|
||||
List list = await db.rawQuery(query);
|
||||
print(list);
|
||||
// print(list);
|
||||
return list;
|
||||
}
|
||||
Future buscaCidadao(NOME_CIDADAO)async{
|
||||
@@ -469,7 +465,7 @@ class DBQuerys{
|
||||
}
|
||||
Future updateCadastroIndividuais()async{
|
||||
Map<String, dynamic> row = {
|
||||
'SINCRONIZADO' : 'S',
|
||||
'SINCRONIZADO': 'S',
|
||||
};
|
||||
Database db = await DbSqliteLoad().intialDB();
|
||||
await db.update('CADASTROS_INDIVIDUAIS', row,where: "SINCRONIZADO = 'N'");
|
||||
|
||||
@@ -237,7 +237,7 @@ class DbSqliteSync{
|
||||
}
|
||||
return db;
|
||||
}
|
||||
Future insertCadastrosDomiciliares(var value)async{
|
||||
Future insertCadastrosDomiciliares(var value,String type,int ID_DOMICILIO,int ID_CIDADAO)async{
|
||||
Database db = await DbSqliteLoad().intialDB();
|
||||
// CIDADAO_DOMICILIO (ID_DOMICILIO,TIPO_IMOVEL,ID_AREA_DOMICILIO,ID_MICROAREA_DOMICILIO,FORA_AREA,SITUACAO_MORADIA,TIPO_LOCALIDADE,TIPO_DOMICILIO,NUM_MORADORES,
|
||||
// NUM_COMODOS,SITUACAO_RURAL,TIPO_ACESSO,MAT_PREDOMINANTE,DISPONIBILIDADE_ENERGIA,TIPO_ABASTECIMENTO,TRATAMENTO_AGUA,DESTINO_LIXO,ESCOAMENTO,FL_ANIMAIS,
|
||||
@@ -250,53 +250,71 @@ class DbSqliteSync{
|
||||
// "cdDestinoLixo":1,"cdEscoamento":1,"animais":0,"animaisGato":0,"animaisCachorro":0,"animaisPassaro":0,"animaisOutros":0,"animaisQtde":null,"respCadastro":68,
|
||||
// "cnesUnidade":"9372253","cboRespCadastro":"515105","ine":"0001485628","dtCadastro":"2021-11-10","cdEquipe":5,"noInstPermanencia":null,"outrosProfissionaisInst":null,
|
||||
// "noResponsavelInst":null,"cnsResponsavelInst":null,"gargoResponsavelInst":null,"telefoneResponsavelInst":null
|
||||
for(int i=0;value.length > i;i++){
|
||||
if(type=='sync'){
|
||||
for(int i=0;value.length > i;i++){
|
||||
Map<String, dynamic> row = {
|
||||
'ID_DOMICILIO' : value[i]['cdDomicilio'],
|
||||
'TIPO_IMOVEL' : value[i]['cdTipoImovel'],
|
||||
'ID_AREA_DOMICILIO' : value[i]['cdAreaDomicilio'],
|
||||
'ID_MICROAREA_DOMICILIO' : value[i]['cdMicroareaDomicilio'],
|
||||
'FORA_AREA' : value[i]['foraArea'],
|
||||
'SITUACAO_MORADIA' : value[i]['cdSituacao'],
|
||||
'TIPO_LOCALIDADE' : value[i]['cdTipoLocalidade'],
|
||||
'TIPO_DOMICILIO' : value[i]['cdTipoDomicilio'],
|
||||
'NUM_MORADORES' : value[i]['nrMoradores'],
|
||||
'NUM_COMODOS' : value[i]['nrComodo'],
|
||||
'SITUACAO_RURAL' : value[i]['situacaoProducaoRural'],
|
||||
'TIPO_ACESSO' : value[i]['tipoAcesso'],
|
||||
'MAT_PREDOMINANTE' : value[i]['materialParedesExternas'],
|
||||
'DISPONIBILIDADE_ENERGIA' : value[i]['dispEnergiaEletrica'],
|
||||
'TIPO_ABASTECIMENTO' : value[i]['cdTipoAbastecimento'],
|
||||
'TRATAMENTO_AGUA' : value[i]['cdTratamentoAgua'],
|
||||
'DESTINO_LIXO' : value[i]['cdDestinoLixo'],
|
||||
'ESCOAMENTO' : value[i]['cdEscoamento'],
|
||||
'FL_ANIMAIS' : value[i]['animais'],
|
||||
'ANIMAIS_GATO' : value[i]['animaisGato'],
|
||||
'ANIMAIS_CACHORRO' : value[i]['animaisCachorro'],
|
||||
'ANIMAIS_PASSARO' : value[i]['animaisPassaro'],
|
||||
'ANIMAIS_OUTROS' : value[i]['animaisOutros'],
|
||||
'QTDE_ANIMAIS' : value[i]['animaisQtde'],
|
||||
'CBO_RESP_CADASTRO' : value[i]['cboRespCadastro'],
|
||||
'ID_RESP_CADASTRO' : value[i]['respCadastro'],
|
||||
'CNES_RESP_CADASTRO' : value[i]['cnesUnidade'],
|
||||
'INE_RESP_CADASTRO' : value[i]['ine'],
|
||||
'DT_CADASTRO' : value[i]['dtCadastro'],
|
||||
'ID_EQUIPE' : value[i]['cdEquipe'],
|
||||
'ORIGEM' : '',
|
||||
'SINCRONIZADO' : '',
|
||||
'NOME_INSTITUICAO_PERMANENCIA' : value[i]['noInstPermanencia'],
|
||||
'PROFISSIONAIS_VINCULADOS_INST': value[i]['outrosProfissionaisInst'],
|
||||
'RESPONSAVEL_TECNICO_INST' : value[i]['noResponsavelInst'],
|
||||
'CARGO_RESP_TECNICO_INST' : value[i]['gargoResponsavelInst'],
|
||||
'TEL_RESP_TECNICO_INST' : value[i]['telefoneResponsavelInst'],
|
||||
};
|
||||
int id = await db.insert('CIDADAO_DOMICILIO', row);
|
||||
// print('id increment $id PROCEDIMENTOS_SIGTAP_REGISTRO');
|
||||
// print(await db.query('CIDADAO_DOMICILIO'));
|
||||
}
|
||||
}else if(type=='new'){
|
||||
int id = await db.insert('CIDADAO_DOMICILIO', value);
|
||||
print('novo id $id');
|
||||
Map<String, dynamic> row = {
|
||||
'ID_DOMICILIO' : value[i]['cdDomicilio'],
|
||||
'TIPO_IMOVEL' : value[i]['cdTipoImovel'],
|
||||
'ID_AREA_DOMICILIO' : value[i]['cdAreaDomicilio'],
|
||||
'ID_MICROAREA_DOMICILIO' : value[i]['cdMicroareaDomicilio'],
|
||||
'FORA_AREA' : value[i]['foraArea'],
|
||||
'SITUACAO_MORADIA' : value[i]['cdSituacao'],
|
||||
'TIPO_LOCALIDADE' : value[i]['cdTipoLocalidade'],
|
||||
'TIPO_DOMICILIO' : value[i]['cdTipoDomicilio'],
|
||||
'NUM_MORADORES' : value[i]['nrMoradores'],
|
||||
'NUM_COMODOS' : value[i]['nrComodo'],
|
||||
'SITUACAO_RURAL' : value[i]['situacaoProducaoRural'],
|
||||
'TIPO_ACESSO' : value[i]['tipoAcesso'],
|
||||
'MAT_PREDOMINANTE' : value[i]['materialParedesExternas'],
|
||||
'DISPONIBILIDADE_ENERGIA' : value[i]['dispEnergiaEletrica'],
|
||||
'TIPO_ABASTECIMENTO' : value[i]['cdTipoAbastecimento'],
|
||||
'TRATAMENTO_AGUA' : value[i]['cdTratamentoAgua'],
|
||||
'DESTINO_LIXO' : value[i]['cdDestinoLixo'],
|
||||
'ESCOAMENTO' : value[i]['cdEscoamento'],
|
||||
'FL_ANIMAIS' : value[i]['animais'],
|
||||
'ANIMAIS_GATO' : value[i]['animaisGato'],
|
||||
'ANIMAIS_CACHORRO' : value[i]['animaisCachorro'],
|
||||
'ANIMAIS_PASSARO' : value[i]['animaisPassaro'],
|
||||
'ANIMAIS_OUTROS' : value[i]['animaisOutros'],
|
||||
'QTDE_ANIMAIS' : value[i]['animaisQtde'],
|
||||
'CBO_RESP_CADASTRO' : value[i]['cboRespCadastro'],
|
||||
'ID_RESP_CADASTRO' : value[i]['respCadastro'],
|
||||
'CNES_RESP_CADASTRO' : value[i]['cnesUnidade'],
|
||||
'INE_RESP_CADASTRO' : value[i]['ine'],
|
||||
'DT_CADASTRO' : value[i]['dtCadastro'],
|
||||
'ID_EQUIPE' : value[i]['cdEquipe'],
|
||||
'ORIGEM' : '',
|
||||
'SINCRONIZADO' : '',
|
||||
'NOME_INSTITUICAO_PERMANENCIA': value[i]['noInstPermanencia'],
|
||||
'PROFISSIONAIS_VINCULADOS_INST': value[i]['outrosProfissionaisInst'],
|
||||
'RESPONSAVEL_TECNICO_INST' : value[i]['noResponsavelInst'],
|
||||
'PROFISSIONAIS_VINCULADOS_INST': value[i]['gargoResponsavelInst'],
|
||||
'TEL_RESP_TECNICO_INST' : value[i]['telefoneResponsavelInst'],
|
||||
'ORIGEM' : 'A',
|
||||
'SINCRONIZADO': 'N'
|
||||
};
|
||||
int id = await db.insert('CIDADAO_DOMICILIO', row);
|
||||
// print('id increment $id PROCEDIMENTOS_SIGTAP_REGISTRO');
|
||||
// print(await db.query('CIDADAO_DOMICILIO'));
|
||||
await db.update('CIDADAOS', row,where: "ID_CIDADAO = $ID_CIDADAO");
|
||||
}else if(type=='update'){
|
||||
await db.update('CIDADAO_DOMICILIO', value,where: "ID_DOMICILIO = '$ID_DOMICILIO'");
|
||||
Map<String, dynamic> row = {
|
||||
'ORIGEM' : 'A',
|
||||
'SINCRONIZADO': 'N'
|
||||
};
|
||||
await db.update('CIDADAOS', row,where: "ID_CIDADAO = $ID_CIDADAO");
|
||||
}
|
||||
|
||||
return db;
|
||||
}
|
||||
Future insertCadastrosIndividuais(var value,String type,String CD_USUARIO_SUS)async{
|
||||
Future insertCadastrosIndividuais(var value,String type,int ID_CIDADAO)async{
|
||||
Database db = await DbSqliteLoad().intialDB();
|
||||
// CADASTROS_INDIVIDUAIS (ID_CAD_INDIVIDUAL,STATUS_CADASTRO,ID_CIDADAO,CD_USUARIO_SUS,ID_AREA_CIDADAO,ID_MICROAREA_CIDADAO,FORA_AREA,RESPONSAVEL_FAMILIAR,
|
||||
// ID_RESPONSAVEL_FAMILIAR,NOME_RESPONSAVEL_FAMILIAR,PARENTESCO,ESCOLARIDADE,FREQ_ESCOLA_CRECHE,SITUACAO_MERCADO,CUIDADOR_TRADICIONAL,GRUPO_COMUNITARIO,PLANO_PRIVADO,
|
||||
@@ -423,7 +441,7 @@ class DbSqliteSync{
|
||||
int id = await db.insert('CADASTROS_INDIVIDUAIS', value);
|
||||
// print('novo id $id');
|
||||
}else if(type=='update'){
|
||||
await db.update('CADASTROS_INDIVIDUAIS', value,where: "CD_USUARIO_SUS = '$CD_USUARIO_SUS'");
|
||||
await db.update('CADASTROS_INDIVIDUAIS', value,where: "ID_CIDADAO = $ID_CIDADAO");
|
||||
}
|
||||
return db;
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ class DropDownButtonCity extends StatelessWidget {
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(ConstVariable().radiusBorderInput),
|
||||
border: Border.all(
|
||||
color: validator?ColorPalette.white:ColorPalette.red
|
||||
color: validator?ColorPalette.red:ColorPalette.white
|
||||
),
|
||||
color: ColorPalette.white
|
||||
),
|
||||
@@ -42,6 +42,7 @@ class DropDownButtonCity extends StatelessWidget {
|
||||
value: value.nameCityFront,
|
||||
child: TextDefault(
|
||||
text: value.nameCityFront,
|
||||
color: Colors.black54,
|
||||
),
|
||||
)
|
||||
).toList(),
|
||||
@@ -53,7 +54,7 @@ class DropDownButtonCity extends StatelessWidget {
|
||||
alignment: Alignment.centerLeft,
|
||||
padding: EdgeInsets.symmetric(horizontal: 15),
|
||||
child: TextDefault(
|
||||
text: validator?'':error,
|
||||
text: validator?error:'',
|
||||
color: ColorPalette.red,
|
||||
fontSize: 12
|
||||
)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rkm/widgets/text_default.dart';
|
||||
import '../config/color_palette.dart';
|
||||
import 'dropdown_button_default.dart';
|
||||
|
||||
@@ -36,17 +37,15 @@ class DropdownWithSubtitle extends StatelessWidget {
|
||||
padding: const EdgeInsets.symmetric(vertical: 5.0),
|
||||
child: Column(
|
||||
children: [
|
||||
// Container(
|
||||
// width: widthSubtitle,
|
||||
// height: 40,
|
||||
// padding: const EdgeInsets.all(8.0),
|
||||
// child: TextDefault(
|
||||
// text: subtitle,
|
||||
// color: ColorPalette.black54,
|
||||
// fontSize: 18,
|
||||
// fontWeigth: FontWeight.bold,
|
||||
// ),
|
||||
// ),
|
||||
Container(
|
||||
width: widthDropdown,
|
||||
child: TextDefault(
|
||||
textAlign: TextAlign.start,
|
||||
text: subtitle,
|
||||
color: ColorPalette.black54,
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
Container(
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
|
||||
@@ -5,6 +5,7 @@ import '../config/const_variable.dart';
|
||||
class InputSearchText extends StatelessWidget {
|
||||
var controller;
|
||||
double fontSize;
|
||||
double fontSizeHint;
|
||||
String hint;
|
||||
double width;
|
||||
Color color;
|
||||
@@ -15,6 +16,7 @@ class InputSearchText extends StatelessWidget {
|
||||
required this.controller,
|
||||
required this.width,
|
||||
this.fontSize = 15.0,
|
||||
this.fontSizeHint = 15.0,
|
||||
this.hint = '',
|
||||
this.color = ColorPalette.white,
|
||||
this.border = true,
|
||||
@@ -41,7 +43,7 @@ class InputSearchText extends StatelessWidget {
|
||||
hintText: this.hint,
|
||||
hintStyle: TextStyle(
|
||||
color: Colors.black,
|
||||
fontSize: this.fontSize,
|
||||
fontSize: this.fontSizeHint,
|
||||
)
|
||||
)
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user